Bladeren bron

Merge branch 'feat/production-safety' of http://192.168.6.110/product-group-fe/sfy-safety-group/sfy-safety into feat/production-safety

sunqijun 2 maanden geleden
bovenliggende
commit
a7dc816585

+ 9 - 1
src/views/production-safety/hiddenTroubleInvestigationAndGovernance/hiddenTroubleAccountManagement/components/hiddenTroubleAccountManagementDetail.vue

@@ -423,13 +423,21 @@
     const ok = await handleValidate();
     if (!ok) return;
     try {
+
+      let rectificationDeadline = ruleFormData.rectificationDeadline;
+      if (rectificationDeadline) {
+        if (rectificationDeadline.includes('T') || rectificationDeadline.includes(' ')) {
+          rectificationDeadline = rectificationDeadline.split('T')[0].split(' ')[0];
+        }
+      }
+
       const payload: SaveHiddenDangerRequest = {
         dangerProblem: ruleFormData.dangerProblem,
         typeId: ruleFormData.typeId!,
         reasonId: ruleFormData.reasonId!,
         taskSource: ruleFormData.taskSource,
         rectificationRequirement: ruleFormData.rectificationRequirement,
-        rectificationDeadline: ruleFormData.rectificationDeadline,
+        rectificationDeadline: rectificationDeadline,
         rectificationDepartmentIds: ruleFormData.rectificationDepartmentIds,
         rectificationResponsiblePerson: ruleFormData.rectificationResponsiblePerson,
         reviewDepartmentId: ruleFormData.reviewDepartmentId!,

+ 2 - 1
src/views/production-safety/productionSafetySystem/collegeFileManagement/collegeFileManagement.vue

@@ -232,7 +232,8 @@
   // 批量导入
   const batchImportVisible = ref(false);
   const { urlPrefix } = useGlobSetting();
-  const importApiUrl = ref(urlJoin(urlPrefix, '/productionSafety/academyFile/import'));
+  // /productionSafety/academyFile/import
+  const importApiUrl = ref(urlJoin(urlPrefix, '/admin/prod/academyFile/importAcademyFile'));
   const templateUrl = ref('./skyeye-file-upload/sfysecurity/TEMPLATE/import-academy-file-template.xlsx');
 
   const handleImport = () => {

+ 59 - 33
src/views/production-safety/productionSafetySystem/collegeFileManagement/components/collegeFileManagementDetail.vue

@@ -14,16 +14,30 @@
       </template>
       <template #fileUrl>
         <UploadFiles
+          v-if="!isViewMode"
           label="上传文件"
           :maxCount="1"
           :file-list="ruleFormData.fileUrlList"
           :disabled="isViewMode"
           :allow-all-file-types="true"
-          @uploadSuccess="handleUploadSuccess"
+          @uploadSuccess="(list: FileItem[]) => handleUploadSuccess(list)"
         />
+        <div class="file-list" v-else>
+          <div class="file-item" v-for="file in ruleFormData.fileUrlList" :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>
       </template>
       <template #content>
-        <div class="editor-container">
+        <div class="editor-container" v-if="!isViewMode">
           <Toolbar 
             style="border-bottom: 1px solid #dcdfe6" 
             :editor="editorRef" 
@@ -37,6 +51,7 @@
             @on-change="handleEditorChange"
           />
         </div>
+        <div v-html="ruleFormData.content" v-else></div>
       </template>
       <template #status>
         <el-radio-group v-model="ruleFormData.status" :disabled="isViewMode">
@@ -45,6 +60,7 @@
         </el-radio-group>
       </template>
     </BasicForm>
+    <PreviewOnline ref="previewOnlineRef" />
   </main>
   <footer class="safety-platform-container__footer">
     <el-button @click="router.back()">返回</el-button>
@@ -72,6 +88,7 @@
   } from '@/api/production-safety-system';
   import type { FileItem } from '@/components/UploadFiles/types';
   import { formatAttachmentList } from '@/components/UploadFiles/utils';
+  import PreviewOnline from '@/views/disaster/components/PreviewOnline.vue';
 
   const router = useRouter();
   const route = useRoute();
@@ -83,6 +100,8 @@
   const isEditMode = computed(() => operate.value === 'college-file-edit');
   const isViewMode = computed(() => operate.value === 'college-file-view');
 
+  const previewOnlineRef = ref<InstanceType<typeof PreviewOnline>>();
+
   const { ruleFormData, formRules, ruleFormConfig, cloneRuleFormData, beforeRouteLeave } =
     useFormConfigHook(ACADEMY_FILE_FORM_CONFIG, ACADEMY_FILE_FORM_DATA, ACADEMY_FILE_FORM_RULES);
 
@@ -124,6 +143,7 @@
   // 文件上传
   const handleUploadSuccess = (files: FileItem[]) => {
     ruleFormData.fileUrlList = files;
+    ruleFormData.fileUrl = JSON.stringify(files) || '';
   };
 
   // 将逗号分隔的URL字符串转换为FileItem数组
@@ -182,9 +202,7 @@
         ruleFormData.fileUrl = res.fileUrl || '';
         ruleFormData.content = res.content || '';
         ruleFormData.status = res.status ?? 1;
-        
-        // 如果有文件URL,转换为FileItem格式
-        ruleFormData.fileUrlList = convertFileUrlToFileItems(res.fileUrl || '');
+        ruleFormData.fileUrlList = JSON.parse(res.fileUrl || '[]');
       }
       cloneRuleFormData();
     } catch (e) {
@@ -205,35 +223,37 @@
     
     try {
       // 处理文件上传:先上传文件获取 URL,然后提取 fileUrl
-      let fileUrl = '';
-      if (ruleFormData.fileUrlList && ruleFormData.fileUrlList.length > 0) {
-        // 分离已有URL的文件和新上传的文件
-        const existingFiles: string[] = [];
-        const newFiles: FileItem[] = [];
+      // let fileUrl = '';
+      // if (ruleFormData.fileUrlList && ruleFormData.fileUrlList.length > 0) {
+      //   // 分离已有URL的文件和新上传的文件
+      //   const existingFiles: string[] = [];
+      //   const newFiles: FileItem[] = [];
         
-        ruleFormData.fileUrlList.forEach((file: FileItem) => {
-          // 如果文件已经有 fileUrl 且没有 file 对象,说明是已有文件
-          if (file.fileUrl && !file.file) {
-            existingFiles.push(file.fileUrl);
-          } else {
-            // 否则是需要上传的新文件
-            newFiles.push(file);
-          }
-        });
+      //   ruleFormData.fileUrlList.forEach((file: FileItem) => {
+      //     // 如果文件已经有 fileUrl 且没有 file 对象,说明是已有文件
+      //     if (file.fileUrl && !file.file) {
+      //       existingFiles.push(file.fileUrl);
+      //     } else {
+      //       // 否则是需要上传的新文件
+      //       newFiles.push(file);
+      //     }
+      //   });
 
-        // 上传新文件
-        let uploadedUrls: string[] = [];
-        if (newFiles.length > 0) {
-          const uploadedFiles = await formatAttachmentList(newFiles);
-          uploadedUrls = uploadedFiles
-            .map((file: any) => file.fileUrl || file.url || '')
-            .filter((url: string) => url);
-        }
+      //   // 上传新文件
+      //   let uploadedUrls: string[] = [];
+      //   if (newFiles.length > 0) {
+      //     const uploadedFiles = await formatAttachmentList(newFiles);
+      //     uploadedUrls = uploadedFiles
+      //       .map((file: any) => file.fileUrl || file.url || '')
+      //       .filter((url: string) => url);
+      //   }
 
-        // 合并已有URL和新上传的URL,取第一个作为fileUrl
-        const allUrls = [...existingFiles, ...uploadedUrls].filter((url: string) => url);
-        fileUrl = allUrls.length > 0 ? allUrls[0] : '';
-      }
+      //   // 合并已有URL和新上传的URL,取第一个作为fileUrl
+      //   const allUrls = [...existingFiles, ...uploadedUrls].filter((url: string) => url);
+      //   fileUrl = allUrls.length > 0 ? allUrls[0] : '';
+      // }
+
+      const uploadedFileList = await formatAttachmentList(ruleFormData.fileUrlList);
 
       const basePayload: ProductionSafetyFile = {
         fileName: ruleFormData.fileName,
@@ -242,7 +262,7 @@
         fileVersion: ruleFormData.fileVersion,
         fileFormat: ruleFormData.fileFormat,
         releaseDate: ruleFormData.releaseDate,
-        fileUrl: fileUrl || undefined,
+        fileUrl: JSON.stringify(uploadedFileList) || undefined,
         content: ruleFormData.content || undefined,
         status: ruleFormData.status ?? 1,
       };
@@ -257,7 +277,7 @@
         });
         ElMessage.success('保存成功');
       }
-
+      cloneRuleFormData();
       router.back();
     } catch (e) {
       console.error('保存院级文件失败:', e);
@@ -265,6 +285,12 @@
     }
   };
 
+  const previewOnline = (url: string | undefined, type) => {
+    if (url) {
+      previewOnlineRef.value?.open(url, type);
+    }
+  };
+
   onMounted(() => {
     cloneRuleFormData();
     beforeRouteLeave();

+ 1 - 0
src/views/production-safety/productionSafetySystem/collegeFileManagement/configs/form.ts

@@ -89,4 +89,5 @@ export const ACADEMY_FILE_FORM_RULES = {
   fileVersion: [{ required: true, message: '请输入文件版本号', trigger: 'blur' }],
   fileFormat: [{ required: true, message: '请选择文件格式', trigger: 'change' }],
   releaseDate: [{ required: true, message: '请选择发布日期', trigger: 'change' }],
+  fileUrl: [{ required: true, message: '请上传文件', trigger: 'change' }],
 };

+ 49 - 5
src/views/production-safety/productionSafetySystem/lawManagement/components/lawManagementDetail.vue

@@ -14,16 +14,30 @@
       </template>
       <template #fileUrl>
         <UploadFiles
+          v-if="!isViewMode"
           label="上传文件"
           :maxCount="1"
           :file-list="ruleFormData.fileUrlList"
-          :disabled="isViewMode"
           :allow-all-file-types="true"
-          @uploadSuccess="(list: FileItem[]) => handleUploadSuccess(list)" 
+          @uploadSuccess="(list: FileItem[]) => handleUploadSuccess(list)"
+          @preview="handlePreview"
         />
+        <div class="file-list" v-else>
+          <div class="file-item" v-for="file in ruleFormData.fileUrlList" :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>
       </template>
       <template #content>
-        <div class="editor-container">
+        <div class="editor-container" v-if="!isViewMode">
           <Toolbar 
             style="border-bottom: 1px solid #dcdfe6" 
             :editor="editorRef" 
@@ -37,6 +51,7 @@
             @on-change="handleEditorChange"
           />
         </div>
+        <div v-html="ruleFormData.content" v-else></div>
       </template>
       <template #status>
         <el-radio-group v-model="ruleFormData.status" :disabled="isViewMode">
@@ -45,6 +60,7 @@
         </el-radio-group>
       </template>
     </BasicForm>
+    <PreviewOnline ref="previewOnlineRef" />
   </main>
   <footer class="safety-platform-container__footer">
     <el-button @click="router.back()">返回</el-button>
@@ -72,10 +88,13 @@
   } from '@/api/production-safety-system';
   import type { FileItem } from '@/components/UploadFiles/types';
   import { formatAttachmentList } from '@/components/UploadFiles/utils';
+  import PreviewOnline from '@/views/disaster/components/PreviewOnline.vue';
 
   const router = useRouter();
   const route = useRoute();
 
+  const previewOnlineRef = ref<InstanceType<typeof PreviewOnline>>();
+
   const operate = computed(() => (route.query.operate as string) || 'law-regulation-create');
   const currentId = computed(() => Number(route.query.id));
 
@@ -234,8 +253,11 @@
       //   // 合并已有URL和新上传的URL,取第一个作为fileUrl
       //   const allUrls = [...existingFiles, ...uploadedUrls].filter((url: string) => url);
       //   fileUrl = allUrls.length > 0 ? allUrls[0] : '';
+      //   debugger
       // }
 
+      const uploadedFileList = await formatAttachmentList(ruleFormData.fileUrlList);
+
       const basePayload: ProductionSafetyFile = {
         fileName: ruleFormData.fileName,
         classifyName: ruleFormData.classifyName,
@@ -243,7 +265,7 @@
         fileVersion: ruleFormData.fileVersion,
         fileFormat: ruleFormData.fileFormat,
         releaseDate: ruleFormData.releaseDate,
-        fileUrl: JSON.stringify(ruleFormData.fileUrlList) || undefined,
+        fileUrl: JSON.stringify(uploadedFileList) || undefined,
         content: ruleFormData.content || undefined,
         status: ruleFormData.status ?? 1,
       };
@@ -258,7 +280,7 @@
         });
         ElMessage.success('保存成功');
       }
-
+      cloneRuleFormData();
       router.back();
     } catch (e) {
       console.error('保存法律法规失败:', e);
@@ -266,6 +288,28 @@
     }
   };
 
+  const handlePreview = (url: string) => {
+    if (url) {
+      // 根据文件扩展名判断文件类型
+      const extension = url.split('.').pop()?.toLowerCase() || '';
+      let fileType: 'pdf' | 'word' | 'excel' | 'ppt' = 'pdf';
+      if (extension === 'doc' || extension === 'docx') {
+        fileType = 'word';
+      } else if (extension === 'xls' || extension === 'xlsx') {
+        fileType = 'excel';
+      } else if (extension === 'ppt' || extension === 'pptx') {
+        fileType = 'ppt';
+      }
+      previewOnlineRef.value?.open(url, fileType);
+    }
+  };
+
+  const previewOnline = (url: string | undefined, type) => {
+    if (url) {
+      previewOnlineRef.value?.open(url, type);
+    }
+  };
+
   onMounted(() => {
     cloneRuleFormData();
     beforeRouteLeave();

+ 1 - 1
src/views/production-safety/productionSafetySystem/lawManagement/lawManagement.vue

@@ -231,7 +231,7 @@
   // 批量导入
   const batchImportVisible = ref(false);
   const { urlPrefix } = useGlobSetting();
-  const importApiUrl = ref(urlJoin(urlPrefix, '/productionSafety/lawRegulation/import'));
+  const importApiUrl = ref(urlJoin(urlPrefix, '/admin/prod/lawRegulation/importLawRegulation'));
   const templateUrl = ref('./skyeye-file-upload/sfysecurity/TEMPLATE/import-law-regulation-template.xlsx');
 
   const handleImport = () => {

+ 59 - 33
src/views/production-safety/productionSafetySystem/safetyTraining/components/safetyTrainingDetail.vue

@@ -14,16 +14,30 @@
       </template>
       <template #fileUrl>
         <UploadFiles
+          v-if="!isViewMode"
           label="上传文件"
           :maxCount="1"
           :file-list="ruleFormData.fileUrlList"
           :disabled="isViewMode"
           :allow-all-file-types="true"
-          @uploadSuccess="handleUploadSuccess"
+          @uploadSuccess="(list: FileItem[]) => handleUploadSuccess(list)"
         />
+        <div class="file-list" v-else>
+          <div class="file-item" v-for="file in ruleFormData.fileUrlList" :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>
       </template>
       <template #content>
-        <div class="editor-container">
+        <div class="editor-container" v-if="!isViewMode">
           <Toolbar 
             style="border-bottom: 1px solid #dcdfe6" 
             :editor="editorRef" 
@@ -37,6 +51,7 @@
             @on-change="handleEditorChange"
           />
         </div>
+        <div v-html="ruleFormData.content" v-else></div>
       </template>
       <template #status>
         <el-radio-group v-model="ruleFormData.status" :disabled="isViewMode">
@@ -45,6 +60,7 @@
         </el-radio-group>
       </template>
     </BasicForm>
+    <PreviewOnline ref="previewOnlineRef" />
   </main>
   <footer class="safety-platform-container__footer">
     <el-button @click="router.back()">返回</el-button>
@@ -76,6 +92,9 @@
   } from '@/api/production-safety-system';
   import type { FileItem } from '@/components/UploadFiles/types';
   import { formatAttachmentList } from '@/components/UploadFiles/utils';
+  import PreviewOnline from '@/views/disaster/components/PreviewOnline.vue';
+
+  const previewOnlineRef = ref<InstanceType<typeof PreviewOnline>>();
 
   const router = useRouter();
   const route = useRoute();
@@ -131,6 +150,7 @@
   // 文件上传
   const handleUploadSuccess = (files: FileItem[]) => {
     ruleFormData.fileUrlList = files;
+    ruleFormData.fileUrl = JSON.stringify(files) || '';
   };
 
   // 将逗号分隔的URL字符串转换为FileItem数组
@@ -189,9 +209,7 @@
         ruleFormData.fileUrl = res.fileUrl || '';
         ruleFormData.content = res.content || '';
         ruleFormData.status = res.status ?? 1;
-
-        // 如果有文件URL,转换为FileItem格式
-        ruleFormData.fileUrlList = convertFileUrlToFileItems(res.fileUrl || '');
+        ruleFormData.fileUrlList = JSON.parse(res.fileUrl || '[]');
       }
       cloneRuleFormData();
     } catch (e) {
@@ -212,35 +230,37 @@
     
     try {
       // 处理文件上传:先上传文件获取 URL,然后提取 fileUrl
-      let fileUrl = '';
-      if (ruleFormData.fileUrlList && ruleFormData.fileUrlList.length > 0) {
-        // 分离已有URL的文件和新上传的文件
-        const existingFiles: string[] = [];
-        const newFiles: FileItem[] = [];
+      // let fileUrl = '';
+      // if (ruleFormData.fileUrlList && ruleFormData.fileUrlList.length > 0) {
+      //   // 分离已有URL的文件和新上传的文件
+      //   const existingFiles: string[] = [];
+      //   const newFiles: FileItem[] = [];
         
-        ruleFormData.fileUrlList.forEach((file: FileItem) => {
-          // 如果文件已经有 fileUrl 且没有 file 对象,说明是已有文件
-          if (file.fileUrl && !file.file) {
-            existingFiles.push(file.fileUrl);
-          } else {
-            // 否则是需要上传的新文件
-            newFiles.push(file);
-          }
-        });
+      //   ruleFormData.fileUrlList.forEach((file: FileItem) => {
+      //     // 如果文件已经有 fileUrl 且没有 file 对象,说明是已有文件
+      //     if (file.fileUrl && !file.file) {
+      //       existingFiles.push(file.fileUrl);
+      //     } else {
+      //       // 否则是需要上传的新文件
+      //       newFiles.push(file);
+      //     }
+      //   });
 
-        // 上传新文件
-        let uploadedUrls: string[] = [];
-        if (newFiles.length > 0) {
-          const uploadedFiles = await formatAttachmentList(newFiles);
-          uploadedUrls = uploadedFiles
-            .map((file: any) => file.fileUrl || file.url || '')
-            .filter((url: string) => url);
-        }
+      //   // 上传新文件
+      //   let uploadedUrls: string[] = [];
+      //   if (newFiles.length > 0) {
+      //     const uploadedFiles = await formatAttachmentList(newFiles);
+      //     uploadedUrls = uploadedFiles
+      //       .map((file: any) => file.fileUrl || file.url || '')
+      //       .filter((url: string) => url);
+      //   }
 
-        // 合并已有URL和新上传的URL,取第一个作为fileUrl
-        const allUrls = [...existingFiles, ...uploadedUrls].filter((url: string) => url);
-        fileUrl = allUrls.length > 0 ? allUrls[0] : '';
-      }
+      //   // 合并已有URL和新上传的URL,取第一个作为fileUrl
+      //   const allUrls = [...existingFiles, ...uploadedUrls].filter((url: string) => url);
+      //   fileUrl = allUrls.length > 0 ? allUrls[0] : '';
+      // }
+
+      const uploadedFileList = await formatAttachmentList(ruleFormData.fileUrlList);
 
       const basePayload: ProductionSafetyFile = {
         fileName: ruleFormData.fileName,
@@ -249,7 +269,7 @@
         fileVersion: ruleFormData.fileVersion,
         fileFormat: ruleFormData.fileFormat,
         releaseDate: ruleFormData.releaseDate,
-        fileUrl: fileUrl || undefined,
+        fileUrl: JSON.stringify(uploadedFileList) || undefined,
         content: ruleFormData.content || undefined,
         status: ruleFormData.status ?? 1,
       };
@@ -264,7 +284,7 @@
         });
         ElMessage.success('保存成功');
       }
-
+      cloneRuleFormData();
       router.back();
     } catch (e) {
       console.error('保存行业标准失败:', e);
@@ -272,6 +292,12 @@
     }
   };
 
+  const previewOnline = (url: string | undefined, type) => {
+    if (url) {
+      previewOnlineRef.value?.open(url, type);
+    }
+  };
+
   onMounted(() => {
     cloneRuleFormData();
     beforeRouteLeave();

+ 1 - 0
src/views/production-safety/productionSafetySystem/safetyTraining/configs/form.ts

@@ -89,4 +89,5 @@ export const INDUSTRY_STANDARD_FORM_RULES = {
   fileVersion: [{ required: true, message: '请输入文件版本号', trigger: 'blur' }],
   fileFormat: [{ required: true, message: '请选择文件格式', trigger: 'change' }],
   releaseDate: [{ required: true, message: '请选择发布日期', trigger: 'change' }],
+  fileUrl: [{ required: true, message: '请选择文件上传', trigger: 'change' }],
 };