EditEmergencyItem.vue 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. <template>
  2. <div class="emergency-supply-container">
  3. <BasicForm ref="formRef" :formData="ruleFormData" :formRules="customFormRules" :formConfig="ruleFormConfig">
  4. <template #requiredQuantity>
  5. <el-input
  6. v-model="ruleFormData.requiredQuantity"
  7. placeholder="请输入应备数量"
  8. @input="(value:string) => handleInputNumber(value,'require')"
  9. @change="handleChangeQuantity"
  10. />
  11. </template>
  12. <template #currentQuantity>
  13. <el-input
  14. v-model="ruleFormData.currentQuantity"
  15. placeholder="请输入当前数量"
  16. @input="(value:string) => handleInputNumber(value,'current')"
  17. :disabled="Boolean(!ruleFormData.requiredQuantity)"
  18. />
  19. </template>
  20. <template #park>
  21. <el-select v-model="ruleFormData.park" placeholder="请选择园区" filterable @change="editPark">
  22. <el-option v-for="item in parkDice" :key="item.itemCode" :label="item.itemValue" :value="item.itemCode" />
  23. </el-select>
  24. </template>
  25. <template #location>
  26. <el-select v-model="ruleFormData.location" placeholder="请输入地点" :disabled="Boolean(!ruleFormData.park)">
  27. <el-option v-for="item in locationDice" :key="item.itemCode" :label="item.itemValue" :value="item.itemCode" />
  28. </el-select>
  29. </template>
  30. <template #keeperName>
  31. <el-select
  32. v-model="ruleFormData.keeperName"
  33. placeholder="请输入保管人姓名"
  34. value-key="id"
  35. filterable
  36. remote
  37. :remote-method="remoteMethod"
  38. :loading="loading"
  39. @change="editKeeper"
  40. >
  41. <el-option
  42. v-for="item in userOptions"
  43. :key="item.id"
  44. :label="`${item.realname}(${item.username})${item.deptName}`"
  45. :value="item"
  46. />
  47. </el-select>
  48. </template>
  49. </BasicForm>
  50. </div>
  51. </template>
  52. <script setup lang="ts">
  53. import { ref, onMounted, computed } from 'vue';
  54. import BasicForm from '@/components/BasicForm.vue';
  55. import { useFormConfigHook } from '@/hooks/useFormConfigHook';
  56. import { useEmergencySuppliesHook } from '../hook';
  57. import type { EditEmergencyItemForm } from '@/types/emergency-supplier';
  58. import type { QueryUserInfoByUserNameRes } from '@/types/person-group/type';
  59. import { type FormRules } from 'element-plus';
  60. import { getEmergencySupplyDetail } from '@/api/emergency-supplier';
  61. import { EDIT_EMERGENCY_ITEM_FROM_CONFIG, EDIT_EMERGENCY_ITEM_DATA, EDIT_EMERGENCY_ITEM_RULES } from '../config';
  62. const props = defineProps<{
  63. id: number;
  64. }>();
  65. const formRef = ref();
  66. const { ruleFormConfig, ruleFormData, formRules, cloneRuleFormData, beforeRouteLeave } =
  67. useFormConfigHook<EditEmergencyItemForm>(
  68. EDIT_EMERGENCY_ITEM_FROM_CONFIG,
  69. EDIT_EMERGENCY_ITEM_DATA,
  70. EDIT_EMERGENCY_ITEM_RULES,
  71. );
  72. // 验证当前数量不大于应备数量
  73. const validateQuantity = (rule: any, value: any, callback: any) => {
  74. if (value === '' || value === null || value === undefined) {
  75. callback();
  76. return;
  77. }
  78. const currentQuantity = Number(value);
  79. const requiredQuantity = Number(ruleFormData.requiredQuantity);
  80. if (currentQuantity > requiredQuantity) {
  81. callback(new Error('当前数量不能大于应备数量'));
  82. } else {
  83. callback();
  84. }
  85. };
  86. // 扩展原有的表单规则,添加自定义验证
  87. const customFormRules = computed<FormRules>(() => {
  88. return {
  89. ...formRules,
  90. currentQuantity: [
  91. { required: true, message: '请输入当前数量', trigger: 'blur' },
  92. { validator: validateQuantity, trigger: 'blur' },
  93. ],
  94. };
  95. });
  96. const handleInputNumber = (value: string, type: 'require' | 'current') => {
  97. const onlyNumber = value.replace(/[^\d]/g, '');
  98. const num = onlyNumber === '' ? null : Number(onlyNumber);
  99. if (type === 'require') {
  100. ruleFormData.requiredQuantity = num;
  101. } else {
  102. ruleFormData.currentQuantity = num;
  103. }
  104. };
  105. const handleChangeQuantity = () => {
  106. if (ruleFormData.currentQuantity === null) return;
  107. formRef.value?.validateField('currentQuantity');
  108. };
  109. const {
  110. getEmergencyEventDict,
  111. getEmergencySupplyDict,
  112. getEmergencyEvent,
  113. getEmergencySupply,
  114. parkDice,
  115. getParkDict,
  116. locationDice,
  117. getLocationDict,
  118. handleChangePark,
  119. userOptions,
  120. loading,
  121. remoteMethod,
  122. } = useEmergencySuppliesHook();
  123. const getEmergencySupplyInfo = async () => {
  124. const res = await getEmergencySupplyDetail(props.id);
  125. for (const key in res) {
  126. ruleFormData[key] = res[key as keyof typeof res];
  127. ruleFormData.emergencyTypeName = getEmergencyEvent(res.emergencyType) || '';
  128. ruleFormData.supplyTypeName = getEmergencySupply(res.supplyType) || '';
  129. }
  130. getLocationDict(ruleFormData.park as 'zhangjiang_park' | 'dachang_park');
  131. cloneRuleFormData();
  132. };
  133. const editPark = (type: 'zhangjiang_park' | 'dachang_park') => {
  134. handleChangePark(type);
  135. ruleFormData.location = '';
  136. };
  137. const editKeeper = (value: QueryUserInfoByUserNameRes) => {
  138. if (!value) return;
  139. ruleFormData.keeperName = value.realname;
  140. ruleFormData.keeperId = value.id;
  141. };
  142. const handleValidate = async () => {
  143. if (!formRef.value) return;
  144. const validateResult = await formRef.value.validateForm();
  145. return validateResult;
  146. };
  147. const getFormData = () => {
  148. cloneRuleFormData();
  149. return ruleFormData;
  150. };
  151. onMounted(() => {
  152. getEmergencyEventDict().then(async () => {
  153. await getEmergencySupplyDict();
  154. await getEmergencySupplyInfo();
  155. });
  156. getParkDict();
  157. beforeRouteLeave();
  158. });
  159. defineExpose({
  160. handleValidate,
  161. getFormData,
  162. });
  163. </script>
  164. <style lang="scss" scoped>
  165. @use '../styles/info.scss' as *;
  166. </style>