Kaynağa Gözat

Merge branch 'feat/production-safety' into 'dev'

Feat/production safety

See merge request product-group-fe/sfy-safety-group/sfy-safety!368
ai0197(吴云丰) 1 ay önce
ebeveyn
işleme
9652143864
16 değiştirilmiş dosya ile 176 ekleme ve 136 silme
  1. 1 1
      src/api/production-safety/personal-protective-equipment-purchase-apply.ts
  2. 1 1
      src/api/safety-organization-management/index.ts
  3. 1 1
      src/views/production-safety/hiddenTroubleInvestigationAndGovernance/employeeReportHiddenTroubleManagement/employeeReportHiddenTroubleManagement.vue
  4. 7 4
      src/views/production-safety/hiddenTroubleInvestigationAndGovernance/hiddenTroubleAccountManagement/components/hiddenTroubleAccountManagementDetail.vue
  5. 22 40
      src/views/production-safety/productionSafetySystem/safetyOrganizationSystemManagement/components/TeamDetailDrawer.vue
  6. 28 4
      src/views/production-safety/productionSafetySystem/safetyOrganizationSystemManagement/components/collapseItem.vue
  7. 11 6
      src/views/production-safety/productionSafetySystem/safetyOrganizationSystemManagement/safetyOrganizationSystemManagement.vue
  8. 6 1
      src/views/production-safety/productionSafetySystem/safetySystemConstructionWorkPlanManagement/components/safetySystemConstructionWorkPlanManagementDetail.vue
  9. 2 2
      src/views/production-safety/productionSafetySystem/safetySystemConstructionWorkPlanManagement/configs/tables.ts
  10. 3 0
      src/views/production-safety/productionSafetySystem/safetySystemConstructionWorkPlanManagement/safetySystemConstructionWorkPlanManagementViewSender.vue
  11. 0 1
      src/views/production-safety/productionSafetySystem/safetySystemConstructionWorkPlanManagementDept/components/safetySystemConstructionWorkPlanManagementDeptDetail.vue
  12. 5 1
      src/views/production-safety/productionSafetySystem/securityOrganizationalStructure/securityOrganizationalStructure.vue
  13. 36 28
      src/views/production-safety/risk-identification-and-control/labor-products-purchase-apply-manage-admin/components/detail.vue
  14. 38 40
      src/views/production-safety/risk-identification-and-control/labor-products-purchase-apply-manage/components/detail.vue
  15. 6 1
      src/views/production-safety/safetyTrainingAndEducation/educationTrainingPlanManagement/components/educationTrainingPlanManagementDetail.vue
  16. 9 5
      src/views/production-safety/safetyTrainingAndEducation/employeeTrainingRecordCardManagement/employeeTrainingRecordCardManagementEdit.vue

+ 1 - 1
src/api/production-safety/personal-protective-equipment-purchase-apply.ts

@@ -135,7 +135,7 @@ export function deletePurchaseApply(id: number) {
 /** 审批信息项 */
 export interface ApprovalInfoItem {
   approvalOrder?: number;
-  approverIdList?: string; // "1002,1003"
+  approverIdList?: number[];
 }
 
 /** 编辑/提交请求体 SavePpePurchaseApplyReq */

+ 1 - 1
src/api/safety-organization-management/index.ts

@@ -2,7 +2,7 @@
  * @Author: liuJie
  * @Date: 2026-02-05 11:15:09
  * @LastEditors: liuJie
- * @LastEditTime: 2026-03-30 13:26:55
+ * @LastEditTime: 2026-03-30 21:58:49
  * @Describe: 安全组织体系管理
  */
 

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

@@ -187,7 +187,7 @@
   // 批量导入
   const batchImportVisible = ref(false);
   const { urlPrefix } = useGlobSetting();
-  const importApiUrl = ref(urlJoin(urlPrefix, '/api/employeeHazardReport/importEmployeeHazardReport'));
+  const importApiUrl = ref(urlJoin(urlPrefix, '/employeeHazardReport/importEmployeeHazardReport'));
   const templateUrl = ref('./skyeye-file-upload/sfysecurity/TEMPLATE/员工上报导入模版.xlsx');
 
   const handleImport = () => {

+ 7 - 4
src/views/production-safety/hiddenTroubleInvestigationAndGovernance/hiddenTroubleAccountManagement/components/hiddenTroubleAccountManagementDetail.vue

@@ -198,7 +198,6 @@
         <el-form-item label="附件上传" prop="attachments">
             <UploadFiles
                 label="选择附件"
-                :maxCount="1"
                 v-if="detailStatusOrder==2"
                 :disabled="!isRectifyMode"
                 :file-list="attachmentsFileList"
@@ -210,9 +209,12 @@
                     <div class="file-item" v-for="file in attachmentsFileList" :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="previewOnline(file.fileUrl, file.fileType)">
+                                预览
+                            </el-button>
+                            <el-button link type="primary" @click.stop="downloadFile(file.fileUrl, file.fileName)">
+                                下载
+                            </el-button>
                         </div>
                     </div>
                 </div>
@@ -352,6 +354,7 @@
   import type { FileItem } from '@/components/UploadFiles/types';
   import { formatAttachmentList } from '@/components/UploadFiles/utils';
   import { useFormConfigHook } from '@/hooks/useFormConfigHook';
+  import { downloadFile } from '@/views/disaster/utils';
   import {
     HIDDEN_DANGER_FORM_CONFIG,
     HIDDEN_DANGER_FORM_DATA,

+ 22 - 40
src/views/production-safety/productionSafetySystem/safetyOrganizationSystemManagement/components/TeamDetailDrawer.vue

@@ -1,33 +1,23 @@
 <template>
   <el-drawer v-model="showDrawer" direction="rtl" @close="clearData">
     <div class="team-detail__info">
-      <div class="team-detail__info__team-name">{{ teamAndPersonInfo?.teamName }}</div>
+      <div class="team-detail__info__team-name">{{ organization?.orgName }}</div>
       <div class="team-detail__info__member-count">
-        共 <span>{{ teamAndPersonInfo?.memberCount || 0 }}</span> 人
+        共 <span>{{ organization?.userNum || 0 }}</span> 人
       </div>
     </div>
-
-    <div class="team-detail__level" v-for="level in levelAndPersonList" :key="level.positionLevel">
-      <div class="team-detail__level__title">
-        {{ level.title }}
-      </div>
-      <div class="team-detail__level__content">
-        <div v-for="(person, index) in level.personList" :key="index">{{ person }}</div>
-      </div>
-    </div>
-
     <div class="team-detail__description">
       <div class="team-detail__description__title"> 队伍职责 </div>
-      <div class="team-detail__description__content"> {{ teamAndPersonInfo?.description }} </div>
+      <div class="team-detail__description__content"> {{ organization?.depResp }} </div>
     </div>
   </el-drawer>
 </template>
 
 <script setup lang="ts">
   import { ref, watch } from 'vue';
-  import { queryEmergencyTeamDetail } from '@/api/emergency-organization/teams';
-  import { TeamAndPersonInfoType } from '../team-management/type';
-
+  import {
+    safetyOrgUserDetail,
+  } from '@/api/safety-organization-management';
   const props = defineProps<{ selectedTeamId: number | null }>();
 
   type LevelAndPersonType = {
@@ -35,43 +25,35 @@
     title: string;
     personList: string[];
   };
+ interface OrganizationInfoType {
+     createdAt: Date;
+     createdBy: number;
+     depResp: string;
+     id: number;
+     isDeleted: number;
+     orgName: string;
+     parentId: number;
+     updatedAt: Date;
+     userNum: number;
+};
+
 
   const showDrawer = ref(false);
-  const teamAndPersonInfo = ref<TeamAndPersonInfoType>();
-  const levelAndPersonList = ref<LevelAndPersonType[]>([]);
+  const organization = ref<OrganizationInfoType>();
 
   function drawerShow() {
     showDrawer.value = true;
   }
 
   function clearData() {
-    teamAndPersonInfo.value = undefined;
-    levelAndPersonList.value = [];
-  }
-
-  // 按照职位等级排序队伍人员
-  function setLevelAndPerson() {
-    const levelMap: { [key: number]: LevelAndPersonType } = {};
-
-    teamAndPersonInfo.value?.personnelList.map((person) => {
-      if (!(person.positionLevel in levelMap)) {
-        levelMap[person.positionLevel] = { positionLevel: person.positionLevel, title: person.title, personList: [] };
-      }
-
-      levelMap[person.positionLevel].personList.push(person.realname);
-    });
-
-    for (let level in levelMap) {
-      levelAndPersonList.value.push(levelMap[level]);
-    }
+    organization.value = undefined;
   }
 
   watch(
     () => showDrawer.value,
     async () => {
       if (showDrawer.value) {
-        teamAndPersonInfo.value = await queryEmergencyTeamDetail(props.selectedTeamId!);
-        setLevelAndPerson();
+        organization.value = await safetyOrgUserDetail(props.selectedTeamId!);
       }
     },
   );
@@ -130,7 +112,7 @@
     margin-top: 20px;
     &__title {
       margin-bottom: 10px;
-      font-size: 20px;
+      font-size: 16px;
       font-weight: bold;
     }
     &__content {

+ 28 - 4
src/views/production-safety/productionSafetySystem/safetyOrganizationSystemManagement/components/collapseItem.vue

@@ -3,7 +3,7 @@
     <el-collapse-item :name="String(data.orgId)">
       <!-- 标题 -->
       <template #title>
-        <div class="node">
+        <div class="node" :style="{ marginLeft: (level - 1) * 2 + 'px' }">
             <div @click.stop="handleClick" class="cursor-pointer">
             {{ data?.orgName }}
             </div>
@@ -26,7 +26,7 @@
       <div
         v-if="data.children && data.children.length && level < 10"
         class="ml-4">
-        <el-collapse accordion>
+        <el-collapse  accordion>
           <CollapseItem
             v-for="child in data.children"
             :key="child.id"
@@ -47,7 +47,7 @@
 </template>
 
 <script setup>
-  import { defineProps, defineEmits, defineOptions } from 'vue'
+  import { defineProps, defineEmits, defineOptions, ref, inject } from 'vue'
   import {
   Delete,
   Edit,
@@ -58,7 +58,8 @@
 defineOptions({
   name: 'CollapseItem'
 })
-
+const childrenActiveName = ref('')
+// const activeName = inject('activeName')
 // 定义 props
 const props = defineProps({
   data: {
@@ -92,11 +93,13 @@ const bindingEvents = (state, type, item)=>{
 // 点击当前项
 const handleClick = () => {
   emit('click-node', props.data)
+//   activeName.value = String(props.data.orgId)
 }
 
 // 接收子组件点击
 const handleClickItem = (item) => {
   emit('click-node', item)
+//   activeName.value = String(item.orgId)
 }
 </script>
 
@@ -124,4 +127,25 @@ li{
     margin: 4px 0;
     cursor: pointer;
 }
+/* 全局生效 /deep/ 穿透 */
+/* :deep(.el-collapse-item__header) {
+  border-left: 3px solid transparent;
+  transition: all 0.2s;
+} */
+
+/* 选中展开的项 → 高亮 */
+/* :deep(.el-collapse-item__header.is-active) {
+  background-color: #f5f7fa !important;
+  border-left: 3px solid #1677ff;
+} */
+
+/* 选中的标题文字高亮 */
+/* :deep(.el-collapse-item__header.is-active .node) {
+  color: #1677ff !important;
+} */
+
+/* hover 效果 */
+/* :deep(.el-collapse-item__header:hover) {
+  background: #fafafa;
+} */
 </style>

+ 11 - 6
src/views/production-safety/productionSafetySystem/safetyOrganizationSystemManagement/safetyOrganizationSystemManagement.vue

@@ -5,11 +5,11 @@
     </header>
     <main class="safety-platform-container__main flex">
       <div class="nav">
-        <el-button type="primary" :icon="Plus" @click="addTeam('parent')"> 添加组织 </el-button>
+        <el-button type="primary" :icon="Plus" @click="addTeam('parent')"> 添加组织</el-button>
         
         <div class="collapse-wrapper">
-            <!-- 组织树 -->
-            <el-collapse v-model="activeName" accordion v-if="fetchSafetyOrganizationList.length > 0">
+            <!-- 组织树v-model="activeName"-->
+            <el-collapse  accordion v-if="fetchSafetyOrganizationList.length > 0">
                 <CollapseItem
                     v-for="item in fetchSafetyOrganizationList"
                     :key="item.id"
@@ -56,7 +56,7 @@
 </template>
 
 <script setup lang="ts">
-  import { onMounted, reactive, ref, defineComponent } from 'vue';
+  import { onMounted, reactive, ref, provide } from 'vue';
   import { ElMessage, ElMessageBox } from 'element-plus';
   import BasicTable from '@/components/BasicTable.vue';
   import useTableConfig from '@/hooks/useTableConfigHook';
@@ -98,6 +98,8 @@ const position = ref('left')
   const fetchSafetyOrganizationList = ref<any[]>([]);
 
   const activeName = ref('');
+  // 给组件递归时使用
+//   provide('activeName', activeName)
 
   const level = ref(1)
   // 日期范围(用于日期选择器)
@@ -145,7 +147,9 @@ const position = ref('left')
   const teamDetailDrawerRef = ref<InstanceType<typeof TeamDetailDrawer>>();
   const selectedTeamId = ref<number | null>(null);
   const handleNodeClick = (nodeData: any) => {
-    selectedTeamId.value = Number(nodeData.id);
+      const id = nodeData?.id?.replace('org-', '')
+      console.log(nodeData, 'canshu')
+    selectedTeamId.value = Number(id);
 
     teamDetailDrawerRef.value?.drawerShow();
   };
@@ -226,7 +230,7 @@ const formatTreeData = (tree)=> {
       // 默认选择第一个组织
       if(res[0].orgId){
         treeNodePreview(res[0])
-        activeName.value = res[0].orgId
+        activeName.value = String(res[0].orgId)
         tableQuery.queryParam.classifyName = res[0].orgId
       }
 
@@ -296,6 +300,7 @@ const formatTreeData = (tree)=> {
   const querySafetyTeamData = (value) => {
     // console.log('查询', value);
     tableQuery.queryParam.classifyName = value.orgId;
+    activeName.value = String(value.orgId)
     treeNodePreview(value)
   };
 

+ 6 - 1
src/views/production-safety/productionSafetySystem/safetySystemConstructionWorkPlanManagement/components/safetySystemConstructionWorkPlanManagementDetail.vue

@@ -21,7 +21,7 @@
       <el-form-item label="责任部门:" prop="responsibleDeptIds" required>
         <el-cascader
           v-model="form.responsibleDeptIds"
-          :options="deptTree"
+          :options="deptTreeOne"
           :props="cascaderProp"
           clearable
           collapse-tags
@@ -156,9 +156,14 @@
 
   // 获取级联部门数据
   const deptTree = ref<DeptTree[]>();
+  const deptTreeOne = ref<DeptTree[]>();
   const loadDeptTreeData = async () => {
     const result = await getAllDepartments();
     deptTree.value = result[0].children;
+    deptTreeOne.value = result?.[0]?.children.map(item => ({
+        ...item,
+        children: []
+      }));
   };
 
   /** 附件 JSON [{file_name, url}] 转 FileItem 列表,供 UploadFiles 使用(新增/编辑/查看/审核统一展示) */

+ 2 - 2
src/views/production-safety/productionSafetySystem/safetySystemConstructionWorkPlanManagement/configs/tables.ts

@@ -2,7 +2,7 @@
  * @Author: liuJie
  * @Date: 2026-01-28 11:03:32
  * @LastEditors: liuJie
- * @LastEditTime: 2026-03-01 20:07:59
+ * @LastEditTime: 2026-03-31 11:02:13
  * @Describe: file describe
  */
 import type { TableColumnProps } from '@/types/basic-table';
@@ -69,7 +69,7 @@ export const WORK_PLAN_TABLE_COLUMNS: TableColumnProps[] = [
     label: '培训计划名称',
     prop: 'trainingPlanName',
     align: 'left',
-    minWidth: '200px',
+    minWidth: '220px',
     showOverflowTooltip: true,
   },
   {

+ 3 - 0
src/views/production-safety/productionSafetySystem/safetySystemConstructionWorkPlanManagement/safetySystemConstructionWorkPlanManagementViewSender.vue

@@ -332,4 +332,7 @@ import BreadcrumbBack from '@/components/BreadcrumbBack.vue';
     flex-shrink: 0;
     background-color: white;
   }
+  .select-box{
+    justify-content: flex-start;
+  }
 </style>

+ 0 - 1
src/views/production-safety/productionSafetySystem/safetySystemConstructionWorkPlanManagementDept/components/safetySystemConstructionWorkPlanManagementDeptDetail.vue

@@ -75,7 +75,6 @@
           label="上传附件"
           :file-list="attachmentFileList"
           :disabled="isViewMode"
-          :maxCount="1"
           @uploadSuccess="handleAttachmentUploadSuccess"
           @preview="handlePreview"
         />

+ 5 - 1
src/views/production-safety/productionSafetySystem/securityOrganizationalStructure/securityOrganizationalStructure.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="safety-platform-container">
     <header class="safety-platform-container__header">
-      <div class="breadcrumb-title"> 安全组织体系架构 </div>
+      <div class="breadcrumb-title"> 安全组织体系管理 </div>
     </header>
     <main class="safety-platform-container__main flex platform-main">
       <div class="nav">
@@ -196,6 +196,7 @@ const position = ref('left')
     },
   });
   const safetyOrgUser = reactive({
+    id: 0,
     userNum: '',
     depResp: ''
   })
@@ -212,6 +213,8 @@ const position = ref('left')
     const res = await handleValidate()
     if (!res) return;
     try {
+        console.log(safetyOrgUser, 'canshu')
+        safetyOrgUser.id = Number(safetyOrgUser.id)
         await safetyOrgUserSave(safetyOrgUser)
         ElMessage.success('保存成功');
     } catch (error) {
@@ -223,6 +226,7 @@ const position = ref('left')
     try {
         const res = await safetyOrgUserDetail(id)
         Object.assign(safetyOrgUser, {
+            id,
             userNum: res.userNum,
             depResp: res.depResp
         })

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

@@ -689,15 +689,15 @@
       return;
     }
     // showApproverDialog.value = true;
-    const payload = buildSubmitPayload({
-      templateId: form.approvalTemplateId,
-    });
-    await saveThePurchaseRequest(payload).then((res) => {
-      ElMessage.success('提交成功');
-      if(isCreateMode.value){
-        planId.value = res || undefined;
-      }
-    });
+    // const payload = buildSubmitPayload({
+    //   templateId: form.approvalTemplateId,
+    // });
+    // await saveThePurchaseRequest(payload).then((res) => {
+    //   ElMessage.success('提交成功');
+    //   if(isCreateMode.value){
+    //     planId.value = res || undefined;
+    //   }
+    // });
 
     await getApprovalNode(form.approvalTemplateId);
     basicDialogRef.value.openDialog();
@@ -709,7 +709,7 @@
     const valid = await approverFormRef.value?.validate().catch(() => false);
     if (!valid) return;
     const approvalInfoList: ApprovalInfoItem[] = [
-      { approvalOrder: 1, approverIdList: String(approverForm.approverId) },
+      { approvalOrder: 1, approverIdList: approverForm.approverId ? [approverForm.approverId] : [] },
     ];
     const payload = buildSubmitPayload({
       approvalInfoList,
@@ -812,26 +812,34 @@
   const handleSubmitApproval = () => {
     approvalFormRef.value.validate(async (valid: boolean) => {
       if (valid) {
-        // 构造后端需要的数据格式
-        const approvalData = {
-          id: planId.value!,
+        const approvalInfoList: ApprovalInfoItem[] = approvalNodeList.value.map((node) => {
+          let approverIds: number[] = [];
+          if (node.approverType === APPROVER_TYPE.FIX) {
+            approverIds = node.approverInfoList.map((info) => info.approverId);
+          } else {
+            approverIds = approvalForm.approvers[node.id] || [];
+          }
+          return {
+            approvalOrder: node.approvalOrder,
+            approverIdList: approverIds,
+          };
+        });
+        const payload = buildSubmitPayload({
           templateId: form.approvalTemplateId,
           approvalDescription: approvalForm.description,
-          approvalInfoList: approvalNodeList.value.map((node) => {
-            let approverIdList: number[] = [];
-            if (node.approverType === APPROVER_TYPE.FIX) {
-              approverIdList = node.approverInfoList.map((info) => info.approverId);
-            } else if (approvalForm.approvers[node.id]) {
-              approverIdList = approvalForm.approvers[node.id];
-            }
-            return {
-              approvalOrder: node.approvalOrder,
-              approverIdList,
-            };
-          }),
-        };
-        await submitApprovalProcess(approvalData);
-        ElMessage.success('提交成功');
+          approvalInfoList,
+        });
+        if(isCreateMode.value){
+          await saveThePurchaseRequest(payload);
+          ElMessage.success('提交成功');
+        }else{
+          const payload = buildSubmitPayload({
+            approvalInfoList,
+            approvalDescription: '',
+            templateId: form.approvalTemplateId,
+          });
+          await doSubmit(payload);
+        }
         basicDialogRef.value.closeDialog();
         router.back();
       }

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

@@ -689,15 +689,15 @@
       return;
     }
     // showApproverDialog.value = true;
-    const payload = buildSubmitPayload({
-      templateId: form.approvalTemplateId,
-    });
-    await saveThePurchaseRequest(payload).then((res) => {
-      ElMessage.success('提交成功');
-      if(isCreateMode.value){
-        planId.value = res || undefined;
-      }
-    });
+    // const payload = buildSubmitPayload({
+    //   templateId: form.approvalTemplateId,
+    // });
+    // await saveThePurchaseRequest(payload).then((res) => {
+    //   ElMessage.success('提交成功');
+    //   if(isCreateMode.value){
+    //     planId.value = res || undefined;
+    //   }
+    // });
 
     await getApprovalNode(form.approvalTemplateId);
     basicDialogRef.value.openDialog();
@@ -709,7 +709,7 @@
     const valid = await approverFormRef.value?.validate().catch(() => false);
     if (!valid) return;
     const approvalInfoList: ApprovalInfoItem[] = [
-      { approvalOrder: 1, approverIdList: String(approverForm.approverId) },
+      { approvalOrder: 1, approverIdList: approverForm.approverId ? [approverForm.approverId] : [] },
     ];
     const payload = buildSubmitPayload({
       approvalInfoList,
@@ -744,19 +744,8 @@
     }
   }
 
-  /** 底部主按钮:新增时弹出选择审核人,编辑时直接保存 */
   async function onPrimaryClick() {
-    if (isCreateMode.value) {
-      await openApproverDialog();
-    } else {
-      const valid = await formRef.value?.validate().catch(() => false);
-      if (!valid) return;
-      if (!form.itemList.length || form.itemList.every((it) => !it.ppeName && !it.equipmentName)) {
-        ElMessage.warning('请至少填写一条劳防用品明细');
-        return;
-      }
-      await doSubmit(buildSubmitPayload());
-    }
+    await openApproverDialog();
   }
 
   async function handleAuditPass() {
@@ -810,28 +799,37 @@
   };
 
   const handleSubmitApproval = () => {
+    
     approvalFormRef.value.validate(async (valid: boolean) => {
       if (valid) {
-        // 构造后端需要的数据格式
-        const approvalData = {
-          id: planId.value!,
+        const approvalInfoList: ApprovalInfoItem[] = approvalNodeList.value.map((node) => {
+          let approverIds: number[] = [];
+          if (node.approverType === APPROVER_TYPE.FIX) {
+            approverIds = node.approverInfoList.map((info) => info.approverId);
+          } else {
+            approverIds = approvalForm.approvers[node.id] || [];
+          }
+          return {
+            approvalOrder: node.approvalOrder,
+            approverIdList: approverIds,
+          };
+        });
+        const payload = buildSubmitPayload({
           templateId: form.approvalTemplateId,
           approvalDescription: approvalForm.description,
-          approvalInfoList: approvalNodeList.value.map((node) => {
-            let approverIdList: number[] = [];
-            if (node.approverType === APPROVER_TYPE.FIX) {
-              approverIdList = node.approverInfoList.map((info) => info.approverId);
-            } else if (approvalForm.approvers[node.id]) {
-              approverIdList = approvalForm.approvers[node.id];
-            }
-            return {
-              approvalOrder: node.approvalOrder,
-              approverIdList,
-            };
-          }),
-        };
-        await submitApprovalProcess(approvalData);
-        ElMessage.success('提交成功');
+          approvalInfoList,
+        });
+        if(isCreateMode.value){
+          await saveThePurchaseRequest(payload);
+          ElMessage.success('提交成功');
+        }else{
+          const payload = buildSubmitPayload({
+            approvalInfoList,
+            approvalDescription: '',
+            templateId: form.approvalTemplateId,
+          });
+          await doSubmit(payload);
+        }
         basicDialogRef.value.closeDialog();
         router.back();
       }

+ 6 - 1
src/views/production-safety/safetyTrainingAndEducation/educationTrainingPlanManagement/components/educationTrainingPlanManagementDetail.vue

@@ -58,7 +58,7 @@
       <el-form-item label="培训责任部门:" prop="responsibleDeptIds">
         <el-cascader
           v-model="form.responsibleDeptIds"
-          :options="deptTree"
+          :options="deptTreeOne"
           :props="cascaderProp"
           clearable
           collapse-tags
@@ -167,9 +167,14 @@ import { downloadFile } from '@/views/disaster/utils';
 
   // 获取级联部门数据
   const deptTree = ref<DeptTree[]>();
+  const deptTreeOne = ref<DeptTree[]>();
   const loadDeptTreeData = async () => {
     const result = await getAllDepartments();
     deptTree.value = result[0].children;
+    deptTreeOne.value = result?.[0]?.children.map(item => ({
+        ...item,
+        children: []
+    }));
   };
   const fileList = ref([])
   // 表单引用

+ 9 - 5
src/views/production-safety/safetyTrainingAndEducation/employeeTrainingRecordCardManagement/employeeTrainingRecordCardManagementEdit.vue

@@ -63,8 +63,11 @@
               ref="staffImgRef"
               action="#"
               :file-list="staffImgList"
+              :limit="1"
+              :on-exceed="handleImageExceed"
               :disabled="isViewMode"
               :auto-upload="false"
+              :multiple="false"
               accept="image/*"
               :on-change="handleImageUploadChange"
               :on-remove="handlePictureCardDelete"
@@ -208,15 +211,16 @@
   const getDetail = async () => {
     if (!currentId.value) return;
     try {
-      const res = await getEducationStaffTrainingCardDetail(currentId.value);
+      const res: any = await getEducationStaffTrainingCardDetail(currentId.value);
       if (res) {
         Object.assign(form, {
           ...res,
-          deptIdForSelect: parseLastDeptId((res as FormDataType).deptId),
+          deptIdForSelect: parseLastDeptId(res.deptId),
         });
-        if(res.staffImg){
-            form.staffImg = JSON.parse(res.staffImg)
-            staffImgList.value = JSON.parse(res.staffImg) || []
+        if (res.staffImg) {
+          const parsedStaffImg = JSON.parse(res.staffImg);
+          form.staffImg = parsedStaffImg;
+          staffImgList.value = parsedStaffImg || [];
         }
       }
     } catch (e) {