DrillPlanRecordForm.vue 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. <template>
  2. <div>
  3. <BasicForm ref="basicFormRef" :formData="ruleFormData" :formRules="formRules" :formConfig="ruleFormConfig">
  4. <template #drillImage>
  5. <UploadImages
  6. v-if="!uploadImgDisabled"
  7. :maxCount="9"
  8. ref="uploadImagesRef"
  9. :image-list="recordImageList"
  10. @upload-success="handleUploadChange"
  11. />
  12. <ShowImages style="min-height: 100px" v-else :image-list="recordImageList" />
  13. </template>
  14. </BasicForm>
  15. </div>
  16. <DrillApprovalDialog
  17. v-if="approvalInfo"
  18. ref="drillApprovalDialogRef"
  19. :approval-data="approvalInfo"
  20. @filled="handleSubmitRecord"
  21. />
  22. </template>
  23. <script setup lang="ts">
  24. import BasicForm from '@/components/BasicForm.vue';
  25. import UploadImages from '@/views/disaster/disaster-control/src/components/UploadImages.vue';
  26. import ShowImages from './ShowImages.vue';
  27. import DrillApprovalDialog from './DrillApprovalDialog.vue';
  28. import { useFormConfigHook } from '@/hooks/useFormConfigHook';
  29. import { DRILL_RECORD_FORM_CONFIG, DRILL_RECORD_FORM_RULES, DRILL_RECORD_FORM_DATA } from '../configs/plan/form';
  30. import { DrillApprovalItem, DrillApprovalRuleForm, DrillPlanRecord, DrillRecordRuleForm } from '../types';
  31. import { computed, onMounted, ref, watch } from 'vue';
  32. import { queryDrillApproval } from '@/api/emergency-drill/emergency-drill';
  33. import { useRoute } from 'vue-router';
  34. const props = defineProps<{
  35. disabled: boolean;
  36. drillRecord?: DrillPlanRecord | null;
  37. }>();
  38. const emits = defineEmits<{
  39. (e: 'submitDrillRecord', data: DrillRecordRuleForm): void;
  40. }>();
  41. const route = useRoute();
  42. const uploadImagesRef = ref<InstanceType<typeof UploadImages>>();
  43. const handleUploadChange = (val) => {
  44. // console.log('files', val);
  45. // console.log('files', uploadImagesRef.value!.getUploadedImages());
  46. ruleFormData.drillImagesFile = uploadImagesRef.value!.getUploadedImages();
  47. };
  48. const approvalInfo = ref();
  49. async function getApprovalInfo() {
  50. const planId = Number(route.query.planId);
  51. const approvalId = Number(route.query.approvalId);
  52. try {
  53. approvalInfo.value = await queryDrillApproval(approvalId, planId);
  54. // console.log(approvalInfo.value);
  55. } catch (e) {
  56. console.log(e);
  57. }
  58. }
  59. onMounted(async () => {
  60. getApprovalInfo();
  61. });
  62. // 表单
  63. const basicFormRef = ref<typeof BasicForm>();
  64. const { ruleFormConfig, ruleFormData, formRules, cloneRuleFormData, beforeRouteLeave } =
  65. useFormConfigHook<DrillRecordRuleForm>(
  66. DRILL_RECORD_FORM_CONFIG,
  67. props.drillRecord
  68. ? {
  69. drillPlanId: props.drillRecord.drillPlanId,
  70. participants: props.drillRecord.participants,
  71. drillDescription: props.drillRecord.drillDescription,
  72. drillImage: props.drillRecord.drillImage,
  73. drillEffectAssess: props.drillRecord.drillEffectAssess,
  74. }
  75. : DRILL_RECORD_FORM_DATA,
  76. DRILL_RECORD_FORM_RULES,
  77. );
  78. const formValidate = async () => {
  79. if (!basicFormRef.value) return;
  80. const validateResult = await basicFormRef.value.validateForm();
  81. return validateResult;
  82. };
  83. const formClearValidate = () => {
  84. if (!basicFormRef.value) return;
  85. basicFormRef.value.clearValidate();
  86. };
  87. function getFormData() {
  88. return ruleFormData;
  89. }
  90. const uploadImgDisabled = ref(false);
  91. watch(
  92. () => props.disabled,
  93. (val) => {
  94. uploadImgDisabled.value = val;
  95. ruleFormConfig.value.forEach((x) => {
  96. if (x.componentProps) x.componentProps.disabled = val;
  97. });
  98. },
  99. {
  100. immediate: true,
  101. },
  102. );
  103. const recordImageList = computed(() => {
  104. if (!ruleFormData.drillImage) return [];
  105. // return '';
  106. return JSON.parse(ruleFormData.drillImage);
  107. });
  108. // 弹窗
  109. const drillApprovalDialogRef = ref();
  110. function openApprovalDialog() {
  111. drillApprovalDialogRef.value.openDialog();
  112. }
  113. function closeApprovalDialog() {
  114. drillApprovalDialogRef.value.closeDialog();
  115. }
  116. function handleSubmitRecord(approverData: DrillApprovalRuleForm) {
  117. ruleFormData.approvalDescription = approverData.approvalDescription;
  118. ruleFormData.approvalInfoList = approverData.approverListInfo.map((x) => {
  119. return {
  120. approvalOrder: x.approvalOrder,
  121. approverIdList:
  122. '[' + (x.approverType === 1 ? x.approverList.map((x) => x.id).join(',') : x.approverIds?.join(',')) + ']',
  123. };
  124. });
  125. emits('submitDrillRecord', ruleFormData);
  126. }
  127. defineExpose({
  128. formValidate,
  129. formClearValidate,
  130. getFormData,
  131. openApprovalDialog,
  132. closeApprovalDialog,
  133. });
  134. </script>
  135. <style scoped></style>