sunqijun 3 месяцев назад
Родитель
Сommit
20ad6491a6

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

@@ -144,6 +144,22 @@ export function safetyResponsibilityAdminIssuedSafety(params) {
   });
   });
 }
 }
 
 
+
+/**
+ * 批量签收安全责任书(部门端)
+ * @param params - 批量签收参数,如签收对象(部门/人员)、签收日期等
+ * @returns Promise<void>
+ */
+export function safetyResponsibilityDeptBatchSign(params) {
+  return http.request({
+    url: '/safetyResponsibility/dept/batchSign',
+    method: 'post',
+    params
+  });
+}
+
+
+
 /**
 /**
  * 查询安全责任书详情(部门端)
  * 查询安全责任书详情(部门端)
  * @param params - 查询参数,通常包含 id
  * @param params - 查询参数,通常包含 id
@@ -420,6 +436,8 @@ export function safetyNoticeAdminScrap(id) {
   });
   });
 }
 }
 
 
+
+
 /**
 /**
  * 管理端导出安全通知的已下发对象列表(如接收部门/人员清单)
  * 管理端导出安全通知的已下发对象列表(如接收部门/人员清单)
  * @returns Promise<Blob> Excel 或 CSV 文件的二进制流,用于下载
  * @returns Promise<Blob> Excel 或 CSV 文件的二进制流,用于下载

+ 2 - 6
src/components/UploadFiles/UploadFiles.vue

@@ -40,11 +40,7 @@
           <img :src="FILE_TYPE_ICON[file.fileType as keyof typeof FILE_TYPE_ICON]" />
           <img :src="FILE_TYPE_ICON[file.fileType as keyof typeof FILE_TYPE_ICON]" />
           <span class="file-name">{{ file.fileName }}</span>
           <span class="file-name">{{ file.fileName }}</span>
         </div>
         </div>
-        <el-icon 
-          v-if="!props.disabled"
-          class="delete-button" 
-          @click="removeFile(file.fileId)"
-        >
+        <el-icon v-if="!props.disabled" class="delete-button" @click="removeFile(file.fileId)">
           <Delete />
           <Delete />
         </el-icon>
         </el-icon>
       </div>
       </div>
@@ -86,7 +82,7 @@
   });
   });
 
 
   const isUploadDisabled = computed(() => {
   const isUploadDisabled = computed(() => {
-    return  fileList.value.length >= MAX_COUNT.value;
+    return props.disabled || fileList.value.length >= MAX_COUNT.value;
   });
   });
 
 
   // 检查文件是否已存在
   // 检查文件是否已存在

+ 1 - 2
src/views/emergency/emergency-drill/components/DrillPlanExecuteForm.vue

@@ -30,8 +30,7 @@
           :show-all-levels="false"
           :show-all-levels="false"
           :max-collapse-tags="3"
           :max-collapse-tags="3"
           placeholder="请选择演练部门"
           placeholder="请选择演练部门"
-        >
-        </el-cascader>
+        />
       </template>
       </template>
       <template #drillScript>
       <template #drillScript>
         <UploadFiles
         <UploadFiles

+ 32 - 12
src/views/production-safety/implement-safety-duty/components/IssueSafetyResponsibility.vue

@@ -7,9 +7,10 @@
     @close="clearData"
     @close="clearData"
   >
   >
     <el-form label-width="auto" :model="formData" ref="ruleFormRef" :rules="rules">
     <el-form label-width="auto" :model="formData" ref="ruleFormRef" :rules="rules">
-      <!-- <el-form-item label="下发部门名称" prop="deptId">
+      <el-form-item label="下发部门名称" prop="deptId">
         <el-cascader
         <el-cascader
-          ref="cascadeRef"
+          :disabled="currentDepartmentKey === 'A'"
+          ref="cascaderRef"
           style="width: 100%"
           style="width: 100%"
           size="large"
           size="large"
           v-model="formData.deptId"
           v-model="formData.deptId"
@@ -18,9 +19,8 @@
           :show-all-levels="false"
           :show-all-levels="false"
           placeholder="请选择下发部门"
           placeholder="请选择下发部门"
           clearable
           clearable
-          @change="handleDeptChange"
         />
         />
-      </el-form-item> -->
+      </el-form-item>
 
 
       <el-form-item label="下发分组名称" prop="userGroupId">
       <el-form-item label="下发分组名称" prop="userGroupId">
         <el-select
         <el-select
@@ -115,7 +115,7 @@
           </el-select>
           </el-select>
         </el-form-item>
         </el-form-item>
       </template>
       </template>
-      <template v-if="currentDepartmentKey === 'C'">
+      <!-- <template v-if="currentDepartmentKey === 'C'">
         <el-form-item label="党委书记" prop="leader1">
         <el-form-item label="党委书记" prop="leader1">
           <el-select
           <el-select
             size="large"
             size="large"
@@ -142,8 +142,8 @@
             <el-option v-for="l in userList.leader2List" :key="l.value" :label="l.label" :value="l.value" />
             <el-option v-for="l in userList.leader2List" :key="l.value" :label="l.label" :value="l.value" />
           </el-select>
           </el-select>
         </el-form-item>
         </el-form-item>
-      </template>
-      <template v-if="currentDepartmentKey === 'D'">
+      </template> -->
+      <!-- <template v-if="currentDepartmentKey === 'D'">
         <el-form-item label="部门负责人" prop="leader1">
         <el-form-item label="部门负责人" prop="leader1">
           <el-select
           <el-select
             size="large"
             size="large"
@@ -157,7 +157,7 @@
             <el-option v-for="l in userList.leader1List" :key="l.value" :label="l.label" :value="l.value" />
             <el-option v-for="l in userList.leader1List" :key="l.value" :label="l.label" :value="l.value" />
           </el-select>
           </el-select>
         </el-form-item>
         </el-form-item>
-      </template>
+      </template> -->
 
 
       <el-form-item label="计划开始日期" prop="planStartTime">
       <el-form-item label="计划开始日期" prop="planStartTime">
         <el-date-picker
         <el-date-picker
@@ -201,6 +201,7 @@
   import type { FormInstance } from 'element-plus';
   import type { FormInstance } from 'element-plus';
   import dayjs from 'dayjs';
   import dayjs from 'dayjs';
   import { queryAvailableUserList } from '@/api/production-safety/responsibility-implementation';
   import { queryAvailableUserList } from '@/api/production-safety/responsibility-implementation';
+  import { de } from 'element-plus/es/locale';
 
 
   const props = defineProps<{
   const props = defineProps<{
     modelValue: boolean;
     modelValue: boolean;
@@ -212,7 +213,7 @@
   const emit = defineEmits(['close', 'submit', 'update:modelValue']);
   const emit = defineEmits(['close', 'submit', 'update:modelValue']);
   const submitLoading = ref(false);
   const submitLoading = ref(false);
   const ruleFormRef = ref<FormInstance>();
   const ruleFormRef = ref<FormInstance>();
-
+  const cascaderRef = ref<any>();
   const userList = reactive<{
   const userList = reactive<{
     [key: string]: any[];
     [key: string]: any[];
   }>({
   }>({
@@ -230,12 +231,25 @@
     planStartTime: null,
     planStartTime: null,
     planEndTime: null,
     planEndTime: null,
     isUrgent: 0,
     isUrgent: 0,
+    deptId: [],
   });
   });
 
 
+  const cascaderProp = {
+    expandTrigger: 'click',
+    checkStrictly: false,
+    value: 'id',
+    label: 'deptName',
+    multiple: true,
+  };
+
   watch(
   watch(
-    () => props.currentDepartmentKey,
-    (a) => {
-      if (!a) return;
+    () => [props.currentDepartmentKey, props.departmentOptions],
+    ([currentDepartmentKey, departmentOptions]) => {
+      if (!currentDepartmentKey) return;
+      console.log('departmentOptions:', departmentOptions);
+      // if (currentDepartmentKey === 'A') {
+      //   const id = departmentOptions.find((d) => d.deptName === '院领导');
+      // }
       formData.leader1 = null;
       formData.leader1 = null;
       formData.leader2 = null;
       formData.leader2 = null;
       formData.signPerson = [];
       formData.signPerson = [];
@@ -256,6 +270,12 @@
     getUserData(dataName, query);
     getUserData(dataName, query);
   };
   };
 
 
+  // const handleChangeDept = (val) => {
+  //   const cascader = cascaderRef.value;
+  //   const deptInfo = cascader?.getCheckedNodes();
+  //   console.log(deptInfo);
+  // };
+
   const rules = reactive({
   const rules = reactive({
     deptId: [{ required: true, message: '请选择下发部门', trigger: 'change' }],
     deptId: [{ required: true, message: '请选择下发部门', trigger: 'change' }],
     userGroupId: [{ required: true, message: '请选择下发分组', trigger: 'change' }],
     userGroupId: [{ required: true, message: '请选择下发分组', trigger: 'change' }],

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

@@ -63,22 +63,29 @@
           <el-button @click="handleRestParams">重置</el-button>
           <el-button @click="handleRestParams">重置</el-button>
         </div>
         </div>
       </div>
       </div>
+      <div style="margin-bottom: 20px">
+        <el-button type="primary" @click="handleOpenBatchSign">批量签署</el-button>
+      </div>
 
 
       <div class="table-content">
       <div class="table-content">
-        <el-table :data="tableData.data">
+        <el-table ref="multipleTableRef" :data="tableData.data" @selection-change="handleSelectionChange">
+          <el-table-column type="selection" :selectable="selectable" width="55" />
           <el-table-column label="责任书名称" prop="responsibilityName" width="180" />
           <el-table-column label="责任书名称" prop="responsibilityName" width="180" />
           <el-table-column label="状态" prop="statusName" width="100" />
           <el-table-column label="状态" prop="statusName" width="100" />
-          <el-table-column label="所属部门" prop="departmentName" width="180" />
+          <el-table-column label="类别" prop="departmentName" width="180" />
           <el-table-column label="下发数" prop="issuedQuantity" width="120" />
           <el-table-column label="下发数" prop="issuedQuantity" width="120" />
           <el-table-column label="签署人数" prop="signedQuantity" width="120" />
           <el-table-column label="签署人数" prop="signedQuantity" width="120" />
           <el-table-column label="签署比例" prop="signedRatio" width="120" />
           <el-table-column label="签署比例" prop="signedRatio" width="120" />
           <el-table-column label="分组名称" prop="userGroupName" width="150" />
           <el-table-column label="分组名称" prop="userGroupName" width="150" />
           <el-table-column label="计划完成时间" prop="planEndTime" width="150" />
           <el-table-column label="计划完成时间" prop="planEndTime" width="150" />
-          <el-table-column fixed="right" min-width="300" label="操作">
+          <el-table-column fixed="right" min-width="200" label="操作">
             <template #default="scope">
             <template #default="scope">
               <div style="display: flex">
               <div style="display: flex">
                 <el-button
                 <el-button
-                  v-if="scope.row.status === 2"
+                  v-if="
+                    scope.row.status === 2 &&
+                    (scope.row.departmentName !== '员工' || scope.row.departmentName !== '常驻供应商')
+                  "
                   type="primary"
                   type="primary"
                   link
                   link
                   @click="
                   @click="
@@ -90,8 +97,20 @@
                       },
                       },
                     })
                     })
                   "
                   "
-                  >签署</el-button
                 >
                 >
+                  签署
+                </el-button>
+                <el-button
+                  v-if="
+                    scope.row.status === 2 &&
+                    (scope.row.departmentName === '员工' || scope.row.departmentName === '常驻供应商')
+                  "
+                  type="primary"
+                  link
+                  @click="handleConfirm(scope)"
+                >
+                  确认
+                </el-button>
                 <el-dropdown trigger="click">
                 <el-dropdown trigger="click">
                   <el-button type="primary" link>反馈</el-button>
                   <el-button type="primary" link>反馈</el-button>
                   <template #dropdown>
                   <template #dropdown>
@@ -141,12 +160,25 @@
       </div>
       </div>
     </main>
     </main>
   </div>
   </div>
-  <IssueSafetyResponsibility
+  <!-- <IssueSafetyResponsibility
     :groupList="groupList"
     :groupList="groupList"
     :currentRowData="currentRowData"
     :currentRowData="currentRowData"
     ref="issueSafetyResponsibilityRef"
     ref="issueSafetyResponsibilityRef"
     @submit="handleSubmit"
     @submit="handleSubmit"
-  />
+  /> -->
+  <el-dialog title="批量签署" v-if="batchSignDialogVisible" v-model="batchSignDialogVisible" width="600">
+    <el-form-item label="">
+      <UploadFiles label="上传附件" :maxCount="1" @uploadSuccess="handleUploadSuccess" :fileList="attachment" />
+    </el-form-item>
+    <template #footer>
+      <div class="dialog-footer">
+        <el-button @click="handleCloseBatchSign">取消</el-button>
+        <el-button type="primary" @click="handleSafetyResponsibilityDeptBatchSign" :loading="submitLoading">
+          保存
+        </el-button>
+      </div>
+    </template>
+  </el-dialog>
 </template>
 </template>
 <script lang="ts" setup>
 <script lang="ts" setup>
   import { onMounted, ref, reactive } from 'vue';
   import { onMounted, ref, reactive } from 'vue';
@@ -157,18 +189,25 @@
     safetyResponsibilityDeptQueryPage,
     safetyResponsibilityDeptQueryPage,
     safetyResponsibilityAdminDelete,
     safetyResponsibilityAdminDelete,
     safetyResponsibilityAdminIssuedSafety,
     safetyResponsibilityAdminIssuedSafety,
+    safetyResponsibilityDeptSignOrFeedback,
+    safetyResponsibilityDeptBatchSign,
   } from '@/api/production-safety/responsibility-implementation';
   } from '@/api/production-safety/responsibility-implementation';
   import { omit } from 'lodash-es';
   import { omit } from 'lodash-es';
   import { queryUserGroupPage } from '@/api/system/person-group';
   import { queryUserGroupPage } from '@/api/system/person-group';
+  import { formatAttachmentList } from '@/components/UploadFiles/utils';
+
+  import UploadFiles from '@/components/UploadFiles/UploadFiles.vue';
 
 
   import { unformatAttachment } from '@/components/UploadFiles/utils';
   import { unformatAttachment } from '@/components/UploadFiles/utils';
   import { downloadFile } from '@/views/disaster/utils';
   import { downloadFile } from '@/views/disaster/utils';
-  import IssueSafetyResponsibility from './components/IssueSafetyResponsibility.vue';
+  import { el } from 'element-plus/es/locale';
+  // import IssueSafetyResponsibility from './components/IssueSafetyResponsibility.vue';
   const router = useRouter();
   const router = useRouter();
-  const issueSafetyResponsibilityRef = ref<any>(null);
-  const currentRowData = ref<any>(null);
+  const batchSignDialogVisible = ref(false);
+  const selectedRows = ref([]);
   const activeTab = ref('');
   const activeTab = ref('');
   const groupList = ref<any[]>([]);
   const groupList = ref<any[]>([]);
+  const submitLoading = ref(false);
   const queryParams = reactive<any>({
   const queryParams = reactive<any>({
     pageNumber: 1,
     pageNumber: 1,
     pageSize: 10,
     pageSize: 10,
@@ -180,12 +219,27 @@
       responsibilityPersonId: '',
       responsibilityPersonId: '',
     },
     },
   });
   });
-
+  const multipleTableRef = ref<any>();
   const tableData = reactive({
   const tableData = reactive({
     data: [],
     data: [],
     total: 0,
     total: 0,
   });
   });
 
 
+  const attachment = ref<any[]>([]);
+
+  const selectable = (row) => {
+    return row.status === 2 && (row.departmentName !== '员工' || row.departmentName !== '常驻供应商');
+  };
+
+  const handleSelectionChange = (val) => {
+    selectedRows.value = val;
+    console.log('当前勾选的数据:', selectedRows.value);
+  };
+
+  const handleUploadSuccess = (fileList) => {
+    attachment.value = fileList;
+  };
+
   const handleQueryUserGroupPage = () => {
   const handleQueryUserGroupPage = () => {
     queryUserGroupPage({
     queryUserGroupPage({
       pageNumber: 1,
       pageNumber: 1,
@@ -195,11 +249,65 @@
     });
     });
   };
   };
 
 
-  const handleIssueSafetyResponsibility = (scope) => {
-    currentRowData.value = scope.row;
-    issueSafetyResponsibilityRef.value.dialogShow();
+  const handleOpenBatchSign = () => {
+    if (!selectedRows.value.length) {
+      ElMessage.warning('请选择需要批量签署的责任书');
+      return;
+    }
+    if (!selectedRows.value.every((item: any, i, data: any[]) => item.departmentName === data[0]?.departmentName)) {
+      ElMessage.warning('请选择相同类别的责任书');
+      return;
+    }
+    batchSignDialogVisible.value = true;
+  };
+
+  const handleCloseBatchSign = () => {
+    attachment.value = [];
+    selectedRows.value = [];
+    batchSignDialogVisible.value = false;
+    multipleTableRef.value.clearSelection();
+  };
+
+  const handleSafetyResponsibilityDeptBatchSign = async () => {
+    if (!attachment.value.length) {
+      ElMessage.warning('请上传附件');
+      return;
+    }
+    submitLoading.value = true;
+
+    const attachments = await formatAttachmentList(attachment.value);
+    safetyResponsibilityDeptBatchSign({
+      ids: selectedRows.value.map((item: any) => item.id)?.join(','),
+      attachment: JSON.stringify(attachments),
+    })
+      .then(() => {
+        ElMessage.success('批量签署成功');
+        queryTableList();
+        handleCloseBatchSign();
+      })
+      .finally(() => {
+        submitLoading.value = false;
+      });
   };
   };
 
 
+  const handleConfirm = (scope) => {
+    safetyResponsibilityDeptSignOrFeedback({
+      id: scope.row.id,
+      updateType: 0,
+    })
+      .then(() => {
+        ElMessage.success('确认成功');
+        router.push({
+          name: 'responsibilityAgreeManageDept',
+        });
+      })
+      .finally(() => {});
+  };
+  // const handleIssueSafetyResponsibility = (scope) => {
+  //   currentRowData.value = scope.row;
+  //   issueSafetyResponsibilityRef.value.dialogShow();
+  // };
+
   const handleSizeChange = (value) => {};
   const handleSizeChange = (value) => {};
   const handleCurrentChange = (value) => {
   const handleCurrentChange = (value) => {
     queryParams.pageNumber = value;
     queryParams.pageNumber = value;
@@ -212,12 +320,12 @@
       downloadFile(item.fileUrl, item.fileName);
       downloadFile(item.fileUrl, item.fileName);
     });
     });
   };
   };
-  const handleConfirmDeleteRow = (scope) => {
-    safetyResponsibilityAdminDelete(scope.row.id).then(() => {
-      ElMessage.success('删除成功!');
-      queryTableList();
-    });
-  };
+  // const handleConfirmDeleteRow = (scope) => {
+  //   safetyResponsibilityAdminDelete(scope.row.id).then(() => {
+  //     ElMessage.success('删除成功!');
+  //     queryTableList();
+  //   });
+  // };
   const queryTableList = () => {
   const queryTableList = () => {
     safetyResponsibilityDeptQueryPage({
     safetyResponsibilityDeptQueryPage({
       ...queryParams,
       ...queryParams,
@@ -250,24 +358,24 @@
     queryTableList();
     queryTableList();
   };
   };
 
 
-  const handleSubmit = (formData) => {
-    issueSafetyResponsibilityRef.value.submitLoading = true;
-    safetyResponsibilityAdminIssuedSafety({
-      ...formData,
-      userGroupId: formData.userGroupId.join(','),
-      // planStartTime: dayjs(formData.planStartTime).format('YYYY-MM-DD'),
-      // planEndTime: dayjs(formData.planEndTime).format('YYYY-MM-DD'),
-      id: currentRowData.value.id,
-    })
-      .then(() => {
-        queryTableList();
-        issueSafetyResponsibilityRef.value.dialogHide();
-        currentRowData.value = {};
-      })
-      .finally(() => {
-        issueSafetyResponsibilityRef.value.submitLoading = false;
-      });
-  };
+  // const handleSubmit = (formData) => {
+  //   issueSafetyResponsibilityRef.value.submitLoading = true;
+  //   safetyResponsibilityAdminIssuedSafety({
+  //     ...formData,
+  //     userGroupId: formData.userGroupId.join(','),
+  //     // planStartTime: dayjs(formData.planStartTime).format('YYYY-MM-DD'),
+  //     // planEndTime: dayjs(formData.planEndTime).format('YYYY-MM-DD'),
+  //     id: currentRowData.value.id,
+  //   })
+  //     .then(() => {
+  //       queryTableList();
+  //       issueSafetyResponsibilityRef.value.dialogHide();
+  //       currentRowData.value = {};
+  //     })
+  //     .finally(() => {
+  //       issueSafetyResponsibilityRef.value.submitLoading = false;
+  //     });
+  // };
 
 
   onMounted(async () => {
   onMounted(async () => {
     await handleQueryUserGroupPage();
     await handleQueryUserGroupPage();

+ 17 - 10
src/views/production-safety/implement-safety-duty/responsibility-agree-manage.vue

@@ -101,7 +101,7 @@
               >
               >
                 编辑
                 编辑
               </el-button>
               </el-button>
-              <el-button v-if="scope.row.status === 4">审核</el-button>
+              <!-- <el-button v-if="scope.row.status === 4">审核</el-button> -->
               <el-popconfirm
               <el-popconfirm
                 v-if="scope.row.status === 1 || scope.row.status === 6"
                 v-if="scope.row.status === 1 || scope.row.status === 6"
                 title="确定要删除吗?"
                 title="确定要删除吗?"
@@ -207,18 +207,23 @@
   const deptsOptions = ref<any[]>([]);
   const deptsOptions = ref<any[]>([]);
 
 
   const filterDeptsByLevel = (data, maxLevel, level = 1) => {
   const filterDeptsByLevel = (data, maxLevel, level = 1) => {
-    if (!data) return [];
-    const newData = [...data];
-    return newData.map((item) => {
+    if (!data || !Array.isArray(data)) return [];
+
+    return data.map((item) => {
       const { children, ...rest } = item;
       const { children, ...rest } = item;
-      return level >= maxLevel
-        ? rest
-        : {
-            ...rest,
-            children: filterDeptsByLevel(children, maxLevel, level + 1),
-          };
+      if (level < maxLevel && children.length > 0) {
+        return {
+          ...item,
+          children: filterDeptsByLevel(children, maxLevel, level + 1),
+        };
+      }
+      if (level < maxLevel) {
+        return { ...rest, disabled: true };
+      }
+      return rest;
     });
     });
   };
   };
+
   const currentDepartmentKey = computed(() => {
   const currentDepartmentKey = computed(() => {
     switch (currentRowData.value.departmentName) {
     switch (currentRowData.value.departmentName) {
       case '院领导':
       case '院领导':
@@ -323,12 +328,14 @@
 
 
   const handleSubmit = (formData, submitLoading) => {
   const handleSubmit = (formData, submitLoading) => {
     submitLoading.value = true;
     submitLoading.value = true;
+
     safetyResponsibilityAdminIssuedSafety({
     safetyResponsibilityAdminIssuedSafety({
       ...formData,
       ...formData,
       adminId: currentRowData.value.id,
       adminId: currentRowData.value.id,
       userGroupId: formData.userGroupId.join(','),
       userGroupId: formData.userGroupId.join(','),
       deptId: JSON.stringify(formData.deptId),
       deptId: JSON.stringify(formData.deptId),
       signPerson: formData.signPerson.join(','),
       signPerson: formData.signPerson.join(','),
+      departmentId: formData.deptId.map((item) => item[item.length - 1]).join(','),
     })
     })
       .then(() => {
       .then(() => {
         queryTableList();
         queryTableList();

+ 109 - 96
src/views/production-safety/implement-safety-duty/sign-agree-dept.vue

@@ -75,96 +75,62 @@
             </div>
             </div>
           </div>
           </div>
         </div>
         </div>
-        <template v-if="!isSignsUpload">
-          <h4>责任书签署文件</h4>
-          <div class="detail-ct">
-            <div class="row">
-              <div class="col">
-                <div class="label">责任书文档:</div>
-                <div class="value value-s1">
-                  <div class="file-list">
-                    <div class="file-item" v-for="item in formData.signsUpload" :key="item.fileId">
-                      <span class="file-item--name">{{ item.fileName }}</span>
-                      <div class="file-item--footer">
-                        <!-- <div class="info">
-                        <span>{{ item.fileSize }}</span>
-                      </div> -->
-                        <el-button link type="primary" @click="previewOnline(item.fileUrl, item.fileType)"
-                          >预览</el-button
-                        >
-                        <el-button link type="primary" @click.stop="downloadFile(item.fileUrl, item.fileName)"
-                          >下载</el-button
-                        >
-                      </div>
-                    </div>
-                  </div>
-                </div>
-              </div>
+        <template v-if="signRecords.level1.length">
+          <h3 v-if="currentDepartmentKey === 'A'"> 副院长签署 </h3>
+          <h3 v-if="currentDepartmentKey === 'B'"> 负责人签署 </h3>
+          <h3 v-if="currentDepartmentKey === 'C'"> 负责人签署 </h3>
+          <h3 v-if="currentDepartmentKey === 'D'"> 科室负责人签署 </h3>
+          <div class="table table-level1" v-for="item in signRecords.level1" :key="item.id">
+            <div class="label">签名:</div>
+            <div class="value">
+              <el-form-item prop="signer">
+                <UploadFiles
+                  :disabled="!item.signFlag"
+                  label="上传文件"
+                  ref="uploadFilesRef"
+                  :fileList="item.attachment"
+                  @upload-success="(fileList) => handleUploadSignsUploadSuccess(item, fileList)"
+                />
+              </el-form-item>
             </div>
             </div>
           </div>
           </div>
         </template>
         </template>
-        <template v-if="isSignsUpload">
-          <h4>签署材料上传</h4>
-
-          <div class="detail-ct">
-            <div class="row">
-              <div class="col">
-                <div class="label">上传附件:</div>
-                <div class="value value-s1">
-                  <el-form-item prop="signsUpload">
-                    <UploadFiles
-                      label="上传附件"
-                      @uploadSuccess="handleUploadSignsUploadSuccess"
-                      :fileList="formData.signsUpload"
-                    />
-                  </el-form-item>
-                  <!-- <div class="file-list" v-if="formData.signsUpload.length">
-                  <div class="file-item" v-for="item in formData.signsUpload" :key="item.fileId">
-                    <span class="file-item--name">{{ item.fileName }}</span>
-                    <div class="file-item--footer">
-                      <el-button link type="primary" @click="previewOnline(item.fileUrl, item.fileType)"
-                        >预览</el-button
-                      >
-                      <el-button link type="primary" @click.stop="downloadFile(item.fileUrl, item.fileName)"
-                        >下载</el-button
-                      >
-                    </div>
-                  </div>
-                </div> -->
-                </div>
-              </div>
+        <template v-if="signRecords.level2.length">
+          <h3 v-if="currentDepartmentKey === 'A'"> 党委书记签署 </h3>
+          <h3 v-if="currentDepartmentKey === 'B'"> 党委书记签署 </h3>
+          <h3 v-if="currentDepartmentKey === 'C'"> 党委书记签署</h3>
+          <h3 v-if="currentDepartmentKey === 'D'"> 部门负责人签署 </h3>
+          <div class="table table-level2" v-for="item in signRecords.level2" :key="item.id">
+            <div class="label">签名:</div>
+            <div class="value">
+              <el-form-item prop="signer">
+                <UploadFiles
+                  :disabled="!item.signFlag"
+                  label="上传文件"
+                  ref="uploadFilesRef"
+                  :fileList="item.attachment"
+                  @upload-success="handleUploadSignsUploadSuccess"
+                />
+              </el-form-item>
             </div>
             </div>
           </div>
           </div>
         </template>
         </template>
-        <template v-else>
-          <h4>材料上传</h4>
-          <div class="detail-ct">
-            <div class="row">
-              <div class="col">
-                <div class="label">上传附件:</div>
-                <div class="value value-s1">
-                  <el-form-item prop="feedback">
-                    <UploadFiles
-                      label="上传附件"
-                      @uploadSuccess="handleUploadFeedbackUploadSuccess"
-                      :fileList="formData.feedback"
-                    />
-                  </el-form-item>
-                  <!-- <div class="file-list" v-if="formData.signsUpload.length">
-                  <div class="file-item" v-for="item in formData.signsUpload" :key="item.fileId">
-                    <span class="file-item--name">{{ item.fileName }}</span>
-                    <div class="file-item--footer">
-                      <el-button link type="primary" @click="previewOnline(item.fileUrl, item.fileType)"
-                        >预览</el-button
-                      >
-                      <el-button link type="primary" @click.stop="downloadFile(item.fileUrl, item.fileName)"
-                        >下载</el-button
-                      >
-                    </div>
-                  </div>
-                </div> -->
-                </div>
-              </div>
+        <template v-if="signRecords.level3.length">
+          <h3 v-if="currentDepartmentKey === 'A'"> 院长签署 </h3>
+          <h3 v-if="currentDepartmentKey === 'B'"> 院长签署 </h3>
+          <h3 v-if="currentDepartmentKey === 'C'"> 所长签署 </h3>
+          <div class="table table-level3" v-for="item in signRecords.level3" :key="item.id">
+            <div class="label">签名:</div>
+            <div class="value">
+              <el-form-item prop="signer">
+                <UploadFiles
+                  :disabled="item.signFlag"
+                  label="上传文件"
+                  ref="uploadFilesRef"
+                  :fileList="item.attachment"
+                  @upload-success="handleUploadSignsUploadSuccess"
+                />
+              </el-form-item>
             </div>
             </div>
           </div>
           </div>
         </template>
         </template>
@@ -179,7 +145,6 @@
 </template>
 </template>
 <script lang="ts" setup>
 <script lang="ts" setup>
   import { onMounted, ref, computed, reactive } from 'vue';
   import { onMounted, ref, computed, reactive } from 'vue';
-  import dayjs from 'dayjs';
   import { ElMessage } from 'element-plus';
   import { ElMessage } from 'element-plus';
   import '@wangeditor/editor/dist/css/style.css';
   import '@wangeditor/editor/dist/css/style.css';
   import { useRouter, useRoute } from 'vue-router';
   import { useRouter, useRoute } from 'vue-router';
@@ -213,6 +178,7 @@
     planStartTime: null,
     planStartTime: null,
     planEndTime: null,
     planEndTime: null,
     rejection: '',
     rejection: '',
+    signRecords: [],
   });
   });
 
 
   const rules = reactive({
   const rules = reactive({
@@ -223,6 +189,33 @@
       },
       },
     ],
     ],
   });
   });
+
+  const signRecords = computed(() => {
+    return {
+      level1: formData.signRecords.filter((item) => item.signLevel === 1),
+      level2: formData.signRecords.filter((item) => item.signLevel === 2),
+      level3: formData.signRecords.filter((item) => item.signLevel === 3),
+    };
+  });
+
+  const currentDepartmentKey = computed(() => {
+    switch (formData.departmentName.trim()) {
+      case '院领导':
+        return 'A';
+      case '所/中心/职能部门/直属研究部/分公司':
+        return 'B';
+      case '所/中心级部门':
+        return 'C';
+      case '科室':
+        return 'D';
+      case '员工':
+      case '常驻供应商':
+        return 'E';
+      default:
+        return 'default';
+    }
+  });
+
   const showAlertBar = computed(() => {
   const showAlertBar = computed(() => {
     if (!formData.rejection) {
     if (!formData.rejection) {
       return false;
       return false;
@@ -237,6 +230,11 @@
       previewOnlineRef.value?.open(url, type);
       previewOnlineRef.value?.open(url, type);
     }
     }
   };
   };
+  const handleUploadSignsUploadSuccess = (item, fileList) => {
+    item.attachment = fileList;
+    console.log('@@@', signRecords.value.level1);
+  };
+
   const handleSubmit = () => {
   const handleSubmit = () => {
     let signsUpload: any[] = [];
     let signsUpload: any[] = [];
     let feedback: any[] = [];
     let feedback: any[] = [];
@@ -269,16 +267,6 @@
     });
     });
   };
   };
 
 
-  const handleUploadSignsUploadSuccess = (fileList) => {
-    formData.signsUpload = fileList;
-    formRef.value.validateField('signsUpload');
-  };
-
-  const handleUploadFeedbackUploadSuccess = (fileList) => {
-    formData.feedback = fileList;
-    formRef.value.validateField('feedback');
-  };
-
   const handleQueryDetail = () => {
   const handleQueryDetail = () => {
     safetyResponsibilityDeptQueryDetail({
     safetyResponsibilityDeptQueryDetail({
       id: route.query.id,
       id: route.query.id,
@@ -287,13 +275,18 @@
         if (name in res) {
         if (name in res) {
           Object.assign(formData, {
           Object.assign(formData, {
             [name]: res[name],
             [name]: res[name],
+
             attachment: unformatAttachment(res.attachment),
             attachment: unformatAttachment(res.attachment),
             signsUpload: unformatAttachment(res.signsUpload),
             signsUpload: unformatAttachment(res.signsUpload),
             feedback: unformatAttachment(res.feedback),
             feedback: unformatAttachment(res.feedback),
+            signRecords: res.signRecords.map((item) => ({
+              ...item,
+              attachment: unformatAttachment(item.attachment),
+            })),
           });
           });
         }
         }
       });
       });
-      console.log(formData);
+      console.log('@formData:', formData);
     });
     });
   };
   };
 
 
@@ -362,6 +355,26 @@
       border-left: 1px solid rgb(220, 223, 230);
       border-left: 1px solid rgb(220, 223, 230);
     }
     }
   }
   }
+  .table {
+    display: flex;
+    align-items: stretch;
+    border: 1px solid rgb(220, 223, 230);
+    border-width: 1px 1px 0 1px;
+  }
+  .table .value {
+    display: flex;
+    align-items: center;
+    // (:deep).el-form-item {
+    //   margin-bottom: 0;
+    // }
+  }
+  .table .label {
+    display: flex;
+    align-items: center;
+    border-right: 1px solid rgb(220, 223, 230);
+    background-color: rgb(245, 247, 250);
+  }
+
   // :deep(.breadcrumb .title) {
   // :deep(.breadcrumb .title) {
   //   margin-left: 0;
   //   margin-left: 0;
   // }
   // }