Преглед изворни кода

fix: 更新安全责任书签署和反馈管理界面,优化表单字段和交互逻辑

sunqijun пре 2 месеци
родитељ
комит
1722625779

+ 13 - 13
src/views/production-safety/implement-safety-duty/responsibility-agree-manage-dept.vue

@@ -123,23 +123,15 @@
                 >
                   确认
                 </el-button>
-                <el-dropdown trigger="click">
-                  <el-button
+                <el-button
                     v-if="scope.row.status === 3"
                     type="primary"
                     link
-                    @click="
-                      $router.push({
-                        name: 'responsibilityFeedback',
-                        query: {
-                          id: scope.row.id,
-                          status: scope.row.status,
-                        },
-                      })
-                    "
+                    @click="feedback(scope)"
                   >
                     反馈
                   </el-button>
+                <!-- <el-dropdown trigger="click"> -->
                   <!-- <template #dropdown>
                     <el-dropdown-menu>
                       <el-dropdown-item
@@ -168,7 +160,7 @@
                       >
                     </el-dropdown-menu>
                   </template> -->
-                </el-dropdown>
+                <!-- </el-dropdown> -->
                 <el-button type="primary" link @click="handleDownloadLink(scope)">下载</el-button>
               </div>
             </template>
@@ -273,7 +265,15 @@
   //       (item: any) => item.departmentName === '所/中心级部门' || item.departmentName === '科室',
   //     ),
   // );
-
+  const feedback = (scope) => {
+    router.push({
+      name: 'responsibilityFeedback',
+      query: {
+        id: scope.row.id,
+        status: scope.row.status,
+      },
+    });
+  };
   const attachment = ref<any[]>([]);
   const userOptions = ref<any[]>([]);
   const selectable = (row) => {

+ 2 - 5
src/views/production-safety/implement-safety-duty/responsibility-agree-manage.vue

@@ -241,9 +241,8 @@
       case '科室':
         return 'D';
       case '员工':
-        return 'E';
       case '常驻供应商':
-        return 'F';
+        return 'E';
       default:
         return 'default';
     }
@@ -257,10 +256,8 @@
         return filterDeptsByLevel(deptsOptions.value, 2);
       case 'D': // 科室
         return filterDeptsByLevel(deptsOptions.value, 3);
-      case 'E': // 员工
+      case 'E': // 员工、常驻供应商
         return filterDeptsByLevel(deptsOptions.value, 4);
-      case 'F': // 常驻供应商
-        return filterDeptsByLevel(deptsOptions.value, 5);
       default:
         return deptsOptions.value;
     }

+ 30 - 2
src/views/production-safety/implement-safety-duty/responsibility-notice-manage-dept/feedback.vue

@@ -1,6 +1,7 @@
 <template>
   <div class="safety-platform-container">
     <el-alert v-if="showAlertBar" :title="formData?.rejection" type="warning" />
+    <div class="back"><BreadcrumbBack /> 安全责任通知管理反馈 </div>
     <!-- <div class="hint">您提交的反馈材料审核不通过,请尽快查看并修改,再次提交进行审核,谢谢!{{ formData?.rejection }}</div> -->
     <header class="safety-platform-container__header">
       <div class="breadcrumb-title"> {{ formData?.responsibilityName }} </div>
@@ -72,6 +73,18 @@
               </div>
             </div>
           </div>
+          <div class="row">
+            <div class="col">
+              <div class="label">责任通知内容:</div>
+              <div class="value value-s1">
+                <div class="file-list">
+                  <div class="file-item">
+                    <div v-html="formData.content"></div>
+                  </div>
+                </div>
+              </div>
+            </div>
+          </div>
         </div>
 
         <template v-if="isSignsUpload">
@@ -142,7 +155,7 @@
       </el-form>
     </main>
     <footer class="safety-platform-container__footer">
-      <el-button @click="$router.push({ name: 'responsibilityNoticeManage' })">返回</el-button>
+      <el-button @click="back">返回</el-button>
       <el-button type="primary" @click="handleSubmit" :loading="submiting">提交</el-button>
     </footer>
   </div>
@@ -151,7 +164,7 @@
 <script lang="ts" setup>
   import { onMounted, ref, computed, reactive } from 'vue';
   import { ElMessage } from 'element-plus';
-// @ts-ignore: missing type declarations for CSS side-effect import
+  // @ts-ignore: missing type declarations for CSS side-effect import
   import '@wangeditor/editor/dist/css/style.css';
   import { useRouter, useRoute } from 'vue-router';
   import { downloadFile } from '@/views/disaster/utils';
@@ -209,6 +222,11 @@
       previewOnlineRef.value?.open(url, type);
     }
   };
+  const back = () => {
+    router.push({
+      name: 'responsibilityNoticeManage',
+    });
+  };
   const handleSubmit = () => {
     let signsUpload: any[] = [];
     let feedback: any[] = [];
@@ -353,4 +371,14 @@
       border-left: 1px solid rgb(220, 223, 230);
     }
   }
+  .back {
+    display: flex;
+    align-items: center;
+    gap: 16px;
+    background-color: white;
+    padding: 16px 22px;
+    font-size: 20px;
+    font-weight: 600;
+    color: rgba(0, 0, 0, 0.85);
+  }
 </style>

+ 56 - 12
src/views/production-safety/implement-safety-duty/sign-agree-dept.vue

@@ -5,8 +5,9 @@
       title="您提交的反馈材料审核不通过,请尽快查看并修改,再次提交进行审核,谢谢!"
       type="warning"
     />
+    <div class="back"><BreadcrumbBack /> 安全责任书签署 </div>
     <header class="safety-platform-container__header">
-      <div class="breadcrumb-title"> {{ formData?.responsibilityName }} </div>
+      <div class="breadcrumb-title">{{ formData?.responsibilityName }} </div>
       <div class="detail-content">
         <span>类别名称:{{ formData?.departmentName }} </span>
         <span>创建人:{{ formData?.createdByName }} </span>
@@ -189,7 +190,7 @@
       </el-form>
     </main>
     <footer class="safety-platform-container__footer">
-      <el-button @click="$router.push({ name: 'responsibilityAgreeManageDept' })">返回</el-button>
+      <el-button @click="back">返回</el-button>
       <el-button type="primary" @click="handleSubmit" :loading="submiting">提交</el-button>
     </footer>
   </div>
@@ -308,7 +309,11 @@
 
     formData.signRecords = [...signRecords.value.level1, ...signRecords.value.level2, ...signRecords.value.level3];
   };
-
+  const back = () => {
+    router.push({
+      name: 'responsibilityAgreeManageDept',
+    });
+  };
   const handleSubmit = () => {
     formRef.value?.validate(async (valid) => {
       if (valid) {
@@ -331,11 +336,13 @@
             return;
           }
 
-          if (signerId.value) {
-            handleSubmitSign(firstSignItem).then(() => {
-              handleSafetyResponsibilityDeptSaveSign(signerId.value, nextLevel, nextOrder);
-            });
-          } else if (currentLevel === 2 && currentDepartmentKey.value === 'D') {
+// if (signerId.value) {
+//             // handleSubmitSign(firstSignItem).then(() => {
+//             //   handleSafetyResponsibilityDeptSaveSign(signerId.value, nextLevel, nextOrder);
+//             // });
+//           } else
+
+           if (currentLevel === 2 && currentDepartmentKey.value === 'D') {
             handleSubmitSign(firstSignItem);
           } else if (currentLevel === 3 && currentDepartmentKey.value === 'C') {
             handleSubmitSign(firstSignItem);
@@ -400,11 +407,39 @@
         submiting.value = false;
       });
   };
-
-  const handleDialogConfirm = () => {
+// 下一节点签署人 保存
+  const handleDialogConfirm = async () => {
+    const fullAttachment = formData.signRecords.every((item) => item.attachment || item.attachment?.length > 0);
+    const signList = formData.signRecords.filter((item) => item.signFlag && item.signStatus === 0);
+    const firstSignItem = signList?.[0] ?? {};
+    const lastSignItem = signList?.[signList.length - 1] ?? {};
+    const isEmptyAttachment = !firstSignItem?.attachment || firstSignItem?.attachment?.length === 0;
+    const currentLevel = lastSignItem?.signLevel;
+    const currentOrder = lastSignItem?.signOrder;
+    const nextLevel = Math.min(currentLevel + 1, 3);
+    const nextOrder = currentOrder + 1;
     if (signerId.value) {
+        const params = {
+            sign:{
+                signStatus: 0,
+                signLevel: nextLevel,
+                contractId: route.query.id,
+                signOrder: nextOrder,
+            },
+            signerId: signerId.value || null,
+            ids: [route.query.id],
+            attachment: JSON.stringify(firstSignItem?.attachment),
+        };
+        safetyResponsibilityDeptBatchSign(params).then(()=>{
+            ElMessage.success('责任书签署成功');
+            router.push({
+                name: 'responsibilityAgreeManageDept',
+            });
+            
+        }).finally(() => {
+        submiting.value = false;
+      });
       dialogVisible.value = false;
-      console.log('....', signerId.value);
     } else {
       ElMessage.warning('请选择签署人');
     }
@@ -536,7 +571,16 @@
     border-right: 1px solid rgb(220, 223, 230);
     background-color: rgb(245, 247, 250);
   }
-
+  .back{
+    display: flex;
+    align-items: center;
+    gap: 16px;
+    background-color: white;
+    padding: 16px 22px;
+    font-size: 20px;
+    font-weight: 600;
+    color: rgba(0, 0, 0, 0.85);
+  }
   // :deep(.breadcrumb .title) {
   //   margin-left: 0;
   // }

+ 11 - 1
src/views/production-safety/implement-safety-duty/view-recipients.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="safety-platform-container">
+      <div class="breadcrumb-title back"> <BreadcrumbBack /> {{ $route.meta.title }} </div>
     <header class="safety-platform-container__header">
-      <div class="breadcrumb-title"> <BreadcrumbBack /> {{ $route.meta.title }} </div>
       <div class="detail-content">
         <span>类别名称:{{ detailData?.departmentName }} </span>
         <span>创建人:{{ detailData?.createdByName }} </span>
@@ -350,4 +350,14 @@
     display: flex;
     justify-content: flex-end;
   }
+    .back{
+    display: flex;
+    align-items: center;
+    gap: 16px;
+    background-color: white;
+    padding: 16px 22px;
+    font-size: 20px;
+    font-weight: 600;
+    color: rgba(0, 0, 0, 0.85);
+  }
 </style>

+ 35 - 35
src/views/production-safety/safetyAssessment/evaluationSystem/components/EvaluationSystemFeedback.vue

@@ -1,12 +1,12 @@
 <template>
-    <!-- 反馈审核不通过提示条:仅在 evaluationSystem-feedback 且 approveRejectReson 有值时显示 -->
-    <el-alert
-      v-if="isFeedbackOperate && approveRejectReson"
-      type="error"
-      :title="approveRejectReson"
-      show-icon
-      class="reject-alert"
-    />
+  <!-- 反馈审核不通过提示条:仅在 evaluationSystem-feedback 且 approveRejectReson 有值时显示 -->
+  <el-alert
+    v-if="isFeedbackOperate && approveRejectReson"
+    type="error"
+    :title="approveRejectReson"
+    show-icon
+    class="reject-alert"
+  />
   <main class="safety-platform-container__main">
     <el-form ref="formRef" :model="ruleFormData" :rules="formRules" label-width="auto" class="evaluation-form">
       <el-form-item label="考核信息标题:" prop="evaluationTitle">
@@ -46,7 +46,7 @@
         />
       </div>
       <div class="evaluation-items-table">
-        <el-table :data="evaluationItems" border show-summary :summary-method="getSummaries" :span-method="spanMethod" >
+        <el-table :data="evaluationItems" border show-summary :summary-method="getSummaries" :span-method="spanMethod">
           <el-table-column label="编号" type="index" width="80" align="center" />
           <el-table-column label="考核项目" prop="evaluationItem" min-width="150" />
           <el-table-column label="考核内容" prop="evaluationContent" min-width="200" />
@@ -503,35 +503,35 @@
     }
   };
   let spanArr = ref<number[]>([]); // 存储每行的合并数,0表示被合并的行
-const generateSpanArr = (data) => {
-  spanArr.value = [];
-  let position = 0; // 记录当前考核项目的起始位置
-  
-  data.forEach((item, index) => {
-    if (index === 0) {
-      spanArr.value.push(1);
-      position = 0;
-    } else {
-      // 当前考核项目与前一项相同时合并
-      if (item.evaluationItem === data[index-1].evaluationItem) {
-        spanArr.value[position] += 1;   // 起始行合并数+1
-        spanArr.value.push(0);           // 当前行标记为合并
+  const generateSpanArr = (data) => {
+    spanArr.value = [];
+    let position = 0; // 记录当前考核项目的起始位置
+
+    data.forEach((item, index) => {
+      if (index === 0) {
+        spanArr.value.push(1);
+        position = 0;
       } else {
-        spanArr.value.push(1);           // 新考核项目组
-        position = index;                // 更新起始位置
+        // 当前考核项目与前一项相同时合并
+        if (item.evaluationItem === data[index - 1].evaluationItem) {
+          spanArr.value[position] += 1; // 起始行合并数+1
+          spanArr.value.push(0); // 当前行标记为合并
+        } else {
+          spanArr.value.push(1); // 新考核项目组
+          position = index; // 更新起始位置
+        }
       }
+    });
+  };
+  const spanMethod = ({ row, column, rowIndex, columnIndex }) => {
+    // 仅对考核项目列(columnIndex=1)进行合并
+    if (columnIndex === 1) {
+      const _row = spanArr.value[rowIndex];
+      const _col = _row > 0 ? 1 : 0;
+      return [_row, _col];
     }
-  });
-};
-const spanMethod = ({ row, column, rowIndex, columnIndex }) => {
-  // 仅对考核项目列(columnIndex=1)进行合并
-  if (columnIndex === 1) {
-    const _row = spanArr.value[rowIndex];
-    const _col = _row > 0 ? 1 : 0;
-    return [_row, _col];
-  }
-  return [1, 1]; // 其他列不合并
-};
+    return [1, 1]; // 其他列不合并
+  };
   const handleSubmit = async () => {
     const res = await handleValidate();
     if (!res) return;

+ 1 - 0
src/views/production-safety/safetyAssessment/evaluationSystem/evaluationSystem.vue

@@ -115,6 +115,7 @@
 
                 <!-- 待反馈:作废 / 考核对象 -->
                 <template v-else-if="Number(scope.row.status) === 2">
+                  <ActionButton text="下发" @click="handleIssue(scope.row.id)" />
                   <ActionButton
                     text="作废"
                     :popconfirm="{

+ 137 - 65
src/views/production-safety/safetyTrainingAndEducation/educationTrainingPlanManagementDept/components/addTrainingInformation.vue

@@ -1,7 +1,7 @@
 <script lang="ts" setup>
   import { saveTrainingInformation, updateTrainingInformation } from '@/api/production-education-training-plan-dept';
   import { ref, reactive, onMounted, watch, shallowRef, computed } from 'vue';
-  import { UploadFilled, Plus } from '@element-plus/icons-vue';
+  import { UploadFilled, Plus, Delete, Download, ZoomIn } from '@element-plus/icons-vue';
   import { TRAINING_FORM_RULES } from '../configs/form';
   import { queryUserGroupPage } from '@/api/system/person-group';
   import type { FileItem } from '@/components/UploadFiles/types';
@@ -9,7 +9,7 @@
   import { Editor, Toolbar } from '@wangeditor/editor-for-vue';
   // @ts-ignore: missing type declarations for CSS side-effect import
   import '@wangeditor/editor/dist/css/style.css';
-  import { ElMessage } from 'element-plus';
+  import { ElMessage, UploadRawFile } from 'element-plus';
 
   import { debounce } from 'lodash-es';
 
@@ -70,17 +70,19 @@
     try {
       const basePayload = {
         ...form,
+        petpiId: props.currentId,
+        courseImg: form.courseImg[0],
         // responsibleDeptIds: form.responsibleDeptIds.toString()
       };
-
+      console.log('提交的表单数据:', basePayload);
       if (isCreateMode.value) {
-        // await saveTrainingInformation(basePayload);
+        await saveTrainingInformation(basePayload);
         ElMessage.success('创建成功');
       } else if (isEditMode.value && props.currentId) {
-        // await updateTrainingInformation({
-        //     id: props.currentId,
-        //     ...basePayload,
-        // });
+        await updateTrainingInformation({
+          id: props.currentId,
+          ...basePayload,
+        });
         ElMessage.success('保存成功');
       }
     } catch (e) {
@@ -125,10 +127,6 @@
     return isAllowedType && isLt20M;
   };
 
-  const handleExceed = () => {
-    ElMessage.warning('只能上传一个文件,请先删除当前文件再上传!');
-  };
-
   const handleEditorCreated = (editor: any) => {
     editorRef.value = editor;
   };
@@ -136,57 +134,108 @@
   const handleEditorChange = () => {
     // 编辑器内容变化时的处理
   };
-  const handleImageUploadSuccess = (response: any, file: any, fileList: any[]) => {
-    console.log('图片上传成功:', response, file, fileList);
-    form.courseImg = fileList;
+  const handleImageUploadChange = (response: any, file: any) => {
+    form.courseImg = [response];
+  };
+
+  const courseImgRef = ref();
+  const handleImageExceed = (files: any[]) => {
+    console.log(files);
+    courseImgRef.value!.clearFiles(); // 清空文件列表
+    const file = files[0] as UploadRawFile;
+    courseImgRef.value!.handleStart(file); // 手动触发上传
+    form.courseImg = files[0];
+  };
+
+  const dialogVisible = ref(false);
+  const dialogImageUrl = ref('');
+  const handlePictureCardPreview = (file: any) => {
+    dialogImageUrl.value = file.url;
+    dialogVisible.value = true;
+  };
+
+  const handleImageRemove = (file: any) => {
+    console.log('图片被移除:', file, fileList.value);
+    // console.log('图片被移除:', file, fileList.value);
+    // form.courseImg = fileList.value.filter((item) => item.uid !== file.uid);
+  };
+  const validateImage = (file) => {
+    const validMIME = [
+      'image/jpeg',
+      'image/png',
+      'image/gif',
+      'image/bmp',
+      'image/webp',
+      'image/svg+xml',
+      'image/tiff',
+      'image/heic',
+      'image/heif',
+      'image/avif',
+    ];
+
+    if (!validMIME.includes(file.type)) {
+      ElMessage.error('仅支持图片文件(JPEG/PNG/GIF/BMP/WEBP/SVG/TIFF/HEIC/AVIF等)');
+      return false;
+    }
+
+    if (!validMIME.includes(file.type)) {
+      ElMessage.error('仅支持JPG/PNG格式图片');
+      return false; // 阻止上传
+    }
+
+    // 可选:添加文件大小限制
+    const maxSize = 5 * 1024 * 1024; // 5MB
+    if (file.size > maxSize) {
+      ElMessage.error('图片大小不能超过5MB');
+      return false;
+    }
+
+    return true; // 验证通过
   };
-const handleImageRemove = (file: any, fileList: any[]) => {
-    console.log('图片被移除:', file, fileList);
-    form.courseImg = fileList;
-}
 
-const handleFileChange = (file, fileList) => {
+  // 文件选择更新
+  const courseContentUpload = ref();
+  const handleFileExceed = (files) => {
+    courseContentUpload.value!.clearFiles(); // 清空文件列表
+    const file = files[0] as UploadRawFile;
+    if (!beforeUpload(file)) {
+      return;
+    }
+    courseContentUpload.value!.handleStart(file); // 手动触发上传
+  };
+  // 课程内容文件上传
+  const handleFileChange = (file, fileList) => {
     // 1. 验证文件类型和大小
     const allowedTypes = [
-        'application/rar', 
-        'application/zip', 
-        'application/msword',
-        'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
-        'application/pdf',
-        'video/mp4'
+      'application/rar',
+      'application/zip',
+      'application/msword',
+      'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
+      'application/pdf',
+      'video/mp4',
     ];
-    
+
     if (!allowedTypes.includes(file.raw.type)) {
-        ElMessage.error('不支持的文件格式');
-        return;
+      ElMessage.error('不支持的文件格式');
+      return;
     }
 
     if (file.raw.size > 20 * 1024 * 1024) {
-        ElMessage.error('文件大小不能超过20MB');
-        return;
+      ElMessage.error('文件大小不能超过20MB');
+      return;
     }
-
+    console.log(file, fileList);
     // 2. 关键修改:强制覆盖旧文件
-    fileList.value = [file.raw];  // 直接替换为新文件
-
-    // 3. 生成文件信息JSON
-    fileInfo.value = {
-        fileName: file.raw.name,
-        fileSize: `${(file.raw.size / (1024 * 1024)).toFixed(2)} MB`,
-        fileType: file.raw.type,
-        lastModified: new Date(file.raw.lastModified).toLocaleString(),
-        rawFile: file.raw
-    };
-}
-
-  const handleUploadSignsUploadSuccess = async (item:any, fileList) => {
+    fileList.value = [file.raw]; // 直接替换为新文件
+    form.courseContent = file; // 更新表单数据
+  };
+
+  const handleUploadSignsUploadSuccess = async (item: any, fileList) => {
     // const attachment = await formatAttachmentList(fileList);
     // item.attachment = attachment;
-
     // form.courseImg = [...signRecords.value.level1, ...signRecords.value.level2, ...signRecords.value.level3];
   };
 
-
   // 文件上传
   const handleUploadSuccess = (files: FileItem[]) => {
     console.log('上传成功的文件列表:', files);
@@ -244,6 +293,7 @@ const handleFileChange = (file, fileList) => {
           <el-select
             v-model="form.groupOfParticipants"
             multiple
+            filterable
             placeholder="请选择培训责任部门责任人所在分组,多选"
             clearable
             :disabled="isViewMode"
@@ -287,16 +337,15 @@ const handleFileChange = (file, fileList) => {
         </el-form-item>
 
         <el-form-item label="课程内容:" prop="courseContent">
-          <!-- <UploadFiles label="上传文件" :maxCount="1" :file-list="form.courseImg" :disabled="isViewMode"
-                        accept=".rar,.zip,.doc,.docx,.pdf,.mp4" desc="支持格式:.rar .zip .doc .docx .pdf .mp4 ,单个文件不能超过20MB"
-                        :allow-all-file-types="true" @uploadSuccess="handleUploadSuccess" /> -->
           <el-upload
             action=""
+            ref="courseContentUpload"
             :auto-upload="false"
             :on-change="handleFileChange"
             accept=".rar, .zip, .doc, .docx, .pdf, .mp4"
             :file-list="fileList"
             :limit="1"
+            :on-exceed="handleFileExceed"
           >
             <el-button type="default" :disabled="isViewMode">
               <el-icon style="margin-right: 6px">
@@ -318,21 +367,18 @@ const handleFileChange = (file, fileList) => {
         </el-form-item>
 
         <el-form-item label="课程图片:" prop="courseImg">
-            <UploadFiles
-                accept=".jpeg,.jpg,.png,.svg"
-                label="上传文件"
-                :fileList="form.courseImg"
-                @upload-success="(fileList) => handleUploadSignsUploadSuccess(item, fileList)"
-            />
-          <!-- <el-upload
+          <el-upload
             class="image-uploader"
+            ref="courseImgRef"
             action="#"
-            :file-list="form.courseContent"
+            :file-list="form.courseImg"
             :disabled="isViewMode"
+            :auto-upload="false"
             :limit="1"
-            accept=".jpg,.png,.jpeg"
-            :on-success="handleImageUploadSuccess"
-            :on-remove="handleImageRemove"
+            accept="image/*"
+            :on-change="handleImageUploadChange"
+            :on-exceed="handleImageExceed"
+            :before-upload="validateImage"
             list-type="picture-card"
           >
             <el-icon>
@@ -342,9 +388,20 @@ const handleFileChange = (file, fileList) => {
             <template #tip>
               <div class="el-upload__tip"> 支持格式:.jpg .png .jpeg,单个文件不能超过300k,设置一个默认图片。 </div>
             </template>
-          </el-upload> -->
-
-
+            <template #file="{ file }">
+              <div>
+                <img class="el-upload-list__item-thumbnail courseImg" :src="file.url" alt="" />
+                <span class="el-upload-list__item-actions">
+                  <span class="el-upload-list__item-preview" @click="handlePictureCardPreview(file)">
+                    <el-icon><zoom-in /></el-icon>
+                  </span>
+                </span>
+              </div>
+            </template>
+          </el-upload>
+          <el-dialog v-model="dialogVisible">
+            <img w-full :src="dialogImageUrl" alt="Preview Image" />
+          </el-dialog>
         </el-form-item>
       </el-form>
 
@@ -396,7 +453,22 @@ const handleFileChange = (file, fileList) => {
     background-color: #f5f7fa;
     border-radius: 4px;
   }
-
+  :deep(.el-upload-list__item) {
+    // margin: 10px 0;
+    border-radius: 8px;
+    border: 1px solid #e1e1e1;
+    background-color: #f9fafb;
+  }
+  :deep(.el-upload-list__item .el-icon--close) {
+    display: inline-block !important;
+    opacity: 1 !important;
+  }
+  .courseImg {
+    width: 78px;
+    height: 78px;
+    object-fit: cover;
+    border-radius: 4px;
+  }
   pre {
     white-space: pre-wrap;
   }

+ 9 - 8
src/views/production-safety/safetyTrainingAndEducation/educationTrainingPlanManagementDept/components/educationTrainingPlanManagementDeptDetail.vue

@@ -85,15 +85,15 @@
         <!-- 表格 -->
         <el-table :data="tableData" border stripe>
           <el-table-column prop="id" label="编号" width="80" />
-          <el-table-column prop="trainTime" label="培训时间" />
+          <el-table-column prop="trainingDate" label="培训时间" />
           <el-table-column prop="courseName" label="培训课程名称" />
-          <el-table-column prop="category" label="课程所属分类" />
-          <el-table-column prop="mode" label="培训方式" width="120" />
-          <el-table-column prop="summary" label="培训课程简述" />
-          <el-table-column prop="teacher" label="培训课程讲师" />
-          <el-table-column prop="group" label="计划参与人数所属分组" />
-          <el-table-column prop="planCount" label="计划参与人数" width="140" />
-          <el-table-column prop="signCount" label="签到人数" width="120" />
+          <el-table-column prop="courseTypeName" label="课程所属分类" />
+          <el-table-column prop="trainingMethod" label="培训方式" width="120" />
+          <el-table-column prop="courseIntroduction" label="培训课程简述" />
+          <el-table-column prop="trainingTeacher" label="培训课程讲师" />
+          <el-table-column prop="groupOfParticipantsDesc" label="计划参与人数所属分组" />
+          <el-table-column prop="planNumOfParticipants" label="计划参与人数" width="140" />
+          <el-table-column prop="signInNum" label="签到人数" width="120" />
 
           <el-table-column label="操作" width="280" fixed="right">
             <template #default="{ row }">
@@ -210,6 +210,7 @@
   const handleAdd = () => {
     type.value = 'add';
     showAddTrainingInfo.value = true;
+    currentTableId.value = String(currentId.value);
   };
 
   const handleEdit = (row) => {