Explorar o código

fix:修改区域检查任务管理和区域检查计划-被检查单位可修改

sunqijun hai 3 semanas
pai
achega
ee1be59f0c

+ 1 - 1
src/api/production-safety-system/index.ts

@@ -1429,7 +1429,7 @@ export function queryAreaCheckRecordTemplateDept(id: number) {
 /** 区域检查计划管理(部门) - 开始任务检查的检查明细列表 */
 export function fetchDeptAreaCheckRecord(id: number) {
   return http.request({
-    url: `areaCheckPlanManageDept/queryAreaCheckRecord?id=${id}`,
+    url: `/areaCheckPlanManageDept/queryAreaCheckRecord?id=${id}`,
     method: 'post',
   });
 }

+ 80 - 36
src/views/production-safety/hiddenTroubleInvestigationAndGovernance/areaCheckPlanManagementDept/components/areaCheckPlanRecordDetailDept.vue

@@ -2,7 +2,23 @@
   <main class="safety-platform-container__main">
     <el-form ref="formRef" :model="formData" :rules="isViewMode ? undefined : formRules" label-width="180px" class="check-record-form">
       <el-form-item label="被检查单位:" prop="inspectedUnit">
-        <el-input v-model="formData.inspectedUnit" :disabled="!isAddMode || checkType===1" placeholder="请输入被检查单位" clearable />
+        <el-cascader
+          ref="CascaderRef"
+          v-model="formData.inspectedUnit"
+          :options="deptTreeOne"
+          :props="cascaderDeptProp"
+          :show-all-levels="false"
+          collapse-tags
+          collapse-tags-tooltip
+          :max-collapse-tags="3"
+          placeholder="请选择被检查单位"
+          filterable
+          clearable
+          :disabled="isViewMode"
+          style="width: 100%"
+          @change="responsibleDeptChange"
+        />
+        <!-- <el-input v-model="formData.inspectedUnit" :disabled="!isAddMode || checkType===1" placeholder="请输入被检查单位" clearable /> -->
       </el-form-item>
       <el-form-item label="检查人员:" prop="inspector">
         <el-input v-model="formData.inspector" :disabled="true" placeholder="请输入检查人员" clearable />
@@ -116,7 +132,8 @@
   import PreviewOnline from '@/views/disaster/components/PreviewOnline.vue';
   import { downloadFile } from '@/views/disaster/utils';
   import { useUserInfoHook } from '@/views/disaster/hooks';
-
+  import type { DeptTree } from '@/types/dept/type';
+  import { getAllDepartments } from '@/api/auth/dept';
   const previewOnlineRef = ref<InstanceType<typeof PreviewOnline>>();
   const router = useRouter();
   const route = useRoute();
@@ -133,7 +150,8 @@
   const needSigneeSign = computed(() => route.query.needSigneeSign);
   const formRef = ref();
   const formData = ref({
-    inspectedUnit: '',
+    inspectedUnit: '' as string | number,
+    checkedCompanyName: '',
     inspector: '',
     checkTime: '',
     checkPlace: '',
@@ -167,7 +185,37 @@
   }
 
   const checkItems = ref<CheckItem[]>([]);
+  const deptTreeOne = ref<DeptTree[]>([]);
+  const cascaderDeptProp = {
+    checkStrictly: true,
+    expandTrigger: 'hover' as const,
+    value: 'id',
+    label: 'deptName',
+    emitPath: false,
+  };
+  const responsibleDeptChange = (value) => {
+    formData.value.inspectedUnit = value;
+    // 根据选择的部门ID获取对应的部门name并设置到表单中
+    const deptName = getDeptCodeByName(value);
+    formData.value.checkedCompanyName = deptName;
+  };
 
+  const getDeptCodeByName = (id) => {
+    const findDeptCode = (nodes: DeptTree[]): string | null => {
+      for (const node of nodes) {
+        if (String(node.id) === String(id)) {
+          return node.deptName || null;
+        }
+        if (node.children && node.children.length > 0) {
+          const code = findDeptCode(node.children);
+          if (code) return code;
+        }
+      }
+      return null;
+    };
+    return findDeptCode(deptTreeOne.value || []) || '';
+  }
+  const CascaderRef = ref();
   function convertSignFileToFileItems(attachmentsStr: string): FileItem[] {
     if (!attachmentsStr || !String(attachmentsStr).trim()) return [];
     const urls = String(attachmentsStr)
@@ -216,7 +264,8 @@
       await saveAreaCheckPlanDetailDept({
           areaPlanId: checkItemData.areaPlanId || planId.value,
           id: checkItemData.id, // 编辑时传记录ID,新增时后端自动生成无需传
-          checkedCompanyName: formData.value.inspectedUnit,
+          checkedCompanyName: formData.value.checkedCompanyName,
+          checkedCompanyCode: formData.value.inspectedUnit,
           checkTime: formData.value.checkTime,
           checkPersonName: formData.value.inspector,
           // 暂无人员 code 来源,前端先不传或由后端根据名称解析
@@ -247,7 +296,8 @@
         const raw = (res as { data?: Record<string, unknown> })?.data ?? res;
         const r = raw as Record<string, unknown>;
         formData.value = {
-          inspectedUnit: String(r?.checkedCompanyName ?? r?.checkedCompany ?? ''),
+          inspectedUnit: Number(r.checkedCompanyCode),
+          checkedCompanyName: String(r?.checkedCompanyName ?? ''),
           inspector: String(r?.checkPersonName ?? r?.checkPerson ?? ''),
           checkTime: String(r?.checkTime ?? ''),
           checkPlace: String(r?.checkAddress ?? r?.checkPlace ?? ''),
@@ -269,6 +319,7 @@
       // 无 recordId 的查看场景,只保留空表单和空检查明细(不依赖路由传递数据)
       formData.value = {
         inspectedUnit: '',
+        checkedCompanyName: '',
         inspector: '',
         checkTime: '',
         checkPlace: '',
@@ -298,18 +349,17 @@
       const res = await fetchDeptAreaCheckRecord(recordId.value);
       const list = res.areaCheckRecords || [];
       checkItemData = res
-
-      if(checkType.value === 1){
-        formData.value.inspectedUnit = res.checkedCompanyName ?? res.checkedCompany ?? ''
-      }
-      formData.value.inspector = res.checkPersonName ?? res.checkPerson ?? ''
-      formData.value.checkTime = res.checkTime ?? ''
+      formData.value.inspectedUnit = res.checkedCompanyCode
+      formData.value.checkedCompanyName = res.checkedCompanyName
+      formData.value.inspector = res.checkPersonName ??''
+      formData.value.checkTime = res.checkTime || ''
       formData.value.checkPlace = res.checkAddress ?? res.checkPlace ?? ''
       formData.value.overallDesc = res.overallCheckDesc || ''
+      // 被检查人签字文件
       if(res.checkedPersonSign){
-       formData.value.signFile = JSON.stringify(convertSignFileToFileItems(String(res.checkedPersonSign || '')))
+       formData.value.signFile = res.checkedPersonSign || ''
+       signFileList.value = JSON.parse(res.checkedPersonSign || '')
       }
-      signFileList.value = convertSignFileToFileItems(String(res.checkedPersonSign || ''))
 
       if (Array.isArray(list) && list.length > 0) {
         checkItems.value = list;
@@ -326,12 +376,12 @@
 
   const initFormData = async () => {
     if (isAddMode.value) {
-      const { planName, checkVenue } = route.query;
       formData.value = {
-        inspectedUnit: planName ? String(planName) : '',
+        inspectedUnit: '', 
+        checkedCompanyName: '',
         inspector: '',
         checkTime: '',
-        checkPlace: checkVenue ? String(checkVenue) : '',
+        checkPlace: '',
         overallDesc: '',
         signFile: '',
       };
@@ -355,31 +405,25 @@
     try {
       const res = await queryAreaCheckPlanManageDeptDetail(currentId.value);
       viewDetailData.value = { ...res };
-      // 若是自查,则被检查单位默认就是本单位,不需要手动输入。
-      if(checkType.value === 1){
-        authority.value = true
-        formData.value.inspectedUnit = res.checkedCompanyName ?? res.checkedCompany ?? ''
-      }
-      formData.value.inspector = res.checkPersonName ?? res.checkPerson ?? ''
-      formData.value.checkTime = res.checkTime || ''
-      formData.value.checkPlace = res.checkAddress ?? res.checkPlace ?? ''
-      formData.value.overallDesc = res.overallCheckDesc || ''
-      if(res.checkedPersonSign){
-       formData.value.signFile = JSON.stringify(convertSignFileToFileItems(String(res.checkedPersonSign || '')))
-      }
-      signFileList.value = convertSignFileToFileItems(String(res.checkedPersonSign || ''))
-      // 如果主责部门责任人ID包含当前登录人ID,则直接回填(被检查单位、 检查人员、检查时间、检查地点),且不可更改
-      let primaryResponsibleDeptPersonCode = res.primaryResponsibleDeptPersonCode?.split(',').map(Number)
-      if(primaryResponsibleDeptPersonCode?.includes(id)){
-        authority.value = true
-        formData.value.inspectedUnit = res.responsibleDeptName || ''
-        formData.value.inspector = String(res.primaryResponsibleDeptPersonName) || ''
-      }
     } catch (e) {
       console.error('获取详情失败:', e);
     }
+  };
+      /** 部门树:一级部门 */
+  const getDeptTreeData = async () => {
+    try {
+      const res = await getAllDepartments();
+      deptTreeOne.value = res?.[0]?.children.map(item => ({
+        ...item,
+        children: []
+      }));
+    } catch (e) {
+      console.error('获取部门树失败:', e);
+      deptTreeOne.value = [];
+    }
   };
   onMounted(() => {
+    getDeptTreeData();
     getDetail()
     initFormData();
   });

+ 82 - 33
src/views/production-safety/hiddenTroubleInvestigationAndGovernance/areaCheckPlanTaskDept/components/areaCheckPlanRecordDetail.vue

@@ -2,7 +2,23 @@
   <main class="safety-platform-container__main">
     <el-form ref="formRef" :model="formData" :rules="isViewMode ? undefined : formRules" label-width="180px" class="check-record-form">
       <el-form-item label="被检查单位:" prop="inspectedUnit">
-        <el-input v-model="formData.inspectedUnit" :disabled="!isAddMode || checkType===1" placeholder="请输入被检查单位" clearable />
+        <el-cascader
+          ref="CascaderRef"
+          v-model="formData.inspectedUnit"
+          :options="deptTreeOne"
+          :props="cascaderDeptProp"
+          :show-all-levels="false"
+          collapse-tags
+          collapse-tags-tooltip
+          :max-collapse-tags="3"
+          placeholder="请选择被检查单位"
+          filterable
+          clearable
+          :disabled="isViewMode"
+          style="width: 100%"
+          @change="responsibleDeptChange"
+        />
+        <!-- <el-input v-model="formData.inspectedUnit" :disabled="!isAddMode || checkType===1" placeholder="请输入被检查单位" clearable /> -->
       </el-form-item>
       <el-form-item label="检查人员:" prop="inspector">
         <el-input v-model="formData.inspector" :disabled="true" placeholder="请输入检查人员" clearable />
@@ -116,6 +132,8 @@
   import PreviewOnline from '@/views/disaster/components/PreviewOnline.vue';
   import { downloadFile } from '@/views/disaster/utils';
   import { useUserInfoHook } from '@/views/disaster/hooks';
+  import type { DeptTree } from '@/types/dept/type';
+  import { getAllDepartments } from '@/api/auth/dept';
 
   const previewOnlineRef = ref<InstanceType<typeof PreviewOnline>>();
   const router = useRouter();
@@ -134,7 +152,8 @@
   const viewDetailData = ref<Record<string, unknown>>({});
   const formRef = ref();
   const formData = ref({
-    inspectedUnit: '',
+    inspectedUnit: '' as string | number,
+    checkedCompanyName: '',
     inspector: '',
     checkTime: '',
     checkPlace: '',
@@ -166,7 +185,29 @@
     checkProblem: string;
     id: number;
   }
+  const deptTreeOne = ref<DeptTree[]>([]);
+  const cascaderDeptProp = {
+    checkStrictly: true,
+    expandTrigger: 'hover' as const,
+    value: 'id',
+    label: 'deptName',
+    emitPath: false,
+  };
+  const CascaderRef = ref();
 
+    /** 部门树:一级部门 */
+  const getDeptTreeData = async () => {
+    try {
+      const res = await getAllDepartments();
+      deptTreeOne.value = res?.[0]?.children.map(item => ({
+        ...item,
+        children: []
+      }));
+    } catch (e) {
+      console.error('获取部门树失败:', e);
+      deptTreeOne.value = [];
+    }
+  };
   const checkItems = ref<CheckItem[]>([]);
 
   function convertSignFileToFileItems(attachmentsStr: string): FileItem[] {
@@ -202,6 +243,22 @@
     router.back();
   };
 
+  const getDeptCodeByName = (id) => {
+    const findDeptCode = (nodes: DeptTree[]): string | null => {
+      for (const node of nodes) {
+        if (String(node.id) === String(id)) {
+          return node.deptName || null;
+        }
+        if (node.children && node.children.length > 0) {
+          const code = findDeptCode(node.children);
+          if (code) return code;
+        }
+      }
+      return null;
+    };
+    return findDeptCode(deptTreeOne.value || []) || '';
+  }
+
   const handleSubmit = async () => {
     if (!formRef.value) return;
     const valid = await formRef.value.validate().catch(() => false);
@@ -217,7 +274,8 @@
       await saveAreaCheckPlanDetailDept({
           areaPlanId: checkItemData.areaPlanId || planId.value,
           id: checkItemData.id, // 编辑时传记录ID,新增时后端自动生成无需传
-          checkedCompanyName: formData.value.inspectedUnit,
+          checkedCompanyName: formData.value.checkedCompanyName,
+          checkedCompanyCode: formData.value.inspectedUnit,
           checkTime: formData.value.checkTime,
           checkPersonName: formData.value.inspector,
           // 暂无人员 code 来源,前端先不传或由后端根据名称解析
@@ -254,6 +312,13 @@
     return [];
   }
 }
+
+  const responsibleDeptChange = (value) => {
+    formData.value.inspectedUnit = value;
+    // 根据选择的部门ID获取对应的部门name并设置到表单中
+    const deptName = getDeptCodeByName(value);
+    formData.value.checkedCompanyName = deptName;
+  };
   const loadRecordDetail = async () => {
     if (recordId.value) {
       try {
@@ -261,7 +326,8 @@
         const raw = (res as { data?: Record<string, unknown> })?.data ?? res;
         const r = raw as Record<string, unknown>;
         formData.value = {
-          inspectedUnit: String(r?.checkedCompanyName ?? r?.checkedCompany ?? ''),
+          inspectedUnit: Number(r.checkedCompanyCode), 
+          checkedCompanyName: String(r?.checkedCompanyName ?? ''),
           inspector: String(r?.checkPersonName ?? r?.checkPerson ?? ''),
           checkTime: String(r?.checkTime ?? ''),
           checkPlace: String(r?.checkAddress ?? r?.checkPlace ?? ''),
@@ -283,6 +349,7 @@
       // 无 recordId 的查看场景,只保留空表单和空检查明细(不依赖路由传递数据)
       formData.value = {
         inspectedUnit: '',
+        checkedCompanyName: '',
         inspector: '',
         checkTime: '',
         checkPlace: '',
@@ -312,17 +379,18 @@
       const res = await fetchDeptAreaCheckRecord(recordId.value);
       const list = res.areaCheckRecords || [];
       checkItemData = res
-      if(checkType.value === 1){
-        formData.value.inspectedUnit = res.responsibleDeptName || ''
-      }
-      formData.value.inspector = res.checkPersonName ?? res.checkPerson ?? ''
+      formData.value.inspectedUnit = res.checkedCompanyCode
+      formData.value.checkedCompanyName = res.checkedCompanyName
+      formData.value.inspector = res.checkPersonName ??''
       formData.value.checkTime = res.checkTime || ''
       formData.value.checkPlace = res.checkAddress ?? res.checkPlace ?? ''
       formData.value.overallDesc = res.overallCheckDesc || ''
+      // 被检查人签字文件
       if(res.checkedPersonSign){
-       formData.value.signFile = JSON.stringify(convertSignFileToFileItems(String(res.checkedPersonSign || '')))
+       formData.value.signFile = res.checkedPersonSign || ''
+       signFileList.value = JSON.parse(res.checkedPersonSign || '')
       }
-      signFileList.value = convertSignFileToFileItems(String(res.checkedPersonSign || ''))
+
       if (Array.isArray(list) && list.length > 0) {
         checkItems.value = list;
       } else {
@@ -337,12 +405,12 @@
 
   const initFormData = async () => {
     if (isAddMode.value) {
-      const { planName, checkVenue } = route.query;
       formData.value = {
-        inspectedUnit: '', // planName ? String(planName) : '',
+        inspectedUnit: '',
+        checkedCompanyName: '',
         inspector: '',
         checkTime: '',
-        checkPlace: '', //checkVenue ? String(checkVenue) : '',
+        checkPlace: '',
         overallDesc: '',
         signFile: '',
       };
@@ -366,31 +434,12 @@
     try {
       const res = await queryAreaCheckPlanManageDeptDetail(currentId.value);
       viewDetailData.value = { ...res };
-      // 若是自查,则被检查单位默认就是本单位,不需要手动输入。
-      if(checkType.value === 1){
-        authority.value = true
-        formData.value.inspectedUnit = res.responsibleDeptName || ''
-      }
-      formData.value.inspector = res.checkPersonName ?? res.checkPerson ?? ''
-      formData.value.checkTime = res.checkTime || ''
-      formData.value.checkPlace = res.checkAddress ?? res.checkPlace ?? ''
-      formData.value.overallDesc = res.overallCheckDesc || ''
-      if(res.checkedPersonSign){
-       formData.value.signFile = JSON.stringify(convertSignFileToFileItems(String(res.checkedPersonSign || '')))
-      }
-      signFileList.value = convertSignFileToFileItems(String(res.checkedPersonSign || ''))
-      // 如果主责部门责任人ID包含当前登录人ID,则直接回填(被检查单位、 检查人员、检查时间、检查地点),且不可更改
-      let primaryResponsibleDeptPersonCode = res.primaryResponsibleDeptPersonCode?.split(',').map(Number)
-      if(primaryResponsibleDeptPersonCode?.includes(id)){
-        authority.value = true
-        formData.value.inspectedUnit = res.responsibleDeptName || ''
-        formData.value.inspector = String(res.primaryResponsibleDeptPersonName) || ''
-      }
     } catch (e) {
       console.error('获取详情失败:', e);
     }
   };
   onMounted(() => {
+    getDeptTreeData();
     getDetail()
     initFormData();
   });