Selaa lähdekoodia

fix: 修改已知问题,替换相关字段接口

xiaweibo 2 kuukautta sitten
vanhempi
commit
04ee3b9f59

+ 1 - 0
src/api/production-safety/special-equipment.ts

@@ -54,6 +54,7 @@ export interface SpecialEquipment {
     url: string;
   }[]; // 附件列表
   [key: string]: any;
+  useDepartmentPath?: any; // 使用部门路径(部门ID列表)
 }
 
 /** 分页查询特种设备设施列表 */

+ 16 - 1
src/api/safety-culture/index.ts

@@ -54,7 +54,7 @@ export interface safetyCultureFilePageQuery {
  * 导出参数
  */
 export interface safetyCultureFileExportQuery extends safetyCultureFileQuery { }
-
+export interface ProductionSafetyFileExportQuery extends safetyCultureFileExportQuery { }
 
 /**
  * 新增事故案例参数
@@ -453,3 +453,18 @@ export function deleteSafetyPublicityBoardPage(id: number) {
     },
   });
 }
+
+/**
+ * 导出事故案例管理文件
+ */
+export function exportAccidentCaseManagementFile(params?: ProductionSafetyFileExportQuery, classifyName?: string) {
+  return http.request({
+    url: '/accidentCase/export',
+    method: 'post',
+    data: params,
+    params: classifyName ? { classifyName } : undefined,
+    responseType: 'blob',
+  }, {
+    isTransformResponse: false,
+  });
+}

+ 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, '/admin/prod/lawRegulation/importLawRegulation'));
+  const importApiUrl = ref(urlJoin(urlPrefix, '/productionSafety/lawRegulation/import'));
   const templateUrl = ref('./skyeye-file-upload/sfysecurity/TEMPLATE/import-law-regulation-template.xlsx');
 
   const handleImport = () => {

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

@@ -6,10 +6,10 @@
     <main class="safety-platform-container__main">
       <div class="search-form">
         <el-form :inline="true">
-          <el-form-item label="标题">
+          <el-form-item label="物品名称">
             <el-input
               v-model="queryParams.queryParam.name"
-              placeholder="请输入标题"
+              placeholder="请输入物品名称"
               clearable
               style="width: 170px"
             />

+ 14 - 14
src/views/production-safety/risk-identification-and-control/special-equipment-manage/configs/form.ts

@@ -190,16 +190,16 @@ export const SPECIAL_EQUIPMENT_FORM_CONFIG: FormConfig[] = [
     label: '设备状态:',
     slot: 'deviceStatus',
   },
-  {
-    prop: 'nextInspectionDate',
-    label: '下次检测时间:',
-    component: 'ElDatePicker',
-    componentProps: {
-      type: 'date',
-      valueFormat: 'YYYY-MM-DD',
-      placeholder: '请选择下次检测时间',
-    },
-  },
+  // {
+  //   prop: 'nextInspectionDate',
+  //   label: '下次检测时间:',
+  //   component: 'ElDatePicker',
+  //   componentProps: {
+  //     type: 'date',
+  //     valueFormat: 'YYYY-MM-DD',
+  //     placeholder: '请选择下次检测时间',
+  //   },
+  // },
 ];
 
 export const SPECIAL_EQUIPMENT_FORM_DATA = {
@@ -236,20 +236,20 @@ export const SPECIAL_EQUIPMENT_FORM_RULES = {
   typeId: [{ required: true, message: '请选择设备种类', trigger: 'change' }],
   registerCode: [{ required: true, message: '注册代码不能为空', trigger: 'blur' }],
   licenseNo: [{ required: true, message: '使用证号不能为空', trigger: 'blur' }],
-  deviceCode: [{ required: true, message: '设备编码不能为空', trigger: 'blur' }],
+  // deviceCode: [{ required: true, message: '设备编码不能为空', trigger: 'blur' }],
   safeLocation: [{ required: true, message: '安全地点不能为空', trigger: 'blur' }],
   useDepartment: [{ required: true, message: '请选择使用部门', trigger: 'change' }],
   responsibilityDeptId: [{ required: true, message: '请选择责任部门', trigger: 'change' }],
   responsiblePerson: [{ required: true, message: '责任人不能为空', trigger: 'blur' }],
   jobNo: [{ required: true, message: '工号不能为空', trigger: 'blur' }],
-  factoryNo: [{ required: true, message: '出厂编号不能为空', trigger: 'blur' }],
-  productionDate: [{ required: true, message: '请选择生产日期', trigger: 'change' }],
+  // factoryNo: [{ required: true, message: '出厂编号不能为空', trigger: 'blur' }],
+  // productionDate: [{ required: true, message: '请选择生产日期', trigger: 'change' }],
   startUseDate: [{ required: true, message: '请选择启用日期', trigger: 'change' }],
   inspectionCycle: [{ required: true, message: '检测周期不能为空', trigger: 'blur' }],
   useYears: [{ required: true, message: '使用年限不能为空', trigger: 'blur' }],
   inspectionTime: [{ required: true, message: '请选择检测时间', trigger: 'change' }],
   deviceStatus: [{ required: true, message: '请选择设备状态', trigger: 'change' }],
-  nextInspectionDate: [{ required: true, message: '请选择下次检测时间', trigger: 'change' }],
+  // nextInspectionDate: [{ required: true, message: '请选择下次检测时间', trigger: 'change' }],
 };
 
 

+ 4 - 3
src/views/production-safety/risk-identification-and-control/special-equipment-manage/edit.vue

@@ -161,8 +161,8 @@
   const handleDeptChange = (val: number[]) => {
     if (Array.isArray(val) && val.length) {
       (formData as any).responsibilityDeptId = val[val.length - 1];
-      (formData as any).useDepartment = getDeptNameByPath(deptOptions.value, val);
-      useDepartmentPath.value = [...val];
+      // (formData as any).useDepartment = getDeptNameByPath(deptOptions.value, val);
+      // useDepartmentPath.value = [...val];
     } else {
       (formData as any).responsibilityDeptId = undefined;
     }
@@ -193,7 +193,7 @@
         (formData as any).typeId = res.typeId;
         (formData as any).registerCode = res.registerCode ?? '';
         (formData as any).deviceCode = res.deviceCode ?? '';
-        (formData as any).useDepartment = res.useDepartment ?? '';
+        (formData as any).useDepartment = res.isUseDepartment ?? '';
         (formData as any).responsiblePerson = res.responsiblePerson ?? '';
         (formData as any).factoryNo = res.factoryNo ?? '';
         formData.startUseDate = res.startUseDate ?? '';
@@ -209,6 +209,7 @@
         formData.deviceStatus = res.deviceStatus ?? 1;
         formData.nextInspectionDate = res.nextInspectionDate ?? '';
         formData.remark = res.remark ?? '';
+        useDepartmentPath.value = res.isUseDepartment ?? [];
       }
     } catch (e) {
       console.error('获取特种设备设施详情失败:', e);

+ 11 - 10
src/views/production-safety/safety-culture/accidentCaseManagement/accidentCaseManagement.vue

@@ -10,12 +10,12 @@
             <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 plain class="search-table-container--button" @click="handleImport">
               导入
             </el-button>
             <el-button plain class="search-table-container--button" @click="handleDownload">
               导出
-            </el-button> -->
+            </el-button>
           </div>
 
           <div class="act-search">
@@ -28,7 +28,7 @@
                 <span>状态:</span>
                 <el-select v-model="queryParams.status" placeholder="请选择状态" clearable>
                   <el-option label="启用" :value="1" />
-                  <el-option label="禁用" :value="0" />
+                  <el-option label="禁用" :value="2" />
                 </el-select>
               </div>
               <div class="select-box--item">
@@ -56,7 +56,7 @@
             @update:pageSize="handleSizeChange" @update:pageNumber="handleCurrentChange">
             <template #status="scope">
               <span>
-                {{ scope.row.status === 1 ? '启用' : scope.row.status === 0 ? '禁用' : '-' }}
+                {{ scope.row.status === 1 ? '启用' : scope.row.status === 2 ? '禁用' : '-' }}
               </span>
             </template>
             <template #action="scope">
@@ -90,6 +90,7 @@ import { useRouter } from 'vue-router';
 import {
   accidentCaseManagementFilePage,
   deleteAccidentCase,
+  exportAccidentCaseManagementFile,
   type safetyCultureFileQuery,
   type safetyCultureFilePageQuery,
 } from '@/api/safety-culture';
@@ -208,12 +209,12 @@ const handleDownload = async () => {
       startDate: queryParams.startDate || undefined,
       endDate: queryParams.endDate || undefined,
     };
-    // const response = await exportAcademyFile(exportParams, queryParams.classifyName || undefined);
-    // if (response) {
-    //   const fileName = `院级文件管理_${new Date().toISOString().split('T')[0]}.xlsx`;
-    //   downloadByData(response, fileName);
-    //   ElMessage.success('导出成功');
-    // }
+    const response = await exportAccidentCaseManagementFile(exportParams, queryParams.classifyName || undefined);
+    if (response) {
+      const fileName = `事故案例管理_${new Date().toISOString().split('T')[0]}.xlsx`;
+      downloadByData(response, fileName);
+      ElMessage.success('导出成功');
+    }
   } catch (e) {
     console.error('导出院级文件失败:', e);
     ElMessage.error('导出失败,请重试');

+ 93 - 6
src/views/production-safety/safety-culture/accidentCaseManagement/components/accidentCaseManagementDetail.vue

@@ -28,6 +28,36 @@
             </div>
           </div>
       </template>
+      <template #imageFileUrl>
+        <el-upload
+          :key="approvalUploadKey"
+          ref="approvalUploadRef"
+          v-model:file-list="approvalImageFileList"
+          :auto-upload="false"
+          list-type="picture-card"
+          :limit="1"
+          :disabled="isViewMode"
+          :on-change="handleApprovalImageChange"
+          :on-exceed="handleApprovalImageExceed"
+          :on-preview="handleApprovalPictureCardPreview"
+          :on-remove="handleApprovalImageRemove"
+        >
+          <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" v-if="!isViewMode">
+                <span class="el-upload-list__item-preview" @click="handleApprovalPictureCardPreview(file)">
+                  <el-icon><ZoomIn /></el-icon>
+                </span>
+                <span class="el-upload-list__item-delete" @click.stop="handleApprovalDeleteClick()">
+                  <el-icon><Delete /></el-icon>
+                </span>
+              </span>
+            </div>
+          </template>
+        </el-upload>
+      </template>
       <template #content>
         <div class="editor-container">
           <Toolbar style="border-bottom: 1px solid #dcdfe6" :editor="editorRef" />
@@ -38,7 +68,7 @@
       <template #status>
         <el-radio-group v-model="ruleFormData.status" :disabled="isViewMode"> 
           <el-radio :value="1">启用</el-radio>
-          <el-radio :value="0">禁用</el-radio>
+          <el-radio :value="2">禁用</el-radio>
         </el-radio-group>
       </template>
     </BasicForm>
@@ -55,7 +85,7 @@
 <script setup lang="ts">
 import { computed, onMounted, ref, shallowRef, onBeforeUnmount } from 'vue';
 import { useRoute, useRouter } from 'vue-router';
-import { ElMessage } from 'element-plus';
+import { ElMessage , ElIcon, genFileId, type UploadProps, type UploadUserFile, type UploadRawFile, type UploadInstance } from 'element-plus';
 import BasicForm from '@/components/BasicForm.vue';
 import UploadFiles from '@/components/UploadFiles/UploadFiles.vue';
 import { Editor, Toolbar } from '@wangeditor/editor-for-vue';
@@ -71,17 +101,17 @@ import {
 import type { FileItem } from '@/components/UploadFiles/types';
 import { formatAttachmentList } from '@/components/UploadFiles/utils';
 import PreviewOnline from '@/views/disaster/components/PreviewOnline.vue';
-
+import { uploadFileApi, UPLOAD_BIZ_TYPE } from '@/api/minio';
 const router = useRouter();
 const route = useRoute();
-
+const approvalUploadKey = ref(0);
 const operate = computed(() => (route.query.operate as string) || 'safety-culture-material-create');
 const currentId = computed(() => Number(route.query.id));
-
+const approvalImageFileList = ref<UploadUserFile[]>([]);
 const isCreateMode = computed(() => operate.value === 'safety-culture-material-create');
 const isEditMode = computed(() => operate.value === 'safety-culture-material-edit');
 const isViewMode = computed(() => operate.value === 'safety-culture-material-view');
-
+const approvalUploadRef = ref<UploadInstance>();
 const previewOnlineRef = ref<InstanceType<typeof PreviewOnline>>();
 
 const { ruleFormData, formRules, ruleFormConfig, cloneRuleFormData, beforeRouteLeave } =
@@ -180,6 +210,8 @@ const getDetail = async () => {
       ruleFormData.status = res.status ?? 1;
       ruleFormData.description = res.description || '';
       ruleFormData.attachmentUrl = JSON.parse(res.attachmentUrl || res.fileUrl || '');
+      approvalImageFileList.value = JSON.parse(res.imageUrl || '[]');
+      ruleFormData.imageUrl = res.imageUrl || '';
     }
     cloneRuleFormData();
   } catch (e) {
@@ -208,6 +240,7 @@ const handleSubmit = async () => {
       description: ruleFormData.description,
       attachmentUrl:JSON.stringify(uploadedFileList),
       status: ruleFormData.status,
+      imageUrl: JSON.stringify(approvalImageFileList.value),
     };
     if (isCreateMode.value) {
       await saveAccidentCase(basePayload);
@@ -233,6 +266,60 @@ const previewOnline = (url: string | undefined, type) => {
   }
 };
 
+const handleApprovalImageChange = (uploadFile: UploadUserFile) => {
+  if (!uploadFile.raw) return;
+
+  uploadFileApi({
+    file: uploadFile.raw,
+    bizType: UPLOAD_BIZ_TYPE['DICTIONARY'],
+    fileName: uploadFile.raw.name,
+  })
+    .then((res) => {
+      ruleFormData.imageUrl = [res.url];
+      approvalImageFileList.value = [
+        {
+          fileName: uploadFile.name || res.url.split('/').pop() || 'image',
+          fileUrl: res.url,
+          fileId: res.uid
+        },
+      ];
+    })
+    .catch(() => {
+      ElMessage.error('图片上传失败,请重试');
+    });
+};
+
+
+const handleApprovalImageExceed: UploadProps['onExceed'] = (files) => {
+  const uploadInstance = approvalUploadRef.value;
+  if (!uploadInstance) return;
+
+  uploadInstance.clearFiles();
+  const file = files[0] as UploadRawFile;
+  file.uid = genFileId();
+  uploadInstance.handleStart(file);
+};
+
+const handleApprovalPictureCardPreview: UploadProps['onPreview'] = (uploadFile) => {
+  // dialogImageUrl.value = uploadFile.url || '';
+  // dialogVisible.value = true;
+};
+
+const resetApprovalImageUpload = () => {
+  approvalUploadRef.value?.clearFiles();
+  ruleFormData.imageUrl = [];
+  approvalImageFileList.value = [];
+  approvalUploadKey.value += 1;
+};
+
+const handleApprovalDeleteClick = () => {
+  resetApprovalImageUpload();
+};
+
+const handleApprovalImageRemove: UploadProps['onRemove'] = () => {
+  resetApprovalImageUpload();
+};
+
 onMounted(() => {
   cloneRuleFormData();
   // beforeRouteLeave();

+ 7 - 0
src/views/production-safety/safety-culture/accidentCaseManagement/configs/form.ts

@@ -37,6 +37,11 @@ export const ACADEMY_FILE_FORM_CONFIG: FormConfig[] = [
     label: '状态:',
     slot: 'status',
   },
+  {
+    prop: 'imageUrl',
+    label: '图片上传:',
+    slot: 'imageFileUrl',
+  },
 ];
 
 export const ACADEMY_FILE_FORM_DATA = {
@@ -45,6 +50,7 @@ export const ACADEMY_FILE_FORM_DATA = {
   attachmentUrl: [] as FileItem[],
   description: '',
   status: 1,
+  imageUrl: [] as FileItem[],
 };
 
 export const ACADEMY_FILE_FORM_RULES = {
@@ -53,4 +59,5 @@ export const ACADEMY_FILE_FORM_RULES = {
   // attachmentUrl: [{ required: true, message: '请选择文档上传', trigger: 'change' }],
   description: [{ required: true, message: '请输入案例描述', trigger: 'blur' }],
   status: [{ required: true, message: '请选择状态', trigger: 'change' }],
+  imageUrl: [{ required: true, message: '请选择图片上传', trigger: 'change' }],
 };

+ 7 - 7
src/views/production-safety/safety-culture/accidentCaseManagement/configs/tables.ts

@@ -34,13 +34,13 @@ export const INVENTORY_TABLE_COLUMNS: TableColumnProps[] = [
     align: 'left',
     minWidth: '120px',
   },
-  {
-    label: '案例描述',
-    prop: 'description',
-    align: 'left',
-    minWidth: '120px',
-    showOverflowTooltip: true,
-  },
+  // {
+  //   label: '案例描述',
+  //   prop: 'description',
+  //   align: 'left',
+  //   minWidth: '120px',
+  //   showOverflowTooltip: true,
+  // },
   {
     label: '上传时间',
     prop: 'createdAt',