Explorar el Código

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

sunqijun hace 1 mes
padre
commit
33f7931a69

+ 18 - 4
src/api/drawLessons/index.ts

@@ -1,5 +1,6 @@
 import { http } from '@/utils/http/axios';
 import type { QueryPageRequest, QueryPageResponse } from '@/types/basic-query';
+import exp from 'constants';
 
 /**
  * 举一反三单条记录(与接口文档 DrawLessonsPageRes 一致)
@@ -80,11 +81,11 @@ export function queryDrawLessonsAdminDeptPage(
 
 /**
  * 2.2 查询举一反三详情
- * GET /api/drawLessons/admin/queryDetail?id=xxx
+ * GET /api/drawLessons/admin/queryMainDetail?id=xxx
  */
 export function getDrawLessonsAdminDetail(id: number) {
   return http.request<DrawLessonsItem>({
-    url: '/drawLessons/admin/queryDetail',
+    url: '/drawLessons/admin/queryMainDetail',
     method: 'get',
     params: { id },
   });
@@ -92,7 +93,7 @@ export function getDrawLessonsAdminDetail(id: number) {
 
 /**
  * 2.2 查询举一反三详情
- * GET /api/drawLessons/admin/queryDetail?id=xxx
+ * GET /api/drawLessons/admin/queryMainDetail?id=xxx
  */
 export function getDrawLessonsAdminDeptDetail(id: number) {
   return http.request<DrawLessonsItem>({
@@ -365,7 +366,7 @@ export function cancellationMessagePost(id: number) {
 
 
 /**
- * 导出举一反三子记录
+ * 导出法律法规
  */
 export function exportTheDocumentPost() {
   return http.request({
@@ -377,3 +378,16 @@ export function exportTheDocumentPost() {
     },
   });
 }
+
+/**
+ * 导出举一反三子记录
+ */
+export function exportDrawLessonsAdminPage() {
+  return http.request({
+    url: '/inventory/exportInventory',
+    method: 'post',
+    responseType: 'blob',
+  }, {
+    isTransformResponse: false,
+  });
+}

+ 11 - 0
src/api/production-safety/responsibility-implementation/index.ts

@@ -972,3 +972,14 @@ export function dangerWorkSaveApproval(params) {
   });   
 }
 
+/**
+ * 导出风险清单
+ * @returns Promise<any> 导出的风险清单数据
+ */
+export function exportRiskList () {
+  return http.request({
+    url: `/safetyRisk/list/exportRiskList`,
+    method: 'post',
+  });
+}
+

+ 2 - 2
src/api/safety-culture/index.ts

@@ -37,8 +37,8 @@ export interface safetyCultureFileQuery {
   keyword?: string; // 文件名称/编号(模糊查询)
   status?: number; // 状态:1-启用,0-禁用
   classifyName?: string; // 分类名称
-  startDate?: string; // 上传日期范围-开始日期
-  endDate?: string; // 上传日期范围-结束日期
+  startTime?: string; // 上传日期范围-开始日期
+  endTime?: string; // 上传日期范围-结束日期
 }
 
 /**

+ 8 - 4
src/views/production-safety/hiddenTroubleInvestigationAndGovernance/oneByOneManagement/oneByOneManagement.vue

@@ -208,6 +208,7 @@
     deleteDrawLessons,
     voidDrawLessons,
     issueDrawLessons,
+    exportDrawLessonsAdminPage,
     type DrawLessonsQueryParam,
   } from '@/api/drawLessons';
   import { getAllDepartments } from '@/api/auth/dept';
@@ -313,12 +314,15 @@
 
   const handleDownload = async () => {
     try {
-      // 后端如有专门导出接口,可在此替换
-      await queryDrawLessonsAdminPage(tableQuery);
-      ElMessage.success('导出逻辑待实现');
+      const response = await exportDrawLessonsAdminPage();
+      if (response) {
+        const fileName = `举一反三_${new Date().toISOString().split('T')[0]}.xlsx`;
+        downloadByData(response, fileName);
+        ElMessage.success('导出成功');
+      }
     } catch (e) {
       console.error('导出举一反三失败:', e);
-      ElMessage.error(e?.message || e?.data || '导出失败,请重试');
+      ElMessage.error('导出失败,请重试');
     }
   };
 

+ 8 - 4
src/views/production-safety/hiddenTroubleInvestigationAndGovernance/oneByOneManagementDept/oneByOneManagementDept.vue

@@ -108,6 +108,7 @@
   import type { QueryPageRequest } from '@/types/basic-query';
   import {
     queryDrawLessonsAdminDeptPage,
+    exportDrawLessonsAdminPage,
     type DrawLessonsQueryParam,
   } from '@/api/drawLessons';
   import { downloadByData } from '@/utils/file/download';
@@ -208,12 +209,15 @@
 
   const handleDownload = async () => {
     try {
-      // 后端如有专门导出接口,可在此替换
-      await queryDrawLessonsAdminDeptPage(tableQuery);
-      ElMessage.success('导出逻辑待实现');
+      const response = await exportDrawLessonsAdminPage();
+      if (response) {
+        const fileName = `举一反三_${new Date().toISOString().split('T')[0]}.xlsx`;
+        downloadByData(response, fileName);
+        ElMessage.success('导出成功');
+      }
     } catch (e) {
       console.error('导出举一反三失败:', e);
-      ElMessage.error(e?.message || e?.data || '导出失败,请重试');
+      ElMessage.error('导出失败,请重试');
     }
   };
 

+ 10 - 5
src/views/production-safety/risk-identification-and-control/labor-products-purchase-apply-manage/components/detail.vue

@@ -102,17 +102,17 @@
                 :on-change="(file) => handleApprovalImageChange(row, file)"
                 :on-exceed="handleApprovalImageExceed"
                 :on-remove="() => handleApprovalImageRemove(row)"
-                :class="{'hide': isViewMode}"
+                :class="{'hide': isViewMode || isAuditMode}"
               >
                 <el-icon><Plus /></el-icon>
                 <template #file="{ file }"> 
                   <div>
                     <img class="el-upload-list__item-thumbnail" :src="file.fileUrl" alt="" />
                     <span class="el-upload-list__item-actions">
-                      <span class="el-upload-list__item-preview" v-if="isViewMode" @click="previewOnline(file.fileUrl)">
+                      <span class="el-upload-list__item-preview" v-if="isViewMode || isAuditMode" @click="previewOnline(file.fileUrl)">
                         <el-icon><ZoomIn /></el-icon>
                       </span>
-                      <span class="el-upload-list__item-delete" v-if="!isViewMode" @click.stop="handleApprovalDeleteClick()">
+                      <span class="el-upload-list__item-delete" v-if="!isViewMode && !isAuditMode" @click.stop="handleApprovalDeleteClick(row)">
                         <el-icon><Delete /></el-icon>
                       </span>
                     </span>
@@ -895,8 +895,13 @@
     form.itemList[approvalUploadKey.value].imageUrl = [];
   };
 
-  const handleApprovalDeleteClick = () => {
-    resetApprovalImageUpload();
+  const handleApprovalDeleteClick = (row: PurchaseApplyItem) => {
+    row.pictureUrl = [];
+    row.stylePhoto = '';
+    const key = row.id || row.$$uid || 'default';
+    if (uploadRefs.value[key]) {
+      uploadRefs.value[key].clearFiles();
+    }
   };
 
   const handleApprovalImageRemove = (row: PurchaseApplyItem) => {

+ 54 - 2
src/views/production-safety/risk-identification-and-control/risk-manage/list.vue

@@ -4,8 +4,14 @@
       <div class="breadcrumb-title"> 风险清单管理 </div>
     </header>
     <main class="safety-platform-container__main">
-        <div style="margin-bottom: 20px;">
-            <el-button type="primary" @click="$router.push({ name: 'riskManageAdd' })">添加 </el-button>
+        <div>
+            <el-button class="search-table-container--button" type="primary" @click="$router.push({ name: 'riskManageAdd' })">添加 </el-button>
+            <el-button plain class="search-table-container--button" @click="handleImport">
+              导入
+            </el-button>
+            <el-button plain class="search-table-container--button" @click="handleDownload">
+              导出
+            </el-button>
         </div>
       <div class="search-form">
         <el-form :inline="true">
@@ -114,6 +120,16 @@
         />
       </div>
     </main>
+    <BatchImport
+      v-if="batchImportVisible"
+      :visible="batchImportVisible"
+      :import-api-url="importApiUrl"
+      :template-url="templateUrl"
+      template-name="下载模板"
+      :show-template="false"
+      @close="batchImportVisible = false"
+      @update="handleUpdate"
+    />
   </div>
 </template>
 <script lang="ts" setup>
@@ -125,6 +141,7 @@
     safetyRiskListQueryPage,
     safetyRiskListDelete,
     safetyRiskListApprove,
+    exportRiskList,
   } from '@/api/production-safety/responsibility-implementation';
   import { omit } from 'lodash-es';
   import { useUserInfoHook } from '@/hooks/useUserInfoHook';
@@ -132,6 +149,10 @@
   import { downloadFile } from '@/views/disaster/utils';
   import { formatDeptTree } from '@/views/disaster/utils/formatDeptTree';
   import { getAllDepartments } from '@/api/auth/dept';
+  import BatchImport from '@/components/batch-import/BatchImport.vue';
+  import { useGlobSetting } from '@/hooks/setting';
+  import urlJoin from 'url-join';
+  import { downloadByData } from '@/utils/file/download';
 
   const router = useRouter();
   const { id } = useUserInfoHook();
@@ -234,6 +255,37 @@
     queryTableList();
   };
 
+  // 批量导入
+  const batchImportVisible = ref(false);
+  const { urlPrefix } = useGlobSetting();
+  // /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 = () => {
+    batchImportVisible.value = true;
+  };
+
+  const handleUpdate = () => {
+    batchImportVisible.value = false;
+    // getTableData();
+  };
+
+  const handleDownload = async () => {
+    try {
+      const response = await exportRiskList();
+      if (response) {
+        const fileName = `风险清单管理_${new Date().toISOString().split('T')[0]}.xlsx`;
+        downloadByData(response, fileName);
+        ElMessage.success('导出成功');
+      }
+    } catch (e) {
+      console.error('导出院级文件失败:', e);
+      ElMessage.error('导出失败,请重试');
+    }
+  };
+
+
   onMounted(async () => {
     await getDeptData();
     queryTableList();

+ 1 - 1
src/views/production-safety/safety-culture/safetyCultureActivityManagement/components/activityRegistrationManagement.vue

@@ -6,7 +6,7 @@
         <div class="evaluation-meta">
           <span>考核部门: {{ activityRegistrationDetail.responsibleDeptName || '-' }}</span>
           <span>创建人: {{ activityRegistrationDetail.createdByName || '-' }}</span>
-          <span>创建时间: {{ formatDateTime(activityRegistrationDetail.startTime) || '-' }}</span>
+          <span>创建时间: {{ formatDateTime(activityRegistrationDetail.createdAt) || '-' }}</span>
         </div>
       </div>
     </header>

+ 1 - 1
src/views/production-safety/safety-culture/safetyCultureActivityManagementExecutor/components/activityRegistrationManagement.vue

@@ -6,7 +6,7 @@
         <div class="evaluation-meta">
           <span>考核部门: {{ activityRegistrationDetail.responsibleDeptName || '-' }}</span>
           <span>创建人: {{ activityRegistrationDetail.createdByName || '-' }}</span>
-          <span>创建时间: {{ formatDateTime(activityRegistrationDetail.startTime) || '-' }}</span>
+          <span>创建时间: {{ formatDateTime(activityRegistrationDetail.createdAt) || '-' }}</span>
         </div>
       </div>
     </header>

+ 1 - 2
src/views/production-safety/safety-culture/safetyCultureMaterialManagement/components/safetyCultureMaterialManagementDetail.vue

@@ -306,8 +306,7 @@
           name: `图片${index + 1}`,
           url,
         }));
-
-        // 如果有文件URL,转换为FileItem格式
+        ruleFormData.fileUrl = JSON.parse(res.attachmentUrl || res.fileUrl || '');
         ruleFormData.attachmentUrl = JSON.parse(res.attachmentUrl || res.fileUrl || '');
       }
       cloneRuleFormData();

+ 1 - 1
src/views/production-safety/safety-culture/safetyPublicityBoardManagement/components/safetyPublicityBoardManagementDetail.vue

@@ -220,7 +220,7 @@
         ruleFormData.materialName = res.materialName || '';
         ruleFormData.categoryName = res.categoryName || '';
         ruleFormData.description = res.description || '';
-       ruleFormData.attachmentUrl = JSON.parse(res.attachmentUrl || res.fileUrl || '');
+        ruleFormData.attachmentUrl = JSON.parse(res.attachmentUrl || res.fileUrl || '');
         ruleFormData.status = res.status ?? 1;
       }
       cloneRuleFormData();

+ 1 - 0
src/views/production-safety/safety-culture/safetyPublicityBoardManagement/configs/form.ts

@@ -47,4 +47,5 @@ export const ACADEMY_FILE_FORM_RULES = {
   materialName: [{ required: true, message: '请输入宣传资料名称', trigger: 'blur' }],
   categoryName: [{ required: true, message: '请选择分类名称', trigger: 'change' }],
   description: [{ required: true, message: '请输入资料描述', trigger: 'blur' }],
+  attachmentUrl: [{ required: true, message: '请上传文档', trigger: 'change' }],
 };

+ 13 - 13
src/views/production-safety/safety-culture/safetyPublicityBoardManagement/safetyPublicityBoardManagement.vue

@@ -113,8 +113,8 @@ const queryParams = reactive<safetyCultureFileQuery>({
   keyword: '', // 文件名称/编号(模糊查询)
   status: undefined, // 状态:1-启用,0-禁用
   classifyName: '', // 分类名称:外部院级文件/内部院级文件
-  startDate: '', // 上传日期范围-开始日期
-  endDate: '', // 上传日期范围-结束日期
+  startTime: '', // 上传日期范围-开始日期
+  endTime: '', // 上传日期范围-结束日期
 });
 
 // 上传日期范围(用于日期选择器)
@@ -141,8 +141,8 @@ async function getTableData() {
         keyword: queryParams.keyword || undefined,
         status: queryParams.status,
         classifyName: queryParams.classifyName || undefined,
-        startDate: queryParams.startDate || undefined,
-        endDate: queryParams.endDate || undefined,
+        startTime: queryParams.startTime || undefined,
+        endTime: queryParams.endTime || undefined,
       },
     };
     const res = await querySafetyPublicityBoardPage(pageQuery);
@@ -153,7 +153,7 @@ async function getTableData() {
         status: item.status,
         categoryName: item.categoryName || item.classifyName,
         fileCode: item.description || '-',
-        fileVersion: item.uploadTime || item.createdAt || item.updatedAt || '-',
+        fileVersion: item.createdAt,
         attachmentUrl: item.attachmentUrl,
         fileUrl: item.fileUrl,
       }));
@@ -171,11 +171,11 @@ async function getTableData() {
 const handleSearch = () => {
   // 处理日期范围
   if (uploadDateRange.value && uploadDateRange.value.length === 2) {
-    queryParams.startDate = uploadDateRange.value[0];
-    queryParams.endDate = uploadDateRange.value[1];
+    queryParams.startTime = uploadDateRange.value[0];
+    queryParams.endTime = uploadDateRange.value[1];
   } else {
-    queryParams.startDate = '';
-    queryParams.endDate = '';
+    queryParams.startTime = '';
+    queryParams.endTime = '';
   }
 
   pagination.pageNumber = 1;
@@ -186,8 +186,8 @@ const handleReset = () => {
   queryParams.keyword = '';
   queryParams.status = undefined;
   queryParams.classifyName = '';
-  queryParams.startDate = '';
-  queryParams.endDate = '';
+  queryParams.startTime = '';
+  queryParams.endTime = '';
   uploadDateRange.value = null;
   handleSearch();
 };
@@ -213,8 +213,8 @@ const handleDownload = async () => {
       keyword: queryParams.keyword || undefined,
       status: queryParams.status,
       classifyName: queryParams.classifyName || undefined,
-      startDate: queryParams.startDate || undefined,
-      endDate: queryParams.endDate || undefined,
+      startTime: queryParams.startTime || undefined,
+      endTime: queryParams.endTime || undefined,
     };
     // const response = await exportSafetyCultureMaterials(exportParams, queryParams.classifyName || undefined);
     // if (response) {