Browse Source

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

xiaweibo 3 months ago
parent
commit
b28e77f7ea

+ 8 - 5
src/api/production-safety/index.ts

@@ -22,6 +22,7 @@ export interface EmployeeHazardReportDTO {
   attachment: string; // 附件 JSON
   attachment: string; // 附件 JSON
   status: number; // 状态:1-待审核,2-需求部门通过,3-需求部门驳回,4-安全部门通过,5-安全部门驳回,6-已入账,7-已关闭
   status: number; // 状态:1-待审核,2-需求部门通过,3-需求部门驳回,4-安全部门通过,5-安全部门驳回,6-已入账,7-已关闭
   statusName: string; // 状态名称
   statusName: string; // 状态名称
+  statusType?: number; // 状态类型:1-待审核,2-审核通过,3-审核不通过
   isRewardApplied: number; // 是否申请奖品:1-是,0-否
   isRewardApplied: number; // 是否申请奖品:1-是,0-否
   createdById: number; // 创建人 ID
   createdById: number; // 创建人 ID
   createdByName: string; // 创建人姓名
   createdByName: string; // 创建人姓名
@@ -58,13 +59,15 @@ export interface UpdateEmployeeHazardReportReq {
 
 
 // 查询条件
 // 查询条件
 export interface QueryEmployeeHazardReportReq {
 export interface QueryEmployeeHazardReportReq {
-  hazardDesc?: string; // 隐患问题描述(模糊查询)
-  status?: number; // 状态:1–7
-  sourceTypeName?: string; // 任务来源/提交类型名称(模糊查询)
-  startDate?: string; // 上报时间范围-开始
-  endDate?: string; // 上报时间范围-结束
+  keyword?: string; // 搜索隐患问题(支持全部非格式化字段关键词:隐患问题描述、隐患地点、姓名、工号、联系电话)
+  statusType?: number; // 隐患状态下拉:0或null=全部,1=待审核,2=审核通过,3=审核不通过
+  status?: number; // 状态精确值(1~7),与 statusType 二选一
+  sourceTypeName?: string; // 搜索任务来源(模糊查询)
+  startDate?: string; // 上报时间范围-开始日期(格式:YYYY-MM-DD)
+  endDate?: string; // 上报时间范围-结束日期(格式:YYYY-MM-DD)
   categoryId?: number; // 隐患类别 ID
   categoryId?: number; // 隐患类别 ID
   reporterJobNo?: string; // 上报人工号
   reporterJobNo?: string; // 上报人工号
+  hazardDesc?: string; // 仅按隐患问题描述查询(兼容用,建议使用 keyword)
 }
 }
 
 
 // 审核员工上报隐患
 // 审核员工上报隐患

+ 62 - 0
src/api/receiptRecord/index.ts

@@ -21,6 +21,9 @@ export interface ReceiptRecordItem {
   createdAt: string; // 创建时间
   createdAt: string; // 创建时间
   updatedAt: string; // 更新时间
   updatedAt: string; // 更新时间
   isDeleted: number; // 0-未删除,大于0(时间戳)-已删除
   isDeleted: number; // 0-未删除,大于0(时间戳)-已删除
+  templateId?: number; // 审批流程模板ID(可选,后端字段为 templateId)
+  approvalOrder?: number; // 审批顺序(管理员审核页使用)
+  rejectReson?: string; // 审核不通过原因(后端字段为 rejectReson)
 }
 }
 
 
 /**
 /**
@@ -42,6 +45,16 @@ export function queryClaimItemsLogs(query: QueryPageRequest<ReceiptRecordQueryPa
     data: query,
     data: query,
   });
   });
 }
 }
+/**
+ * 查询物品领取记录审批列表
+ */
+export function queryClaimItemsApprovalPage(query: QueryPageRequest<ReceiptRecordQueryParam>) {
+  return http.request<QueryPageResponse<ReceiptRecordItem>>({
+    url: '/claimItemsLog/queryClaimItemsApprovalPage',
+    method: 'post',
+    data: query,
+  });
+}
 
 
 /**
 /**
  * 保存物品领取记录请求参数
  * 保存物品领取记录请求参数
@@ -57,6 +70,7 @@ export interface SaveClaimItemsLogRequest {
   userName: string; // 领取人
   userName: string; // 领取人
   userId?: number; // 领取人ID
   userId?: number; // 领取人ID
   remark: string; // 备注
   remark: string; // 备注
+  templateId?: number; // 审批流程模板ID(后端字段为 templateId)
 }
 }
 
 
 /**
 /**
@@ -77,6 +91,54 @@ export interface UpdateClaimItemsLogRequest extends SaveClaimItemsLogRequest {
   id: number; // 记录ID
   id: number; // 记录ID
 }
 }
 
 
+/**
+ * 物品领取记录审批流程提交参数
+ * 参考应急预案审批流程参数结构
+ */
+export interface ReceiptRecordApprovalProcessParam {
+  claimItemsLogId: number; // 物品领取记录ID
+  approvalDescription: string; // 审批说明
+  approvalInfoList: {
+    approvalOrder: number; // 审批顺序
+    approverIdList: number[]; // 当前节点审批人ID列表
+  }[];
+}
+
+/**
+ * 提交物品领取记录审批流程
+ * (需要后端提供对应接口:/claimItemsLog/saveApprovalProcess)
+ */
+export function submitReceiptRecordApprovalProcess(data: ReceiptRecordApprovalProcessParam) {
+  return http.request({
+    url: '/claimItemsLog/saveApprovalProcess',
+    method: 'post',
+    data,
+  });
+}
+
+/**
+ * 物品领取记录单条审核入参
+ * 复用预案审批的审批入参结构
+ */
+export interface ReceiptRecordApprovalParam {
+  planId: number; // 预案id,这里复用为物品领取记录ID
+  approvalOrder: number; // 审批顺序
+  approvalStatus: number; // 审批状态: 1-待审批,2-已审批,3-退回
+  returnReason?: string; // 退回原因(请求字段为 returnReason)
+}
+
+/**
+ * 物品领取记录单条审核
+ * 接口:/claimItemsLog/saveApproval
+ */
+export function submitReceiptRecordApproval(data: ReceiptRecordApprovalParam) {
+  return http.request({
+    url: '/claimItemsLog/saveApproval',
+    method: 'post',
+    data,
+  });
+}
+
 /**
 /**
  * 更新物品领取记录(编辑)
  * 更新物品领取记录(编辑)
  */
  */

+ 14 - 0
src/router/routers/production-safety-router/safetyAssessment.ts

@@ -56,6 +56,20 @@
           noCache: false,
           noCache: false,
         },
         },
       },
       },
+      {
+        id: 9002102,
+        parentId: 90021,
+        name: 'ReceiptRecordAdministratorReview',
+        path: 'receipt-record-administrator-review',
+        component: '/production-safety/safetyAssessment/receiptRecord/receiptRecordAdministratorReview',
+        meta: {
+          title: '物品领取记录管理(管理员审核)',
+          icon: 'OverviewIcon',
+          isRoot: false,
+          hidden: true,
+          noCache: false,
+        },
+      },
       {
       {
         id: 9002101,
         id: 9002101,
         parentId: 90021,
         parentId: 90021,

+ 38 - 32
src/views/production-safety/hiddenTroubleInvestigationAndGovernance/employeeReportHiddenTroubleManagement/employeeReportHiddenTroubleManagement.vue

@@ -23,25 +23,22 @@
               <div class="select-box--item">
               <div class="select-box--item">
                 <span>隐患问题:</span>
                 <span>隐患问题:</span>
                 <el-input
                 <el-input
-                  v-model="tableQuery.queryParam.hazardDesc"
-                  placeholder="请输入隐患问题描述"
+                  v-model="tableQuery.queryParam.keyword"
+                  placeholder="请输入隐患问题、地点、姓名、工号或联系电话"
                   class="act-search-input"
                   class="act-search-input"
                 />
                 />
               </div>
               </div>
               <div class="select-box--item">
               <div class="select-box--item">
                 <span>状态:</span>
                 <span>状态:</span>
                 <el-select
                 <el-select
-                  v-model="tableQuery.queryParam.status"
+                  v-model="tableQuery.queryParam.statusType"
                   placeholder="请选择状态"
                   placeholder="请选择状态"
                   clearable
                   clearable
                 >
                 >
+                  <el-option label="全部" :value="0" />
                   <el-option label="待审核" :value="1" />
                   <el-option label="待审核" :value="1" />
-                  <el-option label="需求部门通过" :value="2" />
-                  <el-option label="需求部门驳回" :value="3" />
-                  <el-option label="安全部门通过" :value="4" />
-                  <el-option label="安全部门驳回" :value="5" />
-                  <el-option label="已入账" :value="6" />
-                  <el-option label="已关闭" :value="7" />
+                  <el-option label="审核通过" :value="2" />
+                  <el-option label="审核不通过" :value="3" />
                 </el-select>
                 </el-select>
               </div>
               </div>
               <div class="select-box--item">
               <div class="select-box--item">
@@ -70,23 +67,7 @@
           >
           >
             <template #status="scope">
             <template #status="scope">
               <span>
               <span>
-                {{
-                  scope.row.status === 1
-                    ? '待审核'
-                    : scope.row.status === 2
-                      ? '需求部门通过'
-                      : scope.row.status === 3
-                        ? '需求部门驳回'
-                        : scope.row.status === 4
-                          ? '安全部门通过'
-                          : scope.row.status === 5
-                            ? '安全部门驳回'
-                            : scope.row.status === 6
-                              ? '已入账'
-                              : scope.row.status === 7
-                                ? '已关闭'
-                                : '-'
-                }}
+                {{ getStatusTypeName(scope.row.statusType ?? getStatusType(scope.row.status)) }}
               </span>
               </span>
             </template>
             </template>
             <template #action="scope">
             <template #action="scope">
@@ -161,12 +142,37 @@
 
 
   const tableData = ref<HiddenDanger[]>([]);
   const tableData = ref<HiddenDanger[]>([]);
 
 
+  // 将 status (1-7) 转换为 statusType (1-3)
+  const getStatusType = (status: number): number => {
+    // statusType = 1: 待审核 (status = 1)
+    if (status === 1) {
+      return 1;
+    }
+    // statusType = 2: 审核通过 (status = 2, 4, 6)
+    if (status === 2 || status === 4 || status === 6) {
+      return 2;
+    }
+    // statusType = 3: 审核不通过 (status = 3, 5, 7)
+    if (status === 3 || status === 5 || status === 7) {
+      return 3;
+    }
+    return 0;
+  };
+
+  // 根据 statusType 显示文本:1=待审核,2=审核通过,3=审核不通过
+  const getStatusTypeName = (statusType: number): string => {
+    if (statusType === 1) return '待审核';
+    if (statusType === 2) return '审核通过';
+    if (statusType === 3) return '审核不通过';
+    return '-';
+  };
+
   const tableQuery = reactive<QueryPageRequest<QueryHiddenDangerReq>>({
   const tableQuery = reactive<QueryPageRequest<QueryHiddenDangerReq>>({
     pageNumber: pagination.pageNumber,
     pageNumber: pagination.pageNumber,
     pageSize: pagination.pageSize,
     pageSize: pagination.pageSize,
     queryParam: {
     queryParam: {
-      hazardDesc: '',
-      status: undefined,
+      keyword: '',
+      statusType: undefined,
       sourceTypeName: '',
       sourceTypeName: '',
     },
     },
   });
   });
@@ -208,8 +214,8 @@
   };
   };
 
 
   const handleReset = () => {
   const handleReset = () => {
-    tableQuery.queryParam.hazardDesc = '';
-    tableQuery.queryParam.status = undefined;
+    tableQuery.queryParam.keyword = '';
+    tableQuery.queryParam.statusType = undefined;
     tableQuery.queryParam.sourceTypeName = '';
     tableQuery.queryParam.sourceTypeName = '';
     handleSearch();
     handleSearch();
   };
   };
@@ -232,8 +238,8 @@
   const handleDownload = async () => {
   const handleDownload = async () => {
     try {
     try {
       const exportParams: QueryHiddenDangerReq = {
       const exportParams: QueryHiddenDangerReq = {
-        hazardDesc: tableQuery.queryParam.hazardDesc || undefined,
-        status: tableQuery.queryParam.status,
+        keyword: tableQuery.queryParam.keyword || undefined,
+        statusType: tableQuery.queryParam.statusType,
         sourceTypeName: tableQuery.queryParam.sourceTypeName || undefined,
         sourceTypeName: tableQuery.queryParam.sourceTypeName || undefined,
       };
       };
       const response = await exportHiddenDanger(exportParams);
       const response = await exportHiddenDanger(exportParams);

+ 8 - 14
src/views/production-safety/hiddenTroubleInvestigationAndGovernance/hiddenTroubleCategoryManagement/configs/tables.ts

@@ -10,10 +10,10 @@ export const TABLE_OPTIONS = {
 // 隐患类别管理表格列
 // 隐患类别管理表格列
 export const INVENTORY_TABLE_COLUMNS: TableColumnProps[] = [
 export const INVENTORY_TABLE_COLUMNS: TableColumnProps[] = [
   {
   {
-    label: '号',
-    type: 'index',
+    label: '号',
+    prop: 'id',
     align: 'center',
     align: 'center',
-    width: '80px',
+    width: '100px',
   },
   },
   {
   {
     label: '类别名称',
     label: '类别名称',
@@ -21,13 +21,6 @@ export const INVENTORY_TABLE_COLUMNS: TableColumnProps[] = [
     align: 'left',
     align: 'left',
     minWidth: '160px',
     minWidth: '160px',
   },
   },
-  {
-    label: '类别描述',
-    prop: 'description',
-    align: 'left',
-    minWidth: '200px',
-    showOverflowTooltip: true,
-  },
   {
   {
     label: '状态',
     label: '状态',
     prop: 'status',
     prop: 'status',
@@ -36,10 +29,11 @@ export const INVENTORY_TABLE_COLUMNS: TableColumnProps[] = [
     minWidth: '120px',
     minWidth: '120px',
   },
   },
   {
   {
-    label: '排序',
-    prop: 'sortOrder',
-    align: 'center',
-    minWidth: '100px',
+    label: '类别描述',
+    prop: 'description',
+    align: 'left',
+    minWidth: '200px',
+    showOverflowTooltip: true,
   },
   },
   {
   {
     label: '创建时间',
     label: '创建时间',

+ 1 - 1
src/views/production-safety/safetyAssessment/pointDeduction/configs/tables.ts

@@ -34,7 +34,7 @@ export const POINT_DEDUCTION_TABLE_COLUMNS: TableColumnProps[] = [
   },
   },
   {
   {
     label: '扣分原因',
     label: '扣分原因',
-    prop: 'dedResonList',
+    prop: 'dedResonList', 
     slot: 'dedResonList',
     slot: 'dedResonList',
     align: 'left',
     align: 'left',
     minWidth: '300px',
     minWidth: '300px',

+ 218 - 11
src/views/production-safety/safetyAssessment/receiptRecord/components/ReceiptRecordDetail.vue

@@ -52,6 +52,22 @@
           />
           />
         </el-select>
         </el-select>
       </template>
       </template>
+      <template #approvalTemplateId>
+        <el-select
+          v-model="ruleFormData.approvalTemplateId"
+          placeholder="请选择审批流程"
+          filterable
+          clearable
+          :disabled="isViewMode || isAuditMode"
+        >
+          <el-option
+            v-for="item in approvalList"
+            :key="item.id"
+            :label="item.templateName"
+            :value="item.id"
+          />
+        </el-select>
+      </template>
     </BasicForm>
     </BasicForm>
   </main>
   </main>
   <footer class="safety-platform-container__footer">
   <footer class="safety-platform-container__footer">
@@ -64,13 +80,72 @@
       {{ isCreateMode ? '提交' : '保存' }}
       {{ isCreateMode ? '提交' : '保存' }}
     </el-button>
     </el-button>
   </footer>
   </footer>
+  <BasicDialog
+    v-if="!isViewMode && !isAuditMode"
+    ref="basicDialogRef"
+    title="提交审批"
+    @refresh="closeApprovalDialog"
+  >
+    <template #form>
+      <div class="form">
+        <el-form ref="approvalFormRef" :model="approvalForm">
+          <el-form-item label="审批描述:" label-position="top">
+            <el-input v-model="approvalForm.description" placeholder="请输入审批描述" type="textarea" />
+          </el-form-item>
+          <div class="form-item">
+            <span>审批流程:</span>
+            <template v-for="item in approvalNodeList" :key="item.id">
+              <el-form-item
+                :label="`第${item.approvalOrder}步:${item.nodeDescription}(${APPROVAL_TYPE_MAP[item.approvalType]})`"
+                label-position="top"
+                :prop="item.approverType !== APPROVER_TYPE.FIX ? `approvers.${item.id}` : ''"
+                :rules="{ required: true, message: '请选择审批人员', trigger: 'change' }"
+              >
+                <el-input
+                  v-if="item.approverType === APPROVER_TYPE.FIX"
+                  :model-value="item.approverInfoList.map((info) => info.approverName).join(',')"
+                  disabled
+                ></el-input>
+                <el-select
+                  v-else
+                  v-model="approvalForm.approvers[item.id]"
+                  placeholder="请选择审批人员"
+                  value-key="id"
+                  filterable
+                  remote
+                  collapse-tags
+                  collapse-tags-tooltip
+                  :max-collapse-tags="2"
+                  :remote-method="remoteMethod"
+                  :loading="loading"
+                  multiple
+                >
+                  <el-option
+                    v-for="option in userOptions"
+                    :key="option.id"
+                    :label="`${option.realname}(${option.username})${option.deptName}`"
+                    :value="option.id"
+                  />
+                </el-select>
+              </el-form-item>
+            </template>
+          </div>
+        </el-form>
+      </div>
+    </template>
+    <template #footer>
+      <el-button type="primary" @click="handleSubmitApproval">提交</el-button>
+      <el-button @click="basicDialogRef?.closeDialog()">取消</el-button>
+    </template>
+  </BasicDialog>
 </template>
 </template>
 
 
 <script setup lang="ts">
 <script setup lang="ts">
-  import { computed, onMounted, ref } from 'vue';
+  import { computed, onMounted, ref, reactive } from 'vue';
   import { useRoute, useRouter } from 'vue-router';
   import { useRoute, useRouter } from 'vue-router';
   import { ElMessage } from 'element-plus';
   import { ElMessage } from 'element-plus';
   import BasicForm from '@/components/BasicForm.vue';
   import BasicForm from '@/components/BasicForm.vue';
+  import BasicDialog from '@/components/BasicDialog.vue';
   import { useFormConfigHook } from '@/hooks/useFormConfigHook';
   import { useFormConfigHook } from '@/hooks/useFormConfigHook';
   import {
   import {
     RECEIPT_RECORD_FORM_CONFIG,
     RECEIPT_RECORD_FORM_CONFIG,
@@ -84,12 +159,19 @@
     querInventoryManageList,
     querInventoryManageList,
     updateClaimItemsLogAgree,
     updateClaimItemsLogAgree,
     updateClaimItemsLogReject,
     updateClaimItemsLogReject,
+    submitReceiptRecordApprovalProcess,
   } from '@/api/receiptRecord';
   } from '@/api/receiptRecord';
   import type { InventoryItem } from '@/api/inventory';
   import type { InventoryItem } from '@/api/inventory';
   import { getAllDepartments } from '@/api/auth/dept';
   import { getAllDepartments } from '@/api/auth/dept';
   import type { DeptTree } from '@/types/dept/type';
   import type { DeptTree } from '@/types/dept/type';
   import { queryAvailableUserList } from '@/api/production-safety/responsibility-implementation';
   import { queryAvailableUserList } from '@/api/production-safety/responsibility-implementation';
   import type { UserLisItem } from '@/api/system/user-operate';
   import type { UserLisItem } from '@/api/system/user-operate';
+  import { getAllApproval } from '@/api/approval/approval';
+  import type { ApprovalInstanceType } from '@/views/system/approval/types';
+  import { useEmergencySuppliesHook } from '@/views/emergency/emergency-supplies/src/hook';
+  import type { ApprovalNodeInstanceType } from '@/views/system/approval/types';
+  import { getApprovalNodeInstanceList } from '@/api/approval/approval';
+  import { APPROVAL_TYPE_MAP, APPROVER_TYPE } from '@/views/emergency/emergency-plan/src/constant';
 
 
   const router = useRouter();
   const router = useRouter();
   const route = useRoute();
   const route = useRoute();
@@ -102,6 +184,9 @@
   const isViewMode = computed(() => operate.value === 'receiptRecord-view');
   const isViewMode = computed(() => operate.value === 'receiptRecord-view');
   const isAuditMode = computed(() => operate.value === 'receiptRecord-audit');
   const isAuditMode = computed(() => operate.value === 'receiptRecord-audit');
 
 
+  // 当前记录ID(用于提交审批)
+  const receiptRecordId = ref<number>();
+
   // 部门树(复用添加应急预案的制定部门数据源)
   // 部门树(复用添加应急预案的制定部门数据源)
   const cascaderRef = ref();
   const cascaderRef = ref();
   const deptTree = ref<DeptTree[]>([]);
   const deptTree = ref<DeptTree[]>([]);
@@ -125,7 +210,7 @@
     ruleFormData.department = nodes?.[0]?.label ?? '';
     ruleFormData.department = nodes?.[0]?.label ?? '';
     // 部门变化时,重新获取该部门的用户列表
     // 部门变化时,重新获取该部门的用户列表
     if (ruleFormData.deptId) {
     if (ruleFormData.deptId) {
-      getRecipientUserList(ruleFormData.deptId);
+      getRecipientUserList(ruleFormData.department);
     } else {
     } else {
       recipientUserList.value = [];
       recipientUserList.value = [];
       ruleFormData.recipientUserId = null;
       ruleFormData.recipientUserId = null;
@@ -168,13 +253,55 @@
     ruleFormData.recipient = selectedUser?.realname ?? '';
     ruleFormData.recipient = selectedUser?.realname ?? '';
   };
   };
 
 
+  // 审批流程列表(复用应急预案的审批模板)
+  const approvalList = ref<ApprovalInstanceType[]>([]);
+  const getApprovalList = async () => {
+    try {
+      const res = await getAllApproval();
+      approvalList.value = Array.isArray(res) ? res : [];
+    } catch (e) {
+      console.error('获取审批流程列表失败:', e);
+      approvalList.value = [];
+    }
+  };
+
   const { ruleFormData, formRules, ruleFormConfig, cloneRuleFormData, beforeRouteLeave } =
   const { ruleFormData, formRules, ruleFormConfig, cloneRuleFormData, beforeRouteLeave } =
     useFormConfigHook(RECEIPT_RECORD_FORM_CONFIG, RECEIPT_RECORD_FORM_DATA, RECEIPT_RECORD_FORM_RULES);
     useFormConfigHook(RECEIPT_RECORD_FORM_CONFIG, RECEIPT_RECORD_FORM_DATA, RECEIPT_RECORD_FORM_RULES);
 
 
+  // 提交审批弹窗相关
+  const basicDialogRef = ref<InstanceType<typeof BasicDialog>>();
+  const approvalFormRef = ref();
+  const approvalForm = reactive({
+    description: '',
+    approvers: {} as Record<number, any[]>,
+  });
+
+  const approvalNodeList = ref<ApprovalNodeInstanceType[]>([]);
+
+  const { userOptions, loading, remoteMethod } = useEmergencySuppliesHook();
+
+  const getApprovalNode = async (id: number) => {
+    const res = await getApprovalNodeInstanceList(id);
+    approvalNodeList.value = res.approvalNodeInfoList || [];
+  };
+
+  const resetApprovalForm = () => {
+    approvalFormRef.value?.resetFields();
+    approvalForm.description = '';
+  };
+
+  const closeApprovalDialog = () => {
+    resetApprovalForm();
+    basicDialogRef.value?.closeDialog();
+  };
+
   // 物品库存列表
   // 物品库存列表
   const inventoryList = ref<InventoryItem[]>([]);
   const inventoryList = ref<InventoryItem[]>([]);
 
 
-  // 查看模式下,所有字段设为只读
+  // 当前记录状态(用于控制“审核不通过原因”字段显示)
+  const currentStatus = ref<number | undefined>();
+
+  // 查看 / 审核模式下,所有字段设为只读
   const viewFormConfig = ref(
   const viewFormConfig = ref(
     RECEIPT_RECORD_FORM_CONFIG.map((item) => ({
     RECEIPT_RECORD_FORM_CONFIG.map((item) => ({
       ...item,
       ...item,
@@ -186,9 +313,32 @@
   );
   );
 
 
   const computedFormConfig = computed(() => {
   const computedFormConfig = computed(() => {
-    if (isViewMode.value || isAuditMode.value) {
-      return viewFormConfig.value;
+    // 新增时不展示“审核不通过原因”字段
+    if (isCreateMode.value) {
+      return ruleFormConfig.value.filter((item) => item.prop !== 'returnReason');
+    }
+
+    // 查看模式:仅在“审核不通过”时展示“审核不通过原因”字段
+    if (isViewMode.value) {
+      if (currentStatus.value === -1) {
+        return viewFormConfig.value;
+      }
+      return viewFormConfig.value.filter((item) => item.prop !== 'returnReason');
     }
     }
+
+    // 编辑模式:仅在“审核不通过”时展示“审核不通过原因”字段
+    if (isEditMode.value) {
+      if (currentStatus.value === -1) {
+        return ruleFormConfig.value;
+      }
+      return ruleFormConfig.value.filter((item) => item.prop !== 'returnReason');
+    }
+
+    // 审核模式:不展示“审核不通过原因”字段
+    if (isAuditMode.value) {
+      return viewFormConfig.value.filter((item) => item.prop !== 'returnReason');
+    }
+
     return ruleFormConfig.value;
     return ruleFormConfig.value;
   });
   });
 
 
@@ -223,6 +373,7 @@
     try {
     try {
       const res = await queryClaimItemsLogDetail(currentId.value);
       const res = await queryClaimItemsLogDetail(currentId.value);
       if (res) {
       if (res) {
+        currentStatus.value = res.status;
         ruleFormData.itemId = res.pimId;
         ruleFormData.itemId = res.pimId;
         ruleFormData.outboundDate = res.outStoreTime ? res.outStoreTime.split('T')[0] : '';
         ruleFormData.outboundDate = res.outStoreTime ? res.outStoreTime.split('T')[0] : '';
         ruleFormData.outboundQuantity = res.claimQty;
         ruleFormData.outboundQuantity = res.claimQty;
@@ -240,6 +391,10 @@
         } else {
         } else {
           ruleFormData.recipientUserId = null;
           ruleFormData.recipientUserId = null;
         }
         }
+        // 后端如返回审批模板ID,则回显(字段为 templateId)
+        ruleFormData.approvalTemplateId = res.templateId ?? null;
+        // 审核不通过原因(只读展示,后端字段为 rejectReson),仅在审核不通过时展示内容
+        ruleFormData.returnReason = res.status === -1 ? res.rejectReson ?? '' : '';
       }
       }
       cloneRuleFormData();
       cloneRuleFormData();
     } catch (e) {
     } catch (e) {
@@ -251,6 +406,10 @@
   const handleSubmit = async () => {
   const handleSubmit = async () => {
     const res = await handleValidate();
     const res = await handleValidate();
     if (!res) return;
     if (!res) return;
+
+    // 与应急预案保持一致的“添加/修改”提示文案
+    const message = isCreateMode.value ? '添加' : '修改';
+
     try {
     try {
       const selectedInventory = inventoryList.value.find((item) => item.id === ruleFormData.itemId);
       const selectedInventory = inventoryList.value.find((item) => item.id === ruleFormData.itemId);
       if (!selectedInventory) {
       if (!selectedInventory) {
@@ -277,26 +436,74 @@
         userName: selectedUser.realname,
         userName: selectedUser.realname,
         userId: selectedUser.id, // 领取人用户ID
         userId: selectedUser.id, // 领取人用户ID
         remark: '',
         remark: '',
+        // 审批流程ID在与后端交互时字段名为 templateId
+        templateId: ruleFormData.approvalTemplateId ?? undefined,
       };
       };
 
 
       if (isCreateMode.value) {
       if (isCreateMode.value) {
-        await saveClaimItemsLog(basePayload);
-        ElMessage.success('创建成功');
+        const createRes = await saveClaimItemsLog(basePayload);
+        // 兼容多种返回结构,优先使用数字ID
+        receiptRecordId.value =
+          typeof createRes === 'number'
+            ? createRes
+            : createRes && typeof createRes === 'object' && 'id' in createRes
+            ? (createRes as any).id
+            : undefined;
       } else if (isEditMode.value && currentId.value) {
       } else if (isEditMode.value && currentId.value) {
         await updateClaimItemsLog({
         await updateClaimItemsLog({
           id: currentId.value,
           id: currentId.value,
           ...basePayload,
           ...basePayload,
         });
         });
-        ElMessage.success('保存成功');
+        receiptRecordId.value = currentId.value;
+      }
+      ElMessage.success(`${message}成功`);
+      if (ruleFormData.approvalTemplateId) {
+        await getApprovalNode(ruleFormData.approvalTemplateId);
+        basicDialogRef.value?.openDialog();
       }
       }
-
-      router.back();
     } catch (e) {
     } catch (e) {
       console.error('保存物品领取记录失败:', e);
       console.error('保存物品领取记录失败:', e);
       ElMessage.error('保存失败,请重试');
       ElMessage.error('保存失败,请重试');
     }
     }
   };
   };
 
 
+  const handleSubmitApproval = () => {
+    approvalFormRef.value?.validate(async (valid: boolean) => {
+      if (!valid) return;
+      if (!receiptRecordId.value) {
+        ElMessage.error('缺少物品领取记录ID,无法提交审批');
+        return;
+      }
+
+      const approvalData = {
+        planId: receiptRecordId.value,
+        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,
+          };
+        }),
+      };
+
+      try {
+        await submitReceiptRecordApprovalProcess(approvalData);
+        ElMessage.success('提交成功');
+        closeApprovalDialog();
+        router.back();
+      } catch (e) {
+        console.error('提交审批失败:', e);
+        ElMessage.error('提交审批失败,请重试');
+      }
+    });
+  };
+
   const handleAuditPass = async () => {
   const handleAuditPass = async () => {
     if (!currentId.value) return;
     if (!currentId.value) return;
     try {
     try {
@@ -324,7 +531,7 @@
   onMounted(async () => {
   onMounted(async () => {
     cloneRuleFormData();
     cloneRuleFormData();
     beforeRouteLeave();
     beforeRouteLeave();
-    await Promise.all([getDeptTreeData(), getInventoryList()]);
+    await Promise.all([getDeptTreeData(), getInventoryList(), getApprovalList()]);
     if (isEditMode.value || isViewMode.value || isAuditMode.value) {
     if (isEditMode.value || isViewMode.value || isAuditMode.value) {
       await getDetail();
       await getDetail();
     }
     }

+ 25 - 3
src/views/production-safety/safetyAssessment/receiptRecord/configs/form.ts

@@ -33,10 +33,10 @@ export const RECEIPT_RECORD_FORM_CONFIG: FormConfig[] = [
   },
   },
   {
   {
     prop: 'receiptNumber',
     prop: 'receiptNumber',
-    label: '单号:',
+    label: '主动信息报告单号:',
     component: 'ElInput',
     component: 'ElInput',
     componentProps: {
     componentProps: {
-      placeholder: '请输入单号',
+      placeholder: '请输入主动信息报告单号',
     },
     },
   },
   },
   {
   {
@@ -55,6 +55,25 @@ export const RECEIPT_RECORD_FORM_CONFIG: FormConfig[] = [
       placeholder: '请选择领取人',
       placeholder: '请选择领取人',
     },
     },
   },
   },
+  {
+    prop: 'approvalTemplateId',
+    label: '审批流程:',
+    slot: 'approvalTemplateId', // 复用应急预案的审批流程下拉
+    componentProps: {
+      placeholder: '请选择审批流程',
+    },
+  },
+  {
+    prop: 'returnReason',
+    label: '审核不通过原因:',
+    component: 'ElInput',
+    componentProps: {
+      type: 'textarea',
+      rows: 2,
+      placeholder: '暂无审核不通过原因',
+      disabled: true,
+    },
+  },
 ];
 ];
 
 
 export const RECEIPT_RECORD_FORM_DATA = {
 export const RECEIPT_RECORD_FORM_DATA = {
@@ -67,6 +86,8 @@ export const RECEIPT_RECORD_FORM_DATA = {
   recipientUserId: null as number | null, // 领取人用户ID(通过queryAvailableUserList接口获取)
   recipientUserId: null as number | null, // 领取人用户ID(通过queryAvailableUserList接口获取)
   recipient: '', // 领取人姓名,提交给接口的 userName
   recipient: '', // 领取人姓名,提交给接口的 userName
   pimId: 0, // 物品库存ID(用于提交时使用,兼容旧数据)
   pimId: 0, // 物品库存ID(用于提交时使用,兼容旧数据)
+  approvalTemplateId: null as number | null, // 审批流程模板ID(与应急预案保持一致)
+  returnReason: '', // 审核不通过原因(只读展示)
 };
 };
 
 
 export const RECEIPT_RECORD_FORM_RULES = {
 export const RECEIPT_RECORD_FORM_RULES = {
@@ -76,7 +97,8 @@ export const RECEIPT_RECORD_FORM_RULES = {
     { required: true, message: '请输入取出数量', trigger: 'blur' },
     { required: true, message: '请输入取出数量', trigger: 'blur' },
     { type: 'number', min: 1, message: '取出数量不能小于1', trigger: 'blur' },
     { type: 'number', min: 1, message: '取出数量不能小于1', trigger: 'blur' },
   ],
   ],
-  receiptNumber: [{ required: true, message: '请输入单号', trigger: 'blur' }],
+  receiptNumber: [{ required: true, message: '请输入主动信息报告单号', trigger: 'blur' }],
   department: [{ required: true, message: '请选择部门', trigger: 'change' }],
   department: [{ required: true, message: '请选择部门', trigger: 'change' }],
   recipient: [{ required: true, message: '请选择领取人', trigger: 'change' }],
   recipient: [{ required: true, message: '请选择领取人', trigger: 'change' }],
+  approvalTemplateId: [{ required: true, message: '请选择审批流程', trigger: 'change' }],
 };
 };

+ 16 - 0
src/views/production-safety/safetyAssessment/receiptRecord/configs/status.ts

@@ -10,4 +10,20 @@ export const RECEIPT_RECORD_STATUS_LABEL: Record<string, string> = {
   '0': '待审核',
   '0': '待审核',
   '1': '审核通过',
   '1': '审核通过',
   '-1': '审核不通过',
   '-1': '审核不通过',
+  '2': '已领取',
+};
+
+// 管理员审核页状态选项(含已领取)
+export const ADMIN_RECEIPT_RECORD_STATUS_OPTIONS = [
+  { label: '待审核', value: 0 },
+  { label: '审核通过', value: 1 },
+  { label: '审核不通过', value: -1 },
+  // { label: '已领取', value: 2 },
+];
+
+export const ADMIN_RECEIPT_RECORD_STATUS_LABEL: Record<string, string> = {
+  '0': '待审核',
+  '1': '审核通过',
+  '-1': '审核不通过',
+  // '2': '已领取',
 };
 };

+ 59 - 0
src/views/production-safety/safetyAssessment/receiptRecord/configs/tables.ts

@@ -66,3 +66,62 @@ export const RECEIPT_RECORD_TABLE_COLUMNS: TableColumnProps[] = [
     align: 'left',
     align: 'left',
   },
   },
 ];
 ];
+export const ADMIN_RECEIPT_RECORD_TABLE_COLUMNS: TableColumnProps[] = [
+  {
+    label: '物品名称',
+    prop: 'itemName',
+    align: 'left',
+    minWidth: '120px',
+  },
+  {
+    label: '出库日期',
+    prop: 'outboundDate',
+    align: 'left',
+    minWidth: '120px',
+  },
+  {
+    label: '取出数量',
+    prop: 'outboundQuantity',
+    align: 'center',
+    minWidth: '120px',
+  },
+  {
+    label: '结余数量',
+    prop: 'remainingQuantity',
+    align: 'center',
+    minWidth: '120px',
+  },
+  {
+    label: '单号',
+    prop: 'receiptNumber',
+    align: 'left',
+    minWidth: '120px',
+  },
+  {
+    label: '部门',
+    prop: 'department',
+    align: 'left',
+    minWidth: '120px',
+  },
+  {
+    label: '领取人',
+    prop: 'recipient',
+    align: 'left',
+    minWidth: '120px',
+  },
+  {
+    label: '状态',
+    prop: 'status',
+    slot: 'status',
+    align: 'center',
+    minWidth: '100px',
+  },
+  {
+    label: '操作',
+    prop: 'action',
+    slot: 'action',
+    fixed: 'right',
+    width: '180px',
+    align: 'left',
+  },
+];

+ 2 - 1
src/views/production-safety/safetyAssessment/receiptRecord/receiptRecord.vue

@@ -74,7 +74,7 @@
               <div class="action-container--div" style="justify-content: left">
               <div class="action-container--div" style="justify-content: left">
                 <!-- 0 待审核:审核 -->
                 <!-- 0 待审核:审核 -->
                 <template v-if="Number(scope.row.status) === 0">
                 <template v-if="Number(scope.row.status) === 0">
-                  <ActionButton text="审核" @click="handleAudit(scope.row.id)" />
+                  <!-- <ActionButton text="审核" @click="handleAudit(scope.row.id)" /> -->
                 </template>
                 </template>
                 <!-- 1 审核通过:删除、查看 -->
                 <!-- 1 审核通过:删除、查看 -->
                 <template v-else-if="Number(scope.row.status) === 1">
                 <template v-else-if="Number(scope.row.status) === 1">
@@ -294,6 +294,7 @@
     });
     });
   };
   };
 
 
+
   onMounted(() => {
   onMounted(() => {
     getTableData();
     getTableData();
   });
   });

+ 347 - 0
src/views/production-safety/safetyAssessment/receiptRecord/receiptRecordAdministratorReview.vue

@@ -0,0 +1,347 @@
+<template>
+  <div class="safety-platform-container">
+    <header class="safety-platform-container__header">
+      <div class="breadcrumb-title"> 物品领取记录管理(管理员审核) </div>
+    </header>
+    <main class="safety-platform-container__main">
+      <div class="search-table-container">
+        <header>
+          <div style="position: relative">
+            <el-button plain class="search-table-container--button" @click="handleImport">
+              导入
+            </el-button>
+            <el-button plain class="search-table-container--button" @click="handleDownload">
+              导出
+            </el-button>
+          </div>
+
+          <div class="act-search">
+            <section class="select-box">
+              <div class="select-box--item">
+                <span>物品名称:</span>
+                <el-input
+                  v-model="tableQuery.queryParam.stuffName"
+                  placeholder="搜索物品名称"
+                  class="act-search-input"
+                />
+              </div>
+              <div class="select-box--item">
+                <span>部门名称:</span>
+                <el-input
+                  v-model="tableQuery.queryParam.deptName"
+                  placeholder="搜索部门名称"
+                  class="act-search-input"
+                />
+              </div>
+              <div class="select-box--item">
+                <span>状态:</span>
+                <el-select
+                  v-model="tableQuery.queryParam.status"
+                  placeholder="请选择状态"
+                  clearable
+                >
+                  <el-option
+                    v-for="item in ADMIN_RECEIPT_RECORD_STATUS_OPTIONS"
+                    :key="String(item.value)"
+                    :label="item.label"
+                    :value="item.value"
+                  />
+                </el-select>
+              </div>
+            </section>
+            <section class="search-btn">
+              <el-button type="primary" @click="handleSearch">查询</el-button>
+              <el-button @click="handleReset">重置</el-button>
+            </section>
+          </div>
+        </header>
+
+        <div class="batch-table">
+          <BasicTable
+            ref="basicTableRef"
+            :tableData="tableData"
+            :tableConfig="tableConfig"
+            @update:pageSize="handleSizeChange"
+            @update:pageNumber="handleCurrentChange"
+          >
+            <template #status="scope">
+              <span>{{ ADMIN_RECEIPT_RECORD_STATUS_LABEL[String(scope.row.status)] ?? '-' }}</span>
+            </template>
+            <template #action="scope">
+              <div class="action-container--div" style="justify-content: left">
+                <!-- 0 待审核:审核、显示 -->
+                <template v-if="Number(scope.row.status) === 0">
+                  <ActionButton
+                    text="审核"
+                    @click="handleAudit(scope.row.id, scope.row.approvalOrder)"
+                  />
+                  <ActionButton text="显示" @click="handleView(scope.row.id)" />
+                </template>
+                <!-- 1 审核通过、-1 审核不通过、2 已领取:显示 -->
+                <template v-else>
+                  <ActionButton text="显示" @click="handleView(scope.row.id)" />
+                </template>
+              </div>
+            </template>
+          </BasicTable>
+        </div>
+      </div>
+
+    </main>
+    <BatchImport
+      v-if="batchImportVisible"
+      :visible="batchImportVisible"
+      :import-api-url="importApiUrl"
+      :template-url="templateUrl"
+      template-name="下载模板"
+      :show-template="false"
+      @close="batchImportVisible = false"
+      @update="handleUpdate"
+    />
+  </div>
+  <BasicDialog ref="basicDialogRef" title="审核" @refresh="closeDialog">
+    <template #form>
+      <el-form ref="formRef" :model="formData" style="width: 100%">
+        <el-form-item
+          label="审核:"
+          prop="approvalStatus"
+          :rules="[{ required: true, message: '请选择审核状态' }]"
+        >
+          <el-radio-group v-model="formData.approvalStatus">
+            <el-radio :value="APPROVAL_STATUS.APPROVED">通过</el-radio>
+            <el-radio :value="APPROVAL_STATUS.REJECTED">退回</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item
+          v-if="formData.approvalStatus === APPROVAL_STATUS.REJECTED"
+          label="退回原因:"
+          prop="rejectReason"
+          :rules="[{ required: true, message: '请输入退回原因' }]"
+        >
+          <el-input
+            v-model="formData.rejectReason"
+            placeholder="请输入退回原因"
+            type="textarea"
+          />
+        </el-form-item>
+      </el-form>
+    </template>
+    <template #footer>
+      <el-button type="primary" @click="handleApprovalSubmit">提交</el-button>
+      <el-button @click="basicDialogRef?.closeDialog">返回</el-button>
+    </template>
+  </BasicDialog>
+</template>
+
+<script lang="ts" setup>
+  import { onMounted, reactive, ref } from 'vue';
+  import BasicTable from '@/components/BasicTable.vue';
+  import BasicDialog from '@/components/BasicDialog.vue';
+  import useTableConfig from '@/hooks/useTableConfigHook';
+  import ActionButton from '@/components/ActionButton.vue';
+  import { TABLE_OPTIONS, ADMIN_RECEIPT_RECORD_TABLE_COLUMNS } from './configs/tables';
+  import {
+    ADMIN_RECEIPT_RECORD_STATUS_OPTIONS,
+    ADMIN_RECEIPT_RECORD_STATUS_LABEL,
+  } from './configs/status';
+  import { useRouter } from 'vue-router';
+  import type { QueryPageRequest } from '@/types/basic-query';
+  import {
+    queryClaimItemsApprovalPage,
+    deleteClaimItemsLog,
+    exportClaimItemsLog,
+    submitReceiptRecordApproval,
+  } from '@/api/receiptRecord';
+  import { downloadByData } from '@/utils/file/download';
+  import BatchImport from '@/components/batch-import/BatchImport.vue';
+  import { useGlobSetting } from '@/hooks/setting';
+  import urlJoin from 'url-join';
+  import { ElMessage, type ElForm } from 'element-plus';
+  import { APPROVAL_STATUS } from '@/views/emergency/emergency-plan/src/constant';
+
+  const router = useRouter();
+
+  // 表格
+  const basicTableRef = ref<InstanceType<typeof BasicTable>>();
+
+  const { tableConfig, pagination } = useTableConfig(ADMIN_RECEIPT_RECORD_TABLE_COLUMNS, TABLE_OPTIONS);
+
+  const tableData = ref<any[]>([]);
+
+  const basicDialogRef = ref<InstanceType<typeof BasicDialog>>();
+  const formRef = ref<InstanceType<typeof ElForm>>();
+  const formData = reactive({
+    approvalStatus: APPROVAL_STATUS.APPROVED,
+    rejectReason: '',
+  });
+  const currentId = ref<number>();
+  const currentOrder = ref<number>();
+
+  const tableQuery = reactive<QueryPageRequest<any>>({
+    pageNumber: pagination.pageNumber,
+    pageSize: pagination.pageSize,
+    queryParam: {
+      stuffName: '',
+      deptName: '',
+      status: undefined as number | undefined, // 0 待审核, 1 审核通过, -1 审核不通过, 2 已领取
+    },
+  });
+
+  const handleSizeChange = (value: number) => {
+    pagination.pageSize = value;
+    tableQuery.pageSize = value;
+    getTableData();
+  };
+
+  const handleCurrentChange = (value: number) => {
+    pagination.pageNumber = value;
+    tableQuery.pageNumber = value;
+    getTableData();
+  };
+
+  async function getTableData() {
+    tableConfig.loading = true;
+    try {
+      const res = await queryClaimItemsApprovalPage(tableQuery);
+      if (res) {
+        // 映射返回数据字段到表格字段
+        tableData.value = res.records.map((item) => ({
+          id: item.id,
+          itemName: item.stuffName, // 物品名称
+          outboundDate: item.outStoreTime, // 出库日期
+          outboundQuantity: item.claimQty, // 取出数量
+          remainingQuantity: item.surplusQty, // 结余数量
+          receiptNumber: item.orderNumber, // 单号
+          department: item.deptName, // 部门
+          recipient: item.userName, // 领取人
+          status: item.status, // 0 待审核 1 审核通过 -1 审核不通过 2 已领取
+          approvalOrder: item.approvalOrder, // 审批顺序
+        }));
+        pagination.total = res.totalRow;
+      }
+    } catch (e) {
+      console.error('获取物品领取记录列表失败:', e);
+      tableData.value = [];
+      pagination.total = 0;
+    } finally {
+      tableConfig.loading = false;
+    }
+  }
+
+  const handleSearch = () => {
+    pagination.pageNumber = 1;
+    tableQuery.pageNumber = 1;
+    getTableData();
+  };
+
+  const handleReset = () => {
+    tableQuery.queryParam.stuffName = '';
+    tableQuery.queryParam.deptName = '';
+    tableQuery.queryParam.status = undefined;
+    handleSearch();
+  };
+
+  // 批量导入
+  const batchImportVisible = ref(false);
+  const { urlPrefix } = useGlobSetting();
+  const importApiUrl = ref(urlJoin(urlPrefix, '/claimItemsLog/importClaimItemsLog'));
+  const templateUrl = ref('./skyeye-file-upload/sfysecurity/TEMPLATE/import-receipt-record-template.xlsx');
+
+  const handleImport = () => {
+    batchImportVisible.value = true;
+  };
+
+  const handleUpdate = () => {
+    batchImportVisible.value = false;
+    getTableData();
+  };
+
+  const handleDownload = async () => {
+    try {
+      const exportParams = {
+        stuffName: tableQuery.queryParam.stuffName || undefined,
+        deptName: tableQuery.queryParam.deptName || undefined,
+        status: tableQuery.queryParam.status,
+      };
+      const response = await exportClaimItemsLog(exportParams);
+      if (response) {
+        const fileName = `物品领取记录_${new Date().toISOString().split('T')[0]}.xlsx`;
+        downloadByData(response, fileName);
+        ElMessage.success('导出成功');
+      }
+    } catch (e) {
+      console.error('导出物品领取记录失败:', e);
+      ElMessage.error('导出失败,请重试');
+    }
+  };
+
+  const handleEdit = (id: number) => {
+    router.push({
+      name: 'ReceiptRecordItem',
+      query: {
+        id,
+        operate: 'receiptRecord-edit',
+      },
+    });
+  };
+
+  const handleDelete = async (id: number) => {
+    try {
+      await deleteClaimItemsLog(id);
+      ElMessage.success('删除成功');
+      getTableData();
+    } catch (e) {
+      console.error('删除物品领取记录失败:', e);
+      ElMessage.error('删除失败,请重试');
+    }
+  };
+
+  const handleView = (id: number) => {
+    router.push({
+      name: 'ReceiptRecordItem',
+      query: {
+        id,
+        operate: 'receiptRecord-view',
+      },
+    });
+  };
+
+  const handleAudit = (id: number, approvalOrder: number) => {
+    currentId.value = id;
+    currentOrder.value = approvalOrder;
+    basicDialogRef.value?.openDialog();
+  };
+
+  const closeDialog = () => {
+    formRef.value?.resetFields();
+    basicDialogRef.value?.closeDialog();
+  };
+
+  const handleApprovalSubmit = () => {
+    formRef.value?.validate(async (valid) => {
+      if (valid) {
+        if (!currentId.value || !currentOrder.value) return;
+        await submitReceiptRecordApproval({
+          planId: currentId.value,
+          approvalOrder: currentOrder.value,
+          approvalStatus: formData.approvalStatus,
+          returnReason: formData.rejectReason,
+        });
+        ElMessage.success('审核成功');
+        basicDialogRef.value?.closeDialog();
+        getTableData();
+      }
+    });
+  };
+
+  onMounted(() => {
+    getTableData();
+  });
+</script>
+
+<style scoped lang="scss">
+  @use '@/styles/page-details-layout.scss' as *;
+  @use '@/styles/page-main-layout.scss' as *;
+  @use '@/styles/basic-table-action.scss' as *;
+  @use '@/views/traffic/violation/style/act-search-table.scss' as *;
+</style>