xiaweibo 1 месяц назад
Родитель
Сommit
4328caa8d8

+ 9 - 1
src/views/production-safety/hiddenTroubleInvestigationAndGovernance/areaCheckPlanManagementDept/components/areaCheckPlanManagementDeptDetail.vue

@@ -689,11 +689,15 @@
   };
 
   const onAddRecord = () => {
+    const needOverallDesc = !viewDetail.value.needOverallDesc ? 0 : 1;
+    const needSigneeSign = !viewDetail.value.needSigneeSign ? 0 : 1;
     router.push({
       name: 'areaCheckPlanManagementDeptItem',
       query: {
         operate: 'area-check-plan-record-add',
-        planId: currentId.value,
+        planId: currentId.value,  
+        needOverallDesc,
+        needSigneeSign,
       },
     });
   };
@@ -722,12 +726,16 @@
   };
 
   const onViewRecord = (row: Record<string, unknown>) => {
+    const needOverallDesc = !viewDetail.value.needOverallDesc ? 0 : 1;
+    const needSigneeSign = !viewDetail.value.needSigneeSign ? 0 : 1;
     router.push({
       name: 'areaCheckPlanManagementDeptItem',
       query: {
         operate: 'area-check-plan-record-view',
         recordId: row.id,
         planId: currentId.value,
+        needOverallDesc,
+        needSigneeSign,
       },
     });
   };

+ 67 - 25
src/views/production-safety/hiddenTroubleInvestigationAndGovernance/areaCheckPlanManagementDept/components/areaCheckPlanRecordDetailDept.vue

@@ -1,6 +1,6 @@
 <template>
   <main class="safety-platform-container__main">
-    <el-form ref="formRef" :model="formData" :rules="isAddMode ? formRules : undefined" label-width="180px" class="check-record-form">
+    <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" placeholder="请输入被检查单位" clearable />
       </el-form-item>
@@ -22,7 +22,7 @@
       <el-form-item label="检查地点:" prop="checkPlace">
         <el-input v-model="formData.checkPlace" :disabled="!isAddMode" placeholder="请输入检查地点" clearable />
       </el-form-item>
-      <el-form-item label="整体检查情况描述:" prop="overallDesc">
+      <el-form-item v-if="needOverallDesc === '1'" label="整体检查情况描述:" prop="overallDesc" :required="needOverallDesc === '1' && isAddMode">
         <el-input
           v-model="formData.overallDesc"
           type="textarea"
@@ -33,16 +33,31 @@
           :placeholder="isAddMode ? '请输入整体检查情况描述(限300字)' : '整体检查情况描述(限300字)'"
         />
       </el-form-item>
-      <el-form-item label="被检查人签字文件:" prop="signFile">
-        <div v-if="!isAddMode" class="upload-files-disabled">
-          <UploadFiles label="上传附件" :file-list="displayFileList" />
-        </div>
+      <el-form-item v-if="needSigneeSign === '1'" label="被检查人签字文件:" prop="signFile" :required="needSigneeSign === '1' && isAddMode">
         <UploadFiles
-          v-else
-          label="上传附件"
-          :file-list="displayFileList"
-          @uploadSuccess="handleUploadSuccess"
+          v-if="!isViewMode"
+          label="上传文件"
+          :maxCount="1"
+          :file-list="signFileList"
+          :disabled="isViewMode"
+          :allow-all-file-types="true"
+          :accept="'.jpg,.jpeg,.png'"
+          :desc="'支持.jpg,.jpeg,.png'"
+          @uploadSuccess="(list: FileItem[]) => handleUploadSuccess(list)"
         />
+        <div class="file-list" v-else>
+          <div class="file-item" v-for="file in signFileList" :key="file.fileId">
+            <span class="file-item--name">{{ file.fileName }}</span>
+            <div class="file-item--footer">
+              <el-button link type="primary" @click="previewOnline(file.fileUrl, file.fileType)"
+                >预览</el-button
+              >
+              <el-button link type="primary" @click.stop="downloadFile(file.fileUrl, file.fileName)"
+                >下载</el-button
+              >
+            </div>
+          </div>
+        </div>
       </el-form-item>
     </el-form>
 
@@ -77,6 +92,9 @@
       <el-button @click="handleBack">返回</el-button>
       <el-button type="primary" @click="handleSubmit">提交</el-button>
     </footer>
+
+    <PreviewOnline ref="previewOnlineRef" />
+
   </main>
 </template>
 
@@ -92,15 +110,21 @@
     saveAreaCheckPlanDetailDept,
     type AreaCheckRecordTemplateItem,
   } from '@/api/production-safety-system';
+  import { formatAttachmentList } from '@/components/UploadFiles/utils';
+  import PreviewOnline from '@/views/disaster/components/PreviewOnline.vue';
+  import { downloadFile } from '@/views/disaster/utils';
 
+  const previewOnlineRef = ref<InstanceType<typeof PreviewOnline>>();
   const router = useRouter();
   const route = useRoute();
 
   const operate = computed(() => (route.query.operate as string) || '');
   const isAddMode = computed(() => operate.value === 'area-check-plan-record-add');
+  const isViewMode = computed(() => operate.value === 'area-check-plan-record-view');
   const recordId = computed(() => Number(route.query.recordId));
   const planId = computed(() => Number(route.query.planId));
-
+  const needOverallDesc = computed(() => route.query.needOverallDesc);
+  const needSigneeSign = computed(() => route.query.needSigneeSign);
   const formRef = ref();
   const formData = ref({
     inspectedUnit: '',
@@ -116,6 +140,16 @@
     inspector: [{ required: true, message: '请输入检查人员', trigger: 'blur' }],
     checkTime: [{ required: true, message: '请选择检查时间', trigger: 'change' }],
     checkPlace: [{ required: true, message: '请输入检查地点', trigger: 'blur' }],
+    overallDesc: [{ 
+      required: needOverallDesc.value === '1', 
+      message: '请输入整体检查情况描述', 
+      trigger: 'blur' 
+    }],
+    signFile: [{ 
+      required: needSigneeSign.value === '1', 
+      message: '请上传被检查人签字文件', 
+      trigger: 'change' 
+    }],
   };
 
   interface CheckItem {
@@ -152,11 +186,9 @@
   });
 
   const handleUploadSuccess = (files: FileItem[]) => {
+    debugger
     signFileList.value = files;
-    formData.value.signFile = files
-      .map((f) => f.fileUrl || f.fileName)
-      .filter(Boolean)
-      .join(',');
+    formData.value.signFile = JSON.stringify(files);
   };
 
   const handleBack = () => {
@@ -172,16 +204,19 @@
       return;
     }
     try {
+
+      const uploadedFileList = await formatAttachmentList(signFileList.value);
+
       await saveAreaCheckPlanDetailDept({
-        areaPlanId: planId.value,
-        checkedCompanyName: formData.value.inspectedUnit,
-        checkTime: formData.value.checkTime,
-        checkPersonName: formData.value.inspector,
-        // 暂无人员 code 来源,前端先不传或由后端根据名称解析
-        checkAddress: formData.value.checkPlace,
-        overallCheckDesc: formData.value.overallDesc,
-        checkedPersonSign: formData.value.signFile,
-        areaCheckRecords: checkItems.value.map((item) => ({
+          areaPlanId: planId.value,
+          checkedCompanyName: formData.value.inspectedUnit,
+          checkTime: formData.value.checkTime,
+          checkPersonName: formData.value.inspector,
+          // 暂无人员 code 来源,前端先不传或由后端根据名称解析
+          checkAddress: formData.value.checkPlace,
+          overallCheckDesc: formData.value.overallDesc,
+          checkedPersonSign: JSON.stringify(uploadedFileList),
+          areaCheckRecords: checkItems.value.map((item) => ({
           checkContent: item.checkContent || '',
           checkStandard: item.checkStandard || '',
           // 新增检查日志时,检查结果和问题直接使用接口返回的数据
@@ -209,8 +244,9 @@
           checkTime: String(r?.checkTime ?? ''),
           checkPlace: String(r?.checkAddress ?? r?.checkPlace ?? ''),
           overallDesc: String(r?.overallCheckDesc ?? ''),
-          signFile: String(r?.checkedPersonSign ?? ''),
+          signFile: JSON.stringify(convertSignFileToFileItems(String(r?.checkedPersonSign ?? ''))),
         };
+        signFileList.value = JSON.parse(r.checkedPersonSign || '[]');
         const records = (r?.areaCheckRecords ?? []) as Array<Record<string, unknown>>;
         checkItems.value = records.map((item) => ({
           checkContent: (item.checkContent ?? '') as string,
@@ -276,6 +312,12 @@
     }
   };
 
+  const previewOnline = (url: string | undefined, type) => {
+    if (url) {
+      previewOnlineRef.value?.open(url, type);
+    }
+  };
+
   onMounted(() => {
     initFormData();
   });

+ 1 - 1
src/views/production-safety/hiddenTroubleInvestigationAndGovernance/employeeReportHiddenTroubleManagement/employeeReportHiddenTroubleManagement.vue

@@ -7,7 +7,7 @@
       <div class="search-table-container">
         <header>
           <div style="position: relative">
-            <el-button type="primary" class="search-table-container--button" @click="handleCreate"> 新增 </el-button>
+            <!-- <el-button type="primary" class="search-table-container--button" @click="handleCreate"> 新增 </el-button> -->
             <el-button plain class="search-table-container--button" @click="handleImport"> 导入 </el-button>
           </div>
 

+ 4 - 2
src/views/production-safety/productionSafetySystem/safetyTraining/components/safetyTrainingDetail.vue

@@ -29,9 +29,9 @@
               <el-button link type="primary" @click="previewOnline(file.fileUrl, file.fileType)"
                 >预览</el-button
               >
-              <!-- <el-button link type="primary" @click.stop="downloadFile(file.fileUrl, file.fileName)"
+              <el-button link type="primary" @click.stop="downloadFile(file.fileUrl, file.fileName)"
                 >下载</el-button
-              > -->
+              >
             </div>
           </div>
         </div>
@@ -93,6 +93,7 @@
   import type { FileItem } from '@/components/UploadFiles/types';
   import { formatAttachmentList } from '@/components/UploadFiles/utils';
   import PreviewOnline from '@/views/disaster/components/PreviewOnline.vue';
+  import { downloadFile } from '@/views/disaster/utils';
 
   const previewOnlineRef = ref<InstanceType<typeof PreviewOnline>>();
 
@@ -149,6 +150,7 @@
 
   // 文件上传
   const handleUploadSuccess = (files: FileItem[]) => {
+    debugger
     ruleFormData.fileUrlList = files;
     ruleFormData.fileUrl = JSON.stringify(files) || '';
   };