AssignCardDialog.vue 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  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. <el-form
  12. ref="assignCardFormRef"
  13. :model="form"
  14. :rules="rules"
  15. label-width="100px"
  16. >
  17. <!-- 卡类型 -->
  18. <el-form-item label="卡类型" prop="cardType" :required="true">
  19. <el-select
  20. v-model="form.cardType"
  21. placeholder="请选择卡类型"
  22. style="width: 100%"
  23. >
  24. <el-option
  25. v-for="dict in cardTypeOptions"
  26. :key="dict.value"
  27. :label="dict.label"
  28. :value="parseInt(dict.value)"
  29. ></el-option>
  30. </el-select>
  31. </el-form-item>
  32. <!-- 卡号段 -->
  33. <el-form-item label="卡号段" :required="true">
  34. <div style="display: flex; align-items: center; gap: 10px">
  35. <el-form-item prop="beginCardNo" style="flex: 1; margin-bottom: 0">
  36. <el-input
  37. v-model="form.beginCardNo"
  38. placeholder="开始卡号"
  39. style="width: 100%"
  40. />
  41. </el-form-item>
  42. <span>-</span>
  43. <el-form-item prop="endCardNo" style="flex: 1; margin-bottom: 0">
  44. <el-input
  45. v-model="form.endCardNo"
  46. placeholder="结束卡号"
  47. style="width: 100%"
  48. />
  49. </el-form-item>
  50. </div>
  51. </el-form-item>
  52. <!-- 代理商 -->
  53. <el-form-item label="代理商" prop="agentId" :required="true">
  54. <el-select
  55. v-model="form.agentId"
  56. placeholder="请选择代理商"
  57. style="width: 100%"
  58. >
  59. <el-option
  60. v-for="agent in agentList"
  61. :key="agent.id"
  62. :label="agent.name"
  63. :value="agent.id"
  64. ></el-option>
  65. </el-select>
  66. </el-form-item>
  67. <!-- 省份 -->
  68. <el-form-item label="省份" prop="province">
  69. <el-select
  70. v-model="form.province"
  71. placeholder="请选择省份"
  72. style="width: 100%"
  73. >
  74. <el-option
  75. v-for="province in provinceList"
  76. :key="province.dictValue"
  77. :label="province.dictLabel"
  78. :value="province.dictValue"
  79. ></el-option>
  80. </el-select>
  81. </el-form-item>
  82. <!-- 学校 -->
  83. <el-form-item label="学校" prop="school">
  84. <el-select
  85. v-model="form.school"
  86. placeholder="请选择学校"
  87. style="width: 100%"
  88. :disabled="form.province === 'all'"
  89. >
  90. <el-option label="全部" value="all"></el-option>
  91. <el-option
  92. v-for="school in schoolList"
  93. :key="school.id"
  94. :label="school.name"
  95. :value="school.id"
  96. ></el-option>
  97. </el-select>
  98. </el-form-item>
  99. <!-- 考生类别 -->
  100. <el-form-item label="考生类别" prop="studentCategory">
  101. <el-select
  102. v-model="form.studentCategory"
  103. placeholder="请选择考生类别"
  104. style="width: 100%"
  105. >
  106. <el-option label="全部" value="all"></el-option>
  107. <el-option label="普通考生" value="normal"></el-option>
  108. <el-option label="艺术考生" value="art"></el-option>
  109. <el-option label="体育考生" value="sports"></el-option>
  110. </el-select>
  111. </el-form-item>
  112. </el-form>
  113. <template #footer>
  114. <div class="dialog-footer">
  115. <el-button @click="handleCancel">取消</el-button>
  116. <el-button type="primary" @click="handleSubmit">分配</el-button>
  117. <el-button @click="handleReassign">重新分配</el-button>
  118. </div>
  119. </template>
  120. </el-dialog>
  121. </template>
  122. <script setup>
  123. import { ref, computed, watch } from "vue";
  124. import { assignCard } from "@/api/dz/cards";
  125. import { getPaperProvinces } from "@/api/dz/papers";
  126. import { listUniversity } from "@/api/dz/school";
  127. const props = defineProps({
  128. modelValue: {
  129. type: Boolean,
  130. default: false,
  131. },
  132. agentList: {
  133. type: Array,
  134. default: () => [],
  135. },
  136. schoolList: {
  137. type: Array,
  138. default: () => [],
  139. },
  140. cardTypeOptions: {
  141. type: Array,
  142. default: () => [],
  143. },
  144. });
  145. const emit = defineEmits(["update:modelValue", "success"]);
  146. const visible = computed({
  147. get: () => props.modelValue,
  148. set: (value) => emit("update:modelValue", value),
  149. });
  150. const assignCardFormRef = ref();
  151. const provinceList = ref([]); // 省份列表
  152. const schoolList = ref([]); // 学校列表
  153. const form = ref({
  154. cardType: null,
  155. beginCardNo: "",
  156. endCardNo: "",
  157. agentId: null,
  158. province: "all",
  159. school: "all",
  160. studentCategory: "all",
  161. });
  162. const rules = {
  163. cardType: [{ required: true, message: "卡类型不能为空", trigger: "change" }],
  164. beginCardNo: [
  165. { required: true, message: "开始卡号不能为空", trigger: "blur" },
  166. ],
  167. endCardNo: [{ required: true, message: "结束卡号不能为空", trigger: "blur" }],
  168. agentId: [{ required: true, message: "代理商不能为空", trigger: "change" }],
  169. };
  170. // 重置表单
  171. function resetForm() {
  172. form.value = {
  173. cardType: null,
  174. beginCardNo: "",
  175. endCardNo: "",
  176. agentId: null,
  177. province: "all",
  178. school: "all",
  179. studentCategory: "all",
  180. };
  181. }
  182. // 获取省份列表
  183. async function getProvinceList() {
  184. try {
  185. const response = await getPaperProvinces();
  186. if (response.code === 200) {
  187. provinceList.value = response.data || [];
  188. }
  189. } catch (error) {
  190. console.error("获取省份列表失败:", error);
  191. }
  192. }
  193. // 根据省份获取学校列表
  194. async function getSchoolListByProvince(province) {
  195. try {
  196. if (province === "all" || !province) {
  197. schoolList.value = [];
  198. return;
  199. }
  200. const response = await listUniversity({
  201. location: province,
  202. pageNum: 1,
  203. pageSize: 1000,
  204. });
  205. if (response.code === 200) {
  206. // 处理API返回的数据结构
  207. let schoolData = [];
  208. // 检查是否有rows字段(直接在response中)
  209. if (response.rows) {
  210. schoolData = response.rows;
  211. }
  212. // 检查是否有data.rows字段
  213. else if (response.data && response.data.rows) {
  214. schoolData = response.data.rows;
  215. }
  216. // 检查是否有data数组
  217. else if (response.data && Array.isArray(response.data)) {
  218. schoolData = response.data;
  219. }
  220. // 检查是否有data对象
  221. else if (response.data && response.data.id) {
  222. schoolData = [response.data];
  223. }
  224. schoolList.value = schoolData;
  225. console.log("学校数据:", schoolData); // 添加调试日志
  226. }
  227. } catch (error) {
  228. console.error("获取学校列表失败:", error);
  229. schoolList.value = [];
  230. }
  231. }
  232. // 取消
  233. function handleCancel() {
  234. visible.value = false;
  235. resetForm();
  236. }
  237. // 提交
  238. async function handleSubmit() {
  239. assignCardFormRef.value.validate(async (valid) => {
  240. if (valid) {
  241. try {
  242. // 获取开始号和结束号
  243. const begin = form.value.beginCardNo;
  244. const end = form.value.endCardNo;
  245. if (!begin || !end) {
  246. throw new Error("请填写完整的卡号段");
  247. }
  248. // 调用分配卡API
  249. await assignCard(form.value.agentId, begin, end);
  250. emit("success", "分配卡成功!");
  251. visible.value = false;
  252. resetForm();
  253. } catch (error) {
  254. console.error("分配卡失败:", error);
  255. throw error;
  256. }
  257. }
  258. });
  259. }
  260. // 重新分配
  261. function handleReassign() {
  262. resetForm();
  263. emit("success", "已重置分配表单,请重新填写");
  264. }
  265. // 监听弹窗关闭,重置表单
  266. watch(visible, (newVal) => {
  267. if (!newVal) {
  268. resetForm();
  269. } else {
  270. // 弹窗打开时获取省份列表
  271. getProvinceList();
  272. }
  273. });
  274. // 监听省份变化,获取对应学校
  275. watch(
  276. () => form.value.province,
  277. (newProvince) => {
  278. // 重置学校选择
  279. form.value.school = "all";
  280. // 获取对应省份的学校列表
  281. getSchoolListByProvince(newProvince);
  282. }
  283. );
  284. </script>
  285. <style scoped>
  286. .dialog-footer {
  287. text-align: right;
  288. }
  289. </style>