AssignDialog.vue 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. <template>
  2. <IeModal title="分配卡" confirmText="确认分配" ref="modalRef" width="500px" @beforeClose="handleBeforeClose"
  3. @confirm="handleConfirm">
  4. <el-form ref="formRef" :model="form" :rules="rules" label-width="100px">
  5. <el-form-item label="平台机构" prop="deptId" required>
  6. <ie-institution-select v-model="form.deptId" class="w-[350px]!" />
  7. </el-form-item>
  8. <el-form-item label="卡类型" prop="cardType">
  9. <ie-select v-model="form.cardType" :options="card_type" class="w-[350px]!" clearable />
  10. </el-form-item>
  11. <el-form-item label="卡号段" prop="cardNoRange" required>
  12. <div class="flex items-center gap-x-3">
  13. <el-input v-model="form.begin" type="text" maxlength="8" v-number class="w-[160px]!" placeholder="请输入开始卡号" />
  14. <span class="text-gray-500">-</span>
  15. <el-input v-model="form.end" type="text" maxlength="8" v-number class="w-[160px]!" placeholder="请输入结束卡号" />
  16. </div>
  17. </el-form-item>
  18. <el-form-item label="代理商" prop="agentId" required>
  19. <ie-agent-select v-model="form.agentId" :deptId="form.deptId" class="w-[350px]!" filterable />
  20. </el-form-item>
  21. <el-form-item label="省份" prop="provinceId">
  22. <ie-select v-model="area.selected" v-model:selectedItem="area.selectedItem" :options="area.list"
  23. label-key="areaName" value-key="areaId" class="w-[350px]!" />
  24. </el-form-item>
  25. <el-form-item label="学校" prop="schoolId">
  26. <ie-select v-model="selectedSchool" :options="schoolList" label-key="name" value-key="id" filterable
  27. class="w-[350px]!" />
  28. </el-form-item>
  29. <el-form-item label="考生类型" prop="assignExamType">
  30. <ie-select v-model="selectedExamType" :options="examTypeList" label-key="dictLabel" value-key="dictValue"
  31. class="w-[350px]!" />
  32. </el-form-item>
  33. <el-form-item v-if="form.cardType === '9'" label="有效期" prop="days">
  34. <el-input-number v-model="form.days" :min="1" :max="10000" :step="1" :precision="0" class="w-full!">
  35. <template #suffix>天</template>
  36. </el-input-number>
  37. </el-form-item>
  38. </el-form>
  39. </IeModal>
  40. </template>
  41. <script setup>
  42. import useSchool from '@/hooks/useSchool';
  43. import IeModal from '@/components/IeModal/index.vue';
  44. import IeSelect from '@/components/IeSelect/index.vue';
  45. import IeAgentSelect from '@/components/IeAgentSelect/index.vue';
  46. import IeInstitutionSelect from '@/components/IeInstitutionSelect/index.vue';
  47. import { assignCard } from '@/api/dz/cards';
  48. import { getCurrentInstance, watchEffect } from 'vue';
  49. const { proxy } = getCurrentInstance();
  50. const {
  51. card_type,
  52. exam_type,
  53. } = proxy.useDict("card_type", "exam_type");
  54. const {
  55. init,
  56. reset,
  57. area,
  58. schoolList,
  59. selectedSchool,
  60. examTypeList,
  61. selectedExamType
  62. } = useSchool({ autoLoad: false, loadExamType: true, loadClass: false });
  63. const modalRef = ref(null);
  64. const formRef = ref(null);
  65. const defaultForm = {
  66. deptId: null,
  67. agentId: null,
  68. cardType: '',
  69. count: 1,
  70. assignExamType: '',
  71. days: 1,
  72. };
  73. const form = ref({ ...defaultForm })
  74. // 自定义验证
  75. const validateCardNoRange = (rule, value, callback) => {
  76. if (!form.value.begin || !form.value.end) {
  77. callback(new Error('请输入卡号段'))
  78. } else if (Number(form.value.begin) > Number(form.value.end)) {
  79. callback(new Error('开始卡号不能大于结束卡号'))
  80. } else {
  81. callback()
  82. }
  83. }
  84. watchEffect(() => {
  85. form.value.cardNoRange = `${form.value.begin}-${form.value.end}`;
  86. // form.value.provinceId = area.selected;
  87. form.value.location = area.selectedItem?.shortName;
  88. form.value.schoolId = selectedSchool.value;
  89. form.value.assignExamType = selectedExamType.value;
  90. });
  91. const rules = ref({
  92. deptId: [
  93. { required: true, message: '请选择平台机构', trigger: 'change' },
  94. ],
  95. cardType: [
  96. { required: true, message: '请选择卡类型', trigger: 'change' },
  97. ],
  98. cardNoRange: [
  99. { validator: validateCardNoRange, trigger: ['blur', 'change'] },
  100. ],
  101. agentId: [
  102. { required: true, message: '请选择代理商', trigger: 'change' },
  103. ],
  104. days: [
  105. { required: true, message: '请输入有效期', trigger: 'change' },
  106. ],
  107. })
  108. const handleBeforeClose = () => {
  109. form.value = { ...defaultForm };
  110. reset();
  111. }
  112. const open = () => {
  113. init();
  114. form.value = { ...defaultForm };
  115. modalRef.value.open()
  116. }
  117. const close = () => {
  118. modalRef.value.close()
  119. }
  120. const emit = defineEmits(['refresh'])
  121. const handleConfirm = () => {
  122. formRef.value.validate(async (valid) => {
  123. if (valid) {
  124. let { cardType, agentId, begin, end, location, assignExamType, schoolId, days } = form.value;
  125. modalRef.value.showLoading()
  126. if (cardType !== '9') {
  127. days = undefined;
  128. }
  129. assignCard(cardType, agentId, begin, end, location, assignExamType, schoolId, days).then(res => {
  130. proxy.$modal.msgSuccess('分配卡成功')
  131. close();
  132. setTimeout(() => {
  133. emit('refresh')
  134. }, 300);
  135. }).finally(() => {
  136. modalRef.value.hideLoading()
  137. });
  138. }
  139. })
  140. }
  141. defineExpose({
  142. open,
  143. close
  144. })
  145. </script>
  146. <style lang="scss" scoped></style>