Explorar el Código

Merge branch 'cc-dev' into 'dev'

去掉盘点确认禁用按钮

See merge request product-group-fe/sfy-safety-group/sfy-safety!148
陈昶 hace 9 meses
padre
commit
0589eae551

+ 25 - 3
src/styles/custom-component.scss

@@ -98,9 +98,31 @@ $message-box-content-padding--icon: 36px;
   --el-color-primary-light-9: #1890ff;
 }
 
-.el-scrollbar--custom{
+.el-scrollbar--custom {
   max-width: 520px;
-  .el-scrollbar{
+  .el-scrollbar {
     max-width: 515px;
   }
-}
+}
+
+.cascader-popper--custom {
+  .el-checkbox,
+  .el-radio {
+    width: 100%;
+    height: 100%;
+    position: absolute;
+    top: 0;
+    left: 0;
+    z-index: 10;
+  }
+
+  .el-cascader-node {
+    padding-left: 34px;
+  }
+
+  .el-checkbox__input,
+  .el-radio__input {
+    position: absolute;
+    left: 20px;
+  }
+}

+ 4 - 1
src/types/emergency-plan/index.ts

@@ -1,3 +1,4 @@
+import type { FileItem } from '@/views/disaster/types';
 export interface PlanEmergencyListQuery {
   planName?: string;
   planType?: string;
@@ -19,6 +20,8 @@ export interface AddEmergencyPlanForm {
   planType: string;
   eventType: string;
   deptId: string;
+  deptName: string;
   approvalTemplateId: string;
+  uploadFile: FileItem[];
   appendix: string;
-}
+}

+ 0 - 1
src/views/disaster/disaster-warning/PageDefenseNoticeItem.vue

@@ -24,7 +24,6 @@
   import type { FileItem } from '@/views/disaster/types';
   import { uploadFileApi, UPLOAD_BIZ_TYPE } from '@/api/minio';
   import { createDefenseNoticeItem, editDefenseNoticeItem } from '@/api/disaster-warning';
-  import BackIcon from 'assets/svg/back.svg';
 
   const router = useRouter();
   const route = useRoute();

+ 39 - 1
src/views/emergency/emergency-plan/PageManagementDetail.vue

@@ -17,6 +17,9 @@
 <script setup lang="ts">
   import { useRoute, useRouter } from 'vue-router';
   import { ref, computed, defineAsyncComponent } from 'vue';
+  import type { FileItem } from '@/views/disaster/types';
+  import type { AddEmergencyPlanForm } from '@/types/emergency-plan';
+  import { uploadFileApi, UPLOAD_BIZ_TYPE } from '@/api/minio';
   import { ElMessage } from 'element-plus';
 
   const route = useRoute();
@@ -41,13 +44,48 @@
     }
     return defineAsyncComponent(() => import('./src/components/ViewManagementDetail.vue'));
   });
+  const formatAttachmentList = async (file: FileItem) => {
+    if (!file.file) return file;
+    const fileName = file.fileName;
+    const res = await uploadFileApi({ bizType: UPLOAD_BIZ_TYPE.ATTACHMENT, fileName, file: file.file });
+    const fileType = file.fileType;
+    const fileSize = file.fileSize;
+    const fileId = file.fileId;
+    const fileUrl = res.url;
+    return {
+      fileName,
+      fileType,
+      fileSize,
+      fileUrl,
+      fileId,
+    };
+  };
+  const createPlanManagementItemFunc = async (formData: AddEmergencyPlanForm) => {
+    const attachmentListRes: FileItem[] = await Promise.all(
+      formData.uploadFile.map((item) => formatAttachmentList(item)),
+    );
+    const createParam = {
+      planName: formData.planName,
+      planType: formData.planType,
+      eventType: formData.eventType,
+      deptId: formData.deptId,
+      deptName: formData.deptName,
+      approvalTemplateId: formData.approvalTemplateId,
+      appendix: attachmentListRes,
+    };
+    console.log(createParam);
+  };
   const handleSubmit = async () => {
     if (!dynamicComponentRef.value) return;
     const message = type === 'add' ? '添加' : '修改';
     const res = await dynamicComponentRef.value.handleValidate();
     if (!res) return;
     const data = dynamicComponentRef.value.getFormData();
-    router.back();
+    if (type === 'add') {
+      await createPlanManagementItemFunc(data);
+    }
+    ElMessage.success(`${message}成功`);
+    // router.back();
   };
 </script>
 

+ 25 - 7
src/views/emergency/emergency-plan/src/components/AddManagementDetail.vue

@@ -7,7 +7,7 @@
         </el-select>
       </template>
       <template #eventType>
-        <el-select v-model="ruleFormData.planType" placeholder="请选择事件类型" filterable>
+        <el-select v-model="ruleFormData.eventType" placeholder="请选择事件类型" filterable>
           <el-option
             v-for="item in emergencyEventDice"
             :key="item.itemCode"
@@ -18,12 +18,15 @@
       </template>
       <template #deptId>
         <el-cascader
+          ref="cascaderRef"
+          popper-class="cascader-popper--custom"
           v-model="ruleFormData.deptId"
           :options="deptTree"
           :props="cascaderProp"
           :show-all-levels="false"
           placeholder="请选择制定部门"
           filterable
+          @change="handleChangeDept"
         />
       </template>
       <template #approvalTemplateId>
@@ -37,7 +40,7 @@
         </el-select>
       </template>
       <template #appendix>
-        <UploadFiles label="上传附件" :maxCount="1" />
+        <UploadFiles label="上传附件" :maxCount="1" @uploadSuccess="handleUploadSuccess" />
       </template>
     </BasicForm>
   </div>
@@ -51,20 +54,35 @@
   import { useEmergencyHook } from '@/views/emergency/src/hoos';
   import { useEmergencyPlanHook } from '../hook';
   import type { AddEmergencyPlanForm } from '@/types/emergency-plan';
-  import { PLAN_MANAGEMENT_FROM_CONFIG, PLAN_MANAGEMENT_FROM_DATA, PLAN_MANAGEMENT_FROM_RULES } from '../config';
+  import type { FileItem } from '@/views/disaster/types';
+  import { PLAN_MANAGEMENT_FORM_CONFIG, PLAN_MANAGEMENT_FORM_DATA, PLAN_MANAGEMENT_FORM_RULES } from '../config';
 
   const formRef = ref();
-  const cascaderProp = { checkStrictly: true, expandTrigger: 'hover', value: 'id', label: 'deptName' };
+  const cascaderRef = ref();
+  const cascaderProp = {
+    checkStrictly: true,
+    expandTrigger: 'hover',
+    value: 'id',
+    label: 'deptName',
+    emitPath: false,
+  };
   const { ruleFormConfig, ruleFormData, formRules, cloneRuleFormData, beforeRouteLeave } =
     useFormConfigHook<AddEmergencyPlanForm>(
-      PLAN_MANAGEMENT_FROM_CONFIG,
-      PLAN_MANAGEMENT_FROM_DATA,
-      PLAN_MANAGEMENT_FROM_RULES,
+      PLAN_MANAGEMENT_FORM_CONFIG,
+      PLAN_MANAGEMENT_FORM_DATA,
+      PLAN_MANAGEMENT_FORM_RULES,
     );
 
   const { emergencyEventDice, getEmergencyEventDict, deptTree, getDeptTreeData, approvalList, getApprovalList } =
     useEmergencyHook();
   const { planTypeDice, getPlanTypeDict } = useEmergencyPlanHook();
+  const handleChangeDept = () => {
+    const deptInfo = cascaderRef.value?.getCheckedNodes();
+    ruleFormData.deptName = deptInfo[0].label;
+  };
+  const handleUploadSuccess = (fileList: FileItem[]) => {
+    ruleFormData.uploadFile = fileList;
+  };
   const handleValidate = async () => {
     if (!formRef.value) return;
     const validateResult = await formRef.value.validateForm();

+ 57 - 6
src/views/emergency/emergency-plan/src/components/EditManagementDetail.vue

@@ -1,13 +1,64 @@
 <template>
-    <div>
-
-    </div>
+  <div class="emergency-plan-container">
+    <BasicForm ref="formRef" :formData="ruleFormData" :formConfig="ruleFormConfig">
+      <template #appendix>
+        <UploadFiles label="上传附件" :maxCount="1" @uploadSuccess="handleUploadSuccess" />
+      </template>
+    </BasicForm>
+  </div>
 </template>
 
 <script setup lang="ts">
+  import { ref, onMounted } from 'vue';
+  import BasicForm from '@/components/BasicForm.vue';
+  import UploadFiles from '@/views/disaster/components/UploadFiles.vue';
+  import { useFormConfigHook } from '@/hooks/useFormConfigHook';
+  import { useEmergencyHook } from '@/views/emergency/src/hoos';
+  import { useEmergencyPlanHook } from '../hook';
+  import type { AddEmergencyPlanForm } from '@/types/emergency-plan';
+  import type { FileItem } from '@/views/disaster/types';
+  import { PLAN_MANAGEMENT_FORM_CONFIG_EDIT, PLAN_MANAGEMENT_FORM_DATA } from '../config';
 
-</script>
+  const formRef = ref();
+  const { ruleFormConfig, ruleFormData, cloneRuleFormData, beforeRouteLeave } = useFormConfigHook<AddEmergencyPlanForm>(
+    PLAN_MANAGEMENT_FORM_CONFIG_EDIT,
+    PLAN_MANAGEMENT_FORM_DATA,
+  );
 
-<style scoped lang="scss">
+  const { getEmergencyEventDict, getEmergencyEvent, getDeptTreeData, getApprovalList } = useEmergencyHook();
+  const { getPlanTypeDict, getPlanType } = useEmergencyPlanHook();
+  const getPlanDetail = () => {
+    ruleFormData.planName = '测试';
+    ruleFormData.planType = getPlanType('comprehensive_contingency') || '';
+    ruleFormData.eventType = getEmergencyEvent('flood_typhoon_prevention') || '';
+    cloneRuleFormData();
+  };
+  const handleUploadSuccess = (fileList: FileItem[]) => {
+    ruleFormData.uploadFile = fileList;
+  };
+  const handleValidate = async () => {
+    if (!formRef.value) return;
+    const validateResult = await formRef.value.validateForm();
+    return validateResult;
+  };
+  const getFormData = () => {
+    cloneRuleFormData();
+    return ruleFormData;
+  };
+  onMounted(async () => {
+    await getPlanTypeDict();
+    await getEmergencyEventDict();
+    await getDeptTreeData();
+    await getApprovalList();
+    getPlanDetail();
+    beforeRouteLeave();
+  });
+  defineExpose({
+    handleValidate,
+    getFormData,
+  });
+</script>
 
-</style>
+<style lang="scss" scoped>
+  @use '../styles/info.scss' as *;
+</style>

+ 60 - 7
src/views/emergency/emergency-plan/src/config/form.ts

@@ -2,9 +2,15 @@
  * 应急预案表单配置
  */
 import type { FormConfig } from '@/types/basic-form';
-
+const BASIC_FORM_CONFIG = {
+  APPENDIX: {
+    label: '预案文件:',
+    prop: 'appendix',
+    slot: 'appendix',
+  },
+};
 // 盘点任务表单信息
-export const PLAN_MANAGEMENT_FROM_CONFIG: FormConfig[] = [
+export const PLAN_MANAGEMENT_FORM_CONFIG: FormConfig[] = [
   {
     label: '预案名称:',
     prop: 'planName',
@@ -33,25 +39,72 @@ export const PLAN_MANAGEMENT_FROM_CONFIG: FormConfig[] = [
     prop: 'approvalTemplateId',
     slot: 'approvalTemplateId',
   },
+  BASIC_FORM_CONFIG.APPENDIX,
+];
+
+export const PLAN_MANAGEMENT_FORM_CONFIG_EDIT: FormConfig[] = [
   {
-    label: '预案文件:',
-    prop: 'appendix',
-    slot: 'appendix',
+    label: '预案名称:',
+    prop: 'planName',
+    component: 'ElInput',
+    componentProps: {
+      placeholder: '请输入预案名称',
+      disabled: true,
+    },
+  },
+  {
+    label: '预案层级:',
+    prop: 'planType',
+    component: 'ElInput',
+    componentProps: {
+      placeholder: '请输入预案层级',
+      disabled: true,
+    },
+  },
+  {
+    label: '事件类型:',
+    prop: 'eventType',
+    component: 'ElInput',
+    componentProps: {
+      placeholder: '请输入事件类型',
+      disabled: true,
+    },
+  },
+  {
+    label: '制定部门:',
+    prop: 'deptId',
+    component: 'ElInput',
+    componentProps: {
+      placeholder: '请输入制定部门',
+      disabled: true,
+    },
+  },
+  {
+    label: '审批流程:',
+    prop: 'approvalTemplateId',
+    component: 'ElInput',
+    componentProps: {
+      placeholder: '请输入审批流程',
+      disabled: true,
+    },
   },
+  BASIC_FORM_CONFIG.APPENDIX,
 ];
 
 // 盘点任务表单数据
-export const PLAN_MANAGEMENT_FROM_DATA = {
+export const PLAN_MANAGEMENT_FORM_DATA = {
   planName: '',
   planType: '',
   eventType: '',
   deptId: '',
+  deptName: '',
   approvalTemplateId: '',
   appendix: '',
+  uploadFile: [],
 };
 
 // 盘点任务表单规则
-export const PLAN_MANAGEMENT_FROM_RULES = {
+export const PLAN_MANAGEMENT_FORM_RULES = {
   planName: [{ required: true, message: '请输入预案名称', trigger: 'blur' }],
   planType: [{ required: true, message: '请选择预案层级', trigger: 'change' }],
   eventType: [{ required: true, message: '请选择事件类型', trigger: 'change' }],

+ 10 - 4
src/views/emergency/emergency-plan/src/config/index.ts

@@ -5,14 +5,20 @@ import {
   TABLE_MAX_HEIGHT_DEFAULT,
   TABLE_MAX_HEIGHT_PERMISSION,
 } from './table';
-import { PLAN_MANAGEMENT_FROM_CONFIG, PLAN_MANAGEMENT_FROM_DATA, PLAN_MANAGEMENT_FROM_RULES } from './form';
+import {
+  PLAN_MANAGEMENT_FORM_CONFIG,
+  PLAN_MANAGEMENT_FORM_DATA,
+  PLAN_MANAGEMENT_FORM_RULES,
+  PLAN_MANAGEMENT_FORM_CONFIG_EDIT,
+} from './form';
 export {
   EMERGENCY_PLAN_MANAGEMENT_SEARCH_CONFIG,
   EMERGENCY_PLAN_MANAGEMENT_TABLE_OPTIONS,
   EMERGENCY_PLAN_MANAGEMENT_TABLE_COLUMNS,
   TABLE_MAX_HEIGHT_DEFAULT,
   TABLE_MAX_HEIGHT_PERMISSION,
-  PLAN_MANAGEMENT_FROM_CONFIG,
-  PLAN_MANAGEMENT_FROM_DATA,
-  PLAN_MANAGEMENT_FROM_RULES,
+  PLAN_MANAGEMENT_FORM_CONFIG,
+  PLAN_MANAGEMENT_FORM_CONFIG_EDIT,
+  PLAN_MANAGEMENT_FORM_DATA,
+  PLAN_MANAGEMENT_FORM_RULES,
 };

+ 9 - 9
src/views/emergency/emergency-supplies/PageInventoryCheck.vue

@@ -46,7 +46,7 @@
           </BasicSearch>
           <div class="date-time-container" v-if="endTime">
             <span>任务期限:{{ endTime }}</span>
-            <el-button type="primary" :disabled="isTaskExpired" @click="handleConfirm" v-if="isInventory"
+            <el-button type="primary" @click="handleConfirm" v-if="isInventory"
               >盘点确认</el-button
             >
           </div>
@@ -136,7 +136,7 @@
 </template>
 
 <script setup lang="ts">
-  import { ref, reactive, onMounted, watch, computed, onBeforeUnmount } from 'vue';
+  import { ref, reactive, onMounted, watch, onBeforeUnmount } from 'vue';
   import { ElMessage } from 'element-plus';
   import BasicSearch from '@/components/BasicSearch.vue';
   import BasicTable from '@/components/BasicTable.vue';
@@ -198,14 +198,14 @@
   // 定时器引用
   const pollTimer = ref<number | null>(null);
 
-  const isTaskExpired = computed(() => {
-    if (!endTime.value) return true;
+  // const isTaskExpired = computed(() => {
+  //   if (!endTime.value) return true;
 
-    const currentTime = new Date();
-    const taskEndTime = new Date(endTime.value);
+  //   const currentTime = new Date();
+  //   const taskEndTime = new Date(endTime.value);
 
-    return currentTime > taskEndTime;
-  });
+  //   return currentTime > taskEndTime;
+  // });
 
   const handleSearch = () => {
     inventoryCheckListQuery.queryParam = {};
@@ -306,7 +306,7 @@
   };
 
   const handleConfirm = async () => {
-    const confirmed = await openMessageBox('', '是否盘点该条任务?', 'warning');
+    const confirmed = await openMessageBox('确认后将更新为盘点的数量和地点,是否确认盘点结果?', '盘点确认', 'warning');
     if (!confirmed) return;
     if (!searchData.taskId) return;
     await confirmInventoryTask(searchData.taskId);

+ 2 - 6
src/views/emergency/emergency-supplies/src/components/EditEmergencyItem.vue

@@ -18,12 +18,12 @@
         />
       </template>
       <template #park>
-        <el-select v-model="ruleFormData.park" placeholder="请选择园区" filterable @change="editPark">
+        <el-select v-model="ruleFormData.park" placeholder="请选择园区" filterable disabled>
           <el-option v-for="item in parkDice" :key="item.itemCode" :label="item.itemValue" :value="item.itemCode" />
         </el-select>
       </template>
       <template #location>
-        <el-select v-model="ruleFormData.location" placeholder="请输入地点" :disabled="Boolean(!ruleFormData.park)">
+        <el-select v-model="ruleFormData.location" placeholder="请输入地点" filterable>
           <el-option v-for="item in locationDice" :key="item.itemCode" :label="item.itemValue" :value="item.itemCode" />
         </el-select>
       </template>
@@ -139,10 +139,6 @@
     getLocationDict(ruleFormData.park as 'zhangjiang_park' | 'dachang_park');
     cloneRuleFormData();
   };
-  const editPark = (type: 'zhangjiang_park' | 'dachang_park') => {
-    handleChangePark(type);
-    ruleFormData.location = '';
-  };
   const editKeeper = (value: QueryUserInfoByUserNameRes) => {
     if (!value) return;
     ruleFormData.keeperName = value.realname;

+ 1 - 1
src/views/emergency/emergency-supplies/src/config/form.ts

@@ -273,7 +273,6 @@ export const VIEW_EMERGENCY_ITEM_DATA = {
 
 const BASIC_EMERGENCY_ITEM_RULES = {
   requiredQuantity: [{ required: true, message: '请输入应备数量', trigger: 'change' }],
-  park: [{ required: true, message: '请选择园区', trigger: 'change' }],
   location: [{ required: true, message: '请选择地点', trigger: 'change' }],
   expirationDate: [{ validator: validateFormTime, trigger: 'change' }],
   keeperName: [{ required: true, message: '请选择保管人', trigger: 'change' }],
@@ -283,6 +282,7 @@ export const ADD_EMERGENCY_ITEM_RULES = {
   emergencyType: [{ required: true, message: '请选择应急类型', trigger: 'change' }],
   supplyType: [{ required: true, message: '请选择物资类型', trigger: 'change' }],
   supplyName: [{ required: true, message: '请输入应急物资名称', trigger: 'change' }],
+  park: [{ required: true, message: '请选择园区', trigger: 'change' }],
   ...BASIC_EMERGENCY_ITEM_RULES,
 };
 

+ 1 - 1
src/views/emergency/emergency-supplies/src/constant/index.ts

@@ -49,7 +49,7 @@ export const INVENTORY_RESULT_MAP = {
   [INVENTORY_RESULT.CHECKING]: '盘点中',
   [INVENTORY_RESULT.INTACT]: '完好',
   [INVENTORY_RESULT.DAMAGED]: '缺损',
-  [INVENTORY_RESULT.OVERDUE]: '期未完成',
+  [INVENTORY_RESULT.OVERDUE]: '期未完成',
 };
 
 export const INVENTORY_RESULT_OPTIONS = [