ApplyCardDialog.vue 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. <template>
  2. <el-dialog
  3. title="直接申请"
  4. v-model="visible"
  5. width="500px"
  6. append-to-body
  7. align-center
  8. :center="true"
  9. :destroy-on-close="true"
  10. >
  11. <div class="apply-card-content">
  12. <el-form
  13. ref="applyCardFormRef"
  14. :model="form"
  15. :rules="rules"
  16. label-width="100px"
  17. >
  18. <!-- 卡号段 -->
  19. <el-form-item label="卡号段" :required="true">
  20. <div style="display: flex; align-items: center; gap: 10px">
  21. <el-form-item prop="beginCardNo" style="flex: 1; margin-bottom: 0">
  22. <el-input
  23. v-model="form.beginCardNo"
  24. placeholder="开始卡号"
  25. style="width: 100%"
  26. />
  27. </el-form-item>
  28. <span>-</span>
  29. <el-form-item prop="endCardNo" style="flex: 1; margin-bottom: 0">
  30. <el-input
  31. v-model="form.endCardNo"
  32. placeholder="结束卡号"
  33. style="width: 100%"
  34. />
  35. </el-form-item>
  36. </div>
  37. </el-form-item>
  38. <!-- 学校 -->
  39. <el-form-item label="学校" prop="schoolId">
  40. <el-select
  41. v-model="form.schoolId"
  42. placeholder="请选择学校"
  43. style="width: 100%"
  44. >
  45. <el-option
  46. v-for="school in campusList"
  47. :key="school.id"
  48. :label="school.name"
  49. :value="school.id"
  50. ></el-option>
  51. </el-select>
  52. </el-form-item>
  53. </el-form>
  54. </div>
  55. <template #footer>
  56. <div class="dialog-footer">
  57. <el-button @click="handleCancel">取消</el-button>
  58. <el-button type="primary" @click="handleSubmit" :loading="loading">
  59. <svg-icon
  60. icon-class="lightning"
  61. class="mr-1"
  62. style="font-size: 14px"
  63. />
  64. 提交
  65. </el-button>
  66. </div>
  67. </template>
  68. </el-dialog>
  69. </template>
  70. <script setup>
  71. import { ref, computed, watch } from "vue";
  72. import { requestOpenCard } from "@/api/dz/cards";
  73. import { listUniversity } from "@/api/dz/school";
  74. import { associateCampus, getCampusList } from "@/api/dz/cards";
  75. const props = defineProps({
  76. modelValue: {
  77. type: Boolean,
  78. default: false,
  79. },
  80. selectedCards: {
  81. type: Array,
  82. default: () => [],
  83. },
  84. });
  85. const emit = defineEmits(["update:modelValue", "confirm", "success"]);
  86. const visible = computed({
  87. get: () => props.modelValue,
  88. set: (value) => emit("update:modelValue", value),
  89. });
  90. const applyCardFormRef = ref();
  91. const loading = ref(false);
  92. const schoolList = ref([]);
  93. const campusList = ref([]);
  94. const form = ref({
  95. beginCardNo: "",
  96. endCardNo: "",
  97. schoolId: null,
  98. });
  99. const rules = {
  100. beginCardNo: [
  101. { required: true, message: "开始卡号不能为空", trigger: "blur" },
  102. ],
  103. endCardNo: [{ required: true, message: "结束卡号不能为空", trigger: "blur" }],
  104. schoolId: [{ required: true, message: "学校不能为空", trigger: "change" }],
  105. };
  106. // 获取校区列表
  107. async function getCampusListData() {
  108. try {
  109. const response = await getCampusList({ pageNum: 1, pageSize: 1000 });
  110. if (response.code === 200) {
  111. campusList.value = response.data || [];
  112. }
  113. } catch (error) {
  114. console.error("获取校区列表失败:", error);
  115. }
  116. }
  117. // 获取所有学校列表
  118. async function getAllSchools() {
  119. try {
  120. const response = await listUniversity({
  121. pageNum: 1,
  122. pageSize: 1000,
  123. });
  124. if (response.code === 200) {
  125. // 处理API返回的数据结构
  126. let schoolData = [];
  127. // 检查是否有rows字段(直接在response中)
  128. if (response.rows) {
  129. schoolData = response.rows;
  130. }
  131. // 检查是否有data.rows字段
  132. else if (response.data && response.data.rows) {
  133. schoolData = response.data.rows;
  134. }
  135. // 检查是否有data数组
  136. else if (response.data && Array.isArray(response.data)) {
  137. schoolData = response.data;
  138. }
  139. // 检查是否有data对象
  140. else if (response.data && response.data.id) {
  141. schoolData = [response.data];
  142. }
  143. schoolList.value = schoolData;
  144. console.log("所有学校数据:", schoolData);
  145. }
  146. } catch (error) {
  147. console.error("获取所有学校列表失败:", error);
  148. schoolList.value = [];
  149. }
  150. }
  151. // 自动填充卡号段
  152. function autoFillCardRange() {
  153. if (props.selectedCards && props.selectedCards.length > 0) {
  154. const cardNos = props.selectedCards
  155. .map((card) => card.cardNo || card.id)
  156. .filter((cardNo) => cardNo && cardNo !== "未知")
  157. .sort();
  158. if (cardNos.length > 0) {
  159. const minCardNo = cardNos[0];
  160. const maxCardNo = cardNos[cardNos.length - 1];
  161. // 开始卡号段是最小卡号段的整十数部分
  162. const minCardNoNum = parseInt(minCardNo);
  163. const beginCardNo = Math.floor(minCardNoNum / 10) * 10;
  164. form.value.beginCardNo = beginCardNo.toString();
  165. form.value.endCardNo = maxCardNo;
  166. }
  167. }
  168. }
  169. // 重置表单
  170. function resetForm() {
  171. form.value = {
  172. beginCardNo: "",
  173. endCardNo: "",
  174. schoolId: null,
  175. };
  176. }
  177. // 取消
  178. function handleCancel() {
  179. visible.value = false;
  180. resetForm();
  181. }
  182. // 提交申请
  183. async function handleSubmit() {
  184. applyCardFormRef.value.validate(async (valid) => {
  185. if (valid) {
  186. try {
  187. loading.value = true;
  188. const begin = form.value.beginCardNo;
  189. const end = form.value.endCardNo;
  190. const schoolId = form.value.schoolId;
  191. if (!begin || !end) {
  192. throw new Error("请填写完整的卡号段");
  193. }
  194. if (!schoolId) {
  195. throw new Error("请选择学校");
  196. }
  197. await requestOpenCard(schoolId, begin, end);
  198. emit("success", "申请开卡成功!");
  199. visible.value = false;
  200. resetForm();
  201. } catch (error) {
  202. console.error("申请开卡失败:", error);
  203. emit("confirm", { error: error.message });
  204. } finally {
  205. loading.value = false;
  206. }
  207. }
  208. });
  209. }
  210. // 监听弹窗关闭,重置表单
  211. watch(visible, (newVal) => {
  212. if (!newVal) {
  213. resetForm();
  214. } else {
  215. getCampusListData();
  216. autoFillCardRange();
  217. }
  218. });
  219. </script>
  220. <style scoped>
  221. .apply-card-content {
  222. padding: 20px 0;
  223. }
  224. .dialog-footer {
  225. text-align: right;
  226. }
  227. </style>