From b87f35ad442544fa3892def5c2979357eb76e4d7 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期一, 25 五月 2026 15:09:11 +0800
Subject: [PATCH] Merge branch 'refs/heads/dev_NEW_pro' into dev_天津_中兴实强new

---
 src/views/officeProcessAutomation/ApproveManage/approve-template/components/FormConfigEditor.vue           |  857 +
 src/api/basicData/enum.js                                                                                  |    8 
 src/assets/styles/index.scss                                                                               |   87 
 src/api/inventoryManagement/stockInRecord.js                                                               |    9 
 src/layout/index.vue                                                                                       |   85 
 src/views/officeProcessAutomation/ApproveManage/approve-shared/approvalInstanceFormConfigTable.js          |  116 
 src/assets/system/cangchuwuliu.svg                                                                         |    1 
 multiple/assets/favicon/XLZBico.ico                                                                        |    0 
 src/api/financialManagement/financialStatements.js                                                         |   32 
 src/api/procurementManagement/paymentLedger.js                                                             |   12 
 src/views/officeProcessAutomation/ReimburseManage/cost-reimburse/useCostReimburse.js                       |  634 
 src/assets/images/head.svg                                                                                 |    1 
 src/views/officeProcessAutomation/EnterpriseNews/news-manage/index.vue                                     |  566 
 src/views/officeProcessAutomation/HrManage/staff-contract/components/formDia.vue                           |   93 
 src/views/officeProcessAutomation/ReimburseManage/cost-reimburse/components/DetailPanel.vue                |   74 
 src/api/login.js                                                                                           |   17 
 src/views/officeProcessAutomation/ApproveManage/approve-shared/approvalTemplateBindingUtils.js             |   91 
 src/assets/system/shengchanpaichan.svg                                                                     |    1 
 src/views/officeProcessAutomation/HrManage/resign-apply/index.vue                                          |  220 
 src/assets/system/chanpinweihu.svg                                                                         |    1 
 src/views/officeProcessAutomation/EnterpriseNews/news-manage/enterpriseNewsUtils.js                        |  207 
 src/settings.js                                                                                            |    4 
 multiple/assets/favicon/LFJZfavicon.ico                                                                    |    0 
 src/views/productionManagement/workOrderEdit/index.vue                                                     |   42 
 src/components/Breadcrumb/index.vue                                                                        |    5 
 src/components/AIChatSidebar/assistants/financeAssistant.js                                                |   26 
 src/api/officeProcessAutomation/approvalTemplate.js                                                        |   58 
 src/assets/system/yonghuguanli.svg                                                                         |    1 
 src/layout/components/NotificationCenter/index.vue                                                         |   19 
 src/views/officeProcessAutomation/AttendManage/leave-apply/index.vue                                       |  325 
 src/assets/system/caigoutuihuo.svg                                                                         |    1 
 src/views/officeProcessAutomation/ApproveManage/approve-template/useSelectOptionSources.js                 |   45 
 src/views/customerService/feedbackRegistration/index.vue                                                   |  825 
 src/api/viewIndex.js                                                                                       |   56 
 src/views/officeProcessAutomation/ApproveManage/approve-shared/approvalInstanceListSearch.js               |  158 
 src/views/officeProcessAutomation/ReimburseManage/travel-reimburse/components/ApprovalFlowProgress.vue     |   49 
 src/views/officeProcessAutomation/ApproveManage/approve-list/approveListConstants.js                       |  609 
 src/views/officeProcessAutomation/SysAdmin/user-manage/profile/userAvatar.vue                              |  168 
 src/views/procurementManagement/purchaseReturnOrder/New.vue                                                |   22 
 src/views/officeProcessAutomation/SysAdmin/user-manage/authRole.vue                                        |  123 
 src/views/reportAnalysis/dataDashboard/index0.vue                                                          |   15 
 src/views/officeProcessAutomation/ApproveManage/approve-shared/components/ApprovalTemplateFormSection.vue  |  122 
 src/assets/system/gongyingshangdangan.svg                                                                  |    1 
 src/views/officeProcessAutomation/ReimburseManage/travel-reimburse/travelReimburseUtils.js                 |  189 
 src/assets/system/chukuguanli.svg                                                                          |    1 
 multiple/assets/favicon/YSJXico.ico                                                                        |    0 
 src/assets/styles/variables.module.scss                                                                    |  193 
 src/views/aiIndustrialBrain/MAINTAIN_RULES.md                                                              |    7 
 multiple/assets/favicon/XCDQfavicon.ico                                                                    |    0 
 src/views/financialManagement/receivable/reconciliation.vue                                                |  563 
 src/assets/system/xiaoshoutaizhang.svg                                                                     |    1 
 src/components/AIChatSidebar/assistants/salesAssistant.js                                                  |   28 
 src/api/officeProcessAutomation/finReimbursement.js                                                        |   71 
 src/api/salesManagement/receiptPayment.js                                                                  |   86 
 src/api/financialManagement/accountPurchasePayment.js                                                      |   32 
 src/views/officeProcessAutomation/ReimburseManage/travel-reimburse/index.vue                               |  614 
 src/views/equipmentManagement/inspectionManagement/index.vue                                               |   97 
 src/api/financialManagement/accountSalesInvoice.js                                                         |   41 
 src/views/officeProcessAutomation/ApproveManage/approve-template/approveTemplateConstants.js               |  355 
 src/views/officeProcessAutomation/HrManage/post-manage/index.vue                                           |  292 
 src/views/officeProcessAutomation/SysMonitor/data-monitor/index.vue                                        |   14 
 src/views/officeProcessAutomation/ApproveManage/approve-shared/components/ApprovalTemplatePicker.vue       |   85 
 src/views/officeProcessAutomation/ReimburseManage/shared/components/FinReimburseApprovePanel.vue           |   70 
 src/assets/system/xiaoshoubaojia.svg                                                                       |    1 
 src/assets/system/zhushengchanjihua.svg                                                                    |    1 
 src/views/productionManagement/productionProcess/index.vue                                                 |    7 
 src/views/officeProcessAutomation/HrManage/staff-archive/components/JobInfoSection.vue                     |  176 
 src/views/officeProcessAutomation/HrManage/resign-apply/components/formDia.vue                             |  347 
 src/views/officeProcessAutomation/ReimburseManage/shared/finReimbursementMappers.js                        |  904 +
 src/views/officeProcessAutomation/ReimburseManage/shared/reimburseApproveBridge.js                         |  124 
 src/views/officeProcessAutomation/NoticeAnnouncement/notice-manage/index.vue                               |   12 
 src/api/financialManagement/accountPaymentApplication.js                                                   |   59 
 src/views/officeProcessAutomation/SysMonitor/cache-monitor/index.vue                                       |  134 
 src/views/safeProduction/safetyTrainingAssessment/detail.vue                                               |    2 
 src/assets/system/gongxu.svg                                                                               |    1 
 src/layout/components/Sidebar/Logo.vue                                                                     |   94 
 src/assets/system/rukuguanli.svg                                                                           |    1 
 src/views/inventoryManagement/receiptManagement/Record.vue                                                 |  227 
 src/views/financialManagement/financialStatements/index.vue                                                | 1460 -
 src/views/officeProcessAutomation/HrManage/staff-archive/index.vue                                         |  360 
 src/views/equipmentManagement/upkeep/index.vue                                                             |   36 
 src/assets/system/jichupeizhi.svg                                                                          |    1 
 src/assets/system/kucunguanli.svg                                                                          |    1 
 src/views/personnelManagement/employeeRecord/index.vue                                                     |    6 
 src/views/aiIndustrialBrain/index.vue                                                                      |    1 
 src/views/officeProcessAutomation/SysAdmin/user-manage/profile/resetPwd.vue                                |   59 
 src/views/productionPlan/productionPlan/components/PIMTable.vue                                            |    1 
 multiple/assets/favicon/JHYfavicon.ico                                                                     |    0 
 src/assets/system/baogongtaizhang.svg                                                                      |    1 
 src/router/index.js                                                                                        |  268 
 src/views/qualityManagement/nonconformingManagement/components/formDia.vue                                 |   22 
 src/views/qualityManagement/rawMaterialInspection/components/formDia.vue                                   |   86 
 src/views/officeProcessAutomation/ApproveManage/approve-list/components/InstanceFlowDisplay.vue            |  147 
 src/api/financialManagement/accountSalesCollection.js                                                      |   50 
 src/assets/system/shengchanheduan.svg                                                                      |    1 
 src/components/Dialog/FormDialog.vue                                                                       |    2 
 src/views/officeProcessAutomation/ApproveManage/approve-shared/components/ApprovalInstanceDetailDialog.vue |  123 
 src/views/officeProcessAutomation/ApproveManage/approve-shared/components/ApprovalInstanceSubmitDialog.vue |  112 
 src/views/officeProcessAutomation/SysAdmin/dept-manage/index.vue                                           |  291 
 src/assets/system/BOM.svg                                                                                  |    1 
 src/views/customerService/feedbackRegistration/components/formDia.vue                                      |    4 
 src/api/financialManagement/accountPurchaseInvoice.js                                                      |   50 
 src/components/AIChatSidebar/assistants/index.js                                                           |   15 
 src/views/officeProcessAutomation/EnterpriseNews/news-manage/enterpriseNewsApprovalBridge.js               |   11 
 src/views/inventoryManagement/dispatchLog/Record.vue                                                       |  129 
 src/views/officeProcessAutomation/ApproveManage/approve-shared/approvalModuleRegistry.js                   |  152 
 multiple/assets/logo/XLZBLogo.png                                                                          |    0 
 src/views/officeProcessAutomation/HrManage/staff-archive/components/EmergencyAndAttachmentSection.vue      |  115 
 src/components/HeaderSearch/index.vue                                                                      |   83 
 src/views/officeProcessAutomation/HrManage/staff-archive/components/EducationWorkSection.vue               |  263 
 src/views/officeProcessAutomation/ApproveManage/approve-list/components/FormPayloadFields.vue              |  152 
 src/assets/system/caigoutaizhang.svg                                                                       |    1 
 src/assets/system/caigoubaobiao.svg                                                                        |    1 
 src/views/financialManagement/receivable/invoiceApply.vue                                                  |  751 
 multiple/assets/logo/YSJXLogo.png                                                                          |    0 
 src/views/officeProcessAutomation/ApproveManage/approve-shared/useFlowUserOptions.js                       |   35 
 src/views/officeProcessAutomation/ApproveManage/approve-shared/useApprovalInstanceModule.js                |  408 
 src/views/productionManagement/productStructure/Detail/index.vue                                           |  115 
 src/views/system/user/index.vue                                                                            |    3 
 src/views/login.vue                                                                                        | 1040 
 src/assets/system/shengchanpeizhi.svg                                                                      |    1 
 src/views/officeProcessAutomation/ApproveManage/approve-shared/useApprovalTemplateBinding.js               |  259 
 src/views/officeProcessAutomation/ApproveManage/approve-shared/components/ApprovalTemplateBindDialog.vue   |  176 
 multiple/assets/favicon/SDTXfavicon.ico                                                                    |    0 
 src/assets/system/ai.svg                                                                                   |    1 
 src/api/salesManagement/indicatorStats.js                                                                  |   18 
 src/api/salesManagement/invoiceLedger.js                                                                   |   94 
 src/views/basicData/product/index.vue                                                                      |   53 
 src/views/financialManagement/payable/payment.vue                                                          |  562 
 src/views/qualityManagement/rawMaterialInspection/index.vue                                                |   36 
 src/views/procurementManagement/thePaymentLedger/index.vue                                                 |   15 
 src/views/qualityManagement/finalInspection/index.vue                                                      |  105 
 src/views/officeProcessAutomation/AttendManage/overtime-apply/index.vue                                    |  260 
 src/views/qualityManagement/processInspection/index.vue                                                    |   35 
 src/views/financialManagement/payable/input-invoice.vue                                                    |  918 
 src/views/productionManagement/workOrderManagement/index.vue                                               |    5 
 src/views/productionManagement/productionOrder/components/MaterialLedgerDialog.vue                         |   28 
 multiple/assets/logo/JHHGLogo.png                                                                          |    0 
 src/views/officeProcessAutomation/HrManage/staff-contract/index.vue                                        |  296 
 src/views/personnelManagement/contractManagement/components/formDia.vue                                    |  151 
 src/views/officeProcessAutomation/HrManage/staff-archive/components/Show.vue                               |   69 
 src/views/productionManagement/productionTraceability/index.vue                                            |   11 
 multiple/assets/favicon/HQJCfavicon.ico                                                                    |    0 
 src/views/equipmentManagement/ledger/index.vue                                                             |   61 
 multiple/assets/logo/JHYLogo.png                                                                           |    0 
 src/views/officeProcessAutomation/HrManage/staff-archive/components/NewOrEditFormDia.vue                   |  304 
 src/assets/system/fahuotaizhang.svg                                                                        |    1 
 src/assets/system/组 210683.svg                                                                             |    1 
 src/store/modules/user.js                                                                                  |  242 
 multiple/multiple-build.js                                                                                 |  192 
 multiple/assets/logo/HQJCLogo.png                                                                          |    0 
 src/views/financialManagement/receivable/receipt.vue                                                       | 1063 
 src/views/officeProcessAutomation/SysMonitor/server-monitor/index.vue                                      |  191 
 src/utils/theme.js                                                                                         |   45 
 src/api/financialManagement/invoiceApply.js                                                                |   59 
 src/views/officeProcessAutomation/ApproveManage/approve-list/useApproveList.js                             |  628 
 src/components/Hamburger/index.vue                                                                         |   40 
 src/views/qualityManagement/nonconformingManagement/index.vue                                              |    2 
 src/views/productionManagement/processRoute/index.vue                                                      |    4 
 src/assets/system/baogong.svg                                                                              |    1 
 multiple/assets/favicon/JHHGfavicon.ico                                                                    |    0 
 src/views/productionManagement/processRoute/processRouteItem/index.vue                                     |  248 
 src/views/salesManagement/receiptPaymentLedger/index.vue                                                   |  486 
 src/views/collaborativeApproval/approvalProcess/index.vue                                                  |   53 
 src/views/salesManagement/salesLedger/index.vue                                                            |  633 
 src/views/officeProcessAutomation/ApproveManage/approve-template/selectOptionSource.js                     |  140 
 src/views/officeProcessAutomation/HrManage/regular-apply/index.vue                                         |  174 
 src/assets/system/shengchandingdan.svg                                                                     |    1 
 src/layout/components/Sidebar/index.vue                                                                    |  242 
 src/views/officeProcessAutomation/EnterpriseNews/news-manage/enterpriseNewsMappers.js                      |  221 
 src/assets/system/caigoupeizhi.svg                                                                         |    1 
 src/views/inventoryManagement/stockManagement/Record.vue                                                   |   66 
 src/views/officeProcessAutomation/ReimburseManage/travel-reimburse/components/DetailPanel.vue              |   82 
 src/assets/system/xiaoshoupeizhi.svg                                                                       |    1 
 src/views/officeProcessAutomation/ApproveManage/approve-list/index.vue                                     |  613 
 src/assets/styles/sidebar.scss                                                                             |  769 
 src/api/officeProcessAutomation/enterpriseNews.js                                                          |   38 
 src/assets/styles/element-ui.scss                                                                          |   60 
 src/components/PIMTable/PIMTable.vue                                                                       |    1 
 src/layout/components/TagsView/index.vue                                                                   |   34 
 src/views/collaborativeApproval/approvalProcess/components/infoFormDia.vue                                 |   47 
 src/views/officeProcessAutomation/ContractManage/sale-contract/index.vue                                   |   12 
 src/utils/request.js                                                                                       |   25 
 src/views/reportAnalysis/financialAnalysis/components/center-top.vue                                       |   79 
 src/api/financialManagement/accountStatement.js                                                            |   41 
 src/views/aiIndustrialBrain/components/AiAssistantWorkspace.vue                                            |   16 
 src/views/officeProcessAutomation/EnterpriseNews/news-manage/components/NewsDetailPanel.vue                |  169 
 src/layout/components/AppMain.vue                                                                          |   47 
 src/views/financialManagement/receivable/outputInvoice.vue                                                 |  489 
 src/views/financialManagement/payable/purchaseReturn.vue                                                   |  113 
 src/views/index.vue                                                                                        | 3218 ++-
 src/views/officeProcessAutomation/ApproveManage/approve-list/components/ApproveDetailPanel.vue             |  167 
 src/views/personnelManagement/contractManagement/index.vue                                                 |    2 
 src/views/equipmentManagement/ledger/Form.vue                                                              |   27 
 src/assets/system/shenpiguanli.svg                                                                         |    1 
 src/views/collaborativeApproval/purchaseApproval/index.vue                                                 |   12 
 src/views/officeProcessAutomation/ContractManage/purchase-contract/index.vue                               |   12 
 src/views/officeProcessAutomation/SysAdmin/log-manage/index.vue                                            |  315 
 multiple/assets/logo/JXSMLogo.png                                                                          |    0 
 vite.config.js                                                                                             |    2 
 src/views/equipmentManagement/inspectionManagement/components/uploadFiles.vue                              |  680 
 src/assets/system/zhibiaotongji.svg                                                                        |    1 
 src/views/qualityManagement/processInspection/components/formDia.vue                                       |  120 
 src/assets/system/xiaoshoutuihuo.svg                                                                       |    1 
 src/components/AIChatSidebar/assistants/productionAssistant.js                                             |   27 
 src/views/equipmentManagement/repair/Modal/RepairModal.vue                                                 |  332 
 multiple/assets/logo/LFJZLogo.png                                                                          |    0 
 src/views/officeProcessAutomation/EnterpriseNews/news-manage/useEnterpriseNewsList.js                      |   55 
 src/views/officeProcessAutomation/ReimburseManage/shared/finReimbursementDetailExtras.js                   |  160 
 src/views/officeProcessAutomation/ApproveManage/approve-template/formConfigUtils.js                        |  301 
 src/views/officeProcessAutomation/AttendManage/overtime-apply/components/ApprovalFlowEditor.vue            |  360 
 src/views/financialManagement/payable/paymentApply.vue                                                     |  970 +
 src/views/procurementManagement/procurementLedger/index.vue                                                |  118 
 src/views/equipmentManagement/measurementEquipment/index.vue                                               |  630 
 src/views/financialManagement/payable/reconciliation.vue                                                   |  613 
 src/views/financialManagement/payable/purchaseIn.vue                                                       |  283 
 src/layout/components/TagsView/ScrollPane.vue                                                              |   10 
 src/views/productionManagement/productionOrder/index.vue                                                   |    1 
 src/views/officeProcessAutomation/SysAdmin/user-manage/profile/userInfo.vue                                |   67 
 src/views/equipmentManagement/upkeep/Form/MaintenanceModal.vue                                             |  357 
 src/views/officeProcessAutomation/ApproveManage/approve-template/components/TemplateFlowEditor.vue         |  399 
 multiple/assets/logo/XCDQLogo.png                                                                          |    0 
 src/assets/system/gongyingshangwanglai.svg                                                                 |    1 
 src/views/officeProcessAutomation/HrManage/staff-archive/components/RenewContract.vue                      |  141 
 src/views/procurementManagement/qualityInspection/index.vue                                                |   24 
 src/components/AIChatSidebar/assistants/purchaseAssistant.js                                               |    2 
 multiple/assets/logo/SDTXLogo.png                                                                          |    0 
 src/layout/components/Navbar.vue                                                                           |  682 
 src/views/equipmentManagement/inspectionManagement/components/formDia.vue                                  |   16 
 multiple/assets/favicon/JXSMico.ico                                                                        |    0 
 src/views/officeProcessAutomation/HrManage/work-handover/index.vue                                         |  249 
 src/views/officeProcessAutomation/HrManage/transfer-apply/index.vue                                        |  347 
 src/views/equipmentManagement/measurementEquipment/filesDia.vue                                            |  110 
 src/views/officeProcessAutomation/ReimburseManage/cost-reimburse/index.vue                                 |  550 
 src/layout/components/Sidebar/SidebarItem.vue                                                              |   66 
 src/views/officeProcessAutomation/HrManage/staff-archive/components/BasicInfoSection.vue                   |  181 
 src/views/officeProcessAutomation/HrManage/staff-contract/filesDia.vue                                     |  197 
 src/views/qualityManagement/finalInspection/components/formDia.vue                                         |  180 
 src/views/equipmentManagement/repair/index.vue                                                             |  506 
 src/views/officeProcessAutomation/SysAdmin/user-manage/profile/index.vue                                   |   87 
 src/assets/logo/logo.png                                                                                   |    0 
 src/components/AIChatSidebar/index.vue                                                                     | 1748 ++
 src/views/officeProcessAutomation/ApproveManage/approve-template/useApproveTemplate.js                     |  334 
 src/api/equipmentManagement/measurementEquipment.js                                                        |   27 
 src/views/equipmentManagement/inspectionManagement/components/viewFiles.vue                                |  335 
 src/views/procurementManagement/paymentLedger/index.vue                                                    |  494 
 /dev/null                                                                                                  |  279 
 src/views/officeProcessAutomation/ReimburseManage/travel-reimburse/useTravelReimburse.js                   |  696 
 src/views/officeProcessAutomation/ReimburseManage/cost-reimburse/costReimburseUtils.js                     |  313 
 src/views/systemArchitecture/index.vue                                                                     |  878 
 src/views/productionPlan/productionPlan/index.vue                                                          |   16 
 src/views/officeProcessAutomation/SysAdmin/user-manage/index.vue                                           |  550 
 src/api/officeProcessAutomation/approvalInstance.js                                                        |   47 
 src/assets/system/kehudangan.svg                                                                           |    1 
 src/assets/system/kehuwanglai.svg                                                                          |    1 
 src/views/officeProcessAutomation/ApproveManage/approve-template/index.vue                                 |  819 +
 256 files changed, 38,035 insertions(+), 8,883 deletions(-)

diff --git a/multiple/assets/favicon/HQJCfavicon.ico b/multiple/assets/favicon/HQJCfavicon.ico
new file mode 100644
index 0000000..65e6942
--- /dev/null
+++ b/multiple/assets/favicon/HQJCfavicon.ico
Binary files differ
diff --git a/multiple/assets/favicon/JHHGfavicon.ico b/multiple/assets/favicon/JHHGfavicon.ico
new file mode 100644
index 0000000..54bbe64
--- /dev/null
+++ b/multiple/assets/favicon/JHHGfavicon.ico
Binary files differ
diff --git a/multiple/assets/favicon/JHYfavicon.ico b/multiple/assets/favicon/JHYfavicon.ico
new file mode 100644
index 0000000..f818f6f
--- /dev/null
+++ b/multiple/assets/favicon/JHYfavicon.ico
Binary files differ
diff --git a/multiple/assets/favicon/JXSMico.ico b/multiple/assets/favicon/JXSMico.ico
new file mode 100644
index 0000000..f5681e8
--- /dev/null
+++ b/multiple/assets/favicon/JXSMico.ico
Binary files differ
diff --git a/multiple/assets/favicon/LFJZfavicon.ico b/multiple/assets/favicon/LFJZfavicon.ico
new file mode 100644
index 0000000..9f2b565
--- /dev/null
+++ b/multiple/assets/favicon/LFJZfavicon.ico
Binary files differ
diff --git a/multiple/assets/favicon/SDTXfavicon.ico b/multiple/assets/favicon/SDTXfavicon.ico
new file mode 100644
index 0000000..6e84a60
--- /dev/null
+++ b/multiple/assets/favicon/SDTXfavicon.ico
Binary files differ
diff --git a/multiple/assets/favicon/XCDQfavicon.ico b/multiple/assets/favicon/XCDQfavicon.ico
new file mode 100644
index 0000000..69a2280
--- /dev/null
+++ b/multiple/assets/favicon/XCDQfavicon.ico
Binary files differ
diff --git a/multiple/assets/favicon/XLZBico.ico b/multiple/assets/favicon/XLZBico.ico
new file mode 100644
index 0000000..63ff233
--- /dev/null
+++ b/multiple/assets/favicon/XLZBico.ico
Binary files differ
diff --git a/multiple/assets/favicon/YSJXico.ico b/multiple/assets/favicon/YSJXico.ico
new file mode 100644
index 0000000..ce3c0c3
--- /dev/null
+++ b/multiple/assets/favicon/YSJXico.ico
Binary files differ
diff --git a/multiple/assets/logo/HQJCLogo.png b/multiple/assets/logo/HQJCLogo.png
new file mode 100644
index 0000000..5e21e9c
--- /dev/null
+++ b/multiple/assets/logo/HQJCLogo.png
Binary files differ
diff --git a/multiple/assets/logo/JHHGLogo.png b/multiple/assets/logo/JHHGLogo.png
new file mode 100644
index 0000000..3373e60
--- /dev/null
+++ b/multiple/assets/logo/JHHGLogo.png
Binary files differ
diff --git a/multiple/assets/logo/JHYLogo.png b/multiple/assets/logo/JHYLogo.png
new file mode 100644
index 0000000..edf5921
--- /dev/null
+++ b/multiple/assets/logo/JHYLogo.png
Binary files differ
diff --git a/multiple/assets/logo/JXSMLogo.png b/multiple/assets/logo/JXSMLogo.png
new file mode 100644
index 0000000..f1da7e9
--- /dev/null
+++ b/multiple/assets/logo/JXSMLogo.png
Binary files differ
diff --git a/multiple/assets/logo/LFJZLogo.png b/multiple/assets/logo/LFJZLogo.png
new file mode 100644
index 0000000..3f2fc03
--- /dev/null
+++ b/multiple/assets/logo/LFJZLogo.png
Binary files differ
diff --git a/multiple/assets/logo/SDTXLogo.png b/multiple/assets/logo/SDTXLogo.png
new file mode 100644
index 0000000..f69cf0b
--- /dev/null
+++ b/multiple/assets/logo/SDTXLogo.png
Binary files differ
diff --git a/multiple/assets/logo/XCDQLogo.png b/multiple/assets/logo/XCDQLogo.png
new file mode 100644
index 0000000..d10580a
--- /dev/null
+++ b/multiple/assets/logo/XCDQLogo.png
Binary files differ
diff --git a/multiple/assets/logo/XLZBLogo.png b/multiple/assets/logo/XLZBLogo.png
new file mode 100644
index 0000000..d79c119
--- /dev/null
+++ b/multiple/assets/logo/XLZBLogo.png
Binary files differ
diff --git a/multiple/assets/logo/YSJXLogo.png b/multiple/assets/logo/YSJXLogo.png
new file mode 100644
index 0000000..945463b
--- /dev/null
+++ b/multiple/assets/logo/YSJXLogo.png
Binary files differ
diff --git a/multiple/multiple-build.js b/multiple/multiple-build.js
index d87b333..afcd4d5 100644
--- a/multiple/multiple-build.js
+++ b/multiple/multiple-build.js
@@ -1,98 +1,152 @@
-import fs from 'fs/promises';
-import fsSync from 'fs';
-import path from 'path';
-import { fileURLToPath } from 'url';
+import fs from "fs/promises";
+import fsSync from "fs";
+import path from "path";
+import { fileURLToPath } from "url";
 import { execSync } from "child_process";
 
-// 鑾峰彇 __dirname
 const __filename = fileURLToPath(import.meta.url);
 const __dirname = path.dirname(__filename);
 
-// 璇诲彇 JSON 閰嶇疆
-const data = await fs.readFile(path.join(__dirname, 'config.json'), 'utf-8');
+const data = await fs.readFile(path.join(__dirname, "config.json"), "utf-8");
 const config = JSON.parse(data);
 
-// 椤圭洰璺緞
-const rootPath = path.resolve(__dirname, '..');
-const resourcePath = path.join(rootPath, 'multiple', 'assets');
-const replacePath = path.join(rootPath, 'replace');
+const rootPath = path.resolve(__dirname, "..");
+const resourcePath = path.join(rootPath, "multiple", "assets");
+const replacePath = path.join(rootPath, "replace");
+const envFilePath = path.join(rootPath, ".env.production.local");
 
-// 鑾峰彇鍛戒护琛屽弬鏁�
 const params = parseArgs(process.argv);
-const company = params["company"] ?? "default";
+const company = resolveCompany(params);
 const companyMap = config[company];
 
-const envFilePath = path.join(process.cwd(), '.env.production.local');
+if (!companyMap) {
+  const availableCompanies = Object.entries(config)
+    .filter(([, value]) => value && typeof value === "object" && value.env)
+    .map(([key]) => key)
+    .sort();
+  throw new Error(
+    `鏈煡 company: "${company}"銆傚彲閫夊��: ${availableCompanies.join(", ")}`
+  );
+}
+
+console.log(`褰撳墠 company: ${company}`);
 
 async function copyFileWithOverwrite(src, dest) {
-    await fs.mkdir(path.dirname(dest), { recursive: true });
-    if (fsSync.existsSync(dest)) {
-        try {
-            await fs.chmod(dest, 0o666);
-        } catch {
-            // Ignore chmod failure and try delete directly.
-        }
-        await fs.rm(dest, { force: true });
+  await fs.mkdir(path.dirname(dest), { recursive: true });
+  if (fsSync.existsSync(dest)) {
+    try {
+      await fs.chmod(dest, 0o666);
+    } catch {
+      // Ignore chmod failure and continue.
     }
-    await fs.copyFile(src, dest);
+    await fs.rm(dest, { force: true });
+  }
+  await fs.copyFile(src, dest);
 }
 
 try {
-    // 1锔忊儯 鐢熸垚 .env
-    console.log("=======鐢熸垚.env=======");
-    const envContent = Object.entries(companyMap.env)
-        .map(([key, value]) => `${key}='${value}'`)
-        .join('\n') + '\n';
-    await fs.writeFile(envFilePath, envContent, 'utf-8');
+  console.log("=======鐢熸垚.env=======");
+  const envContent =
+    Object.entries(companyMap.env)
+      .map(([key, value]) => `${key}='${value}'`)
+      .join("\n") + "\n";
+  await fs.writeFile(envFilePath, envContent, "utf-8");
 
-    // 2锔忊儯 澶囦唤鍘熷璧勬簮骞舵浛鎹�
-    console.log("=======淇敼璧勬簮=======");
-    for (const [key, value] of Object.entries(companyMap)) {
-        if (key === 'env') continue;
+  console.log("=======淇敼璧勬簮=======");
+  for (const [key] of Object.entries(companyMap)) {
+    if (key === "env") continue;
 
-        const originFile = path.join(rootPath, config[key]);
-        const backupFile = path.join(replacePath, config[key]);
-        const replaceFile = path.join(resourcePath, companyMap[key]);
+    const originFile = path.join(rootPath, config[key]);
+    const backupFile = path.join(replacePath, config[key]);
+    const replaceFile = path.join(resourcePath, companyMap[key]);
 
-        await copyFileWithOverwrite(originFile, backupFile);
-        await copyFileWithOverwrite(replaceFile, originFile);
-    }
+    await copyFileWithOverwrite(originFile, backupFile);
+    await copyFileWithOverwrite(replaceFile, originFile);
+  }
 
-    console.log("=====寮�濮嬫墦鍖�======");
-    execSync("vite build", { stdio: "inherit" });
-    console.log("=====鎵撳寘瀹屾垚======");
+  console.log("=====寮�濮嬫墦鍖�=====");
+  const buildEnv = createBuildEnv(companyMap.env);
+  execSync("vite build", { stdio: "inherit", cwd: rootPath, env: buildEnv });
+  console.log("=====鎵撳寘瀹屾垚======");
 } finally {
-    console.log("=====鎭㈠璧勬簮======");
+  console.log("=====鎭㈠璧勬簮======");
 
-    // 鍒犻櫎涓存椂 .env 鏂囦欢
-    if (fsSync.existsSync(envFilePath)) {
-        await fs.unlink(envFilePath);
-        console.log(`馃棏锔� 宸插垹闄� ${envFilePath}`);
+  if (fsSync.existsSync(envFilePath)) {
+    await fs.unlink(envFilePath);
+    console.log(`馃棏锔� 宸插垹闄� ${envFilePath}`);
+  }
+
+  if (fsSync.existsSync(replacePath)) {
+    for (const [key] of Object.entries(companyMap)) {
+      if (key === "env") continue;
+
+      const originFile = path.join(rootPath, config[key]);
+      const backupFile = path.join(replacePath, config[key]);
+      await copyFileWithOverwrite(backupFile, originFile);
     }
-
-    // 鎭㈠璧勬簮鏂囦欢
-    if (fsSync.existsSync(replacePath)) {
-        for (const [key, value] of Object.entries(companyMap)) {
-            if (key === 'env') continue;
-
-            const originFile = path.join(rootPath, config[key]);
-            const backupFile = path.join(replacePath, config[key]);
-
-            await copyFileWithOverwrite(backupFile, originFile);
-        }
-        await fs.rm(replacePath, { recursive: true, force: true });
-        console.log(`馃棏锔� 宸插垹闄� ${replacePath}`);
-    }
+    await fs.rm(replacePath, { recursive: true, force: true });
+    console.log(`馃棏锔� 宸插垹闄� ${replacePath}`);
+  }
 }
 
-// 绠�鍗曞懡浠よ鍙傛暟瑙f瀽
 function parseArgs(argv) {
-    const params = {};
-    for (const arg of argv.slice(2)) {
-        if (arg.startsWith('--')) {
-            const [key, value] = arg.slice(2).split('=');
-            params[key] = value ?? true;
-        }
+  const params = {};
+  for (let index = 2; index < argv.length; index++) {
+    const arg = argv[index];
+    if (!arg.startsWith("--")) continue;
+
+    const normalized = arg.slice(2);
+    const equalIndex = normalized.indexOf("=");
+    if (equalIndex >= 0) {
+      const key = normalized.slice(0, equalIndex);
+      const value = normalized.slice(equalIndex + 1);
+      params[key] = value || true;
+      continue;
     }
-    return params;
+
+    const nextArg = argv[index + 1];
+    if (nextArg && !nextArg.startsWith("--")) {
+      params[normalized] = nextArg;
+      index += 1;
+      continue;
+    }
+
+    params[normalized] = true;
+  }
+  return params;
+}
+
+function resolveCompany(parsedParams) {
+  const fromArg = parseValue(parsedParams.company);
+  if (fromArg) return fromArg;
+
+  const fromNpmConfig = parseValue(process.env.npm_config_company);
+  if (fromNpmConfig) return fromNpmConfig;
+
+  const fromEnv = parseValue(process.env.COMPANY ?? process.env.company);
+  if (fromEnv) return fromEnv;
+
+  return "default";
+}
+
+function parseValue(value) {
+  if (value == null || value === true) return undefined;
+  if (typeof value !== "string") return undefined;
+  const trimmed = value.trim();
+  if (!trimmed) return undefined;
+  return trimmed.replace(/^["']|["']$/g, "");
+}
+
+function createBuildEnv(companyEnv) {
+  const env = { ...process.env };
+  for (const key of Object.keys(env)) {
+    if (key.startsWith("VITE_")) {
+      delete env[key];
+    }
+  }
+  return {
+    ...env,
+    ...companyEnv,
+    VITE_APP_ENV: "production",
+  };
 }
diff --git a/src/api/basicData/enum.js b/src/api/basicData/enum.js
index 350df17..9e8b503 100644
--- a/src/api/basicData/enum.js
+++ b/src/api/basicData/enum.js
@@ -1,5 +1,13 @@
 import request from "@/utils/request.js";
 
+/** 瀹℃壒妯℃澘绫诲瀷绛夐�氱敤鏋氫妇锛圱ypeEnums锛� */
+export function getTypeEnums() {
+    return request({
+        url: '/basic/enum/TypeEnums',
+        method: 'get'
+    })
+}
+
 export function findAllStockRecordTypeOptions() {
     return request({
         url: '/basic/enum/stockRecordType',
diff --git a/src/api/equipmentManagement/measurementEquipment.js b/src/api/equipmentManagement/measurementEquipment.js
index 8bb8a7f..ba73317 100644
--- a/src/api/equipmentManagement/measurementEquipment.js
+++ b/src/api/equipmentManagement/measurementEquipment.js
@@ -52,4 +52,31 @@
         method:"post",
         data
     })
+}
+
+// 閫氱敤闄勪欢鏌ヨ
+export function getStorageAttachmentList(query) {
+  return request({
+    url: "/storageAttachment/list",
+    method: "get",
+    params: query,
+  });
+}
+
+// 閫氱敤闄勪欢淇濆瓨
+export function addStorageAttachment(data) {
+  return request({
+    url: "/storageAttachment/add",
+    method: "post",
+    data: data,
+  });
+}
+
+// 閫氱敤闄勪欢鍒犻櫎
+export function delStorageAttachment(ids) {
+  return request({
+    url: "/storageAttachment/delete",
+    method: "delete",
+    data: ids,
+  });
 }
\ No newline at end of file
diff --git a/src/api/financialManagement/accountPaymentApplication.js b/src/api/financialManagement/accountPaymentApplication.js
new file mode 100644
index 0000000..0d5e438
--- /dev/null
+++ b/src/api/financialManagement/accountPaymentApplication.js
@@ -0,0 +1,59 @@
+import request from "@/utils/request";
+
+/** 鏍规嵁渚涘簲鍟嗘煡璇㈠彲鍏宠仈鍏ュ簱鍗� */
+export function getInboundBatchesBySupplier(params) {
+  return request({
+    url: "/accountPaymentApplication/getInboundBatchesBySupplier",
+    method: "get",
+    params,
+  });
+}
+
+/** 鏂板浠樻鐢宠 */
+export function addAccountPaymentApplication(data) {
+  return request({
+    url: "/accountPaymentApplication/addAccountPaymentApplication",
+    method: "post",
+    data,
+  });
+}
+
+/** 浠樻鐢宠鍒嗛〉鍒楄〃 */
+export function listPageAccountPaymentApplication(params) {
+  return request({
+    url: "/accountPaymentApplication/listPageAccountPaymentApplication",
+    method: "get",
+    params,
+  });
+}
+
+/** 淇敼浠樻鐢宠 */
+export function updateAccountPaymentApplication(data) {
+  return request({
+    url: "/accountPaymentApplication/updateAccountPaymentApplication",
+    method: "put",
+    data,
+  });
+}
+
+/** 瀹℃牳浠樻鐢宠 */
+export function auditAccountPaymentApplication(data) {
+  return request({
+    url: "/accountPaymentApplication/auditAccountPaymentApplication",
+    method: "put",
+    data,
+  });
+}
+
+/** 鍒犻櫎浠樻鐢宠锛圫pring 瑕佹眰 ids=1&ids=2 鏌ヨ鍙傛暟锛� */
+export function deleteAccountPaymentApplication(ids) {
+  const idList = Array.isArray(ids) ? ids : [ids];
+  const query = idList
+    .filter((id) => id !== undefined && id !== null && id !== "")
+    .map((id) => `ids=${encodeURIComponent(id)}`)
+    .join("&");
+  return request({
+    url: `/accountPaymentApplication/deleteAccountPaymentApplication?${query}`,
+    method: "delete",
+  });
+}
diff --git a/src/api/financialManagement/accountPurchaseInvoice.js b/src/api/financialManagement/accountPurchaseInvoice.js
new file mode 100644
index 0000000..af391da
--- /dev/null
+++ b/src/api/financialManagement/accountPurchaseInvoice.js
@@ -0,0 +1,50 @@
+import request from "@/utils/request";
+
+/** 鏍规嵁渚涘簲鍟嗘煡璇㈠彲鍏宠仈鍏ュ簱鍗� */
+export function getInboundBatchesBySupplier(params) {
+  return request({
+    url: "/accountPurchaseInvoice/getInboundBatchesBySupplier",
+    method: "get",
+    params,
+  });
+}
+
+/** 鏂板杩涢」鍙戠エ */
+export function addAccountPurchaseInvoice(data) {
+  return request({
+    url: "/accountPurchaseInvoice/addAccountPurchaseInvoice",
+    method: "post",
+    data,
+  });
+}
+
+/** 杩涢」鍙戠エ鍒嗛〉鍒楄〃 */
+export function listPageAccountPurchaseInvoice(params) {
+  return request({
+    url: "/accountPurchaseInvoice/listPageAccountPurchaseInvoice",
+    method: "get",
+    params,
+  });
+}
+
+/** 浣滃簾杩涢」鍙戠エ */
+export function cancelAccountPurchaseInvoice(data) {
+  return request({
+    url: "/accountPurchaseInvoice/cancelAccountPurchaseInvoice",
+    method: "put",
+    data,
+  });
+}
+
+/** 鍒犻櫎杩涢」鍙戠エ锛圫pring 瑕佹眰 ids=1&ids=2 鏌ヨ鍙傛暟锛� */
+export function deleteAccountPurchaseInvoice(ids) {
+  const idList = Array.isArray(ids) ? ids : [ids];
+  const query = idList
+    .filter((id) => id !== undefined && id !== null && id !== "")
+    .map((id) => `ids=${encodeURIComponent(id)}`)
+    .join("&");
+  return request({
+    url: `/accountPurchaseInvoice/deleteAccountPurchaseInvoice?${query}`,
+    method: "delete",
+  });
+}
diff --git a/src/api/financialManagement/accountPurchasePayment.js b/src/api/financialManagement/accountPurchasePayment.js
new file mode 100644
index 0000000..a10f05a
--- /dev/null
+++ b/src/api/financialManagement/accountPurchasePayment.js
@@ -0,0 +1,32 @@
+import request from "@/utils/request";
+
+/** 鏂板浠樻鍗曪紙鍏宠仈浠樻鐢宠锛� */
+export function addAccountPurchasePayment(data) {
+  return request({
+    url: "/accountPurchasePayment/addAccountPurchasePayment",
+    method: "post",
+    data,
+  });
+}
+
+/** 浠樻鍗曞垎椤靛垪琛� */
+export function listPageAccountPurchasePayment(params) {
+  return request({
+    url: "/accountPurchasePayment/listPageAccountPurchasePayment",
+    method: "get",
+    params,
+  });
+}
+
+/** 鍒犻櫎浠樻鍗曪紙Spring 瑕佹眰 ids=1&ids=2 鏌ヨ鍙傛暟锛� */
+export function deleteAccountPurchasePayment(ids) {
+  const idList = Array.isArray(ids) ? ids : [ids];
+  const query = idList
+    .filter((id) => id !== undefined && id !== null && id !== "")
+    .map((id) => `ids=${encodeURIComponent(id)}`)
+    .join("&");
+  return request({
+    url: `/accountPurchasePayment/deleteAccountPurchasePayment?${query}`,
+    method: "delete",
+  });
+}
diff --git a/src/api/financialManagement/accountSalesCollection.js b/src/api/financialManagement/accountSalesCollection.js
new file mode 100644
index 0000000..abeb977
--- /dev/null
+++ b/src/api/financialManagement/accountSalesCollection.js
@@ -0,0 +1,50 @@
+import request from "@/utils/request";
+
+/** 鏍规嵁瀹㈡埛鏌ヨ鍙叧鑱斿嚭搴撳崟 */
+export function getOutboundBatchesByCustomer(params) {
+  return request({
+    url: "/accountSalesCollection/getOutboundBatchesByCustomer",
+    method: "get",
+    params,
+  });
+}
+
+/** 鏂板鏀舵鍗� */
+export function addAccountSalesCollection(data) {
+  return request({
+    url: "/accountSalesCollection/addAccountSalesCollection",
+    method: "post",
+    data,
+  });
+}
+
+/** 鏀舵鍗曞垎椤靛垪琛� */
+export function listPageAccountSalesCollection(params) {
+  return request({
+    url: "/accountSalesCollection/listPageAccountSalesCollection",
+    method: "get",
+    params,
+  });
+}
+
+/** 淇敼鏀舵鍗� */
+export function updateAccountSalesCollection(data) {
+  return request({
+    url: "/accountSalesCollection/updateAccountSalesCollection",
+    method: "put",
+    data,
+  });
+}
+
+/** 鍒犻櫎鏀舵鍗曪紙Spring 瑕佹眰 ids=1&ids=2 鏌ヨ鍙傛暟锛� */
+export function deleteAccountSalesCollection(ids) {
+  const idList = Array.isArray(ids) ? ids : [ids];
+  const query = idList
+    .filter((id) => id !== undefined && id !== null && id !== "")
+    .map((id) => `ids=${encodeURIComponent(id)}`)
+    .join("&");
+  return request({
+    url: `/accountSalesCollection/deleteAccountSalesCollection?${query}`,
+    method: "delete",
+  });
+}
diff --git a/src/api/financialManagement/accountSalesInvoice.js b/src/api/financialManagement/accountSalesInvoice.js
new file mode 100644
index 0000000..6e74c53
--- /dev/null
+++ b/src/api/financialManagement/accountSalesInvoice.js
@@ -0,0 +1,41 @@
+import request from "@/utils/request";
+
+/** 鏂板閿�椤瑰彂绁� */
+export function addAccountSalesInvoice(data) {
+  return request({
+    url: "/accountSalesInvoice/addAccountSalesInvoice",
+    method: "post",
+    data,
+  });
+}
+
+/** 閿�椤瑰彂绁ㄥ垎椤靛垪琛� */
+export function listPageAccountSalesInvoice(params) {
+  return request({
+    url: "/accountSalesInvoice/listPageAccountSalesInvoice",
+    method: "get",
+    params,
+  });
+}
+
+/** 浣滃簾閿�椤瑰彂绁� */
+export function cancelAccountSalesInvoice(data) {
+  return request({
+    url: "/accountSalesInvoice/cancelAccountSalesInvoice",
+    method: "put",
+    data,
+  });
+}
+
+/** 鍒犻櫎閿�椤瑰彂绁紙Spring 瑕佹眰 ids=1&ids=2 鏌ヨ鍙傛暟锛� */
+export function deleteAccountSalesInvoice(ids) {
+  const idList = Array.isArray(ids) ? ids : [ids];
+  const query = idList
+    .filter((id) => id !== undefined && id !== null && id !== "")
+    .map((id) => `ids=${encodeURIComponent(id)}`)
+    .join("&");
+  return request({
+    url: `/accountSalesInvoice/deleteAccountSalesInvoice?${query}`,
+    method: "delete",
+  });
+}
diff --git a/src/api/financialManagement/accountStatement.js b/src/api/financialManagement/accountStatement.js
new file mode 100644
index 0000000..bf80101
--- /dev/null
+++ b/src/api/financialManagement/accountStatement.js
@@ -0,0 +1,41 @@
+import request from "@/utils/request";
+
+/** 鎸夋湀浠芥煡璇㈠璐﹀崟鏄庣粏锛堢敓鎴愬墠棰勮锛� */
+export function getAccountStatementDetailsByMonth(params) {
+  return request({
+    url: "/accountStatement/getAccountStatementDetailsByMonth",
+    method: "get",
+    params,
+  });
+}
+
+/** 鏂板瀵硅处鍗� */
+export function addAccountStatement(data) {
+  return request({
+    url: "/accountStatement/addAccountStatement",
+    method: "post",
+    data,
+  });
+}
+
+/** 瀵硅处鍗曞垎椤靛垪琛� */
+export function listPageAccountStatement(params) {
+  return request({
+    url: "/accountStatement/listPageAccountStatement",
+    method: "get",
+    params,
+  });
+}
+
+/** 鍒犻櫎瀵硅处鍗曪紙Spring 瑕佹眰 ids=1&ids=2 鏌ヨ鍙傛暟锛� */
+export function deleteAccountStatement(ids) {
+  const idList = Array.isArray(ids) ? ids : [ids];
+  const query = idList
+    .filter((id) => id !== undefined && id !== null && id !== "")
+    .map((id) => `ids=${encodeURIComponent(id)}`)
+    .join("&");
+  return request({
+    url: `/accountStatement/deleteAccountStatement?${query}`,
+    method: "delete",
+  });
+}
diff --git a/src/api/financialManagement/expenseManagement.js b/src/api/financialManagement/expenseManagement.js
deleted file mode 100644
index a22af1b..0000000
--- a/src/api/financialManagement/expenseManagement.js
+++ /dev/null
@@ -1,85 +0,0 @@
-import request from "@/utils/request";
-
-// 鏌ヨ鍒楄〃
-export const listPage = (params) => {
-  return request({
-    url: "/account/accountExpense/listPage",
-    method: "get",
-    params,
-  });
-};
-export const listPageAnalysis = (params) => {
-  return request({
-    url: "/account/accountExpense/report/analysis",
-    method: "get",
-    params,
-  });
-};
-
-// 鏂板
-export function add(data) {
-  return request({
-    url: "/account/accountExpense/add",
-    method: "post",
-    data: data,
-  });
-}
-
-// 缂栬緫
-export function update(data) {
-  return request({
-    url: "/account/accountExpense/update",
-    method: "post",
-    data: data,
-  });
-}
-
-//瀵煎嚭
-export const exportAccountExpense = (query) => {
-  return request({
-    url: "/account/accountExpense/export",
-    method: "post",
-    data: query,
-    responseType: "blob",
-  });
-};
-
-export const delAccountExpense = (query) => {
-  return request({
-    url: `account/accountExpense/del`,
-    method: "delete",
-    data: query,
-  });
-};
-
-export const getAccountExpense = (id) => {
-  return request({
-    url: `/account/accountExpense/${id}`,
-    method: "get",
-  });
-};
-
-// 鏌ヨ闄勪欢鍒楄〃
-export function fileListPage(query) {
-  return request({
-    url: "/account/accountFile/listPage",
-    method: "get",
-    params: query,
-  });
-}
-// 淇濆瓨闄勪欢鍒楄〃
-export function fileAdd(query) {
-  return request({
-    url: "/account/accountFile/add",
-    method: "post",
-    data: query,
-  });
-}
-// 鍒犻櫎闄勪欢鍒楄〃
-export function fileDel(query) {
-  return request({
-    url: "/account/accountFile/del",
-    method: "delete",
-    data: query,
-  });
-}
diff --git a/src/api/financialManagement/financialStatements.js b/src/api/financialManagement/financialStatements.js
index 537d36f..6c3b306 100644
--- a/src/api/financialManagement/financialStatements.js
+++ b/src/api/financialManagement/financialStatements.js
@@ -1,31 +1,13 @@
 import request from "@/utils/request";
 
-// 鏍规嵁鏃ユ湡鏌ヨ
-export const reportForms = (params) => {
-  console.log(params);
+/**
+ * 鑾峰彇璐㈠姟鎶ヨ〃鏈堝害鏄庣粏
+ * @param {Object} params { entryDateStart, entryDateEnd }
+ */
+export function accountStatementDetailsByMonth(params) {
   return request({
-    url: "/account/accountExpense/report/forms",
+    url: "/accounting/accountStatementDetailsByMonth",
     method: "get",
     params,
   });
-};
-
-// 鏌ヨ姣忔湀鏁版嵁-鏀跺叆
-export const reportIncome = (params) => {
-  console.log(params);
-  return request({
-    url: "/account/accountExpense/report/income",
-    method: "get",
-    params,
-  });
-};
-
-// 鏌ヨ姣忔湀鏁版嵁-鏀嚭
-export const reportExpense = (params) => {
-  console.log(params);
-  return request({
-    url: "/account/accountExpense/report/expense",
-    method: "get",
-    params,
-  });
-};
+}
diff --git a/src/api/financialManagement/invoiceApply.js b/src/api/financialManagement/invoiceApply.js
new file mode 100644
index 0000000..a567d1c
--- /dev/null
+++ b/src/api/financialManagement/invoiceApply.js
@@ -0,0 +1,59 @@
+import request from "@/utils/request";
+
+/** 鏍规嵁瀹㈡埛鏌ヨ鍙紑绁ㄥ嚭搴撳崟鍙峰垪琛� */
+export function getOutboundBatchesByCustomer(params) {
+  return request({
+    url: "/accountInvoiceApplication/getOutboundBatchesByCustomer",
+    method: "get",
+    params,
+  });
+}
+
+/** 鏂板寮�绁ㄧ敵璇� */
+export function addAccountInvoiceApplication(data) {
+  return request({
+    url: "/accountInvoiceApplication/addAccountInvoiceApplication",
+    method: "post",
+    data,
+  });
+}
+
+/** 寮�绁ㄧ敵璇峰垎椤靛垪琛� */
+export function listPageAccountInvoiceApplication(params) {
+  return request({
+    url: "/accountInvoiceApplication/listPageAccountInvoiceApplication",
+    method: "get",
+    params,
+  });
+}
+
+/** 寮�绁ㄧ敵璇峰鎵� */
+export function auditAccountInvoiceApplication(data) {
+  return request({
+    url: "/accountInvoiceApplication/auditAccountInvoiceApplication",
+    method: "put",
+    data,
+  });
+}
+
+/** 淇敼寮�绁ㄧ敵璇� */
+export function updateAccountInvoiceApplication(data) {
+  return request({
+    url: "/accountInvoiceApplication/updateAccountInvoiceApplication",
+    method: "put",
+    data,
+  });
+}
+
+/** 鍒犻櫎寮�绁ㄧ敵璇凤紙Spring 瑕佹眰 ids=1&ids=2 鏌ヨ鍙傛暟锛� */
+export function deleteAccountInvoiceApplication(ids) {
+  const idList = Array.isArray(ids) ? ids : [ids];
+  const query = idList
+    .filter((id) => id !== undefined && id !== null && id !== "")
+    .map((id) => `ids=${encodeURIComponent(id)}`)
+    .join("&");
+  return request({
+    url: `/accountInvoiceApplication/deleteAccountInvoiceApplication?${query}`,
+    method: "delete",
+  });
+}
\ No newline at end of file
diff --git a/src/api/financialManagement/loanManagement.js b/src/api/financialManagement/loanManagement.js
deleted file mode 100644
index 46ea749..0000000
--- a/src/api/financialManagement/loanManagement.js
+++ /dev/null
@@ -1,37 +0,0 @@
-import request from "@/utils/request";
-
-// 鏌ヨ鍒楄〃
-export const listPage = (params) => {
-  return request({
-    url: "/borrowInfo/listPage",
-    method: "get",
-    params,
-  });
-};
-
-// 鏂板
-export function add(data) {
-  return request({
-    url: "/borrowInfo/add",
-    method: "post",
-    data: data,
-  });
-}
-
-// 缂栬緫
-export function update(data) {
-  return request({
-    url: "/borrowInfo/update",
-    method: "post",
-    data: data,
-  });
-}
-
-// 鍒犻櫎
-export const delAccountLoan = (data) => {
-  return request({
-    url: "/borrowInfo/delete",
-    method: "delete",
-    data,
-  });
-};
diff --git a/src/api/financialManagement/salesRefund.js b/src/api/financialManagement/salesRefund.js
deleted file mode 100644
index 84b87fb..0000000
--- a/src/api/financialManagement/salesRefund.js
+++ /dev/null
@@ -1,41 +0,0 @@
-import request from "@/utils/request";
-
-// 鏌ヨ鍒楄〃
-// /salesRefundAmountOrder/page
-export const listPage = (params) => {
-  return request({
-    url: "/salesRefundAmountOrder/page",
-    method: "get",
-    params,
-  });
-};
-
-// 鏂板 
-// /salesRefundAmountOrder/add
-export function add(data) {
-  return request({
-    url: "/salesRefundAmountOrder/add",
-    method: "post",
-    data: data,
-  });
-}
-
-// 淇敼
-// /salesRefundAmountOrder/update
-export function update(data) {
-  return request({
-    url: "/salesRefundAmountOrder/update",
-    method: "put",
-    data: data,
-  });
-}
-
-// 鍒犻櫎
-// /salesRefundAmountOrder/deleteByIds
-export function del(data) {
-  return request({
-    url: "/salesRefundAmountOrder/deleteByIds",
-    method: "delete",
-    data: data,
-  });
-}
\ No newline at end of file
diff --git a/src/api/inventoryManagement/stockInRecord.js b/src/api/inventoryManagement/stockInRecord.js
index 3142e09..255c1c9 100644
--- a/src/api/inventoryManagement/stockInRecord.js
+++ b/src/api/inventoryManagement/stockInRecord.js
@@ -41,4 +41,13 @@
         method: "post",
         data,
     });
+};
+
+// 鎵归噺鍙嶅鍏ュ簱璁板綍锛堜粎椹冲洖鐘舵�佸彲鍙嶅锛�
+export const batchUnapproveStockInRecords = (data) => {
+    return request({
+        url: "/stockInRecord/reAudit",
+        method: "post",
+        data,
+    });
 };
\ No newline at end of file
diff --git a/src/api/login.js b/src/api/login.js
index fea9d46..4cc0a5d 100644
--- a/src/api/login.js
+++ b/src/api/login.js
@@ -1,4 +1,5 @@
-import request from '@/utils/request'
+import request from '@/utils/request'
+import { getToken } from '@/utils/auth'
 
 // 鐧诲綍鏂规硶
 export function login(username, password, code, uuid) {
@@ -32,12 +33,14 @@
 }
 
 // 鑾峰彇鐢ㄦ埛璇︾粏淇℃伅
-export function getInfo() {
-  return request({
-    url: '/getInfo',
-    method: 'get'
-  })
-}
+export function getInfo() {
+  const token = getToken()
+  return request({
+    url: '/getInfo',
+    headers: token ? { Authorization: `Bearer ${token}` } : {},
+    method: 'get'
+  })
+}
 
 // 閫�鍑烘柟娉�
 export function logout() {
diff --git a/src/api/officeProcessAutomation/approvalInstance.js b/src/api/officeProcessAutomation/approvalInstance.js
new file mode 100644
index 0000000..054861c
--- /dev/null
+++ b/src/api/officeProcessAutomation/approvalInstance.js
@@ -0,0 +1,47 @@
+import request from "@/utils/request";
+
+/** 鍒嗛〉鏌ヨ瀹℃壒瀹炰緥 */
+export function listApprovalInstancePage(params) {
+  return request({
+    url: "/approvalInstance/listPage",
+    method: "get",
+    params,
+  });
+}
+
+/** 鎻愪氦/淇濆瓨瀹℃壒瀹炰緥 */
+export function saveApprovalInstance(approvalInstanceDto) {
+  return request({
+    url: "/approvalInstance/save",
+    method: "post",
+    data: approvalInstanceDto,
+  });
+}
+
+/** 鏇存柊瀹℃壒瀹炰緥 */
+export function updateApprovalInstance(approvalInstanceDto) {
+  return request({
+    url: "/approvalInstance/update",
+    method: "put",
+    data: approvalInstanceDto,
+  });
+}
+
+/** 瀹℃壒锛堥�氳繃/椹冲洖锛� */
+export function approveApprovalInstance(approvalInstanceDto) {
+  return request({
+    url: "/approvalInstance/approve",
+    method: "post",
+    data: approvalInstanceDto,
+  });
+}
+
+/** 鍒犻櫎瀹℃壒瀹炰緥锛坆ody 涓� ID 鏁扮粍锛� */
+export function deleteApprovalInstance(ids) {
+  const idList = (Array.isArray(ids) ? ids : [ids]).filter((id) => id != null && id !== "");
+  return request({
+    url: "/approvalInstance/delete",
+    method: "delete",
+    data: idList,
+  });
+}
diff --git a/src/api/officeProcessAutomation/approvalTemplate.js b/src/api/officeProcessAutomation/approvalTemplate.js
new file mode 100644
index 0000000..3ade018
--- /dev/null
+++ b/src/api/officeProcessAutomation/approvalTemplate.js
@@ -0,0 +1,58 @@
+import request from "@/utils/request";
+
+/** 妯℃澘绫诲瀷锛�0 绯荤粺鍐呯疆锛�1 鑷畾涔夛紙涓庡悗绔� templateType 涓�鑷达級 */
+export const TEMPLATE_TYPE_BUILTIN = 0;
+export const TEMPLATE_TYPE_CUSTOM = 1;
+
+/** 鏌ヨ鎵�鏈夊鎵规ā鏉� */
+export function listApprovalTemplate(type) {
+  return request({
+    url: `/approvalTemplate/list/${type}`,
+    method: "get",
+  });
+}
+
+/** 鍒嗛〉鏌ヨ瀹℃壒妯℃澘 */
+export function listApprovalTemplatePage(params) {
+  return request({
+    url: "/approvalTemplate/listPage",
+    method: "get",
+    params,
+  });
+}
+
+/** 鏌ヨ瀹℃壒妯℃澘璇︽儏 */
+export function getApprovalTemplateDetail(id) {
+  return request({
+    url: `/approvalTemplate/detail/${id}`,
+    method: "get",
+  });
+}
+
+/** 鏂板瀹℃壒妯℃澘锛坆ody 涓� ApprovalTemplateDto锛� */
+export function addApprovalTemplate(approvalTemplateDto) {
+  return request({
+    url: "/approvalTemplate/add",
+    method: "post",
+    data: approvalTemplateDto,
+  });
+}
+
+/** 淇敼瀹℃壒妯℃澘锛坆ody 涓� ApprovalTemplateDto锛� */
+export function updateApprovalTemplate(approvalTemplateDto) {
+  return request({
+    url: "/approvalTemplate/update",
+    method: "put",
+    data: approvalTemplateDto,
+  });
+}
+
+/** 鍒犻櫎瀹℃壒妯℃澘锛坆ody 涓烘ā鏉� ID 鏁扮粍锛� */
+export function deleteApprovalTemplate(ids) {
+  const idList = (Array.isArray(ids) ? ids : [ids]).filter((id) => id != null && id !== "");
+  return request({
+    url: "/approvalTemplate/delete",
+    method: "post",
+    data: idList,
+  });
+}
diff --git a/src/api/officeProcessAutomation/enterpriseNews.js b/src/api/officeProcessAutomation/enterpriseNews.js
new file mode 100644
index 0000000..52f345d
--- /dev/null
+++ b/src/api/officeProcessAutomation/enterpriseNews.js
@@ -0,0 +1,38 @@
+import request from "@/utils/request";
+
+/** 鍒嗛〉鏌ヨ浼佷笟鏂伴椈 */
+export function listEnterpriseNewsPage(params) {
+  return request({
+    url: "/enterpriseNews/listPage",
+    method: "get",
+    params,
+  });
+}
+
+/** 鏂板浼佷笟鏂伴椈 */
+export function saveEnterpriseNews(enterpriseNewsDto) {
+  return request({
+    url: "/enterpriseNews/save",
+    method: "post",
+    data: enterpriseNewsDto,
+  });
+}
+
+/** 淇敼浼佷笟鏂伴椈 */
+export function updateEnterpriseNews(enterpriseNewsDto) {
+  return request({
+    url: "/enterpriseNews/update",
+    method: "put",
+    data: enterpriseNewsDto,
+  });
+}
+
+/** 鍒犻櫎浼佷笟鏂伴椈锛坆ody 涓� ID 鏁扮粍锛� */
+export function deleteEnterpriseNews(ids) {
+  const idList = (Array.isArray(ids) ? ids : [ids]).filter((id) => id != null && id !== "");
+  return request({
+    url: "/enterpriseNews/delete",
+    method: "delete",
+    data: idList,
+  });
+}
diff --git a/src/api/officeProcessAutomation/finReimbursement.js b/src/api/officeProcessAutomation/finReimbursement.js
new file mode 100644
index 0000000..84c3560
--- /dev/null
+++ b/src/api/officeProcessAutomation/finReimbursement.js
@@ -0,0 +1,71 @@
+import request from "@/utils/request";
+
+/** 鍒嗛〉鏌ヨ璐㈠姟鎶ラ攢 GET /finReimbursement/listPage */
+export function listFinReimbursementPage(params) {
+  return request({
+    url: "/finReimbursement/listPage",
+    method: "get",
+    params,
+  });
+}
+
+/** 璇︽儏 query锛歋pring 缁戝畾 finReimbursementDto.id锛屽嬁鐢� finReimbursementDto[id] */
+function buildFinReimbursementDetailParams(idOrDto) {
+  const raw =
+    typeof idOrDto === "object" && idOrDto !== null
+      ? idOrDto.id ?? idOrDto.reimbursementId
+      : idOrDto;
+  return {
+    "finReimbursementDto.id": raw,
+    id: raw,
+  };
+}
+
+/** 鏌ヨ璐㈠姟鎶ラ攢璇︽儏 GET /finReimbursement/detail */
+export function getFinReimbursementDetail(idOrDto) {
+  return request({
+    url: "/finReimbursement/detail",
+    method: "get",
+    params: buildFinReimbursementDetailParams(idOrDto),
+  });
+}
+
+/** 鏂板璐㈠姟鎶ラ攢 POST /finReimbursement/save */
+export function saveFinReimbursement(finReimbursementDto) {
+  return request({
+    url: "/finReimbursement/save",
+    method: "post",
+    data: finReimbursementDto,
+  });
+}
+
+/** 淇敼璐㈠姟鎶ラ攢 POST /finReimbursement/update */
+export function updateFinReimbursement(finReimbursementDto) {
+  return request({
+    url: "/finReimbursement/update",
+    method: "post",
+    data: finReimbursementDto,
+  });
+}
+
+/** 鍒犻櫎璐㈠姟鎶ラ攢 DELETE /finReimbursement/delete锛坆ody 涓� ID 鏁扮粍锛� */
+export function deleteFinReimbursement(ids) {
+  const idList = (Array.isArray(ids) ? ids : [ids]).filter(
+    (id) => id != null && id !== ""
+  );
+  return request({
+    url: "/finReimbursement/delete",
+    method: "delete",
+    data: idList,
+  });
+}
+
+/** 鏂板璧� save锛屼慨鏀硅蛋 update锛堜笌鎺ュ彛鏂囨。涓�鑷达級 */
+export function persistFinReimbursement(finReimbursementDto, isEdit = false) {
+  if (isEdit) {
+    return updateFinReimbursement(finReimbursementDto);
+  }
+  const payload = { ...finReimbursementDto };
+  delete payload.id;
+  return saveFinReimbursement(payload);
+}
diff --git a/src/api/procurementManagement/invoiceEntry.js b/src/api/procurementManagement/invoiceEntry.js
deleted file mode 100644
index 8325aa7..0000000
--- a/src/api/procurementManagement/invoiceEntry.js
+++ /dev/null
@@ -1,69 +0,0 @@
-// 閲囪喘-鏉ョエ鐧昏鎺ュ彛
-import request from "@/utils/request";
-
-// 鏌ヨ閲囪喘鍚堝悓鍙�
-export function getProduct(query) {
-  return request({
-    url: "/purchase/ledger/getProduct",
-    method: "get",
-    params: query,
-  });
-}
-
-// 鏌ヨid閲囪喘鍚堝悓鍙�
-export function getPurchaseNoById(query) {
-  return request({
-    url: "/purchase/ledger/getPurchaseNoById",
-    method: "get",
-    params: query,
-  });
-}
-// 鏍规嵁閲囪喘鍚堝悓鍙锋煡璇㈣缁嗕俊鎭�
-export function getInfo(query) {
-  return request({
-    url: "/purchase/ledger/getInfo",
-    method: "get",
-    params: query,
-  });
-}
-// 涓诲垪琛ㄦ煡璇�
-export function gePurchaseList(query) {
-  return request({
-    url: "/purchase/ledger/list",
-    method: "get",
-    params: query,
-  });
-}
-// 涓诲垪琛ㄦ煡璇�
-export function getRegistrationById(query) {
-  return request({
-    url: "/purchase/registration/getRegistrationById",
-    method: "get",
-    params: query,
-  });
-}
-// 鏂板缂栬緫鏉ョエ鐧昏
-export function addOrUpdateRegistration(query) {
-  return request({
-    url: "/purchase/registration/addOrUpdateRegistration",
-    method: "post",
-    data: query,
-  });
-}
-// 鍒犻櫎鏉ョエ鐧昏
-export function delRegistration(query) {
-  return request({
-    url: "/purchase/registration/delRegistration",
-    method: "delete",
-    data: query,
-  });
-}
-
-// 涓诲垪琛ㄦ煡璇�
-export function gePurchaseListPage(query) {
-  return request({
-    url: "/purchase/ledger/listPage",
-    method: "get",
-    params: query,
-  });
-}
diff --git a/src/api/procurementManagement/paymentEntry.js b/src/api/procurementManagement/paymentEntry.js
deleted file mode 100644
index 6ef0eb9..0000000
--- a/src/api/procurementManagement/paymentEntry.js
+++ /dev/null
@@ -1,81 +0,0 @@
-// 閲囪喘浠樻鐧昏椤甸潰鎺ュ彛
-import request from "@/utils/request";
-
-// 鍒嗛〉鏌ヨ
-export function registrationList(query) {
-  return request({
-    url: "/purchase/paymentRegistration/list",
-    method: "get",
-    params: query,
-  });
-}
-// 鏌ヨ璇︽儏
-export function registrationInfo(query) {
-  return request({
-    url: "/purchase/paymentRegistration/" + query,
-    method: "get",
-  });
-}
-// 鏍规嵁閲囪喘鍚堝悓鍙锋煡璇㈣鎯�
-export function byPurchaseId(query) {
-  return request({
-    url: "/purchase/paymentRegistration/byPurchaseId/" + query,
-    method: "get",
-  });
-}
-// 鏌ヨ閲囪喘鍚堝悓鍙�
-export function getPurchaseNo() {
-  return request({
-    url: "/purchase/ledger/getPurchaseNo",
-    method: "get",
-  });
-}
-// 鏂板
-export function paymentRegistrationAdd(query) {
-  return request({
-    url: "/purchase/paymentRegistration",
-    method: "post",
-    data: query,
-  });
-}
-// 淇敼
-export function paymentRegistrationEdit(query) {
-  return request({
-    url: "/purchase/paymentRegistration",
-    method: "put",
-    data: query,
-  });
-}
-// 鍒犻櫎
-export function paymentRegistrationDel(query) {
-  return request({
-    url: "/purchase/paymentRegistration/delete",
-    method: "delete",
-    data: query,
-  });
-}
-// 鑾峰彇鍙戠エ鍙峰拰鍙戠エ閲戦
-export function getTicketNo(query) {
-  return request({
-    url: "/purchase/registration/getTicketNo",
-    method: "get",
-    params: query,
-  });
-}
-// 鍒嗛〉鏌ヨ
-export function paymentHistoryList(query) {
-  return request({
-    url: "/purchase/paymentRegistration/paymentHistoryList",
-    method: "get",
-    params: query,
-  });
-}
-
-// 鍒嗛〉鏌ヨ
-export function paymentHistoryListPage(query) {
-  return request({
-    url: "/purchase/paymentRegistration/paymentHistoryListPage",
-    method: "get",
-    params: query,
-  });
-}
diff --git a/src/api/procurementManagement/paymentLedger.js b/src/api/procurementManagement/paymentLedger.js
index 31aff29..6c5d9de 100644
--- a/src/api/procurementManagement/paymentLedger.js
+++ b/src/api/procurementManagement/paymentLedger.js
@@ -1,20 +1,20 @@
 // 閲囪喘鍙拌处椤甸潰鎺ュ彛
 import request from "@/utils/request";
 
-// 鍒嗛〉鏌ヨ
+/** 浠樻鍙拌处 - 渚涘簲鍟嗗線鏉ユ眹鎬� */
 export function paymentLedgerList(query) {
   return request({
-    url: "/purchase/paymentRegistration/supplierNameListPage",
+    url: "/purchase/report/supplierTransactions",
     method: "get",
     params: query,
   });
 }
 
-// 鍒嗛〉鏌ヨ
-export function paymentRecordList(supplierId) {
+/** 浠樻鍙拌处 - 渚涘簲鍟嗗線鏉ユ槑缁� */
+export function paymentRecordList(params) {
   return request({
-    url: "/purchase/paymentRegistration/supplierNameListPageDetails",
+    url: "/purchase/report/supplierTransactionsDetails",
     method: "get",
-    params: supplierId,
+    params,
   });
 }
diff --git a/src/api/procurementManagement/procurementInvoiceLedger.js b/src/api/procurementManagement/procurementInvoiceLedger.js
deleted file mode 100644
index d0716f9..0000000
--- a/src/api/procurementManagement/procurementInvoiceLedger.js
+++ /dev/null
@@ -1,124 +0,0 @@
-// 閲囪喘-鏉ョエ鍙拌处鎺ュ彛
-import request from "@/utils/request";
-
-// 鏌ヨ鍒楄〃
-export function invoiceList(query) {
-  return request({
-    url: "/purchase/registration/list",
-    method: "get",
-    params: query,
-  });
-}
-// 鏌ヨ璇︽儏
-// export function getInvoiceById(query) {
-//   return request({
-//     url: "/purchase/registration/getRegistrationById",
-//     method: "get",
-//     params: query,
-//   });
-// }
-// 鏂板銆佺紪杈�
-export function addOrUpdateInvoice(query) {
-  return request({
-    url: "/purchase/invoice/addOrUpdateInvoice",
-    method: "post",
-    data: query,
-  });
-}
-// 鍒犻櫎
-export function delInvoice(query) {
-  return request({
-    url: "/purchase/invoice/delInvoice",
-    method: "delete",
-    data: query,
-  });
-}
-// 鍒犻櫎鏉ョエ鍙拌处
-export function delRegistration(query) {
-  return request({
-    url: "/purchase/registration/delRegistration",
-    method: "delete",
-    data: query,
-  });
-}
-// 鍒犻櫎闄勪欢
-export function delCommonFile(query) {
-  return request({
-    url: "/commonFile/delCommonFile",
-    method: "delete",
-    data: query,
-  });
-}
-// 瀛愯〃鏍兼煡璇�
-export function productRecordList(query) {
-  return request({
-    url: "/purchase/registration/productRecordList",
-    method: "get",
-    params: query,
-  });
-}
-
-// 鏌ヨ鍒楄〃
-export function invoiceListPage(query) {
-  return request({
-    url: "/sales/product/listPagePurchaseLedger",
-    method: "get",
-    params: query,
-  });
-}
-
-export function productRecordPage(query) {
-  return request({
-    url: "/purchase/registration/productRecordPage",
-    method: "get",
-    params: query,
-  });
-}
-
-// export function getProductRecordById(params) {
-//   return request({
-//     url: "/purchase/registration/getProductRecordById",
-//     method: "get",
-//     params: params,
-//   });
-// }
-export function getProductRecordById(data) {
-  return request({
-    url: "/purchase/registration/getProductRecordById",
-     method: "post",
-    data: data,
-  });
-}
-
-export function updateRegistration(data) {
-  return request({
-    url: "/purchase/registration/updateRegistration",
-    method: "post",
-    data: data,
-  });
-}
-
-// 鏌ヨ浠樻鐧昏瀛愬垪琛�
-export function registrationListPageGetById(query) {
-  return request({
-    url: "/purchase/registration/getById",
-    method: "get",
-    params: query,
-  });
-}
-// 淇敼浠樻娴佹按
-export function updatePaymentRegistration(query) {
-  return request({
-    url: "/purchase/registration/updatePaymentRegistration",
-    method: "put",
-    data: query,
-  });
-}
-// 鍒犻櫎浠樻娴佹按
-export function delPaymentRegistration(query) {
-  return request({
-    url: "/purchase/registration/delPaymentRegistration",
-    method: "delete",
-    data: query,
-  });
-}
diff --git a/src/api/salesManagement/indicatorStats.js b/src/api/salesManagement/indicatorStats.js
index 47d7794..c29eac3 100644
--- a/src/api/salesManagement/indicatorStats.js
+++ b/src/api/salesManagement/indicatorStats.js
@@ -18,3 +18,21 @@
     params: query,
   });
 }
+
+// 瀹㈡埛寰�鏉ュ垪琛�
+export function customewTransactions(query) {
+  return request({
+    url: "/metricStatistics/customewTransactions",
+    method: "get",
+    params: query,
+  });
+}
+
+// 瀹㈡埛寰�鏉ユ槑缁�
+export function customewTransactionsDetails(query) {
+  return request({
+    url: "/metricStatistics/customewTransactionsDetails",
+    method: "get",
+    params: query,
+  });
+}
diff --git a/src/api/salesManagement/invoiceLedger.js b/src/api/salesManagement/invoiceLedger.js
index 6a54493..9545ec0 100644
--- a/src/api/salesManagement/invoiceLedger.js
+++ b/src/api/salesManagement/invoiceLedger.js
@@ -1,92 +1,10 @@
-// 寮�绁ㄥ彴璐﹂〉闈㈡帴鍙�
 import request from '@/utils/request'
 
-// 鍒嗛〉鏌ヨ
-export function invoiceLedgerList(query) {
-    return request({
-        url: '/invoiceLedger/page',
-        method: 'get',
-        params: query
-    })
-}
-
-// 鏂板
-export function invoiceLedgerSaveOrUpdate(query) {
-    return request({
-        url: '/invoiceLedger/saveOrUpdate',
-        method: 'post',
-        data: query
-    })
-}
-
-// 寮�绁ㄥ彴璐﹀垹闄�
-export function invoiceLedgerDel(query) {
-    return request({
-        url: '/invoiceLedger/del',
-        method: 'delete',
-        data: query
-    })
-}
-
-// 璇︽儏鏌ヨ
-export function invoiceLedgerDetail(query) {
-    return request({
-        url: '/invoiceLedger/info',
-        method: 'get',
-        params: query
-    })
-}
-
-// 闄勪欢鎻愪氦
-export function commitFile(query) {
-    return request({
-        url: '/invoiceLedger/commitFile',
-        method: 'post',
-        data: query
-    })
-}
-
-// 寮�绁ㄥ彴璐﹂儴鍒嗕篃鏌ヨ
-export function invoiceLedgerListNoPage(query) {
-    return request({
-        url: '/invoiceLedger/list',
-        method: 'get',
-        data: query
-    })
-}
-
-// 鍒嗛〉鏌ヨ
+/** 鍥炴鍙拌处 - 瀹㈡埛閿�鍞处鎴峰垎椤� */
 export function invoiceLedgerSalesAccount(query) {
-    return request({
-        url: '/invoiceLedger/salesAccount',
-        method: 'get',
-        params: query
-    })
+  return request({
+    url: '/invoiceLedger/salesAccount',
+    method: 'get',
+    params: query
+  })
 }
-
-// 浜у搧寮�绁ㄨ褰曞垎椤垫煡璇�
-export function registrationProductPage(query) {
-    return request({
-        url: '/invoiceLedger/registrationProductPage',
-        method: 'get',
-        params: query
-    })
-}
-
-// 浜у搧寮�绁ㄨ鎯呮煡璇�
-export function invoiceLedgerProductInfo(query) {
-    return request({
-        url: '/invoiceLedger/invoiceLedgerProductInfo',
-        method: 'get',
-        params: query
-    })
-}
-
-export function delInvoiceLedgerByRegProductId(invoiceRegistrationProductId) {
-    return request({
-        url: '/invoiceLedger/delInvoiceLedger/'+ invoiceRegistrationProductId,
-        method: 'delete'
-    })
-}
-
-
diff --git a/src/api/salesManagement/invoiceRegistration.js b/src/api/salesManagement/invoiceRegistration.js
deleted file mode 100644
index 4bc33ce..0000000
--- a/src/api/salesManagement/invoiceRegistration.js
+++ /dev/null
@@ -1,54 +0,0 @@
-// 閿�鍞彴璐﹂〉闈㈡帴鍙�
-import request from '@/utils/request'
-
-// 鍒嗛〉鏌ヨ
-export function invoiceRegistrationList(query) {
-    return request({
-        url: '/invoiceRegistration/listPage',
-        method: 'get',
-        params: query
-    })
-}
-// 寮�绁ㄧ櫥璁版柊澧�
-export function invoiceRegistrationSave(query) {
-    return request({
-        url: '/invoiceRegistration/save',
-        method: 'post',
-        data: query
-    })
-}
-// 寮�绁ㄧ櫥璁板垹闄�
-export function invoiceRegistrationDel(query) {
-    return request({
-        url: '/invoiceRegistration/del',
-        method: 'delete',
-        data: query
-    })
-}
-// 瀛愯〃鏍兼煡璇�
-export function productList(query) {
-    return request({
-        url: '/invoiceRegistration/productList',
-        method: 'get',
-        params: query
-    })
-}
-
-// 寮�绁ㄧ櫥璁拌鎯�
-export function invoiceRegistrationDetail(query) {
-    return request({
-        url: '/invoiceRegistration/detail',
-        method: 'get',
-        params: query
-    })
-}
-
-// 瀵煎嚭寮�绁ㄧ櫥璁�
-export function invoiceRegistrationExport(query) {
-    return request({
-        url: '/invoiceRegistration/export',
-        method: 'get',
-        params: query,
-        responseType: 'blob'
-    })
-}
diff --git a/src/api/salesManagement/receiptPayment.js b/src/api/salesManagement/receiptPayment.js
index 0f0529d..7fdb9a7 100644
--- a/src/api/salesManagement/receiptPayment.js
+++ b/src/api/salesManagement/receiptPayment.js
@@ -1,84 +1,10 @@
-// 寮�绁ㄧ櫥璁伴〉闈㈡帴鍙�
 import request from '@/utils/request'
 
-// 鏂板/淇敼
-export function receiptPaymentSaveOrUpdate(query) {
-    return request({
-        url: '/receiptPayment/saveOrUpdate',
-        method: 'post',
-        data: query
-    })
-}
-
-// 瀹㈡埛寰�鏉ヨ褰曟煡璇�
+/** 鍥炴鍙拌处 - 瀹㈡埛寰�鏉ヨ褰� */
 export function customerInteractions(query) {
-    return request({
-        url: '/receiptPayment/customerInteractions',
-        method: 'get',
-        params: query
-    })
-}
-
-// 璇︽儏
-export function receiptPaymentInfo(query) {
-    return request({
-        url: '/receiptPayment/info',
-        method: 'get',
-        params: query
-    })
-}
-
-// 鍒犻櫎
-export function receiptPaymentDel(query) {
-    return request({
-        url: '/receiptPayment/del',
-        method: 'delete',
-        data: query
-    })
-}
-
-// 鏌ヨ宸茬粡缁戝畾鍙戠エ鐨勫紑绁ㄥ彴璐�
-export function bindInvoiceNoRegPage(query) {
-    return request({
-        url: '/sales/product/listPageSalesLedger',
-        method: 'get',
-        params: query
-    })
-}
-
-// 寮�绁ㄥ彴璐﹁鎯�
-export function invoiceInfo(query) {
-    return request({
-        url: '/receiptPayment/invoiceInfo',
-        method: 'get',
-        params: query
-    })
-}
-
-// 璇㈠洖娆捐褰�
-export function receiptPaymentHistoryList(query) {
-    return request({
-        url: '/receiptPayment/receiptPaymentHistoryList',
-        method: 'get',
-        params: query
-    })
-}
-
-/**
- * 鏌ヨ鍥炴璁板綍鍒嗛〉鏌ヨ
- */
-export function receiptPaymentHistoryListPage(query) {
-    return request({
-        url: '/receiptPayment/receiptPaymentHistoryListPage',
-        method: 'get',
-        params: query
-    })
-}
-
-export function receiptPaymentHistoryListNoPage(query) {
-    return request({
-        url: '/receiptPayment/receiptPaymentHistoryListNoPage',
-        method: 'get',
-        params: query
-    })
+  return request({
+    url: '/receiptPayment/customerInteractions',
+    method: 'get',
+    params: query
+  })
 }
diff --git a/src/api/viewIndex.js b/src/api/viewIndex.js
index 8b5d144..9cae219 100644
--- a/src/api/viewIndex.js
+++ b/src/api/viewIndex.js
@@ -326,3 +326,59 @@
     method: "get",
   });
 };
+
+export const productionOverview = () => {
+  return request({
+    url: "/home/productionOverview",
+    method: "get",
+    headers: {
+      handleAuthError: false,
+    },
+  });
+};
+
+export const productionRealtimeBoard = () => {
+  return request({
+    url: "/home/productionRealtimeBoard",
+    method: "get",
+    headers: {
+      handleAuthError: false,
+    },
+  });
+};
+
+export const productionOrderProgress = (params = {}) => {
+  const safePageNum = Math.max(1, Number(params.pageNum || 1));
+  const safePageSize = Math.min(50, Math.max(1, Number(params.pageSize || 10)));
+  const safeTab = ["all", "inProgress", "completed", "paused"].includes(params.tab)
+    ? params.tab
+    : "all";
+  return request({
+    url: "/home/productionOrderProgress",
+    method: "get",
+    params: {
+      ...params,
+      tab: safeTab,
+      pageNum: safePageNum,
+      pageSize: safePageSize,
+    },
+    headers: {
+      handleAuthError: false,
+    },
+  });
+};
+
+export const todayProductionPlan = (params = {}) => {
+  const safeLimit = Math.min(20, Math.max(1, Number(params.limit || 4)));
+  return request({
+    url: "/home/todayProductionPlan",
+    method: "get",
+    params: {
+      ...params,
+      limit: safeLimit,
+    },
+    headers: {
+      handleAuthError: false,
+    },
+  });
+};
diff --git a/src/assets/images/head.svg b/src/assets/images/head.svg
new file mode 100644
index 0000000..e49d541
--- /dev/null
+++ b/src/assets/images/head.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="452" height="285" viewBox="0 0 452 285"><defs><pattern x="0" y="80.0157699584961" width="452" height="204.98422241210938" patternUnits="userSpaceOnUse" id="master_svg0_143_34844"><image x="-0.11198217826978407" y="0" width="452.22396435653957" height="204.98422241210938" xlink:href="data:image/png;base64,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"/></pattern><pattern x="111.42742919921875" y="0" width="206.67991638183594" height="206.78233337402344" patternUnits="userSpaceOnUse" id="master_svg1_143_34837"><image x="-0.05120849609375" y="0" width="206.78233337402344" height="206.78233337402344" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAyAAAAMgCAYAAADbcAZoAAAAAXNSR0IArs4c6QAAAARzQklUCAgICHwIZIgAACAASURBVHic7N17nN1ldS/+z2c9371nkpAwyVxygWpQERWrVdSD1nNUilYuggZjJdTaXyNQ5CZarWJfnrHnVw6tRe4WIrRVC1gwKAjGFk6hN6UKre0RBbVCAXOZS+7JzOz9fdY6fzzfPbMnJJm990wyk8x6v155JZnZ+7uf/d179jzr+zxrLcA555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzE+B0D8A559zM0H3xc1URyWr/t5j+Jglw/K8LM9v7QWT/v1ZIpuMBUNXnfQ0AiDDu+GYGkjAzWN3xzQxUg4ik/+/xvfq/SULNlg1c071h4jPhnHPuQPIAxDnnHLo+0T9fdo9sh9QFA1r3K6IWANRN6PdqggCkFiygLgDBnkGIyWjQQRKqmgIQ4fMDi7oApDbcWrCCuuCldmzStmx8prMbdzE2d4acc85NFQ9AnHPuENB9/n8eSwlXAjhZVUHwQUA/2X/zi386VY+x8Pf/88jS7iOWI68YQ8lopgCw8calj0/VY0yHro/0Lw0ivwDAWmCiJl8ZuGbRb0332JxzbjbyAMQ552a4rgt+fhyVj1DYgWLlgCSi6VYRnjjwZy96crrHeCjo/tjAB6n4S9StoIhkZ276/MJ7p3tszjk3m3gA4pybFTpW/+BrGXEaRKAKTRt2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"/></pattern></defs><rect x="0" y="80.0157699584961" width="452" height="204.98422241210938" rx="0" fill="url(#master_svg0_143_34844)" fill-opacity="1"/><rect x="111.42742919921875" y="0" width="206.67991638183594" height="206.78233337402344" rx="0" fill="url(#master_svg1_143_34837)" fill-opacity="1"/><g><path d="M171.28799999,112L197.784,47.968002L213.431999,47.968002L239.928001,112L223.99200100000002,112L217.751999,97.216003L193.464001,97.216003L187.224001,112L171.28799999,112ZM205.656002,63.424L196.535999,85.792L214.776001,85.792L205.656002,63.424ZM246.840004,112L246.840004,47.968002L260.472,47.968002L260.472,112L246.840004,112Z" fill="#FFFFFF" fill-opacity="1"/><path d="M217.751999,97.216003L223.99200100000002,112L239.928001,112L239.514206,111L213.431999,47.968002L197.784002,47.968002L171.70179313,111L171.28799999,112L187.224003,112L193.464001,97.216003L217.751999,97.216003ZM186.560656,111L192.800652,96.216003L218.41535199999998,96.216003L224.655346,111L238.43197600000002,111L212.763565,48.968002L198.452438,48.968002L172.7840257,111L186.560656,111ZM246.840012,111L246.840012,112L260.472008,112L260.472008,47.968002L246.840012,47.968002L246.840012,111ZM247.840012,111L259.472008,111L259.472008,48.968002L247.840012,48.968002L247.840012,111ZM206.581993,63.046455L204.730011,63.046455L195.048351,86.79200399999999L216.263653,86.79200399999999L206.581993,63.046455ZM205.116039,64.748333L205.656002,63.424004L206.195965,64.748333L214.368279,84.79200399999999L214.776001,85.79200399999999L196.536001,85.79200399999999L196.943726,84.79200399999999L205.116039,64.748333Z" fill-rule="evenodd" fill="#E2E6F7" fill-opacity="1"/></g></svg>
\ No newline at end of file
diff --git a/src/assets/logo/logo.png b/src/assets/logo/logo.png
index 0a486cd..a5831b8 100644
--- a/src/assets/logo/logo.png
+++ b/src/assets/logo/logo.png
Binary files differ
diff --git a/src/assets/styles/element-ui.scss b/src/assets/styles/element-ui.scss
index f296f9d..75c83ab 100644
--- a/src/assets/styles/element-ui.scss
+++ b/src/assets/styles/element-ui.scss
@@ -52,17 +52,17 @@
   left: 0;
   position: relative;
   margin: 0 auto;
-  border-radius: 24px;
+  border-radius: 16px;
   padding: 0 !important;
   border: 1px solid var(--surface-border);
   box-shadow: var(--shadow-md);
-  background: rgba(255, 255, 255, 0.96);
+  background: rgba(255, 255, 255, 0.95);
 }
 .el-dialog__header {
-  background: linear-gradient(180deg, rgba(247, 250, 248, 0.98), rgba(242, 247, 244, 0.88));
+  background: linear-gradient(180deg, rgba(248, 251, 255, 1), rgba(242, 247, 255, 0.98));
   padding: 18px 24px 14px;
   border-bottom: 1px solid var(--surface-border);
-  border-radius: 24px 24px 0 0;
+  border-radius: 14px 14px 0 0;
 }
 .el-dialog__title {
   font-weight: 600;
@@ -80,15 +80,16 @@
 }
 .el-message-box {
   padding: 0 !important;
-  border-radius: 22px;
+  border-radius: 16px;
   border: 1px solid var(--surface-border);
   box-shadow: var(--shadow-md);
+  background: rgba(255, 255, 255, 0.96);
 }
 .el-message-box__header {
-  background: linear-gradient(180deg, rgba(247, 250, 248, 0.98), rgba(242, 247, 244, 0.88));
+  background: linear-gradient(180deg, rgba(248, 251, 255, 1), rgba(242, 247, 255, 0.98));
   padding: 18px 24px 14px;
   border-bottom: 1px solid var(--surface-border);
-  border-radius: 22px 22px 0 0;
+  border-radius: 14px 14px 0 0;
 }
 .el-message-box__title {
   font-weight: 600;
@@ -161,7 +162,7 @@
 }
 
 .el-button {
-  border-radius: 12px;
+  border-radius: 8px;
   font-weight: 600;
   box-shadow: none !important;
 }
@@ -180,41 +181,44 @@
 .el-select__wrapper,
 .el-date-editor.el-input__wrapper,
 .el-date-editor .el-input__wrapper {
-  border-radius: 12px;
-  box-shadow: 0 0 0 1px rgba(216, 225, 219, 0.92) inset !important;
-  background: rgba(255, 255, 255, 0.9);
+  border-radius: 10px;
+  box-shadow: 0 0 0 1px rgba(148, 163, 184, 0.28) inset !important;
+  background: rgba(255, 255, 255, 0.92);
+  color: var(--text-primary);
 }
 
 .el-input__wrapper.is-focus,
 .el-select__wrapper.is-focused,
 .el-textarea__inner:focus {
-  box-shadow: 0 0 0 1px rgba(0, 47, 167, 0.28) inset !important;
+  box-shadow: 0 0 0 1px rgba(37, 99, 235, 0.56) inset !important;
 }
 
 .el-card {
   border: 1px solid var(--surface-border);
   box-shadow: var(--shadow-sm);
-  background: rgba(255, 255, 255, 0.88);
+  background: var(--panel-mask);
 }
 
 .el-table {
   --el-table-border-color: var(--surface-border);
-  --el-table-header-bg-color: var(--surface-soft);
-  --el-table-row-hover-bg-color: #f1f6f4;
-  --el-table-current-row-bg-color: #e9f0ed;
-  border-radius: 18px;
+  --el-table-header-bg-color: #f2f7ff;
+  --el-table-row-hover-bg-color: #f8fbff;
+  --el-table-current-row-bg-color: #edf4ff;
+  border-radius: 12px;
+  background: rgba(255, 255, 255, 0.94) !important;
 }
 
 .el-table th.el-table__cell {
-  background: var(--surface-soft) !important;
-  color: var(--text-secondary);
+  background: #f2f7ff !important;
+  color: #3b4f6c;
   font-weight: 600;
 }
 
 .el-table tr,
 .el-table td.el-table__cell,
 .el-table__body tr > td.el-table__cell {
-  background: var(--surface-base) !important;
+  background: rgba(255, 255, 255, 0.92) !important;
+  color: var(--text-secondary);
 }
 
 .el-table .el-table__body tr:hover > td.el-table__cell {
@@ -239,3 +243,19 @@
 .el-pagination {
   margin-top: 18px;
 }
+
+.el-empty__description p,
+.el-form-item__label,
+.el-radio-button__inner,
+.el-checkbox__label,
+.el-tabs__item,
+.el-select-dropdown__item,
+.el-dropdown-menu__item {
+  color: var(--text-secondary);
+}
+
+.el-date-editor .el-range-input,
+.el-input__inner,
+.el-textarea__inner {
+  color: var(--text-primary);
+}
diff --git a/src/assets/styles/index.scss b/src/assets/styles/index.scss
index f905a36..39d03cf 100644
--- a/src/assets/styles/index.scss
+++ b/src/assets/styles/index.scss
@@ -6,18 +6,19 @@
 @import './btn.scss';
 @import './ruoyi.scss';
 
-body {
-  height: 100%;
-  margin: 0;
+body {
+  height: 100%;
+  margin: 0;
   -moz-osx-font-smoothing: grayscale;
   -webkit-font-smoothing: antialiased;
-  text-rendering: optimizeLegibility;
-  font-family: "Segoe UI", "PingFang SC", "Microsoft YaHei", sans-serif;
-  background:
-    radial-gradient(circle at top left, rgba(214, 226, 219, 0.8), transparent 28%),
-    linear-gradient(180deg, #f7faf8 0%, var(--app-bg) 100%);
-  color: var(--text-primary);
-}
+  text-rendering: optimizeLegibility;
+  font-family: "Segoe UI", "PingFang SC", "Microsoft YaHei", sans-serif;
+  background:
+    radial-gradient(circle at 9% -6%, rgba(59, 130, 246, 0.14), transparent 36%),
+    radial-gradient(circle at 88% -8%, rgba(56, 189, 248, 0.12), transparent 30%),
+    linear-gradient(165deg, #f3f7fc 0%, #eef5ff 54%, #f8fbff 100%);
+  color: var(--text-primary);
+}
 
 label {
   font-weight: 600;
@@ -33,11 +34,11 @@
   height: 100%;
 }
 
-html,
-body,
-#app {
-  background-color: var(--app-bg);
-}
+html,
+body,
+#app {
+  background-color: var(--app-bg);
+}
 
 *,
 *:before,
@@ -109,16 +110,17 @@
   }
 }
 
-aside {
-  background: #eef1f6;
-  padding: 8px 24px;
-  margin-bottom: 20px;
-  border-radius: 2px;
+aside {
+  background: rgba(255, 255, 255, 0.84);
+  padding: 8px 24px;
+  margin-bottom: 20px;
+  border-radius: 12px;
+  border: 1px solid var(--surface-border);
   display: block;
   line-height: 32px;
   font-size: 16px;
   font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;
-  color: #2c3e50;
+  color: var(--text-secondary);
   -webkit-font-smoothing: antialiased;
   -moz-osx-font-smoothing: grayscale;
 
@@ -136,24 +138,25 @@
 .app-container {
   padding: 20px 24px 24px;
 }
-.search_form {
+.search_form {
   display: flex;
   align-items: center;
   justify-content: space-between;
-  .search_title {
+  .search_title {
     font-size: 14px;
     font-weight: 600;
     letter-spacing: 0.04em;
-    color: var(--text-secondary);
-  }
-}
-.table_list {
-  background: rgba(255, 255, 255, 0.88);
-  border: 1px solid var(--surface-border);
-  border-radius: var(--radius-md);
-  box-shadow: var(--shadow-sm);
-  padding: 18px;
-}
+    color: var(--text-secondary);
+  }
+}
+.table_list {
+  background: var(--panel-mask);
+  border: 1px solid var(--surface-border);
+  border-radius: var(--radius-md);
+  box-shadow: var(--shadow-sm);
+  backdrop-filter: blur(12px);
+  padding: 18px;
+}
 .components-container {
   margin: 30px 50px;
   position: relative;
@@ -187,15 +190,15 @@
   }
 }
 
-.link-type,
-.link-type:focus {
-  color: var(--el-color-primary);
-  cursor: pointer;
-
-  &:hover {
-    color: #165e57;
-  }
-}
+.link-type,
+.link-type:focus {
+  color: var(--accent-light);
+  cursor: pointer;
+
+  &:hover {
+    color: #2563eb;
+  }
+}
 
 .filter-container {
   padding-bottom: 10px;
diff --git a/src/assets/styles/sidebar.scss b/src/assets/styles/sidebar.scss
index be7b7a7..685a0eb 100644
--- a/src/assets/styles/sidebar.scss
+++ b/src/assets/styles/sidebar.scss
@@ -1,144 +1,259 @@
-#app {
-  .main-container {
-    min-height: 100%;
-    transition: margin-left 0.28s;
-    margin-left: $base-sidebar-width;
-    position: relative;
-    background: transparent;
-  }
-
-  .sidebarHide {
-    margin-left: 0 !important;
-  }
-
-  .sidebar-container {
-    transition: width 0.28s;
-    width: $base-sidebar-width !important;
-    height: 100%;
-    position: fixed;
-    font-size: 0px;
-    top: 0;
-    bottom: 0;
-    left: 0;
-    z-index: 1001;
-    overflow: hidden;
-    padding: 12px 0 16px 16px;
-    background: transparent;
-    box-shadow: none;
-
-    // reset element-ui css
-    .horizontal-collapse-transition {
-      transition: 0s width ease-in-out, 0s padding-left ease-in-out,
-        0s padding-right ease-in-out;
-    }
-
-    .scrollbar-wrapper {
-      overflow-x: hidden !important;
-    }
-
-    .el-scrollbar__bar.is-vertical {
-      right: 0px;
-    }
-
-    .el-scrollbar {
-      height: 100%;
-    }
-
-    &.has-logo {
-      .el-scrollbar {
-        height: calc(100% - 72px);
-        margin-top: 10px;
-      }
-    }
-
-    .is-horizontal {
-      display: none;
-    }
-
-    a {
-      display: inline-block;
-      width: 100%;
-      overflow: hidden;
-    }
-
-    .svg-icon {
-      margin-right: 16px;
-    }
-
-    .el-menu {
-      border: none;
-      height: 100%;
-      width: 100% !important;
-      padding: 10px 8px 18px;
-      border-radius: 22px;
-      background: var(--menu-surface);
-      backdrop-filter: blur(18px);
-      box-shadow: var(--shadow-sm);
+#app {
+  .main-container {
+    min-height: 100vh;
+    margin-left: var(--sidebar-width);
+    transition: margin-left 0.25s ease;
+    position: relative;
+    background: transparent;
+  }
+
+  .sidebarHide {
+    margin-left: 0 !important;
+  }
+
+  .sidebar-container {
+    transition: width 0.25s ease;
+    width: var(--sidebar-width) !important;
+    height: 100vh;
+    position: fixed;
+    top: 0;
+    left: 0;
+    z-index: 1001;
+    overflow: hidden;
+    padding: 0;
+    font-size: 0;
+    background: var(--sidebar-bg);
+    border-right: 1px solid rgba(255, 255, 255, 0.08);
+    box-shadow: 8px 0 24px rgba(15, 23, 42, 0.08);
+    isolation: isolate;
+
+    &::before {
+      content: "";
+      position: absolute;
+      inset: -28% -52% -18% -38%;
+      z-index: 0;
+      pointer-events: none;
+      background:
+        radial-gradient(circle at 9% 12%, rgba(var(--el-color-primary-rgb, 37, 99, 235), 0.62), transparent 44%),
+        radial-gradient(circle at 87% 18%, rgba(56, 189, 248, 0.4), transparent 48%),
+        radial-gradient(circle at 20% 82%, rgba(var(--el-color-primary-rgb, 37, 99, 235), 0.3), transparent 43%),
+        radial-gradient(circle at 66% 62%, rgba(125, 211, 252, 0.24), transparent 50%),
+        conic-gradient(
+          from 210deg at 58% 38%,
+          rgba(var(--el-color-primary-rgb, 37, 99, 235), 0.14) 0deg,
+          rgba(56, 189, 248, 0.05) 76deg,
+          rgba(var(--el-color-primary-rgb, 37, 99, 235), 0.16) 180deg,
+          rgba(125, 211, 252, 0.04) 290deg,
+          rgba(var(--el-color-primary-rgb, 37, 99, 235), 0.14) 360deg
+        );
+      filter: blur(7px) saturate(1.24) contrast(1.05);
+      opacity: 0.96;
+      transform: translate3d(0, 0, 0);
+      transform-origin: 44% 58%;
+      animation:
+        sidebarAuroraDrift 17.9s cubic-bezier(0.31, 0.03, 0.18, 0.99) infinite,
+        sidebarAuroraBreath 9.7s ease-in-out infinite,
+        sidebarAuroraSkew 6.9s steps(23, end) infinite;
     }
-
-    .el-menu-item,
-    .menu-title {
-      overflow: hidden !important;
-      text-overflow: ellipsis !important;
-      white-space: nowrap !important;
-    }
-
-    .el-menu-item .el-menu-tooltip__trigger {
-      display: inline-block !important;
-    }
-
-    // menu hover
-    .submenu-title-noDropdown,
-    .el-sub-menu__title {
-      &:hover {
-        background-color: var(--menu-hover) !important;
-        border-radius: 14px;
+
+    &::after {
+      content: "";
+      position: absolute;
+      inset: 0;
+      z-index: 0;
+      pointer-events: none;
+      background:
+        linear-gradient(
+          108deg,
+          transparent 10%,
+          rgba(255, 255, 255, 0.17) 34%,
+          rgba(255, 255, 255, 0.04) 48%,
+          transparent 72%
+        ),
+        linear-gradient(
+          202deg,
+          rgba(var(--el-color-primary-rgb, 37, 99, 235), 0.24) 0%,
+          transparent 34%,
+          rgba(56, 189, 248, 0.18) 66%,
+          transparent 100%
+        ),
+        radial-gradient(circle at 74% 12%, rgba(125, 211, 252, 0.25), transparent 50%),
+        radial-gradient(circle at 22% 84%, rgba(var(--el-color-primary-rgb, 37, 99, 235), 0.14), transparent 56%);
+      background-size: 236% 100%, 186% 186%, 164% 164%, 180% 180%;
+      background-position: 224% 0, 14% 16%, 78% 10%, 18% 82%;
+      opacity: 0.52;
+      transform: translate3d(0, 0, 0);
+      animation:
+        sidebarSheenSweep 13.1s linear infinite,
+        sidebarSheenJitter 4.7s steps(31, end) infinite;
+    }
+
+    > * {
+      position: relative;
+      z-index: 1;
+    }
+
+    .horizontal-collapse-transition {
+      transition: 0s width ease-in-out, 0s padding-left ease-in-out, 0s padding-right ease-in-out;
+    }
+
+    .scrollbar-wrapper {
+      overflow-x: hidden !important;
+      overflow-y: auto !important;
+    }
+
+    .el-scrollbar__bar.is-vertical {
+      right: 2px;
+    }
+
+    .el-scrollbar {
+      height: 100%;
+    }
+
+    &.has-logo {
+      .el-scrollbar {
+        height: calc(100% - 78px);
       }
     }
-    & .theme-light .is-active > .el-sub-menu__title {
-      color: var(--current-color) !important;
-    }
-
+
+    .is-horizontal {
+      display: none;
+    }
+
+    a {
+      display: inline-block;
+      width: 100%;
+      overflow: hidden;
+    }
+
+    .el-menu {
+      border: none !important;
+      height: 100%;
+      width: 100% !important;
+      padding: 10px 0 16px;
+      border-radius: 0;
+      background: transparent !important;
+      box-shadow: none;
+      backdrop-filter: none;
+    }
+
+    .el-menu-item,
+    .el-sub-menu__title,
+    .menu-title {
+      overflow: hidden !important;
+      text-overflow: ellipsis !important;
+      white-space: nowrap !important;
+    }
+
+    .el-menu-item .el-menu-tooltip__trigger {
+      display: inline-flex !important;
+      width: 100%;
+      align-items: center;
+    }
+
+    .submenu-title-noDropdown,
+    .el-sub-menu__title,
+    .el-menu-item {
+      min-width: 0 !important;
+      width: calc(100% - 24px) !important;
+      margin: 0 12px 8px !important;
+      height: 50px;
+      line-height: 50px;
+      border-radius: 14px;
+      padding-left: 16px !important;
+      padding-right: 36px !important;
+      box-sizing: border-box;
+      transition: all 0.28s ease;
+      color: var(--sidebar-text);
+      background: linear-gradient(128deg, rgba(255, 255, 255, 0.05), rgba(255, 255, 255, 0.01));
+      border: 1px solid rgba(255, 255, 255, 0.06) !important;
+      position: relative;
+      overflow: hidden;
+    }
+
+    .submenu-title-noDropdown::after,
+    .el-sub-menu__title::after,
+    .el-menu-item::after {
+      content: "";
+      position: absolute;
+      inset: 0;
+      background: linear-gradient(115deg, transparent 12%, rgba(255, 255, 255, 0.16), transparent 78%);
+      transform: translateX(-100%);
+      opacity: 0;
+      transition: transform 0.45s ease, opacity 0.26s ease;
+      pointer-events: none;
+    }
+
+    .submenu-title-noDropdown:hover,
+    .el-sub-menu__title:hover,
+    .el-menu-item:hover {
+      background: linear-gradient(128deg, rgba(var(--el-color-primary-rgb, 37, 99, 235), 0.28), rgba(var(--el-color-primary-rgb, 37, 99, 235), 0.08)) !important;
+      border-color: rgba(var(--el-color-primary-rgb, 37, 99, 235), 0.32) !important;
+      box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.18), 0 8px 18px rgba(8, 36, 76, 0.24);
+      transform: translateX(3px);
+    }
+
+    .submenu-title-noDropdown:hover::after,
+    .el-sub-menu__title:hover::after,
+    .el-menu-item:hover::after,
+    .el-menu-item.is-active::after,
+    .el-sub-menu.is-active > .el-sub-menu__title::after {
+      transform: translateX(100%);
+      opacity: 1;
+    }
+
+    & .theme-light .is-active > .el-sub-menu__title,
+    & .theme-dark .is-active > .el-sub-menu__title,
+    & .el-menu-item.is-active {
+      color: #fff !important;
+      background: var(--menu-active-bg, linear-gradient(135deg, var(--el-color-primary), var(--el-color-primary-light-3))) !important;
+      background-size: 180% 180%;
+      box-shadow: var(--menu-active-glow, 0 10px 24px rgba(var(--el-color-primary-rgb, 37, 99, 235), 0.34));
+      border-color: rgba(var(--el-color-primary-rgb, 37, 99, 235), 0.5) !important;
+      animation: sidebarActiveFlow 4.6s ease infinite;
+    }
+
     & .nest-menu .el-sub-menu > .el-sub-menu__title,
     & .el-sub-menu .el-menu-item {
       min-width: 0 !important;
-      margin: 0 12px 6px;
-      width: calc(100% - 24px);
-      padding-left: 8px !important;
-      padding-right: 8px !important;
-      box-sizing: border-box;
+      width: calc(100% - 24px) !important;
+      margin: 0 12px 8px !important;
+      height: 46px;
+      line-height: 46px;
+      padding-left: 14px !important;
+      padding-right: 14px !important;
+      border-radius: 12px;
+      transition: all 0.24s ease;
+      color: var(--sidebar-text);
+      border: 1px solid rgba(255, 255, 255, 0.06) !important;
+      background: linear-gradient(128deg, rgba(255, 255, 255, 0.04), rgba(255, 255, 255, 0.01));
 
       &:hover {
-        background-color: var(--menu-hover) !important;
+        background: linear-gradient(128deg, rgba(var(--el-color-primary-rgb, 37, 99, 235), 0.24), rgba(var(--el-color-primary-rgb, 37, 99, 235), 0.07)) !important;
+        border-color: rgba(var(--el-color-primary-rgb, 37, 99, 235), 0.3) !important;
+        transform: translateX(2px);
       }
+
       &.is-active {
-        background-color: var(--menu-active-bg) !important;
-        border-radius: 14px;
-      }
-    }
-
-    & .theme-light .nest-menu .el-sub-menu > .el-sub-menu__title,
-    & .theme-light .el-sub-menu .el-menu-item {
-      //background-color: transparent;
-
-      &:hover {
-        background-color: var(--menu-hover) !important;
-        border-radius: 14px;
+        background: var(--menu-active-bg, linear-gradient(135deg, var(--el-color-primary), var(--el-color-primary-light-3))) !important;
+        background-size: 180% 180%;
+        color: #fff !important;
+        font-weight: 500;
+        box-shadow: var(--menu-active-glow, 0 10px 24px rgba(var(--el-color-primary-rgb, 37, 99, 235), 0.34));
+        animation: sidebarActiveFlow 4.6s ease infinite;
       }
     }
   }
-
+
   .hideSidebar {
     .sidebar-container {
-      width: 68px !important;
-      padding-left: 0;
-      padding-right: 0;
+      width: var(--sidebar-collapsed-width) !important;
     }
 
     .main-container {
-      margin-left: 84px;
+      margin-left: var(--sidebar-collapsed-width);
     }
-
+
     .submenu-title-noDropdown {
       padding: 0 !important;
       position: relative;
@@ -169,13 +284,14 @@
         justify-content: center;
 
         .svg-icon {
-          width: 18px;
-          height: 18px;
+          width: 22px;
+          height: 22px;
           margin-right: 0;
           flex-shrink: 0;
         }
       }
     }
+
     .el-sub-menu {
       overflow: hidden;
 
@@ -194,14 +310,14 @@
 
     .el-menu--collapse {
       width: 100% !important;
-      padding: 10px 6px 18px;
+      padding: 12px 0 16px;
 
       > .el-menu-item,
       .el-sub-menu {
         & > .el-sub-menu__title,
         &.el-menu-item {
-          margin: 0 0 6px;
-          width: 100%;
+          width: calc(100% - 12px) !important;
+          margin: 0 6px 8px !important;
           padding-left: 0 !important;
           padding-right: 0 !important;
           box-sizing: border-box;
@@ -210,14 +326,10 @@
           justify-content: center;
 
           .svg-icon {
-            width: 18px;
-            height: 18px;
+            width: 22px;
+            height: 22px;
             margin-right: 0;
             flex-shrink: 0;
-          }
-
-          &:hover {
-            border-radius: 14px;
           }
 
           & > span {
@@ -225,99 +337,328 @@
             width: 0;
             overflow: hidden;
             visibility: hidden;
-            display: inline-block;
-          }
-          & > i {
-            height: 0;
-            width: 0;
-            overflow: hidden;
-            visibility: hidden;
-            display: inline-block;
+            display: inline-block;
           }
         }
       }
     }
   }
-
-  .el-menu--collapse .el-menu .el-sub-menu {
-    min-width: $base-sidebar-width !important;
-  }
-
-  // mobile responsive
-  .mobile {
-    .main-container {
-      margin-left: 0px;
-    }
-
-    .sidebar-container {
-      transition: transform 0.28s;
-      width: $base-sidebar-width !important;
-    }
-
-    &.hideSidebar {
-      .sidebar-container {
-        pointer-events: none;
-        transition-duration: 0.3s;
-        transform: translate3d(-$base-sidebar-width, 0, 0);
-      }
-    }
-  }
-
-  .withoutAnimation {
-    .main-container,
-    .sidebar-container {
-      transition: none;
-    }
-  }
-}
-
-// when menu collapsed
-.el-menu--vertical {
-  & > .el-menu {
-    .svg-icon {
-      margin-right: 16px;
-    }
-  }
-
+
+  .el-menu--collapse .el-menu .el-sub-menu {
+    min-width: var(--sidebar-width) !important;
+  }
+
+  .mobile {
+    .main-container {
+      margin-left: 0;
+    }
+
+    .sidebar-container {
+      transition: transform 0.25s;
+      width: var(--sidebar-width) !important;
+    }
+
+    &.hideSidebar {
+      .sidebar-container {
+        pointer-events: none;
+        transition-duration: 0.3s;
+        transform: translate3d(calc(-1 * var(--sidebar-width)), 0, 0);
+      }
+    }
+  }
+
+  .withoutAnimation {
+    .main-container,
+    .sidebar-container {
+      transition: none;
+    }
+  }
+}
+
+.el-menu--vertical {
+  & > .el-menu {
+    .svg-icon {
+      margin-right: 10px;
+    }
+  }
+
   .nest-menu .el-sub-menu > .el-sub-menu__title,
   .el-menu-item {
     min-width: 0 !important;
-    margin: 0 12px 6px;
-    width: calc(100% - 24px);
-    padding-left: 8px !important;
-    padding-right: 8px !important;
+    margin: 0 10px 8px;
+    width: calc(100% - 20px);
+    height: 46px;
+    line-height: 46px;
+    padding-left: 12px !important;
+    padding-right: 12px !important;
     box-sizing: border-box;
+    border-radius: 12px;
+    color: var(--sidebar-text);
+    border: 1px solid rgba(255, 255, 255, 0.06) !important;
+    background: linear-gradient(128deg, rgba(255, 255, 255, 0.05), rgba(255, 255, 255, 0.01));
+    transition: all 0.24s ease;
 
     &:hover {
-      // you can use $sub-menuHover
-      background-color: var(--menu-hover) !important;
+      background: linear-gradient(128deg, rgba(var(--el-color-primary-rgb, 37, 99, 235), 0.24), rgba(var(--el-color-primary-rgb, 37, 99, 235), 0.07)) !important;
+      border-color: rgba(var(--el-color-primary-rgb, 37, 99, 235), 0.3) !important;
+      transform: translateX(2px);
     }
+
     &.is-active {
-      background-color: var(--menu-active-bg) !important;
-      border-radius: 14px;
+      background: var(--menu-active-bg, linear-gradient(135deg, var(--el-color-primary), var(--el-color-primary-light-3))) !important;
+      background-size: 180% 180%;
+      color: #fff !important;
+      border-radius: 12px;
+      box-shadow: var(--menu-active-glow, 0 10px 24px rgba(var(--el-color-primary-rgb, 37, 99, 235), 0.34));
+      border-color: rgba(var(--el-color-primary-rgb, 37, 99, 235), 0.5) !important;
+      animation: sidebarActiveFlow 4.6s ease infinite;
     }
   }
-
-  // the scroll bar appears when the sub-menu is too long
-  > .el-menu--popup {
-    max-height: 100vh;
-    overflow-y: auto;
-    padding: 8px;
-    border-radius: 18px;
-    border: 1px solid var(--surface-border);
-    box-shadow: var(--shadow-md);
-
-    &::-webkit-scrollbar-track-piece {
-      background: #dfe7e1;
-    }
-
-    &::-webkit-scrollbar {
-      width: 6px;
-    }
-
-    &::-webkit-scrollbar-thumb {
-      background: #9aa79e;
-      border-radius: 20px;
-    }
-  }
-}
+
+  > .el-menu--popup {
+    max-height: 100vh;
+    overflow: hidden;
+    padding: 10px;
+    border-radius: 14px;
+    position: relative;
+    isolation: isolate;
+    border: 1px solid rgba(var(--el-color-primary-rgb, 37, 99, 235), 0.26);
+    box-shadow:
+      0 18px 40px rgba(var(--el-color-primary-rgb, 37, 99, 235), 0.16),
+      var(--shadow-md);
+    background: var(--sidebar-bg);
+    backdrop-filter: blur(16px);
+
+    &::before {
+      content: "";
+      position: absolute;
+      inset: -28% -52% -18% -38%;
+      z-index: 0;
+      pointer-events: none;
+      background:
+        radial-gradient(circle at 9% 12%, rgba(var(--el-color-primary-rgb, 37, 99, 235), 0.62), transparent 44%),
+        radial-gradient(circle at 87% 18%, rgba(56, 189, 248, 0.4), transparent 48%),
+        radial-gradient(circle at 20% 82%, rgba(var(--el-color-primary-rgb, 37, 99, 235), 0.3), transparent 43%),
+        radial-gradient(circle at 66% 62%, rgba(125, 211, 252, 0.24), transparent 50%),
+        conic-gradient(
+          from 210deg at 58% 38%,
+          rgba(var(--el-color-primary-rgb, 37, 99, 235), 0.14) 0deg,
+          rgba(56, 189, 248, 0.05) 76deg,
+          rgba(var(--el-color-primary-rgb, 37, 99, 235), 0.16) 180deg,
+          rgba(125, 211, 252, 0.04) 290deg,
+          rgba(var(--el-color-primary-rgb, 37, 99, 235), 0.14) 360deg
+        );
+      filter: blur(7px) saturate(1.24) contrast(1.05);
+      opacity: 0.96;
+      transform: translate3d(0, 0, 0);
+      transform-origin: 44% 58%;
+      animation:
+        sidebarAuroraDrift 17.9s cubic-bezier(0.31, 0.03, 0.18, 0.99) infinite,
+        sidebarAuroraBreath 9.7s ease-in-out infinite,
+        sidebarAuroraSkew 6.9s steps(23, end) infinite;
+    }
+
+    &::after {
+      content: "";
+      position: absolute;
+      inset: 0;
+      z-index: 0;
+      pointer-events: none;
+      background:
+        linear-gradient(
+          108deg,
+          transparent 10%,
+          rgba(255, 255, 255, 0.17) 34%,
+          rgba(255, 255, 255, 0.04) 48%,
+          transparent 72%
+        ),
+        linear-gradient(
+          202deg,
+          rgba(var(--el-color-primary-rgb, 37, 99, 235), 0.24) 0%,
+          transparent 34%,
+          rgba(56, 189, 248, 0.18) 66%,
+          transparent 100%
+        ),
+        radial-gradient(circle at 74% 12%, rgba(125, 211, 252, 0.25), transparent 50%),
+        radial-gradient(circle at 22% 84%, rgba(var(--el-color-primary-rgb, 37, 99, 235), 0.14), transparent 56%);
+      background-size: 236% 100%, 186% 186%, 164% 164%, 180% 180%;
+      background-position: 224% 0, 14% 16%, 78% 10%, 18% 82%;
+      opacity: 0.52;
+      transform: translate3d(0, 0, 0);
+      animation:
+        sidebarSheenSweep 13.1s linear infinite,
+        sidebarSheenJitter 4.7s steps(31, end) infinite;
+    }
+
+    > * {
+      position: relative;
+      z-index: 1;
+    }
+
+    > .el-menu {
+      max-height: calc(100vh - 20px);
+      overflow-y: auto;
+      overflow-x: hidden;
+
+      &::-webkit-scrollbar-track-piece {
+        background: var(--surface-muted);
+      }
+
+      &::-webkit-scrollbar {
+        width: 5px;
+      }
+
+      &::-webkit-scrollbar-thumb {
+        background: var(--accent-light);
+        border-radius: 10px;
+      }
+    }
+  }
+}
+
+@keyframes sidebarActiveFlow {
+  0% {
+    background-position: 0% 50%;
+  }
+  50% {
+    background-position: 100% 50%;
+  }
+  100% {
+    background-position: 0% 50%;
+  }
+}
+
+@keyframes sidebarAuroraDrift {
+  0% {
+    transform: translate3d(-6.3%, -1.8%, 0) scale(1.05) rotate(-1.8deg);
+  }
+  6% {
+    transform: translate3d(2.2%, -4.6%, 0) scale(1.08) rotate(0.7deg);
+  }
+  17% {
+    transform: translate3d(-3.7%, 4.4%, 0) scale(1.11) rotate(2deg);
+  }
+  27% {
+    transform: translate3d(5.6%, 1.2%, 0) scale(1.03) rotate(-1deg);
+  }
+  39% {
+    transform: translate3d(-4.8%, -3.1%, 0) scale(1.09) rotate(1.5deg);
+  }
+  52% {
+    transform: translate3d(2.9%, 4.8%, 0) scale(1.04) rotate(-1.4deg);
+  }
+  64% {
+    transform: translate3d(-6.4%, 0.3%, 0) scale(1.08) rotate(0.5deg);
+  }
+  73% {
+    transform: translate3d(4.8%, -3.9%, 0) scale(1.05) rotate(1.6deg);
+  }
+  81% {
+    transform: translate3d(-2.4%, 2.9%, 0) scale(1.1) rotate(-0.8deg);
+  }
+  92% {
+    transform: translate3d(3.7%, -1.7%, 0) scale(1.06) rotate(-1.6deg);
+  }
+  100% {
+    transform: translate3d(-5.9%, 0.8%, 0) scale(1.08) rotate(1.2deg);
+  }
+}
+
+@keyframes sidebarAuroraBreath {
+  0% {
+    opacity: 0.76;
+    filter: blur(5px) saturate(1.08);
+  }
+  15% {
+    opacity: 1;
+    filter: blur(7px) saturate(1.28);
+  }
+  37% {
+    opacity: 0.84;
+    filter: blur(8px) saturate(1.12);
+  }
+  61% {
+    opacity: 0.98;
+    filter: blur(6px) saturate(1.24);
+  }
+  83% {
+    opacity: 0.86;
+    filter: blur(7px) saturate(1.16);
+  }
+  100% {
+    opacity: 0.94;
+    filter: blur(6px) saturate(1.2);
+  }
+}
+
+@keyframes sidebarAuroraSkew {
+  0% {
+    transform-origin: 44% 58%;
+  }
+  21% {
+    transform-origin: 62% 42%;
+  }
+  43% {
+    transform-origin: 31% 66%;
+  }
+  66% {
+    transform-origin: 68% 74%;
+  }
+  100% {
+    transform-origin: 39% 45%;
+  }
+}
+
+@keyframes sidebarSheenSweep {
+  0% {
+    background-position: 232% 0, 10% 18%, 80% 12%, 20% 82%;
+  }
+  8% {
+    background-position: 186% 0, 16% 30%, 74% 18%, 28% 74%;
+  }
+  21% {
+    background-position: 116% 0, 34% 10%, 62% 26%, 18% 64%;
+  }
+  37% {
+    background-position: 52% 0, 50% 24%, 46% 12%, 32% 58%;
+  }
+  52% {
+    background-position: -4% 0, 34% 54%, 22% 22%, 12% 46%;
+  }
+  69% {
+    background-position: -62% 0, 14% 36%, 32% 34%, 24% 56%;
+  }
+  84% {
+    background-position: -106% 0, 20% 20%, 46% 20%, 34% 70%;
+  }
+  100% {
+    background-position: -136% 0, 10% 18%, 80% 12%, 20% 82%;
+  }
+}
+
+@keyframes sidebarSheenJitter {
+  0% {
+    opacity: 0.28;
+    transform: translate3d(0, 0, 0);
+  }
+  17% {
+    opacity: 0.56;
+    transform: translate3d(1.8%, -0.5%, 0);
+  }
+  38% {
+    opacity: 0.34;
+    transform: translate3d(-1.2%, 0.8%, 0);
+  }
+  63% {
+    opacity: 0.6;
+    transform: translate3d(2.3%, -0.3%, 0);
+  }
+  81% {
+    opacity: 0.3;
+    transform: translate3d(-1.6%, 0.7%, 0);
+  }
+  100% {
+    opacity: 0.52;
+    transform: translate3d(2%, -0.1%, 0);
+  }
+}
diff --git a/src/assets/styles/variables.module.scss b/src/assets/styles/variables.module.scss
index 55b3822..461b545 100644
--- a/src/assets/styles/variables.module.scss
+++ b/src/assets/styles/variables.module.scss
@@ -8,31 +8,32 @@
 $yellow: #fec171;
 $panGreen: #30b08f;
 
-// menu palette
-$menuText: #677287;
-$menuActiveText: #1f7a72;
-$menuBg: #f4f7f4;
-$menuHover: #e7eeea;
+// menu palette - 浣跨敤涓婚鑹�
+$menuText: #5a6478;
+$menuActiveText: #ffffff;
+$menuBg: #f8fafb;
+$menuHover: rgba(var(--el-color-primary-rgb, 13, 148, 136), 0.08);
 
-// light theme
-$menuLightBg: #f4f7f4;
-$menuLightHover: #e7eeea;
-$menuLightText: #3b4658;
-$menuLightActiveText: #1f7a72;
+// light theme - 浣跨敤涓婚鑹�
+$menuLightBg: #f8fafb;
+$menuLightHover: rgba(var(--el-color-primary-rgb, 13, 148, 136), 0.08);
+$menuLightText: #3d4858;
+$menuLightActiveText: #ffffff;
 
 // layout
 $base-sidebar-width: 216px;
+$base-sidebar-collapsed-width: 72px;
 $sideBarWidth: 216px;
 
-// sidebar
-$base-menu-color: #677287;
-$base-menu-color-active: #1f7a72;
-$base-menu-background: #f4f7f4;
-$base-sub-menu-background: #eef3ef;
+// sidebar - 浼樺寲鍚庣殑渚ц竟鏍忛厤鑹�
+$base-menu-color: #5a6478;
+$base-menu-color-active: #0d9488;
+$base-menu-background: #f8fafb;
+$base-sub-menu-background: #f0f5f4;
 $base-sub-menu-hover: #ffffff;
 
-// component
-$--color-primary: #1f7a72;
+// component - 浼樺寲鍚庣殑涓婚鑹�
+$--color-primary: #0d9488;
 $--color-success: #67c23a;
 $--color-warning: #d89b41;
 $--color-danger: #d25b52;
@@ -64,88 +65,130 @@
 }
 
 :root {
-  --sidebar-bg: #{$menuBg};
-  --sidebar-text: #{$menuText};
-  --sidebar-muted: #93a0b1;
-  --menu-hover: #{$menuHover};
-  --menu-active-bg: #dfe9e4;
-  --menu-surface: rgba(255, 255, 255, 0.72);
+  --sidebar-width: 216px;
+  --sidebar-collapsed-width: 72px;
+  --topbar-height: 64px;
+  --tagsbar-height: 40px;
+  --content-gap: 16px;
+  --content-radius: 16px;
+  --layout-header-z: 20;
 
-  --app-bg: #eef2ee;
-  --app-bg-accent: #dfe8e2;
-  --surface-base: #ffffff;
-  --surface-soft: #f7faf8;
-  --surface-muted: #eff4f1;
-  --surface-border: #d8e1db;
-  --surface-border-strong: #c9d5ce;
-  --text-primary: #21313f;
-  --text-secondary: #5f6d7e;
-  --text-tertiary: #8a98a8;
-  --shadow-sm: 0 10px 30px rgba(31, 49, 38, 0.06);
-  --shadow-md: 0 18px 50px rgba(31, 49, 38, 0.1);
-  --radius-lg: 24px;
-  --radius-md: 18px;
+  --el-color-primary: #2563eb;
+  --el-color-primary-rgb: 37, 99, 235;
+  --el-color-success: #14b8a6;
+  --el-color-warning: #f59e0b;
+  --el-color-danger: #ef4444;
+
+  --sidebar-bg: linear-gradient(180deg, #0e2a4f 0%, #123e69 55%, #0e2a4f 100%);
+  --sidebar-text: rgba(234, 242, 255, 0.82);
+  --sidebar-muted: rgba(234, 242, 255, 0.82);
+  --menu-hover: rgba(147, 197, 253, 0.2);
+  --menu-active-bg: linear-gradient(135deg, #2f80ff 0%, #38bdf8 100%);
+  --menu-active-text: #f8fbff;
+  --menu-surface: linear-gradient(180deg, rgba(13, 43, 79, 0.97) 0%, rgba(8, 28, 52, 0.94) 100%);
+  --menu-active-glow: 0 8px 18px rgba(56, 139, 255, 0.28);
+
+  --app-bg: #f3f7fc;
+  --app-bg-accent: #eef5ff;
+  --surface-base: rgba(255, 255, 255, 0.92);
+  --surface-soft: rgba(255, 255, 255, 0.88);
+  --surface-muted: #f5f9ff;
+  --surface-border: rgba(148, 163, 184, 0.18);
+  --surface-border-strong: rgba(96, 165, 250, 0.34);
+  --text-primary: #1e293b;
+  --text-secondary: #334155;
+  --text-tertiary: #64748b;
+  --shadow-sm: 0 12px 32px rgba(15, 23, 42, 0.06);
+  --shadow-md: 0 20px 42px rgba(15, 23, 42, 0.1);
+  --shadow-menu: 0 16px 36px rgba(8, 27, 58, 0.26);
+  --radius-lg: 20px;
+  --radius-md: 16px;
   --radius-sm: 12px;
+  --radius-xs: 10px;
 
-  --navbar-bg: rgba(255, 255, 255, 0.78);
-  --navbar-text: #21313f;
-  --navbar-hover: rgba(31, 122, 114, 0.08);
+  --navbar-bg: rgba(255, 255, 255, 0.86);
+  --navbar-text: #1f3658;
+  --navbar-hover: rgba(37, 99, 235, 0.08);
 
   --tags-bg: transparent;
-  --tags-item-bg: rgba(255, 255, 255, 0.74);
-  --tags-item-border: rgba(201, 213, 206, 0.88);
-  --tags-item-text: #5f6d7e;
-  --tags-item-hover: rgba(31, 122, 114, 0.08);
-  --tags-close-hover: rgba(31, 122, 114, 0.18);
+  --tags-item-bg: rgba(255, 255, 255, 0.9);
+  --tags-item-border: rgba(148, 163, 184, 0.22);
+  --tags-item-text: #334155;
+  --tags-item-hover: #f4f8ff;
+  --tags-close-hover: rgba(37, 99, 235, 0.16);
 
-  --splitpanes-default-bg: #ffffff;
+  --accent-primary: #2563eb;
+  --accent-light: #3b82f6;
+  --accent-lighter: #60a5fa;
+
+  --panel-mask: rgba(255, 255, 255, 0.88);
+  --panel-glow: inset 0 1px 0 rgba(255, 255, 255, 0.58);
+  --splitpanes-default-bg: #f3f7fc;
 }
 
 html.dark {
-  --el-bg-color: #141414;
-  --el-bg-color-overlay: #1d1e1f;
-  --el-text-color-primary: #ffffff;
-  --el-text-color-regular: #d0d0d0;
-  --el-border-color: #434343;
-  --el-border-color-light: #434343;
+  --el-bg-color: #f8fbff;
+  --el-bg-color-overlay: #f3f7fd;
+  --el-text-color-primary: #1e293b;
+  --el-text-color-regular: #475569;
+  --el-border-color: rgba(148, 163, 184, 0.2);
+  --el-border-color-light: rgba(148, 163, 184, 0.18);
 
-  --sidebar-bg: #141414;
-  --sidebar-text: #ffffff;
-  --menu-hover: #2d2d2d;
-  --menu-active-text: #{$menuActiveText};
+  --sidebar-bg: linear-gradient(180deg, #0e2a4f 0%, #123e69 55%, #0e2a4f 100%);
+  --sidebar-text: rgba(234, 242, 255, 0.82);
+  --sidebar-muted: rgba(234, 242, 255, 0.82);
+  --menu-hover: rgba(147, 197, 253, 0.2);
+  --menu-active-bg: linear-gradient(135deg, #2f80ff 0%, #38bdf8 100%);
+  --menu-active-text: #f8fbff;
+  --menu-surface: linear-gradient(180deg, rgba(13, 43, 79, 0.97) 0%, rgba(8, 28, 52, 0.94) 100%);
 
-  --navbar-bg: #141414;
-  --navbar-text: #ffffff;
-  --navbar-hover: #141414;
+  --text-primary: #1e293b;
+  --text-secondary: #334155;
+  --text-tertiary: #64748b;
+  --accent-primary: #2563eb;
+  --accent-light: #3b82f6;
 
-  --tags-bg: #141414;
-  --tags-item-bg: #1d1e1f;
-  --tags-item-border: #303030;
-  --tags-item-text: #d0d0d0;
-  --tags-item-hover: #2d2d2d;
-  --tags-close-hover: #64666a;
+  --navbar-bg: rgba(255, 255, 255, 0.86);
+  --navbar-text: #1f3658;
+  --navbar-hover: rgba(37, 99, 235, 0.08);
 
-  --splitpanes-bg: #141414;
-  --splitpanes-border: #303030;
-  --splitpanes-splitter-bg: #1d1e1f;
-  --splitpanes-splitter-hover-bg: #2d2d2d;
+  --tags-bg: transparent;
+  --tags-item-bg: rgba(255, 255, 255, 0.9);
+  --tags-item-border: rgba(148, 163, 184, 0.22);
+  --tags-item-text: #334155;
+  --tags-item-hover: #f4f8ff;
+  --tags-close-hover: rgba(37, 99, 235, 0.16);
 
-  --blockquote-bg: #1d1e1f;
-  --blockquote-border: #303030;
-  --blockquote-text: #d0d0d0;
-  --cron-border: #303030;
-  --splitpanes-default-bg: #141414;
+  --splitpanes-bg: #f3f7fc;
+  --splitpanes-border: rgba(148, 163, 184, 0.22);
+  --splitpanes-splitter-bg: #e7eef8;
+  --splitpanes-splitter-hover-bg: #d9e6f7;
+
+  --blockquote-bg: #f3f7ff;
+  --blockquote-border: rgba(59, 130, 246, 0.36);
+  --blockquote-text: #334155;
+  --cron-border: rgba(148, 163, 184, 0.22);
+  --splitpanes-default-bg: #f3f7fc;
 
   .sidebar-container {
     .el-menu-item,
     .menu-title {
-      color: var(--el-text-color-regular);
+      color: var(--sidebar-text);
+    }
+    
+    .el-menu-item.is-active,
+    .el-menu-item.is-active .menu-title {
+      color: var(--menu-active-text) !important;
     }
 
     & .theme-dark .nest-menu .el-sub-menu > .el-sub-menu__title,
     & .theme-dark .el-sub-menu .el-menu-item {
       background-color: var(--el-bg-color) !important;
     }
+    
+    & .theme-dark .el-sub-menu .el-menu-item.is-active {
+      background-color: var(--menu-active-bg) !important;
+    }
   }
 
   .el-menu--horizontal {
diff --git a/src/assets/system/BOM.svg b/src/assets/system/BOM.svg
new file mode 100644
index 0000000..9c7f434
--- /dev/null
+++ b/src/assets/system/BOM.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="59.5" height="62.90625" viewBox="0 0 59.5 62.90625"><defs><linearGradient x1="0" y1="0.16914062201976776" x2="0.8045321262753937" y2="1.0460527890370677" id="master_svg0_141_37616"><stop offset="48.549023270606995%" stop-color="#F7F7F7" stop-opacity="1"/><stop offset="100%" stop-color="#FFFFFF" stop-opacity="1"/></linearGradient><linearGradient x1="-0.03565644100308418" y1="0" x2="0.8226521556701855" y2="0.9991461352834076" id="master_svg1_141_37562"><stop offset="46.036821603775024%" stop-color="#F3F3F3" stop-opacity="1"/><stop offset="100%" stop-color="#FFFFFF" stop-opacity="1"/></linearGradient><clipPath id="master_svg2_143_35778"><rect x="14" y="0" width="32" height="32" rx="0"/></clipPath></defs><path d="M1.204819142818451,26.096379L28.69276814281845,42.307213000000004L58.29516614281845,26.096379L28.69276814281845,12L1.204819142818451,26.096379Z" fill="#FFFFFF" fill-opacity="1"/><path d="M0.16870074281845082,26.065809L28.43877614281845,42.737896L28.68361514281845,42.882288L59.39288714281845,26.065309L28.684561142818453,11.44229615L0.16870074281845082,26.065809ZM28.70192014281845,41.732138L2.240937742818451,26.12695L28.70097614281845,12.55770427L57.19744514281845,26.127449L28.70192014281845,41.732138Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/><path d="M0.5,26.80120277404785L0.5,45.83131777404785L28.692764,62.042150774047855L28.692764,43.01204077404785L0.5,26.80120277404785Z" fill="url(#master_svg0_141_37616)" fill-opacity="1"/><path d="M29.192764,62.906411774047854L29.192764,42.722777774047856L28.941999,42.578587774047854L-5.999999996841865e-8,25.93693918404785L0,46.12058077404785L29.192764,62.906411774047854ZM28.192764,43.30130377404785L28.192764,61.17788877404785L1,45.542054774047855L1,27.66546636404785L28.192764,43.30130377404785Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/><g transform="matrix(-1,0,0,1,118,0)"><path d="M59,26.80120277404785L59,45.12649377404785L88.5,62.00042177404785L88.5,42.26604677404785L59,26.80120277404785Z" fill="url(#master_svg1_141_37562)" fill-opacity="1"/><path d="M89,62.86243677404785L89,41.96362277404785L88.732151,41.82320777404785L58.50000003,25.97454732404785L58.50000003,45.41651177404785L89,62.86243677404785ZM88,42.568469774047855L88,61.13840677404785L59.5,44.836475774047855L59.5,27.627858224047852L88,42.568469774047855Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/></g><g clip-path="url(#master_svg2_143_35778)"><path d="M16.87011742591858,20.681764625C16.9285550115,21.747077625,17.8163673875,22.577077625,18.8835551875,22.563638625L29.2344931875,22.563638625L29.2344931875,25.430513625L25.2735547875,25.430513625C24.8566794875,25.430513625,24.5185546875,25.768640625,24.5185546875,26.185512625C24.5185546875,26.602386625,24.8566794875,26.940511625,25.2735547875,26.940511625L34.7276171875,26.940511625C35.144493187500004,26.940511625,35.4826161875,26.602386625,35.4826161875,26.185512625C35.4826161875,25.768640625,35.1444911875,25.430513625,34.7276171875,25.430513625L30.7663681875,25.430513625L30.7663681875,22.563638625L41.117616187500005,22.563638625C42.1844921875,22.577075625,43.072304187499995,21.747075625,43.1310541875,20.681764625L43.1310541875,18.953014625L16.87011742591858,18.953014625L16.87011742591858,20.681764625ZM41.1173041875,5.05676746367L18.883554687500002,5.05676746367C17.7919921875,5.044579985,16.8941795825,5.913329955,16.8701171875,7.004579925L16.8701171875,17.268015625L43.1307411875,17.268015625L43.1307411875,7.004579925C43.106680187500004,5.913017635,42.2088661875,5.044579985,41.1173041875,5.05676746367Z" fill="#496FFE" fill-opacity="1" style="mix-blend-mode:passthrough"/></g></svg>
\ No newline at end of file
diff --git a/src/assets/system/ai.svg b/src/assets/system/ai.svg
new file mode 100644
index 0000000..5f45ee2
--- /dev/null
+++ b/src/assets/system/ai.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="380.89990234375" height="372.80078125" viewBox="0 0 380.89990234375 372.80078125"><defs><pattern x="13.89990234375" y="167.900390625" width="367" height="166" patternUnits="userSpaceOnUse" id="master_svg0_143_34844"><image x="0" y="-0.17693836978131117" width="367" height="166.35387673956262" xlink:href="data:image/png;base64,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"/></pattern><pattern x="79.32733154296875" y="74.900390625" width="206.67991638183594" height="206.78233337402344" patternUnits="userSpaceOnUse" id="master_svg1_143_34837"><image x="-0.05120849609375" y="0" width="206.78233337402344" height="206.78233337402344" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAyAAAAMgCAYAAADbcAZoAAAAAXNSR0IArs4c6QAAAARzQklUCAgICHwIZIgAACAASURBVHic7N17nN1ldS/+z2c9371nkpAwyVxygWpQERWrVdSD1nNUilYuggZjJdTaXyNQ5CZarWJfnrHnVw6tRe4WIrRVC1gwKAjGFk6hN6UKre0RBbVCAXOZS+7JzOz9fdY6fzzfPbMnJJm990wyk8x6v155JZnZ+7uf/d179jzr+zxrLcA555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzzjnnnHPOOeecc84555xzE+B0D8A559zM0H3xc1URyWr/t5j+Jglw/K8LM9v7QWT/v1ZIpuMBUNXnfQ0AiDDu+GYGkjAzWN3xzQxUg4ik/+/xvfq/SULNlg1c071h4jPhnHPuQPIAxDnnHLo+0T9fdo9sh9QFA1r3K6IWANRN6PdqggCkFiygLgDBnkGIyWjQQRKqmgIQ4fMDi7oApDbcWrCCuuCldmzStmx8prMbdzE2d4acc85NFQ9AnHPuENB9/n8eSwlXAjhZVUHwQUA/2X/zi386VY+x8Pf/88jS7iOWI68YQ8lopgCw8calj0/VY0yHro/0Lw0ivwDAWmCiJl8ZuGbRb0332JxzbjbyAMQ552a4rgt+fhyVj1DYgWLlgCSi6VYRnjjwZy96crrHeCjo/tjAB6n4S9StoIhkZ276/MJ7p3tszjk3m3gA4pybFTpW/+BrGXEaRKAKTRt2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"/></pattern></defs><rect x="13.89990234375" y="167.900390625" width="367" height="166" rx="0" fill="url(#master_svg0_143_34844)" fill-opacity="1"/><rect x="79.32733154296875" y="74.900390625" width="206.67991638183594" height="206.78233337402344" rx="0" fill="url(#master_svg1_143_34837)" fill-opacity="1"/><g><path d="M139.18790233375,186.900390625L165.68390234375,122.868392625L181.33190134375,122.868392625L207.82790334375,186.900390625L191.89190334375002,186.900390625L185.65190134375,172.116393625L161.36390334375,172.116393625L155.12390334375,186.900390625L139.18790233375,186.900390625ZM173.55590434375,138.324390625L164.43590134375,160.692390625L182.67590334375,160.692390625L173.55590434375,138.324390625ZM214.73990634375,186.900390625L214.73990634375,122.868392625L228.37190234374998,122.868392625L228.37190234374998,186.900390625L214.73990634375,186.900390625Z" fill="#FFFFFF" fill-opacity="1"/><path d="M185.65190134375,172.116393625L191.89190334375002,186.900390625L207.82790334375,186.900390625L207.41410834375,185.900390625L181.33190134375,122.868392625L165.68390434375,122.868392625L139.60169547375,185.900390625L139.18790233375,186.900390625L155.12390534375,186.900390625L161.36390334375,172.116393625L185.65190134375,172.116393625ZM154.46055834375,185.900390625L160.70055434375,171.116393625L186.31525434374998,171.116393625L192.55524834375,185.900390625L206.33187834375002,185.900390625L180.66346734375,123.868392625L166.35234034375,123.868392625L140.68392804375,185.900390625L154.46055834375,185.900390625ZM214.73991434375,185.900390625L214.73991434375,186.900390625L228.37191034375002,186.900390625L228.37191034375002,122.868392625L214.73991434375,122.868392625L214.73991434375,185.900390625ZM215.73991434375,185.900390625L227.37191034375002,185.900390625L227.37191034375002,123.868392625L215.73991434375,123.868392625L215.73991434375,185.900390625ZM174.48189534375,137.946845625L172.62991334375,137.946845625L162.94825334375,161.692394625L184.16355534375,161.692394625L174.48189534375,137.946845625ZM173.01594134375,139.648723625L173.55590434375,138.324394625L174.09586734375,139.648723625L182.26818134375,159.692394625L182.67590334375,160.692394625L164.43590334375,160.692394625L164.84362834375,159.692394625L173.01594134375,139.648723625Z" fill-rule="evenodd" fill="#E2E6F7" fill-opacity="1"/></g><path d="M181.03737234375,51.027744395Q182.03354234375,50.984443635,183.03024234375,50.955862269L183.05888234375,51.955462325Q182.06956234375,51.983808525,181.08081234375,52.026801425L181.03737234375,51.027744395ZM172.04366234375,51.720317005Q174.02491234375,51.500955875,176.01177234375,51.340186175L176.09243234375,52.336925725Q174.12028234375,52.496511825,172.15371234375,52.714242925L172.04366234375,51.720317005ZM167.09549234374998,52.360937525Q168.08639234375,52.213984525,169.07935234375,52.081752025L169.21139234375,53.072996125Q168.22574234375,53.204284225,167.24216234375,53.350121525L167.09549234374998,52.360937525ZM158.23325234375,53.979113625Q160.17093234375,53.558054225,162.12014234375,53.194085825L162.30369234375001,54.177096325Q160.36891234375,54.538365325,158.44559234374998,54.956299325L158.23325234375,53.979113625ZM153.36297234375002,55.132375225Q154.33571234375,54.882904325,155.31206234375,54.647931825L155.54604234375,55.620178225000004Q154.57692234375,55.853413625,153.61136234375,56.101017025L153.36297234375002,55.132375225ZM144.72354134375001,57.657829325Q146.61345634375,57.036274425,148.52086634375001,56.470681625L148.80514534374998,57.429419525Q146.91186534374998,57.990807025,145.03596534374998,58.607769925L144.72354134375001,57.657829325ZM139.99185134375,59.311944025Q140.93434934375,58.962696125,141.88194234374998,58.627520525L142.21542334375,59.570271525Q141.27481834374998,59.902988425000004,140.33931734375,60.249637625L139.99185134375,59.311944025ZM131.66394834375,62.717643625Q133.48324634375,61.901856625,135.32585134375,61.140151625L135.70787834375,62.064305625Q133.87901334375,62.820330625,132.07310534375,63.630112625L131.66394834375,62.717643625ZM127.12737234375,64.853932625Q128.02841234375,64.409004625,128.93596634375,63.977537625L129.36532634374998,64.880674625Q128.46451534375,65.308926625,127.57015234375,65.750575625L127.12737234375,64.853932625ZM119.19712834375,69.10426662500001Q120.92459834375,68.10291062499999,122.68093134375,67.153081625L123.15663134375,68.03269362500001Q121.41317734375,68.975562625,119.69862334375,69.969421625L119.19712834375,69.10426662500001ZM114.90772234375001,71.698261625Q115.75703434375001,71.162862625,116.61421234375,70.640155625L117.13485734375,71.493924625Q116.28401934375,72.01277962500001,115.44097934375,72.54420462499999L114.90772234375001,71.698261625ZM107.45834334375,76.748943625Q109.07444034375,75.57273062499999,110.72465134375,74.444879625L111.28891034374999,75.270475625Q109.65093634375,76.389959625,108.04680234375,77.557472625L107.45834334375,76.748943625ZM103.46362734375,79.771280625Q104.25187634375,79.151578625,105.04924034375,78.543651625L105.65554034375,79.338893625Q104.86407134375,79.942317625,104.08168034375001,80.557422625L103.46362734375,79.771280625ZM96.57452734374999,85.569305625Q98.06130934375,84.23079662500001,99.58710134374999,82.93692762500001L100.23386734375,83.699607625Q98.71938334375,84.983920625,97.24359134375,86.312503625L96.57452734374999,85.569305625ZM92.91767834375,88.986293625Q93.63644434375,88.289275625,94.36546734375,87.602996625L95.05091834375,88.331107625Q94.32731634375,89.01231362499999,93.61383034375001,89.704189625L92.91767834375,88.986293625ZM86.66326934375,95.470214625Q88.00439434375,93.983653625,89.38901134375,92.53751762499999L90.11130934375001,93.229106625Q88.73696134375001,94.66448162500001,87.40576934375,96.14006062499999L86.66326934375,95.470214625ZM83.38322434375,99.244186625Q84.02494034375,98.477615625,84.67793634374999,97.720634625L85.43513534375,98.373809625Q84.78699534375,99.125167625,84.15001334375,99.88608562499999L83.38322434375,99.244186625ZM77.83154634375,106.34478762500001Q79.01226634375,104.72605862500001,80.24050334374999,103.14307762499999L81.03057434375,103.75609162500001Q79.81140534375,105.327400625,78.63946334375,106.934093625L77.83154634375,106.34478762500001ZM74.96307034375,110.434200625Q75.52103234375,109.606593625,76.09117134375,108.787322625L76.91197734375,109.358531625Q76.34598734375,110.171840625,75.79222834375,110.99320962499999L74.96307034375,110.434200625ZM70.17459834375,118.075591625Q71.18179334375,116.342231625,72.24001134375,114.639537625L73.08934234375,115.167388625Q72.03900134375,116.857421625,71.03923034375,118.578002625L70.17459834375,118.075591625ZM67.74809834375,122.435066625Q68.21651034375,121.555656625,68.69785134375,120.683250625L69.57342334375,121.166335625Q69.09561934375,122.032340625,68.63070634375,122.905181625L67.74809834375,122.435066625ZM63.77491234375,130.535812625Q64.59721934375,128.707084625,65.47347634375001,126.903587625L66.37293334375,127.340598625Q65.50319334375,129.130691625,64.68694834375,130.94592262499998L63.77491234375,130.535812625ZM61.81617734375,135.11592862499998Q62.19018134375,134.194740625,62.57771334375,133.279167625L63.49861634375,133.668960625Q63.11394434375,134.57776662499998,62.74272734375,135.492103625L61.81617734375,135.11592862499998ZM58.70139644375,143.590309625Q59.32948014375,141.68723262499998,60.01377584375,139.803634625L60.95367434375,140.145095625Q60.27444074375,142.01474762499998,59.65101524375,143.90371662500002L58.70139644375,143.590309625ZM57.23094944375,148.337608625Q57.50677584375,147.385436625,57.79655554375,146.437423625L58.75287584375,146.729743625Q58.46523574375,147.670760625,58.19145874375,148.615852625L57.23094944375,148.337608625ZM55.00851894375,157.09652062499998Q55.43540334375,155.141840625,55.92002534375,153.200670625L56.89024594375,153.44289062500002Q56.40922264375,155.369640625,55.98549174375,157.309880625L55.00851894375,157.09652062499998ZM54.03744124375,161.972030625Q54.21408894375,160.991200625,54.40519834375,160.013070625L55.38664004375,160.204830625Q55.19694904375,161.17569062500002,55.02160814375,162.14928062500002L54.03744124375,161.972030625ZM52.73529070375,170.905160625Q52.95680414375,168.92325062499998,53.23676284375,166.948740625L54.22686024375,167.08912062500002Q53.94897554375,169.049010625,53.72910284375,171.016230625L52.73529070375,170.905160625ZM52.27231326375,175.879800625Q52.34762379375,174.86800062499998,52.43813353375,173.85744062499998L53.43414644375,173.946640625Q53.34430824375,174.949710625,53.26955454375,175.954020625L52.27231326375,175.879800625ZM51.90390639705,184.860640625Q51.91918294475,182.877210625,51.99272362175,180.895080625L52.99203594375,180.932160625Q52.91903994375,182.899610625,52.90387664375,184.868350625L51.90390639705,184.860640625ZM51.95618113875,189.798100625Q51.92755823775,188.807130625,51.91349196075,187.815860625L52.91340004375,187.801680625Q52.92734464375,188.785600625,52.95577414375,189.769210625L51.95618113875,189.798100625ZM52.51921534375,198.816700625Q52.32639241375,196.810580625,52.19353938375,194.799590625L53.19136834375,194.733670625Q53.32323644375,196.729800625,53.51463374375,198.721020625L52.51921534375,198.816700625ZM53.08498834375,203.748890625Q52.95320044375,202.760830625,52.83601707375,201.770950625L53.82908034375,201.653400625Q53.94539304375,202.635990625,54.07620764375,203.616670625L53.08498834375,203.748890625ZM54.57651444375,212.649610625Q54.18028684375,210.689540625,53.84228794375,208.718610625L54.82789354375,208.549590625Q55.16338734375,210.505920625,55.55669664375,212.451460625L54.57651444375,212.649610625ZM55.65406724375,217.515750625Q55.41985654375,216.543460625,55.20007654375,215.567810625L56.17564344375,215.348070625Q56.39379784375,216.316590625,56.62625454375,217.281550625L55.65406724375,217.515750625ZM58.05708834375,226.205840625Q57.46272754375,224.305880625,56.92464824375,222.389210625L57.88740964375,222.118910625Q58.42152504375,224.021390625,59.011475043749996,225.907290625L58.05708834375,226.205840625ZM59.63648034375,230.945050625Q59.30222274375,230.000690625,58.98201604375,229.051450625L59.92957304375,228.731840625Q60.24734024375,229.673920625,60.57916064375,230.611370625L59.63648034375,230.945050625ZM62.92490434375,239.334460625Q62.13796734375,237.508650625,61.40513894375,235.660460625L62.33471534375,235.291850625Q63.06212434375,237.126330625,63.84324234375,238.938640625L62.92490434375,239.334460625ZM64.98919934375,243.889880625Q64.55863934375,242.984710625,64.14156734375,242.073260625L65.05088434375,241.657150625Q65.46478034375,242.561610625,65.89225234375,243.460340625L64.98919934375,243.889880625ZM69.12807034375,251.891270625Q68.15404134375,250.152950625,67.23174234375,248.386640625L68.11816634375,247.923780625Q69.03356134375,249.676860625,70.00045034375,251.402430625L69.12807034375,251.891270625ZM71.65441534375,256.21025062499996Q71.13243834375,255.354690625,70.62322434375,254.491450625L71.48452334375,253.983350625Q71.99026334375,254.840650625,72.50808734374999,255.689480625L71.65441534375,256.21025062499996ZM76.59985134375,263.739320625Q75.44887934375001,262.108350625,74.34663434375,260.44408062499997L75.18037234375001,259.89191062500004Q76.27441234375,261.54384062500003,77.41688134374999,263.162720625L76.59985134375,263.739320625ZM79.56030434375,267.77353062500003Q78.95281234375,266.977080625,78.35720634375,266.171690625L79.16120534375,265.577090625Q79.75263434375,266.37678062500004,80.35541334375,267.167070625L79.56030434375,267.77353062500003ZM85.25969334375,274.750090625Q83.94377134375,273.244720625,82.67300834375,271.701050625L83.44507234375,271.065490625Q84.70643634375,272.597760625,86.01258834375,274.091920625L85.25969334375,274.750090625ZM88.62186434374999,278.455380625Q87.93557734375,277.726670625,87.26017334375,276.987840625L87.99826834375,276.313120625Q88.66878134375,277.04663062500003,89.34984234375,277.769770625L88.62186434374999,278.455380625ZM95.01414134375,284.804410625Q93.54703134375,283.441420625,92.12099034375001,282.03549062499997L92.82307434375,281.323390625Q94.23854834375,282.718950625,95.69476734375,284.071780625L95.01414134375,284.804410625ZM98.74149334375,288.140760625Q97.98397034375,287.48758062499996,97.23621034375,286.82324062500004L97.90038334375001,286.075650625Q98.64258534375,286.735050625,99.39452734375,287.383420625L98.74149334375,288.140760625ZM105.75791534375,293.793760625Q104.15506734375,292.588320625,102.58873034375,291.335800625L103.21324134375,290.55481062499996Q104.76791734375,291.797970625,106.35897434374999,292.994540625L105.75791534375,293.793760625ZM109.80996334375,296.725200625Q108.98950534375,296.154490625,108.17758934375,295.571700625L108.76071134375,294.759310625Q109.56671134375,295.337840625,110.38101234375,295.904280625L109.80996334375,296.725200625ZM117.37522134375,301.621250625Q115.65377434375,300.58702062500004,113.96385534375,299.502030625L114.50412734375,298.660540625Q116.18145034375,299.737440625,117.89021334375,300.764070625L117.37522134375,301.621250625ZM121.70740534375,304.116030625Q120.83309934375,303.63388062499996,119.96601834375,303.138840625L120.46184534375,302.27042062500004Q121.32270834375,302.761920625,122.19030034375,303.240360625L121.70740534375,304.116030625ZM129.74089034374998,308.202670625Q127.91979234375,307.351560625,126.12483234375,306.446610625L126.57503534375,305.553660625Q128.35720834375002,306.45219062499996,130.16427634375,307.296720625L129.74089034374998,308.202670625ZM134.30453534375,310.233520625Q133.38627634375,309.845090625,132.47385434375002,309.443110625L132.87699934375001,308.527980625Q133.78177634374998,308.926570625,134.69414534375,309.312530625L134.30453534375,310.233520625ZM142.72155034374998,313.467130625Q140.82155634375,312.809140625,138.94199334375,312.094850625L139.29724834375,311.160030625Q141.16293334375,311.869050625,143.04880534375002,312.522190625L142.72155034374998,313.467130625ZM147.46373034375,315.011930625Q146.51221434375,314.721280625,145.56508634375,314.416660625L145.87127734375,313.464690625Q146.81035634375002,313.766720625,147.75585934375,314.055540625L147.46373034375,315.011930625ZM156.17633234375,317.357850625Q154.22004234374998,316.900630625,152.27823234375,316.385410625L152.53469234375,315.418850625Q154.46216234374998,315.930270625,156.40391234375,316.384090625L156.17633234375,317.357850625ZM161.03998234375,318.400450625Q160.06669234375,318.210480625,159.09630234374998,318.006260625L159.30227234375002,317.027710625Q160.26522234375,317.230410625,161.23153234375002,317.418980625L161.03998234375,318.400450625ZM169.95750234374998,319.833040625Q167.96923234374998,319.581510625,165.98929234374998,319.271090625L166.14419234375,318.283140625Q168.10985234375,318.591340625,170.08301234375,318.840940625L169.95750234374998,319.833040625ZM174.88553234375001,320.364710625Q173.90076234375,320.276730625,172.91739234375,320.174320625L173.02094234375,319.179690625Q173.99721234375,319.281340625,174.97455234375002,319.368680625L174.88553234375001,320.364710625ZM183.91084234375,320.867310625Q181.91636234375,320.823120625,179.92407234375,320.720030625L179.97575234375,319.721370625Q181.95305234375,319.823700625,183.93298234375,319.867520625L183.91084234375,320.867310625ZM188.84326234375,320.886410625Q187.87163234375,320.900390625,186.89990234375,320.900390625L186.87219234375,320.900390625L186.87219234375,319.900390625L186.89990234375,319.900390625Q187.86360234375,319.900390625,188.82887234375,319.886500625L188.84326234375,320.886410625ZM197.84508234375,320.455960625Q195.83415234375,320.619540625,193.81924234375,320.722960625L193.76797234375,319.724270625Q195.76820234375,319.621610625,197.76401234375,319.459260625L197.84508234375,320.455960625ZM202.79832234375,319.960970625Q201.81343234375,320.077790625,200.82692234375,320.180080625L200.72372234375,319.185450625Q201.70291234375,319.083860625,202.68057234375,318.967930625L202.79832234375,319.960970625ZM211.73442234375,318.596470625Q209.74951234375,318.967930625,207.75439234375,319.279880625L207.59993234375,318.291870625Q209.58032234375,317.982270625,211.55046234375,317.613520625L211.73442234375,318.596470625ZM216.59475234375,317.594020625Q215.62327234375,317.813080625,214.64868234375,318.017790625L214.44311234375,317.039150625Q215.41093234375,316.835880625,216.37478234375,316.618530625L216.59475234375,317.594020625ZM225.33255234375,315.314180625Q223.40765234375,315.885830625,221.46661234375,316.399990625L221.21054234375,315.433350625Q223.13707234375,314.923000625,225.04788234375,314.355590625L225.33255234375,315.314180625ZM230.07766234375,313.809260625Q229.13174234375,314.128570625,228.18120234375,314.433870625L227.87542234375,313.481750625Q228.81894234375,313.178740625,229.75781234375,312.861790625L230.07766234375,313.809260625ZM238.52577234375,310.639190625Q236.67615234375,311.404690625,234.80462234375,312.115050625L234.44978234375,311.180080625Q236.30800234375,310.474820625,238.14335234375,309.715210625L238.52577234375,310.639190625ZM243.09843234375,308.646970625Q242.18945234375,309.063140625,241.27440234375,309.465820625L240.87161234375,308.550540625Q241.77916234375,308.151150625,242.68216234375,307.737730625L243.09843234375,308.646970625ZM251.16830234375,304.620960625Q249.40996234375,305.572810625,247.62420234375,306.47218062499996L247.17436234375,305.579090625Q248.94716234375,304.686170625,250.69227234375,303.741530625L251.16830234375,304.620960625ZM255.51530234375,302.162700625Q254.65378234375,302.67116062499997,253.78480234375,303.166790625L253.28937234375,302.298140625Q254.15130234375,301.80652062499996,255.00708234375,301.301500625L255.51530234375,302.162700625ZM263.12166234375,297.324110625Q261.47130234375004,298.453080625,259.78822234375,299.53267062500004L259.24832234375003,298.690950625Q260.91876234375,297.619480625,262.55702234374996,296.498750625L263.12166234375,297.324110625ZM267.19391234374996,294.426300625Q266.38952234375,295.021420625,265.57641234375,295.604570625L264.99363234375,294.791920625Q265.80020234375,294.213500625,266.59909234375,293.622390625L267.19391234374996,294.426300625ZM274.25570234375,288.827380625Q272.73015234375,290.122150625,271.16688234375,291.371120625L270.54269234375,290.58986062500003Q272.09428234375,289.350200625,273.60862234374997,288.064960625L274.25570234375,288.827380625ZM278.00819234375,285.521070625Q277.26976234375,286.196400625,276.52141234375,286.860700625L275.85756234375003,286.112840625Q276.60016234374996,285.453660625,277.33328234375,284.783140625L278.00819234375,285.521070625ZM284.44983234375,279.222470625Q283.06537234375,280.669660625,281.63859234375,282.07513062500004L280.93681234375003,281.36273062500004Q282.35322234374996,279.967440625,283.72722234375,278.531190625L284.44983234375,279.222470625ZM287.84149234375,275.54298062500004Q287.17701234375,276.29121062499996,286.50152234375,277.029510625L285.76372234375003,276.35449062500004Q286.43422234375,275.62163062499997,287.09379234375,274.878950625L287.84149234375,275.54298062500004ZM293.59396234375004,268.613020625Q292.36571234375003,270.19737062499996,291.09096234375,271.744570625L290.31918234374996,271.108670625Q291.58462234374997,269.572810625,292.80362234375,268.00034062500004L293.59396234375004,268.613020625ZM296.58766234375,264.59979062499997Q296.00433234375,265.412800625,295.40902234375,266.217070625L294.60524234375,265.622150625Q295.19630234375,264.823580625,295.77514234374996,264.016830625L296.58766234375,264.59979062499997ZM301.58969234375,257.113110625Q300.53100234375,258.818150625,299.42212234375,260.490950625L298.58861234375,259.938450625Q299.68930234375,258.27797062499997,300.74013234375,256.585600625L301.58969234375,257.113110625ZM304.15233234375,252.809780625Q303.65651234375,253.678660625,303.14787234375,254.540080625L302.28679234375,254.031630625Q302.79158234375,253.176760625,303.28378234375,252.314180625L304.15233234375,252.809780625ZM308.35110234375,244.846190625Q307.47333234375003,246.654740625,306.54210234375,248.436340625L305.65585234375,247.973110625Q306.58026234375,246.204590625,307.45146234375,244.409560625L308.35110234375,244.846190625ZM310.45398234375,240.300670625Q310.05111234375,241.215670625,309.63473234375,242.124590625L308.72558234375,241.708100625Q309.13904234375,240.805590625,309.53875234375,239.897720625L310.45398234375,240.300670625ZM313.80539234375,231.943860625Q313.11786234375,233.838820625,312.37405234375,235.712400625L311.44461234375,235.343430625Q312.18292234375,233.483570625,312.86535234375,231.602780625L313.80539234375,231.943860625ZM315.42477234375,227.208450625Q315.11929234375,228.158980625,314.79974234375,229.104870625L313.85232234375,228.784840625Q314.16986234375,227.844820625,314.47275234375,226.902450625L315.42477234375,227.208450625ZM317.89349234375,218.545130625Q317.40573234375,220.502360625,316.85971234375,222.444150625L315.89706234375,222.173450625Q316.43878234375,220.247040625,316.92318234375,218.303330625L317.89349234375,218.545130625ZM319.01153234375,213.676570625Q318.80661234375,214.651200625,318.58734234375,215.622700625L317.61188234375,215.402540625Q317.82943234375,214.438660625,318.03293234375,213.470810625L319.01153234375,213.676570625ZM320.57095234375,204.796100625Q320.28909234375,206.790110625,319.94787234375,208.774830625L318.96231234375,208.605380625Q319.30108234375,206.635070625,319.58081234375,204.656130625L320.57095234375,204.796100625ZM321.17672234375,199.855150625Q321.07419234375,200.841690625,320.95718234375,201.826630625L319.96417234375,201.708660625Q320.08035234375,200.730570625,320.18210234375,199.751770625L321.17672234375,199.855150625ZM321.80914234375,190.849490625Q321.73559234375,192.854460625,321.60251234375,194.856350625L320.60467234375,194.789990625Q320.73684234375,192.802700625,320.80981234375,190.812850625L321.80914234375,190.849490625ZM321.86984234375,183.051150625Q321.89990234375,184.475620625,321.89990234375,185.900390625Q321.89990234375,186.886050625,321.88550234375,187.871600625L320.88562234375,187.856980625Q320.89990234375,186.879780625,320.89990234375,185.900390625Q320.89990234375,184.486590625,320.87005234375,183.072250625L321.86984234375,183.051150625ZM321.67221234375,178.06314062500002Q321.73044234375,179.064220625,321.77377234375,180.066070625L320.77472234375,180.109340625Q320.73169234375,179.115890625,320.67389234375,178.12115062499998L321.67221234375,178.06314062500002ZM320.85013234375,169.09751062499998Q321.09698234375,171.065310625,321.28592234375,173.039520625L320.29043234375,173.134800625Q320.10284234375,171.17481062500002,319.85791234375,169.221950625L320.85013234375,169.09751062499998ZM320.13376234375,164.13487062500002Q320.29605234375,165.12831062499998,320.44351234375,166.124050625L319.45431234375,166.27058062499998Q319.30786234375,165.281900625,319.14685234375,164.296070625L320.13376234375,164.13487062500002ZM318.38940234375,155.314210625Q318.84057234375,157.253910625,319.23437234375,159.206070625L318.25412234375,159.403780625Q317.86340234375,157.466600625,317.41537234375,155.540810625L318.38940234375,155.314210625ZM317.15988234375,150.441406625Q317.42471234375,151.414280625,317.67499234375,152.390990625L316.70624234375,152.639160625Q316.45791234375,151.66979062500002,316.19497234375,150.704131625L317.15988234375,150.441406625ZM314.51282234375,141.855598625Q315.16418234375,143.742866625,315.75949234375,145.64857462499998L314.80493234375,145.946716625Q314.21417234375,144.055267625,313.56753234375,142.181877625L314.51282234375,141.855598625ZM312.78381234375,137.133163625Q313.14807234375,138.073417625,313.49823234375,139.01901262500002L312.56042234375,139.366226625Q312.21329234375,138.428642625,311.85135234375,137.494430625L312.78381234375,137.133163625ZM309.26199234375,128.869521625Q310.10660234375,130.681671625,310.89718234375,132.51803562499998L309.97870234375,132.913474625Q309.19403234375,131.090965625,308.35559234375,129.29195362500002L309.26199234375,128.869521625ZM307.05388234375,124.353484625Q307.51312234375,125.250045625,307.95895234375,126.153358625L307.06222234375,126.595939625Q306.61969234375,125.699310625,306.16385234375,124.809387625L307.05388234375,124.353484625ZM302.69351234375,116.496940625Q303.72204234375,118.212959625,304.69928234375004,119.958701625L303.82669234375,120.447166625Q302.85669234375,118.714378625,301.83577234375,117.011031625L302.69351234375,116.496940625ZM300.03236234375004,112.238689625Q300.58107234375,113.081424625,301.11717234375,113.932243625L300.27113234374997,114.465373625Q299.73877234375,113.620567625,299.19432234375,112.784294625L300.03236234375004,112.238689625ZM294.87814234375,104.871375625Q296.07930234375,106.472026625,297.23248234375,108.107574625L296.41520234375,108.683818625Q295.27049234375,107.060287625,294.07829234375004,105.47159962500001L294.87814234375,104.871375625ZM291.79469234375,100.917560625Q292.42644234375,101.697326625,293.04652234375,102.486396625L292.26025234375004,103.104270625Q291.64509234375,102.321449625,291.01770234375,101.547077625L291.79469234375,100.917560625ZM285.89998234375,94.118125625Q287.26066234375,95.585819625,288.57725234375,97.09320062500001L287.82406234375003,97.75103362499999Q286.51741234375004,96.254978625,285.16664234375,94.798004625L285.89998234375,94.118125625ZM282.42921234375,90.510925625Q283.13675234375,91.219489625,283.83368234375,91.938472625L283.11564234375,92.63448762499999Q282.42401234375,91.920959625,281.72159234375,91.21751362500001L282.42921234375,90.510925625ZM275.85577234375,84.353099625Q277.36130234375,85.671939625,278.82705234375,87.03483162500001L278.14612234375,87.76716962500001Q276.69136234375003,86.414512625,275.19684234375,85.10530862499999L275.85577234375,84.353099625ZM272.03647234375,81.130332625Q272.81181234375003,81.76038162500001,273.57774234375,82.401836625L272.93567234375,83.168491625Q272.17499234375,82.53142162500001,271.40584234375,81.906410625L272.03647234375,81.130332625ZM264.85399234375,75.681697625Q266.48802234375,76.837394625,268.08706234375,78.041021625L267.48568234375,78.839986625Q265.89856234375,77.645337625,264.27655234375004,76.498132625L264.85399234375,75.681697625ZM260.72816234375,72.876554625Q261.56288234375,73.42179862500001,262.38945234375,73.979310625L261.83027234375004,74.808360625Q261.00979234375,74.254962625,260.18129234375,73.713767625L260.72816234375,72.876554625ZM253.01359234375,68.197461625Q254.75825234375,69.177434625,256.47310234375004,70.208686625L255.95775234375,71.065662625Q254.25560234375,70.042055625,252.52386234375,69.069333625L253.01359234375,68.197461625ZM248.62404234375,65.837362625Q249.51043234375,66.293059625,250.39001234375,66.761793625L249.91971234375,67.644298625Q249.04683234375,67.179111625,248.16684234375,66.72672862499999L248.62404234375,65.837362625ZM240.46307234375,61.981116625Q242.29878234375,62.774583625,244.11017234375,63.622079625L243.68638234375,64.527844625Q241.88835234375,63.686595625,240.06631234375,62.899036625L240.46307234375,61.981116625ZM235.85312234375,60.088695525Q236.78447234375,60.451081325000004,237.71034234375,60.827215225L237.33398234375,61.753682624999996Q236.41508234375,61.380392625,235.49049234375,61.020627625L235.85312234375,60.088695525ZM227.33920234375,57.099525425Q229.24470234375,57.697792525,231.13168234375,58.352166625L230.80404234375,59.296970325000004Q228.93109234375,58.647457125,227.03966234375,58.053608925L227.33920234375,57.099525425ZM222.55142234375,55.692982625Q223.52249234375,55.958869025,224.48950234375,56.239209224999996L224.21106234375,57.199662724999996Q223.25126234375,56.921408225,222.28734234375,56.657480225L222.55142234375,55.692982625ZM213.78616234375,53.604778725Q215.73858234375,54.001567125,217.67845234375,54.455798125L217.45047234375,55.429462425Q215.52498234375,54.978601425,213.58700234375,54.584746125L213.78616234375,53.604778725ZM208.86210234375,52.698808025Q209.86056234375,52.863432325,210.85643234375,53.043005725L210.67897234375,54.027135325Q209.69044234375,53.848882725,208.69943234375,53.685486525L208.86210234375,52.698808025ZM199.95469234375,51.533086775Q201.92964234375,51.724967955,203.89810234375,51.974809725L203.77218234375,52.966851425Q201.81830234375,52.718860725,199.85798234375,52.528399425L199.95469234375,51.533086775ZM194.93542234375,51.139749575Q195.94269234375,51.199810865,196.94894234375,51.274922165L196.87451234375,52.272147925Q195.87575234375,52.197595625,194.87590234375,52.137977025L194.93542234375,51.139749575ZM189.94488234375,50.934735443L189.92233234375,51.934480825Q188.41130234375,51.900390625,186.90245234375,51.900387405000004L186.21744234375,51.902124525L186.00497234375,51.903372425L185.99910234375,50.9033960113Q186.44949234375,50.90039062500003,186.89990234375,50.900390625Q188.42259234375,50.900390625,189.94488234375,50.934735443Z" fill-rule="evenodd" fill="#67E4F4" fill-opacity="1"/><ellipse cx="305.89990234375" cy="124.900390625" rx="5" ry="5" fill="#67E4F4" fill-opacity="1"/><ellipse cx="67.89990234375" cy="124.900390625" rx="5" ry="5" fill="#67E4F4" fill-opacity="1"/><ellipse cx="187.89990234375" cy="51.900390625" rx="5" ry="5" fill="#67E4F4" fill-opacity="1"/><ellipse cx="59.89990234375" cy="231.900390625" rx="5" ry="5" fill="#67E4F4" fill-opacity="1"/><ellipse cx="311.89990234375" cy="238.900390625" rx="5" ry="5" fill="#67E4F4" fill-opacity="1"/><ellipse cx="191.89990234375" cy="320.900390625" rx="5" ry="5" fill="#67E4F4" fill-opacity="1"/><path d="M362.89990234375,87.300391925Q363.04237334375,87.300391925,363.18415034375,87.286427525Q363.32593534375,87.272463325,363.46566034375,87.244669225Q363.60539234375,87.216875125,363.74172234375,87.175519025Q363.87805934375,87.134162425,364.00967834375,87.079642325Q364.14130434375,87.025122425,364.26695234375,86.957963425Q364.39260134375,86.890804525,364.51105534375,86.811653425Q364.62951634374997,86.732502425,364.73964734375,86.642121825Q364.84977334375003,86.551741125,364.95050834375,86.451001125Q365.05125034375,86.350261125,365.14163234375,86.240131825Q365.23201034375,86.130002625,365.31115734375,86.011544825Q365.39031234375,85.893087125,365.45747034375,85.767441725Q365.52462734375,85.641796225,365.57914734375,85.510172925Q365.63366734375,85.378549815,365.67502634375,85.242216585Q365.71638534375,85.105883245,365.74417834375,84.966152725Q365.77197634375,84.826422335,365.78594234375,84.684640435Q365.79990434375,84.542858545,365.79990434375,84.400390625Q365.79990434375,84.257922705,365.78594234375,84.116140815Q365.77197634375,83.974358915,365.74417834375,83.834628525Q365.71638534375,83.694898005,365.67502634375,83.558564725Q365.63366734375,83.422231435,365.57914734375,83.290608325Q365.52462734375,83.158985025,365.45747034375,83.033339625Q365.39031234375,82.907694125,365.31116134375,82.789236525Q365.23201334375,82.670778725,365.14163634375,82.560649425Q365.05125434375,82.450520125,364.95051234375,82.349780125Q364.84977734375,82.249040125,364.73964734375,82.158659225Q364.62951634374997,82.068278525,364.51105534375,81.989127625Q364.39260134375,81.909976525,364.26695234375,81.842817825Q364.14131134375,81.775658825,364.00968134375,81.721138925Q363.87805934375,81.666618825,363.74172934375,81.625262225Q363.60539234375,81.583906125,363.46566034375,81.556112025Q363.32593534375,81.528317925,363.18415034375,81.514353525Q363.04237334375,81.500389325,362.89990234375,81.500389325Q362.75743534375,81.500389325,362.61565034375,81.514353725Q362.47386934375,81.528317925,362.33413734375,81.556112025Q362.19440834375,81.583906125,362.05807534375,81.625262225Q361.92173734375,81.666618825,361.79011134375,81.721138925Q361.65849334375,81.775658825,361.53284834375,81.842817825Q361.40720334375,81.909976725,361.28874234375,81.989127825Q361.17028834375003,82.068278825,361.06015734375,82.158659425Q360.95003134374997,82.249040125,360.84928934375,82.349780125Q360.74855034375,82.450520125,360.65816834375,82.560649425Q360.56778734375,82.670778625,360.48863234375,82.789236425Q360.40948534375,82.907694125,360.34232734375,83.033339525Q360.27516934375,83.158985025,360.22064634375,83.290608325Q360.16613034375,83.422231435,360.12477534375,83.558564665Q360.08341934375,83.694898005,360.05562234375,83.834628525Q360.02783234375,83.974358915,360.01386634375,84.116140815Q359.99990034375,84.257922705,359.99990034375,84.400390625Q359.99990034375,84.542858545,360.01386634375,84.684640435Q360.02783234375,84.826422335,360.05562234375,84.966152725Q360.08341934375,85.105883245,360.12477534375,85.242216525Q360.16613034375,85.378549815,360.22064634375,85.510172925Q360.27516934375,85.641796225,360.34232334375,85.767441625Q360.40948534375,85.893087125,360.48863234375,86.011544725Q360.56778734375,86.130002525,360.65816834375,86.240131825Q360.74855034375,86.350261125,360.84928934375,86.451001125Q360.95003134374997,86.551741125,361.06016134375,86.642122025Q361.17028834375003,86.732502725,361.28874634375,86.811653625Q361.40720334375,86.890804725,361.53285234375,86.957963425Q361.65849334375,87.025122425,361.79011534375,87.079642325Q361.92174534375,87.134162425,362.05807834375,87.175519025Q362.19441234375,87.216875125,362.33413734375,87.244669225Q362.47386934375,87.272463325,362.61565434375,87.286427725Q362.75743534375,87.300391925,362.89990234375,87.300391925ZM359.11136234375,87.747195725L360.74371734375,86.570725225L360.15903134375003,85.759468125L358.52667634375,86.935938825L359.11136234375,87.747195725ZM355.84665634375,90.100137225L357.47901134375,88.923666525L356.89432534375,88.112409325L355.26197034375,89.288879825L355.84665634375,90.100137225ZM352.58195134375,92.453078225L354.21430234375,91.276608025L353.62961534375,90.465350625L351.99726534375,91.641820925L352.58195134375,92.453078225ZM349.31724534375,94.80601862500001L350.94960034375,93.629548025L350.36491434375,92.818291625L348.73255934375,93.994762425L349.31724534375,94.80601862500001ZM346.05253634375,97.158961625L347.68489034375,95.982490625L347.10020434375,95.171234625L345.46784934375,96.347704625L346.05253634375,97.158961625ZM342.78783434375,99.51190162500001L344.42018534375,98.335430625L343.83549834375,97.524174625L342.20314834375,98.70064562499999L342.78783434375,99.51190162500001ZM339.52312834375,101.86484362499999L341.15547934375,100.688373625L340.57079334375,99.877116625L338.93843834375,101.05358662500001L339.52312834375,101.86484362499999ZM336.25842134375,104.21778462500001L337.89077534375,103.041314625L337.30608534375,102.230058625L335.67373134375,103.40652862499999L336.25842134375,104.21778462500001ZM332.99371734375,106.570724625L334.62607034375003,105.394254625L334.04138034375,104.582998625L332.40902734375,105.759467625L332.99371734375,106.570724625ZM329.72900934375,108.92366762500001L331.36136234375,107.747197625L330.77667234375,106.935941625L329.14431934375,108.112411625L329.72900934375,108.92366762500001ZM326.46430434375,111.27660962499999L328.09665834375,110.100137625L327.51196834375,109.288881625L325.87961434375,110.46535262500001L326.46430434375,111.27660962499999ZM323.19959834375,113.629548625L324.83194934375,112.453079625L324.24725934375,111.641822625L322.61490834375,112.818292625L323.19959834375,113.629548625ZM319.93489234375,115.98249262499999L321.56724734375,114.80601862500001L320.98255734375,113.99476262499999L319.35020234375,115.17123562500001L319.93489234375,115.98249262499999ZM316.67018704375,118.335430625L318.30253834375,117.158962625L317.71784734375,116.347705625L316.08549694375,117.524173625L316.67018704375,118.335430625ZM313.40548134375,120.688373625L315.03783224375,119.511905625L314.45314214375003,118.700649625L312.82079124375,119.877117625L313.40548134375,120.688373625ZM310.14077164375,123.04131662500001L311.77312664375,121.864845625L311.18843674375,121.053588625L309.55608204375,122.230060625L310.14077164375,123.04131662500001ZM307.69224721375,124.80601862500001L308.50842454375,124.21778462500001L307.92373484375,123.40652862499999L307.10755747375,123.99476262499999L307.69224721375,124.80601862500001Z" fill-rule="evenodd" fill="#67E4F4" fill-opacity="1"/><path d="M311.73714587375,240.373159405L312.69027471375,240.701284405L313.01578764375,239.755746845L312.06265881375,239.427621845L311.73714587375,240.373159405ZM314.59652094375,241.357534425L316.50277094375,242.013784425L316.82828374375,241.068246825L314.92203374375,240.411996845L314.59652094375,241.357534425ZM318.40902094375,242.670034425L320.31527044375,243.326284425L320.64078424375,242.380746825L318.73453374375,241.724496825L318.40902094375,242.670034425ZM322.22152034375,243.982534425L324.12777034375,244.638784425L324.45328434375,243.693246825L322.54703434375,243.036996825L322.22152034375,243.982534425ZM326.03402034375,245.295032525L327.94027534375,245.951284425L328.26578734375,245.005746825L326.35953434375,244.349494925L326.03402034375,245.295032525ZM329.84652134375,246.607534425L331.75277134375,247.263784425L332.07828334375,246.318246825L330.17203334375,245.661996825L329.84652134375,246.607534425ZM333.65902134375,247.920034425L335.56527134375,248.576284425L335.89078334375,247.630746825L333.98453334375,246.974496825L333.65902134375,247.920034425ZM337.47152134375,249.23253342499999L339.37777134375,249.88878342499999L339.70328334375,248.94324592499999L337.79703334375,248.28699592499999L337.47152134375,249.23253342499999ZM341.28401934375,250.545033625L343.19027134375,251.201284625L343.51578334375,250.255746625L341.60953134375,249.59949592499999L341.28401934375,250.545033625ZM345.09651934375,251.857533625L347.00276934375,252.513784625L347.32828534375,251.568246625L345.42203534375,250.911995625L345.09651934375,251.857533625ZM348.90901934375,253.170034625L350.81526934375,253.826284625L351.14078534375,252.880746625L349.23453534375,252.224496625L348.90901934375,253.170034625ZM352.72151934375,254.482534625L354.62776934375,255.138784625L354.95328534375,254.193246625L353.04703534375,253.536996625L352.72151934375,254.482534625ZM356.53401934375,255.795034625L358.44026934375,256.45128462499997L358.76578534375,255.505746625L356.85953534375,254.849496625L356.53401934375,255.795034625ZM360.34651934375,257.10753462499997L362.25276934375,257.76378462499997L362.57828534375,256.81824662500003L360.67203534375,256.16199662500003L360.34651934375,257.10753462499997ZM364.15901934375,258.42003462499997L366.06526934375,259.07628462499997L366.39078534375,258.13074662500003L364.48453534375,257.47449662500003L364.15901934375,258.42003462499997ZM372.89990234375,263.800392625Q373.04237334375,263.800392625,373.18415034375,263.786428625Q373.32593534375,263.772464625,373.46566034375,263.744666625Q373.60539234375,263.716874625,373.74172634375,263.675517625Q373.87805934375,263.634162625,374.00967434375,263.579639625Q374.14130434375,263.525121625,374.26694834375,263.457963625Q374.39259334375,263.390804625,374.51104734375,263.311653625Q374.62950934375,263.232501625,374.73963934375,263.142124625Q374.84976934375,263.051742625,374.95050834375,262.951000625Q375.05125034375,262.85026162500003,375.14163234375,262.740131625Q375.23201034375,262.630000625,375.31115734375,262.511543625Q375.39031234375,262.393085625,375.45747034375,262.267438625Q375.52462734375,262.141794625,375.57914334375,262.010169625Q375.63366734375,261.878547625,375.67502634375,261.742214625Q375.71638534375,261.605882625,375.74417534375,261.466150625Q375.77197234375,261.326421625,375.78594234375,261.184640625Q375.79990434375,261.042857625,375.79990434375,260.900390625Q375.79990434375,260.757923625,375.78593434375,260.616142625Q375.77197234375,260.474359625,375.74417534375,260.334627625Q375.71638534375,260.194896625,375.67502634375,260.058563625Q375.63367034375,259.922229625,375.57914734375,259.790605625Q375.52462734375,259.658985625,375.45747034375,259.533338625Q375.39031234375,259.407691625,375.31115734375,259.289234625Q375.23201034375,259.170778625,375.14162834374997,259.060649625Q375.05125034375,258.95051962499997,374.95050834375,258.849779625Q374.84976934375,258.749040625,374.73963934375,258.658658625Q374.62950934375,258.568279625,374.51104734375,258.489126625Q374.39259334375,258.409976625,374.26694834375,258.342817625Q374.14130434375,258.275657625,374.00967834375,258.221137625Q373.87805934375,258.166620625,373.74172934375,258.125263625Q373.60539234375,258.083907625,373.46566034375,258.056110625Q373.32593534375,258.028318625,373.18415034375,258.014354625Q373.04237334375,258.000388625,372.89990234375,258.000388625Q372.75743834375,258.000388625,372.61565434375,258.014354625Q372.47386934375,258.028320625,372.33413734375,258.056112625Q372.19440434375,258.083907625,372.05807534375,258.125264625Q371.92173734375,258.166620625,371.79010734375,258.221137625Q371.65848534375,258.275657625,371.53284434375,258.342817625Q371.40719634375,258.409976625,371.28873834374997,258.489126625Q371.17028834375003,258.568279625,371.06015734375,258.658660625Q370.95002734375,258.749040625,370.84928534375,258.849779625Q370.74855034375,258.95051962499997,370.65816534375,259.060649625Q370.56778734375,259.170778625,370.48863234375,259.289234625Q370.40948534375,259.407691625,370.34232734375,259.533338625Q370.27516934375,259.658985625,370.22064234375,259.790605625Q370.16612234375,259.922229625,370.12477134375,260.058563625Q370.08341234375,260.194896625,370.05561834375,260.334627625Q370.02782834375,260.474359625,370.01386634375,260.616142625Q369.99990034375,260.757923625,369.99990034375,260.900390625Q369.99990034375,261.042857625,370.01386234375,261.184638625Q370.02782834375,261.326421625,370.05561834375,261.466150625Q370.08341234375,261.605882625,370.12476734375,261.742215625Q370.16612234375,261.878547625,370.22064234375,262.010169625Q370.27516934375,262.141794625,370.34232734375,262.267440625Q370.40948534375,262.393085625,370.48863234375,262.511543625Q370.56778734375,262.630000625,370.65816834375,262.740131625Q370.74855034375,262.85026162500003,370.84928934375,262.951000625Q370.95003534375,263.051742625,371.06016134375,263.142122625Q371.17028834375003,263.232501625,371.28874234375,263.311651625Q371.40720334375,263.390804625,371.53284834375,263.457961625Q371.65849334375,263.525121625,371.79011134375,263.579639625Q371.92173734375,263.634162625,372.05807534375,263.675517625Q372.19440834375,263.716876625,372.33413734375,263.744668625Q372.47386934375,263.772464625,372.61565434375,263.786430625Q372.75743834375,263.800392625,372.89990234375,263.800392625ZM367.97151934375,259.73253462499997L369.87776934375,260.38878462499997L370.20328534375,259.44324662500003L368.29703534375,258.78699662500003L367.97151934375,259.73253462499997Z" fill-rule="evenodd" fill="#67E4F4" fill-opacity="1"/><path d="M191.39990234375,320.900390625L191.39990234375,321.921222725L192.39990234375,321.921222725L192.39990234375,320.900390625L191.39990234375,320.900390625ZM191.39990234375,323.962890625L191.39990234375,326.004554725L192.39990234375,326.004554725L192.39990234375,323.962890625L191.39990234375,323.962890625ZM191.39990234375,328.046222725L191.39990234375,330.087890625L192.39990234375,330.087890625L192.39990234375,328.046222725L191.39990234375,328.046222725ZM191.39990234375,332.129554625L191.39990234375,334.171222625L192.39990234375,334.171222625L192.39990234375,332.129554625L191.39990234375,332.129554625ZM191.39990234375,336.212890625L191.39990234375,338.254556625L192.39990234375,338.254556625L192.39990234375,336.212890625L191.39990234375,336.212890625ZM191.39990234375,340.296222625L191.39990234375,342.337888625L192.39990234375,342.337888625L192.39990234375,340.296222625L191.39990234375,340.296222625ZM191.39990234375,344.379556625L191.39990234375,346.421222625L192.39990234375,346.421222625L192.39990234375,344.379556625L191.39990234375,344.379556625ZM191.39990234375,348.462890625L191.39990234375,350.504556625L192.39990234375,350.504556625L192.39990234375,348.462890625L191.39990234375,348.462890625ZM191.39990234375,352.546222625L191.39990234375,354.587890625L192.39990234375,354.587890625L192.39990234375,352.546222625L191.39990234375,352.546222625ZM191.39990234375,356.62955462499997L191.39990234375,358.671222625L192.39990234375,358.671222625L192.39990234375,356.62955462499997L191.39990234375,356.62955462499997ZM191.39990234375,360.712890625L191.39990234375,362.754558625L192.39990234375,362.754558625L192.39990234375,360.712890625L191.39990234375,360.712890625ZM191.39990234375,364.796222625L191.39990234375,366.837890625L192.39990234375,366.837890625L192.39990234375,364.796222625L191.39990234375,364.796222625ZM191.89990234375,372.800392625Q192.04237027375,372.800392625,192.18415218375,372.786430625Q192.32593411375,372.772464625,192.46566450375,372.744666625Q192.60539496375,372.716873625,192.74172830375,372.675521625Q192.87806165375,372.634162625,193.00968484375,372.579639625Q193.14130804375,372.525123625,193.26695344375,372.457961625Q193.39259884375,372.390800625,193.51105664375,372.311649625Q193.62951444375,372.232498625,193.73964364375001,372.14211662499997Q193.84977294375,372.051738625,193.95051284375,371.950996625Q194.05125284375,371.850257625,194.14163374375,371.740127625Q194.23201444375,371.629997625,194.31116534375,371.511539625Q194.39031644375,371.393081625,194.45747514375,371.267436625Q194.52463414375,371.141792625,194.57915404375,371.010166625Q194.63367434375,370.878547625,194.67503074375,370.742217625Q194.71638704375,370.605880625,194.74418094375,370.466148625Q194.77197554375,370.326423625,194.78593964375,370.184638625Q194.79990414375,370.042861625,194.79990384375,369.900390625Q194.79990414375,369.757926625,194.78593994375,369.616142625Q194.77197554375,369.474357625,194.74418114375,369.334625625Q194.71638724375,369.194900625,194.67503094375,369.058563625Q194.63367464375,368.922233625,194.57915424375,368.790603625Q194.52463434375,368.658981625,194.45747544375,368.533332625Q194.39031644375,368.407691625,194.31116534375,368.289230625Q194.23201444375,368.17077662500003,194.14163354375,368.060645625Q194.05125284375,367.950515625,193.95051284375,367.849777625Q193.84977294375,367.749038625,193.73964354375,367.658656625Q193.62951444375,367.568275625,193.51105654375,367.489124625Q193.39259884375,367.409973625,193.26695344375,367.342815625Q193.14130804375,367.275657625,193.00968484375,367.221134625Q192.87806165375,367.166618625,192.74172830375,367.125263625Q192.60539496375,367.083907625,192.46566450375,367.056110625Q192.32593411375,367.028320625,192.18415218375,367.014354625Q192.04237027375,367.000392625,191.89990234375,367.000388625Q191.75743441375,367.000392625,191.61565250375,367.014358625Q191.47387057375,367.028320625,191.33414018375,367.056110625Q191.19440972375,367.083907625,191.05807638375,367.125263625Q190.92174303375,367.166618625,190.79011984375,367.221134625Q190.65849664375,367.275657625,190.53285124375,367.342815625Q190.40720584375,367.409973625,190.28874804375,367.489120625Q190.17029024375,367.568275625,190.06016104374999,367.658656625Q189.95003174375,367.749038625,189.84929184375,367.849777625Q189.74855184375,367.950515625,189.65817094375,368.060645625Q189.56779024375,368.17077662500003,189.48863934375,368.289230625Q189.40948824375,368.407691625,189.34232954375,368.533336625Q189.27517054375,368.658981625,189.22065064375,368.790603625Q189.16613034375,368.922233625,189.12477394375,369.058566625Q189.08341764375,369.194900625,189.05562374375,369.334625625Q189.02782914375,369.474357625,189.01386504375,369.616142625Q188.99990054375,369.757926625,188.99990084375,369.900390625Q188.99990054375,370.042861625,189.01386474375,370.184642625Q189.02782914375,370.326423625,189.05562354375,370.466152625Q189.08341744375,370.605884625,189.12477374375,370.742214625Q189.16613004375,370.878547625,189.22065044375,371.010166625Q189.27517034375,371.141792625,189.34232924375,371.267440625Q189.40948824375,371.393081625,189.48863934375,371.511539625Q189.56779024375,371.629997625,189.65817114375,371.740127625Q189.74855184375,371.850257625,189.84929184375,371.950996625Q189.95003174375,372.051738625,190.06016114375,372.142120625Q190.17029024375,372.232498625,190.28874814375,372.311645625Q190.40720584375,372.390800625,190.53285124375,372.457958625Q190.65849664375,372.525115625,190.79011984375,372.579635625Q190.92174303375,372.634162625,191.05807638375,372.675517625Q191.19440972375,372.716873625,191.33414018375,372.744666625Q191.47387057375,372.772464625,191.61565250375,372.786430625Q191.75743441375,372.800392625,191.89990234375,372.800392625Z" fill-rule="evenodd" fill="#67E4F4" fill-opacity="1"/><path d="M59.78063934375,231.414822455L58.83064634375,231.648154705L59.06916834375,232.619291065L60.01916134375,232.385958795L59.78063934375,231.414822455ZM56.93064134375,232.114821735L55.03064334375,232.581487895L55.26916934375,233.552624225L57.16916634375,233.085958125L56.93064134375,232.114821735ZM53.13064534375,233.048154125L51.23064034375,233.514821125L51.46916534375,234.485957425L53.36916734375,234.019290425L53.13064534375,233.048154125ZM49.33064234375,233.981488225L47.43064534375,234.448154425L47.66916634375,235.419290525L49.56916434375,234.952624325L49.33064234375,233.981488225ZM45.53064334375,234.914820625L43.63064234375,235.381488525L43.86916334375,236.352624425L45.76916934375,235.885956725L45.53064334375,234.914820625ZM41.73064034375,235.848154825L39.83064634375,236.314820725L40.06916834375,237.285956825L41.96916534375,236.819290625L41.73064034375,235.848154825ZM37.93064134375,236.781487925L36.03064334375,237.248155125L36.26916534375,238.219291225L38.16916634375,237.752624025L37.93064134375,236.781487925ZM34.130645343750004,237.714821325L32.23064234375,238.181488025L32.46916534375,239.152624625L34.36916934375,238.685957425L34.130645343750004,237.714821325ZM30.33064234375,238.648155225L28.43064134375,239.114820925L28.66916434375,240.085957525L30.56916634375,239.619291825L30.33064234375,238.648155225ZM26.53064134375,239.581487225L24.63064234375,240.048154825L24.86916534375,241.019291925L26.76916534375,240.552623725L26.53064134375,239.581487225ZM22.73064234375,240.514821025L20.83064234375,240.981487225L21.06916634375,241.952624625L22.96916534375,241.485958125L22.73064234375,240.514821025ZM18.93064134375,241.448154425L17.03064134375,241.914821625L17.26916534375,242.885958625L19.16916434375,242.419291625L18.93064134375,241.448154425ZM15.13064034375,242.381487625L13.23064034375,242.848154625L13.46916534375,243.819291625L15.36916534375,243.352624625L15.13064034375,242.381487625ZM2.89990234375,248.800392625Q3.04237029375,248.800392625,3.18415218375,248.78642862499999Q3.32593411375,248.772464625,3.4656645037500002,248.744668625Q3.60539502375,248.716874625,3.74172830375,248.675517625Q3.87806165375,248.634162625,4.00968484375,248.579639625Q4.14130804375,248.525121625,4.26695344375,248.457961625Q4.39259914375,248.390804625,4.51105674375,248.311651625Q4.62951454375,248.232499625,4.73964384375,248.142120625Q4.84977304375,248.05173862499998,4.950513143749999,247.951000625Q5.05125334375,247.850260625,5.14163394375,247.740131625Q5.23201464375,247.630001625,5.31116534375,247.511543625Q5.390316443750001,247.393087625,5.45747544375,247.267440625Q5.52463434375,247.141795625,5.579154243750001,247.010171625Q5.63367464375,246.878549625,5.67503094375,246.742215625Q5.71638724375,246.605882625,5.74418114375,246.466152625Q5.77197554375,246.326421625,5.78593964375,246.184640625Q5.799904343750001,246.042857625,5.79990414375,245.900390625Q5.799904343750001,245.757923625,5.78593994375,245.616140625Q5.77197554375,245.474359625,5.74418114375,245.334627625Q5.71638724375,245.194898625,5.67503094375,245.058565625Q5.63367464375,244.922231625,5.579154243750001,244.790607625Q5.52463434375,244.658985625,5.45747544375,244.533338625Q5.390316443750001,244.407693625,5.31116534375,244.289234625Q5.23201464375,244.170778625,5.14163394375,244.060648625Q5.05125334375,243.950519625,4.950513143749999,243.849779625Q4.84977304375,243.749040625,4.73964384375,243.658658625Q4.62951454375,243.568278625,4.51105674375,243.489126625Q4.39259914375,243.409975625,4.26695354375,243.342817625Q4.14130804375,243.275657625,4.00968484375,243.22113662499999Q3.87806165375,243.166618625,3.74172836375,243.125261625Q3.60539502375,243.083906625,3.4656645037500002,243.056112625Q3.32593411375,243.028318625,3.18415218375,243.014353625Q3.04237029375,243.000388625,2.89990234375,243.000388625Q2.75743439375,243.000388625,2.61565250375,243.014354625Q2.47387057375,243.028318625,2.3341401837499998,243.056112625Q2.19440966375,243.083906625,2.05807638375,243.125263625Q1.9217430337499999,243.166618625,1.79011984375,243.221137625Q1.65849664375,243.275659625,1.53285124375,243.342818625Q1.40720554375,243.409976625,1.28874794375,243.489127625Q1.17029014375,243.568279625,1.06016084375,243.658659625Q0.95003164375,243.749040625,0.8492915437500002,243.849779625Q0.74855134375,243.950519625,0.65817074375,244.060647625Q0.5677900437500001,244.170778625,0.48863934375000007,244.289234625Q0.4094882437499998,244.407693625,0.34232924375000007,244.533338625Q0.27517034375000016,244.658985625,0.22065044374999987,244.790607625Q0.16613004374999996,244.922231625,0.12477374375000005,245.058565625Q0.08341744375000015,245.194898625,0.05562354374999989,245.334627625Q0.027829143750000007,245.474359625,0.013865043750000083,245.616142625Q-0.00009965625000019074,245.757923625,-0.00009945625000007396,245.900390625Q-0.00009965625000019074,246.042857625,0.01386474375000013,246.184640625Q0.027829143750000007,246.326421625,0.05562354374999989,246.466152625Q0.08341744375000015,246.605882625,0.12477374375000005,246.742215625Q0.16613004374999996,246.878549625,0.22065044374999987,247.010171625Q0.27517034375000016,247.141795625,0.34232924375000007,247.267441625Q0.4094882437499998,247.393087625,0.48863934375000007,247.511543625Q0.5677900437500001,247.630001625,0.65817074375,247.740131625Q0.74855134375,247.850260625,0.8492915437500002,247.951000625Q0.95003164375,248.05173862499998,1.06016084375,248.142120625Q1.17029014375,248.232499625,1.28874794375,248.311651625Q1.40720554375,248.390804625,1.53285114375,248.457961625Q1.65849664375,248.525121625,1.79011984375,248.579639625Q1.9217430337499999,248.634162625,2.05807632375,248.675517625Q2.19440966375,248.716874625,2.3341401837499998,248.744668625Q2.47387057375,248.772464625,2.61565250375,248.78642862499999Q2.75743439375,248.800392625,2.89990234375,248.800392625ZM11.33064074375,243.314821625L9.43064074375,243.781487625L9.669164643750001,244.752624625L11.56916524375,244.285957625L11.33064074375,243.314821625ZM7.53064064375,244.248154625L5.630640243749999,244.714820625L5.86916514375,245.68595762500001L7.76916504375,245.219291625L7.53064064375,244.248154625Z" fill-rule="evenodd" fill="#67E4F4" fill-opacity="1"/><path d="M3.89990234375,104.300392125Q4.04237027375,104.300392125,4.18415218375,104.286428225Q4.32593411375,104.272463825,4.46566450375,104.244669425Q4.60539496375,104.216875525,4.7417283037499995,104.175519225Q4.87806165375,104.134162925,5.00968484375,104.079642525Q5.14130804375,104.025122625,5.26695344375,103.957963725Q5.39259884375,103.890804725,5.51105664375,103.811653625Q5.62951444375,103.732502725,5.73964364375,103.642121825Q5.84977294375,103.551741125,5.9505128437499994,103.451001125Q6.0512528437499995,103.350261225,6.14163374375,103.240131825Q6.23201444375,103.130002725,6.31116534375,103.011544825Q6.390316443750001,102.893087125,6.45747514375,102.767441725Q6.52463414375,102.641796325,6.57915404375,102.510173125Q6.63367434375,102.378549935,6.67503074375,102.242216585Q6.71638704375,102.105883245,6.74418094375,101.966152785Q6.77197554375,101.826422395,6.78593964375,101.684640465Q6.79990414375,101.542858555,6.79990384375,101.400390625Q6.79990414375,101.257922695,6.78593994375,101.116140785Q6.77197554375,100.974358855,6.74418114375,100.834628465Q6.71638724375,100.694898005,6.67503094375,100.558564665Q6.63367464375,100.422231315,6.579154243750001,100.290608125Q6.52463434375,100.158984925,6.45747544375,100.033339525Q6.390316443750001,99.907694125,6.31116534375,99.789236325Q6.23201444375,99.670778525,6.14163354375,99.560649325Q6.0512528437499995,99.450520025,5.9505128437499994,99.349780125Q5.84977294375,99.249040125,5.73964354375,99.158659225Q5.62951444375,99.068278525,5.51105654375,98.989127625Q5.39259884375,98.909976525,5.26695344375,98.842817825Q5.14130804375,98.775658825,5.00968484375,98.721138925Q4.87806165375,98.666618625,4.7417283037499995,98.625262225Q4.60539496375,98.583905925,4.46566450375,98.556112025Q4.32593411375,98.528317425,4.18415218375,98.514353325Q4.04237027375,98.500389125,3.89990234375,98.500389125Q3.75743441375,98.500389125,3.61565250375,98.514353025Q3.47387057375,98.528317425,3.3341401837499998,98.556111825Q3.1944097237499998,98.583905725,3.05807638375,98.625262025Q2.92174303375,98.666618325,2.7901198437500003,98.721138725Q2.65849664375,98.775658625,2.5328512437499997,98.842817525Q2.40720584375,98.909976525,2.28874804375,98.989127625Q2.1702902437500002,99.068278525,2.06016104375,99.158659425Q1.95003174375,99.249040125,1.84929184375,99.349780125Q1.74855184375,99.450520025,1.65817094375,99.560649425Q1.5677902437500002,99.670778525,1.48863934375,99.789236425Q1.4094882437499998,99.907694125,1.34232954375,100.033339525Q1.2751705437499998,100.158984925,1.22065064375,100.290608125Q1.16613034375,100.422231315,1.1247739437500002,100.558564665Q1.0834176437499998,100.694898005,1.05562374375,100.834628465Q1.02782914375,100.974358855,1.01386504375,101.116140785Q0.9999005437499999,101.257922695,0.9999008437499999,101.400390625Q0.9999005437499999,101.542858555,1.0138647437500001,101.684640465Q1.02782914375,101.826422395,1.05562354375,101.966152785Q1.0834174437500002,102.105883245,1.12477374375,102.242216585Q1.16613004375,102.378549935,1.2206504437499999,102.510173125Q1.2751703437500002,102.641796325,1.34232924375,102.767441725Q1.4094882437499998,102.893087125,1.48863934375,103.011544925Q1.5677902437500002,103.130002725,1.6581711437500002,103.240131925Q1.74855184375,103.350261225,1.84929184375,103.451001125Q1.95003174375,103.551741125,2.0601611437500003,103.642122025Q2.1702902437500002,103.732502725,2.28874814375,103.811653625Q2.40720584375,103.890804725,2.5328512437499997,103.957963425Q2.65849664375,104.025122425,2.7901198437500003,104.079642325Q2.92174303375,104.134162625,3.05807638375,104.175519025Q3.1944097237499998,104.216875325,3.3341401837499998,104.244669225Q3.47387057375,104.272463825,3.61565250375,104.286427925Q3.75743441375,104.300392125,3.89990234375,104.300392125ZM8.76500944375,102.507302925L6.882655843749999,101.874949965L6.564207343750001,102.822890025L8.44656034375,103.455242825L8.76500944375,102.507302925ZM12.52971454375,103.772008625L10.647362243749999,103.139655725L10.32891324375,104.087595725L12.21126554375,104.719948525L12.52971454375,103.772008625ZM16.294421343750003,105.036714525L14.41206734375,104.404361725L14.09361834375,105.352301625L15.97597234375,105.984654425L16.294421343750003,105.036714525ZM20.05912634375,106.301420225L18.176774343749997,105.669067825L17.85832534375,106.617007725L19.74067734375,107.249360125L20.05912634375,106.301420225ZM23.82383134375,107.566126325L21.94147834375,106.933773525L21.62303134375,107.881713425L23.50538434375,108.514066225L23.82383134375,107.566126325ZM27.58853734375,108.830832525L25.70618434375,108.198479225L25.38773734375,109.146419025L27.27009034375,109.778772325L27.58853734375,108.830832525ZM31.35324334375,110.095537225L29.47089034375,109.463184325L29.15244334375,110.411125225L31.03479534375,111.043478025L31.35324334375,110.095537225ZM35.117950343749996,111.360243825L33.23559734375,110.727890925L32.917150343749995,111.675831625L34.799503343750004,112.308184625L35.117950343749996,111.360243825ZM38.88265634375,112.624949625L37.00030534375,111.992596625L36.68185434375,112.940537625L38.56420534375,113.572890625L38.88265634375,112.624949625ZM42.64736134375,113.889654625L40.76501034375,113.257302625L40.44656034375,114.205242625L42.32891034375,114.837595625L42.64736134375,113.889654625ZM46.41207134375,115.154361625L44.52971634375,114.522008625L44.21126534375,115.469949625L46.09362034375,116.102302625L46.41207134375,115.154361625ZM50.17677334375,116.419066625L48.29442234375,115.786713625L47.97597134375,116.734654625L49.85832234375,117.367007625L50.17677334375,116.419066625ZM53.94147834375,117.683772625L52.05912734375,117.051420625L51.74067734375,117.99936062500001L53.62302734375,118.631713625L53.94147834375,117.683772625ZM57.70618834375,118.948478625L55.82383334375,118.316125625L55.50538234375,119.264066625L57.38773734375,119.896419625L57.70618834375,118.948478625ZM61.47089034375,120.213184625L59.58853934375,119.580831625L59.27008834375,120.528772625L61.15243934375,121.161125625L61.47089034375,120.213184625ZM65.23559934375001,121.477889625L63.35324434375,120.84553762499999L63.03479434375,121.79347762500001L64.91714834375,122.425830625L65.23559934375001,121.477889625ZM68.05912734375,122.426418625L67.11794634374999,122.110242625L66.79949534375001,123.058183625L67.74067734375001,123.374359625L68.05912734375,122.426418625Z" fill-rule="evenodd" fill="#67E4F4" fill-opacity="1"/><path d="M188.39990234375,5.800392125Q188.54237027375,5.800392125,188.68415218375,5.786428225Q188.82593411375,5.772463825,188.96566450375,5.744669425Q189.10539496375,5.716875525,189.24172830375,5.675519225Q189.37806165375,5.634162925,189.50968484375,5.579642525000001Q189.64130804375,5.525122625,189.76695344375,5.457963725Q189.89259884375,5.390804725000001,190.01105664375,5.311653625Q190.12951444375,5.232502725,190.23964364375001,5.142121825Q190.34977294375,5.0517411249999995,190.45051284375,4.9510011249999994Q190.55125284375,4.850261225,190.64163374375,4.740131825Q190.73201444375,4.630002725,190.81116534375,4.511544825Q190.89031644375,4.393087125,190.95747514375,4.267441725Q191.02463414375,4.141796325,191.07915404375,4.010173125Q191.13367434375,3.878549935,191.17503074375,3.742216585Q191.21638704375,3.6058832450000002,191.24418094375,3.4661527850000002Q191.27197554375,3.326422395,191.28593964375,3.184640465Q191.29990414375,3.042858555,191.29990384375,2.900390625Q191.29990414375,2.757922695,191.28593994375,2.616140785Q191.27197554375,2.474358855,191.24418114375,2.3346284649999998Q191.21638724375,2.1948980049999998,191.17503094375,2.058564665Q191.13367464375,1.9222313149999999,191.07915424375,1.790608125Q191.02463434375,1.658984925,190.95747544375,1.533339525Q190.89031644375,1.407694125,190.81116534375,1.289236325Q190.73201444375,1.170778525,190.64163354375,1.060649325Q190.55125284375,0.9505200250000001,190.45051284375,0.8497801250000001Q190.34977294375,0.7490401250000001,190.23964354375,0.6586592250000001Q190.12951444375,0.5682785250000002,190.01105654375,0.48912762500000007Q189.89259884375,0.4099765249999998,189.76695344375,0.342817825Q189.64130804375,0.27565882499999983,189.50968484375,0.221138925Q189.37806165375,0.1666186249999999,189.24172830375,0.12526222500000017Q189.10539496375,0.08390592499999983,188.96566450375,0.05611202500000001Q188.82593411375,0.028317425000000007,188.68415218375,0.014353325000000083Q188.54237027375,0.00038912499999987915,188.39990234375,0.00038912499999987915Q188.25743441375,0.00038912499999987915,188.11565250375,0.01435302500000013Q187.97387057375,0.028317425000000007,187.83414018375,0.05611182499999989Q187.69440972375,0.08390572500000015,187.55807638375,0.12526202500000005Q187.42174303375,0.16661832499999996,187.29011984375,0.22113872499999987Q187.15849664375,0.27565862500000016,187.03285124375,0.34281752500000007Q186.90720584375,0.4099765249999998,186.78874804375,0.48912762500000007Q186.67029024375,0.5682785250000002,186.56016104374999,0.6586594250000002Q186.45003174375,0.7490401250000001,186.34929184375,0.8497801250000001Q186.24855184375,0.9505200250000001,186.15817094375,1.060649425Q186.06779024375,1.170778525,185.98863934375,1.289236425Q185.90948824375,1.407694125,185.84232954375,1.533339525Q185.77517054375,1.658984925,185.72065064375,1.790608125Q185.66613034375,1.9222313149999999,185.62477394375,2.058564665Q185.58341764375,2.1948980049999998,185.55562374375,2.3346284649999998Q185.52782914375,2.474358855,185.51386504375,2.616140785Q185.49990054375,2.757922695,185.49990084375,2.900390625Q185.49990054375,3.042858555,185.51386474375,3.184640465Q185.52782914375,3.326422395,185.55562354375,3.4661527850000002Q185.58341744375,3.6058832450000002,185.62477374375,3.742216585Q185.66613004375,3.878549935,185.72065044375,4.010173125Q185.77517034375,4.141796325,185.84232924375,4.267441725Q185.90948824375,4.393087125,185.98863934375,4.511544925Q186.06779024375,4.630002725,186.15817114375,4.740131925Q186.24855184375,4.850261225,186.34929184375,4.9510011249999994Q186.45003174375,5.0517411249999995,186.56016114375,5.142122025Q186.67029024375,5.232502725,186.78874814375,5.311653625Q186.90720584375,5.390804725000001,187.03285124375,5.457963425Q187.15849664375,5.525122425,187.29011984375,5.579642325Q187.42174303375,5.634162625,187.55807638375,5.675519025Q187.69440972375,5.716875325,187.83414018375,5.744669225Q187.97387057375,5.772463825,188.11565250375,5.786427925Q188.25743441375,5.800392125,188.39990234375,5.800392125ZM188.89990234375,8.004557625L188.89990234375,5.962890625L187.89990234375,5.962890625L187.89990234375,8.004557625L188.89990234375,8.004557625ZM188.89990234375,12.087890625L188.89990234375,10.046224125L187.89990234375,10.046224125L187.89990234375,12.087890625L188.89990234375,12.087890625ZM188.89990234375,16.171224625L188.89990234375,14.129557625L187.89990234375,14.129557625L187.89990234375,16.171224625L188.89990234375,16.171224625ZM188.89990234375,20.254558625L188.89990234375,18.212891624999997L187.89990234375,18.212891624999997L187.89990234375,20.254558625L188.89990234375,20.254558625ZM188.89990234375,24.337890625L188.89990234375,22.296224625L187.89990234375,22.296224625L187.89990234375,24.337890625L188.89990234375,24.337890625ZM188.89990234375,28.421224625L188.89990234375,26.379558625L187.89990234375,26.379558625L187.89990234375,28.421224625L188.89990234375,28.421224625ZM188.89990234375,32.504558625L188.89990234375,30.462892625L187.89990234375,30.462892625L187.89990234375,32.504558625L188.89990234375,32.504558625ZM188.89990234375,36.587890625L188.89990234375,34.546224625L187.89990234375,34.546224625L187.89990234375,36.587890625L188.89990234375,36.587890625ZM188.89990234375,40.671226625L188.89990234375,38.629558625L187.89990234375,38.629558625L187.89990234375,40.671226625L188.89990234375,40.671226625ZM188.89990234375,44.754558625L188.89990234375,42.712890625L187.89990234375,42.712890625L187.89990234375,44.754558625L188.89990234375,44.754558625ZM188.89990234375,48.837890625L188.89990234375,46.796226625L187.89990234375,46.796226625L187.89990234375,48.837890625L188.89990234375,48.837890625ZM188.89990234375,51.900390625L188.89990234375,50.879558625L187.89990234375,50.879558625L187.89990234375,51.900390625L188.89990234375,51.900390625Z" fill-rule="evenodd" fill="#67E4F4" fill-opacity="1"/></svg>
\ No newline at end of file
diff --git a/src/assets/system/baogong.svg b/src/assets/system/baogong.svg
new file mode 100644
index 0000000..daddd9c
--- /dev/null
+++ b/src/assets/system/baogong.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="59.5" height="62.90625" viewBox="0 0 59.5 62.90625"><defs><linearGradient x1="0" y1="0.16914062201976776" x2="0.8045321262753937" y2="1.0460527890370677" id="master_svg0_141_37616"><stop offset="48.549023270606995%" stop-color="#F7F7F7" stop-opacity="1"/><stop offset="100%" stop-color="#FFFFFF" stop-opacity="1"/></linearGradient><linearGradient x1="-0.03565644100308418" y1="0" x2="0.8226521556701855" y2="0.9991461352834076" id="master_svg1_141_37562"><stop offset="46.036821603775024%" stop-color="#F3F3F3" stop-opacity="1"/><stop offset="100%" stop-color="#FFFFFF" stop-opacity="1"/></linearGradient><clipPath id="master_svg2_143_35815"><rect x="14" y="0" width="30" height="30" rx="0"/></clipPath></defs><path d="M1.204819142818451,26.096379L28.69276814281845,42.307213000000004L58.29516614281845,26.096379L28.69276814281845,12L1.204819142818451,26.096379Z" fill="#FFFFFF" fill-opacity="1"/><path d="M0.16870074281845082,26.065809L28.43877614281845,42.737896L28.68361514281845,42.882288L59.39288714281845,26.065309L28.684561142818453,11.44229615L0.16870074281845082,26.065809ZM28.70192014281845,41.732138L2.240937742818451,26.12695L28.70097614281845,12.55770427L57.19744514281845,26.127449L28.70192014281845,41.732138Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/><path d="M0.5,26.80120277404785L0.5,45.83131777404785L28.692764,62.042150774047855L28.692764,43.01204077404785L0.5,26.80120277404785Z" fill="url(#master_svg0_141_37616)" fill-opacity="1"/><path d="M29.192764,62.906411774047854L29.192764,42.722777774047856L28.941999,42.578587774047854L-5.999999996841865e-8,25.93693918404785L0,46.12058077404785L29.192764,62.906411774047854ZM28.192764,43.30130377404785L28.192764,61.17788877404785L1,45.542054774047855L1,27.66546636404785L28.192764,43.30130377404785Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/><g transform="matrix(-1,0,0,1,118,0)"><path d="M59,26.80120277404785L59,45.12649377404785L88.5,62.00042177404785L88.5,42.26604677404785L59,26.80120277404785Z" fill="url(#master_svg1_141_37562)" fill-opacity="1"/><path d="M89,62.86243677404785L89,41.96362277404785L88.732151,41.82320777404785L58.50000003,25.97454732404785L58.50000003,45.41651177404785L89,62.86243677404785ZM88,42.568469774047855L88,61.13840677404785L59.5,44.836475774047855L59.5,27.627858224047852L88,42.568469774047855Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/></g><g clip-path="url(#master_svg2_143_35815)"><path d="M17.76220696875,10.375L20.44873021875,10.375C20.92626951875,10.375,21.35986331875,9.985351999999999,21.35986331875,9.5078125C21.35986331875,9.030272499999999,20.97021481875,8.640624500000001,20.44873021875,8.640624500000001L17.76220696875,8.640624500000001C17.28466784875,8.640624500000001,16.85107421875,9.030272499999999,16.85107421875,9.5078125C16.85400386155,9.985351099999999,17.24365239875,10.375,17.76220696875,10.375ZM21.31591801875,20.51465C21.31591801875,20.037111,20.92626951875,19.647463,20.40478491875,19.647463L17.76220696875,19.647463C17.28466784875,19.647463,16.85107421875,20.037111,16.85107421875,20.51465C16.85107421875,20.992188,17.24072274875,21.381836,17.76220696875,21.381836L20.44873021875,21.381836C20.92626951875,21.381836,21.31591801875,20.992188,21.31591801875,20.51465ZM33.66748021875,20.643555L33.27783221875,20.382812C32.88818321875,20.078123,32.80029421875,19.515625,33.10498021875,19.125975L35.31396521875,16.395505L34.61962921875,15.833005L32.36669821875,18.563475C32.062010218750004,18.953123,31.49951221875,18.997068,31.109861218749998,18.692382000000002L30.764159218750002,18.431639L40.90380821875,6.2119140999999996C40.90380821875,4.2607421,39.30126921875,2.875,37.35009721875,2.875L21.74951221875,2.875C20.27587891875,2.875,18.97509791875,3.69824213,18.97509791875,5.171875L18.97509791875,6.90625L20.31982471875,6.90625C21.48877001875,6.90625,22.66064501875,7.9023438,22.66064501875,9.203125C22.66064501875,10.5039062,21.74951221875,11.5,20.45166061875,11.5L18.97802781875,11.5L18.97802781875,17.87207L20.32275461875,17.87207C21.49170021875,17.87207,22.66357521875,18.868164999999998,22.66357521875,20.168947C22.66357521875,21.469728,21.75244191875,22.465822,20.45459051875,22.465822L18.98095731875,22.465822L18.98095731875,24.5459C18.98095731875,26.019533,20.28173831875,27.103518,21.755372018750002,27.103518L38.22314421875,27.103518C39.69677721875,27.103518,41.12646521875,26.019533,41.12646521875,24.5459L41.12646521875,11.6728516L33.66748021875,20.643555ZM30.37451121875,22.333984C30.069822218749998,22.462893,29.29052621875,22.205078,29.33447121875,21.856445L30.24560321875,19.125977L33.02001721875,21.334963L30.37451121875,22.333984Z" fill="#496FFE" fill-opacity="1" style="mix-blend-mode:passthrough"/></g></svg>
\ No newline at end of file
diff --git a/src/assets/system/baogongtaizhang.svg b/src/assets/system/baogongtaizhang.svg
new file mode 100644
index 0000000..d668f96
--- /dev/null
+++ b/src/assets/system/baogongtaizhang.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="59.5" height="64.90625" viewBox="0 0 59.5 64.90625"><defs><linearGradient x1="0" y1="0.16914062201976776" x2="0.8045321262753937" y2="1.0460527890370677" id="master_svg0_141_37616"><stop offset="48.549023270606995%" stop-color="#F7F7F7" stop-opacity="1"/><stop offset="100%" stop-color="#FFFFFF" stop-opacity="1"/></linearGradient><linearGradient x1="-0.03565644100308418" y1="0" x2="0.8226521556701855" y2="0.9991461352834076" id="master_svg1_141_37562"><stop offset="46.036821603775024%" stop-color="#F3F3F3" stop-opacity="1"/><stop offset="100%" stop-color="#FFFFFF" stop-opacity="1"/></linearGradient><clipPath id="master_svg2_143_35824"><rect x="12.5" y="0" width="34.000003814697266" height="34" rx="0"/></clipPath></defs><path d="M1.204819142818451,28.096379L28.69276814281845,44.307213000000004L58.29516614281845,28.096379L28.69276814281845,14L1.204819142818451,28.096379Z" fill="#FFFFFF" fill-opacity="1"/><path d="M0.16870074281845082,28.065809L28.43877614281845,44.737896L28.68361514281845,44.882288L59.39288714281845,28.065309L28.684561142818453,13.44229615L0.16870074281845082,28.065809ZM28.70192014281845,43.732138L2.240937742818451,28.12695L28.70097614281845,14.55770427L57.19744514281845,28.127449L28.70192014281845,43.732138Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/><path d="M0.5,28.80120277404785L0.5,47.83131777404785L28.692764,64.04215077404785L28.692764,45.01204077404785L0.5,28.80120277404785Z" fill="url(#master_svg0_141_37616)" fill-opacity="1"/><path d="M29.192764,64.90641177404785L29.192764,44.722777774047856L28.941999,44.578587774047854L-5.999999996841865e-8,27.93693918404785L0,48.12058077404785L29.192764,64.90641177404785ZM28.192764,45.30130377404785L28.192764,63.17788877404785L1,47.542054774047855L1,29.66546636404785L28.192764,45.30130377404785Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/><g transform="matrix(-1,0,0,1,118,0)"><path d="M59,28.80120277404785L59,47.12649377404785L88.5,64.00042177404785L88.5,44.26604677404785L59,28.80120277404785Z" fill="url(#master_svg1_141_37562)" fill-opacity="1"/><path d="M89,64.86243677404785L89,43.96362277404785L88.732151,43.82320777404785L58.50000003,27.97454732404785L58.50000003,47.41651177404785L89,64.86243677404785ZM88,44.568469774047855L88,63.13840677404785L59.5,46.836475774047855L59.5,29.627858224047852L88,44.568469774047855Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/></g><g clip-path="url(#master_svg2_143_35824)"><path d="M30.364756937499997,25.1723935L31.5122539375,23.7415655C30.7614219375,22.8348995,30.3080869375,21.6732315,30.3080869375,20.4265635C30.3080869375,17.5648925,32.6455929375,15.2273945,35.5214249375,15.2273945C37.0655859375,15.2273945,38.4680879375,15.9073935,39.417254937500005,16.969893499999998L39.417254937500005,4.4890625C39.417254937500005,3.55406219,38.652257937499996,2.7890625,37.7172569375,2.7890625L19.3005861375,2.7890625C18.3655856875,2.7890625,17.6005859375,3.55406243,17.6005859375,4.4890625L17.6005859375,26.5890575C17.6005859375,27.5240575,18.3655862175,28.2890625,19.3005861375,28.2890625L27.4747514375,28.2890625C27.8289189375,26.8015635,28.933920937499998,25.6115625,30.364756937499997,25.1723935ZM23.706419037499998,6.7982302L33.339754937500004,6.7982302C33.963088937500004,6.7982302,34.4730839375,7.3082304,34.4730839375,7.9315624C34.4730839375,8.5548954,33.963088937500004,9.0648956,33.339754937500004,9.0648956L23.7064218375,9.0648956C23.083087437499998,9.0648956,22.5730877375,8.5548968,22.5730877375,7.9315639C22.5730877375,7.3082304,23.0689206375,6.7982302,23.706419037499998,6.7982302ZM23.706419037499998,11.8982306L33.339754937500004,11.8982306C33.963088937500004,11.8982306,34.4730839375,12.4082298,34.4730839375,13.0315625C34.4730839375,13.6548975,33.963088937500004,14.1648965,33.339754937500004,14.1648965L23.7064218375,14.1648965C23.083087437499998,14.1648965,22.5730877375,13.6548975,22.5730877375,13.0315625C22.5730877375,12.4082298,23.0689206375,11.8982306,23.706419037499998,11.8982306ZM22.5730872375,18.1315635C22.5730872375,17.5082325,23.0830865375,16.9982295,23.706419037499998,16.9982295L27.6730879375,16.9982295C28.296420937500002,16.9982295,28.8064209375,17.5082265,28.8064209375,18.1315575C28.8064209375,18.754890500000002,28.296420937500002,19.2648965,27.6730879375,19.2648965L23.706419037499998,19.2648965C23.0689187375,19.2648965,22.5730872375,18.7548925,22.5730872375,18.1315635Z" fill="#496FFE" fill-opacity="1" style="mix-blend-mode:passthrough"/><path d="M39.43028168125,31.168883875L31.596113881249998,31.168883875C30.51944607125,31.168883875,29.64111328125,30.290549875,29.64111328125,29.213882875C29.64111328125,28.137214874999998,30.51944607125,27.258882475,31.596113881249998,27.258882475L34.81194638125,23.263881675C33.52277968125,22.952215175,32.57361388125,21.804714675,32.57361388125,20.430547675C32.57361388125,18.815546775,33.89111378125,17.498046875,35.52027988125,17.498046875C37.14944748125,17.498046875,38.46694468125,18.815546775,38.46694468125,20.430547675C38.46694468125,21.804714675,37.51777978125,22.952215175,36.22861288125,23.263881675L39.44444748125,27.258882475C40.52111428125,27.258882475,41.39944628125,28.137214874999998,41.39944628125,29.213882875C41.39944628125,30.290549875,40.52111428125,31.168883875,39.43028168125,31.168883875Z" fill="#496FFE" fill-opacity="1" style="mix-blend-mode:passthrough"/></g></svg>
\ No newline at end of file
diff --git a/src/assets/system/caigoubaobiao.svg b/src/assets/system/caigoubaobiao.svg
new file mode 100644
index 0000000..164efe4
--- /dev/null
+++ b/src/assets/system/caigoubaobiao.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="59.5" height="60.90625" viewBox="0 0 59.5 60.90625"><defs><linearGradient x1="0" y1="0.16914062201976776" x2="0.8045321262753937" y2="1.0460527890370677" id="master_svg0_141_37616"><stop offset="48.549023270606995%" stop-color="#F7F7F7" stop-opacity="1"/><stop offset="100%" stop-color="#FFFFFF" stop-opacity="1"/></linearGradient><linearGradient x1="-0.03565644100308418" y1="0" x2="0.8226521556701855" y2="0.9991461352834076" id="master_svg1_141_37562"><stop offset="46.036821603775024%" stop-color="#F3F3F3" stop-opacity="1"/><stop offset="100%" stop-color="#FFFFFF" stop-opacity="1"/></linearGradient><clipPath id="master_svg2_143_35725"><rect x="16.5" y="0" width="27" height="27" rx="0"/></clipPath></defs><path d="M1.204819142818451,24.096379L28.69276814281845,40.307213000000004L58.29516614281845,24.096379L28.69276814281845,10L1.204819142818451,24.096379Z" fill="#FFFFFF" fill-opacity="1"/><path d="M0.16870074281845082,24.065809L28.43877614281845,40.737896L28.68361514281845,40.882288L59.39288714281845,24.065309L28.684561142818453,9.44229615L0.16870074281845082,24.065809ZM28.70192014281845,39.732138L2.240937742818451,24.12695L28.70097614281845,10.55770427L57.19744514281845,24.127449L28.70192014281845,39.732138Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/><path d="M0.5,24.80120277404785L0.5,43.83131777404785L28.692764,60.042150774047855L28.692764,41.01204077404785L0.5,24.80120277404785Z" fill="url(#master_svg0_141_37616)" fill-opacity="1"/><path d="M29.192764,60.906411774047854L29.192764,40.722777774047856L28.941999,40.578587774047854L-5.999999996841865e-8,23.93693918404785L0,44.12058077404785L29.192764,60.906411774047854ZM28.192764,41.30130377404785L28.192764,59.17788877404785L1,43.542054774047855L1,25.66546636404785L28.192764,41.30130377404785Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/><g transform="matrix(-1,0,0,1,118,0)"><path d="M59,24.80120277404785L59,43.12649377404785L88.5,60.00042177404785L88.5,40.26604677404785L59,24.80120277404785Z" fill="url(#master_svg1_141_37562)" fill-opacity="1"/><path d="M89,60.86243677404785L89,39.96362277404785L88.732151,39.82320777404785L58.50000003,23.97454732404785L58.50000003,43.41651177404785L89,60.86243677404785ZM88,40.568469774047855L88,59.13840677404785L59.5,42.836475774047855L59.5,25.627858224047852L88,40.568469774047855Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/></g><g clip-path="url(#master_svg2_143_35725)"><path d="M18.2960399,19.401375L41.644558,19.401375C42.208858,19.348387,42.619251,18.840738,42.553804,18.276657L42.553804,1.1247175C42.619251,0.56063783,42.208858,0.052988321,41.644558,0L18.2960399,0C17.7349908,0.059026856,17.3279168,0.56256902,17.38679475,1.1247175L17.38679475,18.321648C17.34767658,18.868998,17.7509638,19.347902,18.2960399,19.401375ZM34.628777,3.554107L39.46686,3.554107C39.800758,3.5838315,40.052634999999995,3.8708398,40.039347,4.2064433C40.05232,4.5398693,39.799026,4.8235159,39.46686,4.8475323L34.628777,4.8475323C34.305557,4.8122854,34.065008,4.5319171,34.078739,4.2064433C34.064516,3.8786428,34.303837,3.5948114,34.628777,3.554107ZM34.628777,6.7145634L39.46686,6.7145634C39.799026,6.7385783,40.05232,7.0222259,40.039347,7.3556523C40.052634999999995,7.6912551,39.800758,7.9782634,39.46686,8.007988L34.628777,8.007988C34.303835,7.9672842,34.064516,7.6834526,34.078739,7.3556523C34.082552,7.0430193,34.31859,6.7823882,34.628777,6.7483044L34.628777,6.7145634ZM34.628777,9.976243L39.46686,9.976243C39.797287,9.9944181,40.052101,10.27476,40.039347,10.606086C40.052634999999995,10.941689,39.800758,11.228697,39.46686,11.258421L34.628777,11.258421C34.303835,11.217718,34.064516,10.933886,34.078739,10.606086C34.06542,10.282872,34.307281,10.005919,34.628777,9.976243ZM26.322093000000002,3.554107C26.4553547,3.4100845,26.682741,3.4100845,26.816004,3.554107L29.061052,6.4333839L28.163033,6.4333839L26.277193099999998,4.0827241C26.1536102,3.9213576,26.1730719,3.6922283,26.322093000000002,3.554107ZM21.5176859,6.4783726L23.7627358,3.610343C23.8959985,3.4663203,24.123385,3.4663203,24.2566466,3.610343C24.392286300000002,3.7603433,24.392286300000002,3.9889596,24.2566466,4.1389604L22.382030999999998,6.5346084L21.4840107,6.5346084L21.5176859,6.4783726ZM20.0247281,7.2769227L30.542787,7.2769227C30.746521,7.2944822,30.902746,7.4656887,30.901995,7.6705737C30.908293999999998,7.8693829,30.75244,8.0356159,30.554012,8.0417309L30.206031,8.0417309L29.083506,14.126452C29.001704,14.465208,28.701669000000003,14.705706,28.353864,14.711306L22.191201200000002,14.711306C21.841960399999998,14.709742,21.5397458,14.467498,21.4615598,14.126452L20.3390353,8.0304842L20.0247283,8.0304842C19.8418345,7.9987054,19.7082825,7.8396893,19.7082825,7.6537042C19.7082825,7.4677172,19.8418345,7.308702,20.0247281,7.2769227ZM23.482104800000002,12.833026C23.6805339,12.826911,23.8363857,12.660679,23.8300877,12.461868L23.8300877,9.4588737C23.8300886,9.2663126,23.6742921,9.1102114,23.482105699999998,9.1102114C23.2899208,9.1102114,23.1341233,9.2663126,23.1341228,9.4588737L23.1341228,12.461869C23.1278248,12.660679,23.2836776,12.826911,23.482104800000002,12.833026ZM42.991589000000005,20.919744L16.94900998,20.919744C16.69082925,20.919744,16.5,21.549585,16.5,21.853258C16.5,22.156931,16.71327975,22.798021,16.94900998,22.798021L23.897439,22.798021L22.1126246,25.868502C21.9664502,26.204638,22.0473838,26.596581,22.3146791,26.847004C22.6148901,27.015087,22.9897623,26.964701,23.2351494,26.723286L25.480198899999998,22.798023L34.898184,22.798023L36.952404,26.71204C37.138704000000004,26.994795,37.512434,27.083481,37.805521,26.91449C38.056238,26.717609,38.147625000000005,26.378819,38.030027000000004,26.082197L36.335014,22.775528L43.070164,22.775528C43.328342,22.775528,43.519172999999995,22.134438,43.519172999999995,21.830765C43.519172999999995,21.527092,43.249767,20.919744,42.991589000000005,20.919744ZM27.141537,12.833026C27.339965,12.826911,27.495817000000002,12.660679,27.489519,12.461868L27.489519,9.4588737C27.48952,9.2663126,27.333722,9.1102114,27.141537,9.1102114C26.949351,9.1102114,26.793554,9.2663126,26.793553,9.4588737L26.793553,12.461869C26.787255000000002,12.66068,26.943109,12.826912,27.141537,12.833026ZM25.311821000000002,12.833026C25.5102491,12.826911,25.6661024,12.660679,25.6598034,12.461868L25.6598034,9.4588737C25.6598034,9.2663126,25.5040064,9.1102114,25.311821899999998,9.1102114C25.119635600000002,9.1102114,24.963838600000003,9.2663126,24.963838600000003,9.4588737L24.963838600000003,12.461869C24.957541499999998,12.660679,25.1133938,12.826911,25.311821000000002,12.833026Z" fill="#496FFE" fill-opacity="1" style="mix-blend-mode:passthrough"/></g></svg>
\ No newline at end of file
diff --git a/src/assets/system/caigoupeizhi.svg b/src/assets/system/caigoupeizhi.svg
new file mode 100644
index 0000000..56cbd1b
--- /dev/null
+++ b/src/assets/system/caigoupeizhi.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="89.5693359375" height="96" viewBox="0 0 89.5693359375 96"><defs><filter id="master_svg0_143_35986" filterUnits="objectBoundingBox" color-interpolation-filters="sRGB" x="-0.6666666666666666" y="-0.6666666666666666" width="2.3333333333333335" height="2.3333333333333335"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"/><feOffset dy="0" dx="0"/><feGaussianBlur stdDeviation="8"/><feColorMatrix type="matrix" values="0 0 0 0 0.12895070016384125 0 0 0 0 0.29307788610458374 0 0 0 0 0.9107142686843872 0 0 0 0.5299999713897705 0"/><feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow"/><feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow" result="shape"/></filter><clipPath id="master_svg1_143_35990"><rect x="29.78466796875" y="36" width="27" height="26" rx="0"/></clipPath></defs><path d="M44.78466796875,24.000000000000004L65.56927496875,36L65.56927496875,60L44.78466796875,72L24.00005836875,60L24.00005796875,36.000001L44.78466796875,24.000000000000004Z" fill="#496FFE" fill-opacity="1" filter="url(#master_svg0_143_35986)"/><g clip-path="url(#master_svg1_143_35990)"><path d="M38.936583953125,55.370050875000004C37.733132853125,55.370050875000004,36.759445153125,56.318214874999995,36.759445153125,57.477092875C36.759445153125,58.635968875,37.733132853125,59.584132875,38.936583953125,59.584132875C40.140035153125,59.584132875,41.124664353125,58.635968875,41.124664353125,57.477092875C41.124664353125,56.318214874999995,40.140035153125,55.370050875000004,38.936583953125,55.370050875000004ZM32.372314453125,38.513671875L32.372314453125,40.620712975000004L34.560395253125,40.620712975000004L38.498940453125,48.616956875L37.021982153125,51.198091875C36.846930553125,51.493078875,36.748476053125,51.840727875,36.748476053125,52.209476875C36.748476053125,53.368354875,37.733105153125,54.316516875,38.936556353125,54.316516875L52.065095453125,54.316516875L52.065095453125,52.209476875L39.396084753125,52.209476875C39.242918053125,52.209476875,39.122578653125004,52.093592875,39.122578653125004,51.946099875L39.155405553125,51.819678875L40.140035153125,50.102435875L48.290658453125,50.102435875C49.111179453125004,50.102435875,49.833271453125,49.670489875,50.205232453125,49.017316875L54.121921453125,42.179950975C54.209434453125,42.032456875,54.253204453125,41.853351075,54.253204453125,41.674271375000004C54.253204453125,41.094831975,53.760877453125005,40.620738275,53.159151453125,40.620738275L36.978240053125,40.620738275L35.949840753125,38.513697251678L32.372314453125,38.513671875ZM49.877016453125,55.370050875000004C48.673564453124996,55.370050875000004,47.699876453125,56.318214874999995,47.699876453125,57.477092875C47.699876453125,58.635968875,48.673564453124996,59.584132875,49.877016453125,59.584132875C51.080467453124996,59.584132875,52.065095453125,58.635968875,52.065095453125,57.477092875C52.065095453125,56.318214874999995,51.080467453124996,55.370050875000004,49.877016453125,55.370050875000004Z" fill="#FFFFFF" fill-opacity="1" style="mix-blend-mode:passthrough"/></g></svg>
\ No newline at end of file
diff --git a/src/assets/system/caigoutaizhang.svg b/src/assets/system/caigoutaizhang.svg
new file mode 100644
index 0000000..a6cf257
--- /dev/null
+++ b/src/assets/system/caigoutaizhang.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="59.5" height="58.90625" viewBox="0 0 59.5 58.90625"><defs><linearGradient x1="0" y1="0.16914062201976776" x2="0.8045321262753937" y2="1.0460527890370677" id="master_svg0_141_37616"><stop offset="48.549023270606995%" stop-color="#F7F7F7" stop-opacity="1"/><stop offset="100%" stop-color="#FFFFFF" stop-opacity="1"/></linearGradient><linearGradient x1="-0.03565644100308418" y1="0" x2="0.8226521556701855" y2="0.9991461352834076" id="master_svg1_141_37562"><stop offset="46.036821603775024%" stop-color="#F3F3F3" stop-opacity="1"/><stop offset="100%" stop-color="#FFFFFF" stop-opacity="1"/></linearGradient><clipPath id="master_svg2_143_35697"><rect x="18" y="0" width="23" height="23" rx="0"/></clipPath></defs><path d="M1.204819142818451,22.096379L28.69276814281845,38.307213000000004L58.29516614281845,22.096379L28.69276814281845,8L1.204819142818451,22.096379Z" fill="#FFFFFF" fill-opacity="1"/><path d="M0.16870074281845082,22.065809L28.43877614281845,38.737896L28.68361514281845,38.882288L59.39288714281845,22.065309L28.684561142818453,7.44229615L0.16870074281845082,22.065809ZM28.70192014281845,37.732138L2.240937742818451,22.12695L28.70097614281845,8.55770427L57.19744514281845,22.127449L28.70192014281845,37.732138Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/><path d="M0.5,22.80120277404785L0.5,41.83131777404785L28.692764,58.042150774047855L28.692764,39.01204077404785L0.5,22.80120277404785Z" fill="url(#master_svg0_141_37616)" fill-opacity="1"/><path d="M29.192764,58.906411774047854L29.192764,38.722777774047856L28.941999,38.578587774047854L-5.999999996841865e-8,21.93693918404785L0,42.12058077404785L29.192764,58.906411774047854ZM28.192764,39.30130377404785L28.192764,57.17788877404785L1,41.542054774047855L1,23.66546636404785L28.192764,39.30130377404785Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/><g transform="matrix(-1,0,0,1,118,0)"><path d="M59,22.80120277404785L59,41.12649377404785L88.5,58.00042177404785L88.5,38.26604677404785L59,22.80120277404785Z" fill="url(#master_svg1_141_37562)" fill-opacity="1"/><path d="M89,58.86243677404785L89,37.96362277404785L88.732151,37.82320777404785L58.50000003,21.97454732404785L58.50000003,41.41651177404785L89,58.86243677404785ZM88,38.568469774047855L88,57.13840677404785L59.5,40.836475774047855L59.5,23.627858224047852L88,38.568469774047855Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/></g><g clip-path="url(#master_svg2_143_35697)"><path d="M40.99999,13.416666C41.00259,13.384775,41.00259,13.352724,40.99999,13.320833C41.002308,13.287331,41.002308,13.253709,40.99999,13.220208L38.278324,1.4375043C38.059512999999995,0.59004736,37.294407,-0.0015301184,36.419159,0.0000048838556L22.580831500000002,0.0000048838556C21.6940155,0.000090580994,20.9230585,0.60853219,20.7168739,1.4710461L18.023958318,13.20104C18.021638496,13.234541,18.021638496,13.268163,18.023958318,13.301665C18.012162563,13.339105,18.0041366061,13.377629,18,13.416666L18,21.08333C18,22.141876,18.8581205,22.999996,19.916665899999998,22.999996L39.083326,22.999996C40.14187,22.999996,40.99999,22.141876,40.999992,21.08333L40.99999,13.416666ZM22.580831500000002,1.9166707L36.414367999999996,1.9166707L38.838949,12.458332L34.770826,12.458332C34.241554,12.458332,33.812493,12.887392,33.812494,13.416665L33.812494,15.812497L25.1874971,15.812497L25.1874971,13.416665C25.1874971,12.887392,24.7584372,12.458332,24.2291641,12.458332L20.1610408,12.458332L22.580831500000002,1.9166707ZM22.7916646,9.583334C22.7916641,9.0540609,23.2207246,8.625001,23.7499971,8.625001L35.249992,8.625001C35.778898,8.6255178,36.207388,9.0544252,36.207388,9.583333C36.207388,10.112241,35.778898,10.541149,35.249992,10.541666L23.7499976,10.541666C23.2207251,10.541666,22.7916651,10.112606,22.7916646,9.583334ZM24.2291641,5.2708354C24.2291651,4.7415628,24.6582246,4.3125029,25.1874971,4.3125029L33.812494,4.3125029C34.341768,4.3125029,34.770828,4.7415628,34.770828,5.2708359C34.770828,5.8001089,34.341768,6.2291689,33.812494,6.2291689L25.1874971,6.2291689C24.6582246,6.2291689,24.2291641,5.8001089,24.2291641,5.2708354Z" fill="#496FFE" fill-opacity="1" style="mix-blend-mode:passthrough"/></g></svg>
\ No newline at end of file
diff --git a/src/assets/system/caigoutuihuo.svg b/src/assets/system/caigoutuihuo.svg
new file mode 100644
index 0000000..6b2df38
--- /dev/null
+++ b/src/assets/system/caigoutuihuo.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="59.5" height="64.90625" viewBox="0 0 59.5 64.90625"><defs><linearGradient x1="0" y1="0.16914062201976776" x2="0.8045321262753937" y2="1.0460527890370677" id="master_svg0_141_37616"><stop offset="48.549023270606995%" stop-color="#F7F7F7" stop-opacity="1"/><stop offset="100%" stop-color="#FFFFFF" stop-opacity="1"/></linearGradient><linearGradient x1="-0.03565644100308418" y1="0" x2="0.8226521556701855" y2="0.9991461352834076" id="master_svg1_141_37562"><stop offset="46.036821603775024%" stop-color="#F3F3F3" stop-opacity="1"/><stop offset="100%" stop-color="#FFFFFF" stop-opacity="1"/></linearGradient><clipPath id="master_svg2_143_35706"><rect x="12.5" y="0" width="34.000003814697266" height="34" rx="0"/></clipPath></defs><path d="M1.204819142818451,28.096379L28.69276814281845,44.307213000000004L58.29516614281845,28.096379L28.69276814281845,14L1.204819142818451,28.096379Z" fill="#FFFFFF" fill-opacity="1"/><path d="M0.16870074281845082,28.065809L28.43877614281845,44.737896L28.68361514281845,44.882288L59.39288714281845,28.065309L28.684561142818453,13.44229615L0.16870074281845082,28.065809ZM28.70192014281845,43.732138L2.240937742818451,28.12695L28.70097614281845,14.55770427L57.19744514281845,28.127449L28.70192014281845,43.732138Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/><path d="M0.5,28.80120277404785L0.5,47.83131777404785L28.692764,64.04215077404785L28.692764,45.01204077404785L0.5,28.80120277404785Z" fill="url(#master_svg0_141_37616)" fill-opacity="1"/><path d="M29.192764,64.90641177404785L29.192764,44.722777774047856L28.941999,44.578587774047854L-5.999999996841865e-8,27.93693918404785L0,48.12058077404785L29.192764,64.90641177404785ZM28.192764,45.30130377404785L28.192764,63.17788877404785L1,47.542054774047855L1,29.66546636404785L28.192764,45.30130377404785Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/><g transform="matrix(-1,0,0,1,118,0)"><path d="M59,28.80120277404785L59,47.12649377404785L88.5,64.00042177404785L88.5,44.26604677404785L59,28.80120277404785Z" fill="url(#master_svg1_141_37562)" fill-opacity="1"/><path d="M89,64.86243677404785L89,43.96362277404785L88.732151,43.82320777404785L58.50000003,27.97454732404785L58.50000003,47.41651177404785L89,64.86243677404785ZM88,44.568469774047855L88,63.13840677404785L59.5,46.836475774047855L59.5,29.627858224047852L88,44.568469774047855Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/></g><g clip-path="url(#master_svg2_143_35706)"><path d="M16.5,17.5C16.5,10.0479994,22.547999400000002,4,30,4C37.452,4,43.5,10.0479999,43.5,17.5C43.5,24.952,37.452,31,30,31C22.547999400000002,31,16.5,24.952,16.5,17.5ZM25.2099543,11.2335448C25.056938199999998,11.1590481,24.889226,11.1196365,24.719044699999998,11.118180800000001C24.4576359,11.118180800000001,24.2600451,11.2102261,24.1250448,11.3930907C23.965045,11.566371,23.8772473,11.7942061,23.8795905,12.0300455C23.8795905,12.2902269,23.9716368,12.4779997,24.1545,12.5945911C24.1946921,12.6422205,24.2439098,12.681428,24.2993183,12.7099552C24.812317800000002,13.0376368,25.309363400000002,13.3910923,25.789226499999998,13.7654095C25.875135399999998,13.8550005,25.9782276,13.9249544,26.0935907,13.9691372C26.1991358,14.026819,26.3292265,14.055046,26.4838629,14.055046C26.763681,14.046455,26.98459,13.9114552,27.149045,13.6500463C27.266969,13.4697084,27.327709,13.2579737,27.323318,13.0425463C27.319848,12.8229294,27.219160000000002,12.6161594,27.048409,12.4780006C26.492164600000002,11.9851937,25.874157,11.5668635,25.2099543,11.2335448ZM34.731136,11.2924538L29.478408,11.2924538C28.610726,11.2924538,28.177500000000002,11.648363100000001,28.177500000000002,12.3626356L28.177500000000002,19.944725C28.176272,20.042908,28.18609,20.138634,28.205727,20.234362C28.070726,20.349726,28.003225999999998,20.553452,28.003225999999998,20.841862C28.013044999999998,21.11186,28.070726,21.309452,28.176271,21.434633C28.292863,21.569633,28.500272000000002,21.637133,28.798499,21.637133C29.464908,21.637133,30.404999,21.487406,31.621223999999998,21.189178C31.861770999999997,21.140087,32.026225,21.059088,32.112133,20.943726C32.243669,20.79126,32.310976,20.593739,32.299906,20.392679C32.299906,20.17177,32.252043,19.997498,32.156316000000004,19.872315999999998C32.033533,19.737026,31.860347,19.658427,31.677678999999998,19.655088C31.157317,19.732407000000002,30.632043,19.804814999999998,30.100635,19.872315999999998L30.100635,17.455816L34.673452,17.455816C34.759361,17.455816,34.837906000000004,17.450908,34.905409,17.441088999999998C34.893873,17.462564,34.878954,17.482039999999998,34.861225000000005,17.498772000000002C34.521141,17.859035,34.158792,18.197606999999998,33.776316,18.512499C33.275587,18.193407999999998,32.749089999999995,17.895182,32.199270999999996,17.615363000000002C32.035903,17.54202,31.857872,17.507168,31.678905999999998,17.513499C31.417496999999997,17.513499,31.21009,17.590817,31.056679000000003,17.745455C30.902043,17.880454999999998,30.823497,18.082954,30.823497,18.352954C30.828218,18.505149,30.890499,18.649888,30.997768,18.757953999999998C31.051738999999998,18.809553,31.116205,18.848902000000002,31.186768999999998,18.873317999999998C32.266769,19.520091999999998,33.48177,20.369364,34.831768,21.419909C35.01586,21.604,35.246586,21.694817,35.527632,21.694817C35.766716,21.695692,35.992073000000005,21.583241,36.135132,21.39168C36.289076,21.227486,36.371994,21.009171,36.36586,20.78418C36.362389,20.564564,36.261703,20.357796,36.090952,20.219635C35.802544,19.968045,35.503088000000005,19.728727,35.195042,19.495544000000002C35.705585,19.197316999999998,36.115498,18.873317,36.424769999999995,18.526C36.533014,18.357194,36.592867,18.161924,36.597816,17.961454C36.611883,17.651581,36.456854,17.358437000000002,36.192816,17.195636999999998C36.041086,17.073852000000002,35.852282,17.007597,35.657722,17.007863999999998C35.753451999999996,16.853229,35.802544,16.645819,35.802544,16.385637L35.802544,12.3626366C35.802544,11.6483641,35.445406,11.2924547,34.731136,11.2924538ZM33.878181,13.664773L30.100636,13.664773L30.100636,13.1002264C30.100636,12.9468174,30.192681999999998,12.8695002,30.375545000000002,12.8695002L33.603271,12.8695002C33.786135,12.8695002,33.87818,12.9468174,33.87818,13.1002264L33.878181,13.664773ZM33.603271,15.864044L30.100636,15.864044L30.100636,15.02459L33.878181,15.02459L33.878181,15.646818C33.878181,15.791636,33.786135,15.864044,33.603271,15.864044ZM25.6296825,15.473772L24.2698641,15.473772C23.9507732,15.473772,23.724954099999998,15.546182,23.5899544,15.690999C23.4451365,15.844409,23.3727274,16.076363999999998,23.3727274,16.385635C23.3727274,16.723136,23.4402275,16.950181999999998,23.5752277,17.065544C23.6905913,17.248407,23.9225464,17.340454,24.2698641,17.340454L24.834409700000002,17.340454C24.9497738,17.340454,25.0074549,17.398136,25.0074549,17.513499L25.0074549,21.637135C25.0074549,21.714453,24.9546824,21.786861,24.847909899999998,21.854361C24.4527292,22.139252,24.0315437,22.386209,23.5899544,22.591951C23.4451365,22.698725,23.3727274,22.814087,23.3727274,22.939268C23.3771172,23.0942,23.4117188,23.246782,23.4745903,23.388451C23.6476359,23.697725,23.835408700000002,23.943178,24.0391369,24.126041C24.1385455,24.200905,24.260046,24.242634,24.3852277,24.242634C24.5752201,24.217705,24.7579012,24.153328,24.921546,24.053633C25.228364,23.907587,25.5204544,23.728407,25.7892284,23.518543C25.8849545,23.432632,25.9622736,23.388451,26.0211821,23.388451C26.132575,23.390455,26.2397785,23.431255,26.3243189,23.503817C27.153955,23.842543,28.572682999999998,24.010681,30.578046,24.010681L35.97559,24.010681C36.313091,23.991043,36.545048,23.900225,36.670227,23.735771C36.805227,23.61059,36.872726,23.363907,36.872726,22.99818C36.872726,22.67909,36.790501,22.453272,36.627274,22.317045C36.492271,22.201681,36.294682,22.144001,36.033272,22.144001C35.368092000000004,22.144001,34.566679,22.163635,33.6315,22.201681C32.551497999999995,22.239727,31.379454000000003,22.259361,30.115364,22.259361C28.996092,22.259361,28.114910000000002,22.191862,27.468138,22.056862C27.071728999999998,21.979544,26.874138000000002,21.8605,26.874138000000002,21.694817L26.874138000000002,16.601637C26.874138000000002,15.849319,26.4593201,15.472546,25.6296825,15.472546L25.6296825,15.473772Z" fill="#F56127" fill-opacity="1" style="mix-blend-mode:passthrough"/></g></svg>
\ No newline at end of file
diff --git a/src/assets/system/cangchuwuliu.svg b/src/assets/system/cangchuwuliu.svg
new file mode 100644
index 0000000..47ee791
--- /dev/null
+++ b/src/assets/system/cangchuwuliu.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="89.5693359375" height="96" viewBox="0 0 89.5693359375 96"><defs><filter id="master_svg0_143_36004" filterUnits="objectBoundingBox" color-interpolation-filters="sRGB" x="-0.6666666666666666" y="-0.6666666666666666" width="2.3333333333333335" height="2.3333333333333335"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"/><feOffset dy="0" dx="0"/><feGaussianBlur stdDeviation="8"/><feColorMatrix type="matrix" values="0 0 0 0 0.12895070016384125 0 0 0 0 0.29307788610458374 0 0 0 0 0.9107142686843872 0 0 0 0.5299999713897705 0"/><feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow"/><feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow" result="shape"/></filter><clipPath id="master_svg1_143_36007"><rect x="31.78466796875" y="34" width="27" height="27" rx="0"/></clipPath></defs><path d="M44.78466796875,24.000000000000004L65.56927496875,36L65.56927496875,60L44.78466796875,72L24.00005836875,60L24.00005796875,36.000001L44.78466796875,24.000000000000004Z" fill="#496FFE" fill-opacity="1" filter="url(#master_svg0_143_36004)"/><g clip-path="url(#master_svg1_143_36007)"><path d="M34.169981631875,44.43093495L43.148853271875,36.70824987C44.265293171875,35.80037498,45.805637171875,35.80037498,46.867416171875,36.70824987L55.794290171875005,44.43024925C56.165541171875,44.71509455,56.272196171874995,45.22674945,56.112884171874995,45.68034455C55.964262171875,46.11337375,55.561472171874996,46.40785775,55.103762171875005,46.41812375L34.914511871875,46.41812375C34.456565501875,46.40813475,34.053443121875,46.113611750000004,33.904727786875,45.680370350000004C33.711113065875,45.25040145,33.818446621275,44.74454685,34.169981631875,44.43024925L34.169981631875,44.43093495ZM50.745292171875,58.40140375L39.270291771875,58.40140375C38.554649371875,58.40620775,37.873565171875,58.094085750000005,37.409981271875,57.54887375C36.908443671875,57.007405750000004,36.624764471875,56.29965575,36.613481471875,55.561685749999995L36.613481471875,47.15793475C36.613481471875,46.41880975,36.878761971875,45.68103025,37.409981771875,45.17006015C37.889231671875,44.65906425,38.579761471875,44.31818965,39.270291771875,44.31818965L50.745292171875,44.31818965C52.233667171875,44.31818965,53.403446171875004,45.56693935,53.403446171875004,47.15724975L53.403446171875004,55.61905875C53.403446171875004,56.35615575,53.136822171875,57.09527975,52.606947171875,57.60625075C52.121288171875,58.11399275,51.449251171875005,58.40124275,50.746635171875,58.40140375L50.745292171875,58.40140375ZM42.511636771875004,49.99765575L47.505977171875,49.99765575L47.505977171875,46.02190495L42.511636771875004,46.02190495L42.511636771875004,49.99765575ZM38.739731771875,55.73175275L43.734072671875,55.73175275L43.734072671875,51.75668875L38.739072771875,51.75668875L38.739072771875,55.73243875L38.739731771875,55.73175275ZM46.231571171875004,55.73175275L51.224542171875,55.73175275L51.224542171875,51.75668875L46.229543171875,51.75668875L46.229543171875,55.73243875L46.230887171875,55.73243875L46.231571171875004,55.73175275Z" fill="#FFFFFF" fill-opacity="1" style="mix-blend-mode:passthrough"/></g></svg>
\ No newline at end of file
diff --git a/src/assets/system/chanpinweihu.svg b/src/assets/system/chanpinweihu.svg
new file mode 100644
index 0000000..eeb2bd4
--- /dev/null
+++ b/src/assets/system/chanpinweihu.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="59.5" height="64.90625" viewBox="0 0 59.5 64.90625"><defs><linearGradient x1="0" y1="0.16914062201976776" x2="0.8045321262753937" y2="1.0460527890370677" id="master_svg0_141_37616"><stop offset="48.549023270606995%" stop-color="#F7F7F7" stop-opacity="1"/><stop offset="100%" stop-color="#FFFFFF" stop-opacity="1"/></linearGradient><linearGradient x1="-0.03565644100308418" y1="0" x2="0.8226521556701855" y2="0.9991461352834076" id="master_svg1_141_37562"><stop offset="46.036821603775024%" stop-color="#F3F3F3" stop-opacity="1"/><stop offset="100%" stop-color="#FFFFFF" stop-opacity="1"/></linearGradient><clipPath id="master_svg2_143_35548"><rect x="12.5" y="0" width="34.000003814697266" height="34" rx="0"/></clipPath></defs><path d="M1.204819142818451,28.096379L28.69276814281845,44.307213000000004L58.29516614281845,28.096379L28.69276814281845,14L1.204819142818451,28.096379Z" fill="#FFFFFF" fill-opacity="1"/><path d="M0.16870074281845082,28.065809L28.43877614281845,44.737896L28.68361514281845,44.882288L59.39288714281845,28.065309L28.684561142818453,13.44229615L0.16870074281845082,28.065809ZM28.70192014281845,43.732138L2.240937742818451,28.12695L28.70097614281845,14.55770427L57.19744514281845,28.127449L28.70192014281845,43.732138Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/><path d="M0.5,28.80120277404785L0.5,47.83131777404785L28.692764,64.04215077404785L28.692764,45.01204077404785L0.5,28.80120277404785Z" fill="url(#master_svg0_141_37616)" fill-opacity="1"/><path d="M29.192764,64.90641177404785L29.192764,44.722777774047856L28.941999,44.578587774047854L-5.999999996841865e-8,27.93693918404785L0,48.12058077404785L29.192764,64.90641177404785ZM28.192764,45.30130377404785L28.192764,63.17788877404785L1,47.542054774047855L1,29.66546636404785L28.192764,45.30130377404785Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/><g transform="matrix(-1,0,0,1,118,0)"><path d="M59,28.80120277404785L59,47.12649377404785L88.5,64.00042177404785L88.5,44.26604677404785L59,28.80120277404785Z" fill="url(#master_svg1_141_37562)" fill-opacity="1"/><path d="M89,64.86243677404785L89,43.96362277404785L88.732151,43.82320777404785L58.50000003,27.97454732404785L58.50000003,47.41651177404785L89,64.86243677404785ZM88,44.568469774047855L88,63.13840677404785L59.5,46.836475774047855L59.5,29.627858224047852L88,44.568469774047855Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/></g><g clip-path="url(#master_svg2_143_35548)"><path d="M28.938397000000002,16.1305256C34.699799999999996,16.1305256,39.376799,14.6742373,39.376799,12.8673234L39.376799,10.2632031C39.376799,8.4562893,34.699799999999996,7,28.938399,7C23.1769919,7,18.5,8.4562893,18.5,10.2632031L18.5,12.8673234C18.50033210215,14.663614299999999,23.1666999,16.1305256,28.938397000000002,16.1305256ZM44.276911,18.339863C44.276911,18.339863,42.873419,19.757969,42.724998,19.899082C42.583887000000004,20.040194,42.093805,20.025255,42.093805,20.025255C42.093805,20.025255,40.809180999999995,19.884143,40.623573,19.698537C40.437962999999996,19.512926,40.311792,18.168866,40.311792,18.168866C40.311792,18.168866,40.274605,17.797656,40.460212999999996,17.612047L42.019760000000005,16.0528297C42.019760000000005,16.0528297,42.198063000000005,15.8522825,41.93808,15.8522825C41.113977,15.8522825,39.443195,15.8668947,38.633708999999996,16.6763859L38.470348,16.8397465C37.512438,17.804958,37.453001,19.25295,38.225306,20.292540000000002L33.487556,24.584711C33.108707,24.963554,32.611326,25.988201,33.487556,26.8568C34.363788,27.73303,35.388435,27.235645,35.759642,26.8568C35.759642,26.8568,40.04418,22.119374999999998,40.036541,22.127012L40.043846,22.119711000000002C41.083433,22.899317,42.524117000000004,22.839883,43.489328,21.874662999999998L43.652695,21.711306999999998C44.439938999999995,20.924397,44.462188999999995,19.268223,44.462188999999995,18.429181C44.477458999999996,18.169201,44.276911,18.339866,44.276911,18.339863ZM34.749937,26.381657C34.311662,26.381657,33.955388,26.025389,33.955388,25.587109C33.955388,25.148829,34.311662,24.792561,34.749937,24.792561C35.187893,24.792561,35.544493,25.148829,35.544493,25.587109C35.544493,26.025389,35.188225,26.381657,34.749937,26.381657ZM32.203593,23.791481C31.17629,23.897064,30.078592999999998,23.954185,28.93873,23.954185C23.1773219,23.954185,18.510955571,22.497892999999998,18.510955571,20.690977L18.510955571,24.602633C18.510955571,26.398924,23.1773219,27.865839,28.949353000000002,27.865839C29.741912,27.865839,30.513885000000002,27.838282,31.256308,27.78582C31.17955,27.72587,31.106586,27.661226,31.037833,27.592243C29.979317,26.542686,30.580291000000003,25.304878,31.037833,24.847677L32.203593,23.791481Z" fill="#496FFE" fill-opacity="1" style="mix-blend-mode:passthrough"/><path d="M28.938066,21.99160385C31.111878,21.99160385,33.131288,21.78408435,34.803736,21.42881015L36.760063,19.65642495C36.216522,18.92463065,36.013987,18.02515645,36.169043,17.171171649999998C34.29274,17.73429655,31.744064,18.079609650000002,28.9384,18.079609650000002C23.176991,18.079609650000002,18.5,16.62332105,18.5,14.81640625L18.5,18.72806505C18.5,20.524686850000002,23.1663661,21.99159955,28.938066,21.99160385Z" fill="#496FFE" fill-opacity="1" style="mix-blend-mode:passthrough"/></g></svg>
\ No newline at end of file
diff --git a/src/assets/system/chukuguanli.svg b/src/assets/system/chukuguanli.svg
new file mode 100644
index 0000000..6c8f0e9
--- /dev/null
+++ b/src/assets/system/chukuguanli.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="59.5" height="61.40625" viewBox="0 0 59.5 61.40625"><defs><linearGradient x1="0" y1="0.16914062201976776" x2="0.8045321262753937" y2="1.0460527890370677" id="master_svg0_141_37616"><stop offset="48.549023270606995%" stop-color="#F7F7F7" stop-opacity="1"/><stop offset="100%" stop-color="#FFFFFF" stop-opacity="1"/></linearGradient><linearGradient x1="-0.03565644100308418" y1="0" x2="0.8226521556701855" y2="0.9991461352834076" id="master_svg1_141_37562"><stop offset="46.036821603775024%" stop-color="#F3F3F3" stop-opacity="1"/><stop offset="100%" stop-color="#FFFFFF" stop-opacity="1"/></linearGradient><clipPath id="master_svg2_143_35869"><rect x="17" y="0" width="27" height="27" rx="0"/></clipPath></defs><path d="M1.204819142818451,24.596379L28.69276814281845,40.807213000000004L58.29516614281845,24.596379L28.69276814281845,10.5L1.204819142818451,24.596379Z" fill="#FFFFFF" fill-opacity="1"/><path d="M0.16870074281845082,24.565809L28.43877614281845,41.237896L28.68361514281845,41.382288L59.39288714281845,24.565309L28.684561142818453,9.94229615L0.16870074281845082,24.565809ZM28.70192014281845,40.232138L2.240937742818451,24.62695L28.70097614281845,11.05770427L57.19744514281845,24.627449L28.70192014281845,40.232138Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/><path d="M0.5,25.30120277404785L0.5,44.33131777404785L28.692764,60.542150774047855L28.692764,41.51204077404785L0.5,25.30120277404785Z" fill="url(#master_svg0_141_37616)" fill-opacity="1"/><path d="M29.192764,61.406411774047854L29.192764,41.222777774047856L28.941999,41.078587774047854L-5.999999996841865e-8,24.43693918404785L0,44.62058077404785L29.192764,61.406411774047854ZM28.192764,41.80130377404785L28.192764,59.67788877404785L1,44.042054774047855L1,26.16546636404785L28.192764,41.80130377404785Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/><g transform="matrix(-1,0,0,1,118,0)"><path d="M59,25.30120277404785L59,43.62649377404785L88.5,60.50042177404785L88.5,40.76604677404785L59,25.30120277404785Z" fill="url(#master_svg1_141_37562)" fill-opacity="1"/><path d="M89,61.36243677404785L89,40.46362277404785L88.732151,40.32320777404785L58.50000003,24.47454732404785L58.50000003,43.91651177404785L89,61.36243677404785ZM88,41.068469774047855L88,59.63840677404785L59.5,43.336475774047855L59.5,26.127858224047852L88,41.068469774047855Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/></g><g clip-path="url(#master_svg2_143_35869)"><path d="M28.74531903125,25.271427375C28.39732503125,25.271427375,28.17831903125,25.178430375,28.058323031249998,24.938408375C27.938325031250002,24.695407375,27.99530403125,23.342403375,27.99530403125,22.961397375L27.99530403125,16.871421375C27.99530403125,15.995425375,28.04933103125,15.815414375,28.95533503125,15.815414375L35.04831503125,15.815414375C37.12731503125,15.815414375,36.860321031249995,15.620430375,36.860321031249995,18.101423375L36.860321031249995,24.161420375C36.860321031249995,25.046407375,36.84832403125,25.271427375,35.91832703125,25.268419375L33.90832903125,25.268419375C33.50032403125,22.874410375,30.17331203125,22.874410375,29.76530603125,25.268419375C29.42633003125,25.268419375,29.08432103125,25.268419375,28.74531903125,25.271427375ZM38.03632503125,25.259428375C38.50434303125,23.054420375,41.04832603125,22.958418375,41.93331303125,24.536441375C42.08932903125,24.812425375,42.07432703125,24.992408375,42.18831203125,25.259428375C43.53232603125,25.415416375,43.35833203125,24.809417375,43.35833203125,23.711410375C43.35833203125,23.033430375,43.448324031249996,21.659410375,43.22032403125,21.119409375C42.98331103125,20.549430375,42.24231303125,19.649438375,41.837313031250005,19.109439375C41.738329031250004,18.977419375,41.633308031249996,18.824411375,41.54031203125,18.716411375C41.32731803125,18.470407375,41.177315031250004,18.197424375,40.68830903125,18.179416375L37.958332031249995,18.188406375C37.52933703125,18.248417375,37.44831103125,18.575422375,37.44831103125,19.031419375L37.44831103125,24.494434375C37.44831103125,24.926408375,37.589323031250004,25.259428375,38.03632503125,25.259428375L38.03632503125,25.259428375ZM42.359327031250004,21.722429375C41.498308031250005,21.731420375,40.046320031250005,21.746423375,39.221317031249995,21.719423375L39.221317031249995,19.364412375C39.60532903125,19.340421375,40.21731003125,19.337413375,40.59831803125,19.358427375C40.88632403125,19.373432375,41.07529803125,19.751432375,41.28831903125,20.048429375C41.53730603125,20.396423375,42.34730703125,21.407421375,42.359327031250004,21.722429375ZM33.16432603125,25.262409375C33.35630803125,26.084432375,32.77432803125,26.753416375,32.13832803125,26.894432375C31.31329903125,27.080427375,30.66532503125,26.516433375,30.512316031250002,25.877424375C30.30831203125,25.031431375,30.88730903125,24.401416375,31.532330031249998,24.236408375C32.35730503125,24.029426375,33.01432103125,24.629411375,33.16432603125,25.262409375ZM41.46231803125,25.427415375C41.53730803125,26.228426375,40.94931803125,26.855409375,40.23832703125,26.918424375C39.44032503125,26.993415375,38.81331203125,26.399412375,38.75332603125,25.676426375C38.68432403125,24.866426375,39.28133003125,24.281417375,40.00431803125,24.209406375C40.77231603125,24.134418375,41.39632203125,24.737409375,41.46231803125,25.427415375ZM17.46533203125,6.377412775L17.46533203125,26.912439375L22.15431403125,26.912439375L22.15431403125,10.127406375L38.62431103125,10.127406375L38.62431103125,13.475406375L43.313322031249996,13.475406375L43.313322031249996,6.437397475C43.313322031249996,6.185406175,42.82431403125,6.050406475,42.62632403125,5.960415375L41.40832103125,5.384397475C41.23732903125,5.309382875,41.153320031250004,5.246392275,40.98233003125,5.171403375C40.667322031249995,5.030391675,40.46331803125,4.928403875,40.14833603125,4.790397675C38.65732603125,4.127394675,36.75232103125,3.122409775,35.270327031250005,2.486407075L30.752310031249998,0.347395155C29.94832203125,-0.042601921,30.131310031250003,-0.04560776800000001,29.51632203125,0.230403925L25.47230913125,2.273412675C25.19932893125,2.411418875,24.938320131250002,2.519418475,24.650311931250002,2.669421475L18.20933491125,5.903409975C18.03531152125,5.993427275,17.465332081541415,6.149415475,17.46533203125,6.377412775ZM23.54033093125,19.565410375L26.42632583125,19.565410375L26.42632583125,22.061432375L23.54033093125,22.061432375L23.54033093125,19.565410375ZM23.54033093125,16.235420375L26.42632583125,16.235420375L26.42632583125,18.677415375L23.54033093125,18.677415375L23.54033093125,16.235420375L23.54033093125,16.235420375Z" fill="#496FFE" fill-opacity="1" style="mix-blend-mode:passthrough"/></g></svg>
\ No newline at end of file
diff --git a/src/assets/system/fahuotaizhang.svg b/src/assets/system/fahuotaizhang.svg
new file mode 100644
index 0000000..67e1b3f
--- /dev/null
+++ b/src/assets/system/fahuotaizhang.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="59.5" height="62.90625" viewBox="0 0 59.5 62.90625"><defs><linearGradient x1="0" y1="0.16914062201976776" x2="0.8045321262753937" y2="1.0460527890370677" id="master_svg0_141_37616"><stop offset="48.549023270606995%" stop-color="#F7F7F7" stop-opacity="1"/><stop offset="100%" stop-color="#FFFFFF" stop-opacity="1"/></linearGradient><linearGradient x1="-0.03565644100308418" y1="0" x2="0.8226521556701855" y2="0.9991461352834076" id="master_svg1_141_37562"><stop offset="46.036821603775024%" stop-color="#F3F3F3" stop-opacity="1"/><stop offset="100%" stop-color="#FFFFFF" stop-opacity="1"/></linearGradient><clipPath id="master_svg2_143_35626"><rect x="15" y="0" width="29" height="29" rx="0"/></clipPath></defs><path d="M1.204819142818451,26.096379L28.69276814281845,42.307213000000004L58.29516614281845,26.096379L28.69276814281845,12L1.204819142818451,26.096379Z" fill="#FFFFFF" fill-opacity="1"/><path d="M0.16870074281845082,26.065809L28.43877614281845,42.737896L28.68361514281845,42.882288L59.39288714281845,26.065309L28.684561142818453,11.44229615L0.16870074281845082,26.065809ZM28.70192014281845,41.732138L2.240937742818451,26.12695L28.70097614281845,12.55770427L57.19744514281845,26.127449L28.70192014281845,41.732138Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/><path d="M0.5,26.80120277404785L0.5,45.83131777404785L28.692764,62.042150774047855L28.692764,43.01204077404785L0.5,26.80120277404785Z" fill="url(#master_svg0_141_37616)" fill-opacity="1"/><path d="M29.192764,62.906411774047854L29.192764,42.722777774047856L28.941999,42.578587774047854L-5.999999996841865e-8,25.93693918404785L0,46.12058077404785L29.192764,62.906411774047854ZM28.192764,43.30130377404785L28.192764,61.17788877404785L1,45.542054774047855L1,27.66546636404785L28.192764,43.30130377404785Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/><g transform="matrix(-1,0,0,1,118,0)"><path d="M59,26.80120277404785L59,45.12649377404785L88.5,62.00042177404785L88.5,42.26604677404785L59,26.80120277404785Z" fill="url(#master_svg1_141_37562)" fill-opacity="1"/><path d="M89,62.86243677404785L89,41.96362277404785L88.732151,41.82320777404785L58.50000003,25.97454732404785L58.50000003,45.41651177404785L89,62.86243677404785ZM88,42.568469774047855L88,61.13840677404785L59.5,44.836475774047855L59.5,27.627858224047852L88,42.568469774047855Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/></g><g clip-path="url(#master_svg2_143_35626)"><path d="M21.7729373375,2.85937521606684C24.1931619375,2.85937521606684,26.1551654375,4.8214065999999995,26.1551654375,7.2416601C26.1551654375,9.661829000000001,24.1932191375,11.6238594,21.772936837499998,11.6238594C19.3526830375,11.6238594,17.3906514375,9.661829000000001,17.3906514375,7.2416601C17.3906514375,4.8214065999999995,19.3526828375,2.859375,21.7729373375,2.85937521606684ZM23.9577636375,6.8265414L23.9577636375,5.148194800000001L21.1443958375,7.656723L19.5880813375,6.2642415L19.5880813375,7.9425879L21.1443958375,9.3350978L23.9577636375,6.8265414ZM41.402877437499995,17.636632C41.2427544375,17.645353,41.056009437499995,17.649941,40.8424184375,17.649941L35.9334904375,17.649941C35.8089674375,17.649941,35.684467437500004,17.587636,35.5599444375,17.463169999999998C35.4354194375,17.338504,35.3731444375,17.231906000000002,35.3731444375,17.142895L35.3731444375,17.116274C35.3555274375,16.244659,35.346351437500005,15.453276,35.346351437500005,14.741616L35.346351437500005,12.3138857C35.346351437500005,12.1182203,35.426643437500005,11.9358091,35.5866224375,11.7669363C35.7466604375,11.5979471,35.942268437500005,11.5136681,36.1735594375,11.5136681C36.1913474375,11.5136681,36.3247334375,11.504632,36.5738674375,11.4868193C36.8228604375,11.4689779,37.1295984375,11.4822874,37.4943634375,11.5267506C37.8590144375,11.5711298,38.245813437500004,11.6691179,38.654903437499996,11.8202353C39.0638734375,11.9714098,39.4463124375,12.216011,39.802125437499996,12.5540142C40.3535234375,13.123253,40.744798437499995,13.812456,40.9760074375,14.62168C41.2072714375,15.430904,41.4208314375,16.271338,41.6162684375,17.142867000000003C41.6162684375,17.178466999999998,41.620914437500005,17.205171999999997,41.6296654375,17.223014C41.6385594375,17.240686,41.6428904375,17.267477,41.6428904375,17.303047C41.6429194375,17.516666999999998,41.5630284375,17.627825,41.4029064375,17.636662L41.402877437499995,17.636632ZM43.497190437499995,17.956765C43.363775437499996,16.951846,43.1280674375,15.924557,42.7901764375,14.875204C42.4520304375,13.825795,41.9452974375,12.8384638,41.2692894375,11.9139185C40.8958854375,11.3980083,40.4334694375,10.9533787,39.881877437499995,10.5799184C39.3335594375,10.207787,38.7423764375,9.9031267,38.1211204375,9.672535400000001C37.4985274375,9.4413004,36.867096437499995,9.2769294,36.226747437499995,9.1791105C35.5864524375,9.0812922,34.9727214375,9.0591178,34.3857844375,9.1124163C34.1902884375,9.1300879,34.0256614375,9.2681208,33.8922464375,9.5259213C33.7588554375,9.783721,33.6922204375,10.0105953,33.6922204375,10.2061749L33.6922204375,23.066061C33.6922204375,23.386337,33.8077664375,23.661949,34.0390304375,23.893127C34.2703224375,24.124277,34.5457364375,24.239882,34.8660414375,24.239882L35.346351437500005,24.239882C35.346351437500005,23.795309,35.4308054375,23.372713,35.5998214375,22.972548C35.7688924375,22.572323,36.0000154375,22.221321,36.2935274375,21.918835C36.5870934375,21.616402,36.9293154375,21.376131,37.320705437499996,21.198366C37.7119484375,21.020514,38.1387654375,20.931503,38.6011794375,20.931503C39.0637624375,20.931503,39.503860437499995,20.993809,39.9219534375,21.118334C40.3399624375,21.242828,40.7047254375,21.438437,41.015682437500004,21.705215C41.3270644375,21.972076,41.576114437499996,22.318859,41.762888437499996,22.74576C41.949518437500004,23.172689,42.042860437499996,23.688599,42.042860437499996,24.29324L43.136875437499995,24.29324C43.243528437500004,24.29324,43.3281514375,24.239828,43.3904534375,24.13323C43.4524744375,24.026405,43.5060004375,23.897461,43.5502914375,23.746147C43.5943754375,23.597946,43.625642437500005,23.446234,43.6437514375,23.292681C43.661592437500005,23.141449,43.670429437500005,23.012423,43.670429437500005,22.905769C43.670429437500005,22.354401,43.6749284375,21.642796,43.6837384375,20.771267C43.6928004375,19.900023,43.6303824375,18.961798,43.496967437500004,17.956794000000002L43.497190437499995,17.956794000000002L43.497190437499995,17.956765ZM38.734764437500004,22.612343C39.197120437500004,22.612343,39.5974274375,22.7813,39.935373437500004,23.11936C40.273376437500005,23.457363,40.4423064375,23.857302,40.4423064375,24.319971C40.4423064375,24.800087,40.2733214375,25.2092,39.935373437500004,25.547007C39.5974274375,25.885094,39.1972884375,26.054052,38.734764437500004,26.054052C38.254676437499995,26.054052,37.8498684375,25.885094,37.5207824375,25.547007C37.1917614375,25.209059,37.0272444375,24.800114,37.0272444375,24.319971C37.0272444375,23.857357,37.1917874375,23.457333,37.5207824375,23.11936C37.8498654375,22.7813,38.2544764375,22.61237,38.734764437500004,22.61237L38.734764437500004,22.612343ZM20.3789520375,22.585806C19.8986959375,22.585806,19.4939141375,22.754765,19.1649737375,23.092569C18.835835437500002,23.430544,18.6714358375,23.839544,18.6714358375,24.320026C18.6714358375,24.782158,18.8358349375,25.182467,19.1649737375,25.520525C19.4939708375,25.858528,19.8986964375,26.027487,20.3789520375,26.027487C20.8592076375,26.027487,21.263820137499998,25.858501,21.5929026375,25.520554C21.9220414375,25.182493,22.0863556375,24.782356,22.0863556375,24.320026C22.0863556375,23.839769,21.9218993375,23.430487,21.5929026375,23.092569C21.2638206375,22.754765,20.8591795375,22.585806,20.3789520375,22.585806ZM27.1951694375,5.8573070000000005C27.3276244375,6.328613799999999,27.3944584375,6.8189235,27.3944584375,7.3281794C27.3944584375,8.1049209,27.2467114375,8.8312807,26.9510474375,9.506775900000001C26.6555254375,10.182272399999999,26.2544524375,10.773316900000001,25.7479444375,11.279911C25.2412948375,11.7864199,24.6504764375,12.1834698,23.9748087375,12.470439C23.2992000375,12.7574387,22.5816755375,12.900966,21.8216157375,12.900966C21.044789837499998,12.900966,20.318656937500002,12.7574387,19.6431894375,12.470439C18.9676652375,12.1834126,18.3767049375,11.7864199,17.8700547375,11.279911C17.3634042375,10.773316900000001,16.9623885375,10.182272399999999,16.6669227375,9.506775900000001C16.3713153575,8.8312807,16.2235116975,8.105062499999999,16.2235116975,7.3281794C16.2235116975,7.2433033,16.2257206475,7.1590791,16.2292040575,7.075222C15.9749726075,7.3872271,15.7748329975,7.7281752,15.6298046675,8.098464C15.4696249815,8.507465400000001,15.3896484375,8.9255304,15.3896484375,9.3524303L15.3896484375,23.226042C15.3896484375,23.564045,15.4874668125,23.821957,15.6831034975,23.999754C15.8789101275,24.177435,16.1278457075,24.266588,16.4301931375,24.266588L17.0438944375,24.266588C17.0438944375,23.128279,17.3330446375,22.278898,17.9110057375,21.718695C18.4888818375,21.158379,19.3205645375,20.87809,20.405487037500002,20.87809C21.5439634375,20.87809,22.3800354375,21.180494,22.9134769375,21.785387C23.4470596375,22.390112,23.7139778375,23.217234,23.7139778375,24.266588L30.9974874375,24.266588C31.282276437500002,24.266588,31.5265384375,24.16877,31.7312084375,23.973017C31.9357104375,23.777466,32.038061437500005,23.52853,32.038061437500005,23.226097L31.9846784375,5.8573070000000005L27.1951694375,5.8573070000000005Z" fill="#496FFE" fill-opacity="1" style="mix-blend-mode:passthrough"/></g></svg>
\ No newline at end of file
diff --git a/src/assets/system/gongxu.svg b/src/assets/system/gongxu.svg
new file mode 100644
index 0000000..8d313c1
--- /dev/null
+++ b/src/assets/system/gongxu.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="59.5" height="61.90625" viewBox="0 0 59.5 61.90625"><defs><linearGradient x1="0" y1="0.16914062201976776" x2="0.8045321262753937" y2="1.0460527890370677" id="master_svg0_141_37616"><stop offset="48.549023270606995%" stop-color="#F7F7F7" stop-opacity="1"/><stop offset="100%" stop-color="#FFFFFF" stop-opacity="1"/></linearGradient><linearGradient x1="-0.03565644100308418" y1="0" x2="0.8226521556701855" y2="0.9991461352834076" id="master_svg1_141_37562"><stop offset="46.036821603775024%" stop-color="#F3F3F3" stop-opacity="1"/><stop offset="100%" stop-color="#FFFFFF" stop-opacity="1"/></linearGradient><clipPath id="master_svg2_143_35769"><rect x="15.5" y="0" width="28" height="28" rx="0"/></clipPath></defs><path d="M1.204819142818451,25.096379L28.69276814281845,41.307213000000004L58.29516614281845,25.096379L28.69276814281845,11L1.204819142818451,25.096379Z" fill="#FFFFFF" fill-opacity="1"/><path d="M0.16870074281845082,25.065809L28.43877614281845,41.737896L28.68361514281845,41.882288L59.39288714281845,25.065309L28.684561142818453,10.44229615L0.16870074281845082,25.065809ZM28.70192014281845,40.732138L2.240937742818451,25.12695L28.70097614281845,11.55770427L57.19744514281845,25.127449L28.70192014281845,40.732138Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/><path d="M0.5,25.80120277404785L0.5,44.83131777404785L28.692764,61.042150774047855L28.692764,42.01204077404785L0.5,25.80120277404785Z" fill="url(#master_svg0_141_37616)" fill-opacity="1"/><path d="M29.192764,61.906411774047854L29.192764,41.722777774047856L28.941999,41.578587774047854L-5.999999996841865e-8,24.93693918404785L0,45.12058077404785L29.192764,61.906411774047854ZM28.192764,42.30130377404785L28.192764,60.17788877404785L1,44.542054774047855L1,26.66546636404785L28.192764,42.30130377404785Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/><g transform="matrix(-1,0,0,1,118,0)"><path d="M59,25.80120277404785L59,44.12649377404785L88.5,61.00042177404785L88.5,41.26604677404785L59,25.80120277404785Z" fill="url(#master_svg1_141_37562)" fill-opacity="1"/><path d="M89,61.86243677404785L89,40.96362277404785L88.732151,40.82320777404785L58.50000003,24.97454732404785L58.50000003,44.41651177404785L89,61.86243677404785ZM88,41.568469774047855L88,60.13840677404785L59.5,43.836475774047855L59.5,26.627858224047852L88,41.568469774047855Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/></g><g clip-path="url(#master_svg2_143_35769)"><path d="M31.250000999999997,28.000002L18.6675,28.000002C17.88696605,28.000973,17.2528940293,27.370031,17.25,26.589502L17.25,5.7189999C17.253842816,4.9388809,17.88735223,4.3084998,18.6675,4.3084998L20.7045,4.3084998L20.7045,10.0485L35.901500999999996,10.0485L35.901500999999996,4.3084998L37.938501,4.3084998C38.720751,4.3084998,39.356003,4.9419994,39.356003,5.7189994L39.356003,12.726C35.280792000000005,11.314371,30.784750000000003,13.082648,28.763004000000002,16.892187C26.7412615,20.701725,27.79683,25.416275,31.250000999999997,28.000002ZM34.519001,8.6047497L22.0852499,8.6047497L22.0852499,3.9567502C22.0852499,2.9697499,22.7835007,2.1682501,23.6410003,2.1682501L25.24575,2.1682501C25.8197508,0.85225004,26.9975014,0,28.303,0C29.606749999999998,0,30.784501,0.85225004,31.3585,2.1682501L32.965001,2.1682501C33.822500000000005,2.1682501,34.519001,2.9697502,34.519001,3.9567502L34.519001,8.6047497ZM20.7045,15.058749C20.7045,15.44375,21.0195003,15.77625,21.4045005,15.77625L27.60125,15.77625C27.997515999999997,15.77625,28.318751,15.455014,28.318751,15.058749C28.318751,14.662486,27.997515999999997,14.34125,27.60125,14.34125L21.40625,14.34125C21.016150500000002,14.349814,20.7044065,14.668555,20.7045,15.058749ZM20.7045,20.79525C20.7045,21.18025,21.023,21.512751,21.416750399999998,21.512751L26.21,21.512751C26.602631600000002,21.50613,26.9185143,21.187918,26.9222498,20.79525C26.9222498,20.41025,26.6037502,20.077749,26.21,20.077749L21.4150004,20.077749C21.0223703,20.084372,20.7064886,20.402582,20.7027502,20.79525L20.7045,20.79525ZM25.1932502,6.454C25.7770567,6.4434648,26.241730699999998,5.9615531,26.231000899999998,5.3777499C26.2407513,4.7946243,25.7763624,4.3137889,25.1932502,4.3032494C24.610827,4.3147411,24.1474919,4.7952948,24.1572504,5.3777499C24.1572504,5.9727497,24.6209998,6.454,25.1932502,6.454ZM31.411,6.454C31.994120000000002,6.442512,32.457737,5.9608827,32.447001,5.3777499C32.456759,4.7952943,31.993423999999997,4.3147411,31.411,4.3032494C30.828578,4.3147411,30.365243,4.7952948,30.375000999999997,5.3777499C30.375000999999997,5.9727497,30.838752,6.454,31.411,6.454ZM36.500001999999995,28.000002C32.634008,28.000002,29.500000999999997,24.865995,29.500000999999997,21.000002C29.500000999999997,17.134008,32.634008,14.000001,36.500001999999995,14.000001C40.365995,14.000001,43.500001999999995,17.134008,43.500001999999995,21.000002C43.500001999999995,24.865995,40.365995,28.000002,36.500001999999995,28.000002ZM40.73675,18.669003L40.73675,15.795501L36.8675,15.795501L36.8675,16.747499L35.17,16.747499L35.17,24.4055L36.858749,24.4055L36.858749,25.845751L40.721001,25.845751L40.721001,22.902248L36.858749,22.902248L36.858749,23.44475L36.0275,23.44475L36.0275,17.678499L36.867498,17.678499L36.867498,18.669001L40.738501,18.669001L40.73675,18.669003ZM34.720248999999995,20.02C34.421001000000004,19.460003,34.424501,19.451252,34.424501,19.451252C34.424501,19.451252,33.392002000000005,19.775002,33.199501,18.667252L32.601001,18.667252C32.601001,18.667252,32.436502000000004,19.776752,31.381251,19.447752L31.066252,20.035753C31.066252,20.035753,31.892252,20.683254,31.066252,21.558254L31.386499999999998,22.149754C31.386499999999998,22.149754,32.298251,21.708754,32.597502,22.912754L33.203001,22.912754C33.203001,22.912754,33.392002000000005,21.806753,34.417501,22.134005C34.709751,21.574005,34.715002,21.570503,34.715002,21.570503C34.715002,21.570503,33.939752999999996,20.821505,34.720248999999995,20.02Z" fill="#496FFE" fill-opacity="1" style="mix-blend-mode:passthrough"/></g></svg>
\ No newline at end of file
diff --git a/src/assets/system/gongyingshangdangan.svg b/src/assets/system/gongyingshangdangan.svg
new file mode 100644
index 0000000..39e4859
--- /dev/null
+++ b/src/assets/system/gongyingshangdangan.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="59.5" height="62.90625" viewBox="0 0 59.5 62.90625"><defs><linearGradient x1="0" y1="0.16914062201976776" x2="0.8045321262753937" y2="1.0460527890370677" id="master_svg0_141_37616"><stop offset="48.549023270606995%" stop-color="#F7F7F7" stop-opacity="1"/><stop offset="100%" stop-color="#FFFFFF" stop-opacity="1"/></linearGradient><linearGradient x1="-0.03565644100308418" y1="0" x2="0.8226521556701855" y2="0.9991461352834076" id="master_svg1_141_37562"><stop offset="46.036821603775024%" stop-color="#F3F3F3" stop-opacity="1"/><stop offset="100%" stop-color="#FFFFFF" stop-opacity="1"/></linearGradient><clipPath id="master_svg2_143_35686"><rect x="13.5" y="0" width="32" height="32" rx="0"/></clipPath></defs><path d="M1.204819142818451,26.096379L28.69276814281845,42.307213000000004L58.29516614281845,26.096379L28.69276814281845,12L1.204819142818451,26.096379Z" fill="#FFFFFF" fill-opacity="1"/><path d="M0.16870074281845082,26.065809L28.43877614281845,42.737896L28.68361514281845,42.882288L59.39288714281845,26.065309L28.684561142818453,11.44229615L0.16870074281845082,26.065809ZM28.70192014281845,41.732138L2.240937742818451,26.12695L28.70097614281845,12.55770427L57.19744514281845,26.127449L28.70192014281845,41.732138Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/><path d="M0.5,26.80120277404785L0.5,45.83131777404785L28.692764,62.042150774047855L28.692764,43.01204077404785L0.5,26.80120277404785Z" fill="url(#master_svg0_141_37616)" fill-opacity="1"/><path d="M29.192764,62.906411774047854L29.192764,42.722777774047856L28.941999,42.578587774047854L-5.999999996841865e-8,25.93693918404785L0,46.12058077404785L29.192764,62.906411774047854ZM28.192764,43.30130377404785L28.192764,61.17788877404785L1,45.542054774047855L1,27.66546636404785L28.192764,43.30130377404785Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/><g transform="matrix(-1,0,0,1,118,0)"><path d="M59,26.80120277404785L59,45.12649377404785L88.5,62.00042177404785L88.5,42.26604677404785L59,26.80120277404785Z" fill="url(#master_svg1_141_37562)" fill-opacity="1"/><path d="M89,62.86243677404785L89,41.96362277404785L88.732151,41.82320777404785L58.50000003,25.97454732404785L58.50000003,45.41651177404785L89,62.86243677404785ZM88,42.568469774047855L88,61.13840677404785L59.5,44.836475774047855L59.5,27.627858224047852L88,42.568469774047855Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/></g><g clip-path="url(#master_svg2_143_35686)"><path d="M25.178437199999998,6.013828425L25.162812199999998,6.013828425C25.055625900000003,5.080703315,24.4187503,4.361328125,23.6415634,4.361328125L18.1996875,4.361328125C17.42218757,4.361328125,16.78562498,5.081015645,16.678437473,6.013828425L16.65625,6.013828425L16.65625,12.286016925L16.6628124719,12.286016925L16.6628124719,14.008203525C16.66187501,14.038516025,16.65625,14.066953625,16.65625,14.097578025L16.65625,25.993517125L16.678437473,25.993517125C16.78562498,26.926641125,17.42218739,27.646017125,18.1996875,27.646332125L23.6415634,27.646332125C24.4190626,27.646332125,25.055625900000003,26.926641125,25.162812199999998,25.993517125L25.178437199999998,25.993517125L25.178437199999998,25.849769125L25.1849995,25.849769125L25.1849995,12.170390625L25.178437199999998,12.170390625L25.178437199999998,10.595078025C25.1793747,10.566952725,25.1849995,10.540703324999999,25.1849995,10.512577024999999L25.1849995,6.287265825C25.1849995,6.259141125,25.1790628,6.232890725,25.178437199999998,6.204765825L25.178437199999998,6.013828425ZM33.707815,6.013828425L33.692503,6.013828425C33.585001,5.080703315,32.948439,4.361328125,32.170938,4.361328125L26.729062,4.361328125C25.951875700000002,4.361328125,25.3149996,5.081015645,25.207813299999998,6.013828425L25.185626,6.013828425L25.185626,12.286016925L25.192188299999998,12.286016925L25.192188299999998,14.008203525C25.1912498,14.038516025,25.185626,14.066953625,25.185626,14.097578025L25.185626,25.993517125L25.207813299999998,25.993517125C25.3149996,26.926641125,25.951875700000002,27.646017125,26.729062,27.646332125L32.170937,27.646332125C32.948437,27.646332125,33.584998999999996,26.926641125,33.692501,25.993517125L33.707813,25.993517125L33.707813,25.849769125L33.714376,25.849769125L33.714376,12.170390625L33.707813,12.170390625L33.707813,10.595078025C33.708752000000004,10.566952725,33.714376,10.540703324999999,33.714376,10.512577024999999L33.714376,6.287265825C33.714376,6.259141125,33.708752000000004,6.232890725,33.707813,6.204765825L33.707815,6.013828425ZM27.336877,7.185703525L31.563439000000002,7.185703525L31.563439000000002,17.928203125L27.336876,17.928203125L27.336877,7.185703525ZM30.604689999999998,24.859453125C29.890158,25.271952125,29.009847,25.271952125,28.295313999999998,24.859453125C27.580841,24.446863125,27.140695,23.684502125,27.140627000000002,22.859453125C27.140627000000002,22.034452125,27.580939,21.271953125,28.295313999999998,20.859453125C29.009847,20.446957125,29.890158,20.446957125,30.604689999999998,20.859453125C31.319263,21.271946125,31.759445,22.034368125,31.759377,22.859453125C31.759377,23.684454125,31.319376,24.446953125,30.604689999999998,24.859453125Z" fill="#496FFE" fill-opacity="1" style="mix-blend-mode:passthrough"/><path d="M29.988359475,21.926954125C29.655124775,21.734768125,29.244719565,21.734768125,28.911484715,21.926954125C28.578357715,22.119329125,28.373121261604,22.474771125,28.373046875,22.859453125C28.373046875,23.454141125,28.854922355,23.936329125,29.449609775,23.936329125C30.044298175,23.936329125,30.526485475,23.454141125,30.526485475,22.859453125C30.526752475,22.474760125,30.321571475,22.119207125,29.988359475,21.926954125ZM42.343673875,10.512578525L42.343673875,6.287265825C42.343673875,6.259141125,42.338047875,6.232890725,42.337108875,6.204765825L42.337108875,6.013828425L42.321483875,6.013828425C42.214296875,5.080703315,41.577421875,4.361328125,40.800234875,4.361328125L35.358357875,4.361328125C34.580858675,4.361328125,33.944295875,5.081015645,33.836795775,6.013828425L33.814920875,6.013828425L33.814920875,12.286016925L33.821484075,12.286016925L33.821484075,14.008203525C33.820545175,14.038516025,33.814920875,14.066953625,33.814920875,14.097578025L33.814920875,25.993517125L33.836795775,25.993517125C33.944295875,26.926641125,34.580858675,27.646017125,35.358045575,27.646332125L40.799920875,27.646332125C41.577108875,27.646332125,42.213984875,26.926641125,42.321170875,25.993517125L42.336795875,25.993517125L42.336795875,25.849769125L42.343668875,25.849769125L42.343668875,12.170390625L42.337107875,12.170390625L42.337107875,10.595078025C42.338045875,10.566952725,42.343668875,10.541015125000001,42.343673875,10.512578525ZM35.965858475,7.185703525L40.192420874999996,7.185703525L40.192420874999996,17.928203125L35.965858475,17.928203125L35.965858475,7.185703525ZM39.233984875000004,24.859453125C38.519452875,25.271953125,37.639140175,25.271953125,36.924609175,24.859453125C36.210134475000004,24.446863125,35.769990875,23.684502125,35.769920875,22.859453125C35.769920875,22.034452125,36.210234675,21.271953125,36.924609175,20.859453125C37.639140175,20.446957125,38.519452875,20.446957125,39.233984875000004,20.859453125C39.948458875,21.272045125,40.388600875,22.034408125,40.388672875,22.859453125C40.388672875,23.684454125,39.948671875,24.446953125,39.233984875000004,24.859453125Z" fill="#496FFE" fill-opacity="1" style="mix-blend-mode:passthrough"/><path d="M38.6179295875,21.92148398C38.2848072875,21.729297638,37.8744889475,21.729297638,37.5413666975,21.92148398C37.2082405375,22.11385918,37.003004074111,22.46930122,37.0029296875,22.85398475C37.0029296875,23.23867225,37.2082424475,23.59398465,37.5413666975,23.78648545C38.0563736875,24.08376885,38.7148630875,23.90727045,39.0121481875,23.39226535C39.3094334875,22.87726005,39.1329366875,22.21876907,38.6179295875,21.92148398Z" fill="#496FFE" fill-opacity="1" style="mix-blend-mode:passthrough"/></g></svg>
\ No newline at end of file
diff --git a/src/assets/system/gongyingshangwanglai.svg b/src/assets/system/gongyingshangwanglai.svg
new file mode 100644
index 0000000..69de69e
--- /dev/null
+++ b/src/assets/system/gongyingshangwanglai.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="59.5" height="62.90625" viewBox="0 0 59.5 62.90625"><defs><linearGradient x1="0" y1="0.16914062201976776" x2="0.8045321262753937" y2="1.0460527890370677" id="master_svg0_141_37616"><stop offset="48.549023270606995%" stop-color="#F7F7F7" stop-opacity="1"/><stop offset="100%" stop-color="#FFFFFF" stop-opacity="1"/></linearGradient><linearGradient x1="-0.03565644100308418" y1="0" x2="0.8226521556701855" y2="0.9991461352834076" id="master_svg1_141_37562"><stop offset="46.036821603775024%" stop-color="#F3F3F3" stop-opacity="1"/><stop offset="100%" stop-color="#FFFFFF" stop-opacity="1"/></linearGradient><clipPath id="master_svg2_143_35715"><rect x="16" y="0" width="30" height="30" rx="0"/></clipPath></defs><path d="M1.204819142818451,26.096379L28.69276814281845,42.307213000000004L58.29516614281845,26.096379L28.69276814281845,12L1.204819142818451,26.096379Z" fill="#FFFFFF" fill-opacity="1"/><path d="M0.16870074281845082,26.065809L28.43877614281845,42.737896L28.68361514281845,42.882288L59.39288714281845,26.065309L28.684561142818453,11.44229615L0.16870074281845082,26.065809ZM28.70192014281845,41.732138L2.240937742818451,26.12695L28.70097614281845,12.55770427L57.19744514281845,26.127449L28.70192014281845,41.732138Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/><path d="M0.5,26.80120277404785L0.5,45.83131777404785L28.692764,62.042150774047855L28.692764,43.01204077404785L0.5,26.80120277404785Z" fill="url(#master_svg0_141_37616)" fill-opacity="1"/><path d="M29.192764,62.906411774047854L29.192764,42.722777774047856L28.941999,42.578587774047854L-5.999999996841865e-8,25.93693918404785L0,46.12058077404785L29.192764,62.906411774047854ZM28.192764,43.30130377404785L28.192764,61.17788877404785L1,45.542054774047855L1,27.66546636404785L28.192764,43.30130377404785Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/><g transform="matrix(-1,0,0,1,118,0)"><path d="M59,26.80120277404785L59,45.12649377404785L88.5,62.00042177404785L88.5,42.26604677404785L59,26.80120277404785Z" fill="url(#master_svg1_141_37562)" fill-opacity="1"/><path d="M89,62.86243677404785L89,41.96362277404785L88.732151,41.82320777404785L58.50000003,25.97454732404785L58.50000003,45.41651177404785L89,62.86243677404785ZM88,42.568469774047855L88,61.13840677404785L59.5,44.836475774047855L59.5,27.627858224047852L88,42.568469774047855Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/></g><g clip-path="url(#master_svg2_143_35715)"><path d="M41.17005759375,2.549529299C38.500059593749995,2.549529299,36.340057593750004,3.98952925,36.340057593750004,5.75952935C36.340057593750004,6.95952895,37.30005659375,7.97952935,38.74005659375,8.549529549999999C38.68005559375,8.93952985,38.53005559375,9.35952945,38.290056593749995,9.80952885C38.290056593749995,9.80952885,39.64005659375,9.689528450000001,40.33005759375,8.939528450000001C40.60005759375,8.96952815,40.870057593750005,8.99952885,41.17005759375,8.99952885C43.84005559375,8.99952885,46.000059593749995,7.55952835,46.000059593749995,5.78952885C46.000059593749995,3.98952875,43.84005559375,2.549528852,41.17005759375,2.549529299ZM39.22005659375,6.20952915C38.83005759375,6.20952915,38.53005759375,5.90952925,38.53005759375,5.51952915C38.53005759375,5.12952945,38.83005759375,4.82952905,39.22005659375,4.82952905C39.61005759375,4.82952905,39.91005659375,5.12952945,39.91005659375,5.51952915C39.91005659375,5.87952925,39.58005759375,6.20952915,39.22005659375,6.20952915ZM41.290058593750004,6.20952915C40.90005659375,6.20952915,40.60005759375,5.90952925,40.60005759375,5.51952915C40.60005759375,5.12952945,40.90005659375,4.82952905,41.290058593750004,4.82952905C41.68005759375,4.82952905,41.98005659375,5.12952945,41.98005659375,5.51952915C41.98005659375,5.87952925,41.65005859375,6.20952915,41.290058593750004,6.20952915ZM43.36005759375,6.20952915C42.97005659375,6.20952915,42.67005759375,5.90952925,42.67005759375,5.51952915C42.67005759375,5.12952945,42.97005659375,4.82952905,43.36005759375,4.82952905C43.75005759375,4.82952905,44.050058593749995,5.12952945,44.050058593749995,5.51952915C44.050058593749995,5.87952925,43.72005859375,6.20952915,43.36005759375,6.20952915ZM25.66005799375,19.67952925C26.14005859375,19.52953125,26.620058593750002,19.28953025,27.04005859375,19.04953025C27.22005859375,18.92952925,27.34005859375,18.83952725,27.40005859375,18.71953025C27.46005859375,18.62952825,27.490057593750002,18.47952925,27.52005859375,18.29953025C27.49005859375,18.149530249999998,27.46005859375,17.99953125,27.46005859375,17.90952925C27.46005859375,17.819529250000002,27.430058593749997,17.72953025,27.40005859375,17.66952925C27.370058593750002,17.60953025,27.31005859375,17.54952925,27.250058593749998,17.48952925C27.190058593750003,17.42953025,27.10005859375,17.33953025,26.98005859375,17.24953025C26.86005759375,17.15952825,26.74005859375,17.009528250000002,26.65005759375,16.79952925C26.560057593750003,16.58952925,26.47005759375,16.379530250000002,26.41005859375,16.199529249999998C26.35005859375,15.95953025,26.29005859375,15.71953125,26.20005859375,15.44953025C26.11005859375,15.41953225,25.99005889375,15.35953025,25.90005879375,15.23953025C25.810059593749997,15.14952925,25.72005839375,15.02952825,25.63005919375,14.87952925C25.54005909375,14.72952925,25.45005799375,14.51953025,25.36005879375,14.24953125C25.27005859375,13.97953025,25.24005799375,13.73952925,25.27005859375,13.52953025C25.30005929375,13.31952925,25.330059093750002,13.10953025,25.39005949375,12.95953125C25.45005889375,12.77952925,25.54005909375,12.59953025,25.69005969375,12.47953035C25.69005969375,11.90952965,25.72005839375,11.33952995,25.810059593749997,10.73953055C25.90005879375,10.25952955,26.02005859375,9.74953035,26.17005859375,9.17953105C26.320058593749998,8.60953095,26.59005959375,8.09953065,26.92005959375,7.64953085C27.19005959375,7.28953125,27.49005859375,6.92953065,27.85005859375,6.56953095C28.21005859375,6.20953105,28.54005859375,5.939530850000001,28.84005859375,5.75953105C28.750059593750002,5.45953105,28.66005859375,5.15953135,28.60005859375,4.91953115C28.54005859375,4.67953105,28.42005859375,4.40953095,28.180059593750002,4.13953135C27.85005859375,3.74953155,27.370058593750002,3.38953143,26.71005959375,3.02953136C26.05005929375,2.66953133,25.30005929375,2.51953125,24.49005889375,2.51953125C24.16005899375,2.51953125,23.83005949375,2.549531311,23.47005889375,2.579531148C23.11005929375,2.63953105,22.78005889375,2.72953123,22.45005849375,2.84953102C22.12005849375,2.99953112,21.79005859375,3.17953098,21.46005869375,3.41953105C21.13005879375,3.6595311500000003,20.830059093750002,3.98953115,20.56005859375,4.3795309499999995C20.26005889375,4.799530949999999,20.050058593750002,5.24953075,19.90005879375,5.75953105C19.75005889375,6.26953125,19.66005849375,6.74953075,19.570058593749998,7.19953155C19.51005859375,7.73953155,19.48005869375,8.279531949999999,19.51005859375,8.78953125C19.39005879375,8.90953205,19.300058593750002,9.05953165,19.24005869375,9.23953105C19.18005849375,9.389530650000001,19.12005849375,9.56953145,19.12005849375,9.77953105C19.09005859375,9.98953105,19.15005849375,10.19953065,19.21005869375,10.43953085C19.30005839375,10.67952915,19.39005849375,10.85953045,19.48005869375,10.97953125C19.570058593749998,11.09953115,19.66005849375,11.21953015,19.75005889375,11.27953145C19.84005899375,11.33952995,19.96005889375,11.39953135,20.05005909375,11.42953105C20.11005929375,11.66952895,20.17005869375,11.90952965,20.26005889375,12.08953185C20.32005879375,12.26953125,20.41005899375,12.44952965,20.50005909375,12.62953125C20.590059293750002,12.80953125,20.71005869375,12.92953125,20.830059093750002,13.01953125C21.07005929375,13.22953025,21.28005889375,13.40953125,21.46005869375,13.58953225C21.64005849375,13.76953125,21.760059393749998,14.03953125,21.79005909375,14.36953025C21.82005929375,14.57953125,21.82005929375,14.78953125,21.82005929375,14.96953225C21.82005929375,15.14953125,21.79005909375,15.32953225,21.73005919375,15.50953225C21.67005869375,15.68953125,21.55005879375,15.83953225,21.40005879375,16.019532249999997C21.25005869375,16.16953225,21.01005839375,16.37953425,20.71005869375,16.55953225C20.32005879375,16.79953325,19.90005879375,16.97953325,19.42005849375,17.09953325C18.94005849375,17.219533249999998,18.46005819375,17.36953325,18.01005849375,17.519533250000002C17.56005849375,17.66953325,17.14005849375,17.87953425,16.81005853375,18.149534250000002C16.48005858375,18.41953325,16.27005860375,18.80953425,16.18005858375,19.31953225C16.06005857978016,20.24953225,16.03005858875,20.99953225,16.09005858575,21.56953425C16.15005857475,22.13953225,16.27005860375,22.49953225,16.42005857375,22.61953325C16.51005858375,22.70953325,16.75005853375,22.76953325,17.14005849375,22.85953325C17.53005849375,22.94953525,17.98005869375,23.00953525,18.52005859375,23.09953325C19.06005839375,23.18953525,19.66005849375,23.24953425,20.32005879375,23.30953625C20.98005869375,23.36953525,21.64005849375,23.42953525,22.27005859375,23.48953425C22.30005839375,23.45953325,22.30005839375,23.42953525,22.33005859375,23.39953425C22.36005879375,23.36953525,22.36005879375,23.33953525,22.39005849375,23.30953225C22.42005869375,23.15953425,22.42005869375,23.00953525,22.42005869375,22.82953425C22.42005869375,22.64953425,22.45005939375,22.46953425,22.48005919375,22.28953325C22.57005929375,21.68953325,22.78005889375,21.23953425,23.11005929375,20.90953425C23.44005919375,20.57953425,23.83005859375,20.33953325,24.280058893750002,20.12953425C24.70005889375,20.03953125,25.18005849375,19.85953325,25.66005799375,19.67952925Z" fill="#496FFE" fill-opacity="1" style="mix-blend-mode:passthrough"/><path d="M40.660066375,22.83203525C40.540063375,22.47203625,40.300064375000005,22.172036249999998,40.000063374999996,21.93203725C39.700063375,21.69203625,39.340065375,21.51203625,38.950064375,21.36203725C38.560063375,21.21203825,38.170063375,21.09203725,37.750064375,20.972036250000002C37.330062375,20.852036249999998,36.940062375,20.73203525,36.610063374999996,20.58203625C36.220063375,20.43203725,35.920063375,20.25203725,35.680063375,20.07203625C35.470061375,19.86203625,35.290063375,19.68203525,35.200063375,19.44203425C35.110063374999996,19.23203325,35.050063375,19.02203425,35.050063375,18.78203525C35.050063375,18.57203325,35.050063375,18.33203525,35.080063375,18.12203425C35.110063374999996,17.972033250000003,35.170065375,17.82203525,35.230063375,17.70203525C35.290063375,17.582033250000002,35.350063375,17.49203325,35.440063375,17.40203525L35.710064375,17.13203425C35.830063375,17.04203425,35.950065375,16.95203525,36.070065375,16.83203525C36.190065375,16.74203425,36.280065375,16.62203425,36.400064375,16.44203425C36.490064375,16.26203445,36.580063375,16.08203315,36.640065375,15.90203385C36.700063375,15.69203285,36.760065374999996,15.48203375,36.850066375,15.24203395C37.000064375,15.21203325,37.120066375,15.12203315,37.240066375,15.03203205C37.330066375,14.94203185,37.450066375,14.79203225,37.540065375,14.61203285C37.630066375,14.43203165,37.690065375,14.19203285,37.750066375,13.89203315C37.780065375,13.652032850000001,37.780065375,13.47203255,37.750066375,13.32203245C37.720067375,13.17203285,37.660065375,13.05203195,37.600067375,12.932032150000001C37.540067375,12.81203175,37.450066375,12.72203205,37.390065375,12.66203165C37.420066375,12.092031949999999,37.360066375,11.55203195,37.300065375,10.98203185C37.210064375,10.50203185,37.090064375,9.99203225,36.910064375,9.45203205C36.730066375,8.91203185,36.460065375,8.40203185,36.100064375,7.95203165C35.800065375,7.56203105,35.290064375,7.20203125,34.660065375,6.84203142C34.000064375,6.48203157,33.250064875,6.33203125,32.410065675,6.33203125C32.110065475,6.33203125,31.780065075,6.362031313,31.420065875,6.392031375C31.060065275,6.4520315,30.730065775,6.54203124,30.370065675,6.6620315C30.010066075,6.81203136,29.680065675,6.99203128,29.350065675,7.23203135C29.020065775,7.47203145,28.720065575,7.80203175,28.450065575,8.19203105C28.150065875,8.61203095,27.940065875000002,9.09203125,27.790065975,9.57203125C27.640066175,10.08203105,27.550066675,10.56203125,27.490066275,11.01203155C27.430066375,11.55203195,27.400066575,12.092031949999999,27.430066375,12.60203175C27.310065975,12.72203205,27.220066275,12.872032149999999,27.160066375,13.052031549999999C27.100065975,13.17203185,27.040065975,13.35203125,27.040065975,13.56203075C27.010066275,13.772031349999999,27.070065775,13.98203185,27.130065675,14.22203205C27.220065375,14.46203045,27.310065975,14.64203165,27.400065675,14.76203255C27.490065575,14.88203235,27.580066175,15.00203135,27.670065875,15.06203265C27.760065775,15.12203125,27.880065875,15.18203255,27.970065575,15.21203235C28.030065575000002,15.45203305,28.090065975,15.69203095,28.180065675,15.87203315C28.240065575,16.05203245,28.330065275,16.23203375,28.420065375,16.41203225C28.510064575,16.592032250000003,28.600065275,16.74203125,28.720065075,16.832033250000002C28.960064375,17.01203125,29.170064475,17.19203325,29.350064775,17.37203325C29.560064775,17.55203225,29.650064475,17.82203325,29.710064875,18.15203425C29.740064175,18.392034250000002,29.740064175,18.602033249999998,29.740064175,18.78203525C29.740064175,18.962033249999998,29.710064875,19.142034250000002,29.620064275,19.292035249999998C29.560063875,19.44203425,29.440063975,19.62203425,29.260064175,19.77203425C29.110064075,19.92203425,28.870063775,20.13203525,28.570064075,20.31203425C28.180063675,20.55203425,27.760063875,20.732034249999998,27.280063675,20.85203525C26.800063875,20.972035249999998,26.320063575,21.12203525,25.870064175,21.27203425C25.420064575,21.42203425,25.000064475,21.662035250000002,24.670064335,21.90203525C24.340064105,22.172036249999998,24.130064125,22.56203625,24.040064395,23.07203525C23.9200641513,23.97203425,23.890064538,24.72203425,23.980064273,25.29203425C24.070064005,25.86203425,24.160064635,26.22203625,24.310064495,26.34203725C24.400064225,26.40203525,24.580064595,26.49203525,24.910064815,26.55203825C25.240064975,26.61203625,25.630064475,26.70203825,26.080064775,26.76203725C26.560065075,26.82203625,27.070064575,26.91203925,27.610064775,26.97203825C28.180064675,27.03203725,28.750064375,27.09203925,29.320064975,27.12204025C29.890064674999998,27.18203725,30.460064875,27.21203825,30.970065075,27.24203825C31.510064575,27.27203925,31.990065575,27.30203825,32.380065875,27.30203825C32.770066275,27.30203825,33.280065575,27.27203925,33.820065475,27.24203825C34.360066375,27.21203825,34.930065375,27.18203925,35.500064375,27.12204025C36.070065375,27.06204025,36.670065375,27.00203925,37.240066375,26.94203925C37.810065375,26.88204025,38.350066375,26.79203825,38.830065375000004,26.70203925C39.310063375,26.61203725,39.700063375,26.52203925,40.030063375,26.43203725C40.360065375000005,26.34203925,40.540067375,26.22203625,40.600065375,26.13204025C40.690067375,25.98203825,40.780063375,25.77203725,40.810064374999996,25.47203825C40.870065374999996,25.17203925,40.870065374999996,24.87203825,40.870065374999996,24.51203925C40.870065374999996,24.18203925,40.840067375000004,23.85203725,40.810064374999996,23.52203925C40.780067375,23.34203925,40.720064375,23.07203825,40.660066375,22.83203525Z" fill="#496FFE" fill-opacity="1" style="mix-blend-mode:passthrough"/></g></svg>
\ No newline at end of file
diff --git a/src/assets/system/jichupeizhi.svg b/src/assets/system/jichupeizhi.svg
new file mode 100644
index 0000000..bdaf618
--- /dev/null
+++ b/src/assets/system/jichupeizhi.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="89.5693359375" height="96" viewBox="0 0 89.5693359375 96"><defs><filter id="master_svg0_143_35968" filterUnits="objectBoundingBox" color-interpolation-filters="sRGB" x="-0.6666666666666666" y="-0.6666666666666666" width="2.3333333333333335" height="2.3333333333333335"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"/><feOffset dy="0" dx="0"/><feGaussianBlur stdDeviation="8"/><feColorMatrix type="matrix" values="0 0 0 0 0.12895070016384125 0 0 0 0 0.29307788610458374 0 0 0 0 0.9107142686843872 0 0 0 0.5299999713897705 0"/><feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow"/><feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow" result="shape"/></filter><clipPath id="master_svg1_143_34356"><rect x="32.78466796875" y="36" width="25" height="24" rx="0"/></clipPath></defs><path d="M44.78466796875,24.000000000000004L65.56927496875,36L65.56927496875,60L44.78466796875,72L24.00005836875,60L24.00005796875,36.000001L44.78466796875,24.000000000000004Z" fill="#496FFE" fill-opacity="1" filter="url(#master_svg0_143_35968)"/><g clip-path="url(#master_svg1_143_34356)"><path d="M45.88867596875,51.096690875C45.959985968750004,50.688688875,46.48291996875,50.544689875,46.76815496875,50.832688875L49.24020996875,53.304690875C49.59675396875,53.664689875,50.167228968749995,53.664689875,50.523774968750004,53.304690875L51.783568968750004,52.032688875C52.140115968749996,51.672690875,52.140115968749996,51.096691875,51.783568968750004,50.760690875L49.311517968749996,48.240688875000004C49.00251196875,47.952689875000004,49.14512796875,47.424689875,49.54921496875,47.352690875C50.99916796875,47.064690875,52.544200968750005,47.496689875,53.68514596875,48.648689875C54.92117496875,49.896689875,55.32525796875,51.672689875,54.84986496875,53.280688874999996C54.77855496875,53.544686875,54.826095968749996,53.832688875,55.016252968749995,54.024690875000005L57.53584496875,56.544690875C57.89239096875,56.904691875,57.89239096875,57.480689874999996,57.53584496875,57.816690875L56.252276968749996,59.088687875000005C55.89573496875,59.448688875,55.32525796875,59.448688875,54.96871196875,59.088687875000005L52.44912196875,56.520688875000005C52.25896296875,56.328687875,51.97372796875,56.280688874999996,51.71225896875,56.352689874999996C50.14345896875,56.808686875,48.38449896875,56.424689875,47.148470968750004,55.176688874999996C46.05506396875,54.072690875,45.65097696875,52.536686875,45.88867596875,51.096690875ZM55.77688396875,57.936690875C56.15719796875,57.936690875,56.46620596875,57.624688875000004,56.46620596875,57.240689875C56.46620596875,56.856690875,56.15719796875,56.544690875,55.77688396875,56.544690875C55.39656996875,56.544690875,55.08756296875,56.856690875,55.08756296875,57.240689875C55.08756296875,57.624688875000004,55.39656996875,57.936690875,55.77688396875,57.936690875ZM55.46787796875,46.224690475L54.944943968749996,44.304689875C54.89740596875,44.112690975,54.75478596875,43.944690675000004,54.58839796875,43.848690475C54.39823896875,43.728690575,54.18431096875,43.656691574999996,53.99415796875,43.704690975L52.87697996875,43.992689575C52.37781296875,44.088689775,51.854880968749995,43.896689375,51.54587396875,43.464689775L50.571313968750005,42.192689875C50.23853896875,41.832690675,50.14345896875,41.208689675,50.38115696875,40.776689975L50.97539896875,39.720690275C51.16555996875,39.360690075,51.02293796875,38.904690475,50.66639296875,38.736690275L48.88366296875,37.680690775C48.71727296875,37.584690805,48.50334796875,37.560690705,48.31318996875,37.608690795C48.12303096875,37.656690675,47.98041296875,37.776690675,47.88533296875,37.944690675L47.29109096875,38.952690575C47.02962396875,39.384690475,46.50668996875,39.600690375,46.00752496875,39.504690375L44.43872296875,39.288690575C43.96332796875,39.240690475,43.41662296875,38.856690675,43.32154696875,38.376690475L43.01253896875,37.248690605C42.96499896875,37.056690575,42.82238196875,36.888690625,42.65599346875,36.792690615C42.46583656875,36.672690658,42.22813796875,36.624690654,42.01420976875,36.672690658L40.08886286875,37.152690615C39.68477726875,37.248690605,39.44707866875,37.680690575,39.56592896875,38.064690575L39.87493566875,39.192690175C39.99378396875,39.696690075,39.80362656875,40.200690075,39.37577106875,40.488690575L38.11597536875,41.448689975C37.73566006875,41.784690875,37.16518686875,41.832690675,36.68979166875,41.592690475L35.66769336875,40.992690575C35.33491706875,40.776689975,34.90706206875,40.872690675,34.66936476875,41.208690175L33.59972607875,43.056691175C33.52841686875,43.224689975000004,33.50464713875,43.392690675,33.55218660875,43.560690375C33.62349575875,43.752690775,33.74234455875,43.920689575,33.90873256875,44.016689775L34.93083096875,44.616690675C35.38245586875,44.904689775,35.59638306875,45.432690575,35.50130466875,45.936691275L35.33491656875,47.520690875C35.31114646875,48.000689875,34.93083096875,48.528689875,34.45543626875,48.600688875L33.33825903875,48.888688875C32.93417358875,49.008689875,32.69647629575,49.416688875,32.81532496375,49.824688875L33.33825903875,51.744687875C33.45710759875,52.152688875,33.86119316875,52.392688875,34.28904826875,52.296688875L35.42999556875,52.008687875C35.92916006875,51.912686875,36.45209356875,52.104688875,36.76110026875,52.536686875L37.73565956875,53.808686875C38.06843516875,54.192685874999995,38.13974476875,54.768687875,37.90204766875,55.200687875L37.30780406875,56.208688875C37.21272566875,56.376687875,37.18895526875,56.592689875000005,37.236494568750004,56.784686875C37.28403426875,56.976686875,37.42665286875,57.144685875,37.59304046875,57.240686875L39.37577056875,58.272687875C39.54215856875,58.368686875,39.75608586875,58.392684875,39.94624326875,58.344688875C40.13640066875,58.296685875,40.30278966875,58.176684875,40.39786866875,58.008685875L40.99211216875,57.000686875C41.27734946875,56.568687874999995,41.800283468749996,56.352687875,42.29944706875,56.448686875L43.89201796875,56.664687875C44.36741496875,56.688687875,44.89034796875,57.096688875,45.00919596875,57.576686875L45.31820196875,58.704686875C45.43705196875,59.112687875,45.84113596875,59.352685875,46.26899196875,59.256686875L48.19433996875,58.776687875C48.47957896875,58.704686875,48.66973396875,58.464685875,48.74104396875,58.200687875C47.67140596875,57.888686875000005,46.69684696875,57.336686875,45.88867596875,56.520688875000005C45.128044968750004,55.752687875,44.581341968749996,54.816690875,44.29610396875,53.808688875L44.224794968750004,53.808688875C41.01588246875,53.808688875,38.42498156875,51.192689875,38.42498156875,47.952688875C38.42498156875,44.712689375,41.01588246875,42.096689175,44.224794968750004,42.096689175C46.53045896875,42.096689175,48.52711696875,43.440689075,49.454135968749995,45.408688575C49.81068196875,45.360690075,50.16722696875,45.312688875,50.523772968749995,45.312688875C52.21142196875,45.312688875,53.78022796875,45.960688575,54.99248496875,47.112687875L55.016252968749995,47.112687875C55.32525796875,47.040688875,55.56295796875,46.632689475,55.46787796875,46.224690475ZM44.03463696875,50.760689875C44.05840696875,50.544689875,44.12971596875,50.352689874999996,44.224794968750004,50.184689875000004C43.84447996875,50.208690875,43.440392968750004,50.112688875,43.08384796875,49.896689875C42.06174946875,49.296689875,41.70520396875,47.976688875,42.29944706875,46.944690875C42.89368896875,45.912689175,44.20102496875,45.552690475,45.22312496875,46.152690875C46.15014196875,46.680688875,46.50668996875,47.808690874999996,46.15014196875,48.792688874999996C46.245220968750004,48.792688874999996,46.31653096875,48.768689875,46.41161096875,48.768689875C46.81569496875,48.768689875,47.19600996875,48.864689874999996,47.52878596875,49.032688875C47.24354896875,48.480689874999996,47.148470968750004,47.808688875,47.338627968750004,47.184689875000004C47.48124796875,46.680688875,47.79025396875,46.248689675,48.170568968750004,45.960690475C47.43370796875,44.448689975,45.888674968749996,43.416690875,44.10594596875,43.416690875C41.61012456875,43.416690875,39.56592796875,45.456689875,39.56592796875,48.000689875C39.56592796875,50.472690875,41.49127676875,52.464687874999996,43.91578896875,52.560689875C43.89201796875,51.960688875,43.91578896875,51.360688875,44.03463696875,50.760689875Z" fill="#FFFFFF" fill-opacity="1" style="mix-blend-mode:passthrough"/></g></svg>
\ No newline at end of file
diff --git a/src/assets/system/kehudangan.svg b/src/assets/system/kehudangan.svg
new file mode 100644
index 0000000..a0dd2ec
--- /dev/null
+++ b/src/assets/system/kehudangan.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="59.5" height="63.90625" viewBox="0 0 59.5 63.90625"><defs><linearGradient x1="0" y1="0.16914062201976776" x2="0.8045321262753937" y2="1.0460527890370677" id="master_svg0_141_37616"><stop offset="48.549023270606995%" stop-color="#F7F7F7" stop-opacity="1"/><stop offset="100%" stop-color="#FFFFFF" stop-opacity="1"/></linearGradient><linearGradient x1="-0.03565644100308418" y1="0" x2="0.8226521556701855" y2="0.9991461352834076" id="master_svg1_141_37562"><stop offset="46.036821603775024%" stop-color="#F3F3F3" stop-opacity="1"/><stop offset="100%" stop-color="#FFFFFF" stop-opacity="1"/></linearGradient><clipPath id="master_svg2_143_35599"><rect x="14.5" y="0" width="32" height="32" rx="0"/></clipPath></defs><path d="M1.204819142818451,27.096379L28.69276814281845,43.307213000000004L58.29516614281845,27.096379L28.69276814281845,13L1.204819142818451,27.096379Z" fill="#FFFFFF" fill-opacity="1"/><path d="M0.16870074281845082,27.065809L28.43877614281845,43.737896L28.68361514281845,43.882288L59.39288714281845,27.065309L28.684561142818453,12.44229615L0.16870074281845082,27.065809ZM28.70192014281845,42.732138L2.240937742818451,27.12695L28.70097614281845,13.55770427L57.19744514281845,27.127449L28.70192014281845,42.732138Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/><path d="M0.5,27.80120277404785L0.5,46.83131777404785L28.692764,63.042150774047855L28.692764,44.01204077404785L0.5,27.80120277404785Z" fill="url(#master_svg0_141_37616)" fill-opacity="1"/><path d="M29.192764,63.906411774047854L29.192764,43.722777774047856L28.941999,43.578587774047854L-5.999999996841865e-8,26.93693918404785L0,47.12058077404785L29.192764,63.906411774047854ZM28.192764,44.30130377404785L28.192764,62.17788877404785L1,46.542054774047855L1,28.66546636404785L28.192764,44.30130377404785Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/><g transform="matrix(-1,0,0,1,118,0)"><path d="M59,27.80120277404785L59,46.12649377404785L88.5,63.00042177404785L88.5,43.26604677404785L59,27.80120277404785Z" fill="url(#master_svg1_141_37562)" fill-opacity="1"/><path d="M89,63.86243677404785L89,42.96362277404785L88.732151,42.82320777404785L58.50000003,26.97454732404785L58.50000003,46.41651177404785L89,63.86243677404785ZM88,43.568469774047855L88,62.13840677404785L59.5,45.836475774047855L59.5,28.627858224047852L88,43.568469774047855Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/></g><g clip-path="url(#master_svg2_143_35599)"><path d="M33.0601790625,19.699661125C33.0601790625,19.699661125,31.9935130625,19.415219125,31.7090700625,19.272997125C31.1401790625,18.917440125,30.7846260625,18.206329125,30.7846260625,17.495218125C30.7846260625,16.712996125,31.4246250625,16.072997125,31.8512940625,15.575218125C32.9179590625,14.295218125,33.4868490625,12.588551525,33.4868490625,10.668550925C33.4868490625,6.6863279250000005,30.6424040625,3.486328125,27.1579580625,3.486328125C23.6735133625,3.486328125,20.8290676625,6.757439625,20.8290676625,10.739662124999999C20.8290676625,12.659662225,21.4690680625,14.366329125,22.4646234625,15.646329125C23.104623762499997,16.001884125,23.5312900625,16.784108125,23.5312900625,17.566329125C23.5312900625,18.277439125,23.1757345625,18.917439125,22.606845862500002,19.344107125L22.606845862500002,19.415219125C22.5357351625,19.415219125,22.4646234625,19.486330125,22.4646234625,19.486330125C22.1090674625,19.699661125,21.753511862499998,19.841886125,21.3268451625,19.841886125C18.6246223625,20.766333125,16.3490668625,22.188555125,14.9979558625,23.966331125L15.0690669725,23.966331125C14.7135113625,24.464107125,14.571289122104652,25.033001125,14.571289151906974,25.601889125C14.571289151906974,27.308554125,15.9935116625,28.730776125,17.7712893625,28.730776125L36.5446260625,28.730776125C38.3935150625,28.730776125,39.8157370625,27.379669125,39.8157370625,25.601889125C39.8157370625,24.890777125,39.5312920625,24.250776125,39.175737062500005,23.681887125C37.8246270625,21.904108125,35.6912940625,20.552999125,33.0601790625,19.699661125ZM45.7890700625,22.828550125C44.5801810625,21.335218125,42.731295062499996,20.055218125,40.384626062500004,19.344107125C40.384626062500004,19.344107125,39.460182062499996,19.130773124999997,39.175737062500005,18.988552125C38.6779590625,18.632995125,38.3935150625,18.064107125,38.3935150625,17.424106125C38.3935150625,16.712996125,38.9624040625,16.144107124999998,39.3179570625,15.788550125C40.2424050625,14.650774125,40.8112940625,13.157439225,40.8112940625,11.450773224999999C40.8112940625,7.966328125,38.3224010625,5.050772425,35.1935140625,5.050772425C34.6957340625,5.050772425,34.1979580625,5.121883625,33.771292062499995,5.264105525C34.837957062499996,6.828550125,35.4068470625,8.677439725,35.4068470625,10.739662124999999C35.4068470625,12.944106125,34.624624062500004,15.077440125,33.2735140625,16.855217125L33.131292062499995,16.997439125L33.131292062499995,17.068550125C32.9890690625,17.210771125,32.7757360625,17.424106125,32.7046260625,17.637441125000002C32.7046260625,17.708552125,32.7046260625,17.708552125,32.7757380625,17.708552125C32.9179590625,17.779663125,33.131294062500004,17.850773125,33.344627062499995,17.850773125L33.415739062499995,17.850773125L33.7001840625,17.992995125C36.615740062499995,18.917439125,39.1046280625,20.552994125,40.7401830625,22.615217125C41.4512940625,23.539663125,41.8779620625,24.606331125,41.8779620625,25.744110125C41.8779620625,26.384107125,41.7357390625,26.881883125,41.522406062499996,27.450775125L43.584627062500005,27.450775125C45.2201820625,27.450775125,46.500181062500005,26.241884125,46.500181062500005,24.677442125C46.4290710625,23.895220125,46.2157380625,23.326330125,45.7890700625,22.828550125Z" fill="#496FFE" fill-opacity="1" style="mix-blend-mode:passthrough"/></g></svg>
\ No newline at end of file
diff --git a/src/assets/system/kehuwanglai.svg b/src/assets/system/kehuwanglai.svg
new file mode 100644
index 0000000..41a62c0
--- /dev/null
+++ b/src/assets/system/kehuwanglai.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="59.5" height="64.90625" viewBox="0 0 59.5 64.90625"><defs><linearGradient x1="0" y1="0.16914062201976776" x2="0.8045321262753937" y2="1.0460527890370677" id="master_svg0_141_37616"><stop offset="48.549023270606995%" stop-color="#F7F7F7" stop-opacity="1"/><stop offset="100%" stop-color="#FFFFFF" stop-opacity="1"/></linearGradient><linearGradient x1="-0.03565644100308418" y1="0" x2="0.8226521556701855" y2="0.9991461352834076" id="master_svg1_141_37562"><stop offset="46.036821603775024%" stop-color="#F3F3F3" stop-opacity="1"/><stop offset="100%" stop-color="#FFFFFF" stop-opacity="1"/></linearGradient><clipPath id="master_svg2_143_35644"><rect x="15" y="0" width="31" height="31" rx="0"/></clipPath></defs><path d="M1.204819142818451,28.096379L28.69276814281845,44.307213000000004L58.29516614281845,28.096379L28.69276814281845,14L1.204819142818451,28.096379Z" fill="#FFFFFF" fill-opacity="1"/><path d="M0.16870074281845082,28.065809L28.43877614281845,44.737896L28.68361514281845,44.882288L59.39288714281845,28.065309L28.684561142818453,13.44229615L0.16870074281845082,28.065809ZM28.70192014281845,43.732138L2.240937742818451,28.12695L28.70097614281845,14.55770427L57.19744514281845,28.127449L28.70192014281845,43.732138Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/><path d="M0.5,28.80120277404785L0.5,47.83131777404785L28.692764,64.04215077404785L28.692764,45.01204077404785L0.5,28.80120277404785Z" fill="url(#master_svg0_141_37616)" fill-opacity="1"/><path d="M29.192764,64.90641177404785L29.192764,44.722777774047856L28.941999,44.578587774047854L-5.999999996841865e-8,27.93693918404785L0,48.12058077404785L29.192764,64.90641177404785ZM28.192764,45.30130377404785L28.192764,63.17788877404785L1,47.542054774047855L1,29.66546636404785L28.192764,45.30130377404785Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/><g transform="matrix(-1,0,0,1,118,0)"><path d="M59,28.80120277404785L59,47.12649377404785L88.5,64.00042177404785L88.5,44.26604677404785L59,28.80120277404785Z" fill="url(#master_svg1_141_37562)" fill-opacity="1"/><path d="M89,64.86243677404785L89,43.96362277404785L88.732151,43.82320777404785L58.50000003,27.97454732404785L58.50000003,47.41651177404785L89,64.86243677404785ZM88,44.568469774047855L88,63.13840677404785L59.5,46.836475774047855L59.5,29.627858224047852L88,44.568469774047855Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/></g><g clip-path="url(#master_svg2_143_35644)"><path d="M41.009501,2.634513605C38.250498,2.634513605,36.018496999999996,4.122513425,36.018496999999996,5.9515133250000005C36.018496999999996,7.191513025,37.0105,8.245513425,38.498497,8.834512725C38.436499,9.237513025,38.281496000000004,9.671513125,38.033497,10.136512725C38.033497,10.136512725,39.428499,10.012512725,40.141498999999996,9.237512625C40.420497999999995,9.268512225,40.699499,9.299512825,41.009501,9.299512825C43.768496999999996,9.299512825,46.0005,7.811512425,46.0005,5.982512724999999C46.0005,4.122513025,43.768496999999996,2.634513143,41.009501,2.634513605ZM38.994499000000005,6.416513425C38.591497000000004,6.416513425,38.281498,6.106513525,38.281498,5.703513425000001C38.281498,5.3005135249999995,38.591497000000004,4.990513325,38.994499000000005,4.990513325C39.397501,4.990513325,39.707499,5.3005135249999995,39.707499,5.703513425000001C39.707499,6.0755131250000005,39.366499000000005,6.416513425,38.994499000000005,6.416513425ZM41.133500999999995,6.416513425C40.730498999999995,6.416513425,40.420497999999995,6.106513525,40.420497999999995,5.703513425000001C40.420497999999995,5.3005135249999995,40.730498999999995,4.990513325,41.133500999999995,4.990513325C41.536499,4.990513325,41.846498,5.3005135249999995,41.846498,5.703513425000001C41.846498,6.0755131250000005,41.505499,6.416513425,41.133500999999995,6.416513425ZM43.272501,6.416513425C42.869499000000005,6.416513425,42.5595,6.106513525,42.5595,5.703513425000001C42.5595,5.3005135249999995,42.869499000000005,4.990513325,43.272501,4.990513325C43.675499,4.990513325,43.985498,5.3005135249999995,43.985498,5.703513425000001C43.985498,6.0755131250000005,43.644498999999996,6.416513425,43.272501,6.416513425ZM24.9825001,20.335512625C25.478499,20.180513625,25.9745,19.932514625,26.408499,19.684512625C26.594501,19.560512625,26.718499,19.467510625,26.780499,19.343513625C26.842501,19.250511625,26.8735,19.095512625,26.904501,18.909513625C26.873500999999997,18.754514625,26.842501,18.599513625,26.842501,18.506513625C26.842501,18.413512625,26.811501,18.320512625,26.780499,18.258511625C26.749499999999998,18.196513625,26.6875,18.134511625000002,26.625500000000002,18.072512625C26.563499,18.010514625,26.4705,17.917513624999998,26.346499,17.824512625C26.2225,17.731510625,26.098501,17.576512625,26.005499999999998,17.359513624999998C25.912499,17.142513625,25.819499999999998,16.925514624999998,25.7575,16.739514624999998C25.695498999999998,16.491513625,25.633499,16.243514625,25.5405,15.964514625C25.447499999999998,15.933514625,25.3235,15.871514625,25.2305,15.747513625C25.1375,15.654513625,25.0445004,15.530512625,24.9514999,15.375512625C24.8585014,15.220513625,24.7655001,15.003514625,24.6724997,14.724513625C24.5795012,14.445513625,24.5485001,14.197513625,24.5795012,13.980514625C24.610499400000002,13.763513625,24.6415005,13.546514625,24.7035007,13.391513625C24.765501,13.205513625,24.8585014,13.019513625,25.0135012,12.895513625C25.0135012,12.306513825,25.0445004,11.717514025,25.1375,11.097515125C25.2305,10.601513825,25.354501,10.074514425,25.509501,9.485514625C25.6645,8.896514925,25.943500999999998,8.369514425,26.2845,7.904515225C26.563499999999998,7.532515525,26.873500999999997,7.160514825,27.2455,6.788515125C27.6175,6.416515125,27.958501,6.137515325,28.268499,5.951514925C28.1755,5.641515025,28.0825,5.331515325,28.020501,5.083515425C27.958501,4.835515525,27.8345,4.5565153249999995,27.5865,4.2775156249999995C27.2455,3.874515725,26.749499999999998,3.5025157350000002,26.067500000000003,3.130515695C25.385502000000002,2.758515705,24.6105013,2.603515625,23.7735014,2.603515625C23.4325008,2.603515625,23.0915012,2.634515684,22.7195001,2.665515512C22.3475003,2.727515395,22.0065007,2.820515585,21.665499699999998,2.944515375C21.3244996,3.099515435,20.983500499999998,3.285515305,20.6424999,3.533515335C20.301499800000002,3.781515525,19.9915004,4.122515325,19.7125006,4.525515325C19.4025002,4.959515325,19.1855001,5.424515025,19.0304999,5.951514925C18.8755002,6.4785151249999995,18.7825,6.974514925,18.6894999,7.439515125C18.6275001,7.997515725,18.5964999,8.555515725,18.6275001,9.082515225C18.5035,9.206515325,18.4105,9.361515525,18.3485,9.547515425C18.2865002,9.702514625,18.2245002,9.888515025,18.2245002,10.105515024999999C18.1934998,10.322515025000001,18.2555001,10.539514525000001,18.3175001,10.787514725C18.4104998,11.035512925,18.5034997,11.221514725,18.5964999,11.345515225C18.6894999,11.469514825,18.7825,11.593514425,18.8755002,11.655514725C18.9685004,11.717514025,19.0925002,11.779515225,19.1855001,11.810515425C19.2475004,12.058512725,19.3095007,12.306513825,19.4025006,12.492514625C19.4645004,12.678514625,19.557500400000002,12.864513625,19.6505008,13.050515625C19.7435007,13.236513625,19.8675003,13.360515625,19.9915004,13.453514625C20.2395,13.670513625,20.4565005,13.856515625,20.6424999,14.042514625C20.8285003,14.228514625,20.9525008,14.507514625,20.983501,14.848514625C21.0145001,15.065514625,21.0145001,15.282513625,21.0145001,15.468516625C21.0145001,15.654515625,20.983501,15.840515625,20.9215002,16.026515625000002C20.8595004,16.212514625,20.7355008,16.367514625,20.5805006,16.553516625C20.4255004,16.708515625,20.1775002,16.925516625,19.8674998,17.111516625C19.4645,17.359516624999998,19.0304999,17.545515625,18.5345001,17.669515625000003C18.0384998,17.793516625000002,17.5424998,17.948516625,17.0775001,18.103517625000002C16.6124998,18.258515625,16.1785001,18.475516624999997,15.837499919999999,18.754516625C15.49650002,19.033515625,15.27950002,19.436517625,15.18649999,19.963516625C15.062499985564498,20.924516625,15.031499993,21.699516625,15.09349999,22.288516625C15.155499987,22.877515625,15.27950002,23.249513625,15.43449998,23.373515625C15.5275,23.466518625,15.77549994,23.528514625,16.1785001,23.621517625C16.5814999,23.714517625,17.0465,23.776515625,17.6045001,23.869516625C18.1624997,23.962518625,18.7825,24.024518625,19.4645,24.086519625C20.1465001,24.148517625,20.8285003,24.210517625,21.479500299999998,24.272518625C21.510500399999998,24.241519625,21.510500399999998,24.210517625,21.5415006,24.179517625C21.5725002,24.148517625,21.5725002,24.117519625,21.6035004,24.086515625C21.6345005,23.931516625,21.6345005,23.776515625,21.6345005,23.590516625C21.6345005,23.404518625,21.6655006,23.218515625,21.6965003,23.032514625C21.7895012,22.412517625,22.0065007,21.947515625,22.3475003,21.606515625C22.6885009,21.265518625,23.091499300000002,21.017516625,23.556501400000002,20.800517625C23.9905005,20.707515625,24.4865007,20.521516625,24.9825001,20.335512625Z" fill="#496FFE" fill-opacity="1" style="mix-blend-mode:passthrough"/><path d="M40.48196953125,23.59297175C40.35796753125,23.22097175,40.109968531250004,22.91097275,39.79996853125,22.66297375C39.48996953125,22.41497375,39.11797053125,22.22897475,38.71496853125,22.07397375C38.31196653125,21.91897375,37.90896753125,21.79497375,37.47496753125,21.67097375C37.040967531250004,21.546972750000002,36.63796753125,21.42297375,36.296967531250004,21.26797275C35.893968531249996,21.11297275,35.58396853125,20.92697475,35.33596753125,20.74097175C35.11896653125,20.52397175,34.93296753125,20.33797275,34.83996853125,20.08997175C34.74696753125,19.87297075,34.68496753125,19.65597175,34.68496753125,19.40797175C34.68496753125,19.19097175,34.68496753125,18.94297075,34.71596853125,18.725970750000002C34.74696753125,18.57097075,34.80896953125,18.41597075,34.87096853125,18.29197075C34.93296753125,18.16797175,34.99496853125,18.07496975,35.08796853125,17.98197175L35.36696953125,17.70297175C35.49096853125,17.609969749999998,35.61497053125,17.51697175,35.73896953125,17.39297075C35.86296953125,17.29997075,35.95597053125,17.175970749999998,36.07996853125,16.989970749999998C36.172969531250004,16.803971750000002,36.265968531249996,16.617970749999998,36.32796953125,16.43197155C36.38996853125,16.21496965,36.45197053125,15.99797055,36.54497053125,15.74997045C36.69997053125,15.71897025,36.82397053125,15.62597085,36.94797053125,15.53296945C37.04097153125,15.43996905,37.16497253125,15.28496935,37.25797053125,15.09896945C37.350971531249996,14.91296765,37.41297053125,14.66496945,37.47497053125,14.35496955C37.50597053125,14.106969849999999,37.50597053125,13.920969450000001,37.47497053125,13.76596975C37.44397153125,13.61096955,37.38197153125,13.48696945,37.31997153125,13.36296935C37.25797153125,13.23896885,37.16497253125,13.14596935,37.10297153125,13.08396915C37.13397053125,12.49496885,37.07197153125,11.93696925,37.00996953125,11.34796905C36.916969531250004,10.85196925,36.79296953125,10.324969750000001,36.60696953125,9.766969249999999C36.42097053125,9.20896915,36.14196953125,8.68196945,35.76996953125,8.21696885C35.45997053125,7.81396865,34.93296853125,7.44196874,34.28196953125,7.06996888C33.59996953125,6.69796906,32.82497023125,6.54296875,31.95697023125,6.54296875C31.64697073125,6.54296875,31.30596923125,6.573968815,30.93396993125,6.604968879C30.56197023125,6.66696901,30.22097063125,6.75996874,29.84897093125,6.88396898C29.47697063125,7.03896886,29.13597063125,7.22496873,28.79497053125,7.47296876C28.45396993125,7.72096885,28.143970531249998,8.06196915,27.86497073125,8.46496855C27.554970731250002,8.89896845,27.33797073125,9.39496855,27.182970731250002,9.89096855C27.02797103125,10.417968049999999,26.934971131250002,10.913968050000001,26.87297103125,11.37896875C26.81097103125,11.93696925,26.77997133125,12.49496885,26.81097103125,13.021969349999999C26.68697073125,13.14596935,26.59397073125,13.30096915,26.53197073125,13.48696895C26.46997073125,13.610968549999999,26.40797063125,13.796967949999999,26.40797063125,14.01396845C26.37697103125,14.23096795,26.43897013125,14.447968450000001,26.50097013125,14.69596955C26.59397003125,14.94396785,26.68697073125,15.12996865,26.77997043125,15.25397015C26.87297033125,15.37796975,26.96597103125,15.50196835,27.05897043125,15.56396865C27.15197013125,15.62596795,27.275970431250002,15.68797015,27.36897043125,15.71896835C27.43097023125,15.96696945,27.49297043125,16.21496775,27.58596993125,16.40096955C27.64797063125,16.58696975,27.740970131250002,16.77296975,27.83396963125,16.95896875C27.926969531250002,17.14496875,28.01996993125,17.299969750000002,28.14396953125,17.39296975C28.39196873125,17.57896975,28.60896923125,17.76496975,28.79496913125,17.95096975C29.01196953125,18.13696975,29.10496953125,18.415969750000002,29.16696933125,18.75697075C29.19796893125,19.00497175,29.19796893125,19.22197075,29.19796893125,19.40797175C29.19796893125,19.59397075,29.16696933125,19.77997275,29.07396843125,19.934971750000003C29.01196813125,20.08997175,28.88796803125,20.27597175,28.70196913125,20.43097075C28.54696893125,20.58597175,28.29896883125,20.802972750000002,27.98896883125,20.98897075C27.58596853125,21.236971750000002,27.15196823125,21.422970749999998,26.65596843125,21.54697175C26.15996813125,21.67097275,25.66396833125,21.82597275,25.19896863125,21.980970749999997C24.73396893125,22.13597075,24.29996903125,22.38397175,23.95896882125,22.63197375C23.61796862125,22.91097275,23.40096862125,23.31397475,23.30796889125,23.84097075C23.18396863345,24.77097175,23.15296903225,25.54597075,23.24596876325,26.13497175C23.33896848125,26.72397075,23.43196915125,27.09597175,23.58696902125,27.21997275C23.67996874125,27.28197075,23.86596912125,27.37497175,24.20696933125,27.43697375C24.54796953125,27.49897175,24.950969131249998,27.59197475,25.41596933125,27.65397275C25.91196943125,27.71597275,26.43896933125,27.80897375,26.99696943125,27.87097575C27.58596943125,27.93297175,28.17496923125,27.99497375,28.76396993125,28.02597475C29.352969631249998,28.08797475,29.94196983125,28.11897475,30.46897033125,28.14997675C31.026969431250002,28.18097475,31.52297023125,28.21197275,31.92597003125,28.21197275C32.32897093125,28.21197275,32.85596943125,28.18097475,33.41397053125,28.14997675C33.97196953125,28.11897475,34.56097053125,28.08797675,35.14997053125,28.02597475C35.73896953125,27.96397575,36.35896853125,27.90197375,36.94797053125,27.83997575C37.53697053125,27.77797475,38.094971531249996,27.68497475,38.59097053125,27.59197475C39.08696753125,27.49897375,39.48996953125,27.40597575,39.83096853125,27.31297675C40.17197253125,27.21997475,40.35797153125,27.09597575,40.41997153125,27.00297575C40.51297153125,26.84797475,40.60597053125,26.63097375,40.63697053125,26.32097675C40.69896853125,26.01097475,40.69896853125,25.70097575,40.69896853125,25.32897375C40.69896853125,24.98797375,40.66797253125,24.64697475,40.63697053125,24.30597475C40.60597453125,24.11997375,40.54397053125,23.84097675,40.48196953125,23.59297175Z" fill="#496FFE" fill-opacity="1" style="mix-blend-mode:passthrough"/></g></svg>
\ No newline at end of file
diff --git a/src/assets/system/kucunguanli.svg b/src/assets/system/kucunguanli.svg
new file mode 100644
index 0000000..85b1219
--- /dev/null
+++ b/src/assets/system/kucunguanli.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="59.5" height="61.90625" viewBox="0 0 59.5 61.90625"><defs><linearGradient x1="0" y1="0.16914062201976776" x2="0.8045321262753937" y2="1.0460527890370677" id="master_svg0_141_37616"><stop offset="48.549023270606995%" stop-color="#F7F7F7" stop-opacity="1"/><stop offset="100%" stop-color="#FFFFFF" stop-opacity="1"/></linearGradient><linearGradient x1="-0.03565644100308418" y1="0" x2="0.8226521556701855" y2="0.9991461352834076" id="master_svg1_141_37562"><stop offset="46.036821603775024%" stop-color="#F3F3F3" stop-opacity="1"/><stop offset="100%" stop-color="#FFFFFF" stop-opacity="1"/></linearGradient><clipPath id="master_svg2_143_35878"><rect x="13.5" y="0" width="32" height="32" rx="0"/></clipPath></defs><path d="M1.204819142818451,25.096379L28.69276814281845,41.307213000000004L58.29516614281845,25.096379L28.69276814281845,11L1.204819142818451,25.096379Z" fill="#FFFFFF" fill-opacity="1"/><path d="M0.16870074281845082,25.065809L28.43877614281845,41.737896L28.68361514281845,41.882288L59.39288714281845,25.065309L28.684561142818453,10.44229615L0.16870074281845082,25.065809ZM28.70192014281845,40.732138L2.240937742818451,25.12695L28.70097614281845,11.55770427L57.19744514281845,25.127449L28.70192014281845,40.732138Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/><path d="M0.5,25.80120277404785L0.5,44.83131777404785L28.692764,61.042150774047855L28.692764,42.01204077404785L0.5,25.80120277404785Z" fill="url(#master_svg0_141_37616)" fill-opacity="1"/><path d="M29.192764,61.906411774047854L29.192764,41.722777774047856L28.941999,41.578587774047854L-5.999999996841865e-8,24.93693918404785L0,45.12058077404785L29.192764,61.906411774047854ZM28.192764,42.30130377404785L28.192764,60.17788877404785L1,44.542054774047855L1,26.66546636404785L28.192764,42.30130377404785Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/><g transform="matrix(-1,0,0,1,118,0)"><path d="M59,25.80120277404785L59,44.12649377404785L88.5,61.00042177404785L88.5,41.26604677404785L59,25.80120277404785Z" fill="url(#master_svg1_141_37562)" fill-opacity="1"/><path d="M89,61.86243677404785L89,40.96362277404785L88.732151,40.82320777404785L58.50000003,24.97454732404785L58.50000003,44.41651177404785L89,61.86243677404785ZM88,41.568469774047855L88,60.13840677404785L59.5,43.836475774047855L59.5,26.627858224047852L88,41.568469774047855Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/></g><g clip-path="url(#master_svg2_143_35878)"><path d="M38.91415821875,30.224147875L20.39949081875,30.224147875C19.11332841875,30.269017875,18.02515268375,29.281917875,17.94482421875,27.997483875L17.94482421875,7.246370275C17.94482421875,6.032147875,19.124379618749998,5.126370475,20.45460221875,5.126370475L22.12793541875,5.126370475L22.138602218750002,5.526370575C22.14790441875,7.155996275,23.47563411875,8.470001674999999,25.10526891875,8.462370875000001L34.10704621875,8.462370875000001C35.73682621875,8.469508675,37.064411218749996,7.155250075,37.07371321875,5.525481975L37.18660121875,5.125481375L38.85993421875,5.125481375C40.29237921875,5.125481375,41.36971321875,6.030815075,41.36971321875,7.245481475L41.36971321875,28.401923875C41.07641021875,29.507728875,40.05750421875,30.263835875,38.91415821875,30.224147875ZM27.76704601875,13.421037875C27.37507341875,13.016912875,26.72657391875,13.016912875,26.334601418749997,13.421037875L23.87904551875,15.850370875L22.44748971875,14.433926875C22.05595681875,14.028763875,21.40657731875,14.028763875,21.01504511875,14.433926875C20.60587361875,14.817425875,20.60587361875,15.466869875,21.01504511875,15.850370875L23.05949071875,17.874814875C23.05845741875,17.932044875,23.10538391875,17.978566875,23.16260101875,17.977037875C23.219183918749998,17.974988875,23.26588101875,18.020871875,23.26482391875,18.077481875C23.65635581875,18.482642875,24.30573561875,18.482642875,24.69726801875,18.077481875L27.97015721875,14.838815875C28.42443721875,14.427935875,28.31841421875,13.687848875,27.76704601875,13.421037875ZM27.76704601875,19.998815875C27.37551311875,19.593654875,26.72613331875,19.593654875,26.334601418749997,19.998815875L23.87904551875,22.428149875L22.44748971875,21.010369875C22.05595591875,20.605210875,21.40657731875,20.605210875,21.01504511875,21.010369875C20.60547471875,21.394223875,20.60547471875,22.044293875,21.01504511875,22.428149875L23.05949071875,24.452592875C23.05896661875,24.509471875,23.10573861875,24.555438875,23.16260101875,24.553926875C23.21932891875,24.552398875,23.26585721875,24.598519875,23.26482391875,24.655261875C23.65635581875,25.060420875,24.30573561875,25.060420875,24.69726801875,24.655261875L27.97015721875,21.517037875C28.378157218749998,21.113927875,28.378157218749998,20.507260875,27.767046918749998,20.002814875L27.767046918749998,19.998370875L27.76704601875,19.998815875ZM38.12260221875,13.496593875L32.89415821875,13.496593875C32.01108221875,13.554154875,31.324264218750002,14.287201875,31.324264218750002,15.172150875C31.324264218750002,16.057098875,32.01108421875,16.790143875,32.89415821875,16.847704874999998L38.12260221875,16.847704874999998C39.02518621875,16.833244875,39.73615621875,16.073720875,39.69104721875,15.172148875C39.69799421875,14.285016875,39.008262218750005,13.548182875,38.12260221875,13.496593875ZM38.12260221875,20.183259875L32.89415821875,20.183259875C32.01249721875,20.242505875,31.32762721875,20.974942875,31.32762721875,21.858592875C31.327630218750002,22.742242875,32.01249921875,23.474679875,32.89415821875,23.533925875L38.12260221875,23.533925875C39.04142221875,23.558019875,39.77521321875,22.774531875,39.69104721875,21.859258875C39.69778221875,20.972129875,39.00823021875,20.235292875,38.12260221875,20.183259875ZM33.328378218750004,6.798814775L25.98926831875,6.798814775C24.81208661875,6.811668375,23.84158901875,5.879128975,23.80749031875,4.702370175C23.84182641875,3.525786675,24.81225441875,2.593511875,25.98926831875,2.6063706250000003L26.461268418750002,2.6063706250000003C26.68953801875,2.092310075,27.20474621875,1.766140461,27.76704601875,1.77970385551L31.55193621875,1.77970385551C32.113917218750004,1.766503215,32.62868121875,2.092614055,32.856825218750004,2.6063706250000003L33.33015921875,2.6063706250000003C34.50716021875,2.593498345,35.47777521875,3.5253773749999997,35.512825218749995,4.701925975C35.60971421875,5.845481375,34.61815821875,6.798369875,33.32837921875,6.798369875L33.328378218750004,6.798814775Z" fill="#496FFE" fill-opacity="1" style="mix-blend-mode:passthrough"/></g></svg>
\ No newline at end of file
diff --git a/src/assets/system/rukuguanli.svg b/src/assets/system/rukuguanli.svg
new file mode 100644
index 0000000..bb7df01
--- /dev/null
+++ b/src/assets/system/rukuguanli.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="59.5" height="64.90625" viewBox="0 0 59.5 64.90625"><defs><linearGradient x1="0" y1="0.16914062201976776" x2="0.8045321262753937" y2="1.0460527890370677" id="master_svg0_141_37616"><stop offset="48.549023270606995%" stop-color="#F7F7F7" stop-opacity="1"/><stop offset="100%" stop-color="#FFFFFF" stop-opacity="1"/></linearGradient><linearGradient x1="-0.03565644100308418" y1="0" x2="0.8226521556701855" y2="0.9991461352834076" id="master_svg1_141_37562"><stop offset="46.036821603775024%" stop-color="#F3F3F3" stop-opacity="1"/><stop offset="100%" stop-color="#FFFFFF" stop-opacity="1"/></linearGradient><clipPath id="master_svg2_143_35860"><rect x="12.5" y="0" width="34" height="34.000003814697266" rx="0"/></clipPath></defs><path d="M1.204819142818451,28.096379L28.69276814281845,44.307213000000004L58.29516614281845,28.096379L28.69276814281845,14L1.204819142818451,28.096379Z" fill="#FFFFFF" fill-opacity="1"/><path d="M0.16870074281845082,28.065809L28.43877614281845,44.737896L28.68361514281845,44.882288L59.39288714281845,28.065309L28.684561142818453,13.44229615L0.16870074281845082,28.065809ZM28.70192014281845,43.732138L2.240937742818451,28.12695L28.70097614281845,14.55770427L57.19744514281845,28.127449L28.70192014281845,43.732138Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/><path d="M0.5,28.80120277404785L0.5,47.83131777404785L28.692764,64.04215077404785L28.692764,45.01204077404785L0.5,28.80120277404785Z" fill="url(#master_svg0_141_37616)" fill-opacity="1"/><path d="M29.192764,64.90641177404785L29.192764,44.722777774047856L28.941999,44.578587774047854L-5.999999996841865e-8,27.93693918404785L0,48.12058077404785L29.192764,64.90641177404785ZM28.192764,45.30130377404785L28.192764,63.17788877404785L1,47.542054774047855L1,29.66546636404785L28.192764,45.30130377404785Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/><g transform="matrix(-1,0,0,1,118,0)"><path d="M59,28.80120277404785L59,47.12649377404785L88.5,64.00042177404785L88.5,44.26604677404785L59,28.80120277404785Z" fill="url(#master_svg1_141_37562)" fill-opacity="1"/><path d="M89,64.86243677404785L89,43.96362277404785L88.732151,43.82320777404785L58.50000003,27.97454732404785L58.50000003,47.41651177404785L89,64.86243677404785ZM88,44.568469774047855L88,63.13840677404785L59.5,46.836475774047855L59.5,29.627858224047852L88,44.568469774047855Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/></g><g clip-path="url(#master_svg2_143_35860)"><path d="M35.790823312499995,24.330472625L40.532228312499996,24.330472625C41.1830103125,24.330472625,41.7109393125,24.858400625,41.7109393125,25.509183625L41.7109393125,27.893161625C41.7109393125,28.543947625,41.1830103125,29.071872625,40.532228312499996,29.071872625L35.790823312499995,29.071872625L35.790823312499995,30.483011625C35.790823312499995,31.469142625,34.6519513125,32.020316625,33.8783243125,31.409372625L29.0505873125,27.587697625C28.4496093125,27.112893625,28.4529313125,26.203126625,29.0572293125,25.731641625L33.8849623125,21.963086625C34.658598312500004,21.358793625,35.790823312499995,21.909965625,35.790823312499995,22.892774625L35.790823312499995,24.330472625ZM27.028485312500003,5.268882525L17.2591470125,13.108853325C16.3131175025,13.868049625,15.7626953125,15.015515625,15.7626953125,16.228507625L15.7626953125,26.801757625C15.7626953125,29.010896625,17.5535564125,30.801757625,19.7626958125,30.801757625L29.9935593125,30.801757625L27.8519553125,29.105081625C27.0982433125,28.507425625,26.6666033125,27.614259625,26.6699233125,26.651368625C26.6732453125,25.688478625,27.1115253125,24.798635625,27.868557312500002,24.207618625L32.6962933125,20.439060625C33.250789312500004,20.004102625,33.9115273125,19.778322625,34.6087933125,19.778322625C36.159378312499996,19.778322625,37.4476603125,20.913871625,37.6867213125,22.394727625L42.5277363125,22.394727625C42.796682312499996,22.394727625,43.052347312500004,22.441215625,43.3013703125,22.504300625L43.3013703125,16.228507625C43.3013703125,15.015515625,42.7509483125,13.868049625,41.8049183125,13.108853325L32.0355813125,5.268882725C30.5729253125,4.095089075,28.4911423125,4.095089075,27.028485312500003,5.268882525M23.8476562125,28.381252625L18.4587896125,28.381252625L18.4587896125,22.989066625L23.8509788125,22.989066625L23.8509788125,28.381252625L23.8476562125,28.381252625ZM23.8476562125,20.422456625L18.4587896125,20.422456625L18.4587896125,15.030274625L23.8509788125,15.030274625L23.8509788125,20.422456625L23.8476562125,20.422456625Z" fill="#496FFE" fill-opacity="1" style="mix-blend-mode:passthrough"/></g></svg>
\ No newline at end of file
diff --git a/src/assets/system/shengchandingdan.svg b/src/assets/system/shengchandingdan.svg
new file mode 100644
index 0000000..8e3ff7f
--- /dev/null
+++ b/src/assets/system/shengchandingdan.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="59.5" height="62.90625" viewBox="0 0 59.5 62.90625"><defs><linearGradient x1="0" y1="0.16914062201976776" x2="0.8045321262753937" y2="1.0460527890370677" id="master_svg0_141_37616"><stop offset="48.549023270606995%" stop-color="#F7F7F7" stop-opacity="1"/><stop offset="100%" stop-color="#FFFFFF" stop-opacity="1"/></linearGradient><linearGradient x1="-0.03565644100308418" y1="0" x2="0.8226521556701855" y2="0.9991461352834076" id="master_svg1_141_37562"><stop offset="46.036821603775024%" stop-color="#F3F3F3" stop-opacity="1"/><stop offset="100%" stop-color="#FFFFFF" stop-opacity="1"/></linearGradient><clipPath id="master_svg2_143_35796"><rect x="15" y="0" width="31" height="31" rx="0"/></clipPath></defs><path d="M1.204819142818451,26.096379L28.69276814281845,42.307213000000004L58.29516614281845,26.096379L28.69276814281845,12L1.204819142818451,26.096379Z" fill="#FFFFFF" fill-opacity="1"/><path d="M0.16870074281845082,26.065809L28.43877614281845,42.737896L28.68361514281845,42.882288L59.39288714281845,26.065309L28.684561142818453,11.44229615L0.16870074281845082,26.065809ZM28.70192014281845,41.732138L2.240937742818451,26.12695L28.70097614281845,12.55770427L57.19744514281845,26.127449L28.70192014281845,41.732138Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/><path d="M0.5,26.80120277404785L0.5,45.83131777404785L28.692764,62.042150774047855L28.692764,43.01204077404785L0.5,26.80120277404785Z" fill="url(#master_svg0_141_37616)" fill-opacity="1"/><path d="M29.192764,62.906411774047854L29.192764,42.722777774047856L28.941999,42.578587774047854L-5.999999996841865e-8,25.93693918404785L0,46.12058077404785L29.192764,62.906411774047854ZM28.192764,43.30130377404785L28.192764,61.17788877404785L1,45.542054774047855L1,27.66546636404785L28.192764,43.30130377404785Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/><g transform="matrix(-1,0,0,1,118,0)"><path d="M59,26.80120277404785L59,45.12649377404785L88.5,62.00042177404785L88.5,42.26604677404785L59,26.80120277404785Z" fill="url(#master_svg1_141_37562)" fill-opacity="1"/><path d="M89,62.86243677404785L89,41.96362277404785L88.732151,41.82320777404785L58.50000003,25.97454732404785L58.50000003,45.41651177404785L89,62.86243677404785ZM88,42.568469774047855L88,61.13840677404785L59.5,44.836475774047855L59.5,27.627858224047852L88,42.568469774047855Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/></g><g clip-path="url(#master_svg2_143_35796)"><path d="M41.009501,2.634513605C38.250498,2.634513605,36.018496999999996,4.122513425,36.018496999999996,5.9515133250000005C36.018496999999996,7.191513025,37.0105,8.245513425,38.498497,8.834512725C38.436499,9.237513025,38.281496000000004,9.671513125,38.033497,10.136512725C38.033497,10.136512725,39.428499,10.012512725,40.141498999999996,9.237512625C40.420497999999995,9.268512225,40.699499,9.299512825,41.009501,9.299512825C43.768496999999996,9.299512825,46.0005,7.811512425,46.0005,5.982512724999999C46.0005,4.122513025,43.768496999999996,2.634513143,41.009501,2.634513605ZM38.994499000000005,6.416513425C38.591497000000004,6.416513425,38.281498,6.106513525,38.281498,5.703513425000001C38.281498,5.3005135249999995,38.591497000000004,4.990513325,38.994499000000005,4.990513325C39.397501,4.990513325,39.707499,5.3005135249999995,39.707499,5.703513425000001C39.707499,6.0755131250000005,39.366499000000005,6.416513425,38.994499000000005,6.416513425ZM41.133500999999995,6.416513425C40.730498999999995,6.416513425,40.420497999999995,6.106513525,40.420497999999995,5.703513425000001C40.420497999999995,5.3005135249999995,40.730498999999995,4.990513325,41.133500999999995,4.990513325C41.536499,4.990513325,41.846498,5.3005135249999995,41.846498,5.703513425000001C41.846498,6.0755131250000005,41.505499,6.416513425,41.133500999999995,6.416513425ZM43.272501,6.416513425C42.869499000000005,6.416513425,42.5595,6.106513525,42.5595,5.703513425000001C42.5595,5.3005135249999995,42.869499000000005,4.990513325,43.272501,4.990513325C43.675499,4.990513325,43.985498,5.3005135249999995,43.985498,5.703513425000001C43.985498,6.0755131250000005,43.644498999999996,6.416513425,43.272501,6.416513425ZM24.9825001,20.335512625C25.478499,20.180513625,25.9745,19.932514625,26.408499,19.684512625C26.594501,19.560512625,26.718499,19.467510625,26.780499,19.343513625C26.842501,19.250511625,26.8735,19.095512625,26.904501,18.909513625C26.873500999999997,18.754514625,26.842501,18.599513625,26.842501,18.506513625C26.842501,18.413512625,26.811501,18.320512625,26.780499,18.258511625C26.749499999999998,18.196513625,26.6875,18.134511625000002,26.625500000000002,18.072512625C26.563499,18.010514625,26.4705,17.917513624999998,26.346499,17.824512625C26.2225,17.731510625,26.098501,17.576512625,26.005499999999998,17.359513624999998C25.912499,17.142513625,25.819499999999998,16.925514624999998,25.7575,16.739514624999998C25.695498999999998,16.491513625,25.633499,16.243514625,25.5405,15.964514625C25.447499999999998,15.933514625,25.3235,15.871514625,25.2305,15.747513625C25.1375,15.654513625,25.0445004,15.530512625,24.9514999,15.375512625C24.8585014,15.220513625,24.7655001,15.003514625,24.6724997,14.724513625C24.5795012,14.445513625,24.5485001,14.197513625,24.5795012,13.980514625C24.610499400000002,13.763513625,24.6415005,13.546514625,24.7035007,13.391513625C24.765501,13.205513625,24.8585014,13.019513625,25.0135012,12.895513625C25.0135012,12.306513825,25.0445004,11.717514025,25.1375,11.097515125C25.2305,10.601513825,25.354501,10.074514425,25.509501,9.485514625C25.6645,8.896514925,25.943500999999998,8.369514425,26.2845,7.904515225C26.563499999999998,7.532515525,26.873500999999997,7.160514825,27.2455,6.788515125C27.6175,6.416515125,27.958501,6.137515325,28.268499,5.951514925C28.1755,5.641515025,28.0825,5.331515325,28.020501,5.083515425C27.958501,4.835515525,27.8345,4.5565153249999995,27.5865,4.2775156249999995C27.2455,3.874515725,26.749499999999998,3.5025157350000002,26.067500000000003,3.130515695C25.385502000000002,2.758515705,24.6105013,2.603515625,23.7735014,2.603515625C23.4325008,2.603515625,23.0915012,2.634515684,22.7195001,2.665515512C22.3475003,2.727515395,22.0065007,2.820515585,21.665499699999998,2.944515375C21.3244996,3.099515435,20.983500499999998,3.285515305,20.6424999,3.533515335C20.301499800000002,3.781515525,19.9915004,4.122515325,19.7125006,4.525515325C19.4025002,4.959515325,19.1855001,5.424515025,19.0304999,5.951514925C18.8755002,6.4785151249999995,18.7825,6.974514925,18.6894999,7.439515125C18.6275001,7.997515725,18.5964999,8.555515725,18.6275001,9.082515225C18.5035,9.206515325,18.4105,9.361515525,18.3485,9.547515425C18.2865002,9.702514625,18.2245002,9.888515025,18.2245002,10.105515024999999C18.1934998,10.322515025000001,18.2555001,10.539514525000001,18.3175001,10.787514725C18.4104998,11.035512925,18.5034997,11.221514725,18.5964999,11.345515225C18.6894999,11.469514825,18.7825,11.593514425,18.8755002,11.655514725C18.9685004,11.717514025,19.0925002,11.779515225,19.1855001,11.810515425C19.2475004,12.058512725,19.3095007,12.306513825,19.4025006,12.492514625C19.4645004,12.678514625,19.557500400000002,12.864513625,19.6505008,13.050515625C19.7435007,13.236513625,19.8675003,13.360515625,19.9915004,13.453514625C20.2395,13.670513625,20.4565005,13.856515625,20.6424999,14.042514625C20.8285003,14.228514625,20.9525008,14.507514625,20.983501,14.848514625C21.0145001,15.065514625,21.0145001,15.282513625,21.0145001,15.468516625C21.0145001,15.654515625,20.983501,15.840515625,20.9215002,16.026515625000002C20.8595004,16.212514625,20.7355008,16.367514625,20.5805006,16.553516625C20.4255004,16.708515625,20.1775002,16.925516625,19.8674998,17.111516625C19.4645,17.359516624999998,19.0304999,17.545515625,18.5345001,17.669515625000003C18.0384998,17.793516625000002,17.5424998,17.948516625,17.0775001,18.103517625000002C16.6124998,18.258515625,16.1785001,18.475516624999997,15.837499919999999,18.754516625C15.49650002,19.033515625,15.27950002,19.436517625,15.18649999,19.963516625C15.062499985564498,20.924516625,15.031499993,21.699516625,15.09349999,22.288516625C15.155499987,22.877515625,15.27950002,23.249513625,15.43449998,23.373515625C15.5275,23.466518625,15.77549994,23.528514625,16.1785001,23.621517625C16.5814999,23.714517625,17.0465,23.776515625,17.6045001,23.869516625C18.1624997,23.962518625,18.7825,24.024518625,19.4645,24.086519625C20.1465001,24.148517625,20.8285003,24.210517625,21.479500299999998,24.272518625C21.510500399999998,24.241519625,21.510500399999998,24.210517625,21.5415006,24.179517625C21.5725002,24.148517625,21.5725002,24.117519625,21.6035004,24.086515625C21.6345005,23.931516625,21.6345005,23.776515625,21.6345005,23.590516625C21.6345005,23.404518625,21.6655006,23.218515625,21.6965003,23.032514625C21.7895012,22.412517625,22.0065007,21.947515625,22.3475003,21.606515625C22.6885009,21.265518625,23.091499300000002,21.017516625,23.556501400000002,20.800517625C23.9905005,20.707515625,24.4865007,20.521516625,24.9825001,20.335512625Z" fill="#3BB078" fill-opacity="1" style="mix-blend-mode:passthrough"/><path d="M40.48196953125,23.59297175C40.35796753125,23.22097175,40.109968531250004,22.91097275,39.79996853125,22.66297375C39.48996953125,22.41497375,39.11797053125,22.22897475,38.71496853125,22.07397375C38.31196653125,21.91897375,37.90896753125,21.79497375,37.47496753125,21.67097375C37.040967531250004,21.546972750000002,36.63796753125,21.42297375,36.296967531250004,21.26797275C35.893968531249996,21.11297275,35.58396853125,20.92697475,35.33596753125,20.74097175C35.11896653125,20.52397175,34.93296753125,20.33797275,34.83996853125,20.08997175C34.74696753125,19.87297075,34.68496753125,19.65597175,34.68496753125,19.40797175C34.68496753125,19.19097175,34.68496753125,18.94297075,34.71596853125,18.725970750000002C34.74696753125,18.57097075,34.80896953125,18.41597075,34.87096853125,18.29197075C34.93296753125,18.16797175,34.99496853125,18.07496975,35.08796853125,17.98197175L35.36696953125,17.70297175C35.49096853125,17.609969749999998,35.61497053125,17.51697175,35.73896953125,17.39297075C35.86296953125,17.29997075,35.95597053125,17.175970749999998,36.07996853125,16.989970749999998C36.172969531250004,16.803971750000002,36.265968531249996,16.617970749999998,36.32796953125,16.43197155C36.38996853125,16.21496965,36.45197053125,15.99797055,36.54497053125,15.74997045C36.69997053125,15.71897025,36.82397053125,15.62597085,36.94797053125,15.53296945C37.04097153125,15.43996905,37.16497253125,15.28496935,37.25797053125,15.09896945C37.350971531249996,14.91296765,37.41297053125,14.66496945,37.47497053125,14.35496955C37.50597053125,14.106969849999999,37.50597053125,13.920969450000001,37.47497053125,13.76596975C37.44397153125,13.61096955,37.38197153125,13.48696945,37.31997153125,13.36296935C37.25797153125,13.23896885,37.16497253125,13.14596935,37.10297153125,13.08396915C37.13397053125,12.49496885,37.07197153125,11.93696925,37.00996953125,11.34796905C36.916969531250004,10.85196925,36.79296953125,10.324969750000001,36.60696953125,9.766969249999999C36.42097053125,9.20896915,36.14196953125,8.68196945,35.76996953125,8.21696885C35.45997053125,7.81396865,34.93296853125,7.44196874,34.28196953125,7.06996888C33.59996953125,6.69796906,32.82497023125,6.54296875,31.95697023125,6.54296875C31.64697073125,6.54296875,31.30596923125,6.573968815,30.93396993125,6.604968879C30.56197023125,6.66696901,30.22097063125,6.75996874,29.84897093125,6.88396898C29.47697063125,7.03896886,29.13597063125,7.22496873,28.79497053125,7.47296876C28.45396993125,7.72096885,28.143970531249998,8.06196915,27.86497073125,8.46496855C27.554970731250002,8.89896845,27.33797073125,9.39496855,27.182970731250002,9.89096855C27.02797103125,10.417968049999999,26.934971131250002,10.913968050000001,26.87297103125,11.37896875C26.81097103125,11.93696925,26.77997133125,12.49496885,26.81097103125,13.021969349999999C26.68697073125,13.14596935,26.59397073125,13.30096915,26.53197073125,13.48696895C26.46997073125,13.610968549999999,26.40797063125,13.796967949999999,26.40797063125,14.01396845C26.37697103125,14.23096795,26.43897013125,14.447968450000001,26.50097013125,14.69596955C26.59397003125,14.94396785,26.68697073125,15.12996865,26.77997043125,15.25397015C26.87297033125,15.37796975,26.96597103125,15.50196835,27.05897043125,15.56396865C27.15197013125,15.62596795,27.275970431250002,15.68797015,27.36897043125,15.71896835C27.43097023125,15.96696945,27.49297043125,16.21496775,27.58596993125,16.40096955C27.64797063125,16.58696975,27.740970131250002,16.77296975,27.83396963125,16.95896875C27.926969531250002,17.14496875,28.01996993125,17.299969750000002,28.14396953125,17.39296975C28.39196873125,17.57896975,28.60896923125,17.76496975,28.79496913125,17.95096975C29.01196953125,18.13696975,29.10496953125,18.415969750000002,29.16696933125,18.75697075C29.19796893125,19.00497175,29.19796893125,19.22197075,29.19796893125,19.40797175C29.19796893125,19.59397075,29.16696933125,19.77997275,29.07396843125,19.934971750000003C29.01196813125,20.08997175,28.88796803125,20.27597175,28.70196913125,20.43097075C28.54696893125,20.58597175,28.29896883125,20.802972750000002,27.98896883125,20.98897075C27.58596853125,21.236971750000002,27.15196823125,21.422970749999998,26.65596843125,21.54697175C26.15996813125,21.67097275,25.66396833125,21.82597275,25.19896863125,21.980970749999997C24.73396893125,22.13597075,24.29996903125,22.38397175,23.95896882125,22.63197375C23.61796862125,22.91097275,23.40096862125,23.31397475,23.30796889125,23.84097075C23.18396863345,24.77097175,23.15296903225,25.54597075,23.24596876325,26.13497175C23.33896848125,26.72397075,23.43196915125,27.09597175,23.58696902125,27.21997275C23.67996874125,27.28197075,23.86596912125,27.37497175,24.20696933125,27.43697375C24.54796953125,27.49897175,24.950969131249998,27.59197475,25.41596933125,27.65397275C25.91196943125,27.71597275,26.43896933125,27.80897375,26.99696943125,27.87097575C27.58596943125,27.93297175,28.17496923125,27.99497375,28.76396993125,28.02597475C29.352969631249998,28.08797475,29.94196983125,28.11897475,30.46897033125,28.14997675C31.026969431250002,28.18097475,31.52297023125,28.21197275,31.92597003125,28.21197275C32.32897093125,28.21197275,32.85596943125,28.18097475,33.41397053125,28.14997675C33.97196953125,28.11897475,34.56097053125,28.08797675,35.14997053125,28.02597475C35.73896953125,27.96397575,36.35896853125,27.90197375,36.94797053125,27.83997575C37.53697053125,27.77797475,38.094971531249996,27.68497475,38.59097053125,27.59197475C39.08696753125,27.49897375,39.48996953125,27.40597575,39.83096853125,27.31297675C40.17197253125,27.21997475,40.35797153125,27.09597575,40.41997153125,27.00297575C40.51297153125,26.84797475,40.60597053125,26.63097375,40.63697053125,26.32097675C40.69896853125,26.01097475,40.69896853125,25.70097575,40.69896853125,25.32897375C40.69896853125,24.98797375,40.66797253125,24.64697475,40.63697053125,24.30597475C40.60597453125,24.11997375,40.54397053125,23.84097675,40.48196953125,23.59297175Z" fill="#3BB078" fill-opacity="1" style="mix-blend-mode:passthrough"/></g></svg>
\ No newline at end of file
diff --git a/src/assets/system/shengchanheduan.svg b/src/assets/system/shengchanheduan.svg
new file mode 100644
index 0000000..55d6f9e
--- /dev/null
+++ b/src/assets/system/shengchanheduan.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="59.5" height="63.90625" viewBox="0 0 59.5 63.90625"><defs><linearGradient x1="0" y1="0.16914062201976776" x2="0.8045321262753937" y2="1.0460527890370677" id="master_svg0_141_37616"><stop offset="48.549023270606995%" stop-color="#F7F7F7" stop-opacity="1"/><stop offset="100%" stop-color="#FFFFFF" stop-opacity="1"/></linearGradient><linearGradient x1="-0.03565644100308418" y1="0" x2="0.8226521556701855" y2="0.9991461352834076" id="master_svg1_141_37562"><stop offset="46.036821603775024%" stop-color="#F3F3F3" stop-opacity="1"/><stop offset="100%" stop-color="#FFFFFF" stop-opacity="1"/></linearGradient><clipPath id="master_svg2_143_35834"><rect x="14" y="0" width="31" height="31" rx="0"/></clipPath></defs><path d="M1.204819142818451,27.096379L28.69276814281845,43.307213000000004L58.29516614281845,27.096379L28.69276814281845,13L1.204819142818451,27.096379Z" fill="#FFFFFF" fill-opacity="1"/><path d="M0.16870074281845082,27.065809L28.43877614281845,43.737896L28.68361514281845,43.882288L59.39288714281845,27.065309L28.684561142818453,12.44229615L0.16870074281845082,27.065809ZM28.70192014281845,42.732138L2.240937742818451,27.12695L28.70097614281845,13.55770427L57.19744514281845,27.127449L28.70192014281845,42.732138Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/><path d="M0.5,27.80120277404785L0.5,46.83131777404785L28.692764,63.042150774047855L28.692764,44.01204077404785L0.5,27.80120277404785Z" fill="url(#master_svg0_141_37616)" fill-opacity="1"/><path d="M29.192764,63.906411774047854L29.192764,43.722777774047856L28.941999,43.578587774047854L-5.999999996841865e-8,26.93693918404785L0,47.12058077404785L29.192764,63.906411774047854ZM28.192764,44.30130377404785L28.192764,62.17788877404785L1,46.542054774047855L1,28.66546636404785L28.192764,44.30130377404785Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/><g transform="matrix(-1,0,0,1,118,0)"><path d="M59,27.80120277404785L59,46.12649377404785L88.5,63.00042177404785L88.5,43.26604677404785L59,27.80120277404785Z" fill="url(#master_svg1_141_37562)" fill-opacity="1"/><path d="M89,63.86243677404785L89,42.96362277404785L88.732151,42.82320777404785L58.50000003,26.97454732404785L58.50000003,46.41651177404785L89,63.86243677404785ZM88,43.568469774047855L88,62.13840677404785L59.5,45.836475774047855L59.5,28.627858224047852L88,43.568469774047855Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/></g><g clip-path="url(#master_svg2_143_35834)"><path d="M38.21875,2.90625L20.78125,2.90625C19.71562505,2.90625,18.84375,3.77812505,18.84375,4.84375L18.84375,6.78125L20.78125,6.78125C21.8468752,6.78125,22.71875,7.6531253,22.71875,8.71875C22.71875,9.7843752,21.8468752,10.65625,20.78125,10.65625L18.84375,10.65625L18.84375,13.5625L20.78125,13.5625C21.8468752,13.5625,22.71875,14.434375,22.71875,15.5C22.71875,16.565625,21.8468752,17.4375,20.78125,17.4375L18.84375,17.4375L18.84375,20.34375L20.78125,20.34375C21.8468752,20.34375,22.71875,21.215626,22.71875,22.28125C22.71875,23.346876,21.8468752,24.21875,20.78125,24.21875L18.84375,24.21875L18.84375,26.15625C18.84375,27.221876,19.71562505,28.09375,20.78125,28.09375L38.21875,28.09375C39.284376,28.09375,40.15625,27.221876,40.15625,26.15625L40.15625,4.84375C40.15625,3.77812505,39.284376,2.90625,38.21875,2.90625Z" fill="#496FFE" fill-opacity="1" style="mix-blend-mode:passthrough"/><path d="M33.12253475625,13.77256255L34.31409645625,13.77256255L34.31409645625,15.38262465L32.30103305625,15.38262465L31.88446995625,16.18668745L31.88446995625,17.00818685L34.31409455625,17.00818685L34.31409455625,18.616312049999998L31.88350005625,18.616312049999998L31.88350005625,20.88803025L29.66215705625,20.88803025L29.66215705625,18.617280049999998L27.21509462625,18.617280049999998L27.21509462625,17.00818685L29.66215705625,17.00818685L29.66215705625,16.18668745L29.24268885625,15.38262465L27.21509557625,15.38262465L27.21509557625,13.77256255L28.42215825625,13.77256255L26.21728515625,9.42578125L28.64884805625,9.42578125L30.77234835625,14.06124975L32.89778615625,9.42578125L35.31190965625,9.42578125L33.12253475625,13.77256255Z" fill="#FFFFFF" fill-opacity="1" style="mix-blend-mode:passthrough"/><path d="M20.78125,9.6875L16.90625,9.6875C16.37343752,9.6875,15.9375,9.2515626,15.9375,8.71875C15.9375,8.18593732,16.37343752,7.75,16.90625,7.75L20.78125,7.75C21.3140626,7.75,21.75,8.18593732,21.75,8.71875C21.75,9.2515626,21.3140626,9.6875,20.78125,9.6875ZM20.78125,16.46875L16.90625,16.46875C16.37343752,16.46875,15.9375,16.0328121,15.9375,15.5C15.9375,14.967187899999999,16.37343752,14.53125,16.90625,14.53125L20.78125,14.53125C21.3140626,14.53125,21.75,14.9671874,21.75,15.5C21.75,16.0328121,21.3140626,16.46875,20.78125,16.46875ZM20.78125,23.25L16.90625,23.25C16.37343752,23.25,15.9375,22.814062,15.9375,22.28125C15.9375,21.748438,16.37343752,21.3125,16.90625,21.3125L20.78125,21.3125C21.3140626,21.3125,21.75,21.748438,21.75,22.28125C21.75,22.814062,21.3140626,23.25,20.78125,23.25Z" fill="#496FFE" fill-opacity="1" style="mix-blend-mode:passthrough"/></g></svg>
\ No newline at end of file
diff --git a/src/assets/system/shengchanpaichan.svg b/src/assets/system/shengchanpaichan.svg
new file mode 100644
index 0000000..0165a7b
--- /dev/null
+++ b/src/assets/system/shengchanpaichan.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="59.5" height="64.90625" viewBox="0 0 59.5 64.90625"><defs><linearGradient x1="0" y1="0.16914062201976776" x2="0.8045321262753937" y2="1.0460527890370677" id="master_svg0_141_37616"><stop offset="48.549023270606995%" stop-color="#F7F7F7" stop-opacity="1"/><stop offset="100%" stop-color="#FFFFFF" stop-opacity="1"/></linearGradient><linearGradient x1="-0.03565644100308418" y1="0" x2="0.8226521556701855" y2="0.9991461352834076" id="master_svg1_141_37562"><stop offset="46.036821603775024%" stop-color="#F3F3F3" stop-opacity="1"/><stop offset="100%" stop-color="#FFFFFF" stop-opacity="1"/></linearGradient><clipPath id="master_svg2_143_35806"><rect x="14.5" y="0" width="32" height="32" rx="0"/></clipPath></defs><path d="M1.204819142818451,28.096379L28.69276814281845,44.307213000000004L58.29516614281845,28.096379L28.69276814281845,14L1.204819142818451,28.096379Z" fill="#FFFFFF" fill-opacity="1"/><path d="M0.16870074281845082,28.065809L28.43877614281845,44.737896L28.68361514281845,44.882288L59.39288714281845,28.065309L28.684561142818453,13.44229615L0.16870074281845082,28.065809ZM28.70192014281845,43.732138L2.240937742818451,28.12695L28.70097614281845,14.55770427L57.19744514281845,28.127449L28.70192014281845,43.732138Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/><path d="M0.5,28.80120277404785L0.5,47.83131777404785L28.692764,64.04215077404785L28.692764,45.01204077404785L0.5,28.80120277404785Z" fill="url(#master_svg0_141_37616)" fill-opacity="1"/><path d="M29.192764,64.90641177404785L29.192764,44.722777774047856L28.941999,44.578587774047854L-5.999999996841865e-8,27.93693918404785L0,48.12058077404785L29.192764,64.90641177404785ZM28.192764,45.30130377404785L28.192764,63.17788877404785L1,47.542054774047855L1,29.66546636404785L28.192764,45.30130377404785Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/><g transform="matrix(-1,0,0,1,118,0)"><path d="M59,28.80120277404785L59,47.12649377404785L88.5,64.00042177404785L88.5,44.26604677404785L59,28.80120277404785Z" fill="url(#master_svg1_141_37562)" fill-opacity="1"/><path d="M89,64.86243677404785L89,43.96362277404785L88.732151,43.82320777404785L58.50000003,27.97454732404785L58.50000003,47.41651177404785L89,64.86243677404785ZM88,44.568469774047855L88,63.13840677404785L59.5,46.836475774047855L59.5,29.627858224047852L88,44.568469774047855Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/></g><g clip-path="url(#master_svg2_143_35806)"><path d="M25.2873048875,20.756252C25.2873048875,19.415625,25.5498046875,18.115626,26.0685548875,16.890625999999997C26.5685548875,15.706251,27.284178687500003,14.646876,28.1966796875,13.734375C29.1091806875,12.8218746,30.1685546875,12.1062508,31.3529306875,11.6062508C32.5779306875,11.0875001,33.8779296875,10.8250008,35.2185556875,10.8250008C36.5591816875,10.8250008,37.8591806875,11.0875001,39.0841806875,11.6062508C39.4623066875,11.765625,39.8248066875,11.9468746,40.1779306875,12.1499996L40.1779306875,3.90000015C40.1779306875,3.47187522,39.831058687500004,3.125,39.4029316875,3.125L31.9779286875,3.125C31.9935536875,3.196875095,31.9998046875,3.26874995,31.9998046875,3.34375001L31.9998046875,7.5062499C31.9998046875,8.1062503,31.5123046875,8.593749500000001,30.9123046875,8.593749500000001L26.846678687500003,8.593749500000001C26.2466792875,8.593749500000001,25.7591800875,8.1062493,25.7591800875,7.5062499L25.7591800875,3.34687544C25.7591800875,3.27187538,25.765430487499998,3.200000525,25.781055487499998,3.1281254294L18.3560545475,3.1281254294C17.9279296075,3.1281254294,17.5810546875,3.47500041,17.5810546875,3.90312535L17.5810546875,25.046877C17.5810546875,25.475,17.9279296075,25.821877,18.3560547275,25.821877L26.674805687499997,25.821877C26.446680987500002,25.437502,26.243555987500002,25.0375,26.0685557875,24.625002C25.5498056875,23.396875,25.2873057875,22.096874,25.2873048875,20.756252ZM35.2185556875,12.7000017C30.768552687499998,12.7000017,27.1623048875,16.30625,27.1623048875,20.756248C27.1623048875,25.206247,30.768552687499998,28.812502,35.2185556875,28.812502C39.6685566875,28.812502,43.2748026875,25.206249,43.2748026875,20.756252C43.2748026875,16.306252,39.6685566875,12.7000017,35.2185556875,12.7000017ZM38.7248036875,21.868752C37.8185536875,22.775002,36.5091776875,23.0375,35.3716816875,22.65625L33.2310546875,24.796877C32.6654306875,25.362499,31.7435556875,25.362499,31.1779296875,24.796877C30.612302687499998,24.231253,30.612305687499997,23.309378,31.1779296875,22.743752L33.3185536875,20.603125C32.9373046875,19.465628,33.1966786875,18.156250999999997,34.1060566875,17.250000999999997C35.0841786875,16.271876,36.5248066875,16.043751999999998,37.7185556875,16.562500999999997L35.6216816875,18.659374L35.9623066875,20L37.315427687500005,20.353125L39.4123036875,18.256251C39.9310526875,19.453125,39.6998066875,20.893751,38.7248036875,21.868752ZM31.846677687499998,23.475C31.846179687499998,23.836065,32.1387386875,24.129026,32.4998026875,24.129026C32.8608656875,24.129026,33.153425687500004,23.836065,33.1529276875,23.475C33.153425687500004,23.113937,32.8608656875,22.820976,32.4998026875,22.820976C32.1387386875,22.820976,31.8461786875,23.113937,31.846677687499998,23.475Z" fill="#496FFE" fill-opacity="1" style="mix-blend-mode:passthrough"/></g></svg>
\ No newline at end of file
diff --git a/src/assets/system/shengchanpeizhi.svg b/src/assets/system/shengchanpeizhi.svg
new file mode 100644
index 0000000..ea6690b
--- /dev/null
+++ b/src/assets/system/shengchanpeizhi.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="89.5693359375" height="96" viewBox="0 0 89.5693359375 96"><defs><filter id="master_svg0_143_35998" filterUnits="objectBoundingBox" color-interpolation-filters="sRGB" x="-0.6666666666666666" y="-0.6666666666666666" width="2.3333333333333335" height="2.3333333333333335"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"/><feOffset dy="0" dx="0"/><feGaussianBlur stdDeviation="8"/><feColorMatrix type="matrix" values="0 0 0 0 0.12895070016384125 0 0 0 0 0.29307788610458374 0 0 0 0 0.9107142686843872 0 0 0 0.5299999713897705 0"/><feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow"/><feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow" result="shape"/></filter><clipPath id="master_svg1_143_36001"><rect x="33.78466796875" y="35" width="24" height="24" rx="0"/></clipPath></defs><path d="M44.78466796875,24.000000000000004L65.56927496875,36L65.56927496875,60L44.78466796875,72L24.00005836875,60L24.00005796875,36.000001L44.78466796875,24.000000000000004Z" fill="#496FFE" fill-opacity="1" filter="url(#master_svg0_143_35998)"/><g clip-path="url(#master_svg1_143_36001)"><path d="M47.28466896875,59.000001999999995L36.49966816875,59.000001999999995C35.83063894875,59.000834999999995,35.28714856525,58.46003,35.28466796875,57.791002L35.28466796875,39.9020004C35.28796181125,39.2333269,35.83096992875,38.6930003,36.49966816875,38.6930003L38.24566816875,38.6930003L38.24566816875,43.6130009L51.271669968750004,43.6130009L51.271669968750004,38.6930003L53.01767196875,38.6930003C53.68817096875,38.6930003,54.23267196875,39.2359996,54.23267196875,39.902L54.23267196875,45.908001C50.739634968749996,44.6980333,46.885882968749996,46.213699,45.15295886875,49.479017999999996C43.420036268749996,52.744337,44.32480906875,56.785379,47.28466896875,59.000001999999995ZM50.08666996875,42.3755007L39.42916826875,42.3755007L39.42916826875,38.3915005C39.42916826875,37.5455,40.02766896875,36.8585002,40.76266856875,36.8585002L42.13816836875,36.8585002C42.63016936875,35.73050004,43.63966936875,35,44.75866886875,35C45.87616896875,35,46.88566996875,35.73050004,47.37766896875,36.8585002L48.75466996875,36.8585002C49.489668968749996,36.8585002,50.08666996875,37.5455003,50.08666996875,38.3915005L50.08666996875,42.3755007ZM38.24566816875,47.9075C38.24566816875,48.237501,38.51566836875,48.522501,38.84566856875,48.522501L44.15716836875,48.522501C44.49682516875,48.522501,44.77217006875,48.247156000000004,44.77217006875,47.9075C44.77217006875,47.567845,44.49682516875,47.292500000000004,44.15716836875,47.292500000000004L38.84716846875,47.292500000000004C38.51279706875,47.299842,38.24558806875,47.573049,38.24566816875,47.9075ZM38.24566816875,52.824503C38.24566816875,53.154503,38.51866816875,53.439501,38.85616846875,53.439501L42.96466876875,53.439501C43.30120946875,53.433825999999996,43.57196616875,53.161074,43.57516856875,52.824503C43.57516856875,52.494501,43.30216886875,52.209501,42.96466876875,52.209501L38.85466856875,52.209501C38.51812866875,52.215178,38.24737286875,52.48793,38.24416856875,52.824503L38.24566816875,52.824503ZM42.09316876875,40.5320001C42.59357406875,40.5229702,42.99186656875,40.1099033,42.98266936875,39.6095004C42.99102686875,39.1096783,42.59297896875,38.6975336,42.09316876875,38.6884999C41.59394886875,38.6983497,41.19680456875,39.1102533,41.20516876875,39.6095004C41.20516876875,40.1195002,41.60266826875,40.5320001,42.09316876875,40.5320001ZM47.42266896875,40.5320001C47.922485968749996,40.5221539,48.31987196875,40.1093283,48.31066996875,39.6095004C48.31903496875,39.1102524,47.92188996875,38.6983497,47.42266896875,38.6884999C46.923450968750004,38.6983497,46.52630596875,39.1102533,46.53466896875,39.6095004C46.53466896875,40.1195002,46.93217096875,40.5320001,47.42266896875,40.5320001ZM51.784669968749995,59.000001999999995C48.470961968750004,59.000001999999995,45.78466896875,56.313713,45.78466896875,53.000001999999995C45.78466896875,49.686294000000004,48.470961968750004,47.000001,51.784669968749995,47.000001C55.09838096875,47.000001,57.784669968749995,49.686294000000004,57.784669968749995,53.000001999999995C57.784669968749995,56.313713,55.09838096875,59.000001999999995,51.784669968749995,59.000001999999995ZM55.41616996875,51.002003L55.41616996875,48.539001L52.099668968749995,48.539001L52.099668968749995,49.355001L50.64466996875,49.355001L50.64466996875,55.919001L52.09216896875,55.919001L52.09216896875,57.153503L55.402669968750004,57.153503L55.402669968750004,54.630500999999995L52.09216896875,54.630500999999995L52.09216896875,55.095501L51.379668968749996,55.095501L51.379668968749996,50.153001L52.099668968749995,50.153001L52.099668968749995,51.002001L55.41767096875,51.002001L55.41616996875,51.002003ZM50.259168968750004,52.160002C50.00266996875,51.680004,50.005670968749996,51.672504,50.005670968749996,51.672504C50.005670968749996,51.672504,49.12067096875,51.950002999999995,48.95566996875,51.000502L48.442669968749996,51.000502C48.442669968749996,51.000502,48.30166996875,51.951504,47.39716996875,51.669502L47.12717096875,52.173504C47.12717096875,52.173504,47.83517096875,52.728504,47.12717096875,53.478504L47.40166996875,53.985506C47.40166996875,53.985506,48.18316996875,53.607506,48.43967096875,54.639505L48.95866996875,54.639505C48.95866996875,54.639505,49.12067096875,53.691505,49.99966996875,53.972006C50.25016996875,53.492004,50.25467096875,53.489004,50.25467096875,53.489004C50.25467096875,53.489004,49.59017096875,52.847006,50.259168968750004,52.160002Z" fill="#FFFFFF" fill-opacity="1" style="mix-blend-mode:passthrough"/></g></svg>
\ No newline at end of file
diff --git a/src/assets/system/shenpiguanli.svg b/src/assets/system/shenpiguanli.svg
new file mode 100644
index 0000000..16ba84b
--- /dev/null
+++ b/src/assets/system/shenpiguanli.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="59.5" height="64.90625" viewBox="0 0 59.5 64.90625"><defs><linearGradient x1="0" y1="0.16914062201976776" x2="0.8045321262753937" y2="1.0460527890370677" id="master_svg0_141_37616"><stop offset="48.549023270606995%" stop-color="#F7F7F7" stop-opacity="1"/><stop offset="100%" stop-color="#FFFFFF" stop-opacity="1"/></linearGradient><linearGradient x1="-0.03565644100308418" y1="0" x2="0.8226521556701855" y2="0.9991461352834076" id="master_svg1_141_37562"><stop offset="46.036821603775024%" stop-color="#F3F3F3" stop-opacity="1"/><stop offset="100%" stop-color="#FFFFFF" stop-opacity="1"/></linearGradient><clipPath id="master_svg2_143_35558"><rect x="12.5" y="0" width="34.000003814697266" height="34" rx="0"/></clipPath></defs><path d="M1.204819142818451,28.096379L28.69276814281845,44.307213000000004L58.29516614281845,28.096379L28.69276814281845,14L1.204819142818451,28.096379Z" fill="#FFFFFF" fill-opacity="1"/><path d="M0.16870074281845082,28.065809L28.43877614281845,44.737896L28.68361514281845,44.882288L59.39288714281845,28.065309L28.684561142818453,13.44229615L0.16870074281845082,28.065809ZM28.70192014281845,43.732138L2.240937742818451,28.12695L28.70097614281845,14.55770427L57.19744514281845,28.127449L28.70192014281845,43.732138Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/><path d="M0.5,28.80120277404785L0.5,47.83131777404785L28.692764,64.04215077404785L28.692764,45.01204077404785L0.5,28.80120277404785Z" fill="url(#master_svg0_141_37616)" fill-opacity="1"/><path d="M29.192764,64.90641177404785L29.192764,44.722777774047856L28.941999,44.578587774047854L-5.999999996841865e-8,27.93693918404785L0,48.12058077404785L29.192764,64.90641177404785ZM28.192764,45.30130377404785L28.192764,63.17788877404785L1,47.542054774047855L1,29.66546636404785L28.192764,45.30130377404785Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/><g transform="matrix(-1,0,0,1,118,0)"><path d="M59,28.80120277404785L59,47.12649377404785L88.5,64.00042177404785L88.5,44.26604677404785L59,28.80120277404785Z" fill="url(#master_svg1_141_37562)" fill-opacity="1"/><path d="M89,64.86243677404785L89,43.96362277404785L88.732151,43.82320777404785L58.50000003,27.97454732404785L58.50000003,47.41651177404785L89,64.86243677404785ZM88,44.568469774047855L88,63.13840677404785L59.5,46.836475774047855L59.5,29.627858224047852L88,44.568469774047855Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/></g><g clip-path="url(#master_svg2_143_35558)"><path d="M30.364756937499997,25.1723935L31.5122539375,23.7415655C30.7614219375,22.8348995,30.3080869375,21.6732315,30.3080869375,20.4265635C30.3080869375,17.5648925,32.6455929375,15.2273945,35.5214249375,15.2273945C37.0655859375,15.2273945,38.4680879375,15.9073935,39.417254937500005,16.969893499999998L39.417254937500005,4.4890625C39.417254937500005,3.55406219,38.652257937499996,2.7890625,37.7172569375,2.7890625L19.3005861375,2.7890625C18.3655856875,2.7890625,17.6005859375,3.55406243,17.6005859375,4.4890625L17.6005859375,26.5890575C17.6005859375,27.5240575,18.3655862175,28.2890625,19.3005861375,28.2890625L27.4747514375,28.2890625C27.8289189375,26.8015635,28.933920937499998,25.6115625,30.364756937499997,25.1723935ZM23.706419037499998,6.7982302L33.339754937500004,6.7982302C33.963088937500004,6.7982302,34.4730839375,7.3082304,34.4730839375,7.9315624C34.4730839375,8.5548954,33.963088937500004,9.0648956,33.339754937500004,9.0648956L23.7064218375,9.0648956C23.083087437499998,9.0648956,22.5730877375,8.5548968,22.5730877375,7.9315639C22.5730877375,7.3082304,23.0689206375,6.7982302,23.706419037499998,6.7982302ZM23.706419037499998,11.8982306L33.339754937500004,11.8982306C33.963088937500004,11.8982306,34.4730839375,12.4082298,34.4730839375,13.0315625C34.4730839375,13.6548975,33.963088937500004,14.1648965,33.339754937500004,14.1648965L23.7064218375,14.1648965C23.083087437499998,14.1648965,22.5730877375,13.6548975,22.5730877375,13.0315625C22.5730877375,12.4082298,23.0689206375,11.8982306,23.706419037499998,11.8982306ZM22.5730872375,18.1315635C22.5730872375,17.5082325,23.0830865375,16.9982295,23.706419037499998,16.9982295L27.6730879375,16.9982295C28.296420937500002,16.9982295,28.8064209375,17.5082265,28.8064209375,18.1315575C28.8064209375,18.754890500000002,28.296420937500002,19.2648965,27.6730879375,19.2648965L23.706419037499998,19.2648965C23.0689187375,19.2648965,22.5730872375,18.7548925,22.5730872375,18.1315635Z" fill="#496FFE" fill-opacity="1" style="mix-blend-mode:passthrough"/><path d="M39.43028168125,31.168883875L31.596113881249998,31.168883875C30.51944607125,31.168883875,29.64111328125,30.290549875,29.64111328125,29.213882875C29.64111328125,28.137214874999998,30.51944607125,27.258882475,31.596113881249998,27.258882475L34.81194638125,23.263881675C33.52277968125,22.952215175,32.57361388125,21.804714675,32.57361388125,20.430547675C32.57361388125,18.815546775,33.89111378125,17.498046875,35.52027988125,17.498046875C37.14944748125,17.498046875,38.46694468125,18.815546775,38.46694468125,20.430547675C38.46694468125,21.804714675,37.51777978125,22.952215175,36.22861288125,23.263881675L39.44444748125,27.258882475C40.52111428125,27.258882475,41.39944628125,28.137214874999998,41.39944628125,29.213882875C41.39944628125,30.290549875,40.52111428125,31.168883875,39.43028168125,31.168883875Z" fill="#496FFE" fill-opacity="1" style="mix-blend-mode:passthrough"/></g></svg>
\ No newline at end of file
diff --git a/src/assets/system/xiaoshoubaojia.svg b/src/assets/system/xiaoshoubaojia.svg
new file mode 100644
index 0000000..13a84dd
--- /dev/null
+++ b/src/assets/system/xiaoshoubaojia.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="59.5" height="59.90625" viewBox="0 0 59.5 59.90625"><defs><linearGradient x1="0" y1="0.16914062201976776" x2="0.8045321262753937" y2="1.0460527890370677" id="master_svg0_141_37616"><stop offset="48.549023270606995%" stop-color="#F7F7F7" stop-opacity="1"/><stop offset="100%" stop-color="#FFFFFF" stop-opacity="1"/></linearGradient><linearGradient x1="-0.03565644100308418" y1="0" x2="0.8226521556701855" y2="0.9991461352834076" id="master_svg1_141_37562"><stop offset="46.036821603775024%" stop-color="#F3F3F3" stop-opacity="1"/><stop offset="100%" stop-color="#FFFFFF" stop-opacity="1"/></linearGradient><clipPath id="master_svg2_143_35608"><rect x="18" y="0" width="24" height="24" rx="0"/></clipPath></defs><path d="M1.204819142818451,23.096379L28.69276814281845,39.307213000000004L58.29516614281845,23.096379L28.69276814281845,9L1.204819142818451,23.096379Z" fill="#FFFFFF" fill-opacity="1"/><path d="M0.16870074281845082,23.065809L28.43877614281845,39.737896L28.68361514281845,39.882288L59.39288714281845,23.065309L28.684561142818453,8.44229615L0.16870074281845082,23.065809ZM28.70192014281845,38.732138L2.240937742818451,23.12695L28.70097614281845,9.55770427L57.19744514281845,23.127449L28.70192014281845,38.732138Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/><path d="M0.5,23.80120277404785L0.5,42.83131777404785L28.692764,59.042150774047855L28.692764,40.01204077404785L0.5,23.80120277404785Z" fill="url(#master_svg0_141_37616)" fill-opacity="1"/><path d="M29.192764,59.906411774047854L29.192764,39.722777774047856L28.941999,39.578587774047854L-5.999999996841865e-8,22.93693918404785L0,43.12058077404785L29.192764,59.906411774047854ZM28.192764,40.30130377404785L28.192764,58.17788877404785L1,42.542054774047855L1,24.66546636404785L28.192764,40.30130377404785Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/><g transform="matrix(-1,0,0,1,118,0)"><path d="M59,23.80120277404785L59,42.12649377404785L88.5,59.00042177404785L88.5,39.26604677404785L59,23.80120277404785Z" fill="url(#master_svg1_141_37562)" fill-opacity="1"/><path d="M89,59.86243677404785L89,38.96362277404785L88.732151,38.82320777404785L58.50000003,22.97454732404785L58.50000003,42.41651177404785L89,59.86243677404785ZM88,39.568469774047855L88,58.13840677404785L59.5,41.836475774047855L59.5,24.627858224047852L88,39.568469774047855Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/></g><g clip-path="url(#master_svg2_143_35608)"><path d="M20.17195003125,2.664L37.21195053125,2.664C37.94394853125,2.664,38.531948531249995,3.2640002,38.51994853125,3.9960001L38.51994853125,22.667999C38.531948531249995,23.4,37.94394853125,24,37.21195053125,24L20.17195003125,24C19.43994993125,24,18.85195001925,23.400002,18.86395004392,22.667999L18.86395004392,3.9960001C18.85195001925,3.2640002,19.43995005125,2.6759999,20.17195003125,2.664ZM22.78794983125,15.324L22.78794983125,19.320002C22.78794983125,19.691999,23.087950231249998,19.991999,23.45994993125,19.991999C23.80795003125,19.991999,24.09594963125,19.704,24.09594963125,19.356001L24.09594963125,15.312C24.09594963125,14.952001,23.80795003125,14.664,23.44794993125,14.664C23.087950231249998,14.664,22.78794983125,14.964,22.78794983125,15.324ZM28.03195003125,16.68L28.03195003125,19.308001C28.03195003125,19.68,28.331950231249998,19.991999,28.71595003125,19.991999C29.06395053125,19.991999,29.33994953125,19.716,29.33994953125,19.368L29.33994953125,16.620001C29.33994953125,16.271999,29.06395053125,15.995999,28.71595003125,15.995999C28.34395023125,15.995999,28.03195003125,16.308001,28.03195003125,16.68ZM33.275950531250004,12.683999L33.275950531250004,19.296C33.275950531250004,19.679998,33.587949531250004,20.004,33.98394953125,20.004C34.31995053125,20.004,34.58394953125,19.727999,34.58394953125,19.404001L34.58394953125,12.624001C34.58394953125,12.276,34.30794953125,12,33.959949531250004,12C33.58794853125,12,33.27594853125,12.312,33.275950531250004,12.683999ZM28.96795053125,12.084L34.58394953125,8.6999998C34.883949531249996,8.5200005,34.97994853125,8.1359997,34.799948531249996,7.8360004C34.60794953125,7.5120001,34.17594953125,7.4040003,33.85194853125,7.5959997L29.14795053125,10.44C29.02795153125,10.512,28.85995103125,10.5,28.76395033125,10.392L26.25594993125,7.7879996C26.12395053125,7.6560001,25.91995093125,7.6319995,25.76395033125,7.7399998L22.60794993125,9.8640003C22.283950131250002,10.08,22.19995023125,10.512,22.41595003125,10.836C22.60794993125,11.124,23.00395063125,11.208,23.29194973125,11.016L25.61995033125,9.4320002C25.751949831250002,9.3479996,25.91995003125,9.3600006,26.03994993125,9.4800005L28.51195143125,12.048001C28.63195033125,12.156,28.82395073125,12.180001,28.96795053125,12.084ZM40.487951531250005,21.323999C40.12795053125,21.323999,39.82795153125,21.024,39.82795153125,20.664L39.82795153125,2.664C39.83995253125,1.932,39.25195153125,1.332,38.51995253125,1.332L22.10395023125,1.332C21.75595043125,1.332,21.47995043125,1.056,21.47995043125,0.708C21.47995023125,0.31200001,21.79195043125,0,22.18795033125,0L38.519950531250004,0C39.983949531250005,0.012,41.159950531250004,1.2,41.14794953125,2.664L41.14794953125,20.676001C41.14794953125,21.036001,40.847949531249995,21.336,40.487951531250005,21.323999Z" fill="#496FFE" fill-opacity="1" style="mix-blend-mode:passthrough"/></g></svg>
\ No newline at end of file
diff --git a/src/assets/system/xiaoshoupeizhi.svg b/src/assets/system/xiaoshoupeizhi.svg
new file mode 100644
index 0000000..7191560
--- /dev/null
+++ b/src/assets/system/xiaoshoupeizhi.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="89.5693359375" height="96" viewBox="0 0 89.5693359375 96"><defs><filter id="master_svg0_143_35978" filterUnits="objectBoundingBox" color-interpolation-filters="sRGB" x="-0.6666666666666666" y="-0.6666666666666666" width="2.3333333333333335" height="2.3333333333333335"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"/><feOffset dy="0" dx="0"/><feGaussianBlur stdDeviation="8"/><feColorMatrix type="matrix" values="0 0 0 0 0.12895070016384125 0 0 0 0 0.29307788610458374 0 0 0 0 0.9107142686843872 0 0 0 0.5299999713897705 0"/><feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow"/><feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow" result="shape"/></filter><clipPath id="master_svg1_143_35983"><rect x="32.78466796875" y="36" width="23" height="23" rx="0"/></clipPath></defs><path d="M44.78466796875,24.000000000000004L65.56927496875,36L65.56927496875,60L44.78466796875,72L24.00005836875,60L24.00005796875,36.000001L44.78466796875,24.000000000000004Z" fill="#496FFE" fill-opacity="1" filter="url(#master_svg0_143_35978)"/><g clip-path="url(#master_svg1_143_35983)"><path d="M44.950077965625,36Q45.615746465625,36,46.269937765625,36.14920157Q46.924129765625,36.29840314,47.497981765625,36.55089813Q48.071835765624996,36.80339313,48.519438765625,37.124750399999996Q48.967043765625,37.4461077,49.219538765625,37.7674649Q49.816345765625,38.5019956,50.091794765624996,39.3857281Q50.367244765625,40.269460699999996,50.482013765625,41.0728536Q50.596784765625,41.9910169,50.596784765625,42.9321346Q50.757463765625,43.046905,50.849280765625,43.2305379Q50.941096765625,43.391216299999996,50.998480765625004,43.6437116Q51.055866765625,43.8962064,51.009958765625,44.2634716Q50.964050765625004,44.7455082,50.814847765625004,45.032433499999996Q50.665645765625,45.3193598,50.482013765625,45.4800377Q50.275426765625,45.6636715,50.045885765625,45.7325335Q49.931114765625,46.122753,49.816345765625,46.467065Q49.701575765625,46.765468,49.552372765625,47.052393Q49.403172765625,47.339319,49.219538765625,47.499997Q48.783411765625004,47.844309,48.507961765625,48.085328000000004Q48.232512765625,48.326347,48.140695765625,48.900198Q48.071834765625,49.244509,48.094788765625,49.600298Q48.117743765625,49.956086,48.289897765625,50.311875Q48.462053765625,50.667664,48.817842765625,50.989021Q49.173630765625,51.310377,49.816345765625,51.562872999999996Q50.390198765625,51.792412999999996,51.067343765625,51.976046Q51.744489765625005,52.159679,52.387202765625,52.400695999999996Q53.029916765625,52.641714,53.523429765624996,52.997502999999995Q54.016944765625,53.353291,54.223531765625,53.973051Q54.338302765625,54.340319,54.395686765625,54.879736Q54.453071765625,55.419159,54.453071765625,55.970057Q54.453071765625,56.520954,54.372731765625005,57.002989Q54.292394765625005,57.485027,54.131713765625,57.73752Q54.016944765625,57.898201,53.477523765625,58.058878Q52.938104765625,58.219556999999995,52.146186765625,58.368757Q51.354269765625,58.51796,50.378720765625,58.632729999999995Q49.403173765625,58.747501,48.416146765625,58.827839Q47.429119765625,58.908178,46.522433765624996,58.954088Q45.615747465625,58.999995999999996,44.950078965624996,58.999994Q44.284410465625,58.999994,43.400678165625,58.954088Q42.516944865625,58.908182,41.575827565625,58.827841Q40.634709865625,58.747501,39.705069065625,58.644209000000004Q38.775428565625,58.540915999999996,38.017943365625,58.426144Q37.260458465625,58.311375,36.732514365625,58.196604Q36.204570295625,58.081837,36.066845565625,57.967064Q35.837304725625,57.783429999999996,35.711057230625,56.842314Q35.584809735625,55.901196,35.814350605625,54.40918Q35.929121195625,53.559877,36.491496265625,53.112272000000004Q37.053871265625,52.664669,37.799879565625,52.400695999999996Q38.545887665625,52.136724,39.349280365625,51.930138Q40.152672765625,51.723553,40.772433265625,51.333332Q41.254469865625,51.03493,41.506964665625,50.759479999999996Q41.759460465625,50.484030000000004,41.874229865625,50.208582Q41.989000365625,49.933134,41.989000365625,49.63473Q41.989000365625,49.336327,41.966046765625,48.969062Q41.920138365625,48.441118,41.598781565625,48.131239Q41.277424365625,47.821359,40.887204665625,47.5Q40.703571765625,47.339321,40.565847865625,47.052395000000004Q40.428123965625,46.765468999999996,40.313353065625,46.467067Q40.198582165625,46.122755,40.083811765625,45.7325354Q39.923133365625,45.6866264,39.762454465625,45.5718565Q39.624729865625,45.4570866,39.464051465625,45.2504997Q39.303372865625,45.0439129,39.188602665625,44.653694200000004Q39.050877765625,44.2634735,39.085309065625,43.9421172Q39.119739965625,43.62076,39.211556165625,43.391218699999996Q39.303372865625,43.1387234,39.509959465625,42.9091825Q39.487005965625,42.0369272,39.601776165625,41.1646714Q39.693592565624996,40.4301405,39.934610365625,39.5808394Q40.175627665625,38.7315381,40.657664265625,38.0658693Q41.093792465625,37.423155,41.633213065625,37.0214585Q42.172633665625,36.61976188,42.735009665625,36.390221Q43.297384765625,36.16068012,43.859759365625,36.080340803Q44.422134365625,36.0000014994291,44.950077965625,36Z" fill="#FFFFFF" fill-opacity="1" style="mix-blend-mode:passthrough"/></g></svg>
\ No newline at end of file
diff --git a/src/assets/system/xiaoshoutaizhang.svg b/src/assets/system/xiaoshoutaizhang.svg
new file mode 100644
index 0000000..9880541
--- /dev/null
+++ b/src/assets/system/xiaoshoutaizhang.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="59.5" height="63.90625" viewBox="0 0 59.5 63.90625"><defs><linearGradient x1="0" y1="0.16914062201976776" x2="0.8045321262753937" y2="1.0460527890370677" id="master_svg0_141_37616"><stop offset="48.549023270606995%" stop-color="#F7F7F7" stop-opacity="1"/><stop offset="100%" stop-color="#FFFFFF" stop-opacity="1"/></linearGradient><linearGradient x1="-0.03565644100308418" y1="0" x2="0.8226521556701855" y2="0.9991461352834076" id="master_svg1_141_37562"><stop offset="46.036821603775024%" stop-color="#F3F3F3" stop-opacity="1"/><stop offset="100%" stop-color="#FFFFFF" stop-opacity="1"/></linearGradient><clipPath id="master_svg2_143_35617"><rect x="13.5" y="0" width="32" height="32" rx="0"/></clipPath></defs><path d="M1.204819142818451,27.096379L28.69276814281845,43.307213000000004L58.29516614281845,27.096379L28.69276814281845,13L1.204819142818451,27.096379Z" fill="#FFFFFF" fill-opacity="1"/><path d="M0.16870074281845082,27.065809L28.43877614281845,43.737896L28.68361514281845,43.882288L59.39288714281845,27.065309L28.684561142818453,12.44229615L0.16870074281845082,27.065809ZM28.70192014281845,42.732138L2.240937742818451,27.12695L28.70097614281845,13.55770427L57.19744514281845,27.127449L28.70192014281845,42.732138Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/><path d="M0.5,27.80120277404785L0.5,46.83131777404785L28.692764,63.042150774047855L28.692764,44.01204077404785L0.5,27.80120277404785Z" fill="url(#master_svg0_141_37616)" fill-opacity="1"/><path d="M29.192764,63.906411774047854L29.192764,43.722777774047856L28.941999,43.578587774047854L-5.999999996841865e-8,26.93693918404785L0,47.12058077404785L29.192764,63.906411774047854ZM28.192764,44.30130377404785L28.192764,62.17788877404785L1,46.542054774047855L1,28.66546636404785L28.192764,44.30130377404785Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/><g transform="matrix(-1,0,0,1,118,0)"><path d="M59,27.80120277404785L59,46.12649377404785L88.5,63.00042177404785L88.5,43.26604677404785L59,27.80120277404785Z" fill="url(#master_svg1_141_37562)" fill-opacity="1"/><path d="M89,63.86243677404785L89,42.96362277404785L88.732151,42.82320777404785L58.50000003,26.97454732404785L58.50000003,46.41651177404785L89,63.86243677404785ZM88,43.568469774047855L88,62.13840677404785L59.5,45.836475774047855L59.5,28.627858224047852L88,43.568469774047855Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/></g><g clip-path="url(#master_svg2_143_35617)"><path d="M36.903126,3.015625L22.0968752,3.015625C20.6062503,3.015625,19.4000001,4.2249999,19.4000001,5.7125001L19.4000001,17.44375L39.6,17.44375L39.6,5.7125001C39.6,4.2218751999999995,38.390625,3.015625,36.903126,3.015625ZM26.615625,14.556249L22.2843752,14.556249C21.4875002,14.556249,20.8406253,13.909374,20.8406253,13.112499C20.8406253,12.3156242,21.4875002,11.6687489,22.2843752,11.6687489L26.6125,11.6687489C27.409375,11.6687489,28.056251,12.3156242,28.056251,13.112499C28.056251,13.912499,27.4125,14.556249,26.615625,14.556249ZM32.384377,7.4312496C32.384377,8.181249600000001,31.778126,8.7874994,31.028126,8.7874994L22.1999993,8.7874994C21.4499993,8.7874994,20.84375,8.181249600000001,20.84375,7.4312496L20.84375,7.2593746C20.84375,6.5093746,21.4499993,5.9031248000000005,22.1999993,5.9031248000000005L31.03125,5.9031248000000005C31.78125,5.9031248000000005,32.387501,6.5093746,32.387501,7.2593746L32.387501,7.4312496L32.384377,7.4312496ZM39.600002,20.328125L19.4000001,20.328125C17.8062501,20.328125,16.515625,21.61875,16.515625,23.2125L16.515625,26.096872C16.515625,26.862497,16.81874993,27.596872,17.359375,28.137499C17.9000001,28.678123,18.6343751,28.981249,19.4000001,28.981249L39.6,28.981249C40.365625,28.981249,41.1,28.678123,41.640625,28.137499C42.18125,27.596872,42.484375,26.862497,42.484375,26.096872L42.484375,23.2125C42.484375,21.621874,41.19375,20.328125,39.600002,20.328125ZM20.84375,26.1C20.2593751,26.1,19.734375,25.746876,19.5093751,25.209375C19.2874997,24.668751,19.4093752,24.050001,19.8218751,23.637501C20.234375,23.225,20.8562498,23.1,21.3937502,23.325001C21.9343743,23.546875,22.2843752,24.075001,22.2843752,24.659376C22.2843752,25.453127,21.640625,26.1,20.84375,26.1ZM26.615625,26.1C26.03125,26.1,25.5062504,25.746876,25.28125,25.209375C25.0593748,24.668751,25.1812496,24.050001,25.59375,23.637501C26.0062504,23.225,26.628125,23.1,27.165624,23.325001C27.706249,23.546875,28.056249,24.075001,28.056249,24.659376C28.056249,25.453127,27.412499,26.1,26.615625,26.1Z" fill="#496FFE" fill-opacity="1" style="mix-blend-mode:passthrough"/></g></svg>
\ No newline at end of file
diff --git a/src/assets/system/xiaoshoutuihuo.svg b/src/assets/system/xiaoshoutuihuo.svg
new file mode 100644
index 0000000..bcacee2
--- /dev/null
+++ b/src/assets/system/xiaoshoutuihuo.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="59.5" height="64.90625" viewBox="0 0 59.5 64.90625"><defs><linearGradient x1="0" y1="0.16914062201976776" x2="0.8045321262753937" y2="1.0460527890370677" id="master_svg0_141_37616"><stop offset="48.549023270606995%" stop-color="#F7F7F7" stop-opacity="1"/><stop offset="100%" stop-color="#FFFFFF" stop-opacity="1"/></linearGradient><linearGradient x1="-0.03565644100308418" y1="0" x2="0.8226521556701855" y2="0.9991461352834076" id="master_svg1_141_37562"><stop offset="46.036821603775024%" stop-color="#F3F3F3" stop-opacity="1"/><stop offset="100%" stop-color="#FFFFFF" stop-opacity="1"/></linearGradient><clipPath id="master_svg2_143_35635"><rect x="12.5" y="0" width="34.000003814697266" height="34" rx="0"/></clipPath></defs><path d="M1.204819142818451,28.096379L28.69276814281845,44.307213000000004L58.29516614281845,28.096379L28.69276814281845,14L1.204819142818451,28.096379Z" fill="#FFFFFF" fill-opacity="1"/><path d="M0.16870074281845082,28.065809L28.43877614281845,44.737896L28.68361514281845,44.882288L59.39288714281845,28.065309L28.684561142818453,13.44229615L0.16870074281845082,28.065809ZM28.70192014281845,43.732138L2.240937742818451,28.12695L28.70097614281845,14.55770427L57.19744514281845,28.127449L28.70192014281845,43.732138Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/><path d="M0.5,28.80120277404785L0.5,47.83131777404785L28.692764,64.04215077404785L28.692764,45.01204077404785L0.5,28.80120277404785Z" fill="url(#master_svg0_141_37616)" fill-opacity="1"/><path d="M29.192764,64.90641177404785L29.192764,44.722777774047856L28.941999,44.578587774047854L-5.999999996841865e-8,27.93693918404785L0,48.12058077404785L29.192764,64.90641177404785ZM28.192764,45.30130377404785L28.192764,63.17788877404785L1,47.542054774047855L1,29.66546636404785L28.192764,45.30130377404785Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/><g transform="matrix(-1,0,0,1,118,0)"><path d="M59,28.80120277404785L59,47.12649377404785L88.5,64.00042177404785L88.5,44.26604677404785L59,28.80120277404785Z" fill="url(#master_svg1_141_37562)" fill-opacity="1"/><path d="M89,64.86243677404785L89,43.96362277404785L88.732151,43.82320777404785L58.50000003,27.97454732404785L58.50000003,47.41651177404785L89,64.86243677404785ZM88,44.568469774047855L88,63.13840677404785L59.5,46.836475774047855L59.5,29.627858224047852L88,44.568469774047855Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/></g><g clip-path="url(#master_svg2_143_35635)"><path d="M16.5,17.5C16.5,10.0479994,22.547999400000002,4,30,4C37.452,4,43.5,10.0479999,43.5,17.5C43.5,24.952,37.452,31,30,31C22.547999400000002,31,16.5,24.952,16.5,17.5ZM25.2099543,11.2335448C25.056938199999998,11.1590481,24.889226,11.1196365,24.719044699999998,11.118180800000001C24.4576359,11.118180800000001,24.2600451,11.2102261,24.1250448,11.3930907C23.965045,11.566371,23.8772473,11.7942061,23.8795905,12.0300455C23.8795905,12.2902269,23.9716368,12.4779997,24.1545,12.5945911C24.1946921,12.6422205,24.2439098,12.681428,24.2993183,12.7099552C24.812317800000002,13.0376368,25.309363400000002,13.3910923,25.789226499999998,13.7654095C25.875135399999998,13.8550005,25.9782276,13.9249544,26.0935907,13.9691372C26.1991358,14.026819,26.3292265,14.055046,26.4838629,14.055046C26.763681,14.046455,26.98459,13.9114552,27.149045,13.6500463C27.266969,13.4697084,27.327709,13.2579737,27.323318,13.0425463C27.319848,12.8229294,27.219160000000002,12.6161594,27.048409,12.4780006C26.492164600000002,11.9851937,25.874157,11.5668635,25.2099543,11.2335448ZM34.731136,11.2924538L29.478408,11.2924538C28.610726,11.2924538,28.177500000000002,11.648363100000001,28.177500000000002,12.3626356L28.177500000000002,19.944725C28.176272,20.042908,28.18609,20.138634,28.205727,20.234362C28.070726,20.349726,28.003225999999998,20.553452,28.003225999999998,20.841862C28.013044999999998,21.11186,28.070726,21.309452,28.176271,21.434633C28.292863,21.569633,28.500272000000002,21.637133,28.798499,21.637133C29.464908,21.637133,30.404999,21.487406,31.621223999999998,21.189178C31.861770999999997,21.140087,32.026225,21.059088,32.112133,20.943726C32.243669,20.79126,32.310976,20.593739,32.299906,20.392679C32.299906,20.17177,32.252043,19.997498,32.156316000000004,19.872315999999998C32.033533,19.737026,31.860347,19.658427,31.677678999999998,19.655088C31.157317,19.732407000000002,30.632043,19.804814999999998,30.100635,19.872315999999998L30.100635,17.455816L34.673452,17.455816C34.759361,17.455816,34.837906000000004,17.450908,34.905409,17.441088999999998C34.893873,17.462564,34.878954,17.482039999999998,34.861225000000005,17.498772000000002C34.521141,17.859035,34.158792,18.197606999999998,33.776316,18.512499C33.275587,18.193407999999998,32.749089999999995,17.895182,32.199270999999996,17.615363000000002C32.035903,17.54202,31.857872,17.507168,31.678905999999998,17.513499C31.417496999999997,17.513499,31.21009,17.590817,31.056679000000003,17.745455C30.902043,17.880454999999998,30.823497,18.082954,30.823497,18.352954C30.828218,18.505149,30.890499,18.649888,30.997768,18.757953999999998C31.051738999999998,18.809553,31.116205,18.848902000000002,31.186768999999998,18.873317999999998C32.266769,19.520091999999998,33.48177,20.369364,34.831768,21.419909C35.01586,21.604,35.246586,21.694817,35.527632,21.694817C35.766716,21.695692,35.992073000000005,21.583241,36.135132,21.39168C36.289076,21.227486,36.371994,21.009171,36.36586,20.78418C36.362389,20.564564,36.261703,20.357796,36.090952,20.219635C35.802544,19.968045,35.503088000000005,19.728727,35.195042,19.495544000000002C35.705585,19.197316999999998,36.115498,18.873317,36.424769999999995,18.526C36.533014,18.357194,36.592867,18.161924,36.597816,17.961454C36.611883,17.651581,36.456854,17.358437000000002,36.192816,17.195636999999998C36.041086,17.073852000000002,35.852282,17.007597,35.657722,17.007863999999998C35.753451999999996,16.853229,35.802544,16.645819,35.802544,16.385637L35.802544,12.3626366C35.802544,11.6483641,35.445406,11.2924547,34.731136,11.2924538ZM33.878181,13.664773L30.100636,13.664773L30.100636,13.1002264C30.100636,12.9468174,30.192681999999998,12.8695002,30.375545000000002,12.8695002L33.603271,12.8695002C33.786135,12.8695002,33.87818,12.9468174,33.87818,13.1002264L33.878181,13.664773ZM33.603271,15.864044L30.100636,15.864044L30.100636,15.02459L33.878181,15.02459L33.878181,15.646818C33.878181,15.791636,33.786135,15.864044,33.603271,15.864044ZM25.6296825,15.473772L24.2698641,15.473772C23.9507732,15.473772,23.724954099999998,15.546182,23.5899544,15.690999C23.4451365,15.844409,23.3727274,16.076363999999998,23.3727274,16.385635C23.3727274,16.723136,23.4402275,16.950181999999998,23.5752277,17.065544C23.6905913,17.248407,23.9225464,17.340454,24.2698641,17.340454L24.834409700000002,17.340454C24.9497738,17.340454,25.0074549,17.398136,25.0074549,17.513499L25.0074549,21.637135C25.0074549,21.714453,24.9546824,21.786861,24.847909899999998,21.854361C24.4527292,22.139252,24.0315437,22.386209,23.5899544,22.591951C23.4451365,22.698725,23.3727274,22.814087,23.3727274,22.939268C23.3771172,23.0942,23.4117188,23.246782,23.4745903,23.388451C23.6476359,23.697725,23.835408700000002,23.943178,24.0391369,24.126041C24.1385455,24.200905,24.260046,24.242634,24.3852277,24.242634C24.5752201,24.217705,24.7579012,24.153328,24.921546,24.053633C25.228364,23.907587,25.5204544,23.728407,25.7892284,23.518543C25.8849545,23.432632,25.9622736,23.388451,26.0211821,23.388451C26.132575,23.390455,26.2397785,23.431255,26.3243189,23.503817C27.153955,23.842543,28.572682999999998,24.010681,30.578046,24.010681L35.97559,24.010681C36.313091,23.991043,36.545048,23.900225,36.670227,23.735771C36.805227,23.61059,36.872726,23.363907,36.872726,22.99818C36.872726,22.67909,36.790501,22.453272,36.627274,22.317045C36.492271,22.201681,36.294682,22.144001,36.033272,22.144001C35.368092000000004,22.144001,34.566679,22.163635,33.6315,22.201681C32.551497999999995,22.239727,31.379454000000003,22.259361,30.115364,22.259361C28.996092,22.259361,28.114910000000002,22.191862,27.468138,22.056862C27.071728999999998,21.979544,26.874138000000002,21.8605,26.874138000000002,21.694817L26.874138000000002,16.601637C26.874138000000002,15.849319,26.4593201,15.472546,25.6296825,15.472546L25.6296825,15.473772Z" fill="#BC49FE" fill-opacity="1" style="mix-blend-mode:passthrough"/></g></svg>
\ No newline at end of file
diff --git a/src/assets/system/yonghuguanli.svg b/src/assets/system/yonghuguanli.svg
new file mode 100644
index 0000000..a8365a7
--- /dev/null
+++ b/src/assets/system/yonghuguanli.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="59.5" height="64.90625" viewBox="0 0 59.5 64.90625"><defs><linearGradient x1="0" y1="0.16914062201976776" x2="0.8045321262753937" y2="1.0460527890370677" id="master_svg0_141_37616"><stop offset="48.549023270606995%" stop-color="#F7F7F7" stop-opacity="1"/><stop offset="100%" stop-color="#FFFFFF" stop-opacity="1"/></linearGradient><linearGradient x1="-0.03565644100308418" y1="0" x2="0.8226521556701855" y2="0.9991461352834076" id="master_svg1_141_37562"><stop offset="46.036821603775024%" stop-color="#F3F3F3" stop-opacity="1"/><stop offset="100%" stop-color="#FFFFFF" stop-opacity="1"/></linearGradient><clipPath id="master_svg2_143_35539"><rect x="12.5" y="0" width="34.000003814697266" height="34" rx="0"/></clipPath></defs><path d="M1.204819142818451,28.096379L28.69276814281845,44.307213000000004L58.29516614281845,28.096379L28.69276814281845,14L1.204819142818451,28.096379Z" fill="#FFFFFF" fill-opacity="1"/><path d="M0.16870074281845082,28.065809L28.43877614281845,44.737896L28.68361514281845,44.882288L59.39288714281845,28.065309L28.684561142818453,13.44229615L0.16870074281845082,28.065809ZM28.70192014281845,43.732138L2.240937742818451,28.12695L28.70097614281845,14.55770427L57.19744514281845,28.127449L28.70192014281845,43.732138Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/><path d="M0.5,28.80120277404785L0.5,47.83131777404785L28.692764,64.04215077404785L28.692764,45.01204077404785L0.5,28.80120277404785Z" fill="url(#master_svg0_141_37616)" fill-opacity="1"/><path d="M29.192764,64.90641177404785L29.192764,44.722777774047856L28.941999,44.578587774047854L-5.999999996841865e-8,27.93693918404785L0,48.12058077404785L29.192764,64.90641177404785ZM28.192764,45.30130377404785L28.192764,63.17788877404785L1,47.542054774047855L1,29.66546636404785L28.192764,45.30130377404785Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/><g transform="matrix(-1,0,0,1,118,0)"><path d="M59,28.80120277404785L59,47.12649377404785L88.5,64.00042177404785L88.5,44.26604677404785L59,28.80120277404785Z" fill="url(#master_svg1_141_37562)" fill-opacity="1"/><path d="M89,64.86243677404785L89,43.96362277404785L88.732151,43.82320777404785L58.50000003,27.97454732404785L58.50000003,47.41651177404785L89,64.86243677404785ZM88,44.568469774047855L88,63.13840677404785L59.5,46.836475774047855L59.5,29.627858224047852L88,44.568469774047855Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/></g><g clip-path="url(#master_svg2_143_35539)"><path d="M31.6272783125,19.833336L31.6272783125,19.125002C31.6272783125,18.735416,31.3085343125,18.416668,30.9189493125,18.416668L28.0856153125,18.416668C27.696029312500002,18.416668,27.3772793125,18.735416,27.3772793125,19.125002L27.3772793125,19.833336C27.3772793125,20.222919,27.696029312500002,20.541668,28.0856153125,20.541668L28.5106133125,20.541668L27.4056153125,24.664169C27.3914463125,24.742083,27.4056153125,24.827087,27.455197312499998,24.890835L29.162277312500002,27.171669C29.3322813125,27.398335,29.672281312499997,27.398335,29.8422813125,27.171669L31.5493633125,24.890835C31.598944312500002,24.827087,31.613113312499998,24.742083,31.598944312500002,24.664169L30.493948312500002,20.541674L30.918943312499998,20.541674C31.3085323125,20.541674,31.6272763125,20.222921,31.6272783125,19.833336ZM29.5022783125,17.708334999999998C25.9960270125,17.708334999999998,23.1272793125,14.839586,23.1272793125,11.3333368L23.1272793125,8.5C23.1272793125,4.9937501,25.9960270125,2.125,29.5022783125,2.125C33.008526312499995,2.125,35.8772793125,4.9937501,35.8772793125,8.5L35.8772793125,11.3333368C35.8772793125,14.839586,33.008526312499995,17.708334999999998,29.5022783125,17.708334999999998ZM38.172279312499995,19.125002L36.557281312499995,18.770834C36.2597753125,18.707085,35.9481063125,18.841665,35.7993643125,19.110832L29.9414463125,29.601257C29.7501973125,29.941248,29.2543643125,29.941248,29.0631123125,29.601257L23.0493646125,18.834585C22.9010763125,18.564627,22.5916772125,18.425833,22.2914457125,18.494585L19.4156120125,19.125002C17.4497964125,19.53912,16.04301562917,21.273962,16.0439453125,23.282919L16.0439453125,28.333334C16.0439453125,29.898754,17.3118622125,31.166664,18.877278812500002,31.166664L38.7106133125,31.166664C40.2760293125,31.166664,41.543947312499995,29.898754,41.543947312499995,28.333334L41.543947312499995,23.282919C41.543947312499995,21.27125,40.134359312499996,19.535837,38.172279312499995,19.125002Z" fill="#496FFE" fill-opacity="1" style="mix-blend-mode:passthrough"/></g></svg>
\ No newline at end of file
diff --git a/src/assets/system/zhibiaotongji.svg b/src/assets/system/zhibiaotongji.svg
new file mode 100644
index 0000000..00e97bb
--- /dev/null
+++ b/src/assets/system/zhibiaotongji.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="59.5" height="64.90625" viewBox="0 0 59.5 64.90625"><defs><linearGradient x1="0" y1="0.16914062201976776" x2="0.8045321262753937" y2="1.0460527890370677" id="master_svg0_141_37616"><stop offset="48.549023270606995%" stop-color="#F7F7F7" stop-opacity="1"/><stop offset="100%" stop-color="#FFFFFF" stop-opacity="1"/></linearGradient><linearGradient x1="-0.03565644100308418" y1="0" x2="0.8226521556701855" y2="0.9991461352834076" id="master_svg1_141_37562"><stop offset="46.036821603775024%" stop-color="#F3F3F3" stop-opacity="1"/><stop offset="100%" stop-color="#FFFFFF" stop-opacity="1"/></linearGradient><clipPath id="master_svg2_143_35654"><rect x="14.5" y="0" width="30" height="30" rx="0"/></clipPath></defs><path d="M1.204819142818451,28.096379L28.69276814281845,44.307213000000004L58.29516614281845,28.096379L28.69276814281845,14L1.204819142818451,28.096379Z" fill="#FFFFFF" fill-opacity="1"/><path d="M0.16870074281845082,28.065809L28.43877614281845,44.737896L28.68361514281845,44.882288L59.39288714281845,28.065309L28.684561142818453,13.44229615L0.16870074281845082,28.065809ZM28.70192014281845,43.732138L2.240937742818451,28.12695L28.70097614281845,14.55770427L57.19744514281845,28.127449L28.70192014281845,43.732138Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/><path d="M0.5,28.80120277404785L0.5,47.83131777404785L28.692764,64.04215077404785L28.692764,45.01204077404785L0.5,28.80120277404785Z" fill="url(#master_svg0_141_37616)" fill-opacity="1"/><path d="M29.192764,64.90641177404785L29.192764,44.722777774047856L28.941999,44.578587774047854L-5.999999996841865e-8,27.93693918404785L0,48.12058077404785L29.192764,64.90641177404785ZM28.192764,45.30130377404785L28.192764,63.17788877404785L1,47.542054774047855L1,29.66546636404785L28.192764,45.30130377404785Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/><g transform="matrix(-1,0,0,1,118,0)"><path d="M59,28.80120277404785L59,47.12649377404785L88.5,64.00042177404785L88.5,44.26604677404785L59,28.80120277404785Z" fill="url(#master_svg1_141_37562)" fill-opacity="1"/><path d="M89,64.86243677404785L89,43.96362277404785L88.732151,43.82320777404785L58.50000003,27.97454732404785L58.50000003,47.41651177404785L89,64.86243677404785ZM88,44.568469774047855L88,63.13840677404785L59.5,46.836475774047855L59.5,29.627858224047852L88,44.568469774047855Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/></g><g clip-path="url(#master_svg2_143_35654)"><path d="M27.329689375,4.0806096499999995C21.384180075,4.72396945,16.755859375,9.759809449999999,16.755859375,15.87641125C16.755859375,22.42924525,22.068262575,27.74164625,28.621094375,27.74164625C34.737697374999996,27.74164625,39.773244375000004,23.11332725,40.416896375,17.16781625C40.491603375,16.47728925,39.945509375,15.87641025,39.251175375,15.87641025L29.792969375,15.87641025C29.145801374999998,15.87641025,28.621094375,15.35170425,28.621094375,14.70453425L28.621094375,5.246332649999999C28.621094375,4.55199675,28.020215375,4.00590305,27.329689375,4.0806096499999995ZM30.378907375,3.48881295L30.378907375,12.94672425C30.378907375,13.59389225,30.903614375,14.11859925,31.550782375,14.11859925L41.008691375,14.11859925C41.705665374999995,14.11859925,42.249416374999996,13.51391025,42.174123375,12.82104025C41.573829375,7.30473135,37.192775375,2.92367607,31.676466375,2.3233831231C30.983595375,2.248090155,30.378907375,2.79184017,30.378907375,3.48881295Z" fill="#496FFE" fill-opacity="1" style="mix-blend-mode:passthrough"/></g></svg>
\ No newline at end of file
diff --git a/src/assets/system/zhushengchanjihua.svg b/src/assets/system/zhushengchanjihua.svg
new file mode 100644
index 0000000..8573eac
--- /dev/null
+++ b/src/assets/system/zhushengchanjihua.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="59.5" height="64.90625" viewBox="0 0 59.5 64.90625"><defs><linearGradient x1="0" y1="0.16914062201976776" x2="0.8045321262753937" y2="1.0460527890370677" id="master_svg0_141_37616"><stop offset="48.549023270606995%" stop-color="#F7F7F7" stop-opacity="1"/><stop offset="100%" stop-color="#FFFFFF" stop-opacity="1"/></linearGradient><linearGradient x1="-0.03565644100308418" y1="0" x2="0.8226521556701855" y2="0.9991461352834076" id="master_svg1_141_37562"><stop offset="46.036821603775024%" stop-color="#F3F3F3" stop-opacity="1"/><stop offset="100%" stop-color="#FFFFFF" stop-opacity="1"/></linearGradient><clipPath id="master_svg2_143_36341"><rect x="14.5" y="0" width="32" height="32" rx="0"/></clipPath></defs><path d="M1.204819142818451,28.096379L28.69276814281845,44.307213000000004L58.29516614281845,28.096379L28.69276814281845,14L1.204819142818451,28.096379Z" fill="#FFFFFF" fill-opacity="1"/><path d="M0.16870074281845082,28.065809L28.43877614281845,44.737896L28.68361514281845,44.882288L59.39288714281845,28.065309L28.684561142818453,13.44229615L0.16870074281845082,28.065809ZM28.70192014281845,43.732138L2.240937742818451,28.12695L28.70097614281845,14.55770427L57.19744514281845,28.127449L28.70192014281845,43.732138Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/><path d="M0.5,28.80120277404785L0.5,47.83131777404785L28.692764,64.04215077404785L28.692764,45.01204077404785L0.5,28.80120277404785Z" fill="url(#master_svg0_141_37616)" fill-opacity="1"/><path d="M29.192764,64.90641177404785L29.192764,44.722777774047856L28.941999,44.578587774047854L-5.999999996841865e-8,27.93693918404785L0,48.12058077404785L29.192764,64.90641177404785ZM28.192764,45.30130377404785L28.192764,63.17788877404785L1,47.542054774047855L1,29.66546636404785L28.192764,45.30130377404785Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/><g transform="matrix(-1,0,0,1,118,0)"><path d="M59,28.80120277404785L59,47.12649377404785L88.5,64.00042177404785L88.5,44.26604677404785L59,28.80120277404785Z" fill="url(#master_svg1_141_37562)" fill-opacity="1"/><path d="M89,64.86243677404785L89,43.96362277404785L88.732151,43.82320777404785L58.50000003,27.97454732404785L58.50000003,47.41651177404785L89,64.86243677404785ZM88,44.568469774047855L88,63.13840677404785L59.5,46.836475774047855L59.5,29.627858224047852L88,44.568469774047855Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/></g><g clip-path="url(#master_svg2_143_36341)"><path d="M32.56859821875,27.56376125L32.42002721875,27.42661825C32.09464421875,27.10965125,31.90252121875,26.68043925,31.882883218750003,26.22661825L30.74002621875,26.22661825L30.74002621875,3.88376141C30.73742821875,3.43834615,30.27823221875,3.14228559,29.87145421875,3.323761463L19.80288311875,7.52947525C19.35276551875,7.73022935,19.06522271875,8.17951485,19.07145451875,8.672332749999999L19.07145451875,26.21518925L18.10002588875,26.21518925C17.62617706875,26.21453525,17.24169921875,26.59848025,17.24169921875,27.07232825C17.24169921875,27.54617925,17.62617683875,27.93012825,18.10002588875,27.92947425L33.17431221875,27.92947425L32.78574221875,27.66661625L32.56859821875,27.56376125ZM37.35717021875,16.84376125C37.73498121875,16.60642825,38.168478218749996,16.47243925,38.61431321875,16.45519025C38.94686521875,16.46270525,39.27405121875,16.54060725,39.574312218749995,16.68376125L41.860027218750005,17.66661825L41.860027218750005,12.44376185C41.86428221875,11.94822695,41.57176021875,11.49819085,41.117170218750005,11.30090525L32.47716921875,7.99804685L32.47716921875,19.083761250000002C32.64974421875,18.88615425,32.86457421875,18.72991325,33.10573921875,18.626617250000002L37.35717021875,16.84376125ZM43.551454218749996,20.45519025C43.59511021875,20.43103825,43.62220421875,20.38508225,43.62220421875,20.33519125C43.62220421875,20.28530125,43.59511021875,20.23934525,43.551454218749996,20.21519125L41.92859621875,19.52947625L38.91145521875,18.283762250000002C38.82957221875,18.240982250000002,38.740429218749995,18.213852250000002,38.64859721875,18.20376225C38.464931218749996,18.25888025,38.28845821875,18.335607250000002,38.122883218750005,18.43233325L33.74573921875,20.20376225C33.70786821875,20.20376225,33.67716821875,20.23446225,33.67716821875,20.27233325C33.67716821875,20.31020325,33.70786821875,20.34090425,33.74573921875,20.34090425L38.591453218750004,23.06090325L38.86574021875,23.06090325L41.92859621875,21.34661825L43.551454218749996,20.45519025ZM43.82574121875,21.01519025L41.92859821875,22.04376225L39.06002621875,23.62090525C39.04922821875,23.64647825,39.04922821875,23.67533125,39.06002621875,23.70090525L39.06002621875,28.92376125C39.053015218750005,28.97232025,39.09096521875,29.01569325,39.140026218749995,29.01519025L40.945740218750004,27.94090425L43.72288321875,26.28376225L43.87145421875,26.19233325L43.87145421875,21.10661925C43.88021121875,21.06911125,43.86100021875,21.03068925,43.82574121875,21.01519025ZM33.72288321875,21.04947425C33.673822218750004,21.04897125,33.635872218749995,21.09234425,33.64288321875,21.14090325L33.64288321875,26.13518925C33.632086218750004,26.16076325,33.632086218750004,26.18961525,33.64288321875,26.21518925L36.52288421875,27.94090225L38.351455218750004,29.08375925C38.40051621875,29.08426325,38.43846721875,29.04089125,38.43145521875,28.99233025L38.43145521875,23.72375825C38.44225121875,23.69818325,38.44225121875,23.66933225,38.43145521875,23.64375925L33.72288321875,21.04947425ZM35.15145521875,23.52947425C34.991022218750004,23.45744525,34.94520021875,23.25124325,35.06002621875,23.11804625C35.11695121875,23.02876325,35.217087218749995,22.97651625,35.32288321875,22.98090325C35.37916521875,22.96686925,35.43803021875,22.96686925,35.49431221875,22.98090325L37.78002721875,24.23804625C37.919319218750005,24.32610925,37.960340218750005,24.51070625,37.87145621875,24.64947525C37.81297721875,24.73704525,37.71387821875,24.78874825,37.608598218750004,24.78661725C37.55167421875,24.79367025,37.49409721875,24.79367025,37.43717021875,24.78661725L35.15145521875,23.52947425Z" fill="#496FFE" fill-opacity="1" style="mix-blend-mode:passthrough"/></g></svg>
\ No newline at end of file
diff --git "a/src/assets/system/\347\273\204 210683.svg" "b/src/assets/system/\347\273\204 210683.svg"
new file mode 100644
index 0000000..bea3701
--- /dev/null
+++ "b/src/assets/system/\347\273\204 210683.svg"
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="59.5" height="64.90625" viewBox="0 0 59.5 64.90625"><defs><linearGradient x1="0" y1="0.16914062201976776" x2="0.8045321262753937" y2="1.0460527890370677" id="master_svg0_141_37616"><stop offset="48.549023270606995%" stop-color="#F7F7F7" stop-opacity="1"/><stop offset="100%" stop-color="#FFFFFF" stop-opacity="1"/></linearGradient><linearGradient x1="-0.03565644100308418" y1="0" x2="0.8226521556701855" y2="0.9991461352834076" id="master_svg1_141_37562"><stop offset="46.036821603775024%" stop-color="#F3F3F3" stop-opacity="1"/><stop offset="100%" stop-color="#FFFFFF" stop-opacity="1"/></linearGradient><clipPath id="master_svg2_143_35787"><rect x="12.5" y="0" width="34.000003814697266" height="34" rx="0"/></clipPath></defs><path d="M1.204819142818451,28.096379L28.69276814281845,44.307213000000004L58.29516614281845,28.096379L28.69276814281845,14L1.204819142818451,28.096379Z" fill="#FFFFFF" fill-opacity="1"/><path d="M0.16870074281845082,28.065809L28.43877614281845,44.737896L28.68361514281845,44.882288L59.39288714281845,28.065309L28.684561142818453,13.44229615L0.16870074281845082,28.065809ZM28.70192014281845,43.732138L2.240937742818451,28.12695L28.70097614281845,14.55770427L57.19744514281845,28.127449L28.70192014281845,43.732138Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/><path d="M0.5,28.80120277404785L0.5,47.83131777404785L28.692764,64.04215077404785L28.692764,45.01204077404785L0.5,28.80120277404785Z" fill="url(#master_svg0_141_37616)" fill-opacity="1"/><path d="M29.192764,64.90641177404785L29.192764,44.722777774047856L28.941999,44.578587774047854L-5.999999996841865e-8,27.93693918404785L0,48.12058077404785L29.192764,64.90641177404785ZM28.192764,45.30130377404785L28.192764,63.17788877404785L1,47.542054774047855L1,29.66546636404785L28.192764,45.30130377404785Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/><g transform="matrix(-1,0,0,1,118,0)"><path d="M59,28.80120277404785L59,47.12649377404785L88.5,64.00042177404785L88.5,44.26604677404785L59,28.80120277404785Z" fill="url(#master_svg1_141_37562)" fill-opacity="1"/><path d="M89,64.86243677404785L89,43.96362277404785L88.732151,43.82320777404785L58.50000003,27.97454732404785L58.50000003,47.41651177404785L89,64.86243677404785ZM88,44.568469774047855L88,63.13840677404785L59.5,46.836475774047855L59.5,29.627858224047852L88,44.568469774047855Z" fill-rule="evenodd" fill="#ECECEC" fill-opacity="1"/></g><g clip-path="url(#master_svg2_143_35787)"><path d="M16.5,17.5C16.5,10.0479994,22.547999400000002,4,30,4C37.452,4,43.5,10.0479999,43.5,17.5C43.5,24.952,37.452,31,30,31C22.547999400000002,31,16.5,24.952,16.5,17.5ZM25.2099543,11.2335448C25.056938199999998,11.1590481,24.889226,11.1196365,24.719044699999998,11.118180800000001C24.4576359,11.118180800000001,24.2600451,11.2102261,24.1250448,11.3930907C23.965045,11.566371,23.8772473,11.7942061,23.8795905,12.0300455C23.8795905,12.2902269,23.9716368,12.4779997,24.1545,12.5945911C24.1946921,12.6422205,24.2439098,12.681428,24.2993183,12.7099552C24.812317800000002,13.0376368,25.309363400000002,13.3910923,25.789226499999998,13.7654095C25.875135399999998,13.8550005,25.9782276,13.9249544,26.0935907,13.9691372C26.1991358,14.026819,26.3292265,14.055046,26.4838629,14.055046C26.763681,14.046455,26.98459,13.9114552,27.149045,13.6500463C27.266969,13.4697084,27.327709,13.2579737,27.323318,13.0425463C27.319848,12.8229294,27.219160000000002,12.6161594,27.048409,12.4780006C26.492164600000002,11.9851937,25.874157,11.5668635,25.2099543,11.2335448ZM34.731136,11.2924538L29.478408,11.2924538C28.610726,11.2924538,28.177500000000002,11.648363100000001,28.177500000000002,12.3626356L28.177500000000002,19.944725C28.176272,20.042908,28.18609,20.138634,28.205727,20.234362C28.070726,20.349726,28.003225999999998,20.553452,28.003225999999998,20.841862C28.013044999999998,21.11186,28.070726,21.309452,28.176271,21.434633C28.292863,21.569633,28.500272000000002,21.637133,28.798499,21.637133C29.464908,21.637133,30.404999,21.487406,31.621223999999998,21.189178C31.861770999999997,21.140087,32.026225,21.059088,32.112133,20.943726C32.243669,20.79126,32.310976,20.593739,32.299906,20.392679C32.299906,20.17177,32.252043,19.997498,32.156316000000004,19.872315999999998C32.033533,19.737026,31.860347,19.658427,31.677678999999998,19.655088C31.157317,19.732407000000002,30.632043,19.804814999999998,30.100635,19.872315999999998L30.100635,17.455816L34.673452,17.455816C34.759361,17.455816,34.837906000000004,17.450908,34.905409,17.441088999999998C34.893873,17.462564,34.878954,17.482039999999998,34.861225000000005,17.498772000000002C34.521141,17.859035,34.158792,18.197606999999998,33.776316,18.512499C33.275587,18.193407999999998,32.749089999999995,17.895182,32.199270999999996,17.615363000000002C32.035903,17.54202,31.857872,17.507168,31.678905999999998,17.513499C31.417496999999997,17.513499,31.21009,17.590817,31.056679000000003,17.745455C30.902043,17.880454999999998,30.823497,18.082954,30.823497,18.352954C30.828218,18.505149,30.890499,18.649888,30.997768,18.757953999999998C31.051738999999998,18.809553,31.116205,18.848902000000002,31.186768999999998,18.873317999999998C32.266769,19.520091999999998,33.48177,20.369364,34.831768,21.419909C35.01586,21.604,35.246586,21.694817,35.527632,21.694817C35.766716,21.695692,35.992073000000005,21.583241,36.135132,21.39168C36.289076,21.227486,36.371994,21.009171,36.36586,20.78418C36.362389,20.564564,36.261703,20.357796,36.090952,20.219635C35.802544,19.968045,35.503088000000005,19.728727,35.195042,19.495544000000002C35.705585,19.197316999999998,36.115498,18.873317,36.424769999999995,18.526C36.533014,18.357194,36.592867,18.161924,36.597816,17.961454C36.611883,17.651581,36.456854,17.358437000000002,36.192816,17.195636999999998C36.041086,17.073852000000002,35.852282,17.007597,35.657722,17.007863999999998C35.753451999999996,16.853229,35.802544,16.645819,35.802544,16.385637L35.802544,12.3626366C35.802544,11.6483641,35.445406,11.2924547,34.731136,11.2924538ZM33.878181,13.664773L30.100636,13.664773L30.100636,13.1002264C30.100636,12.9468174,30.192681999999998,12.8695002,30.375545000000002,12.8695002L33.603271,12.8695002C33.786135,12.8695002,33.87818,12.9468174,33.87818,13.1002264L33.878181,13.664773ZM33.603271,15.864044L30.100636,15.864044L30.100636,15.02459L33.878181,15.02459L33.878181,15.646818C33.878181,15.791636,33.786135,15.864044,33.603271,15.864044ZM25.6296825,15.473772L24.2698641,15.473772C23.9507732,15.473772,23.724954099999998,15.546182,23.5899544,15.690999C23.4451365,15.844409,23.3727274,16.076363999999998,23.3727274,16.385635C23.3727274,16.723136,23.4402275,16.950181999999998,23.5752277,17.065544C23.6905913,17.248407,23.9225464,17.340454,24.2698641,17.340454L24.834409700000002,17.340454C24.9497738,17.340454,25.0074549,17.398136,25.0074549,17.513499L25.0074549,21.637135C25.0074549,21.714453,24.9546824,21.786861,24.847909899999998,21.854361C24.4527292,22.139252,24.0315437,22.386209,23.5899544,22.591951C23.4451365,22.698725,23.3727274,22.814087,23.3727274,22.939268C23.3771172,23.0942,23.4117188,23.246782,23.4745903,23.388451C23.6476359,23.697725,23.835408700000002,23.943178,24.0391369,24.126041C24.1385455,24.200905,24.260046,24.242634,24.3852277,24.242634C24.5752201,24.217705,24.7579012,24.153328,24.921546,24.053633C25.228364,23.907587,25.5204544,23.728407,25.7892284,23.518543C25.8849545,23.432632,25.9622736,23.388451,26.0211821,23.388451C26.132575,23.390455,26.2397785,23.431255,26.3243189,23.503817C27.153955,23.842543,28.572682999999998,24.010681,30.578046,24.010681L35.97559,24.010681C36.313091,23.991043,36.545048,23.900225,36.670227,23.735771C36.805227,23.61059,36.872726,23.363907,36.872726,22.99818C36.872726,22.67909,36.790501,22.453272,36.627274,22.317045C36.492271,22.201681,36.294682,22.144001,36.033272,22.144001C35.368092000000004,22.144001,34.566679,22.163635,33.6315,22.201681C32.551497999999995,22.239727,31.379454000000003,22.259361,30.115364,22.259361C28.996092,22.259361,28.114910000000002,22.191862,27.468138,22.056862C27.071728999999998,21.979544,26.874138000000002,21.8605,26.874138000000002,21.694817L26.874138000000002,16.601637C26.874138000000002,15.849319,26.4593201,15.472546,25.6296825,15.472546L25.6296825,15.473772Z" fill="#3BB078" fill-opacity="1" style="mix-blend-mode:passthrough"/></g></svg>
\ No newline at end of file
diff --git a/src/components/AIChatSidebar/assistants/financeAssistant.js b/src/components/AIChatSidebar/assistants/financeAssistant.js
new file mode 100644
index 0000000..e8df3f4
--- /dev/null
+++ b/src/components/AIChatSidebar/assistants/financeAssistant.js
@@ -0,0 +1,26 @@
+import { Money } from '@element-plus/icons-vue'
+
+export const financeAssistant = {
+  key: 'finance',
+  label: '璐㈠姟鍔╃悊',
+  title: '璐㈠姟鏅鸿兘鍔╃悊',
+  tooltip: '璐㈠姟鏅鸿兘鍔╃悊',
+  icon: Money,
+  apiBase: '/financial-ai',
+  storageKey: 'financial_ai_chat_uuid',
+  placeholder: '璇疯緭鍏ヨ储鍔¢棶棰�... (Enter 鍙戦��, Shift+Enter 鎹㈣)',
+  welcomeMessage: '浣犲ソ',
+  description: '鎴戝彲浠ュ崗鍔╀綘瀹屾垚鎴愭湰鏍哥畻銆佸埄娑﹀垎鏋愩�佸簱瀛樿祫閲戝垎鏋愩�佺幇閲戞祦棰勬祴銆佸紓甯搁璀﹀拰缁忚惀鍛ㄦ姤瑙h銆�',
+  allowFileUpload: false,
+  emptySessionText: '鏆傛棤璐㈠姟浼氳瘽',
+  quickPrompts: [
+    '鐢熸垚鏈懆缁忚惀鍛ㄦ姤锛堝埄娑︿笌鐜伴噾娴侊級',
+    '鍒嗘瀽鏈湀鍒╂鼎涓嬮檷鍘熷洜',
+    '杩�30澶╁摢涓鎴峰埄娑﹁础鐚渶楂�',
+    '鏌ョ湅鏈湀缁忚惀椹鹃┒鑸�',
+    '鏌ヨ杩�30澶╀簭鎹熻鍗�',
+    '鍒嗘瀽杩�30澶╁簱瀛樿祫閲戝崰鐢�',
+    '棰勬祴鏈潵3涓湀鐜伴噾娴�',
+    '鍝釜宸ュ簭鎴愭湰鏈�楂�'
+  ]
+}
diff --git a/src/components/AIChatSidebar/assistants/index.js b/src/components/AIChatSidebar/assistants/index.js
index 61d4752..6e2a35d 100644
--- a/src/components/AIChatSidebar/assistants/index.js
+++ b/src/components/AIChatSidebar/assistants/index.js
@@ -1,6 +1,17 @@
 import { generalAssistant } from './generalAssistant'
 import { purchaseAssistant } from './purchaseAssistant'
+import { productionAssistant } from './productionAssistant'
+import { salesAssistant } from './salesAssistant'
+import { financeAssistant } from './financeAssistant'
 
-export { generalAssistant, purchaseAssistant }
+export { generalAssistant, purchaseAssistant, productionAssistant, salesAssistant, financeAssistant }
 
-export const builtInAssistants = [generalAssistant, purchaseAssistant]
+export const assistantRegistry = {
+  general: generalAssistant,
+  sales: salesAssistant,
+  purchase: purchaseAssistant,
+  production: productionAssistant,
+  finance: financeAssistant
+}
+
+export const builtInAssistants = [generalAssistant, salesAssistant, purchaseAssistant, productionAssistant, financeAssistant]
diff --git a/src/components/AIChatSidebar/assistants/productionAssistant.js b/src/components/AIChatSidebar/assistants/productionAssistant.js
new file mode 100644
index 0000000..fb2d737
--- /dev/null
+++ b/src/components/AIChatSidebar/assistants/productionAssistant.js
@@ -0,0 +1,27 @@
+import { Operation } from '@element-plus/icons-vue'
+
+export const productionAssistant = {
+  key: 'production',
+  label: '鐢熶骇鍔╃悊',
+  title: '鐢熶骇鏅鸿兘鍔╃悊',
+  tooltip: '鐢熶骇鏅鸿兘鍔╂墜',
+  icon: Operation,
+  apiBase: '/manufacturing-ai',
+  storageKey: 'production_ai_chat_uuid',
+  placeholder: '璇疯緭鍏ョ敓浜х浉鍏抽棶棰�... (Enter 鍙戦��, Shift+Enter 鎹㈣)',
+  welcomeMessage: '浣犲ソ',
+  description: '鎴戝彲浠ュ洿缁曠敓浜х幇鍦恒�佽鍒掋�佸伐鍗曘�佽澶囥�佽川閲忋�佺墿鏂欍�佸紓甯稿鐞嗘彁渚涙煡璇€�侀璀︺�佸垎鏋愬拰鍔炵悊寤鸿銆�',
+  allowFileUpload: false,
+  emptySessionText: '鏆傛棤鐢熶骇浼氳瘽',
+  quickPrompts: [
+    '鏌ヨ鏈湀鐢熶骇璁″垝',
+    '鏌ョ湅鏈�杩�10鏉″伐鍗�',
+    '鏌ヨ澶嘇-01鐨勭淮淇儏鍐�',
+    '鏌ヨ川閲忎笉鍚堟牸璁板綍',
+    '鏌ヤ綆搴撳瓨鐗╂枡',
+    '鏌ヨ繎7澶╁紓甯稿鐞�',
+    '鐢熸垚鍒堕�犻璀︾湅鏉�',
+    '鍒嗘瀽鏈湀鐢熶骇瀹屾垚鐜囧拰寮傚父鐜�',
+    '缁欏嚭宸ュ崟閫炬湡鍜岃澶囧緟淇殑鍔炵悊寤鸿'
+  ]
+}
diff --git a/src/components/AIChatSidebar/assistants/purchaseAssistant.js b/src/components/AIChatSidebar/assistants/purchaseAssistant.js
index 8f0ae0a..4f2e72c 100644
--- a/src/components/AIChatSidebar/assistants/purchaseAssistant.js
+++ b/src/components/AIChatSidebar/assistants/purchaseAssistant.js
@@ -19,7 +19,7 @@
     '鏈湀閲囪喘閲戦鎺掑悕鍓嶅崄鐨勭墿鏂欐湁鍝簺锛�',
     '鍝簺閲囪喘璁㈠崟杩樻湭鍏ュ簱锛�',
     '鏈�杩�7澶╀緵搴斿晢鍒拌揣寮傚父鏈夊摢浜涳紵',
-    '甯垜缁熻寰呬粯娆鹃噰璐崟',
+    '甯垜缁熻寰呬粯娆鹃噰璐崟锛�',
     '鍒楀嚭鏈湀閲囪喘閫�璐ф儏鍐�'
   ]
 }
diff --git a/src/components/AIChatSidebar/assistants/salesAssistant.js b/src/components/AIChatSidebar/assistants/salesAssistant.js
new file mode 100644
index 0000000..03cb102
--- /dev/null
+++ b/src/components/AIChatSidebar/assistants/salesAssistant.js
@@ -0,0 +1,28 @@
+import { TrendCharts } from '@element-plus/icons-vue'
+
+export const salesAssistant = {
+  key: 'sales',
+  label: '閿�鍞姪鎵�',
+  title: '閿�鍞櫤鑳藉姪鎵�',
+  tooltip: '閿�鍞櫤鑳藉姪鎵�',
+  icon: TrendCharts,
+  apiBase: '/sales-ai',
+  storageKey: 'sales_ai_chat_uuid',
+  placeholder: '璇疯緭鍏ラ攢鍞浉鍏抽棶棰�... (Enter 鍙戦�� / Shift+Enter 鎹㈣)',
+  welcomeMessage: '浣犲ソ',
+  description: '鎴戝彲浠ュ崗鍔╀綘鏌ヨ瀹㈡埛妗f銆侀攢鍞姤浠枫�侀攢鍞彴璐︺�侀攢鍞��璐с�佸鎴峰線鏉ャ�佸彂璐у彴璐︼紝骞堕噸鐐瑰垎鏋愬鎴锋祦澶遍闄╁強鍥炴/鎶ヤ环绛栫暐銆�',
+  allowFileUpload: false,
+  emptySessionText: '鏆傛棤閿�鍞細璇�',
+  quickPrompts: [
+    '鏌ヨ绉佹捣瀹㈡埛妗f鍓�10鏉�',
+    '鏌ヨ鍏捣瀹㈡埛妗f',
+    '鏌ヨ鏈湀閿�鍞姤浠�',
+    '鏌ヨ鏈湀閿�鍞彴璐�',
+    '鏌ヨ杩�30澶╅攢鍞��璐�',
+    '鏌ヨ杩�30澶╁鎴峰洖娆惧線鏉�',
+    '鏌ヨ鏈湀鍙戣揣鍙拌处',
+    '鏌ョ湅閿�鍞寚鏍囩粺璁�',
+    '甯垜鍋氬鎴锋祦澶遍闄╁垎鏋愶紝杩�30澶╋紝鍓�20鏉�',
+    '鐢熸垚鍥炴涓庢姤浠风瓥鐣ュ缓璁紝浼樺厛楂橀闄╁鎴�'
+  ]
+}
diff --git a/src/components/AIChatSidebar/index.vue b/src/components/AIChatSidebar/index.vue
index a2a365a..7b22d7b 100644
--- a/src/components/AIChatSidebar/index.vue
+++ b/src/components/AIChatSidebar/index.vue
@@ -4,7 +4,7 @@
     <div v-if="!hideTrigger" class="ai-chat-trigger" @click="toggleSidebar" v-show="!visible">
       <el-tooltip :content="currentAssistant.tooltip" placement="left">
         <div class="trigger-icon">
-          <el-icon :size="30" color="#fff"><component :is="currentAssistant.icon" /></el-icon>
+          <el-icon :size="22" color="#fff"><component :is="currentAssistant.icon" /></el-icon>
         </div>
       </el-tooltip>
     </div>
@@ -227,6 +227,12 @@
                       :id="`ai-chart-${index}-${key}`"
                   ></div>
                 </div>
+                <div
+                    v-else-if="message.chartMarkdownParseFailed"
+                    class="chart-empty-state"
+                >
+                  鍥捐〃瑙f瀽澶辫触锛岃绋嶅悗閲嶈瘯銆�
+                </div>
 
                 <!-- 琛ㄦ牸鍐呭 -->
                 <div v-if="message.type === 'todo_list' && message.tableData" class="table-wrapper">
@@ -242,7 +248,361 @@
                   </el-table>
                 </div>
 
-                <!-- 鎵撳瓧涓姩鐢� -->
+                <div v-if="message.manufacturingData" class="manufacturing-card">
+                  <div class="manufacturing-card__title">{{ getManufacturingTypeLabel(message.type) }}</div>
+
+                  <div
+                      v-if="message.manufacturingData.summaryEntries?.length || message.manufacturingData.coreMetrics?.length"
+                      class="manufacturing-summary-grid"
+                  >
+                    <div
+                        v-for="(entry, entryIndex) in message.manufacturingData.summaryEntries"
+                        :key="`summary-${entry.key}-${entryIndex}`"
+                        class="manufacturing-summary-item"
+                    >
+                      <span class="manufacturing-summary-label">{{ entry.label }}</span>
+                      <strong class="manufacturing-summary-value">{{ entry.value }}</strong>
+                    </div>
+                    <div
+                        v-for="(metric, metricIndex) in message.manufacturingData.coreMetrics"
+                        :key="`core-${metric.key}-${metricIndex}`"
+                        class="manufacturing-summary-item manufacturing-summary-item--core"
+                    >
+                      <span class="manufacturing-summary-label">{{ metric.label }}</span>
+                      <strong class="manufacturing-summary-value">{{ metric.value }}</strong>
+                    </div>
+                  </div>
+
+                  <div v-if="message.manufacturingData.warningItems?.length" class="manufacturing-warning-list">
+                    <div
+                        v-for="(warning, warningIndex) in message.manufacturingData.warningItems"
+                        :key="`warning-${warning.title || warningIndex}`"
+                        class="manufacturing-warning-item"
+                    >
+                      <div class="manufacturing-warning-item__head">
+                        <el-tag size="small" :type="getManufacturingWarningLevelType(warning.level)">
+                          {{ getManufacturingWarningLevelLabel(warning.level) }}
+                        </el-tag>
+                        <strong>{{ warning.title || `棰勮 ${warningIndex + 1}` }}</strong>
+                        <span v-if="warning.count !== '' && warning.count !== null && warning.count !== undefined" class="manufacturing-warning-count">
+                          {{ warning.count }}
+                        </span>
+                      </div>
+                      <p v-if="warning.detail" class="manufacturing-warning-detail">{{ warning.detail }}</p>
+                    </div>
+                  </div>
+
+                  <div
+                      v-if="message.manufacturingData.listItems?.length && message.manufacturingData.columns?.length"
+                      class="table-wrapper manufacturing-table-wrapper"
+                  >
+                    <el-table :data="message.manufacturingData.listItems" border stripe size="small" style="width: 100%">
+                      <el-table-column
+                          v-for="col in message.manufacturingData.columns"
+                          :key="col"
+                          :label="getStructuredFieldLabel(col)"
+                          min-width="140"
+                          show-overflow-tooltip
+                      >
+                        <template #default="{ row }">
+                          {{ formatStructuredValue(row[col]) }}
+                        </template>
+                      </el-table-column>
+                    </el-table>
+                  </div>
+
+                  <div v-if="message.manufacturingData.actionCards?.length" class="manufacturing-action-list">
+                    <div
+                        v-for="(card, cardIndex) in message.manufacturingData.actionCards"
+                        :key="card.runtimeKey || `${card.code}-${card.targetApi}-${cardIndex}`"
+                        class="manufacturing-action-card"
+                    >
+                      <div class="manufacturing-action-card__head">
+                        <strong>{{ card.name || `鍔ㄤ綔 ${cardIndex + 1}` }}</strong>
+                        <el-tag size="small" type="info">{{ getNormalizedRequestMethod(card.method) }}</el-tag>
+                      </div>
+                      <div class="manufacturing-action-card__meta">
+                        <span>{{ card.code || '--' }}</span>
+                        <span>{{ card.targetApi || '--' }}</span>
+                      </div>
+                      <p v-if="card.description" class="manufacturing-action-card__desc">{{ card.description }}</p>
+                      <div v-if="card.requiredFields?.length" class="manufacturing-required-fields">
+                        <span>蹇呭~瀛楁</span>
+                        <el-tag
+                            v-for="field in card.requiredFields"
+                            :key="field"
+                            size="small"
+                            type="warning"
+                        >
+                          {{ getStructuredPathLabel(field) }}
+                        </el-tag>
+                      </div>
+                      <el-input
+                          v-model="card.payloadText"
+                          type="textarea"
+                          :rows="6"
+                          resize="vertical"
+                          :disabled="card.executing"
+                          placeholder="璇疯緭鍏� JSON 璇锋眰鍙傛暟"
+                      />
+                      <div class="manufacturing-action-footer">
+                        <span
+                            v-if="card.executeResult"
+                            :class="['manufacturing-action-result', card.executeError ? 'error' : 'success']"
+                        >
+                          {{ card.executeResult }}
+                        </span>
+                        <el-button
+                            type="primary"
+                            size="small"
+                            :loading="card.executing"
+                            @click="executeManufacturingAction(message, card, cardIndex)"
+                        >
+                          纭骞舵墽琛�
+                        </el-button>
+                      </div>
+                    </div>
+                  </div>
+                </div>
+
+                <div v-if="message.salesData" class="sales-structured-card">
+                  <div class="sales-structured-card__title">{{ getSalesTypeLabel(message.type) }}</div>
+
+                  <div v-if="message.salesData.summaryEntries?.length" class="sales-summary-grid">
+                    <div
+                        v-for="(entry, entryIndex) in message.salesData.summaryEntries"
+                        :key="`sales-summary-${entry.key}-${entryIndex}`"
+                        class="sales-summary-item"
+                    >
+                      <span class="sales-summary-label">{{ entry.label }}</span>
+                      <strong class="sales-summary-value">{{ entry.value }}</strong>
+                    </div>
+                  </div>
+
+                  <div v-if="message.type === 'sales_customer_churn_risk' && message.salesData.listItems?.length" class="sales-focus-list">
+                    <div
+                        v-for="(item, itemIndex) in message.salesData.listItems"
+                        :key="`risk-${item.customerName || itemIndex}`"
+                        class="sales-focus-item"
+                    >
+                      <div class="sales-focus-item__head">
+                        <strong>{{ formatStructuredValue(item.customerName) }}</strong>
+                        <div class="sales-focus-tags">
+                          <el-tag size="small" :type="getSalesLevelTagType(item.riskLevel)">
+                            {{ getSalesLevelLabel(item.riskLevel, 'risk') }}
+                          </el-tag>
+                          <el-tag size="small" type="warning">椋庨櫓鍒� {{ formatStructuredValue(item.riskScore) }}</el-tag>
+                        </div>
+                      </div>
+                      <div class="sales-focus-metrics">
+                        <span>寰呭洖娆撅細{{ formatStructuredValue(item.pendingAmount) }}</span>
+                        <span>寰呭洖娆惧崰姣旓細{{ formatStructuredValue(item.pendingRate) }}</span>
+                        <span>璺濅笂娆′笅鍗曪細{{ formatStructuredValue(item.daysSinceLastOrder) }}</span>
+                      </div>
+                      <div v-if="toStructuredStringArray(item.riskReasons).length" class="sales-focus-reasons">
+                        <el-tag
+                            v-for="(reason, reasonIndex) in toStructuredStringArray(item.riskReasons)"
+                            :key="`${item.customerName || itemIndex}-reason-${reasonIndex}`"
+                            size="small"
+                            type="danger"
+                            effect="plain"
+                        >
+                          {{ reason }}
+                        </el-tag>
+                      </div>
+                    </div>
+                  </div>
+
+                  <div v-if="message.type === 'sales_collection_quote_strategy' && message.salesData.listItems?.length" class="sales-focus-list">
+                    <div
+                        v-for="(item, itemIndex) in message.salesData.listItems"
+                        :key="`strategy-${item.customerName || itemIndex}`"
+                        class="sales-focus-item sales-focus-item--strategy"
+                    >
+                      <div class="sales-focus-item__head">
+                        <strong>{{ formatStructuredValue(item.customerName) }}</strong>
+                        <div class="sales-focus-tags">
+                          <el-tag size="small" :type="getSalesLevelTagType(item.priority)">
+                            {{ getSalesLevelLabel(item.priority, 'priority') }}
+                          </el-tag>
+                          <el-tag size="small" type="success">杞寲鐜� {{ formatStructuredValue(item.quoteConversionRate) }}</el-tag>
+                        </div>
+                      </div>
+                      <div class="sales-focus-metrics">
+                        <span>寰呭洖娆撅細{{ formatStructuredValue(item.pendingAmount) }}</span>
+                        <span v-if="item.nextAction">涓嬩竴姝ワ細{{ formatStructuredValue(item.nextAction) }}</span>
+                      </div>
+                      <p v-if="item.collectionStrategy" class="sales-strategy-line">
+                        <strong>鍥炴绛栫暐锛�</strong>{{ formatStructuredValue(item.collectionStrategy) }}
+                      </p>
+                      <p v-if="item.quotationStrategy" class="sales-strategy-line">
+                        <strong>鎶ヤ环绛栫暐锛�</strong>{{ formatStructuredValue(item.quotationStrategy) }}
+                      </p>
+                    </div>
+                  </div>
+
+                  <div
+                      v-if="message.salesData.listItems?.length && message.salesData.columns?.length && !isSalesFocusType(message.type)"
+                      class="table-wrapper manufacturing-table-wrapper"
+                  >
+                    <el-table :data="message.salesData.listItems" border stripe size="small" style="width: 100%">
+                      <el-table-column
+                          v-for="col in message.salesData.columns"
+                          :key="col"
+                          :label="getStructuredFieldLabel(col)"
+                          min-width="140"
+                          show-overflow-tooltip
+                      >
+                        <template #default="{ row }">
+                          {{ formatStructuredValue(row[col]) }}
+                        </template>
+                      </el-table-column>
+                    </el-table>
+                  </div>
+
+                  <div v-if="message.salesData.topCustomers?.length && message.salesData.topCustomerColumns?.length" class="table-wrapper manufacturing-table-wrapper">
+                    <div class="sales-section-title">閲嶇偣瀹㈡埛</div>
+                    <el-table :data="message.salesData.topCustomers" border stripe size="small" style="width: 100%">
+                      <el-table-column
+                          v-for="col in message.salesData.topCustomerColumns"
+                          :key="`top-customer-${col}`"
+                          :label="getStructuredFieldLabel(col)"
+                          min-width="120"
+                          show-overflow-tooltip
+                      >
+                        <template #default="{ row }">
+                          {{ formatStructuredValue(row[col]) }}
+                        </template>
+                      </el-table-column>
+                    </el-table>
+                  </div>
+
+                  <div v-if="message.salesData.contractTrend?.length && message.salesData.contractTrendColumns?.length" class="table-wrapper manufacturing-table-wrapper">
+                    <div class="sales-section-title">鍚堝悓瓒嬪娍</div>
+                    <el-table :data="message.salesData.contractTrend" border stripe size="small" style="width: 100%">
+                      <el-table-column
+                          v-for="col in message.salesData.contractTrendColumns"
+                          :key="`contract-trend-${col}`"
+                          :label="getStructuredFieldLabel(col)"
+                          min-width="120"
+                          show-overflow-tooltip
+                      >
+                        <template #default="{ row }">
+                          {{ formatStructuredValue(row[col]) }}
+                        </template>
+                      </el-table-column>
+                    </el-table>
+                  </div>
+                </div>
+
+                <div v-if="message.purchaseData" class="sales-structured-card">
+                  <div class="sales-structured-card__title">{{ getPurchaseTypeLabel(message.type) }}</div>
+
+                  <div v-if="message.purchaseData.summaryEntries?.length" class="sales-summary-grid">
+                    <div
+                        v-for="(entry, entryIndex) in message.purchaseData.summaryEntries"
+                        :key="`purchase-summary-${entry.key}-${entryIndex}`"
+                        class="sales-summary-item"
+                    >
+                      <span class="sales-summary-label">{{ entry.label }}</span>
+                      <strong class="sales-summary-value">{{ entry.value }}</strong>
+                    </div>
+                  </div>
+
+                  <div
+                      v-if="message.purchaseData.listItems?.length && message.purchaseData.columns?.length"
+                      class="table-wrapper manufacturing-table-wrapper"
+                  >
+                    <el-table :data="message.purchaseData.listItems" border stripe size="small" style="width: 100%">
+                      <el-table-column
+                          v-for="col in message.purchaseData.columns"
+                          :key="col"
+                          :label="getStructuredFieldLabel(col)"
+                          min-width="140"
+                          show-overflow-tooltip
+                      >
+                        <template #default="{ row }">
+                          {{ formatStructuredValue(row[col]) }}
+                        </template>
+                      </el-table-column>
+                    </el-table>
+                  </div>
+                </div>
+
+                <div v-if="message.financeData" class="sales-structured-card">
+                  <div class="sales-structured-card__title">{{ getFinancialTypeLabel(message.type) }}</div>
+
+                  <div v-if="message.financeData.summaryEntries?.length" class="sales-summary-grid">
+                    <div
+                        v-for="(entry, entryIndex) in message.financeData.summaryEntries"
+                        :key="`finance-summary-${entry.key}-${entryIndex}`"
+                        class="sales-summary-item"
+                    >
+                      <span class="sales-summary-label">{{ entry.label }}</span>
+                      <strong class="sales-summary-value">{{ entry.value }}</strong>
+                    </div>
+                  </div>
+
+                  <div v-if="message.financeData.headline" class="finance-headline">
+                    {{ message.financeData.headline }}
+                  </div>
+
+                  <div v-if="message.financeData.conclusions?.length" class="finance-text-section">
+                    <div class="sales-section-title">鏍稿績缁撹</div>
+                    <ul>
+                      <li v-for="(item, idx) in message.financeData.conclusions" :key="`finance-conclusion-${idx}`">
+                        {{ item }}
+                      </li>
+                    </ul>
+                  </div>
+
+                  <div v-if="message.financeData.riskSuggestions?.length" class="finance-text-section">
+                    <div class="sales-section-title">椋庨櫓寤鸿</div>
+                    <ul>
+                      <li v-for="(item, idx) in message.financeData.riskSuggestions" :key="`finance-risk-${idx}`">
+                        {{ item }}
+                      </li>
+                    </ul>
+                  </div>
+
+                  <div
+                      v-for="section in message.financeData.sections"
+                      :key="`finance-section-${section.key}`"
+                      class="table-wrapper manufacturing-table-wrapper"
+                  >
+                    <div class="sales-section-title">{{ section.title }}</div>
+                    <el-table :data="section.items" border stripe size="small" style="width: 100%">
+                      <el-table-column
+                          v-for="col in section.columns"
+                          :key="`finance-${section.key}-${col}`"
+                          :label="getStructuredFieldLabel(col)"
+                          min-width="120"
+                          show-overflow-tooltip
+                      >
+                        <template #default="{ row }">
+                          {{ formatStructuredValue(row[col]) }}
+                        </template>
+                      </el-table-column>
+                    </el-table>
+                  </div>
+                </div>
+
+                <div v-if="message.purchaseIntentData?.quickPrompts?.length" class="purchase-intent-quick-prompt-wrap">
+                  <div class="purchase-intent-quick-prompt-title">璇曡瘯浠ヤ笅鎻愰棶</div>
+                  <div class="quick-prompt-list purchase-intent-quick-prompt-list">
+                    <button
+                        v-for="prompt in message.purchaseIntentData.quickPrompts"
+                        :key="`purchase-intent-${prompt}`"
+                        type="button"
+                        class="quick-prompt-btn"
+                        :disabled="isSending"
+                        @click="sendQuickPrompt(prompt)"
+                    >
+                      {{ prompt }}
+                    </button>
+                  </div>
+                </div>
+
                 <div v-if="message.purchaseAnalysisData" class="purchase-confirm-card">
                   <div class="purchase-confirm-header">
                     <span>{{ businessTypeLabelMap[message.purchaseAnalysisData.businessType] || message.purchaseAnalysisData.businessType || '閲囪喘涓氬姟' }}</span>
@@ -523,7 +883,7 @@
 import request from '@/utils/request'
 import * as echarts from 'echarts'
 import { Cpu, User, Plus, Timer, Delete, ChatDotSquare, VideoPause, Upload, Document, Close, Promotion, RefreshRight } from '@element-plus/icons-vue'
-import { ElMessage } from 'element-plus'
+import { ElMessage, ElMessageBox } from 'element-plus'
 import { builtInAssistants, generalAssistant } from './assistants'
 import todoAssistantAvatar from '@/assets/AI/寰呭姙鍔╂墜.png'
 import salesAssistantAvatar from '@/assets/AI/閿�鍞姪鎵�.png'
@@ -634,6 +994,194 @@
   purchase_return_order: '閲囪喘閫�璐у崟',
   unknown: '鏈煡閲囪喘涓氬姟'
 }
+const salesStructuredTypeSet = new Set([
+  'sales_customer_profile_list',
+  'sales_quotation_list',
+  'sales_ledger_list',
+  'sales_return_list',
+  'sales_customer_interaction_list',
+  'sales_shipping_list',
+  'sales_dashboard',
+  'sales_customer_churn_risk',
+  'sales_collection_quote_strategy'
+])
+const salesFocusTypeSet = new Set([
+  'sales_customer_churn_risk',
+  'sales_collection_quote_strategy'
+])
+const salesTypeLabelMap = {
+  sales_customer_profile_list: '瀹㈡埛妗f',
+  sales_quotation_list: '閿�鍞姤浠�',
+  sales_ledger_list: '閿�鍞彴璐�',
+  sales_return_list: '閿�鍞��娆�/鍥炴璁板綍',
+  sales_customer_interaction_list: '瀹㈡埛寰�鏉�',
+  sales_shipping_list: '鍙戣揣鍙拌处',
+  sales_dashboard: '閿�鍞寚鏍囩粺璁�',
+  sales_customer_churn_risk: '瀹㈡埛娴佸け椋庨櫓鍒嗘瀽',
+  sales_collection_quote_strategy: '鍥炴涓庢姤浠风瓥鐣ュ缓璁�'
+}
+const purchaseTypeLabelMap = {
+  purchase_material_rank: '閲囪喘鐗╂枡閲戦鎺掕',
+  purchase_stats: '閲囪喘缁熻',
+  purchase_pending_payment_list: '寰呬粯娆鹃噰璐崟'
+}
+const financialStructuredTypeSet = new Set([
+  'financial_cost_accounting',
+  'financial_order_profit_analysis',
+  'financial_inventory_capital_analysis',
+  'financial_cashflow_forecast',
+  'financial_business_anomaly_warning',
+  'financial_business_cockpit',
+  'financial_operation_report',
+  'financial_rag_knowledge'
+])
+const financialTypeLabelMap = {
+  financial_cost_accounting: '鎴愭湰鏍哥畻',
+  financial_order_profit_analysis: '璁㈠崟鍒╂鼎鍒嗘瀽',
+  financial_inventory_capital_analysis: '搴撳瓨璧勯噾鍒嗘瀽',
+  financial_cashflow_forecast: '鐜伴噾娴侀娴�',
+  financial_business_anomaly_warning: '缁忚惀寮傚父棰勮',
+  financial_business_cockpit: '缁忚惀椹鹃┒鑸�',
+  financial_operation_report: '缁忚惀鎶ュ憡',
+  financial_rag_knowledge: '璐㈠姟鐭ヨ瘑妫�绱�'
+}
+const manufacturingStructuredTypeSet = new Set([
+  'manufacturing_site_snapshot',
+  'manufacturing_plan_list',
+  'manufacturing_workorder_list',
+  'manufacturing_device_list',
+  'manufacturing_device_repair_list',
+  'manufacturing_quality_list',
+  'manufacturing_material_list',
+  'manufacturing_exception_list',
+  'manufacturing_warning',
+  'manufacturing_analysis',
+  'manufacturing_action_plan'
+])
+const manufacturingListTypeSet = new Set([
+  'manufacturing_plan_list',
+  'manufacturing_workorder_list',
+  'manufacturing_device_list',
+  'manufacturing_device_repair_list',
+  'manufacturing_quality_list',
+  'manufacturing_material_list',
+  'manufacturing_exception_list'
+])
+const manufacturingTypeLabelMap = {
+  manufacturing_site_snapshot: '鐢熶骇鐜板満姒傝',
+  manufacturing_plan_list: '璁″垝鏌ヨ',
+  manufacturing_workorder_list: '宸ュ崟鏌ヨ',
+  manufacturing_device_list: '璁惧鏌ヨ',
+  manufacturing_device_repair_list: '璁惧缁翠慨璁板綍鏌ヨ',
+  manufacturing_quality_list: '璐ㄩ噺鏌ヨ',
+  manufacturing_material_list: '鐗╂枡鏌ヨ',
+  manufacturing_exception_list: '寮傚父鏌ヨ',
+  manufacturing_warning: '棰勮鐪嬫澘',
+  manufacturing_analysis: '缁忚惀鍒嗘瀽',
+  manufacturing_action_plan: '鍔炵悊寤鸿'
+}
+const structuredFieldLabelMap = {
+  workOrderNo: '宸ュ崟鍙�',
+  planEndTime: '璁″垝缁撴潫鏃堕棿',
+  planStartTime: '璁″垝寮�濮嬫椂闂�',
+  timeRange: '鏃堕棿鑼冨洿',
+  startDate: '寮�濮嬫棩鏈�',
+  endDate: '缁撴潫鏃ユ湡',
+  warningCount: '棰勮鏁伴噺',
+  overduePlanCount: '閫炬湡璁″垝鏁�',
+  overdueWorkOrderCount: '閫炬湡宸ュ崟鏁�',
+  actionCount: '寤鸿鍔ㄤ綔鏁�',
+  qualityOpenCount: '璐ㄩ噺寰呭鐞嗘暟',
+  lowStockCount: '浣庡簱瀛樻暟',
+  exceptionCount: '寮傚父鏁�',
+  userId: '鐢ㄦ埛ID',
+  tenantId: '绉熸埛ID',
+  status: '鐘舵��',
+  deviceName: '璁惧鍚嶇О',
+  deviceModel: '璁惧鍨嬪彿',
+  pendingRepairCount: '寰呯淮淇暟',
+  repairTime: '缁翠慨鏃堕棿',
+  repairName: '鎶ヤ慨浜�',
+  maintenanceName: '缁翠慨浜哄憳',
+  level: '棰勮绛夌骇',
+  title: '鏍囬',
+  count: '鏁伴噺',
+  detail: '璇︽儏',
+  remark: '澶囨敞',
+  createTime: '鍒涘缓鏃堕棿',
+  updateTime: '鏇存柊鏃堕棿',
+  exceptionType: '寮傚父绫诲瀷',
+  materialName: '鐗╂枡鍚嶇О',
+  stockQty: '搴撳瓨閲�'
+}
+Object.assign(structuredFieldLabelMap, {
+  refundId: '閫�娆�/鍥炴鍗曞彿',
+  collectionNumber: '鏀舵鍗曞彿',
+  collectionAmount: '鏀舵閲戦',
+  actualAmount: '鏀舵閲戦(鍏煎)',
+  customerId: '瀹㈡埛ID',
+  salesLedgerId: '閿�鍞彴璐D',
+  projectName: '椤圭洰鍚嶇О',
+  receiptPaymentDate: '鏀朵粯娆炬棩鏈�',
+  receiptPaymentAmount: '鏀朵粯娆鹃噾棰�',
+  receiptPaymentType: '鏀朵粯娆剧被鍨�',
+  registrant: '鐧昏浜�',
+  returnAmount: '鍥炴閲戦姹囨��',
+  totalReceiptAmount: '鏀舵鎬婚',
+  customerCount: '瀹㈡埛鏁�',
+  paidAmount: '宸蹭粯娆鹃噾棰�',
+  contractAmount: '鍚堝悓閲戦',
+  paymentCount: '浠樻绗旀暟',
+  invoiceCount: '鍙戠エ绗旀暟',
+  paymentAmount: '浠樻閲戦',
+  invoiceAmount: '鍙戠エ閲戦',
+  customerName: '瀹㈡埛鍚嶇О',
+  riskLevel: '椋庨櫓绛夌骇',
+  riskScore: '椋庨櫓璇勫垎',
+  riskReasons: '椋庨櫓鍘熷洜',
+  pendingAmount: '寰呭洖娆鹃噾棰�',
+  pendingRate: '寰呭洖娆惧崰姣�',
+  daysSinceLastOrder: '璺濅笂娆′笅鍗曞ぉ鏁�',
+  priority: '浼樺厛绾�',
+  quoteConversionRate: '鎶ヤ环杞寲鐜�',
+  collectionStrategy: '鍥炴绛栫暐',
+  quotationStrategy: '鎶ヤ环绛栫暐',
+  nextAction: '涓嬩竴姝ュ姩浣�',
+  salesContractNo: '閿�鍞悎鍚屽彿',
+  revenue: '鏀跺叆',
+  materialCost: '鏉愭枡鎴愭湰',
+  laborCost: '浜哄伐鎴愭湰',
+  depreciationCost: '鎶樻棫鎴愭湰',
+  scrapCost: '鎶ュ簾鎴愭湰',
+  totalCost: '鎬绘垚鏈�',
+  profit: '鍒╂鼎',
+  profitRate: '鍒╂鼎鐜�',
+  reasons: '鍘熷洜',
+  suggestion: '寤鸿',
+  productName: '浜у搧鍚嶇О',
+  model: '鍨嬪彿',
+  quantity: '鏁伴噺',
+  inventoryValue: '搴撳瓨璧勯噾',
+  stagnantDays: '鍛嗘粸澶╂暟',
+  overstock: '鏄惁瓒呭偍',
+  month: '鏈堜唤',
+  income: '鏀跺叆',
+  expense: '鏀嚭',
+  netFlow: '鍑�鐜伴噾娴�',
+  message: '棰勮淇℃伅',
+  headline: '鎶ュ憡鏍囬',
+  conclusions: '鏍稿績缁撹',
+  riskSuggestions: '椋庨櫓寤鸿',
+  orderProfitTop: '鍒╂鼎Top',
+  contractAmountTotal: '鍚堝悓鎬婚',
+  receivedAmountTotal: '宸插洖娆鹃噾棰�',
+  pendingAmountTotal: '寰呭洖娆炬�婚',
+  shipRate: '鍙戣揣鐜�',
+  pendingOrderCount: '寰呬粯娆捐鍗曟暟',
+  totalContractAmount: '寰呬粯娆惧悎鍚屾�婚',
+  totalPaidAmount: '宸蹭粯娆炬�婚',
+  totalPendingAmount: '寰呬粯娆炬�婚'
+})
 const purchasePayloadFieldLabelMap = {
   purchaseLedgers: '閲囪喘鍙拌处',
   productData: '浜у搧鏄庣粏',
@@ -785,6 +1333,536 @@
   inventoryWarningQuantity: 'inventoryWarningQuantity',
   isInspected: 'isInspected',
   isChecked: 'isInspected'
+}
+const isPlainObject = (value) => value !== null && typeof value === 'object' && !Array.isArray(value)
+
+const stringifyStructuredPayload = (value, spaces = 2) => {
+  if (typeof value === 'string') return value
+  try {
+    return JSON.stringify(value ?? {}, null, spaces)
+  } catch (err) {
+    return '{}'
+  }
+}
+
+const structuredFieldTokenLabelMap = {
+  time: '鏃堕棿',
+  range: '鑼冨洿',
+  start: '寮�濮�',
+  end: '缁撴潫',
+  date: '鏃ユ湡',
+  warning: '棰勮',
+  overdue: '閫炬湡',
+  plan: '璁″垝',
+  work: '宸�',
+  order: '鍗�',
+  workorder: '宸ュ崟',
+  count: '鏁伴噺',
+  quality: '璐ㄩ噺',
+  low: '浣�',
+  stock: '搴撳瓨',
+  exception: '寮傚父',
+  action: '鍔ㄤ綔',
+  user: '鐢ㄦ埛',
+  tenant: '绉熸埛',
+  id: 'ID',
+  no: '缂栧彿',
+  number: '缂栧彿',
+  code: '缂栫爜',
+  name: '鍚嶇О',
+  status: '鐘舵��',
+  level: '绛夌骇',
+  title: '鏍囬',
+  detail: '璇︽儏',
+  total: '鎬绘暟',
+  rate: '姣旂巼',
+  type: '绫诲瀷',
+  pending: '寰�',
+  repair: '缁翠慨',
+  device: '璁惧',
+  material: '鐗╂枡'
+}
+
+const convertStructuredFieldKeyToChinese = (fieldKey = '') => {
+  const key = String(fieldKey || '').trim()
+  if (!key) return '-'
+  if (structuredFieldLabelMap[key]) return structuredFieldLabelMap[key]
+  if (/[\u4e00-\u9fa5]/.test(key)) return key
+
+  const rawTokens = key
+    .replace(/([a-z0-9])([A-Z])/g, '$1 $2')
+    .replace(/[_-]+/g, ' ')
+    .trim()
+    .split(/\s+/)
+    .filter(Boolean)
+    .map(token => token.toLowerCase())
+
+  if (!rawTokens.length) return '瀛楁'
+
+  const mappedTokens = rawTokens
+    .map(token => structuredFieldTokenLabelMap[token] || '')
+    .filter(Boolean)
+
+  if (mappedTokens.length) {
+    return mappedTokens.join('')
+  }
+
+  return '瀛楁'
+}
+
+const getStructuredFieldLabel = (fieldKey = '') => {
+  return convertStructuredFieldKeyToChinese(fieldKey)
+}
+
+const getStructuredPathLabel = (fieldPath = '') => {
+  const path = String(fieldPath || '').trim()
+  if (!path) return '-'
+
+  const segments = path
+    .replace(/\[(\d+)]/g, '.$1')
+    .split('.')
+    .filter(Boolean)
+
+  if (!segments.length) return getStructuredFieldLabel(path)
+
+  return segments.map((segment) => {
+    if (/^\d+$/.test(segment)) {
+      return `绗�${Number(segment) + 1}椤筦
+    }
+    return getStructuredFieldLabel(segment)
+  }).join(' / ')
+}
+
+const formatStructuredValue = (value) => {
+  if (value === null || value === undefined || value === '') return '-'
+  if (Array.isArray(value)) {
+    const preview = value.slice(0, 3).map(item => formatStructuredValue(item)).join('銆�')
+    return value.length > 3 ? `${preview} 绛�${value.length}椤筦 : preview
+  }
+  if (isPlainObject(value)) return stringifyStructuredPayload(value, 0)
+  return String(value)
+}
+
+const normalizeManufacturingSummaryEntries = (summary) => {
+  if (!isPlainObject(summary)) return []
+  return Object.entries(summary)
+    .filter(([, value]) => value !== undefined && value !== null && `${value}`.trim() !== '')
+    .map(([key, value]) => ({
+      key,
+      label: getStructuredFieldLabel(key),
+      value: formatStructuredValue(value)
+    }))
+}
+
+const normalizeManufacturingCoreMetrics = (coreMetrics) => {
+  if (Array.isArray(coreMetrics)) {
+    return coreMetrics.map((item, index) => {
+      if (isPlainObject(item)) {
+        const label = item.label || item.name || item.key || `鎸囨爣${index + 1}`
+        const metricValue = item.value ?? item.metricValue ?? item.data ?? '-'
+        const unit = item.unit ? ` ${item.unit}` : ''
+        return {
+          key: String(item.key || item.name || index),
+          label,
+          value: `${formatStructuredValue(metricValue)}${unit}`.trim()
+        }
+      }
+      return {
+        key: String(index),
+        label: `鎸囨爣${index + 1}`,
+        value: formatStructuredValue(item)
+      }
+    })
+  }
+
+  if (isPlainObject(coreMetrics)) {
+    return Object.entries(coreMetrics).map(([key, value]) => ({
+      key,
+      label: getStructuredFieldLabel(key),
+      value: formatStructuredValue(value)
+    }))
+  }
+
+  return []
+}
+
+const normalizeManufacturingWarningItems = (items = []) => {
+  if (!Array.isArray(items)) return []
+  return items
+    .filter(item => isPlainObject(item))
+    .map(item => ({
+      level: String(item.level || '').toLowerCase(),
+      title: item.title || '',
+      count: item.count ?? '',
+      detail: item.detail ?? ''
+    }))
+}
+
+const inferManufacturingColumns = (items = []) => {
+  if (!Array.isArray(items) || !items.length) return []
+  const fieldSet = new Set()
+  items.forEach((item) => {
+    if (!isPlainObject(item)) return
+    Object.keys(item).forEach((key) => fieldSet.add(key))
+  })
+  return Array.from(fieldSet)
+}
+
+const getManufacturingActionCardRuntimeKey = (card = {}, index = 0) => {
+  const code = String(card?.code || '').trim()
+  const api = String(card?.targetApi || '').trim()
+  const name = String(card?.name || '').trim()
+  return `${code}::${api}::${name}::${index}`
+}
+
+const normalizeManufacturingActionCards = (actionCards = [], previousCards = []) => {
+  const previousMap = new Map()
+  if (Array.isArray(previousCards)) {
+    previousCards.forEach((card, index) => {
+      previousMap.set(getManufacturingActionCardRuntimeKey(card, index), card)
+    })
+  }
+
+  return (Array.isArray(actionCards) ? actionCards : [])
+    .filter(card => isPlainObject(card))
+    .map((card, index) => {
+      const runtimeKey = getManufacturingActionCardRuntimeKey(card, index)
+      const previousCard = previousMap.get(runtimeKey)
+      const fallbackPayloadText = stringifyStructuredPayload(card.examplePayload, 2)
+      return {
+        ...card,
+        runtimeKey,
+        payloadText: previousCard?.payloadText ?? fallbackPayloadText,
+        executing: Boolean(previousCard?.executing),
+        executed: Boolean(previousCard?.executed),
+        executeResult: previousCard?.executeResult || '',
+        executeError: Boolean(previousCard?.executeError)
+      }
+    })
+}
+
+const buildManufacturingStructuredData = (parsedData, previousData = null) => {
+  const type = String(parsedData?.type || '')
+  if (!manufacturingStructuredTypeSet.has(type)) return null
+
+  const rawData = isPlainObject(parsedData?.data) ? parsedData.data : {}
+  const items = Array.isArray(rawData.items) ? rawData.items.filter(item => isPlainObject(item)) : []
+  const warningItems = type === 'manufacturing_warning' ? normalizeManufacturingWarningItems(items) : []
+  const listItems = manufacturingListTypeSet.has(type) ? items : []
+  const actionCards = type === 'manufacturing_action_plan'
+    ? normalizeManufacturingActionCards(rawData.actionCards, previousData?.actionCards)
+    : []
+
+  return {
+    type,
+    summaryEntries: normalizeManufacturingSummaryEntries(parsedData?.summary),
+    coreMetrics: normalizeManufacturingCoreMetrics(rawData.coreMetrics),
+    listItems,
+    columns: inferManufacturingColumns(listItems),
+    warningItems,
+    actionCards
+  }
+}
+
+const getManufacturingTypeLabel = (type = '') => manufacturingTypeLabelMap[String(type || '')] || '鍒堕�犵粨鏋�'
+
+const inferSalesColumns = (items = []) => {
+  if (!Array.isArray(items) || !items.length) return []
+  const fieldSet = new Set()
+  items.forEach((item) => {
+    if (!isPlainObject(item)) return
+    Object.keys(item).forEach((key) => fieldSet.add(key))
+  })
+  return Array.from(fieldSet)
+}
+
+const normalizeSalesListItems = (items) => {
+  if (!Array.isArray(items)) return []
+  return items.filter(item => isPlainObject(item))
+}
+
+const normalizeSalesReturnListItems = (items = []) => {
+  return normalizeSalesListItems(items).map((item) => {
+    const collectionAmount = item.collectionAmount ?? item.actualAmount
+    const collectionNumber = item.collectionNumber || item.refundId || ''
+    return {
+      ...item,
+      refundId: item.refundId || collectionNumber,
+      collectionNumber,
+      collectionAmount: collectionAmount ?? 0,
+      actualAmount: item.actualAmount ?? collectionAmount ?? 0
+    }
+  })
+}
+
+const normalizeSalesTypeListItems = (type = '', items = []) => {
+  if (type === 'sales_return_list') {
+    return normalizeSalesReturnListItems(items)
+  }
+  return normalizeSalesListItems(items)
+}
+
+const inferSalesColumnsByType = (type = '', listItems = []) => {
+  const columns = inferSalesColumns(listItems)
+  if (type === 'sales_return_list') {
+    return columns.filter(column => column !== 'actualAmount')
+  }
+  return columns
+}
+
+const buildSalesStructuredData = (parsedData) => {
+  const type = String(parsedData?.type || '')
+  if (!salesStructuredTypeSet.has(type)) return null
+
+  const rawData = isPlainObject(parsedData?.data) ? parsedData.data : {}
+  const listItems = normalizeSalesTypeListItems(type, rawData.items)
+  const topCustomers = normalizeSalesListItems(rawData.topCustomers)
+  const contractTrend = normalizeSalesListItems(rawData.contractTrend)
+
+  return {
+    type,
+    summaryEntries: normalizeManufacturingSummaryEntries(parsedData?.summary),
+    listItems,
+    columns: inferSalesColumnsByType(type, listItems),
+    topCustomers,
+    topCustomerColumns: inferSalesColumns(topCustomers),
+    contractTrend,
+    contractTrendColumns: inferSalesColumns(contractTrend)
+  }
+}
+
+const getSalesTypeLabel = (type = '') => salesTypeLabelMap[String(type || '')] || '閿�鍞煡璇㈢粨鏋�'
+
+const buildPurchaseStructuredData = (parsedData) => {
+  if (parsedData?.success !== true) return null
+
+  const type = String(parsedData?.type || '')
+  if (!type.startsWith('purchase_')) return null
+
+  const rawData = isPlainObject(parsedData?.data) ? parsedData.data : {}
+  const listItems = normalizeSalesListItems(rawData.items)
+
+  return {
+    type,
+    summaryEntries: normalizeManufacturingSummaryEntries(parsedData?.summary),
+    listItems,
+    columns: inferSalesColumns(listItems)
+  }
+}
+
+const getPurchaseTypeLabel = (type = '') => purchaseTypeLabelMap[String(type || '')] || '閲囪喘鏌ヨ缁撴灉'
+
+const financialDataSectionConfig = [
+  { key: 'orders', title: '璁㈠崟鏄庣粏' },
+  { key: 'items', title: '鏄庣粏鍒楄〃' },
+  { key: 'actualMonthly', title: '鍘嗗彶鐜伴噾娴�' },
+  { key: 'forecastMonthly', title: '棰勬祴鐜伴噾娴�' },
+  { key: 'receivableRiskTop', title: '搴旀敹椋庨櫓Top' },
+  { key: 'payablePressureTop', title: '搴斾粯鍘嬪姏Top' },
+  { key: 'orderProfitTop', title: '鍒╂鼎Top' }
+]
+
+const buildFinancialStructuredSections = (rawData = {}) => {
+  const sections = []
+  financialDataSectionConfig.forEach((section) => {
+    const items = normalizeSalesListItems(rawData?.[section.key])
+    if (!items.length) return
+    sections.push({
+      key: section.key,
+      title: section.title,
+      items,
+      columns: inferSalesColumns(items)
+    })
+  })
+  return sections
+}
+
+const buildFinancialStructuredData = (parsedData) => {
+  const type = String(parsedData?.type || '')
+  if (!financialStructuredTypeSet.has(type) || parsedData?.success !== true) return null
+
+  const rawData = isPlainObject(parsedData?.data) ? parsedData.data : {}
+  const headline = String(rawData?.headline || '').trim()
+
+  return {
+    type,
+    summaryEntries: normalizeManufacturingSummaryEntries(parsedData?.summary),
+    headline,
+    conclusions: toStructuredStringArray(rawData?.conclusions),
+    riskSuggestions: toStructuredStringArray(rawData?.riskSuggestions),
+    sections: buildFinancialStructuredSections(rawData)
+  }
+}
+
+const getFinancialTypeLabel = (type = '') => financialTypeLabelMap[String(type || '')] || '璐㈠姟鏌ヨ缁撴灉'
+
+const isSalesFocusType = (type = '') => salesFocusTypeSet.has(String(type || ''))
+
+const getSalesLevelTagType = (level = '') => {
+  const normalizedLevel = String(level || '').toLowerCase()
+  if (normalizedLevel === 'high') return 'danger'
+  if (normalizedLevel === 'medium') return 'warning'
+  if (normalizedLevel === 'low') return 'success'
+  return 'info'
+}
+
+const getSalesLevelLabel = (level = '', mode = 'risk') => {
+  const normalizedLevel = String(level || '').toLowerCase()
+  const suffix = mode === 'priority' ? '浼樺厛绾�' : '椋庨櫓'
+  if (normalizedLevel === 'high') return `楂�${suffix}`
+  if (normalizedLevel === 'medium') return `涓�${suffix}`
+  if (normalizedLevel === 'low') return `浣�${suffix}`
+  if (!normalizedLevel) return mode === 'priority' ? '鏈垎绾�' : '鏈瘎浼�'
+  return normalizedLevel.toUpperCase()
+}
+
+const toStructuredStringArray = (value) => {
+  if (Array.isArray(value)) {
+    return value.map(item => String(item || '').trim()).filter(Boolean)
+  }
+  if (typeof value === 'string') {
+    return value
+      .split(/[,\uFF0C\u3001;\uFF1B\n]/)
+      .map(item => item.trim())
+      .filter(Boolean)
+  }
+  return []
+}
+
+const normalizePurchaseIntentNotRecognizedData = (parsedData) => {
+  if (String(parsedData?.type || '') !== 'purchase_intent_not_recognized') return null
+  const quickPrompts = toStructuredStringArray(parsedData?.data?.quickPrompts)
+  if (!quickPrompts.length) return null
+  return { quickPrompts }
+}
+
+const getManufacturingWarningLevelType = (level = '') => {
+  const normalizedLevel = String(level || '').toLowerCase()
+  if (normalizedLevel === 'high') return 'danger'
+  if (normalizedLevel === 'medium') return 'warning'
+  return 'info'
+}
+
+const getManufacturingWarningLevelLabel = (level = '') => {
+  const normalizedLevel = String(level || '').toLowerCase()
+  if (normalizedLevel === 'high') return '楂�'
+  if (normalizedLevel === 'medium') return '涓�'
+  return normalizedLevel ? normalizedLevel.toUpperCase() : '涓�鑸�'
+}
+
+const normalizeRequestMethod = (method = 'POST') => {
+  const normalized = String(method || 'POST').trim().toUpperCase()
+  if (['GET', 'POST', 'PUT', 'DELETE', 'PATCH'].includes(normalized)) return normalized
+  return 'POST'
+}
+
+const getNormalizedRequestMethod = (method) => normalizeRequestMethod(method)
+
+const getPayloadValueByPath = (payload, fieldPath = '') => {
+  const normalizedPath = String(fieldPath || '').trim()
+  if (!normalizedPath || !isPlainObject(payload)) return undefined
+
+  const pathSegments = normalizedPath
+    .replace(/\[(\d+)]/g, '.$1')
+    .split('.')
+    .filter(Boolean)
+
+  return pathSegments.reduce((current, segment) => {
+    if (current === null || current === undefined) return undefined
+    if (!['object', 'function'].includes(typeof current)) return undefined
+    return current[segment]
+  }, payload)
+}
+
+const getMissingRequiredFields = (requiredFields = [], payload = {}) => {
+  if (!Array.isArray(requiredFields) || !requiredFields.length) return []
+  return requiredFields.filter((fieldPath) => {
+    const value = getPayloadValueByPath(payload, fieldPath)
+    return !hasMeaningfulPayloadValue(value)
+  })
+}
+
+const parseManufacturingActionPayload = (payloadText = '') => {
+  const text = String(payloadText ?? '').trim()
+  if (!text) return {}
+  return JSON.parse(text)
+}
+
+const executeManufacturingAction = async (message, actionCard, cardIndex = 0) => {
+  if (!message?.manufacturingData || !actionCard || actionCard.executing) return
+
+  const actionName = actionCard.name || `鍔ㄤ綔 ${cardIndex + 1}`
+  const targetApi = String(actionCard.targetApi || '').trim()
+  if (!targetApi) {
+    actionCard.executeError = true
+    actionCard.executeResult = '缂哄皯 targetApi锛屾棤娉曟墽琛屽姩浣�'
+    return
+  }
+
+  let payload = {}
+  try {
+    payload = parseManufacturingActionPayload(actionCard.payloadText)
+  } catch (err) {
+    actionCard.executeError = true
+    actionCard.executeResult = '璇锋眰鍙傛暟涓嶆槸鍚堟硶 JSON锛岃妫�鏌ュ悗閲嶈瘯'
+    return
+  }
+
+  const requiredFields = Array.isArray(actionCard.requiredFields) ? actionCard.requiredFields : []
+  if (requiredFields.length && !isPlainObject(payload)) {
+    actionCard.executeError = true
+    actionCard.executeResult = '蹇呭~瀛楁鏍¢獙澶辫触锛氳姹傚弬鏁板繀椤绘槸 JSON 瀵硅薄'
+    return
+  }
+
+  const missingFields = getMissingRequiredFields(requiredFields, payload)
+  if (missingFields.length) {
+    actionCard.executeError = true
+    const missingFieldLabels = missingFields.map(field => getStructuredPathLabel(field))
+    actionCard.executeResult = `缂哄皯蹇呭~瀛楁锛�${missingFieldLabels.join('銆�')}`
+    return
+  }
+
+  try {
+    await ElMessageBox.confirm(`纭鎵ц銆�${actionName}銆嶅悧锛焋, '鎵ц纭', {
+      confirmButtonText: '纭鎵ц',
+      cancelButtonText: '鍙栨秷',
+      type: 'warning'
+    })
+  } catch (err) {
+    return
+  }
+
+  actionCard.executing = true
+  actionCard.executeError = false
+  actionCard.executeResult = ''
+
+  const method = normalizeRequestMethod(actionCard.method)
+  const requestConfig = {
+    url: targetApi,
+    method: method.toLowerCase()
+  }
+
+  if (method === 'GET') {
+    requestConfig.params = payload
+  } else {
+    requestConfig.data = payload
+  }
+
+  try {
+    const res = await request(requestConfig)
+    const successMsg = res?.msg || `${actionName}鎵ц鎴愬姛`
+    actionCard.executed = true
+    actionCard.executeError = false
+    actionCard.executeResult = successMsg
+    ElMessage.success(successMsg)
+  } catch (err) {
+    actionCard.executed = false
+    actionCard.executeError = true
+    actionCard.executeResult = err?.message || `${actionName}鎵ц澶辫触锛岃绋嶅悗閲嶈瘯`
+  } finally {
+    actionCard.executing = false
+  }
 }
 
 // 鍘嗗彶浼氳瘽鐩稿叧
@@ -1034,6 +2112,13 @@
           tableData: null,
           payloadTreeData: null,
           payloadHiddenData: null,
+          purchaseAnalysisData: null,
+          manufacturingData: null,
+          salesData: null,
+          purchaseData: null,
+          purchaseIntentData: null,
+          financeData: null,
+          chartMarkdownParseFailed: false,
           localUploadFiles: isUser ? mapHistoryFilePathsToSnapshots(msg.filePaths, uuid.value, idx) : []
         }
 
@@ -1252,7 +2337,7 @@
           const candidate = text.slice(i, j + 1)
           try {
             const parsed = JSON.parse(candidate)
-            if (parsed?.success === true) {
+            if (typeof parsed?.success === 'boolean') {
               return {
                 data: parsed,
                 startIdx: i,
@@ -1271,17 +2356,58 @@
 }
 
 const applyStructuredMessageData = (messageObj, parsedData, msgIndex, shouldRenderCharts = true) => {
-  if (!messageObj || !parsedData?.success) return
+  const isPurchaseIntentNotRecognized = String(parsedData?.type || '') === 'purchase_intent_not_recognized'
+  if (!messageObj || (parsedData?.success !== true && !isPurchaseIntentNotRecognized)) return
 
+  const previousManufacturingData = messageObj.manufacturingData
   messageObj.type = parsedData.type || ''
+  messageObj.tableData = null
+  messageObj.purchaseAnalysisData = null
+  messageObj.manufacturingData = null
+  messageObj.salesData = null
+  messageObj.purchaseData = null
+  messageObj.purchaseIntentData = null
+  messageObj.financeData = null
+  messageObj.chartMarkdownParseFailed = false
+
+  if (isPurchaseIntentNotRecognized) {
+    messageObj.purchaseIntentData = normalizePurchaseIntentNotRecognizedData(parsedData)
+    messageObj.chartOptions = null
+    messageObj.chartRenderReady = false
+    return
+  }
 
   if (messageObj.type === 'todo_list' && parsedData.data) {
     messageObj.tableData = parsedData.data
   }
 
+  const salesData = buildSalesStructuredData(parsedData)
+  if (salesData) {
+    messageObj.salesData = salesData
+  }
+
+  const manufacturingData = buildManufacturingStructuredData(parsedData, previousManufacturingData)
+  if (manufacturingData) {
+    messageObj.manufacturingData = manufacturingData
+  }
+
+  const purchaseData = buildPurchaseStructuredData(parsedData)
+  if (purchaseData) {
+    messageObj.purchaseData = purchaseData
+  }
+
+  const financeData = buildFinancialStructuredData(parsedData)
+  if (financeData) {
+    messageObj.financeData = financeData
+  }
+
   if (parsedData.action === 'confirm_required' && parsedData.businessType) {
     messageObj.type = 'purchase_analysis_confirm'
     messageObj.purchaseAnalysisData = parsedData
+    messageObj.manufacturingData = null
+    messageObj.salesData = null
+    messageObj.purchaseData = null
+    messageObj.financeData = null
     if (!Array.isArray(messageObj.payloadTreeData) || !messageObj.payloadTreeData.length) {
       initializePurchasePayloadTree(messageObj, parsedData.payload || {})
     }
@@ -1321,6 +2447,51 @@
   }
 
   return null
+}
+
+const getStructuredFallbackText = (parsedData) => {
+  if (!parsedData) return '姝e湪涓烘偍灞曠ず鍒嗘瀽缁撴灉...'
+  if (parsedData.type === 'todo_list') return '宸蹭负鎮ㄦ暣鐞嗗ソ鐩稿叧鏁版嵁銆�'
+  if (parsedData.type === 'purchase_intent_not_recognized') return '鏈瘑鍒埌鍙墽琛岀殑閲囪喘鏌ヨ鏉′欢锛岃琛ュ厖鏌ヨ鏉′欢鍚庡啀璇曘��'
+  if (salesStructuredTypeSet.has(parsedData.type)) {
+    if (parsedData.type === 'sales_customer_churn_risk') return '宸蹭负鎮ㄧ敓鎴愬鎴锋祦澶遍闄╁垎鏋愩��'
+    if (parsedData.type === 'sales_collection_quote_strategy') return '宸蹭负鎮ㄧ敓鎴愬洖娆句笌鎶ヤ环绛栫暐寤鸿銆�'
+    if (parsedData.type === 'sales_dashboard') return '宸蹭负鎮ㄧ敓鎴愰攢鍞寚鏍囩粺璁°��'
+    if (parsedData.type === 'sales_return_list') return '宸茶繑鍥為攢鍞��娆�/鍥炴璁板綍銆�'
+    if (parsedData.type === 'sales_customer_interaction_list') return '宸茶繑鍥炲鎴峰線鏉ユ暟鎹��'
+    return '宸茶繑鍥為攢鍞煡璇㈢粨鏋溿��'
+  }
+  if (manufacturingStructuredTypeSet.has(parsedData.type)) {
+    if (parsedData.type === 'manufacturing_action_plan') return '宸蹭负鎮ㄧ敓鎴愬姙鐞嗗缓璁紝璇风‘璁ゅ姩浣滃悗鎵ц銆�'
+    if (parsedData.type === 'manufacturing_warning') return '宸蹭负鎮ㄧ敓鎴愬埗閫犻璀︾湅鏉裤��'
+    if (parsedData.type === 'manufacturing_analysis') return '宸蹭负鎮ㄧ敓鎴愬埗閫犲垎鏋愮粨鏋溿��'
+    return '宸茶繑鍥炲埗閫犳煡璇㈢粨鏋溿��'
+  }
+  if (financialStructuredTypeSet.has(parsedData.type)) return '宸茶繑鍥炶储鍔″垎鏋愮粨鏋溿��'
+  if (String(parsedData.type || '').startsWith('purchase_')) return '宸茶繑鍥為噰璐煡璇㈢粨鏋溿��'
+  if (parsedData.charts && Object.keys(parsedData.charts).length > 0) return '宸蹭负鎮ㄧ敓鎴愬垎鏋愬浘琛ㄣ��'
+  return '姝e湪涓烘偍灞曠ず鍒嗘瀽缁撴灉...'
+}
+
+const resolveStructuredDescription = (parsedData) => {
+  if (!parsedData) return ''
+  if (parsedData.action === 'confirm_required') {
+    return getPurchaseConfirmDescription(parsedData)
+  }
+
+  const description = String(parsedData.description || '').trim()
+  if (!description) return ''
+
+  if (parsedData.type === 'sales_customer_interaction_list') {
+    if (description === 'no_customer_interactions') return '璇ユ椂闂磋寖鍥存殏鏃犲鎴峰線鏉ヨ褰曘��'
+    if (description === 'ok') return '宸茶繑鍥炲鎴峰線鏉ユ暟鎹��'
+  }
+
+  if (description === 'ok' || description === 'success') {
+    return getStructuredFallbackText(parsedData)
+  }
+
+  return description
 }
 
 const buildPurchaseMaterialRankCharts = (parsedData) => {
@@ -2446,7 +3617,14 @@
     type: '',
     tableData: null,
     payloadTreeData: null,
-    payloadHiddenData: null
+    payloadHiddenData: null,
+    purchaseAnalysisData: null,
+    manufacturingData: null,
+    salesData: null,
+    purchaseData: null,
+    purchaseIntentData: null,
+    financeData: null,
+    chartMarkdownParseFailed: false
   })
 
   outputState.value[botMsgIndex] = {
@@ -2502,6 +3680,7 @@
     if (extracted) {
       applyStructuredMessageData(currentMsg, extracted.data, botMsgIndex, !outputState.value[botMsgIndex].hasRenderedChart)
     }
+    currentMsg.htmlContent = convertStreamOutput(currentMsg.content || '', botMsgIndex)
 
     // 鏈�缁堣В鏋愮‘淇濆浘琛ㄦ覆鏌�
     if (currentMsg.chartOptions && !outputState.value[botMsgIndex].hasRenderedChart) {
@@ -2569,7 +3748,14 @@
     type: '',
     tableData: null,
     payloadTreeData: null,
-    payloadHiddenData: null
+    payloadHiddenData: null,
+    purchaseAnalysisData: null,
+    manufacturingData: null,
+    salesData: null,
+    purchaseData: null,
+    purchaseIntentData: null,
+    financeData: null,
+    chartMarkdownParseFailed: false
   }
   messages.value.push(botMsg)
 
@@ -2601,28 +3787,6 @@
           const extracted = extractEmbeddedSuccessJson(fullText)
           if (extracted) {
             applyStructuredMessageData(currentMsg, extracted.data, botMsgIndex)
-          } else {
-            const extractJson = (text) => {
-              const startIdx = text.indexOf('{"success": true')
-              if (startIdx === -1) return null
-
-              // 浠庡悗寰�鍓嶆壘鏈�鍚庝竴涓� '}'
-              const lastBraceIdx = text.lastIndexOf('}')
-              if (lastBraceIdx === -1 || lastBraceIdx < startIdx) return null
-
-              const potentialJson = text.substring(startIdx, lastBraceIdx + 1)
-              try {
-                return JSON.parse(potentialJson)
-              } catch (err) {
-                return null
-              }
-            }
-
-            const parsedData = extractJson(fullText)
-            if (parsedData) {
-              applyStructuredMessageData(currentMsg, parsedData, botMsgIndex, true)
-            }
-
           }
 
           updateOutputState(fullText, botMsgIndex)
@@ -2640,25 +3804,8 @@
     const extracted = extractEmbeddedSuccessJson(currentMsg.content)
     if (extracted) {
       applyStructuredMessageData(currentMsg, extracted.data, botMsgIndex)
-    } else {
-      const extractJson = (text) => {
-        const startIdx = text.indexOf('{"success": true')
-        if (startIdx === -1) return null
-        const lastBraceIdx = text.lastIndexOf('}')
-        if (lastBraceIdx === -1 || lastBraceIdx < startIdx) return null
-        const potentialJson = text.substring(startIdx, lastBraceIdx + 1)
-        try {
-          return JSON.parse(potentialJson)
-        } catch (err) {
-          return null
-        }
-      }
-
-      const finalParsed = extractJson(currentMsg.content)
-      if (finalParsed) {
-        applyStructuredMessageData(currentMsg, finalParsed, botMsgIndex)
-      }
     }
+    currentMsg.htmlContent = convertStreamOutput(currentMsg.content || '', botMsgIndex)
   }).catch(err => {
     if (err.name === 'CanceledError' || err.name === 'AbortError') {
       console.log('Request aborted by user')
@@ -2702,6 +3849,126 @@
       .replace(/\n/g, '<br>')
 }
 
+const localChartMarkdownImagePattern = /!\[[^\]]*]\((https?:\/\/local\/generate_chart\?[^)\s]+)\)/gi
+
+const parseLocalChartOptionText = (optionText = '') => {
+  const text = String(optionText || '').trim()
+  if (!text) return null
+
+  const parseCandidates = [text]
+  try {
+    const decoded = decodeURIComponent(text)
+    if (decoded && decoded !== text) {
+      parseCandidates.push(decoded)
+    }
+  } catch (err) {
+    // Keep original text candidate.
+  }
+
+  for (const candidate of parseCandidates) {
+    try {
+      const parsed = JSON.parse(candidate)
+      if (isPlainObject(parsed)) {
+        return parsed
+      }
+    } catch (err) {
+      continue
+    }
+  }
+
+  return null
+}
+
+const parseLocalChartOptionFromUrl = (urlText = '') => {
+  try {
+    const url = new URL(String(urlText || '').trim())
+    if (String(url.hostname || '').toLowerCase() !== 'local' || !String(url.pathname || '').includes('/generate_chart')) {
+      return null
+    }
+    const optionText = url.searchParams.get('options')
+    return parseLocalChartOptionText(optionText)
+  } catch (err) {
+    return null
+  }
+}
+
+const extractLocalChartMarkdown = (text = '') => {
+  const sourceText = String(text || '')
+  if (!sourceText) {
+    return {
+      cleanedText: '',
+      hasLocalChartMarkdown: false,
+      chartOptions: null,
+      parseFailed: false
+    }
+  }
+
+  let hasLocalChartMarkdown = false
+  let chartIndex = 0
+  const chartOptions = {}
+
+  const cleanedText = sourceText.replace(localChartMarkdownImagePattern, (fullMatch, chartUrl) => {
+    hasLocalChartMarkdown = true
+    const option = parseLocalChartOptionFromUrl(chartUrl)
+    if (option) {
+      chartOptions[`markdownChart_${chartIndex++}`] = option
+    }
+    return ''
+  })
+
+  const normalizedText = cleanedText
+      .replace(/\n[ \t]*\n[ \t]*\n+/g, '\n\n')
+      .trim()
+  const hasParsedCharts = Object.keys(chartOptions).length > 0
+
+  return {
+    cleanedText: normalizedText,
+    hasLocalChartMarkdown,
+    chartOptions: hasParsedCharts ? chartOptions : null,
+    parseFailed: hasLocalChartMarkdown && !hasParsedCharts
+  }
+}
+
+const applyLocalChartMarkdownFallback = (displayText, msgIndex) => {
+  const messageObj = messages.value[msgIndex]
+  if (!messageObj || messageObj.isUser) return displayText
+
+  const {
+    cleanedText,
+    hasLocalChartMarkdown,
+    chartOptions,
+    parseFailed
+  } = extractLocalChartMarkdown(displayText)
+
+  if (!hasLocalChartMarkdown) {
+    return displayText
+  }
+
+  if (chartOptions) {
+    messageObj.chartOptions = chartOptions
+    messageObj.chartRenderReady = true
+    messageObj.chartMarkdownParseFailed = false
+
+    const streamState = outputState.value[msgIndex]
+    if (!streamState || !streamState.hasRenderedChart) {
+      renderCharts(msgIndex, chartOptions)
+      if (streamState) {
+        streamState.hasRenderedChart = true
+      }
+    }
+
+    return cleanedText || '宸蹭负鎮ㄧ敓鎴愬垎鏋愬浘琛ㄣ��'
+  }
+
+  if (!messageObj.chartOptions || !messageObj.chartRenderReady) {
+    messageObj.chartOptions = null
+    messageObj.chartRenderReady = false
+    messageObj.chartMarkdownParseFailed = parseFailed
+  }
+
+  return cleanedText || '鍥捐〃瑙f瀽澶辫触锛岃绋嶅悗閲嶈瘯銆�'
+}
+
 const convertStreamOutput = (output, msgIndex) => {
   if (!output) return ''
   const state = outputState.value[msgIndex]
@@ -2728,20 +3995,13 @@
       display = ''
     }
 
-    if (parsed.description) {
-      display = parsed.action === 'confirm_required'
-        ? getPurchaseConfirmDescription(parsed)
-        : parsed.description
+    const resolvedDescription = resolveStructuredDescription(parsed)
+    if (resolvedDescription) {
+      display = resolvedDescription
     }
 
     if (!display) {
-      if (parsed.type === 'todo_list') {
-        display = '宸蹭负鎮ㄦ暣鐞嗗ソ鐩稿叧鏁版嵁銆�'
-      } else if (parsed.charts && Object.keys(parsed.charts).length > 0) {
-        display = '宸蹭负鎮ㄧ敓鎴愬垎鏋愬浘琛ㄣ��'
-      } else {
-        display = '姝e湪涓烘偍灞曠ず鍒嗘瀽缁撴灉...'
-      }
+      display = getStructuredFallbackText(parsed)
     }
   } else if (startIdx !== -1) {
     const lastBraceIdx = output.lastIndexOf('}')
@@ -2756,20 +4016,13 @@
           display = ''
         }
 
-        if (parsed.description) {
-          display = parsed.action === 'confirm_required'
-            ? getPurchaseConfirmDescription(parsed)
-            : parsed.description
+        const resolvedDescription = resolveStructuredDescription(parsed)
+        if (resolvedDescription) {
+          display = resolvedDescription
         }
 
         if (!display) {
-          if (parsed.type === 'todo_list') {
-            display = '宸蹭负鎮ㄦ暣鐞嗗ソ鐩稿叧鏁版嵁锛�'
-          } else if (parsed.charts && Object.keys(parsed.charts).length > 0) {
-            display = '宸蹭负鎮ㄧ敓鎴愬垎鏋愬浘琛細'
-          } else {
-            display = '姝e湪涓烘偍灞曠ず鍒嗘瀽缁撴灉...'
-          }
+          display = getStructuredFallbackText(parsed)
         }
       } catch (e) {
         // 瑙f瀽澶辫触锛岃鏄� JSON 杩樺湪浼犺緭涓垨鏍煎紡涓嶆纭�
@@ -2781,6 +4034,7 @@
     }
   }
 
+  display = applyLocalChartMarkdownFallback(display, msgIndex)
   let html = convertTextToHtml(display)
 
   // 杩樺師浠g爜鍧�
@@ -3027,30 +4281,30 @@
 .ai-chat-trigger {
   pointer-events: auto;
   position: fixed;
-  right: 24px;
-  bottom: 100px;
-  width: 56px;
-  height: 56px;
+  right: 10px;
+  bottom: 12px;
+  width: 40px;
+  height: 40px;
   background: $gradient-dark;
   border-radius: 50%;
   display: flex;
   align-items: center;
   justify-content: center;
   cursor: pointer;
-  box-shadow: $shadow-deep, 0 0 0 2px rgba(0, 85, 212, 0.3) inset, 0 0 30px rgba(0, 119, 232, 0.2);
-  transition: all 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275);
-  z-index: 2001;
-  animation: triggerPulse 3s ease-in-out infinite;
+  box-shadow: 0 8px 18px rgba(0, 68, 170, 0.32), 0 0 0 1px rgba(0, 136, 232, 0.32) inset;
+  transition: transform 0.22s ease, box-shadow 0.22s ease, opacity 0.22s ease;
+  z-index: 1020;
+  opacity: 0.9;
 
   &::before {
     content: '';
     position: absolute;
-    inset: -6px;
+    inset: -4px;
     background: linear-gradient(135deg, rgba(0, 85, 212, 0.4), rgba(0, 136, 232, 0.3), rgba(90, 159, 224, 0.2));
     border-radius: 50%;
     z-index: -1;
-    filter: blur(16px);
-    animation: glowPulse 2s ease-in-out infinite alternate;
+    filter: blur(10px);
+    opacity: 0.35;
   }
 
   &::after {
@@ -3063,16 +4317,12 @@
   }
 
   &:hover {
-    transform: scale(1.12) translateY(-4px);
-    box-shadow: $shadow-deep, 0 0 0 3px rgba(0, 136, 232, 0.4) inset, 0 0 50px rgba(0, 136, 232, 0.3);
-
-    &::before {
-      animation: glowPulse 1s ease-in-out infinite alternate;
-    }
+    transform: scale(1.05) translateY(-1px);
+    box-shadow: 0 10px 22px rgba(0, 68, 170, 0.38), 0 0 0 1px rgba(0, 136, 232, 0.42) inset;
 
     .trigger-icon {
-      transform: rotate(-8deg) scale(1.05);
-      filter: drop-shadow(0 0 8px rgba(255, 255, 255, 0.5));
+      transform: scale(1.03);
+      filter: drop-shadow(0 0 6px rgba(255, 255, 255, 0.42));
     }
   }
 
@@ -3767,6 +5017,18 @@
   margin-bottom: 12px;
 }
 
+.chart-empty-state {
+  margin-top: 12px;
+  width: 100%;
+  border-radius: 10px;
+  border: 1px dashed rgba(148, 163, 184, 0.6);
+  background: #f8fafc;
+  color: #64748b;
+  font-size: 13px;
+  line-height: 1.6;
+  padding: 12px;
+}
+
 .table-wrapper {
   margin-top: 12px;
   background: #fff;
@@ -3792,6 +5054,316 @@
   }
 }
 
+.manufacturing-card {
+  margin-top: 12px;
+  width: 100%;
+  background: #fff;
+  border: 1px solid rgba(0, 85, 212, 0.12);
+  border-radius: 12px;
+  box-shadow: $shadow-card;
+  padding: 14px;
+}
+
+.manufacturing-card__title {
+  font-size: 14px;
+  font-weight: 700;
+  color: $deep-blue;
+  margin-bottom: 10px;
+}
+
+.manufacturing-summary-grid {
+  display: grid;
+  grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
+  gap: 8px;
+  margin-bottom: 12px;
+}
+
+.manufacturing-summary-item {
+  border-radius: 10px;
+  padding: 10px 12px;
+  border: 1px solid rgba(0, 85, 212, 0.08);
+  background: linear-gradient(180deg, #f8fbff, #f1f7ff);
+  min-height: 66px;
+  display: flex;
+  flex-direction: column;
+  justify-content: space-between;
+  gap: 6px;
+}
+
+.manufacturing-summary-item--core {
+  border-color: rgba(30, 91, 255, 0.24);
+}
+
+.manufacturing-summary-label {
+  font-size: 12px;
+  color: #4b5563;
+}
+
+.manufacturing-summary-value {
+  font-size: 15px;
+  color: #1f2937;
+  line-height: 1.4;
+  word-break: break-all;
+}
+
+.manufacturing-warning-list {
+  display: flex;
+  flex-direction: column;
+  gap: 8px;
+  margin-bottom: 12px;
+}
+
+.manufacturing-warning-item {
+  border-radius: 10px;
+  border: 1px solid rgba(245, 158, 11, 0.22);
+  background: linear-gradient(135deg, rgba(255, 247, 237, 0.9), rgba(255, 255, 255, 0.98));
+  padding: 10px 12px;
+}
+
+.manufacturing-warning-item__head {
+  display: flex;
+  align-items: center;
+  gap: 8px;
+  color: #92400e;
+  font-size: 13px;
+}
+
+.manufacturing-warning-count {
+  margin-left: auto;
+  font-weight: 700;
+  color: #c2410c;
+}
+
+.manufacturing-warning-detail {
+  margin: 8px 0 0;
+  font-size: 12px;
+  line-height: 1.6;
+  color: #7c2d12;
+  word-break: break-all;
+}
+
+.manufacturing-table-wrapper {
+  margin-top: 10px;
+}
+
+.manufacturing-action-list {
+  display: flex;
+  flex-direction: column;
+  gap: 10px;
+  margin-top: 12px;
+}
+
+.manufacturing-action-card {
+  border: 1px solid rgba(0, 85, 212, 0.1);
+  border-radius: 10px;
+  padding: 10px 12px;
+  background: #f8fbff;
+}
+
+.manufacturing-action-card__head {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  gap: 12px;
+  font-size: 13px;
+  color: #1f2937;
+  margin-bottom: 8px;
+}
+
+.manufacturing-action-card__meta {
+  display: flex;
+  flex-direction: column;
+  gap: 4px;
+  margin-bottom: 8px;
+  font-size: 12px;
+  color: #64748b;
+  word-break: break-all;
+}
+
+.manufacturing-action-card__desc {
+  margin: 0 0 8px;
+  font-size: 12px;
+  line-height: 1.6;
+  color: #475467;
+}
+
+.manufacturing-required-fields {
+  display: flex;
+  flex-wrap: wrap;
+  align-items: center;
+  gap: 6px;
+  margin-bottom: 8px;
+  font-size: 12px;
+  color: #7c2d12;
+}
+
+.manufacturing-action-footer {
+  margin-top: 8px;
+  display: flex;
+  align-items: center;
+  justify-content: flex-end;
+  gap: 12px;
+}
+
+.manufacturing-action-result {
+  flex: 1;
+  font-size: 12px;
+  line-height: 1.5;
+
+  &.success {
+    color: #1f9d55;
+  }
+
+  &.error {
+    color: #d93025;
+  }
+}
+
+.sales-structured-card {
+  margin-top: 12px;
+  width: 100%;
+  background: #fff;
+  border: 1px solid rgba(31, 122, 114, 0.2);
+  border-radius: 12px;
+  box-shadow: $shadow-card;
+  padding: 14px;
+}
+
+.sales-structured-card__title {
+  font-size: 14px;
+  font-weight: 700;
+  color: #1f5ddf;
+  margin-bottom: 10px;
+}
+
+.sales-summary-grid {
+  display: grid;
+  grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
+  gap: 8px;
+  margin-bottom: 12px;
+}
+
+.sales-summary-item {
+  border-radius: 10px;
+  padding: 10px 12px;
+  border: 1px solid rgba(30, 91, 255, 0.12);
+  background: linear-gradient(180deg, #f7fbff, #edf6ff);
+  min-height: 66px;
+  display: flex;
+  flex-direction: column;
+  justify-content: space-between;
+  gap: 6px;
+}
+
+.sales-summary-label {
+  font-size: 12px;
+  color: #4b5563;
+}
+
+.sales-summary-value {
+  font-size: 15px;
+  color: #1f2937;
+  line-height: 1.4;
+  word-break: break-all;
+}
+
+.sales-focus-list {
+  display: flex;
+  flex-direction: column;
+  gap: 8px;
+}
+
+.sales-focus-item {
+  border-radius: 10px;
+  border: 1px solid rgba(30, 91, 255, 0.14);
+  background: #f8fbff;
+  padding: 10px 12px;
+}
+
+.sales-focus-item--strategy {
+  border-color: rgba(31, 122, 114, 0.22);
+  background: linear-gradient(180deg, #f7fcfb, #edf9f6);
+}
+
+.sales-focus-item__head {
+  display: flex;
+  align-items: flex-start;
+  justify-content: space-between;
+  gap: 10px;
+  font-size: 13px;
+  color: #1f2937;
+}
+
+.sales-focus-tags {
+  display: inline-flex;
+  align-items: center;
+  gap: 6px;
+  flex-wrap: wrap;
+  justify-content: flex-end;
+}
+
+.sales-focus-metrics {
+  margin-top: 8px;
+  display: flex;
+  flex-wrap: wrap;
+  gap: 10px;
+  font-size: 12px;
+  color: #475467;
+}
+
+.sales-focus-reasons {
+  margin-top: 8px;
+  display: flex;
+  flex-wrap: wrap;
+  gap: 6px;
+}
+
+.sales-strategy-line {
+  margin: 8px 0 0;
+  font-size: 12px;
+  line-height: 1.6;
+  color: #334155;
+}
+
+.sales-section-title {
+  margin: 4px 0 8px;
+  font-size: 13px;
+  font-weight: 700;
+  color: $deep-blue;
+}
+
+.finance-headline {
+  margin-top: 4px;
+  font-size: 13px;
+  line-height: 1.7;
+  color: #344054;
+}
+
+.finance-text-section {
+  margin-top: 10px;
+
+  ul {
+    margin: 6px 0 0;
+    padding-left: 18px;
+    font-size: 13px;
+    line-height: 1.7;
+    color: #344054;
+  }
+}
+
+.purchase-intent-quick-prompt-wrap {
+  margin-top: 12px;
+}
+
+.purchase-intent-quick-prompt-title {
+  font-size: 12px;
+  color: #4b5563;
+}
+
+.purchase-intent-quick-prompt-list {
+  margin-top: 8px;
+}
+
 .purchase-confirm-card {
   margin-top: 12px;
   width: 100%;
diff --git a/src/components/Breadcrumb/index.vue b/src/components/Breadcrumb/index.vue
index 0ff79ef..3ea63b5 100644
--- a/src/components/Breadcrumb/index.vue
+++ b/src/components/Breadcrumb/index.vue
@@ -86,9 +86,10 @@
 
 <style lang='scss' scoped>
 .app-breadcrumb.el-breadcrumb {
-  display: inline-block;
+  display: inline-flex;
+  align-items: center;
   font-size: 14px;
-  line-height: 56px;
+  line-height: 1;
   margin-left: 8px;
 
   :deep(.el-breadcrumb__inner) {
diff --git a/src/components/Dialog/FormDialog.vue b/src/components/Dialog/FormDialog.vue
index 8b657de..b60bfb4 100644
--- a/src/components/Dialog/FormDialog.vue
+++ b/src/components/Dialog/FormDialog.vue
@@ -55,7 +55,7 @@
 })
 
 // 璇︽儏妯″紡涓嶅睍绀衡�滅‘璁も�濇寜閽紝鍏跺畠绫诲瀷姝e父鏄剧ず
-const showConfirm = computed(() => props.operationType !== 'detail')
+const showConfirm = computed(() => props.operationType !== 'detail' && props.operationType !== 'view')
 
 const computedTitle = computed(() => {
   if (typeof props.title === 'function') {
diff --git a/src/components/Hamburger/index.vue b/src/components/Hamburger/index.vue
index 3ea9388..c35557f 100644
--- a/src/components/Hamburger/index.vue
+++ b/src/components/Hamburger/index.vue
@@ -1,8 +1,8 @@
-<template>
-  <div style="padding: 0 15px;" @click="toggleClick">
-    <svg
-      :class="{'is-active':isActive}"
-      class="hamburger"
+<template>
+  <div class="hamburger-wrap" @click="toggleClick">
+    <svg
+      :class="{'is-active':isActive}"
+      class="hamburger"
       viewBox="0 0 1024 1024"
       xmlns="http://www.w3.org/2000/svg"
       width="64"
@@ -28,15 +28,23 @@
 }
 </script>
 
-<style scoped>
-.hamburger {
-  display: inline-block;
-  vertical-align: middle;
-  width: 20px;
-  height: 20px;
-}
-
-.hamburger.is-active {
-  transform: rotate(180deg);
-}
+<style scoped>
+.hamburger-wrap {
+  width: 100%;
+  height: 100%;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+
+.hamburger {
+  display: inline-block;
+  vertical-align: middle;
+  width: 22px;
+  height: 22px;
+}
+
+.hamburger.is-active {
+  transform: rotate(180deg);
+}
 </style>
diff --git a/src/components/HeaderSearch/index.vue b/src/components/HeaderSearch/index.vue
index b57fe69..a81dd98 100644
--- a/src/components/HeaderSearch/index.vue
+++ b/src/components/HeaderSearch/index.vue
@@ -1,13 +1,13 @@
 <template>
   <div class="header-search">
     <svg-icon class-name="search-icon" icon-class="search" @click.stop="click" />
-    <el-dialog
-      v-model="show"
-      width="600"
-      @close="close"
-      :show-close="false"
-      append-to-body
-    >
+    <el-dialog
+      v-model="show"
+      width="600"
+      @close="close"
+      :show-close="true"
+      append-to-body
+    >
       <el-input
         v-model="search"
         ref="headerSearchSelectRef"
@@ -40,28 +40,51 @@
   </div>
 </template>
 
-<script setup>
-import Fuse from 'fuse.js'
-import { getNormalPath } from '@/utils/ruoyi'
-import { isHttp } from '@/utils/validate'
-import usePermissionStore from '@/store/modules/permission'
-
-const search = ref('')
-const options = ref([])
-const searchPool = ref([])
-const show = ref(false)
+<script setup>
+import Fuse from 'fuse.js'
+import { getNormalPath } from '@/utils/ruoyi'
+import { isHttp } from '@/utils/validate'
+import usePermissionStore from '@/store/modules/permission'
+
+const props = defineProps({
+  keyword: {
+    type: String,
+    default: ''
+  }
+})
+
+const search = ref('')
+const options = ref([])
+const searchPool = ref([])
+const show = ref(false)
 const fuse = ref(undefined)
 const headerSearchSelectRef = ref(null)
 const router = useRouter()
 const routes = computed(() => usePermissionStore().defaultRoutes)
 
-function click() {
-  show.value = !show.value
-  if (show.value) {
-    headerSearchSelectRef.value && headerSearchSelectRef.value.focus()
-    options.value = searchPool.value
-  }
-}
+function click() {
+  show.value = !show.value
+  if (show.value) {
+    syncSearchFromKeyword()
+    nextTick(() => {
+      headerSearchSelectRef.value && headerSearchSelectRef.value.focus()
+    })
+  }
+}
+
+function syncSearchFromKeyword() {
+  search.value = props.keyword?.trim?.() ?? ''
+  querySearch(search.value)
+}
+
+function open(keyword = props.keyword) {
+  show.value = true
+  search.value = keyword?.trim?.() ?? ''
+  querySearch(search.value)
+  nextTick(() => {
+    headerSearchSelectRef.value && headerSearchSelectRef.value.focus()
+  })
+}
 
 function close() {
   headerSearchSelectRef.value && headerSearchSelectRef.value.blur()
@@ -160,10 +183,14 @@
   searchPool.value = generateRoutes(routes.value)
 })
 
-watch(searchPool, (list) => {
-  initFuse(list)
-})
-</script>
+watch(searchPool, (list) => {
+  initFuse(list)
+})
+
+defineExpose({
+  open
+})
+</script>
 
 <style lang='scss' scoped>
 .header-search {
diff --git a/src/components/PIMTable/PIMTable.vue b/src/components/PIMTable/PIMTable.vue
index f99b1eb..d63c197 100644
--- a/src/components/PIMTable/PIMTable.vue
+++ b/src/components/PIMTable/PIMTable.vue
@@ -11,6 +11,7 @@
             :row-key="rowKey"
             :style="tableStyle"
             tooltip-effect="dark"
+            :tooltip-options="{ appendTo: 'body' }"
             :expand-row-keys="expandRowKeys"
             :show-summary="isShowSummary"
             :summary-method="summaryMethod"
diff --git a/src/layout/components/AppMain.vue b/src/layout/components/AppMain.vue
index 011e118..a511014 100644
--- a/src/layout/components/AppMain.vue
+++ b/src/layout/components/AppMain.vue
@@ -37,30 +37,29 @@
 </script>
 
 <style lang="scss" scoped>
-.app-main {
-  /* 50= navbar  50  */
-  min-height: calc(100vh - 50px);
-  width: 100%;
-  position: relative;
-  overflow: hidden;
-  background: transparent;
-}
-
-.route-view-wrapper {
-  width: 100%;
-  height: 100%;
-  padding: 120px 16px 24px 0;
-}
-
-.fixed-header + .app-main {
-  padding-top: 0;
-}
-
-.hasTagsView {
-  .app-main {
-    /* 84 = navbar + tags-view = 50 + 34 */
-    min-height: calc(100vh - 84px);
-  }
+.app-main {
+  min-height: calc(100vh - var(--topbar-height));
+  width: 100%;
+  position: relative;
+  overflow: visible;
+  background: transparent;
+}
+
+.route-view-wrapper {
+  width: 100%;
+  height: 100%;
+  padding: var(--content-gap);
+  padding-top: 0;
+}
+
+.fixed-header + .app-main {
+  padding-top: 0;
+}
+
+.hasTagsView {
+  .app-main {
+    min-height: calc(100vh - var(--topbar-height) - var(--tagsbar-height));
+  }
 
   .fixed-header + .app-main {
     padding-top: 0;
diff --git a/src/layout/components/Navbar.vue b/src/layout/components/Navbar.vue
index cb08221..aae5330 100644
--- a/src/layout/components/Navbar.vue
+++ b/src/layout/components/Navbar.vue
@@ -1,316 +1,382 @@
-<template>
-  <div class="navbar">
-    <div>
-      <hamburger id="hamburger-container" :is-active="appStore.sidebar.opened" class="hamburger-container"
-        @toggleClick="toggleSideBar" />
-      <breadcrumb v-if="!settingsStore.topNav" id="breadcrumb-container" class="breadcrumb-container" />
-    </div>
-    <!--    <top-nav v-if="settingsStore.topNav" id="topmenu-container" class="topmenu-container" />-->
-    <div class="right-menu">
-      <!-- 娑堟伅閫氱煡 -->
-      <el-popover
-        v-model:visible="notificationVisible"
-        :width="500"
-        placement="bottom-end"
-        trigger="click"
-        :popper-options="{ modifiers: [{ name: 'offset', options: { offset: [0, 10] } }] }"
-        popper-class="notification-popover"
-      >
-        <template #reference>
-          <div class="notification-container right-menu-item hover-effect">
-            <el-badge :value="unreadCount" :hidden="unreadCount === 0" class="notification-badge">
-              <el-icon :size="20" style="cursor: pointer;">
-                <Bell />
-              </el-icon>
-            </el-badge>
-          </div>
-        </template>
-        <NotificationCenter
-          @unreadCountChange="handleUnreadCountChange"
-          ref="notificationCenterRef"
-        />
-      </el-popover>
-      <div class="avatar-container">
-        <el-dropdown @command="handleCommand" class="right-menu-item hover-effect" trigger="click">
-          <div class="avatar-wrapper">
-            <img :src="userStore.avatar" class="user-avatar" />
-            <el-icon><caret-bottom /></el-icon>
-          </div>
-          <template #dropdown>
-            <el-dropdown-menu>
-              <router-link to="/user/profile">
-                <el-dropdown-item>涓汉涓績</el-dropdown-item>
-              </router-link>
-              <el-dropdown-item command="setLayout" v-if="settingsStore.showSettings">
-                <span>甯冨眬璁剧疆</span>
-              </el-dropdown-item>
-              <el-dropdown-item divided command="logout">
-                <span>閫�鍑虹櫥褰�</span>
-              </el-dropdown-item>
-            </el-dropdown-menu>
-          </template>
-        </el-dropdown>
-      </div>
-    </div>
-  </div>
-</template>
-
-<script setup>
-import { ElMessageBox } from 'element-plus'
-import { Bell } from '@element-plus/icons-vue'
-import Breadcrumb from '@/components/Breadcrumb'
-import TopNav from '@/components/TopNav'
-import Hamburger from '@/components/Hamburger'
-import Screenfull from '@/components/Screenfull'
-import SizeSelect from '@/components/SizeSelect'
-import HeaderSearch from '@/components/HeaderSearch'
-import RuoYiGit from '@/components/RuoYi/Git'
-import RuoYiDoc from '@/components/RuoYi/Doc'
-import NotificationCenter from './NotificationCenter/index.vue'
-import useAppStore from '@/store/modules/app'
-import useUserStore from '@/store/modules/user'
-import useSettingsStore from '@/store/modules/settings'
-
-const appStore = useAppStore()
-const userStore = useUserStore()
-const settingsStore = useSettingsStore()
-const notificationVisible = ref(false)
-const notificationCenterRef = ref(null)
-const unreadCount = ref(0)
-function toggleSideBar() {
-  appStore.toggleSideBar()
-}
-// const redirect = ref(undefined)
-// watch(route, (newRoute) => {
-//   redirect.value = newRoute.query && newRoute.query.redirect
-// }, { immediate: true })
-
-function handleCommand(command) {
-  switch (command) {
-    case "setLayout":
-      setLayout()
-      break
-    case "logout":
-      logout()
-      break
-    default:
-      break
-  }
-}
-
-function logout() {
-  ElMessageBox.confirm('纭畾娉ㄩ攢骞堕��鍑虹郴缁熷悧锛�', '鎻愮ず', {
-    confirmButtonText: '纭畾',
-    cancelButtonText: '鍙栨秷',
-    type: 'warning'
-  }).then(() => {
-    userStore.logOut().then(() => {
-      location.href = '/index'
-    })
-  }).catch(() => { })
-}
-
-const emits = defineEmits(['setLayout'])
-function setLayout() {
-  emits('setLayout')
-}
-
-function toggleTheme() {
-  settingsStore.toggleTheme()
-}
-
-// 娑堟伅閫氱煡鐩稿叧
-function handleUnreadCountChange(count) {
-  unreadCount.value = count
-}
-
-// 缁勪欢鎸傝浇鏃跺姞杞芥湭璇绘暟閲忓拰瀹氭椂鍒锋柊
-let unreadCountTimer = null
-onMounted(() => {
-  // 寤惰繜鍔犺浇锛岀‘淇濈粍浠跺凡娓叉煋
-  nextTick(() => {
-    if (notificationCenterRef.value) {
-      notificationCenterRef.value.loadUnreadCount()
-    }
-  })
-  // 瀹氭椂鍒锋柊鏈鏁伴噺锛堟瘡30绉掞級
-  unreadCountTimer = setInterval(() => {
-    if (notificationCenterRef.value) {
-      notificationCenterRef.value.loadUnreadCount()
-    }
-  }, 30000)
-})
-
-// 鐩戝惉 popover 鏄剧ず鐘舵�侊紝鎵撳紑鏃跺姞杞芥秷鎭垪琛�
-watch(notificationVisible, (val) => {
-  if (val && notificationCenterRef.value) {
-    nextTick(() => {
-      notificationCenterRef.value.loadMessages()
-    })
-  }
-})
-
-onUnmounted(() => {
-  if (unreadCountTimer) {
-    clearInterval(unreadCountTimer)
-  }
-})
-</script>
-
-<style lang='scss' scoped>
+<template>
+  <div class="navbar">
+    <div class="left-zone">
+      <hamburger
+        id="hamburger-container"
+        :is-active="appStore.sidebar.opened"
+        class="hamburger-container"
+        @toggleClick="toggleSideBar"
+      />
+      <breadcrumb
+        v-if="!settingsStore.topNav"
+        id="breadcrumb-container"
+        class="breadcrumb-container"
+      />
+    </div>
+
+    <div class="center-zone">
+      <el-icon class="search-icon" @click="openHeaderSearch"><Search /></el-icon>
+      <el-input
+        v-model="topSearchKeyword"
+        placeholder="鎼滅储鑿滃崟 / 鍔熻兘 / 鏁版嵁"
+        clearable
+        @keyup.enter="openHeaderSearch"
+      />
+      <header-search
+        ref="headerSearchRef"
+        :keyword="topSearchKeyword"
+        class="search-popup-trigger"
+      />
+    </div>
+
+    <div class="right-menu">
+      <el-popover
+        v-model:visible="notificationVisible"
+        :width="500"
+        placement="bottom-end"
+        trigger="click"
+        :popper-options="{ modifiers: [{ name: 'offset', options: { offset: [0, 10] } }] }"
+        popper-class="notification-popover"
+      >
+        <template #reference>
+          <div class="notification-container right-menu-item hover-effect">
+            <el-badge :value="unreadCount" :hidden="unreadCount === 0" class="notification-badge">
+              <el-icon :size="18">
+                <Bell />
+              </el-icon>
+            </el-badge>
+          </div>
+        </template>
+        <NotificationCenter @unreadCountChange="handleUnreadCountChange" ref="notificationCenterRef" />
+      </el-popover>
+
+      <div class="right-menu-item hover-effect screenfull-container">
+        <screenfull />
+      </div>
+
+      <div class="avatar-container">
+        <el-dropdown @command="handleCommand" class="right-menu-item hover-effect" trigger="click">
+          <div class="avatar-wrapper">
+            <div class="user-summary">
+              <div class="user-name">{{ userStore.nickName || userStore.name || "绠$悊鍛�" }}</div>
+              <div class="user-role">{{ userStore.roleName || "绯荤粺鐢ㄦ埛" }}</div>
+            </div>
+            <img :src="userStore.avatar" class="user-avatar" />
+            <el-icon><caret-bottom /></el-icon>
+          </div>
+          <template #dropdown>
+            <el-dropdown-menu>
+              <router-link to="/user/profile">
+                <el-dropdown-item>涓汉涓績</el-dropdown-item>
+              </router-link>
+              <el-dropdown-item command="setLayout" v-if="settingsStore.showSettings">
+                <span>甯冨眬璁剧疆</span>
+              </el-dropdown-item>
+              <el-dropdown-item divided command="logout">
+                <span>閫�鍑虹櫥褰�</span>
+              </el-dropdown-item>
+            </el-dropdown-menu>
+          </template>
+        </el-dropdown>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script setup>
+import { ElMessageBox } from "element-plus";
+import { Bell, Search } from "@element-plus/icons-vue";
+import Breadcrumb from "@/components/Breadcrumb";
+import Hamburger from "@/components/Hamburger";
+import Screenfull from "@/components/Screenfull";
+import HeaderSearch from "@/components/HeaderSearch";
+import NotificationCenter from "./NotificationCenter/index.vue";
+import useAppStore from "@/store/modules/app";
+import useUserStore from "@/store/modules/user";
+import useSettingsStore from "@/store/modules/settings";
+
+const appStore = useAppStore();
+const userStore = useUserStore();
+const settingsStore = useSettingsStore();
+
+const topSearchKeyword = ref("");
+const headerSearchRef = ref(null);
+const notificationVisible = ref(false);
+const notificationCenterRef = ref(null);
+const unreadCount = ref(0);
+
+function toggleSideBar() {
+  appStore.toggleSideBar();
+}
+
+function openHeaderSearch() {
+  headerSearchRef.value?.open(topSearchKeyword.value);
+}
+
+function handleCommand(command) {
+  switch (command) {
+    case "setLayout":
+      setLayout();
+      break;
+    case "logout":
+      logout();
+      break;
+    default:
+      break;
+  }
+}
+
+function logout() {
+  ElMessageBox.confirm("纭畾娉ㄩ攢骞堕��鍑虹郴缁熷悧锛�", "鎻愮ず", {
+    confirmButtonText: "纭畾",
+    cancelButtonText: "鍙栨秷",
+    type: "warning",
+  })
+    .then(() => {
+      userStore.logOut().then(() => {
+        location.href = "/index";
+      });
+    })
+    .catch(() => {});
+}
+
+const emits = defineEmits(["setLayout"]);
+function setLayout() {
+  emits("setLayout");
+}
+
+function handleUnreadCountChange(count) {
+  unreadCount.value = count;
+}
+
+let unreadCountTimer = null;
+onMounted(() => {
+  nextTick(() => {
+    if (notificationCenterRef.value) {
+      notificationCenterRef.value.loadUnreadCount();
+    }
+  });
+
+  unreadCountTimer = setInterval(() => {
+    if (notificationCenterRef.value) {
+      notificationCenterRef.value.loadUnreadCount();
+    }
+  }, 30000);
+});
+
+watch(notificationVisible, (val) => {
+  if (val && notificationCenterRef.value) {
+    nextTick(() => {
+      notificationCenterRef.value.loadMessages();
+    });
+  }
+});
+
+onUnmounted(() => {
+  if (unreadCountTimer) {
+    clearInterval(unreadCountTimer);
+  }
+});
+</script>
+
+<style lang="scss" scoped>
 .navbar {
-  height: 56px;
-  overflow: hidden;
-  position: relative;
-  background: var(--navbar-bg);
-  border: 1px solid rgba(216, 225, 219, 0.9);
-  border-radius: 22px;
-  backdrop-filter: blur(18px);
-  box-shadow: var(--shadow-sm);
+  height: var(--topbar-height);
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  gap: 14px;
+  background: rgba(255, 255, 255, 0.86);
+  border: 1px solid rgba(148, 163, 184, 0.18);
+  border-radius: var(--content-radius);
+  backdrop-filter: blur(16px);
+  box-shadow: 0 8px 20px rgba(15, 23, 42, 0.05);
   padding: 0 18px;
-
-  .hamburger-container {
-    line-height: 52px;
-    height: 100%;
-    float: left;
-    cursor: pointer;
-    transition: background 0.3s;
-    -webkit-tap-highlight-color: transparent;
-
-    &:hover {
-      background: var(--navbar-hover);
-    }
-  }
-
-  .breadcrumb-container {
-    float: left;
-  }
-
-  .topmenu-container {
-    position: absolute;
-    left: 50px;
-  }
-
-  .errLog-container {
-    display: inline-block;
-    vertical-align: top;
-  }
-
-  .right-menu {
-    float: right;
-    height: 100%;
-    align-items: center;
-    display: flex;
-
-    &:focus {
-      outline: none;
-    }
-
-    .right-menu-item {
-      display: flex;
-      align-items: center;
-      justify-content: center;
-      padding: 0 8px;
-      height: 100%;
-      font-size: 18px;
-      color: var(--navbar-text);
-      border-radius: 14px;
-
-      &.hover-effect {
-        cursor: pointer;
-        transition: background 0.3s;
-
-        &:hover {
-          background: var(--navbar-hover);
-        }
-      }
-
-      &.theme-switch-wrapper {
-        display: flex;
-        align-items: center;
-
-        svg {
-          transition: transform 0.3s;
-
-          &:hover {
-            transform: scale(1.15);
-          }
-        }
-      }
-    }
-
-    .notification-container {
-      margin-right: 12px;
-      display: flex;
-      align-items: center;
-      cursor: pointer;
-
-      .notification-badge {
-        :deep(.el-badge__content) {
-          border: none;
-        }
-      }
-    }
-
-    .avatar-container {
-      margin-right: 4px;
-      height: 100%;
-      display: flex;
-      align-items: center;
+}
 
-      :deep(.el-dropdown) {
-        height: 100%;
-        display: flex;
-        align-items: center;
-      }
+.left-zone {
+  flex: 0 1 420px;
+  min-width: 0;
+  display: flex;
+  align-items: center;
+  gap: 10px;
+}
 
-      .avatar-wrapper {
-        position: relative;
-        display: flex;
-        align-items: center;
-        justify-content: center;
-        gap: 10px;
-        padding: 6px 10px 6px 6px;
-        height: 44px;
-        border-radius: 999px;
-        background: rgba(247, 250, 248, 0.92);
-        border: 1px solid var(--surface-border);
+.hamburger-container {
+  line-height: 36px;
+  height: 36px;
+  width: 36px;
+  border-radius: 10px;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  color: var(--navbar-text);
 
-        .user-avatar {
-          cursor: pointer;
-          width: 34px;
-          height: 34px;
-          border-radius: 50px;
-        }
+  &:hover {
+    background: var(--navbar-hover);
+  }
+}
 
-        i {
-          cursor: pointer;
-          position: static;
-          font-size: 12px;
-        }
-      }
-    }
-  }
-}
-
-</style>
-
-<style lang="scss">
+.breadcrumb-container {
+  min-width: 0;
+}
+
+.center-zone {
+  width: clamp(360px, 34vw, 560px);
+  min-width: 320px;
+  height: 38px;
+  border-radius: 999px;
+  border: 1px solid rgba(148, 163, 184, 0.24);
+  background: rgba(248, 251, 255, 0.92);
+  display: flex;
+  align-items: center;
+  padding: 0 12px;
+  gap: 8px;
+}
+
+.search-icon {
+  color: #5b86c9;
+  cursor: pointer;
+}
+
+.center-zone :deep(.el-input__wrapper) {
+  border: 0;
+  box-shadow: none !important;
+  background: transparent;
+  padding: 0;
+}
+
+.center-zone :deep(.el-input__inner) {
+  color: #334155;
+  font-size: 13px;
+}
+
+.search-popup-trigger :deep(.search-icon) {
+  color: #5b86c9;
+  font-size: 16px;
+  cursor: pointer;
+}
+
+.right-menu {
+  height: 100%;
+  align-items: center;
+  display: flex;
+  gap: 14px;
+}
+
+.right-menu-item {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  color: var(--navbar-text);
+  border-radius: 8px;
+}
+
+.hover-effect {
+  cursor: pointer;
+  transition: background 0.2s;
+
+  &:hover {
+    background: var(--navbar-hover);
+  }
+}
+
+.notification-container,
+.screenfull-container {
+  width: 36px;
+  height: 36px;
+}
+
+.notification-badge :deep(.el-badge__content) {
+  border: none;
+}
+
+.screenfull-container :deep(.svg-icon) {
+  width: 16px;
+  height: 16px;
+  color: var(--navbar-text);
+}
+
+.avatar-container {
+  height: 100%;
+  display: flex;
+  align-items: center;
+}
+
+.avatar-container :deep(.el-dropdown) {
+  height: 100%;
+  display: flex;
+  align-items: center;
+}
+
+.avatar-wrapper {
+  display: flex;
+  align-items: center;
+  gap: 10px;
+  padding: 4px 10px 4px 8px;
+  height: 44px;
+  border-radius: 22px;
+  background: rgba(255, 255, 255, 0.9);
+  border: 1px solid rgba(148, 163, 184, 0.22);
+}
+
+.user-summary {
+  display: flex;
+  flex-direction: column;
+  align-items: flex-end;
+  gap: 2px;
+}
+
+.user-name {
+  color: var(--text-primary);
+  font-size: 13px;
+  line-height: 1;
+}
+
+.user-role {
+  color: var(--text-tertiary);
+  font-size: 11px;
+  line-height: 1;
+}
+
+.user-avatar {
+  cursor: pointer;
+  width: 36px;
+  height: 36px;
+  border-radius: 50%;
+  border: 1px solid rgba(148, 163, 184, 0.3);
+}
+
+@media (max-width: 1200px) {
+  .center-zone {
+    display: none;
+  }
+
+  .user-summary {
+    display: none;
+  }
+}
+</style>
+
+<style lang="scss">
 .notification-popover {
   padding: 0 !important;
-  border-radius: 20px !important;
-  border: 1px solid var(--surface-border) !important;
-  box-shadow: var(--shadow-md) !important;
-  
-  .el-popover__title {
-    display: none;
-  }
-  
-  .el-popover__body {
-    padding: 0 !important;
-  }
-}
-.el-badge__content.is-fixed{
-  top: 12px;
-}
-</style>
+  border-radius: 16px !important;
+  border: 1px solid rgba(148, 163, 184, 0.22) !important;
+  box-shadow: 0 18px 40px rgba(15, 23, 42, 0.12) !important;
+  background: rgba(255, 255, 255, 0.94) !important;
+  backdrop-filter: blur(16px);
+
+  .el-popover__title {
+    display: none;
+  }
+
+  .el-popover__body {
+    padding: 0 !important;
+  }
+}
+
+.el-badge__content.is-fixed {
+  top: 8px;
+}
+</style>
diff --git a/src/layout/components/NotificationCenter/index.vue b/src/layout/components/NotificationCenter/index.vue
index 2517c22..66f489a 100644
--- a/src/layout/components/NotificationCenter/index.vue
+++ b/src/layout/components/NotificationCenter/index.vue
@@ -255,6 +255,7 @@
     flex-direction: column;
     width: 500px;
     padding: 16px;
+    background: rgba(255, 255, 255, 0.92);
   }
 
   .popover-header {
@@ -264,12 +265,12 @@
     width: 100%;
     margin-bottom: 16px;
     padding-bottom: 12px;
-    border-bottom: 1px solid #f0f0f0;
+    border-bottom: 1px solid var(--surface-border);
 
     .popover-title {
       font-size: 18px;
       font-weight: 500;
-      color: #303133;
+      color: var(--text-primary);
     }
   }
 
@@ -315,11 +316,11 @@
     .notification-item {
       display: flex;
       padding: 12px 0;
-      border-bottom: 1px solid #f0f0f0;
+      border-bottom: 1px solid rgba(148, 163, 184, 0.18);
       transition: background-color 0.3s;
 
       &:hover {
-        background-color: #f5f7fa;
+        background-color: #f8fbff;
       }
 
       &.read {
@@ -333,7 +334,7 @@
         display: flex;
         align-items: center;
         justify-content: center;
-        background-color: #f0f9ff;
+        background-color: rgba(59, 130, 246, 0.12);
         border-radius: 50%;
         margin-right: 12px;
       }
@@ -345,13 +346,13 @@
         .notification-title {
           font-size: 14px;
           font-weight: 500;
-          color: #303133;
+          color: var(--text-primary);
           margin-bottom: 8px;
         }
 
         .notification-detail {
           font-size: 13px;
-          color: #606266;
+          color: var(--text-secondary);
           line-height: 1.5;
           margin-bottom: 8px;
           word-break: break-all;
@@ -359,7 +360,7 @@
 
         .notification-time {
           font-size: 12px;
-          color: #909399;
+          color: var(--text-tertiary);
         }
       }
 
@@ -375,7 +376,7 @@
   .pagination-wrapper {
     margin-top: 16px;
     padding-top: 16px;
-    border-top: 1px solid #f0f0f0;
+    border-top: 1px solid var(--surface-border);
     display: flex;
     justify-content: center;
     padding-left: 0;
diff --git a/src/layout/components/Sidebar/Logo.vue b/src/layout/components/Sidebar/Logo.vue
index 57c2b4b..1a66c4a 100644
--- a/src/layout/components/Sidebar/Logo.vue
+++ b/src/layout/components/Sidebar/Logo.vue
@@ -4,7 +4,7 @@
       <router-link v-if="collapse" key="collapse" class="sidebar-logo-link" to="/">
         <img :src="faviconUrl" class="sidebar-logo sidebar-favicon" alt="绔欑偣鍥炬爣" />
       </router-link>
-      <router-link v-else key="expand" class="sidebar-logo-link" to="/">
+      <router-link v-else key="expand" class="sidebar-logo-link" :style="expandLogoLinkStyle" to="/">
         <img v-if="logoUrl" :src="logoUrl" class="sidebar-logo" @error="handleImageError" alt="鍏徃Logo" />
         <h1 v-if="!logoUrl" class="sidebar-title">{{ title }}</h1>
       </router-link>
@@ -35,6 +35,14 @@
 })
 
 const logoUrl = ref('')
+
+const expandLogoLinkStyle = computed(() => {
+  if (!logoUrl.value) {
+    return { '--logo-bg-image': 'none' }
+  }
+  const escaped = String(logoUrl.value).replace(/"/g, '\\"')
+  return { '--logo-bg-image': `url("${escaped}")` }
+})
 
 const updateLogoUrl = () => {
   if (!cleanFactoryName.value) {
@@ -82,32 +90,63 @@
 .sidebar-logo-container {
   position: relative;
   width: 100% !important;
-  height: 56px !important;
-  line-height: 56px;
-  background: rgba(255, 255, 255, 0.78);
-  border: 1px solid var(--surface-border);
-  border-radius: 22px;
-  text-align: center;
+  height: 78px !important;
+  line-height: 78px;
+  background: transparent;
+  border-bottom: 1px solid rgba(255, 255, 255, 0.08);
+  text-align: left;
   overflow: hidden;
-  box-shadow: var(--shadow-sm);
+  box-shadow: none;
+  backdrop-filter: none;
+  transition: all 0.3s ease;
 
   .sidebar-logo-link {
+    position: relative;
+    isolation: isolate;
     height: 100%;
     width: 100%;
     display: flex;
     align-items: center;
     justify-content: center;
-    padding: 0 18px 0 14px;
+    padding: 0;
+
+    &::before {
+      content: "";
+      position: absolute;
+      inset: 0;
+      background-image: var(--logo-bg-image);
+      background-size: cover;
+      background-position: center;
+      opacity: 0.26;
+      filter: blur(8px) saturate(0.9);
+      transform: scale(1.06);
+      pointer-events: none;
+      z-index: 0;
+    }
+
+    &::after {
+      content: "";
+      position: absolute;
+      inset: 0;
+      background: linear-gradient(180deg, rgba(16, 49, 89, 0.18), rgba(16, 49, 89, 0.08));
+      pointer-events: none;
+      z-index: 0;
+    }
   }
 
   .sidebar-logo {
-    width: auto;
-    max-width: 250px;
-    max-height: 50px;
-    height: auto;
+    width: 100%;
+    height: 100%;
+    max-width: none;
+    max-height: none;
+    padding: 6px 10px;
     vertical-align: middle;
     object-fit: contain;
     object-position: center;
+    filter: none;
+    display: block;
+    position: relative;
+    z-index: 1;
   }
 
   .sidebar-title {
@@ -119,23 +158,40 @@
     font-size: 14px;
     font-family: "Segoe UI", "PingFang SC", sans-serif;
     vertical-align: middle;
+    position: relative;
+    z-index: 1;
   }
 
   &.collapse {
     .sidebar-logo-link {
+      display: flex;
+      align-items: center;
+      justify-content: center;
       padding: 0;
+
+      &::before,
+      &::after {
+        display: none;
+      }
     }
 
     .sidebar-logo {
-      max-width: 30px;
-      max-height: 30px;
+      width: calc(100% - 8px);
+      height: calc(100% - 8px);
+      max-width: none;
+      max-height: none;
+      padding: 4px;
+      margin: 0 auto;
+      filter: none;
+      object-fit: contain;
+      object-position: center;
     }
 
     .sidebar-favicon {
-      width: 24px;
-      height: 24px;
-      max-width: 24px;
-      max-height: 24px;
+      width: calc(100% - 8px);
+      height: calc(100% - 8px);
+      max-width: none;
+      max-height: none;
     }
   }
 }
diff --git a/src/layout/components/Sidebar/SidebarItem.vue b/src/layout/components/Sidebar/SidebarItem.vue
index f395d95..003b489 100644
--- a/src/layout/components/Sidebar/SidebarItem.vue
+++ b/src/layout/components/Sidebar/SidebarItem.vue
@@ -1,17 +1,19 @@
 <template>
-  <div v-if="!item.hidden">
+  <div v-if="!item.hidden" class="sidebar-item-wrapper">
     <template v-if="hasOneShowingChild(item.children, item) && (!onlyOneChild.children || onlyOneChild.noShowingChildren) && !item.alwaysShow">
       <app-link v-if="onlyOneChild.meta" :to="resolvePath(onlyOneChild.path, onlyOneChild.query)">
         <el-menu-item :index="resolvePath(onlyOneChild.path)" :class="{ 'submenu-title-noDropdown': !isNest }">
-          <svg-icon :icon-class="onlyOneChild.meta.icon || (item.meta && item.meta.icon)"/>
-          <template #title><span class="menu-title" :title="hasTitle(onlyOneChild.meta.title)">{{ onlyOneChild.meta.title }}</span></template>
+          <svg-icon :icon-class="onlyOneChild.meta.icon || (item.meta && item.meta.icon)" class="menu-icon"/>
+          <template #title>
+            <span class="menu-title" :title="hasTitle(onlyOneChild.meta.title)">{{ onlyOneChild.meta.title }}</span>
+          </template>
         </el-menu-item>
       </app-link>
     </template>
 
     <el-sub-menu v-else ref="subMenu" :index="resolvePath(item.path)" teleported>
       <template v-if="item.meta" #title>
-        <svg-icon :icon-class="item.meta && item.meta.icon" />
+        <svg-icon :icon-class="item.meta && item.meta.icon" class="menu-icon" />
         <span class="menu-title" :title="hasTitle(item.meta.title)">{{ item.meta.title }}</span>
       </template>
 
@@ -98,3 +100,59 @@
   }
 }
 </script>
+
+<style lang="scss" scoped>
+.sidebar-item-wrapper {
+  :deep(.menu-icon) {
+    width: 26px;
+    height: 26px;
+    margin-right: 12px;
+    display: inline-flex;
+    align-items: center;
+    justify-content: center;
+    flex-shrink: 0;
+    transition: color 0.2s ease;
+    color: var(--sidebar-text);
+    opacity: 0.88;
+  }
+  
+  :deep(.el-menu-item:hover .menu-icon),
+  :deep(.el-sub-menu__title:hover .menu-icon) {
+    color: #ffffff;
+    opacity: 1;
+  }
+  
+  :deep(.el-menu-item.is-active .menu-icon) {
+    color: var(--menu-active-text) !important;
+    opacity: 1;
+  }
+  
+  :deep(.menu-title) {
+    font-weight: 500;
+    transition: color 0.2s ease;
+    color: var(--sidebar-text);
+    opacity: 0.82;
+  }
+  
+  :deep(.el-menu-item:hover .menu-title),
+  :deep(.el-sub-menu__title:hover .menu-title) {
+    color: #ffffff;
+    opacity: 1;
+  }
+  
+  :deep(.el-menu-item.is-active .menu-title) {
+    color: var(--menu-active-text) !important;
+    opacity: 1;
+  }
+  
+  :deep(.nest-menu) {
+    .menu-icon {
+      width: 22px;
+      height: 22px;
+      margin-right: 10px;
+    }
+    
+    .menu-title { font-size: 13px; }
+  }
+}
+</style>
diff --git a/src/layout/components/Sidebar/index.vue b/src/layout/components/Sidebar/index.vue
index 0692dda..2a58c29 100644
--- a/src/layout/components/Sidebar/index.vue
+++ b/src/layout/components/Sidebar/index.vue
@@ -1,142 +1,166 @@
 <template>
-  <div :class="{ 'has-logo': showLogo }"
-       class="sidebar-container">
-    <logo v-if="showLogo"
-          :collapse="isCollapse" />
+  <div :class="{ 'has-logo': showLogo }" class="sidebar-container">
+    <logo v-if="showLogo" :collapse="isCollapse" />
     <el-scrollbar wrap-class="scrollbar-wrapper">
-      <el-menu :default-active="activeMenu"
-               :collapse="isCollapse"
-               :background-color="getMenuBackground"
-               :text-color="getMenuTextColor"
-               :unique-opened="true"
-               :active-text-color="theme"
-               :collapse-transition="false"
-               mode="vertical"
-               :class="sideTheme">
-        <sidebar-item v-for="(route, index) in sidebarRouters"
-                      :key="route.path + index"
-                      :item="route"
-                      :base-path="route.path" />
+      <el-menu
+        :default-active="activeMenu"
+        :collapse="isCollapse"
+        :background-color="getMenuBackground"
+        :text-color="getMenuTextColor"
+        :unique-opened="true"
+        :active-text-color="theme"
+        :collapse-transition="false"
+        mode="vertical"
+        :class="sideTheme"
+      >
+        <sidebar-item
+          v-for="(route, index) in sidebarRouters"
+          :key="route.path + index"
+          :item="route"
+          :base-path="route.path"
+        />
       </el-menu>
     </el-scrollbar>
   </div>
 </template>
 
 <script setup>
-  import Logo from "./Logo";
-  import SidebarItem from "./SidebarItem";
-  import variables from "@/assets/styles/variables.module.scss";
-  import useAppStore from "@/store/modules/app";
-  import useSettingsStore from "@/store/modules/settings";
-  import usePermissionStore from "@/store/modules/permission";
+import Logo from "./Logo";
+import SidebarItem from "./SidebarItem";
+import useAppStore from "@/store/modules/app";
+import useSettingsStore from "@/store/modules/settings";
+import usePermissionStore from "@/store/modules/permission";
 
-  const route = useRoute();
-  const appStore = useAppStore();
-  const settingsStore = useSettingsStore();
-  const permissionStore = usePermissionStore();
+const route = useRoute();
+const appStore = useAppStore();
+const settingsStore = useSettingsStore();
+const permissionStore = usePermissionStore();
 
-  const sidebarRouters = computed(() => permissionStore.sidebarRouters);
-  const showLogo = computed(() => settingsStore.sidebarLogo);
-  const sideTheme = computed(() => settingsStore.sideTheme);
-  const theme = computed(() => settingsStore.theme);
-  const isCollapse = computed(() => !appStore.sidebar.opened);
+const sidebarRouters = computed(() => permissionStore.sidebarRouters);
+const showLogo = computed(() => settingsStore.sidebarLogo);
+const sideTheme = computed(() => settingsStore.sideTheme);
+const theme = computed(() => settingsStore.theme);
+const isCollapse = computed(() => !appStore.sidebar.opened);
 
-  const getMenuBackground = computed(() => "var(--sidebar-bg)");
+const getMenuBackground = computed(() => "var(--sidebar-bg)");
 
-  const getMenuTextColor = computed(() => {
-    if (settingsStore.isDark) {
-      return "var(--sidebar-text)";
-    }
-    return sideTheme.value === "theme-dark"
-      ? variables.menuText
-      : variables.menuLightText;
-  });
+const getMenuTextColor = computed(() => "var(--sidebar-text)");
 
-  const activeMenu = computed(() => {
-    const { meta, path } = route;
-    if (meta.activeMenu) {
-      return meta.activeMenu;
-    }
-    return path;
-  });
+const activeMenu = computed(() => {
+  const { meta, path } = route;
+  if (meta.activeMenu) return meta.activeMenu;
+  return path;
+});
 </script>
 
 <style lang="scss" scoped>
-  .sidebar-container {
-    background-color: v-bind(getMenuBackground);
-    border-radius: 22px;
-    overflow: hidden;
+.sidebar-container {
+  background: transparent;
+  border-radius: 0;
+  overflow: hidden;
 
-    .scrollbar-wrapper {
-      background-color: v-bind(getMenuBackground);
+  .scrollbar-wrapper {
+    background: transparent;
+  }
+
+  .el-menu {
+    border: none !important;
+    height: 100%;
+    width: 100% !important;
+    border-radius: 0;
+    background: transparent !important;
+
+    .el-menu-item,
+    .el-sub-menu__title {
+      margin-bottom: 8px;
+      border-radius: 14px;
+      color: v-bind(getMenuTextColor);
+      font-size: 14px;
+      letter-spacing: 0;
+      transition:
+        transform 0.18s ease,
+        background 0.2s ease,
+        box-shadow 0.2s ease,
+        color 0.2s ease;
+      border: none !important;
+      display: flex;
+      align-items: center;
+
+      &:hover {
+        background: linear-gradient(128deg, rgba(var(--el-color-primary-rgb, 37, 99, 235), 0.28), rgba(var(--el-color-primary-rgb, 37, 99, 235), 0.08)) !important;
+        transform: translate3d(2px, 0, 0);
+      }
     }
 
-    .el-menu {
-      border: none;
-      height: 100%;
-      width: 100% !important;
-      border-radius: 22px;
+    .el-menu-item {
+      color: var(--sidebar-text);
 
-      .el-menu-item,
-      .el-sub-menu__title {
-        margin-bottom: 6px;
+      &.is-active {
+        background: var(--menu-active-bg, linear-gradient(135deg, var(--el-color-primary), var(--el-color-primary-light-3))) !important;
+        color: var(--menu-active-text) !important;
+        font-weight: 500;
         border-radius: 14px;
-        color: v-bind(getMenuTextColor);
+        box-shadow: var(--menu-active-glow, 0 10px 24px rgba(var(--el-color-primary-rgb, 37, 99, 235), 0.34));
 
-        &:hover {
-          background-color: var(--menu-hover, rgba(0, 0, 0, 0.06)) !important;
-          border-radius: 14px;
+        .svg-icon {
+          color: var(--menu-active-text) !important;
         }
       }
+    }
 
-      .el-menu-item {
-        &.is-active {
-          color: v-bind(theme);
-          background-color: var(--menu-active-bg, rgba(0, 0, 0, 0.06)) !important;
-          font-weight: 600;
-        }
-      }
+    .el-sub-menu__title {
+      color: v-bind(getMenuTextColor);
+    }
 
-      .el-sub-menu__title {
-        color: v-bind(getMenuTextColor);
-      }
+    :deep(.el-sub-menu__icon-arrow) {
+      display: inline-flex !important;
+      align-items: center;
+      justify-content: center;
+      width: 14px;
+      height: 14px;
+      margin-top: -7px;
+      right: 14px;
+      font-size: 14px !important;
+      color: currentColor !important;
+      opacity: 0.7;
+      transition: transform 0.2s ease, opacity 0.2s ease;
+    }
 
-      :deep(.el-sub-menu.is-active > .el-sub-menu__title) {
-        color: v-bind(theme) !important;
-        font-weight: 600;
-        background-color: var(--menu-active-bg, rgba(0, 0, 0, 0.06)) !important;
-        border-radius: 14px;
-        margin: 0 10px 6px !important;
-        // width: calc(100% - 20px) !important;
-        padding-left: 10px !important;
-        padding-right: 10px !important;
-        box-sizing: border-box;
-        overflow: hidden;
-        background-clip: padding-box;
-      }
+    :deep(.el-sub-menu.is-opened .el-sub-menu__icon-arrow) {
+      transform: rotate(180deg);
+    }
 
-      :deep(.el-menu-item.is-active) {
-        margin: 0 10px 6px !important;
-        width: calc(100% - 20px) !important;
-        padding-left: 10px !important;
-        padding-right: 10px !important;
-        box-sizing: border-box;
-        overflow: hidden;
-        background-clip: padding-box;
-        border-radius: 14px;
-      }
+    :deep(.el-sub-menu.is-active > .el-sub-menu__title) {
+      color: var(--menu-active-text) !important;
+      font-weight: 500;
+      border-radius: 12px;
+      margin: 0 12px 6px !important;
+      padding-left: 14px !important;
+      padding-right: 34px !important;
+      box-sizing: border-box;
+      overflow: hidden;
+      background-clip: padding-box;
+      background: var(--menu-active-bg) !important;
+      box-shadow: var(--menu-active-glow);
+      border: none !important;
+    }
 
-      :deep(.el-sub-menu.is-active > .el-sub-menu__title .menu-title),
-      :deep(.el-sub-menu.is-active > .el-sub-menu__title .svg-icon),
-      :deep(.el-menu-item.is-active .menu-title),
-      :deep(.el-menu-item.is-active .svg-icon) {
-        color: v-bind(theme) !important;
-      }
+    :deep(.el-menu-item.is-active) {
+      margin: 0 12px 6px !important;
+      width: calc(100% - 24px) !important;
+      padding-left: 14px !important;
+      padding-right: 34px !important;
+      box-sizing: border-box;
+      overflow: hidden;
+      background-clip: padding-box;
+      border-radius: 12px;
+    }
 
-      :deep(.el-sub-menu__title:hover),
-      :deep(.el-menu-item:hover) {
-        border-radius: 14px;
-      }
+    :deep(.el-sub-menu.is-active > .el-sub-menu__title .menu-title),
+    :deep(.el-sub-menu.is-active > .el-sub-menu__title .svg-icon),
+    :deep(.el-menu-item.is-active .menu-title) {
+      color: var(--menu-active-text) !important;
     }
   }
+}
 </style>
diff --git a/src/layout/components/TagsView/ScrollPane.vue b/src/layout/components/TagsView/ScrollPane.vue
index 9067108..71fa478 100644
--- a/src/layout/components/TagsView/ScrollPane.vue
+++ b/src/layout/components/TagsView/ScrollPane.vue
@@ -100,8 +100,8 @@
   :deep(.el-scrollbar__bar) {
     bottom: 0px;
   }
-  :deep(.el-scrollbar__wrap) {
-    height: 42px;
-  }
-}
-</style>
\ No newline at end of file
+  :deep(.el-scrollbar__wrap) {
+    height: var(--tagsbar-height);
+  }
+}
+</style>
diff --git a/src/layout/components/TagsView/index.vue b/src/layout/components/TagsView/index.vue
index 8fe064a..66b6014 100644
--- a/src/layout/components/TagsView/index.vue
+++ b/src/layout/components/TagsView/index.vue
@@ -259,20 +259,20 @@
 
 <style lang="scss" scoped>
 .tags-view-container {
-  height: 42px;
+  height: var(--tagsbar-height);
   width: 100%;
-  margin-top: 10px;
-  padding: 4px 10px;
-  background: rgba(255, 255, 255, 0.9);
-  border: 1px solid rgba(216, 225, 219, 0.92);
-  border-radius: 20px;
-  backdrop-filter: blur(18px);
-  box-shadow: var(--shadow-sm);
+  margin-top: 0;
+  padding: 0 2px;
+  background: transparent;
+  border: none;
+  border-radius: 0;
+  backdrop-filter: none;
+  box-shadow: none;
 
   .tags-view-wrapper {
     display: flex;
     align-items: center;
-    min-height: 42px;
+    min-height: var(--tagsbar-height);
 
     .tags-view-item {
       display: inline-flex;
@@ -280,29 +280,29 @@
       justify-content: center;
       position: relative;
       cursor: pointer;
-      height: 34px;
+      height: 30px;
       line-height: 1;
       color: var(--tags-item-text, #4E5463);
       background: var(--tags-item-bg, #E5E7EA);
       border: 1px solid var(--tags-item-border, #d8dce5);
       border-radius: 999px;
-      padding: 0 16px;
+      padding: 0 14px;
       font-size: 12px;
-      margin-right: 8px;
+      margin-right: 6px;
       flex-shrink: 0;
       gap: 6px;
       transition: all 0.24s ease;
 
       &:hover {
         background: var(--tags-item-hover, #eee);
-        border-color: rgba(31, 122, 114, 0.18);
+        border-color: rgba(96, 165, 250, 0.36);
       }
 
       &.active {
-        background-color: #FFFFFF !important;
-        color: var(--el-color-primary);
-        box-shadow: 0 10px 24px rgba(31, 122, 114, 0.12);
-        border-color: rgba(31, 122, 114, 0.2) !important;
+        background-image: linear-gradient(132deg, rgba(47, 128, 255, 0.95), rgba(56, 189, 248, 0.9));
+        color: #fff;
+        box-shadow: 0 10px 20px rgba(37, 99, 235, 0.22);
+        border-color: rgba(147, 197, 253, 0.72) !important;
       }
     }
   }
diff --git a/src/layout/index.vue b/src/layout/index.vue
index fc47afa..aa1bfb5 100644
--- a/src/layout/index.vue
+++ b/src/layout/index.vue
@@ -7,11 +7,11 @@
          @click="handleClickOutside" />
     <sidebar v-if="!sidebar.hide"
              class="sidebar-container" />
-    <div :class="{ hasTagsView: needTagsView, sidebarHide: sidebar.hide }"
-         class="main-container">
-      <div :class="{ 'fixed-header': fixedHeader }">
+    <div :class="{ hasTagsView: showTagsView, sidebarHide: sidebar.hide }"
+         class="main-container main-layout">
+      <div :class="{ 'fixed-header': fixedHeader, 'with-tags': showTagsView }">
         <navbar @setLayout="setLayout" />
-        <tags-view v-if="needTagsView" />
+        <tags-view />
       </div>
       <app-main />
       <settings ref="settingRef" />
@@ -31,8 +31,10 @@
   import useAppStore from "@/store/modules/app";
   import useUserStore from "@/store/modules/user";
   import useSettingsStore from "@/store/modules/settings";
+  import useTagsViewStore from "@/store/modules/tagsView";
 
   const settingsStore = useSettingsStore();
+  const tagsViewStore = useTagsViewStore();
   const userStore = useUserStore();
   const route = useRoute();
   const theme = computed(() => settingsStore.theme);
@@ -40,10 +42,15 @@
   const sidebar = computed(() => useAppStore().sidebar);
   const device = computed(() => useAppStore().device);
   const needTagsView = computed(() => settingsStore.tagsView);
+  const showTagsView = computed(
+    () => needTagsView.value && tagsViewStore.visitedViews.length > 1
+  );
   const fixedHeader = computed(() => settingsStore.fixedHeader);
   const aiEnabled = computed(() => Number(userStore.aiEnabled) === 1);
   const showGlobalAiChat = computed(() => {
-    const isIndustrialBrainRoute = String(route.path || "").startsWith("/ai-industrial-brain");
+    const isIndustrialBrainRoute = String(route.path || "").startsWith(
+      "/ai-industrial-brain"
+    );
     return !isIndustrialBrainRoute && aiEnabled.value;
   });
 
@@ -87,19 +94,23 @@
 
 <style lang="scss" scoped>
   @import "@/assets/styles/mixin.scss";
-  @import "@/assets/styles/variables.module.scss";
 
   .app-wrapper {
     @include clearfix;
     position: relative;
-    height: 100%;
+    min-height: 100%;
     width: 100%;
     background: radial-gradient(
-        circle at top,
-        rgba(223, 232, 226, 0.95),
-        transparent 32%
+        circle at 14% -8%,
+        rgba(59, 130, 246, 0.14),
+        transparent 36%
       ),
-      linear-gradient(180deg, #f7faf8 0%, var(--app-bg) 100%);
+      radial-gradient(
+        circle at 88% -12%,
+        rgba(56, 189, 248, 0.1),
+        transparent 30%
+      ),
+      linear-gradient(165deg, #f3f7fc 0%, #eef5ff 56%, #f8fbff 100%);
 
     &.mobile.openSidebar {
       position: fixed;
@@ -108,8 +119,7 @@
   }
 
   .drawer-bg {
-    background: #000;
-    opacity: 0.3;
+    background: rgba(15, 23, 42, 0.22);
     width: 100%;
     top: 0;
     height: 100%;
@@ -117,26 +127,45 @@
     z-index: 999;
   }
 
-  .fixed-header {
-    position: fixed;
-    top: 0px;
-    padding-top: 12px;
-    right: 16px;
-    z-index: 9;
-    width: calc(100% - #{$base-sidebar-width} - 32px);
-    transition: width 0.28s, right 0.28s;
-    padding-bottom: 8px;
-    background-color: #f3f6f4;
-  }
-  .hideSidebar .fixed-header {
-    width: calc(100% - 100px);
+  .main-layout {
+    min-height: 100vh;
+    margin-left: var(--sidebar-width);
+    transition: margin-left 0.25s ease;
+    display: flex;
+    flex-direction: column;
   }
 
-  .sidebarHide .fixed-header {
-    width: calc(100% - 32px);
+  .fixed-header {
+    position: sticky;
+    top: 0;
+    z-index: var(--layout-header-z);
+    width: 100%;
+    padding: 8px var(--content-gap) 8px;
+    display: flex;
+    flex-direction: column;
+    gap: 6px;
+    background: var(--app-bg, #f3f7fc);
+  }
+
+  .fixed-header.with-tags {
+    padding-bottom: 6px;
+  }
+
+  .hideSidebar .fixed-header {
+    width: 100%;
+  }
+
+  .hideSidebar .main-layout {
+    margin-left: var(--sidebar-collapsed-width);
   }
 
   .mobile .fixed-header {
     width: 100%;
+    padding: 8px 10px 0;
+  }
+
+  .mobile .main-layout,
+  .sidebarHide.main-layout {
+    margin-left: 0;
   }
 </style>
diff --git a/src/router/index.js b/src/router/index.js
index d809a63..7be3668 100644
--- a/src/router/index.js
+++ b/src/router/index.js
@@ -47,20 +47,6 @@
     component: () => import("@/views/register"),
     hidden: true,
   },
-  // 绯荤粺鏋舵瀯鍥�
-  // {
-  //   path: "/system-architecture",
-  //   component: Layout,
-  //   redirect: "/system-architecture/index",
-  //   children: [
-  //     {
-  //       path: "index",
-  //       component: () => import("@/views/systemArchitecture/index.vue"),
-  //       name: "SystemArchitecture",
-  //       meta: { title: "绯荤粺鏋舵瀯鍥�", icon: "tree" },
-  //     },
-  //   ],
-  // },
   {
     path: "/:pathMatch(.*)*",
     component: () => import("@/views/error/404"),
@@ -82,6 +68,20 @@
         component: () => import("@/views/index"),
         name: "Index",
         meta: { title: "棣栭〉", icon: "dashboard", affix: true },
+      },
+    ],
+  },
+  // 绯荤粺鏋舵瀯鍥�
+  {
+    path: "/system-architecture",
+    component: Layout,
+    redirect: "/system-architecture/index",
+    children: [
+      {
+        path: "index",
+        component: () => import("@/views/systemArchitecture/index.vue"),
+        name: "SystemArchitecture",
+        meta: { title: "绯荤粺鏋舵瀯鍥�", icon: "tree" },
       },
     ],
   },
@@ -132,126 +132,126 @@
     ],
   },
   // 璐㈠姟绠$悊妯″潡璺敱
-  {
-    path: "/financial",
-    component: Layout,
-    hidden: false,
-    redirect: "/financial/general-ledger",
-    alwaysShow: true,
-    meta: { title: "璐㈠姟绠$悊", icon: "money" },
-    children: [
-      {
-        path: "sales-out",
-        component: () => import("@/views/financialManagement/receivable/salesOut.vue"),
-        name: "SalesOut",
-        meta: { title: "閿�鍞嚭搴�" },
-      },
-      {
-        path: "sales-return",
-        component: () => import("@/views/financialManagement/receivable/salesReturn.vue"),
-        name: "SalesReturn",
-        meta: { title: "閿�鍞��璐�" },
-      },
-      
-      {
-        path: "invoice-apply",
-        component: () => import("@/views/financialManagement/receivable/invoiceApply.vue"),
-        name: "InvoiceApply",
-        meta: { title: "寮�绁ㄧ敵璇�" },
-      },
-      {
-        path: "output-invoice",
-        component: () => import("@/views/financialManagement/receivable/outputInvoice.vue"),
-        name: "OutputInvoice",
-        meta: { title: "閿�椤瑰彂绁�" },
-      },
-      {
-        path: "receipt",
-        component: () => import("@/views/financialManagement/receivable/receipt.vue"),
-        name: "Receipt",
-        meta: { title: "鏀舵鍗�" },
-      },
-      {
-        path: "receivable-reconciliation",
-        component: () => import("@/views/financialManagement/receivable/reconciliation.vue"),
-        name: "ReceivableReconciliation",
-        meta: { title: "搴旀敹瀵硅处" },
-      },
-      {
-        path: "purchase-in",
-        component: () => import("@/views/financialManagement/payable/purchaseIn.vue"),
-        name: "PurchaseIn",
-        meta: { title: "閲囪喘鍏ュ簱" },
-      },
-      {
-        path: "purchase-return",
-        component: () => import("@/views/financialManagement/payable/purchaseReturn.vue"),
-        name: "PurchaseReturn",
-        meta: { title: "閲囪喘閫�璐�" },
-      },
-      {
-        path: "input-invoice",
-        component: () => import("@/views/financialManagement/payable/input-invoice.vue"),
-        name: "InputInvoice",
-        meta: { title: "杩涢」鍙戠エ" },
-      },
-      {
-        path: "payment-apply",
-        component: () => import("@/views/financialManagement/payable/paymentApply.vue"),
-        name: "PaymentApply",
-        meta: { title: "浠樻鐢宠" },
-      },
-      
-      {
-        path: "payment",
-        component: () => import("@/views/financialManagement/payable/payment.vue"),
-        name: "Payment",
-        meta: { title: "浠樻鍗�" },
-      },
-      {
-        path: "payable-reconciliation",
-        component: () => import("@/views/financialManagement/payable/reconciliation.vue"),
-        name: "PayableReconciliation",
-        meta: { title: "搴斾粯瀵硅处" },
-      },
-      {
-        path: "fixed-assets",
-        component: () => import("@/views/financialManagement/assets/fixedAssets.vue"),
-        name: "FixedAssets",
-        meta: { title: "鍥哄畾璧勪骇" },
-      },
-      {
-        path: "intangible-assets",
-        component: () => import("@/views/financialManagement/assets/intangibleAssets.vue"),
-        name: "IntangibleAssets",
-        meta: { title: "鏃犲舰璧勪骇" },
-      },
-      {
-        path: "general-ledger",
-        component: () => import("@/views/financialManagement/generalLedger/index.vue"),
-        name: "GeneralLedger",
-        meta: { title: "鎬诲笎绉戠洰" },
-      },
-      {
-        path: "voucher",
-        component: () => import("@/views/financialManagement/voucher/index.vue"),
-        name: "Voucher",
-        meta: { title: "鍑瘉" },
-      },
-      {
-        path: "voucher-general-ledger",
-        component: () => import("@/views/financialManagement/voucher/generalLedger.vue"),
-        name: "VoucherGeneralLedger",
-        meta: { title: "绉戠洰鎬诲笎" },
-      },
-      {
-        path: "voucher-detail-ledger",
-        component: () => import("@/views/financialManagement/voucher/detailLedger.vue"),
-        name: "VoucherDetailLedger",
-        meta: { title: "绉戠洰鏄庣粏甯�" },
-      },
-    ],
-  },
+  // {
+  //   path: "/financial",
+  //   component: Layout,
+  //   hidden: false,
+  //   redirect: "/financial/general-ledger",
+  //   alwaysShow: true,
+  //   meta: { title: "璐㈠姟绠$悊", icon: "money" },
+  //   children: [
+  //     {
+  //       path: "sales-out",
+  //       component: () => import("@/views/financialManagement/receivable/salesOut.vue"),
+  //       name: "SalesOut",
+  //       meta: { title: "閿�鍞嚭搴�" },
+  //     },
+  //     {
+  //       path: "sales-return",
+  //       component: () => import("@/views/financialManagement/receivable/salesReturn.vue"),
+  //       name: "SalesReturn",
+  //       meta: { title: "閿�鍞��璐�" },
+  //     },
+  //
+  //     {
+  //       path: "invoice-apply",
+  //       component: () => import("@/views/financialManagement/receivable/invoiceApply.vue"),
+  //       name: "InvoiceApply",
+  //       meta: { title: "寮�绁ㄧ敵璇�" },
+  //     },
+  //     {
+  //       path: "output-invoice",
+  //       component: () => import("@/views/financialManagement/receivable/outputInvoice.vue"),
+  //       name: "OutputInvoice",
+  //       meta: { title: "閿�椤瑰彂绁�" },
+  //     },
+  //     {
+  //       path: "receipt",
+  //       component: () => import("@/views/financialManagement/receivable/receipt.vue"),
+  //       name: "Receipt",
+  //       meta: { title: "鏀舵鍗�" },
+  //     },
+  //     {
+  //       path: "receivable-reconciliation",
+  //       component: () => import("@/views/financialManagement/receivable/reconciliation.vue"),
+  //       name: "ReceivableReconciliation",
+  //       meta: { title: "搴旀敹瀵硅处" },
+  //     },
+  //     {
+  //       path: "purchase-in",
+  //       component: () => import("@/views/financialManagement/payable/purchaseIn.vue"),
+  //       name: "PurchaseIn",
+  //       meta: { title: "閲囪喘鍏ュ簱" },
+  //     },
+  //     {
+  //       path: "purchase-return",
+  //       component: () => import("@/views/financialManagement/payable/purchaseReturn.vue"),
+  //       name: "PurchaseReturn",
+  //       meta: { title: "閲囪喘閫�璐�" },
+  //     },
+  //     {
+  //       path: "input-invoice",
+  //       component: () => import("@/views/financialManagement/payable/input-invoice.vue"),
+  //       name: "InputInvoice",
+  //       meta: { title: "杩涢」鍙戠エ" },
+  //     },
+  //     {
+  //       path: "payment-apply",
+  //       component: () => import("@/views/financialManagement/payable/paymentApply.vue"),
+  //       name: "PaymentApply",
+  //       meta: { title: "浠樻鐢宠" },
+  //     },
+  //
+  //     {
+  //       path: "payment",
+  //       component: () => import("@/views/financialManagement/payable/payment.vue"),
+  //       name: "Payment",
+  //       meta: { title: "浠樻鍗�" },
+  //     },
+  //     {
+  //       path: "payable-reconciliation",
+  //       component: () => import("@/views/financialManagement/payable/reconciliation.vue"),
+  //       name: "PayableReconciliation",
+  //       meta: { title: "搴斾粯瀵硅处" },
+  //     },
+  //     {
+  //       path: "fixed-assets",
+  //       component: () => import("@/views/financialManagement/assets/fixedAssets.vue"),
+  //       name: "FixedAssets",
+  //       meta: { title: "鍥哄畾璧勪骇" },
+  //     },
+  //     {
+  //       path: "intangible-assets",
+  //       component: () => import("@/views/financialManagement/assets/intangibleAssets.vue"),
+  //       name: "IntangibleAssets",
+  //       meta: { title: "鏃犲舰璧勪骇" },
+  //     },
+  //     {
+  //       path: "general-ledger",
+  //       component: () => import("@/views/financialManagement/generalLedger/index.vue"),
+  //       name: "GeneralLedger",
+  //       meta: { title: "鎬诲笎绉戠洰" },
+  //     },
+  //     {
+  //       path: "voucher",
+  //       component: () => import("@/views/financialManagement/voucher/index.vue"),
+  //       name: "Voucher",
+  //       meta: { title: "鍑瘉" },
+  //     },
+  //     {
+  //       path: "voucher-general-ledger",
+  //       component: () => import("@/views/financialManagement/voucher/generalLedger.vue"),
+  //       name: "VoucherGeneralLedger",
+  //       meta: { title: "绉戠洰鎬诲笎" },
+  //     },
+  //     {
+  //       path: "voucher-detail-ledger",
+  //       component: () => import("@/views/financialManagement/voucher/detailLedger.vue"),
+  //       name: "VoucherDetailLedger",
+  //       meta: { title: "绉戠洰鏄庣粏甯�" },
+  //     },
+  //   ],
+  // },
 ];
 
 // 鍔ㄦ�佽矾鐢憋紝鍩轰簬鐢ㄦ埛鏉冮檺鍔ㄦ�佸幓鍔犺浇
diff --git a/src/settings.js b/src/settings.js
index 4a1c8bb..276b2f6 100644
--- a/src/settings.js
+++ b/src/settings.js
@@ -6,7 +6,7 @@
   /**
    * 渚ц竟鏍忎富棰� 娣辫壊涓婚theme-dark锛屾祬鑹蹭富棰榯heme-light
    */
-  sideTheme: 'theme-light',
+  sideTheme: 'theme-dark',
   /**
    * 鏄惁绯荤粺甯冨眬閰嶇疆
    */
@@ -39,7 +39,7 @@
   /**
    * 涓婚妯″紡 auto璺熼殢绯荤粺锛宭ight娴呰壊锛宒ark娣辫壊
    */
-  darkMode: "auto",
+  darkMode: "light",
 
   /**
    * @type {string | array} 'production' | ['production', 'development']
diff --git a/src/store/modules/user.js b/src/store/modules/user.js
index ea358d1..0d2e61e 100644
--- a/src/store/modules/user.js
+++ b/src/store/modules/user.js
@@ -1,12 +1,12 @@
-import {login, logout, getInfo, loginCheck, loginCheckFactory,tideLogin} from '@/api/login'
-import { getToken, setToken, removeToken } from '@/utils/auth'
-import { isHttp, isEmpty } from "@/utils/validate"
-import defAva from '@/assets/images/profile.jpg'
-import { defineStore } from 'pinia'
-
-const useUserStore = defineStore(
-  'user',
-  {
+import {login, logout, getInfo, loginCheck, loginCheckFactory,tideLogin} from '@/api/login'
+import { getToken, setToken, removeToken } from '@/utils/auth'
+import { isHttp, isEmpty } from "@/utils/validate"
+import defAva from '@/assets/images/profile.jpg'
+import { defineStore } from 'pinia'
+
+const useUserStore = defineStore(
+  'user',
+  {
     state: () => ({
       token: getToken(),
       id: '',
@@ -15,66 +15,72 @@
       roles: [],
       permissions: [],
       aiEnabled: 0
-    }),
-    actions: {
-      // 鐧诲綍
-      login(userInfo) {
-        const username = userInfo.username.trim()
-        const password = userInfo.password
-        const code = userInfo.code
-        const uuid = userInfo.uuid
-        return new Promise((resolve, reject) => {
-          login(username, password, code, uuid).then(res => {
-            setToken(res.token)
-            this.token = res.token
-            resolve()
-          }).catch(error => {
-            reject(error)
-          })
-        })
-      },
-      getCurrentTime() {
-        const now = new Date();
-        const year = now.getFullYear();       // 鑾峰彇骞翠唤
-        const month = String(now.getMonth() + 1).padStart(2, '0');  // 鏈堜唤浠�0寮�濮嬶紝瑕�+1锛屽苟琛ラ浂
-        const day = String(now.getDate()).padStart(2, '0');         // 鏃ユ湡琛ラ浂
-        const hours = String(now.getHours()).padStart(2, '0');      // 灏忔椂琛ラ浂
-        const minutes = String(now.getMinutes()).padStart(2, '0');  // 鍒嗛挓琛ラ浂
-        const seconds = String(now.getSeconds()).padStart(2, '0');  // 绉掓暟琛ラ浂
-        return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
-      },
-      // 鑾峰彇鐢ㄦ埛淇℃伅
-      getInfo() {
-        return new Promise((resolve, reject) => {
-          getInfo().then(res => {
-            const user = res.user
-            let avatar = user.avatar || ""
-            avatar = import.meta.env.VITE_APP_BASE_API + '/profile/' + avatar
-            if (res.roles && res.roles.length > 0) { // 楠岃瘉杩斿洖鐨剅oles鏄惁鏄竴涓潪绌烘暟缁�
-              this.roles = res.roles
-              this.permissions = res.permissions
-            } else {
-              this.roles = ['ROLE_DEFAULT']
-            }
-            this.id = user.userId
-            this.name = user.userName
-            this.avatar = avatar
-            this.currentFactoryName = user.currentFactoryName
-            this.nickName = user.nickName
-            this.roleName = user.roles[0].roleName
-            this.currentDeptId = user.tenantId
-            this.currentLoginTime = this.getCurrentTime()
-            this.aiEnabled = Number(res.aiEnabled) === 1 ? 1 : 0
-            resolve(res)
+    }),
+    actions: {
+      // 鐧诲綍
+      login(userInfo) {
+        const username = userInfo.username.trim()
+        const password = userInfo.password
+        const code = userInfo.code
+        const uuid = userInfo.uuid
+        return new Promise((resolve, reject) => {
+          login(username, password, code, uuid).then(res => {
+            const token = res?.token || res?.data?.token
+            if (!token) {
+              reject(new Error('鏈幏鍙栧埌鐧诲綍浠ょ墝'))
+              return
+            }
+            setToken(token)
+            this.token = token
+            resolve()
           }).catch(error => {
             reject(error)
           })
         })
-      },
-      // 閫�鍑虹郴缁�
-      logOut() {
-        return new Promise((resolve, reject) => {
-          logout(this.token).then(() => {
+      },
+      getCurrentTime() {
+        const now = new Date();
+        const year = now.getFullYear();       // 鑾峰彇骞翠唤
+        const month = String(now.getMonth() + 1).padStart(2, '0');  // 鏈堜唤浠�0寮�濮嬶紝瑕�+1锛屽苟琛ラ浂
+        const day = String(now.getDate()).padStart(2, '0');         // 鏃ユ湡琛ラ浂
+        const hours = String(now.getHours()).padStart(2, '0');      // 灏忔椂琛ラ浂
+        const minutes = String(now.getMinutes()).padStart(2, '0');  // 鍒嗛挓琛ラ浂
+        const seconds = String(now.getSeconds()).padStart(2, '0');  // 绉掓暟琛ラ浂
+        return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
+      },
+      // 鑾峰彇鐢ㄦ埛淇℃伅
+      getInfo() {
+        return new Promise((resolve, reject) => {
+          getInfo().then(res => {
+            const data = res?.data ?? res
+            const user = data.user || {}
+            let avatar = user.avatar || ""
+            avatar = import.meta.env.VITE_APP_BASE_API + '/profile/' + avatar
+            if (data.roles && data.roles.length > 0) { // 楠岃瘉杩斿洖鐨剅oles鏄惁鏄竴涓潪绌烘暟缁�
+              this.roles = data.roles
+              this.permissions = data.permissions
+            } else {
+              this.roles = ['ROLE_DEFAULT']
+            }
+            this.id = user.userId || ''
+            this.name = user.userName || ''
+            this.avatar = avatar
+            this.currentFactoryName = user.currentFactoryName || ''
+            this.nickName = user.nickName || ''
+            this.roleName = Array.isArray(user.roles) && user.roles.length > 0 ? (user.roles[0].roleName || '') : ''
+            this.currentDeptId = user.tenantId || ''
+            this.currentLoginTime = this.getCurrentTime()
+            this.aiEnabled = Number(data.aiEnabled) === 1 ? 1 : 0
+            resolve(data)
+          }).catch(error => {
+            reject(error)
+          })
+        })
+      },
+      // 閫�鍑虹郴缁�
+      logOut() {
+        return new Promise((resolve, reject) => {
+          logout(this.token).then(() => {
             this.token = ''
             this.roles = []
             this.permissions = []
@@ -84,51 +90,61 @@
           }).catch(error => {
             reject(error)
           })
-        })
-      },
-      // 鐧诲綍鏍¢獙
-      loginCheck(userInfo) {
-        const username = userInfo.username.trim()
-        const password = userInfo.password
-        return new Promise((resolve, reject) => {
-          loginCheck(username, password).then(res => {
-            resolve(res)
-          }).catch(error => {
-            reject(error)
-          })
-        })
-      },
-      // 閮ㄩ棬鐧诲綍
-      loginCheckFactory(userInfo) {
-        const username = userInfo.username.trim()
-        const password = userInfo.password
-        return new Promise((resolve, reject) => {
-          loginCheckFactory(username, password).then(res => {
-            setToken(res.token)
-            this.token = res.token
-            resolve()
-          }).catch(error => {
-            reject(error)
-          })
-        })
-      },
-      TideLogin(code) {
-        return new Promise((resolve, reject) => {
-          tideLogin(code)
-              .then((res) => {
-                setToken(res.token);
-                this.token = res.token
-                Vue.prototype.uploadHeader = {
-                  Authorization: "Bearer " + res.token,
-                };
-                resolve();
-              })
-              .catch((error) => {
-                reject(error);
-              });
-        });
-      },
-    }
-  })
-
-export default useUserStore
+        })
+      },
+      // 鐧诲綍鏍¢獙
+      loginCheck(userInfo) {
+        const username = userInfo.username.trim()
+        const password = userInfo.password
+        return new Promise((resolve, reject) => {
+          loginCheck(username, password).then(res => {
+            resolve(res)
+          }).catch(error => {
+            reject(error)
+          })
+        })
+      },
+      // 閮ㄩ棬鐧诲綍
+      loginCheckFactory(userInfo) {
+        const username = userInfo.username.trim()
+        const password = userInfo.password
+        return new Promise((resolve, reject) => {
+          loginCheckFactory(username, password).then(res => {
+            const token = res?.token || res?.data?.token
+            if (!token) {
+              reject(new Error('鏈幏鍙栧埌鐧诲綍浠ょ墝'))
+              return
+            }
+            setToken(token)
+            this.token = token
+            resolve()
+          }).catch(error => {
+            reject(error)
+          })
+        })
+      },
+      TideLogin(code) {
+        return new Promise((resolve, reject) => {
+          tideLogin(code)
+              .then((res) => {
+                const token = res?.token || res?.data?.token
+                if (!token) {
+                  reject(new Error('鏈幏鍙栧埌鐧诲綍浠ょ墝'))
+                  return
+                }
+                setToken(token);
+                this.token = token
+                Vue.prototype.uploadHeader = {
+                  Authorization: "Bearer " + token,
+                };
+                resolve();
+              })
+              .catch((error) => {
+                reject(error);
+              });
+        });
+      },
+    }
+  })
+
+export default useUserStore
diff --git a/src/utils/request.js b/src/utils/request.js
index 9cfcf5b..672bed8 100644
--- a/src/utils/request.js
+++ b/src/utils/request.js
@@ -21,11 +21,12 @@
 })
 
 // request鎷︽埅鍣�
-service.interceptors.request.use(config => {
+service.interceptors.request.use(config => {
+  config.headers = config.headers || {}
   // 鏄惁闇�瑕佽缃� token
-  const isToken = (config.headers || {}).isToken === false
+  const isToken = config.headers.isToken === false
   // 鏄惁闇�瑕侀槻姝㈡暟鎹噸澶嶆彁浜�
-  const isRepeatSubmit = (config.headers || {}).repeatSubmit === false
+  const isRepeatSubmit = config.headers.repeatSubmit === false
   if (getToken() && !isToken) {
     config.headers['Authorization'] = 'Bearer ' + getToken() // 璁╂瘡涓姹傛惡甯﹁嚜瀹氫箟token 璇锋牴鎹疄闄呮儏鍐佃嚜琛屼慨鏀�
   }
@@ -66,23 +67,27 @@
     }
   }
   return config
-}, error => {
-    console.log(error)
-    Promise.reject(error)
-})
+}, error => {
+    console.log(error)
+    return Promise.reject(error)
+})
 
 // 鍝嶅簲鎷︽埅鍣�
 service.interceptors.response.use(res => {
     // 鏈缃姸鎬佺爜鍒欓粯璁ゆ垚鍔熺姸鎬�
-    const code = res.data.code || 200
+    const code = res.data.code || 200
+    const handleAuthError = (res.config && res.config.headers && res.config.headers.handleAuthError) !== false
     // 鑾峰彇閿欒淇℃伅
     const msg = errorCode[code] || res.data.msg || errorCode['default']
     // 浜岃繘鍒舵暟鎹垯鐩存帴杩斿洖
     if (res.request.responseType ===  'blob' || res.request.responseType ===  'arraybuffer') {
       return res.data
     }
-    if (code === 401) {
-      if (!isRelogin.show) {
+    if (code === 401) {
+      if (!handleAuthError) {
+        return Promise.reject(new Error(msg))
+      }
+      if (!isRelogin.show) {
         isRelogin.show = true
         ElMessageBox.confirm('鐧诲綍鐘舵�佸凡杩囨湡锛屾偍鍙互缁х画鐣欏湪璇ラ〉闈紝鎴栬�呴噸鏂扮櫥褰�', '绯荤粺鎻愮ず', { confirmButtonText: '閲嶆柊鐧诲綍', cancelButtonText: '鍙栨秷', type: 'warning' }).then(() => {
           isRelogin.show = false
diff --git a/src/utils/theme.js b/src/utils/theme.js
index f4badc6..90a511e 100644
--- a/src/utils/theme.js
+++ b/src/utils/theme.js
@@ -1,29 +1,44 @@
 // 澶勭悊涓婚鏍峰紡
 export function handleThemeStyle(theme) {
-	document.documentElement.style.setProperty('--el-color-primary', theme)
+	const primary = normalizeHex(theme)
+	const [r, g, b] = hexToRgb(primary)
+	const light2 = getLightColor(primary, 0.2)
+	const light3 = getLightColor(primary, 0.3)
+	const light5 = getLightColor(primary, 0.5)
+
+	document.documentElement.style.setProperty('--el-color-primary', primary)
+	document.documentElement.style.setProperty('--el-color-primary-rgb', `${r}, ${g}, ${b}`)
 	for (let i = 1; i <= 9; i++) {
-		document.documentElement.style.setProperty(`--el-color-primary-light-${i}`, `${getLightColor(theme, i / 10)}`)
+		document.documentElement.style.setProperty(`--el-color-primary-light-${i}`, `${getLightColor(primary, i / 10)}`)
 	}
 	for (let i = 1; i <= 9; i++) {
-		document.documentElement.style.setProperty(`--el-color-primary-dark-${i}`, `${getDarkColor(theme, i / 10)}`)
+		document.documentElement.style.setProperty(`--el-color-primary-dark-${i}`, `${getDarkColor(primary, i / 10)}`)
 	}
+
+	// 绯荤粺涓婚鑱斿姩鍒颁晶杈规爮閫変腑鎬佷笌楂樹寒
+	document.documentElement.style.setProperty('--menu-active-bg', `linear-gradient(135deg, ${primary} 0%, ${light3} 100%)`)
+	document.documentElement.style.setProperty('--menu-active-glow', `0 10px 24px rgba(${r}, ${g}, ${b}, 0.32)`)
+	document.documentElement.style.setProperty('--menu-hover', `rgba(${r}, ${g}, ${b}, 0.2)`)
+	document.documentElement.style.setProperty('--accent-primary', primary)
+	document.documentElement.style.setProperty('--accent-light', light2)
+	document.documentElement.style.setProperty('--accent-lighter', light5)
 }
 
 // hex棰滆壊杞瑀gb棰滆壊
 export function hexToRgb(str) {
-	str = str.replace('#', '')
-	let hexs = str.match(/../g)
+	str = normalizeHex(str).replace('#', '')
+	const hexs = str.match(/../g) || ['40', '9e', 'ff']
 	for (let i = 0; i < 3; i++) {
 		hexs[i] = parseInt(hexs[i], 16)
 	}
 	return hexs
 }
 
-// rgb棰滆壊杞琀ex棰滆壊
+// rgb棰滆壊杞琱ex棰滆壊
 export function rgbToHex(r, g, b) {
-	let hexs = [r.toString(16), g.toString(16), b.toString(16)]
+	const hexs = [r.toString(16), g.toString(16), b.toString(16)]
 	for (let i = 0; i < 3; i++) {
-		if (hexs[i].length == 1) {
+		if (hexs[i].length === 1) {
 			hexs[i] = `0${hexs[i]}`
 		}
 	}
@@ -32,7 +47,7 @@
 
 // 鍙樻祬棰滆壊鍊�
 export function getLightColor(color, level) {
-	let rgb = hexToRgb(color)
+	const rgb = hexToRgb(color)
 	for (let i = 0; i < 3; i++) {
 		rgb[i] = Math.floor((255 - rgb[i]) * level + rgb[i])
 	}
@@ -41,9 +56,19 @@
 
 // 鍙樻繁棰滆壊鍊�
 export function getDarkColor(color, level) {
-	let rgb = hexToRgb(color)
+	const rgb = hexToRgb(color)
 	for (let i = 0; i < 3; i++) {
 		rgb[i] = Math.floor(rgb[i] * (1 - level))
 	}
 	return rgbToHex(rgb[0], rgb[1], rgb[2])
 }
+
+function normalizeHex(color) {
+	if (!color || typeof color !== 'string') return '#409eff'
+	let value = color.trim().replace('#', '')
+	if (value.length === 3) {
+		value = value.split('').map((s) => s + s).join('')
+	}
+	if (!/^[0-9a-fA-F]{6}$/.test(value)) return '#409eff'
+	return `#${value.toLowerCase()}`
+}
diff --git a/src/views/aiIndustrialBrain/MAINTAIN_RULES.md b/src/views/aiIndustrialBrain/MAINTAIN_RULES.md
new file mode 100644
index 0000000..97b9a5c
--- /dev/null
+++ b/src/views/aiIndustrialBrain/MAINTAIN_RULES.md
@@ -0,0 +1,7 @@
+# AI宸ヤ笟澶ц剳缁存姢瑙勫垯
+
+1. 褰� `src/views/aiIndustrialBrain/index.vue` 鏂板鏅鸿兘浣擄紙`agents`锛夐�昏緫鏃讹紝蹇呴』鍚屾纭寮圭獥鍔╂墜鍙敤鎬с��
+2. 寮圭獥鍔╂墜鐢� `src/components/AIChatSidebar/assistants/index.js` 鐨� `assistantRegistry` 缁熶竴娉ㄥ唽銆�
+3. 鏂板鏅鸿兘浣撶殑 `key` 鑻ヨ鍦ㄥ脊绐椾腑鍙敤锛屽繀椤诲湪 `assistantRegistry` 涓彁渚涘悓鍚嶉厤缃��
+4. 鏈湪 `assistantRegistry` 娉ㄥ唽鐨勬櫤鑳戒綋浼氬湪寮圭獥涓樉绀轰负 `pending`锛堝紑鍙戜腑锛夋�併��
+
diff --git a/src/views/aiIndustrialBrain/components/AiAssistantWorkspace.vue b/src/views/aiIndustrialBrain/components/AiAssistantWorkspace.vue
index 2f55511..1eb5e7b 100644
--- a/src/views/aiIndustrialBrain/components/AiAssistantWorkspace.vue
+++ b/src/views/aiIndustrialBrain/components/AiAssistantWorkspace.vue
@@ -17,7 +17,7 @@
             v-if="assistantMode !== 'pending'"
             :key="assistantMode"
             class="workspace-chat"
-            :assistants="assistantMode === 'purchase' ? [purchaseAssistant] : [generalAssistant]"
+            :assistants="resolvedAssistants"
             :default-assistant="assistantMode"
             :hide-trigger="true"
             :auto-open="true"
@@ -43,7 +43,7 @@
 import { computed } from "vue";
 import { ArrowLeftBold } from "@element-plus/icons-vue";
 import AIChatSidebar from "@/components/AIChatSidebar/index.vue";
-import { generalAssistant, purchaseAssistant } from "@/components/AIChatSidebar/assistants";
+import { assistantRegistry } from "@/components/AIChatSidebar/assistants";
 
 const props = defineProps({
   visible: {
@@ -60,11 +60,17 @@
 
 const agentKey = computed(() => String(props.agent?.key || ""));
 const agentTitle = computed(() => String(props.agent?.name || "AI鍔╂墜"));
+
+/**
+ * 缁存姢瑙勫垯锛�
+ * AI宸ヤ笟澶ц剳鏂板鏅鸿兘浣撴椂锛岃嫢甯屾湜鍙充晶寮圭獥鍙敤锛岄渶淇濊瘉鏅鸿兘浣� key 鍦� assistantRegistry 涓湁鍚屽悕閰嶇疆銆�
+ * 鏈厤缃椂浼氳繘鍏� pending锛堝紑鍙戜腑锛夋�侊紝浣滀负鏄惧紡鎻愰啋銆�
+ */
+const resolvedAssistant = computed(() => assistantRegistry[agentKey.value] || null);
 const assistantMode = computed(() => {
-  if (agentKey.value === "purchase") return "purchase";
-  if (agentKey.value === "general") return "general";
-  return "pending";
+  return resolvedAssistant.value ? agentKey.value : "pending";
 });
+const resolvedAssistants = computed(() => (resolvedAssistant.value ? [resolvedAssistant.value] : []));
 </script>
 
 <style scoped>
diff --git a/src/views/aiIndustrialBrain/index.vue b/src/views/aiIndustrialBrain/index.vue
index 33b967d..4afafa5 100644
--- a/src/views/aiIndustrialBrain/index.vue
+++ b/src/views/aiIndustrialBrain/index.vue
@@ -154,6 +154,7 @@
 
 const router = useRouter();
 
+// 缁存姢绾﹀畾瑙侊細src/views/aiIndustrialBrain/MAINTAIN_RULES.md
 const agents = [
   {
     key: "general",
diff --git a/src/views/basicData/product/index.vue b/src/views/basicData/product/index.vue
index 07da49b..b05b215 100644
--- a/src/views/basicData/product/index.vue
+++ b/src/views/basicData/product/index.vue
@@ -5,7 +5,7 @@
         <el-input v-model="search"
                   style="width: 210px"
                   placeholder="杈撳叆鍏抽敭瀛楄繘琛屾悳绱�"
-                  @change="searchFilter"
+                  @input="debouncedSearch"
                   @clear="searchFilter"
                   clearable
                   prefix-icon="Search" />
@@ -565,40 +565,31 @@
         proxy.$modal.msg("宸插彇娑�");
       });
   };
-  // 璋冪敤tree杩囨护鏂规硶 涓枃鑻辫繃婊�
-  const filterNode = (value, data, node) => {
-    if (!value) {
-      //濡傛灉鏁版嵁涓虹┖锛屽垯杩斿洖true,鏄剧ず鎵�鏈夌殑鏁版嵁椤�
-      return true;
-    }
-    // 鏌ヨ鍒楄〃鏄惁鏈夊尮閰嶆暟鎹紝灏嗗�煎皬鍐欙紝鍖归厤鑻辨枃鏁版嵁
-    let val = value.toLowerCase();
-    return chooseNode(val, data, node); // 璋冪敤杩囨护浜屽眰鏂规硶
+  const debounce = (fn, delay = 300) => {
+    let timer;
+    return (...args) => {
+      clearTimeout(timer);
+      timer = setTimeout(() => fn(...args), delay);
+    };
   };
-  // 杩囨护鐖惰妭鐐� / 瀛愯妭鐐� (濡傛灉杈撳叆鐨勫弬鏁版槸鐖惰妭鐐逛笖鑳藉尮閰嶏紝鍒欒繑鍥炶鑺傜偣浠ュ強鍏朵笅鐨勬墍鏈夊瓙鑺傜偣锛涘鏋滃弬鏁版槸瀛愯妭鐐癸紝鍒欒繑鍥炶鑺傜偣鐨勭埗鑺傜偣銆俷ame鏄腑鏂囧瓧绗︼紝enName鏄嫳鏂囧瓧绗�.
-  const chooseNode = (value, data, node) => {
-    if (data.label.indexOf(value) !== -1) {
+
+  const debouncedSearch = debounce(() => {
+    searchFilter();
+  }, 300);
+
+  const filterNode = (value, data) => {
+    if (!value) return true;
+    return chooseNode(value.toLowerCase(), data);
+  };
+
+  const chooseNode = (value, data) => {
+    const label = (data.label || '').toLowerCase();
+    if (label.indexOf(value) !== -1) {
       return true;
     }
-    const level = node.level;
-    // 濡傛灉浼犲叆鐨勮妭鐐规湰韬氨鏄竴绾ц妭鐐瑰氨涓嶇敤鏍¢獙浜�
-    if (level === 1) {
-      return false;
+    if (data.children && data.children.length > 0) {
+      return data.children.some(child => chooseNode(value, child));
     }
-    // 鍏堝彇褰撳墠鑺傜偣鐨勭埗鑺傜偣
-    let parentData = node.parent;
-    // 閬嶅巻褰撳墠鑺傜偣鐨勭埗鑺傜偣
-    let index = 0;
-    while (index < level - 1) {
-      // 濡傛灉鍖归厤鍒扮洿鎺ヨ繑鍥烇紝姝ゅname鍊兼槸涓枃瀛楃锛宔nName鏄嫳鏂囧瓧绗︺�傚垽鏂尮閰嶄腑鑻辨枃杩囨护
-      if (parentData.data.label.indexOf(value) !== -1) {
-        return true;
-      }
-      // 鍚﹀垯鐨勮瘽鍐嶅線涓婁竴灞傚仛鍖归厤
-      parentData = parentData.parent;
-      index++;
-    }
-    // 娌″尮閰嶅埌杩斿洖false
     return false;
   };
   getProductTreeList();
diff --git a/src/views/collaborativeApproval/approvalProcess/components/infoFormDia.vue b/src/views/collaborativeApproval/approvalProcess/components/infoFormDia.vue
index 5bd7a3e..bacdebd 100644
--- a/src/views/collaborativeApproval/approvalProcess/components/infoFormDia.vue
+++ b/src/views/collaborativeApproval/approvalProcess/components/infoFormDia.vue
@@ -85,6 +85,35 @@
             </el-form-item>
           </el-col>
         </el-row>
+        <!-- 鍑哄樊鏃堕棿锛堜粎褰� approveType 涓� 3 鏃舵樉绀猴級 -->
+        <el-row :gutter="30" v-if="props.approveType == 3">
+          <el-col :span="12">
+            <el-form-item label="鍑哄樊寮�濮嬫椂闂达細" prop="startDateTime">
+              <el-date-picker
+                  v-model="form.startDateTime"
+                  type="datetime"
+                  placeholder="璇烽�夋嫨寮�濮嬫椂闂�"
+                  value-format="YYYY-MM-DD HH:mm"
+                  format="YYYY-MM-DD HH:mm"
+                  clearable
+                  style="width: 100%"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鍑哄樊缁撴潫鏃堕棿锛�" prop="endDateTime">
+              <el-date-picker
+                  v-model="form.endDateTime"
+                  type="datetime"
+                  placeholder="璇烽�夋嫨缁撴潫鏃堕棿"
+                  value-format="YYYY-MM-DD HH:mm"
+                  format="YYYY-MM-DD HH:mm"
+                  clearable
+                  style="width: 100%"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
         <!-- 鍑哄樊鍦扮偣锛堜粎褰� approveType 涓� 3 鏃舵樉绀猴級 -->
         <el-row v-if="props.approveType == 3">
           <el-col :span="24">
@@ -152,6 +181,8 @@
     startDate: "", // 璇峰亣寮�濮嬫椂闂�
     endDate: "", // 璇峰亣缁撴潫鏃堕棿
     price: null, // 鎶ラ攢閲戦
+    startDateTime: "", // 鍑哄樊寮�濮嬫椂闂�
+    endDateTime: "", // 鍑哄樊缁撴潫鏃堕棿
     location: "", // 鍑哄樊鍦扮偣
     storageBlobDTOS: []
   },
@@ -163,6 +194,8 @@
     startDate: [{ required: true, message: "璇烽�夋嫨璇峰亣寮�濮嬫椂闂�", trigger: "change" }],
     endDate: [{ required: true, message: "璇烽�夋嫨璇峰亣缁撴潫鏃堕棿", trigger: "change" }],
     price: [{ required: true, message: "璇疯緭鍏ユ姤閿�閲戦", trigger: "blur" }],
+    startDateTime: [{ required: true, message: "璇烽�夋嫨鍑哄樊寮�濮嬫椂闂�", trigger: "change" }],
+    endDateTime: [{ required: true, message: "璇烽�夋嫨鍑哄樊缁撴潫鏃堕棿", trigger: "change" }],
     location: [{ required: true, message: "璇疯緭鍏ュ嚭宸湴鐐�", trigger: "blur" }],
   },
 });
@@ -257,8 +290,20 @@
       return
     }
   }
-  // 褰� approveType 涓� 3 鏃讹紝鏍¢獙鍑哄樊鍦扮偣
+  // 褰� approveType 涓� 3 鏃讹紝鏍¢獙鍑哄樊鏃堕棿鍜屽湴鐐�
   if (props.approveType == 3) {
+    if (!form.value.startDateTime) {
+      proxy.$modal.msgError("璇烽�夋嫨鍑哄樊寮�濮嬫椂闂达紒")
+      return
+    }
+    if (!form.value.endDateTime) {
+      proxy.$modal.msgError("璇烽�夋嫨鍑哄樊缁撴潫鏃堕棿锛�")
+      return
+    }
+    if (new Date(form.value.endDateTime) < new Date(form.value.startDateTime)) {
+      proxy.$modal.msgError("鍑哄樊缁撴潫鏃堕棿涓嶈兘鏃╀簬寮�濮嬫椂闂达紒")
+      return
+    }
     if (!form.value.location || form.value.location.trim() === '') {
       proxy.$modal.msgError("璇疯緭鍏ュ嚭宸湴鐐癸紒")
       return
diff --git a/src/views/collaborativeApproval/approvalProcess/index.vue b/src/views/collaborativeApproval/approvalProcess/index.vue
index 11a2869..158916c 100644
--- a/src/views/collaborativeApproval/approvalProcess/index.vue
+++ b/src/views/collaborativeApproval/approvalProcess/index.vue
@@ -207,6 +207,7 @@
 // 鍔ㄦ�佽〃鏍煎垪閰嶇疆锛屾牴鎹鎵圭被鍨嬬敓鎴愬垪
 const tableColumnCopy = computed(() => {
   const isLeaveType = currentApproveType.value === 2; // 璇峰亣绠$悊
+  const isBusinessTripType = currentApproveType.value === 3; // 鍑哄樊绠$悊
   const isReimburseType = currentApproveType.value === 4; // 鎶ラ攢绠$悊
   const isQuotationType = currentApproveType.value === 6; // 鎶ヤ环瀹℃壒
   const isPurchaseType = currentApproveType.value === 5; // 閲囪喘瀹℃壒
@@ -274,20 +275,32 @@
       width: 120
     });
   }
+
+  // 璇峰亣绠$悊锛氬紑濮嬫棩鏈� / 缁撴潫鏃ユ湡
+  if (isLeaveType) {
+    baseColumns.push(
+      { label: "寮�濮嬫棩鏈�", prop: "startDate", width: 120 },
+      { label: "缁撴潫鏃ユ湡", prop: "endDate", width: 120 }
+    );
+  }
   
-  // 鏃ユ湡鍒楋紙鏍规嵁绫诲瀷鍔ㄦ�侀厤缃級
-  baseColumns.push(
-    {
-      label: isLeaveType ? "寮�濮嬫棩鏈�" : "鐢宠鏃ユ湡",
-      prop: isLeaveType ? "startDate" : "approveTime",
-      width: 200
-    },
-    {
-      label: "缁撴潫鏃ユ湡",
-      prop: isLeaveType ? "endDate" : "approveOverTime",
-      width: 120
-    }
-  );
+  // 鍑哄樊绠$悊锛氬紑濮嬫椂闂� / 缁撴潫鏃堕棿锛堜笉鍚锛�
+  if (isBusinessTripType) {
+    baseColumns.push(
+      {
+        label: "寮�濮嬫椂闂�",
+        prop: "startDateTime",
+        width: 180,
+        formatData: (val) => val ? val.substring(0, 16) : ''
+      },
+      {
+        label: "缁撴潫鏃堕棿",
+        prop: "endDateTime",
+        width: 180,
+        formatData: (val) => val ? val.substring(0, 16) : ''
+      }
+    );
+  }
   
   // 褰撳墠瀹℃壒浜哄垪
   baseColumns.push({
@@ -295,6 +308,20 @@
     prop: "approveUserCurrentName",
     width: 120
   });
+
+  // 鐢宠鏃堕棿 - 鎵�鏈夌被鍨嬮兘鏄剧ず
+  baseColumns.push({
+    label: "鐢宠鏃堕棿",
+    prop: "approveTime",
+    width: 180,
+  });
+
+  // 瀹℃壒鏃堕棿 - 鎵�鏈夌被鍨嬮兘鏄剧ず
+  baseColumns.push({
+    label: "瀹℃壒鏃堕棿",
+    prop: "approveOverTime",
+    width: 180,
+  });
   
   // 鎿嶄綔鍒�
   const actionOperations = [
diff --git a/src/views/collaborativeApproval/purchaseApproval/index.vue b/src/views/collaborativeApproval/purchaseApproval/index.vue
index fe90686..b276bec 100644
--- a/src/views/collaborativeApproval/purchaseApproval/index.vue
+++ b/src/views/collaborativeApproval/purchaseApproval/index.vue
@@ -654,14 +654,10 @@
       return;
     }
     if (operationType.value === "add") {
-      productSelectedRows.value.forEach(selectedRow => {
-        const index = productData.value.findIndex(
-          product => product.id === selectedRow.id
-        );
-        if (index !== -1) {
-          productData.value.splice(index, 1);
-        }
-      });
+      productData.value = productData.value.filter(
+        item => !productSelectedRows.value.includes(item)
+      );
+      productSelectedRows.value = [];
     } else {
       let ids = [];
       if (productSelectedRows.value.length > 0) {
diff --git a/src/views/customerService/feedbackRegistration/components/formDia.vue b/src/views/customerService/feedbackRegistration/components/formDia.vue
index 790ddbe..fd3091e 100644
--- a/src/views/customerService/feedbackRegistration/components/formDia.vue
+++ b/src/views/customerService/feedbackRegistration/components/formDia.vue
@@ -63,10 +63,10 @@
               </el-form-item>
             </el-col>
             <el-col :span="4">
-              <el-form-item label="闂鎻忚堪锛�"
+              <el-form-item label="瀹㈡埛璇夋眰锛�"
                             prop="proDesc">
                 <el-input v-model="form.proDesc"
-                          placeholder="璇疯緭鍏ラ棶棰樻弿杩�" />
+                          placeholder="璇疯緭鍏ュ鎴疯瘔姹�" />
               </el-form-item>
             </el-col>
           </el-row>
diff --git a/src/views/customerService/feedbackRegistration/index.vue b/src/views/customerService/feedbackRegistration/index.vue
index 40d99be..1e57bdb 100644
--- a/src/views/customerService/feedbackRegistration/index.vue
+++ b/src/views/customerService/feedbackRegistration/index.vue
@@ -1,13 +1,13 @@
 <template>
   <div class="app-container">
     <div class="workorder-stats">
-      <div
-          v-for="(item, index) in statsList"
-          :key="index"
-          class="stat-card"
-      >
-        <div class="stat-icon" :style="{ backgroundColor: item.bgColor }">
-          <el-icon :color="item.color" :size="20">
+      <div v-for="(item, index) in statsList"
+           :key="index"
+           class="stat-card">
+        <div class="stat-icon"
+             :style="{ backgroundColor: item.bgColor }">
+          <el-icon :color="item.color"
+                   :size="20">
             <component :is="item.icon" />
           </el-icon>
         </div>
@@ -18,84 +18,64 @@
       </div>
     </div>
     <div class="search-wrapper">
-      <el-form
-          :model="searchForm"
-          class="demo-form-inline"
-      >
+      <el-form :model="searchForm"
+               class="demo-form-inline">
         <el-row :gutter="20">
           <el-col :span="4">
             <el-form-item>
-              <el-input
-                  v-model="searchForm.afterSalesServiceNo"
-                  placeholder="璇疯緭鍏ュ伐鍗曠紪鍙�"
-                  clearable
-              />
+              <el-input v-model="searchForm.afterSalesServiceNo"
+                        placeholder="璇疯緭鍏ュ伐鍗曠紪鍙�"
+                        clearable />
             </el-form-item>
           </el-col>
           <el-col :span="4">
             <el-form-item>
-              <el-select
-                  v-model="searchForm.status"
-                  placeholder="璇烽�夋嫨宸ュ崟鐘舵��"
-                  clearable
-              >
-                <el-option
-                    v-for="dict in workOrderStatusOptions"
-                    :key="dict.value"
-                    :label="dict.label"
-                    :value="dict.value"
-                />
+              <el-select v-model="searchForm.status"
+                         placeholder="璇烽�夋嫨宸ュ崟鐘舵��"
+                         clearable>
+                <el-option v-for="dict in workOrderStatusOptions"
+                           :key="dict.value"
+                           :label="dict.label"
+                           :value="dict.value" />
               </el-select>
             </el-form-item>
           </el-col>
           <el-col :span="4">
             <el-form-item>
-              <el-select
-                  v-model="searchForm.urgency"
-                  placeholder="璇烽�夋嫨绱ф�ョ▼搴�"
-                  clearable
-              >
-                <el-option
-                    v-for="dict in degreeOfUrgencyOptions"
-                    :key="dict.value"
-                    :label="dict.label"
-                    :value="dict.value"
-                />
+              <el-select v-model="searchForm.urgency"
+                         placeholder="璇烽�夋嫨绱ф�ョ▼搴�"
+                         clearable>
+                <el-option v-for="dict in degreeOfUrgencyOptions"
+                           :key="dict.value"
+                           :label="dict.label"
+                           :value="dict.value" />
               </el-select>
             </el-form-item>
           </el-col>
-           <el-col :span="4">
+          <el-col :span="4">
             <el-form-item>
-              <el-select
-                  v-model="searchForm.serviceType"
-                  placeholder="璇烽�夋嫨鍞悗绫诲瀷"
-                  clearable
-              >
-                <el-option
-                    v-for="dict in classificationOptions"
-                    :key="dict.value"
-                    :label="dict.label"
-                    :value="dict.value"
-                />
+              <el-select v-model="searchForm.serviceType"
+                         placeholder="璇烽�夋嫨鍞悗绫诲瀷"
+                         clearable>
+                <el-option v-for="dict in classificationOptions"
+                           :key="dict.value"
+                           :label="dict.label"
+                           :value="dict.value" />
               </el-select>
             </el-form-item>
           </el-col>
-            <el-col :span="4">
-              <el-form-item>
-                <el-input
-                    v-model="searchForm.orderNo"
-                    placeholder="璇疯緭鍏ラ攢鍞崟鍙�"
-                    clearable
-                />
-              </el-form-item>
-            </el-col>
-          
-          
-
+          <el-col :span="4">
+            <el-form-item>
+              <el-input v-model="searchForm.orderNo"
+                        placeholder="璇疯緭鍏ラ攢鍞崟鍙�"
+                        clearable />
+            </el-form-item>
+          </el-col>
           <!-- 鎸夐挳 -->
           <el-col :span="4">
             <el-form-item>
-              <el-button type="primary" @click="handleQuery">
+              <el-button type="primary"
+                         @click="handleQuery">
                 鎼滅储
               </el-button>
               <el-button @click="handleReset">
@@ -107,310 +87,340 @@
       </el-form>
     </div>
     <div class="table_list">
-      <div class="table_header" style="display: flex; justify-content: space-between; align-items: center;">
+      <div class="table_header"
+           style="display: flex; justify-content: space-between; align-items: center;">
         <div>
-          <el-button type="primary" @click="openForm('add')">鏂板鍞悗鍗�</el-button>
+          <el-button type="primary"
+                     @click="openForm('add')">鏂板鍞悗鍗�</el-button>
         </div>
         <div>
           <el-button @click="handleOut">瀵煎嚭</el-button>
-          <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
+          <el-button type="danger"
+                     plain
+                     @click="handleDelete">鍒犻櫎</el-button>
         </div>
       </div>
-      <PIMTable
-          rowKey="id"
-          :column="tableColumn"
-          :tableData="tableData"
-          :page="page"
-          :height="tableHeight"
-          :isSelection="true"
-          @selection-change="handleSelectionChange"
-          :tableLoading="tableLoading"
-          @pagination="pagination"
-      ></PIMTable>
+      <PIMTable rowKey="id"
+                :column="tableColumn"
+                :tableData="tableData"
+                :page="page"
+                :height="tableHeight"
+                :isSelection="true"
+                @selection-change="handleSelectionChange"
+                :tableLoading="tableLoading"
+                @pagination="pagination"></PIMTable>
     </div>
-    <form-dia ref="formDia" @close="handleQuery"></form-dia>
+    <form-dia ref="formDia"
+              @close="handleQuery"></form-dia>
   </div>
 </template>
 
 <script setup>
-import {onMounted, reactive, ref, toRefs, computed, getCurrentInstance, nextTick} from "vue";
-import FormDia from "@/views/customerService/feedbackRegistration/components/formDia.vue";
-import {ElMessageBox} from "element-plus";
-import {afterSalesServiceDelete, afterSalesServiceListPage, getSalesLedgerDetail} from "@/api/customerService/index.js";
-import useUserStore from "@/store/modules/user.js";
-const { proxy } = getCurrentInstance();
-const userStore = useUserStore()
-import { Document, FolderOpened, UserFilled } from "@element-plus/icons-vue"
-import { markRaw } from 'vue'
+  import {
+    onMounted,
+    reactive,
+    ref,
+    toRefs,
+    computed,
+    getCurrentInstance,
+    nextTick,
+  } from "vue";
+  import FormDia from "@/views/customerService/feedbackRegistration/components/formDia.vue";
+  import { ElMessageBox } from "element-plus";
+  import {
+    afterSalesServiceDelete,
+    afterSalesServiceListPage,
+    getSalesLedgerDetail,
+  } from "@/api/customerService/index.js";
+  import useUserStore from "@/store/modules/user.js";
+  const { proxy } = getCurrentInstance();
+  const userStore = useUserStore();
+  import { Document, FolderOpened, UserFilled } from "@element-plus/icons-vue";
+  import { markRaw } from "vue";
 
-const statsList = ref([
-  {
-    icon: markRaw(Document),
-    count: 0,
-    label: '鍏ㄩ儴宸ュ崟',
-    color: '#4080ff',
-    bgColor: '#eaf2ff'
-  },
-  {
-    icon: markRaw(FolderOpened),
-    count: 0,
-    label: '宸插鐞�',
-    color: '#ff9a2e',
-    bgColor: '#fff5e6'
-  },
-  {
-    icon: markRaw(UserFilled),
-    count: 0,
-    label: '宸插畬鎴�',
-    color: '#00b42a',
-    bgColor: '#e6f7ed'
-  },
-])
-
-const data = reactive({
-  searchForm : {
-    customerName: "",
-    status: "",
-    urgency: "",
-    serviceType: "",
-    reviewStatus: "",
-    orderNo: "",
-  }
-});
-const { searchForm } = toRefs(data);
-
-const tableColumn = ref([
-  {
-    label: "宸ュ崟缂栧彿",
-    prop:"afterSalesServiceNo",
-    width: 150,
-    align: "center"
-  },
-  {
-    label: "閿�鍞崟鍙�",
-    prop:"salesContractNo",
-    width: 150,
-    align: "center"
-  },
-  {
-    label: "澶勭悊鐘舵��",
-    prop: "status",
-    dataType: "tag",
-    
-    formatData: (params) => {
-      if (params) {
-        let part = String(params)
-        const item = workOrderStatusOptions.value.find(item => item.value === part);
-        return item?.label || params; 
-      }
-      return null;
+  const statsList = ref([
+    {
+      icon: markRaw(Document),
+      count: 0,
+      label: "鍏ㄩ儴宸ュ崟",
+      color: "#4080ff",
+      bgColor: "#eaf2ff",
     },
-    formatType: (params) => {
-      if (params === 1) {
-        return "danger";
-      } else if (params === 2) {
-        return "success";
-      } else {
+    {
+      icon: markRaw(FolderOpened),
+      count: 0,
+      label: "宸插鐞�",
+      color: "#ff9a2e",
+      bgColor: "#fff5e6",
+    },
+    {
+      icon: markRaw(UserFilled),
+      count: 0,
+      label: "宸插畬鎴�",
+      color: "#00b42a",
+      bgColor: "#e6f7ed",
+    },
+  ]);
+
+  const data = reactive({
+    searchForm: {
+      customerName: "",
+      status: "",
+      urgency: "",
+      serviceType: "",
+      reviewStatus: "",
+      orderNo: "",
+    },
+  });
+  const { searchForm } = toRefs(data);
+
+  const tableColumn = ref([
+    {
+      label: "宸ュ崟缂栧彿",
+      prop: "afterSalesServiceNo",
+      width: 150,
+      align: "center",
+    },
+    {
+      label: "閿�鍞崟鍙�",
+      prop: "salesContractNo",
+      width: 150,
+      align: "center",
+    },
+    {
+      label: "澶勭悊鐘舵��",
+      prop: "status",
+      dataType: "tag",
+
+      formatData: params => {
+        if (params) {
+          let part = String(params);
+          const item = workOrderStatusOptions.value.find(
+            item => item.value === part
+          );
+          return item?.label || params;
+        }
         return null;
-      }
-    },
-    align: "center"
-  },
-  {
-    label: "鍙嶉鏃ユ湡",
-    prop: "feedbackDate",
-    width: 150,
-    align: "center"
-  },
-  {
-    label: "鐧昏浜�",
-    prop: "checkNickName",
-    align: "center"
-  },
-  {
-    label: "绱ф�ョ▼搴�",
-    prop: "urgency",
-    // 鏍规嵁degreeOfUrgencyOptions瀛楀吀鍘昏嚜鍔ㄥ尮閰�
-    formatData: (params) => {
-      if (params) {
-        const item = degreeOfUrgencyOptions.value.find(item => item.value === params);
-        return item?.label || params;
-      }
-      return null;
-    },
-    align: "center"
-  },
-  {
-    label: "鍞悗绫诲瀷",
-    prop: "serviceType",
-    // 鏍规嵁classificationOptions瀛楀吀鍘昏嚜鍔ㄥ尮閰�
-    formatData: (params) => {
-      if (params) {
-        const item = classificationOptions.value.find(item => item.value === params);
-        return item?.label || params;
-      }
-      return null;
-    },
-    align: "center"
-  },
-  {
-    label: "闂鎻忚堪",
-    prop: "proDesc",
-    width:300,
-  },
-  {
-    label: "鍏宠仈閮ㄩ棬",
-    prop: "deptName",
-    width: 200,
-    align: "center"
-  },
-  {
-    dataType: "action",
-    label: "鎿嶄綔",
-    fixed: 'right',
-    operation: [
-      {
-        name: "缂栬緫",
-        type: "text",
-        clickFun: (row) => {
-          console.log(row)
-          openForm("edit", row);
-        },
-        disabled: (row) => {
-          return row.status !== 1
+      },
+      formatType: params => {
+        if (params === 1) {
+          return "danger";
+        } else if (params === 2) {
+          return "success";
+        } else {
+          return null;
         }
       },
-    ],
-    align: "center"
-  },
-]);
-const tableData = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
-  current: 1,
-  size: 100,
-  total: 0,
-});
-const selectedRows = ref([]);
-const tableHeight = computed(() => "calc(100% -80px)");
-
-const handleReset = () => {
-  Object.keys(searchForm.value).forEach(key => {
-    searchForm.value[key] = ""
-  })
-  page.current = 1;
-  getList();
-}
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
-  selectedRows.value = selection;
-};
-const formDia = ref()
-
-// 瀛楀吀鑾峰彇
-/* 
-post_sale_waiting_list 鏂板鐨勫敭鍚庡垎绫�
-degree_of_urgency 鏂板鐨勭揣鎬ョ▼搴�
-work_order_status 涓婚〉鐨勫伐鍗曠姸鎬�
-review_status 棣栭〉鐨勫鏍哥姸鎬�
-*/
-const { post_sale_waiting_list, degree_of_urgency, work_order_status, review_status } = proxy.useDict(
-  "post_sale_waiting_list",
-  "degree_of_urgency",
-  "work_order_status",
-  "review_status"
-);
-
-const classificationOptions = computed(() => post_sale_waiting_list?.value || []);
-const degreeOfUrgencyOptions = computed(() => degree_of_urgency?.value || []);
-const workOrderStatusOptions = computed(() => work_order_status?.value || []);
-
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
-  page.current = 1;
-  getList();
-};
-const pagination = (obj) => {
-  page.current = obj.page;
-  page.size = obj.limit;
-  getList();
-};
-const getList = () => {
-  tableLoading.value = true;
-  getSalesLedgerDetails()
-  afterSalesServiceListPage({ ...searchForm.value, ...page }).then((res) => {
-    tableLoading.value = false;
-    tableData.value = res.data.records;
-    page.total = res.data.total;
+      align: "center",
+    },
+    {
+      label: "鍙嶉鏃ユ湡",
+      prop: "feedbackDate",
+      width: 150,
+      align: "center",
+    },
+    {
+      label: "鐧昏浜�",
+      prop: "checkNickName",
+      align: "center",
+    },
+    {
+      label: "绱ф�ョ▼搴�",
+      prop: "urgency",
+      // 鏍规嵁degreeOfUrgencyOptions瀛楀吀鍘昏嚜鍔ㄥ尮閰�
+      formatData: params => {
+        if (params) {
+          const item = degreeOfUrgencyOptions.value.find(
+            item => item.value === params
+          );
+          return item?.label || params;
+        }
+        return null;
+      },
+      align: "center",
+    },
+    {
+      label: "鍞悗绫诲瀷",
+      prop: "serviceType",
+      // 鏍规嵁classificationOptions瀛楀吀鍘昏嚜鍔ㄥ尮閰�
+      formatData: params => {
+        if (params) {
+          const item = classificationOptions.value.find(
+            item => item.value === params
+          );
+          return item?.label || params;
+        }
+        return null;
+      },
+      align: "center",
+    },
+    {
+      label: "瀹㈡埛璇夋眰",
+      prop: "proDesc",
+      width: 300,
+    },
+    {
+      label: "鍏宠仈閮ㄩ棬",
+      prop: "deptName",
+      width: 200,
+      align: "center",
+    },
+    {
+      dataType: "action",
+      label: "鎿嶄綔",
+      fixed: "right",
+      operation: [
+        {
+          name: "缂栬緫",
+          type: "text",
+          clickFun: row => {
+            console.log(row);
+            openForm("edit", row);
+          },
+          disabled: row => {
+            return row.status !== 1;
+          },
+        },
+      ],
+      align: "center",
+    },
+  ]);
+  const tableData = ref([]);
+  const tableLoading = ref(false);
+  const page = reactive({
+    current: 1,
+    size: 100,
+    total: 0,
   });
-};
+  const selectedRows = ref([]);
+  const tableHeight = computed(() => "calc(100% -80px)");
 
-// 鎵撳紑寮规
-const openForm = (type, row) => {
-  nextTick(() => {
-    formDia.value?.openDialog(type, row)
-  })
-};
+  const handleReset = () => {
+    Object.keys(searchForm.value).forEach(key => {
+      searchForm.value[key] = "";
+    });
+    page.current = 1;
+    getList();
+  };
+  // 琛ㄦ牸閫夋嫨鏁版嵁
+  const handleSelectionChange = selection => {
+    selectedRows.value = selection;
+  };
+  const formDia = ref();
 
-function handleDelete() {
-  let ids = [];
-  if (selectedRows.value.length > 0) {
-    // 妫�鏌ユ槸鍚︽湁浠栦汉缁存姢鐨勬暟鎹�
-    const unauthorizedData = selectedRows.value.filter(item => item.checkUserId !== userStore.id);
-    if (unauthorizedData.length > 0) {
-      proxy.$modal.msgWarning("涓嶅彲鍒犻櫎浠栦汉缁存姢鐨勬暟鎹�");
+  // 瀛楀吀鑾峰彇
+  /*
+  post_sale_waiting_list 鏂板鐨勫敭鍚庡垎绫�
+  degree_of_urgency 鏂板鐨勭揣鎬ョ▼搴�
+  work_order_status 涓婚〉鐨勫伐鍗曠姸鎬�
+  review_status 棣栭〉鐨勫鏍哥姸鎬�
+  */
+  const {
+    post_sale_waiting_list,
+    degree_of_urgency,
+    work_order_status,
+    review_status,
+  } = proxy.useDict(
+    "post_sale_waiting_list",
+    "degree_of_urgency",
+    "work_order_status",
+    "review_status"
+  );
+
+  const classificationOptions = computed(
+    () => post_sale_waiting_list?.value || []
+  );
+  const degreeOfUrgencyOptions = computed(() => degree_of_urgency?.value || []);
+  const workOrderStatusOptions = computed(() => work_order_status?.value || []);
+
+  // 鏌ヨ鍒楄〃
+  /** 鎼滅储鎸夐挳鎿嶄綔 */
+  const handleQuery = () => {
+    page.current = 1;
+    getList();
+  };
+  const pagination = obj => {
+    page.current = obj.page;
+    page.size = obj.limit;
+    getList();
+  };
+  const getList = () => {
+    tableLoading.value = true;
+    getSalesLedgerDetails();
+    afterSalesServiceListPage({ ...searchForm.value, ...page }).then(res => {
+      tableLoading.value = false;
+      tableData.value = res.data.records;
+      page.total = res.data.total;
+    });
+  };
+
+  // 鎵撳紑寮规
+  const openForm = (type, row) => {
+    nextTick(() => {
+      formDia.value?.openDialog(type, row);
+    });
+  };
+
+  function handleDelete() {
+    let ids = [];
+    if (selectedRows.value.length > 0) {
+      // 妫�鏌ユ槸鍚︽湁浠栦汉缁存姢鐨勬暟鎹�
+      const unauthorizedData = selectedRows.value.filter(
+        item => item.checkUserId !== userStore.id
+      );
+      if (unauthorizedData.length > 0) {
+        proxy.$modal.msgWarning("涓嶅彲鍒犻櫎浠栦汉缁存姢鐨勬暟鎹�");
+        return;
+      }
+      ids = selectedRows.value.map(item => item.id);
+    } else {
+      proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
       return;
     }
-    ids = selectedRows.value.map((item) => item.id);
-  } else {
-    proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
-    return;
-  }
-  ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鍒犻櫎鎻愮ず", {
-    confirmButtonText: "纭",
-    cancelButtonText: "鍙栨秷",
-    type: "warning",
-  })
+    ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鍒犻櫎鎻愮ず", {
+      confirmButtonText: "纭",
+      cancelButtonText: "鍙栨秷",
+      type: "warning",
+    })
       .then(() => {
         tableLoading.value = true;
         afterSalesServiceDelete(ids)
-            .then(() => {
-              proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
-              getList();
-            })
-            .finally(() => {
-              tableLoading.value = false;
-            });
+          .then(() => {
+            proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+            getList();
+          })
+          .finally(() => {
+            tableLoading.value = false;
+          });
       })
       .catch(() => {
         proxy.$modal.msg("宸插彇娑�");
       });
-};
+  }
 
-// 瀵煎嚭
-const handleOut = () => {
-  ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
-    confirmButtonText: "纭",
-    cancelButtonText: "鍙栨秷",
-    type: "warning",
-  })
+  // 瀵煎嚭
+  const handleOut = () => {
+    ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
+      confirmButtonText: "纭",
+      cancelButtonText: "鍙栨秷",
+      type: "warning",
+    })
       .then(() => {
         proxy.download("/afterSalesService/export", {}, "鍙嶉鐧昏.xlsx");
       })
       .catch(() => {
         proxy.$modal.msg("宸插彇娑�");
       });
-};
+  };
 
-const getStatsCountByStatus = (list, status) => {
-  if (!Array.isArray(list)) return 0;
-  return list.find((item) => item?.status === status)?.count || 0;
-};
+  const getStatsCountByStatus = (list, status) => {
+    if (!Array.isArray(list)) return 0;
+    return list.find(item => item?.status === status)?.count || 0;
+  };
 
   // 鑾峰彇缁熻鏁版嵁骞跺埛鏂伴《閮ㄥ崱鐗�
   const getSalesLedgerDetails = () => {
-    getSalesLedgerDetail({}).then((res) => {
+    getSalesLedgerDetail({}).then(res => {
       if (res.code === 200) {
         const statsData = Array.isArray(res.data) ? res.data : [];
         statsList.value[0].count = getStatsCountByStatus(statsData, 3);
@@ -418,99 +428,96 @@
         statsList.value[2].count = getStatsCountByStatus(statsData, 1);
       }
     });
-  }
+  };
 
-
-
-onMounted(() => {
-  getList();
-  
-});
+  onMounted(() => {
+    getList();
+  });
 </script>
 
 <style scoped lang="scss">
-.search-wrapper {
-  background: white;
-  padding: 1rem 1rem 0 1rem;
-  border: 8px;
-  border-radius: 16px;
-}
+  .search-wrapper {
+    background: white;
+    padding: 1rem 1rem 0 1rem;
+    border: 8px;
+    border-radius: 16px;
+  }
 
-.expand-btn {
-  width: 100%;
-  padding: 20px; /* 涓婁笅宸﹀彸鍚�20px锛岀偣鍑昏繖涓寖鍥撮兘鑳借Е鍙戜簨浠� */
-  cursor: pointer; /* 榧犳爣鎮诞鏄剧ず鎵嬪瀷锛屾彁鍗囦綋楠� */
-  text-align: center;
-}
+  .expand-btn {
+    width: 100%;
+    padding: 20px; /* 涓婁笅宸﹀彸鍚�20px锛岀偣鍑昏繖涓寖鍥撮兘鑳借Е鍙戜簨浠� */
+    cursor: pointer; /* 榧犳爣鎮诞鏄剧ず鎵嬪瀷锛屾彁鍗囦綋楠� */
+    text-align: center;
+  }
 
-.workorder-stats {
-  display: flex;
-  gap: 16px;
-  padding-bottom:1rem;
-  border-radius: 8px;
-}
+  .workorder-stats {
+    display: flex;
+    gap: 16px;
+    padding-bottom: 1rem;
+    border-radius: 8px;
+  }
 
-.stat-card {
-  flex: 1;
-  display: flex;
-  align-items: center;
-  gap: 12px;
-  padding: 20px;
-  background-color: #fff;
-  border-radius: 8px;
-  box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.06);
-}
+  .stat-card {
+    flex: 1;
+    display: flex;
+    align-items: center;
+    gap: 12px;
+    padding: 20px;
+    background-color: #fff;
+    border-radius: 8px;
+    box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.06);
+  }
 
-.stat-icon {
-  display: flex;
-  align-items: center;
-  justify-content: center;
-  width: 48px;
-  height: 48px;
-  border-radius: 8px;
-}
+  .stat-icon {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    width: 48px;
+    height: 48px;
+    border-radius: 8px;
+  }
 
-.stat-info {
-  display: flex;
-  flex-direction: column;
-  gap: 4px;
-}
+  .stat-info {
+    display: flex;
+    flex-direction: column;
+    gap: 4px;
+  }
 
-.stat-number {
-  font-size: 24px;
-  font-weight: 600;
-  color: #303133;
-  line-height: 1;
-}
+  .stat-number {
+    font-size: 24px;
+    font-weight: 600;
+    color: #303133;
+    line-height: 1;
+  }
 
-.stat-label {
-  font-size: 14px;
-  color: #909399;
-  line-height: 1;
-}
-.table_header{
-  padding-bottom: 10px;
-}
+  .stat-label {
+    font-size: 14px;
+    color: #909399;
+    line-height: 1;
+  }
+  .table_header {
+    padding-bottom: 10px;
+  }
 
-.table_list {
-  height: calc(100vh - 380px);
-  background: #fff;
-  margin-top: 20px;
-  display: flex;
-  flex-direction: column;
-}
+  .table_list {
+    height: calc(100vh - 380px);
+    background: #fff;
+    margin-top: 20px;
+    display: flex;
+    flex-direction: column;
+  }
 
-:deep(.table_list .pagination-container) {
-  display: flex;
-  justify-content: flex-end;
-  align-items: center;
-  margin-top: auto;
-  padding: 12px 0 0;
-}
+  :deep(.table_list .pagination-container) {
+    display: flex;
+    justify-content: flex-end;
+    align-items: center;
+    margin-top: auto;
+    padding: 12px 0 0;
+  }
 
-:deep(.table_list .el-pagination) {
-  flex-wrap: nowrap;
-  justify-content: flex-end;
-  width: 100%;
-}
+  :deep(.table_list .el-pagination) {
+    flex-wrap: nowrap;
+    justify-content: flex-end;
+    width: 100%;
+  }
 </style>
diff --git a/src/views/equipmentManagement/inspectionManagement/components/formDia.vue b/src/views/equipmentManagement/inspectionManagement/components/formDia.vue
index 3e7f1ca..74cbb58 100644
--- a/src/views/equipmentManagement/inspectionManagement/components/formDia.vue
+++ b/src/views/equipmentManagement/inspectionManagement/components/formDia.vue
@@ -27,22 +27,22 @@
         <el-row>
           <el-col :span="12">
             <el-form-item label="宸℃椤圭洰" prop="inspectionProject">
-              <el-input v-model="form.inspectionProject" placeholder="璇疯緭鍏ュ贰妫�椤圭洰" />
+              <el-input v-model="form.inspectionProject" placeholder="璇疯緭鍏ュ贰妫�椤圭洰" type="textarea" :autosize="{ minRows: 2, maxRows: 6 }" />
             </el-form-item>
           </el-col>
+          <el-col :span="12">
+            <el-form-item label="澶囨敞" prop="remarks">
+              <el-input v-model="form.remarks" placeholder="璇疯緭鍏ュ娉�" type="textarea" :autosize="{ minRows: 2, maxRows: 6 }" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
           <el-col :span="12">
             <el-form-item label="鏄惁鍚敤" prop="isEnabled">
               <el-radio-group v-model="form.isEnabled">
                 <el-radio :value="1">鏄�</el-radio>
                 <el-radio :value="0">鍚�</el-radio>
               </el-radio-group>
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row>
-          <el-col :span="12">
-            <el-form-item label="澶囨敞" prop="remarks">
-              <el-input v-model="form.remarks" placeholder="璇疯緭鍏ュ娉�" type="textarea" />
             </el-form-item>
           </el-col>
         </el-row>
diff --git a/src/views/equipmentManagement/inspectionManagement/components/uploadFiles.vue b/src/views/equipmentManagement/inspectionManagement/components/uploadFiles.vue
new file mode 100644
index 0000000..36256c8
--- /dev/null
+++ b/src/views/equipmentManagement/inspectionManagement/components/uploadFiles.vue
@@ -0,0 +1,680 @@
+<template>
+  <FormDialog
+    v-model="dialogVisible"
+    title="涓婁紶宸℃璁板綍"
+    width="980px"
+    @close="handleClose"
+    @cancel="handleClose"
+  >
+    <main class="upload-content">
+      <el-card v-if="taskInfo" class="section-card">
+        <el-descriptions :column="1" border>
+          <el-descriptions-item label="宸℃浠诲姟鍚嶇О">
+            {{ taskInfo.taskName || "-" }}
+          </el-descriptions-item>
+          <el-descriptions-item label="宸℃椤圭洰">
+            {{ taskInfo.inspectionProject || "-" }}
+          </el-descriptions-item>
+          <el-descriptions-item label="澶囨敞">
+            {{ taskInfo.remarks || "-" }}
+          </el-descriptions-item>
+        </el-descriptions>
+      </el-card>
+
+      <el-card class="section-card">
+        <h3>宸℃鐘舵��</h3>
+        <el-radio-group v-model="hasException">
+          <el-radio-button :value="false">姝e父</el-radio-button>
+          <el-radio-button :value="true">瀛樺湪寮傚父</el-radio-button>
+        </el-radio-group>
+      </el-card>
+
+      <el-card v-if="hasException === true" class="section-card">
+        <h3>寮傚父鎻忚堪</h3>
+        <el-input
+          v-model="abnormalDescription"
+          type="textarea"
+          maxlength="500"
+          show-word-limit
+          :rows="4"
+          placeholder="璇锋弿杩板紓甯告儏鍐�..."
+        />
+      </el-card>
+
+      <el-card v-if="hasException === true" class="section-card">
+        <el-tabs v-model="currentUploadType">
+          <el-tab-pane label="鐢熶骇鍓�" name="before" />
+          <el-tab-pane label="鐢熶骇涓�" name="after" />
+          <el-tab-pane label="鐢熶骇鍚�" name="issue" />
+        </el-tabs>
+
+        <div class="upload-buttons">
+          <el-upload
+            :show-file-list="false"
+            :http-request="uploadFile"
+            :disabled="getCurrentFiles().length >= uploadConfig.limit || uploading"
+            accept="image/*"
+          >
+            <el-button type="primary" :loading="uploading">
+              <el-icon><Camera /></el-icon>
+              閫夋嫨鍥剧墖
+            </el-button>
+          </el-upload>
+
+          <el-upload
+            :show-file-list="false"
+            :http-request="uploadFile"
+            :disabled="getCurrentFiles().length >= uploadConfig.limit || uploading"
+            accept="video/*"
+          >
+            <el-button type="success" :loading="uploading">
+              <el-icon><VideoCamera /></el-icon>
+              閫夋嫨瑙嗛
+            </el-button>
+          </el-upload>
+        </div>
+
+        <el-progress
+          v-if="uploading"
+          :percentage="uploadProgress"
+          class="upload-progress"
+        />
+
+        <div v-if="getCurrentFiles().length" class="file-list">
+          <div
+            v-for="(file, index) in getCurrentFiles()"
+            :key="file.uid || file.id || index"
+            class="file-item"
+          >
+            <div class="file-preview-container">
+              <el-image
+                v-if="file.type === 'image' || !file.type"
+                :src="file.url || file.tempFilePath || file.path || file.downloadUrl"
+                fit="cover"
+                class="file-preview"
+                :preview-src-list="[file.url || file.tempFilePath || file.path || file.downloadUrl]"
+                preview-teleported
+              />
+
+              <div v-else class="video-preview" @click="previewVideo(file)">
+                <el-icon><VideoCamera /></el-icon>
+                <span>瑙嗛</span>
+              </div>
+
+              <el-button
+                class="delete-btn"
+                type="danger"
+                circle
+                size="small"
+                @click="removeFile(index)"
+              >
+                <el-icon><Close /></el-icon>
+              </el-button>
+            </div>
+
+            <div class="file-info">
+              <div class="file-name">
+                {{ file.bucketFilename || file.name || (file.type === "image" ? "鍥剧墖" : "瑙嗛") }}
+              </div>
+              <div class="file-size">{{ formatFileSize(file.size) }}</div>
+            </div>
+          </div>
+        </div>
+
+        <el-empty
+          v-else
+          :description="`璇烽�夋嫨瑕佷笂浼犵殑${getUploadTypeText()}鍥剧墖鎴栬棰慲"
+        />
+
+        <el-alert
+          class="upload-summary"
+          type="info"
+          :closable="false"
+          :title="`鐢熶骇鍓嶏細${beforeModelValue.length}涓枃浠� | 鐢熶骇涓細${afterModelValue.length}涓枃浠� | 鐢熶骇鍚庯細${issueModelValue.length}涓枃浠禶"
+        />
+      </el-card>
+
+      <el-result
+        v-if="hasException === false"
+        icon="success"
+        title="璁惧杩愯姝e父"
+        sub-title="鏃犻渶涓婁紶鐓х墖"
+      />
+    </main>
+
+    <template #footer>
+      <footer class="footer-buttons">
+        <el-button type="primary" @click="submitUpload">鎻愪氦</el-button>
+        <el-button v-if="hasException === true" type="warning" @click="goToRepair">
+          鏂板鎶ヤ慨
+        </el-button>
+        <el-button @click="handleClose">鍙栨秷</el-button>
+      </footer>
+    </template>
+  </FormDialog>
+
+  <el-dialog
+    v-model="showVideoDialog"
+    :title="currentVideoFile?.originalFilename || currentVideoFile?.name || '瑙嗛棰勮'"
+    width="720px"
+  >
+    <video
+      v-if="currentVideoFile"
+      :src="currentVideoFile.url || currentVideoFile.downloadUrl"
+      class="video-player"
+      controls
+      autoplay
+    />
+  </el-dialog>
+</template>
+
+<script setup>
+import { computed, ref } from "vue";
+import { useRouter } from "vue-router";
+import { ElLoading, ElMessage, ElMessageBox } from "element-plus";
+import { Camera, Close, VideoCamera } from "@element-plus/icons-vue";
+import axios from "axios";
+import FormDialog from "@/components/Dialog/FormDialog.vue";
+import { uploadInspectionTask } from "@/api/inspectionManagement/index.js";
+import { getToken } from "@/utils/auth";
+
+const emit = defineEmits(["closeDia", "success"]);
+const router = useRouter();
+
+const dialogVisible = ref(false);
+const taskInfo = ref(null);
+const uploading = ref(false);
+const uploadProgress = ref(0);
+
+const beforeModelValue = ref([]);
+const afterModelValue = ref([]);
+const issueModelValue = ref([]);
+
+const currentUploadType = ref("before");
+const hasException = ref(null);
+const abnormalDescription = ref("");
+
+const showVideoDialog = ref(false);
+const currentVideoFile = ref(null);
+
+const uploadConfig = {
+  action: "/common/upload",
+  limit: 10,
+  fileSize: 50,
+  fileType: ["jpg", "jpeg", "png", "mp4", "mov"],
+};
+
+const uploadFileUrl = computed(
+  () => `${import.meta.env.VITE_APP_BASE_API}${uploadConfig.action}`
+);
+
+const processFileUrl = fileUrl => {
+  if (!fileUrl) return "";
+
+  let currentUrl = String(fileUrl);
+  if (currentUrl.includes("\\")) {
+    const uploadsIndex = currentUrl.toLowerCase().indexOf("uploads");
+    if (uploadsIndex > -1) {
+      currentUrl = `/${currentUrl.substring(uploadsIndex).replace(/\\/g, "/")}`;
+    } else {
+      const fileName = currentUrl.split("\\").pop();
+      currentUrl = `/uploads/${fileName}`;
+    }
+  }
+
+  if (currentUrl && !currentUrl.startsWith("http")) {
+    if (!currentUrl.startsWith("/")) {
+      currentUrl = `/${currentUrl}`;
+    }
+    currentUrl = __BASE_API__ + currentUrl;
+  }
+
+  return currentUrl;
+};
+
+const normalizeList = (list, fileType) => {
+  if (!Array.isArray(list)) return [];
+
+  return list.filter(Boolean).map(item => {
+    let currentType = item.type;
+    if (!currentType && item.contentType) {
+      currentType = item.contentType.startsWith("video") ? "video" : "image";
+    } else if (!currentType) {
+      currentType = fileType || "image";
+    }
+
+    return {
+      ...item,
+      url: processFileUrl(item.url || item.previewURL || item.downloadUrl || item.path || ""),
+      downloadUrl: processFileUrl(
+        item.downloadUrl || item.url || item.previewURL || item.path || ""
+      ),
+      name: item.name || item.originalFilename || item.bucketFilename,
+      tempId: item.tempId || item.id || item.tempFileId,
+      tempFileId: item.tempFileId || item.tempId || item.id,
+      size: item.size || item.byteSize || 0,
+      type: currentType,
+      status: "success",
+      uid: item.uid || `${Date.now()}-${Math.random()}`,
+    };
+  });
+};
+
+const resetState = () => {
+  taskInfo.value = null;
+  beforeModelValue.value = [];
+  afterModelValue.value = [];
+  issueModelValue.value = [];
+  currentUploadType.value = "before";
+  hasException.value = null;
+  abnormalDescription.value = "";
+  uploading.value = false;
+  uploadProgress.value = 0;
+  showVideoDialog.value = false;
+  currentVideoFile.value = null;
+};
+
+const openDialog = row => {
+  const raw = JSON.parse(JSON.stringify(row?.__raw || row || {}));
+  taskInfo.value = raw;
+
+  beforeModelValue.value = normalizeList(
+    raw.commonFileListBeforeVO || raw.commonFileListBefore || [],
+    "image"
+  );
+  afterModelValue.value = normalizeList(
+    raw.commonFileListVO || raw.commonFileList || [],
+    "image"
+  );
+  issueModelValue.value = normalizeList(
+    raw.commonFileListAfterVO || raw.commonFileListAfter || [],
+    "image"
+  );
+
+  abnormalDescription.value = raw.abnormalDescription || "";
+
+  if (raw.hasException !== undefined && raw.hasException !== null) {
+    hasException.value = raw.hasException;
+  } else if (raw.inspectionResult !== undefined && raw.inspectionResult !== null) {
+    hasException.value = String(raw.inspectionResult) === "0";
+  } else {
+    hasException.value = null;
+  }
+
+  if (
+    hasException.value !== true &&
+    (beforeModelValue.value.length || afterModelValue.value.length || issueModelValue.value.length)
+  ) {
+    hasException.value = true;
+  }
+
+  dialogVisible.value = true;
+};
+
+const handleClose = () => {
+  dialogVisible.value = false;
+  resetState();
+  emit("closeDia");
+};
+
+const getCurrentFiles = () => {
+  if (currentUploadType.value === "before") return beforeModelValue.value;
+  if (currentUploadType.value === "after") return afterModelValue.value;
+  if (currentUploadType.value === "issue") return issueModelValue.value;
+  return [];
+};
+
+const getUploadTypeText = () => {
+  if (currentUploadType.value === "before") return "鐢熶骇鍓�";
+  if (currentUploadType.value === "after") return "鐢熶骇涓�";
+  if (currentUploadType.value === "issue") return "鐢熶骇鍚�";
+  return "";
+};
+
+const getTabType = () => {
+  if (currentUploadType.value === "before") return 10;
+  if (currentUploadType.value === "after") return 11;
+  if (currentUploadType.value === "issue") return 12;
+  return 10;
+};
+
+const previewVideo = file => {
+  currentVideoFile.value = file;
+  showVideoDialog.value = true;
+};
+
+const uploadFile = async uploadRequest => {
+  const rawFile = uploadRequest.file;
+
+  if (getCurrentFiles().length >= uploadConfig.limit) {
+    ElMessage.warning(`鏈�澶氬彧鑳介�夋嫨${uploadConfig.limit}涓枃浠禶);
+    return;
+  }
+
+  const ext = rawFile.name.split(".").pop()?.toLowerCase();
+  if (!uploadConfig.fileType.includes(ext)) {
+    ElMessage.warning(`鏂囦欢鏍煎紡涓嶆敮鎸侊紝璇蜂笂浼� ${uploadConfig.fileType.join("/")} 鏍煎紡`);
+    return;
+  }
+
+  if (rawFile.size > uploadConfig.fileSize * 1024 * 1024) {
+    ElMessage.warning(`鏂囦欢澶у皬涓嶈兘瓒呰繃 ${uploadConfig.fileSize}MB`);
+    return;
+  }
+
+  const token = getToken();
+  if (!token) {
+    ElMessage.warning("鐢ㄦ埛鏈櫥褰�");
+    return;
+  }
+
+  const formData = new FormData();
+  formData.append("files", rawFile);
+  formData.append("type", getTabType());
+
+  uploading.value = true;
+  uploadProgress.value = 0;
+
+  try {
+    const { data } = await axios.post(uploadFileUrl.value, formData, {
+      headers: {
+        Authorization: `Bearer ${token}`,
+        "Content-Type": "multipart/form-data",
+      },
+      onUploadProgress: event => {
+        if (event.total) {
+          uploadProgress.value = Math.round((event.loaded / event.total) * 100);
+        }
+      },
+    });
+
+    if (data.code !== 200) {
+      ElMessage.error(data.msg || "涓婁紶澶辫触");
+      return;
+    }
+
+    const resultData = Array.isArray(data.data) ? data.data[0] : data.data;
+    const finalUrl = processFileUrl(
+      resultData.url || resultData.previewURL || resultData.downloadUrl || ""
+    );
+    const finalName = resultData.name || resultData.originalFilename || resultData.bucketFilename;
+    const finalId = resultData.tempId || resultData.id || resultData.tempFileId;
+
+    const uploadedFile = {
+      ...resultData,
+      url: finalUrl,
+      downloadUrl: finalUrl,
+      name: finalName,
+      tempId: finalId,
+      tempFileId: resultData.tempFileId || finalId,
+      size: rawFile.size || resultData.size || resultData.byteSize || 0,
+      type: rawFile.type?.startsWith("video") ? "video" : "image",
+      status: "success",
+      uid: `${Date.now()}-${Math.random()}`,
+    };
+
+    getCurrentFiles().push(uploadedFile);
+    ElMessage.success("涓婁紶鎴愬姛");
+  } catch (error) {
+    ElMessage.error(error?.message || "涓婁紶澶辫触");
+  } finally {
+    uploading.value = false;
+  }
+};
+
+const buildFileItem = item => ({
+  id: item?.id,
+  tempId: item?.tempId,
+  tempFileId: item?.tempFileId,
+  url: item?.downloadUrl || item?.url || "",
+  downloadUrl: item?.downloadUrl || item?.url || "",
+  name: item?.name,
+  bucketFilename: item?.bucketFilename || item?.name,
+  originalFilename: item?.originalFilename || item?.name,
+  size: item?.size || 0,
+  byteSize: item?.byteSize || item?.size || 0,
+  contentType: item?.contentType || "",
+  type: item?.type,
+});
+
+const submitUpload = async () => {
+  if (hasException.value === null) {
+    ElMessage.warning("璇烽�夋嫨宸℃鐘舵��");
+    return;
+  }
+
+  if (hasException.value === true) {
+    const totalFiles =
+      beforeModelValue.value.length +
+      afterModelValue.value.length +
+      issueModelValue.value.length;
+
+    if (!totalFiles) {
+      ElMessage.warning("璇蜂笂浼犲紓甯哥収鐗囨垨瑙嗛");
+      return;
+    }
+
+    if (!abnormalDescription.value.trim()) {
+      ElMessage.warning("璇峰~鍐欏紓甯告弿杩�");
+      return;
+    }
+  }
+
+  const loading = ElLoading.service({
+    text: "鎻愪氦涓�...",
+    background: "rgba(0, 0, 0, 0.3)",
+  });
+
+  try {
+    const allFiles = [
+      ...beforeModelValue.value,
+      ...afterModelValue.value,
+      ...issueModelValue.value,
+    ];
+
+    const tempFileIds = allFiles
+      .map(item => item?.tempId ?? item?.tempFileId ?? item?.id)
+      .filter(Boolean);
+
+    const {
+      createTime,
+      updateTime,
+      storageBlobDTO,
+      commonFileListAfterVO,
+      commonFileListVO,
+      commonFileListBeforeVO,
+      commonFileListAfter,
+      commonFileList,
+      commonFileListBefore,
+      __raw,
+      ...baseTaskInfo
+    } = taskInfo.value || {};
+
+    const submitData = {
+      ...baseTaskInfo,
+      commonFileListBeforeDTO: beforeModelValue.value.map(buildFileItem),
+      commonFileListDTO: afterModelValue.value.map(buildFileItem),
+      commonFileListAfterDTO: issueModelValue.value.map(buildFileItem),
+      hasException: hasException.value,
+      inspectionResult: hasException.value ? 0 : 1,
+      abnormalDescription: abnormalDescription.value,
+      tempFileIds,
+    };
+
+    const result = await uploadInspectionTask(submitData);
+
+    if (result && (result.code === 200 || result.success)) {
+      ElMessage.success("鎻愪氦鎴愬姛");
+      dialogVisible.value = false;
+      resetState();
+      emit("success");
+      emit("closeDia");
+    } else {
+      ElMessage.error(result?.msg || result?.message || "鎻愪氦澶辫触");
+    }
+  } catch (error) {
+    ElMessage.error(error?.message || "鎻愪氦澶辫触");
+  } finally {
+    loading.close();
+  }
+};
+
+const removeFile = async index => {
+  try {
+    await ElMessageBox.confirm("纭畾瑕佸垹闄よ繖涓枃浠跺悧锛�", "纭鍒犻櫎", {
+      type: "warning",
+    });
+    getCurrentFiles().splice(index, 1);
+  } catch {}
+};
+
+const goToRepair = () => {
+  const taskData = {
+    taskId: taskInfo.value?.taskId || taskInfo.value?.id,
+    taskName: taskInfo.value?.taskName,
+    inspectionLocation: taskInfo.value?.inspectionLocation,
+    inspector: taskInfo.value?.inspector,
+    hasException: hasException.value,
+    inspectionResult: hasException.value ? 0 : 1,
+    commonFileListBeforeDTO: beforeModelValue.value.map(buildFileItem),
+    commonFileListDTO: afterModelValue.value.map(buildFileItem),
+    commonFileListAfterDTO: issueModelValue.value.map(buildFileItem),
+    uploadedFiles: {
+      before: beforeModelValue.value,
+      after: afterModelValue.value,
+      issue: issueModelValue.value,
+    },
+  };
+
+  sessionStorage.setItem("repairTaskInfo", JSON.stringify(taskData));
+  router.push("/equipmentManagement/repair/add");
+};
+
+const formatFileSize = size => {
+  if (!size) return "0 B";
+
+  const units = ["B", "KB", "MB", "GB"];
+  let index = 0;
+  let fileSize = size;
+
+  while (fileSize >= 1024 && index < units.length - 1) {
+    fileSize /= 1024;
+    index += 1;
+  }
+
+  return `${fileSize.toFixed(2)} ${units[index]}`;
+};
+
+defineExpose({
+  openDialog,
+});
+</script>
+
+<style scoped>
+.inspection-upload-page {
+  min-height: 70vh;
+  background: #f5f7fa;
+  padding: 20px 20px 90px;
+  box-sizing: border-box;
+}
+
+.upload-content {
+  max-width: 960px;
+  margin: 20px auto 0;
+}
+
+.section-card {
+  margin-bottom: 16px;
+}
+
+.section-card h3 {
+  margin: 0 0 16px;
+  font-size: 16px;
+}
+
+.upload-buttons {
+  display: flex;
+  gap: 12px;
+  margin: 16px 0;
+}
+
+.upload-progress {
+  margin-bottom: 16px;
+}
+
+.file-list {
+  display: grid;
+  grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
+  gap: 12px;
+}
+
+.file-preview-container {
+  position: relative;
+  aspect-ratio: 1;
+  border-radius: 8px;
+  overflow: hidden;
+  background: #f2f3f5;
+}
+
+.file-preview {
+  width: 100%;
+  height: 100%;
+}
+
+.video-preview {
+  width: 100%;
+  height: 100%;
+  background: #303133;
+  color: #fff;
+  display: flex;
+  gap: 6px;
+  align-items: center;
+  justify-content: center;
+  cursor: pointer;
+}
+
+.delete-btn {
+  position: absolute;
+  top: 6px;
+  right: 6px;
+}
+
+.file-info {
+  margin-top: 6px;
+  font-size: 12px;
+}
+
+.file-name {
+  color: #606266;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+.file-size {
+  color: #909399;
+  margin-top: 2px;
+}
+
+.upload-summary {
+  margin-top: 16px;
+}
+
+.footer-buttons {
+  position: sticky;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  padding: 14px 20px 0;
+  background: #f5f7fa;
+  display: flex;
+  justify-content: center;
+  gap: 12px;
+}
+
+.video-player {
+  width: 100%;
+  max-height: 70vh;
+  background: #000;
+}
+</style>
diff --git a/src/views/equipmentManagement/inspectionManagement/components/viewFiles.vue b/src/views/equipmentManagement/inspectionManagement/components/viewFiles.vue
index 66867e3..b5604fe 100644
--- a/src/views/equipmentManagement/inspectionManagement/components/viewFiles.vue
+++ b/src/views/equipmentManagement/inspectionManagement/components/viewFiles.vue
@@ -1,210 +1,226 @@
 <template>
   <div>
-    <el-dialog title="鏌ョ湅闄勪欢"
-               v-model="dialogVisitable" width="800px" @close="cancel">
+    <el-dialog title="鏌ョ湅闄勪欢" v-model="dialogVisitable" width="800px" @close="cancel">
       <div class="upload-container">
-        <!-- 鐢熶骇鍓� -->
         <div class="form-container">
           <div class="title">鐢熶骇鍓�</div>
-          
-          <!-- 鍥剧墖鍒楄〃 -->
-          <div style="display: flex; flex-wrap: wrap;">
-            <img v-for="(item, index) in beforeProductionImgs" :key="index"
-                 @click="showMedia(beforeProductionImgs, index, 'image')"
-                 :src="item" style="max-width: 100px; height: 100px; margin: 5px;" alt="">
+
+          <div class="media-list">
+            <img
+              v-for="(item, index) in beforeProductionImgs"
+              :key="`before-img-${index}`"
+              :src="item"
+              alt=""
+              class="media-image"
+              @click="showMedia(beforeProductionImgs, index, 'image')"
+            />
           </div>
-          
-          <!-- 瑙嗛鍒楄〃 -->
-          <div style="display: flex; flex-wrap: wrap;">
+
+          <div class="media-list">
             <div
-                v-for="(videoUrl, index) in beforeProductionVideos"
-                :key="index"
-                @click="showMedia(beforeProductionVideos, index, 'video')"
-                style="position: relative; margin: 10px; cursor: pointer;"
+              v-for="(videoUrl, index) in beforeProductionVideos"
+              :key="`before-video-${index}`"
+              class="video-item"
+              @click="showMedia(beforeProductionVideos, index, 'video')"
             >
-              <div style="width: 160px; height: 90px; background-color: #333; display: flex; align-items: center; justify-content: center;">
-                <img src="@/assets/images/video.png" alt="鎾斁" style="width: 30px; height: 30px; opacity: 0.8;" />
+              <div class="video-thumb">
+                <img src="@/assets/images/video.png" alt="鎾斁" class="video-icon" />
               </div>
-              <div style="text-align: center; font-size: 12px; color: #666;">鐐瑰嚮鎾斁</div>
+              <div class="video-text">鐐瑰嚮鎾斁</div>
             </div>
           </div>
         </div>
-        
-        <!-- 鐢熶骇鍚� -->
+
+        <div class="form-container">
+          <div class="title">鐢熶骇涓�</div>
+
+          <div class="media-list">
+            <img
+              v-for="(item, index) in afterProductionImgs"
+              :key="`during-img-${index}`"
+              :src="item"
+              alt=""
+              class="media-image"
+              @click="showMedia(afterProductionImgs, index, 'image')"
+            />
+          </div>
+
+          <div class="media-list">
+            <div
+              v-for="(videoUrl, index) in afterProductionVideos"
+              :key="`during-video-${index}`"
+              class="video-item"
+              @click="showMedia(afterProductionVideos, index, 'video')"
+            >
+              <div class="video-thumb">
+                <img src="@/assets/images/video.png" alt="鎾斁" class="video-icon" />
+              </div>
+              <div class="video-text">鐐瑰嚮鎾斁</div>
+            </div>
+          </div>
+        </div>
+
         <div class="form-container">
           <div class="title">鐢熶骇鍚�</div>
-          
-          <!-- 鍥剧墖鍒楄〃 -->
-          <div style="display: flex; flex-wrap: wrap;">
-            <img v-for="(item, index) in afterProductionImgs" :key="index"
-                 @click="showMedia(afterProductionImgs, index, 'image')"
-                 :src="item" style="max-width: 100px; height: 100px; margin: 5px;" alt="">
+
+          <div class="media-list">
+            <img
+              v-for="(item, index) in productionIssuesImgs"
+              :key="`after-img-${index}`"
+              :src="item"
+              alt=""
+              class="media-image"
+              @click="showMedia(productionIssuesImgs, index, 'image')"
+            />
           </div>
-          
-          <!-- 瑙嗛鍒楄〃 -->
-          <div style="display: flex; flex-wrap: wrap;">
+
+          <div class="media-list">
             <div
-                v-for="(videoUrl, index) in afterProductionVideos"
-                :key="index"
-                @click="showMedia(afterProductionVideos, index, 'video')"
-                style="position: relative; margin: 10px; cursor: pointer;"
+              v-for="(videoUrl, index) in productionIssuesVideos"
+              :key="`after-video-${index}`"
+              class="video-item"
+              @click="showMedia(productionIssuesVideos, index, 'video')"
             >
-              <div style="width: 160px; height: 90px; background-color: #333; display: flex; align-items: center; justify-content: center;">
-                <img src="@/assets/images/video.png" alt="鎾斁" style="width: 30px; height: 30px; opacity: 0.8;" />
+              <div class="video-thumb">
+                <img src="@/assets/images/video.png" alt="鎾斁" class="video-icon" />
               </div>
-              <div style="text-align: center; font-size: 12px; color: #666;">鐐瑰嚮鎾斁</div>
-            </div>
-          </div>
-        </div>
-        
-        <!-- 鐢熶骇闂 -->
-        <div class="form-container">
-          <div class="title">鐢熶骇闂</div>
-          
-          <!-- 鍥剧墖鍒楄〃 -->
-          <div style="display: flex; flex-wrap: wrap;">
-            <img v-for="(item, index) in productionIssuesImgs" :key="index"
-                 @click="showMedia(productionIssuesImgs, index, 'image')"
-                 :src="item" style="max-width: 100px; height: 100px; margin: 5px;" alt="">
-          </div>
-          
-          <!-- 瑙嗛鍒楄〃 -->
-          <div style="display: flex; flex-wrap: wrap;">
-            <div
-                v-for="(videoUrl, index) in productionIssuesVideos"
-                :key="index"
-                @click="showMedia(productionIssuesVideos, index, 'video')"
-                style="position: relative; margin: 10px; cursor: pointer;"
-            >
-              <div style="width: 160px; height: 90px; background-color: #333; display: flex; align-items: center; justify-content: center;">
-                <img src="@/assets/images/video.png" alt="鎾斁" style="width: 30px; height: 30px; opacity: 0.8;" />
-              </div>
-              <div style="text-align: center; font-size: 12px; color: #666;">鐐瑰嚮鎾斁</div>
+              <div class="video-text">鐐瑰嚮鎾斁</div>
             </div>
           </div>
         </div>
       </div>
     </el-dialog>
-    
-    <!-- 缁熶竴濯掍綋鏌ョ湅鍣� -->
+
     <div v-if="isMediaViewerVisible" class="media-viewer-overlay" @click.self="closeMediaViewer">
       <div class="media-viewer-content" @click.stop>
-        <!-- 鍥剧墖 -->
         <vue-easy-lightbox
-            v-if="mediaType === 'image'"
-            :visible="isMediaViewerVisible"
-            :imgs="mediaList"
-            :index="currentMediaIndex"
-            @hide="closeMediaViewer"
-        ></vue-easy-lightbox>
-        
-        <!-- 瑙嗛 -->
-        <div v-else-if="mediaType === 'video'" style="position: relative;">
-          <video
-              :src="mediaList[currentMediaIndex]"
-              autoplay
-              controls
-              style="max-width: 90vw; max-height: 80vh;"
-          />
+          v-if="mediaType === 'image'"
+          :visible="isMediaViewerVisible"
+          :imgs="mediaList"
+          :index="currentMediaIndex"
+          @hide="closeMediaViewer"
+        />
+
+        <div v-else-if="mediaType === 'video'" class="video-player-wrap">
+          <video :src="mediaList[currentMediaIndex]" autoplay controls class="video-player" />
         </div>
       </div>
     </div>
   </div>
 </template>
-<script setup>
-import { ref } from 'vue';
-import VueEasyLightbox from 'vue-easy-lightbox';
-const { proxy } = getCurrentInstance();
 
-// 鎺у埗寮圭獥鏄剧ず
+<script setup>
+import { ref } from "vue";
+import VueEasyLightbox from "vue-easy-lightbox";
+
 const dialogVisitable = ref(false);
 
-// 鍥剧墖鏁扮粍
 const beforeProductionImgs = ref([]);
 const afterProductionImgs = ref([]);
 const productionIssuesImgs = ref([]);
 
-// 瑙嗛鏁扮粍
 const beforeProductionVideos = ref([]);
 const afterProductionVideos = ref([]);
 const productionIssuesVideos = ref([]);
 
-// 濯掍綋鏌ョ湅鍣ㄧ姸鎬�
 const isMediaViewerVisible = ref(false);
 const currentMediaIndex = ref(0);
-const mediaList = ref([]); // 瀛樺偍褰撳墠瑕佹煡鐪嬬殑濯掍綋鍒楄〃锛堝惈鍥剧墖鍜岃棰戝璞★級
-const mediaType = ref('image'); // image | video
+const mediaList = ref([]);
+const mediaType = ref("image");
 
-// 澶勭悊姣忎竴绫绘暟鎹細鍒嗙鍥剧墖鍜岃棰�
-function processItems(items) {
+const processFileUrl = fileUrl => {
+  if (!fileUrl) return "";
+
+  let currentUrl = String(fileUrl);
+  if (currentUrl.includes("\\")) {
+    const uploadsIndex = currentUrl.toLowerCase().indexOf("uploads");
+    if (uploadsIndex > -1) {
+      currentUrl = `/${currentUrl.substring(uploadsIndex).replace(/\\/g, "/")}`;
+    } else {
+      const fileName = currentUrl.split("\\").pop();
+      currentUrl = `/uploads/${fileName}`;
+    }
+  }
+
+  if (currentUrl && !currentUrl.startsWith("http")) {
+    if (!currentUrl.startsWith("/")) {
+      currentUrl = `/${currentUrl}`;
+    }
+    currentUrl = __BASE_API__ + currentUrl;
+  }
+
+  return currentUrl;
+};
+
+const processItems = items => {
   const images = [];
   const videos = [];
-  
-  // 妫�鏌� items 鏄惁瀛樺湪涓斾负鏁扮粍
-  if (!items || !Array.isArray(items)) {
+
+  if (!Array.isArray(items)) {
     return { images, videos };
   }
-  
+
   items.forEach(item => {
-    if (!item || !item.previewURL || !item.contentType) return;
+    if (!item) return;
 
-    
-    // 澶勭悊鏂囦欢 URL
-    const fileUrl = item.previewURL;
-    const contentType = String(item.contentType).toLowerCase();
+    const fileUrl = processFileUrl(
+      item.previewURL || item.url || item.downloadUrl || item.path || ""
+    );
+    const contentType = String(item.contentType || "").toLowerCase();
 
-    // 鏍规嵁 contentType 鍒ゆ柇鏄浘鐗囪繕鏄棰�
-    if (contentType.startsWith('image/')) {
-      images.push(fileUrl);
-    } else if (contentType.startsWith('video/')) {
+    if (!fileUrl) return;
+
+    if (contentType.startsWith("video/")) {
       videos.push(fileUrl);
+      return;
     }
-  });
-  
-  return { images, videos };
-}
 
-// 鎵撳紑寮圭獥骞跺姞杞芥暟鎹�
-const openDialog = async (row) => {
-  // 浣跨敤姝g‘鐨勫瓧娈靛悕锛歝ommonFileListBefore, commonFileListAfter
-  const { images: beforeImgs, videos: beforeVids } = processItems(row.commonFileListBeforeVO || []);
-  const { images: afterImgs, videos: afterVids } = processItems(row.commonFileListAfterVO || []);
-  const { images: issueImgs, videos: issueVids } = processItems(row.commonFileListVO || []);
-  
+    images.push(fileUrl);
+  });
+
+  return { images, videos };
+};
+
+const openDialog = row => {
+  const { images: beforeImgs, videos: beforeVids } = processItems(
+    row.commonFileListBeforeVO || []
+  );
+  const { images: afterImgs, videos: afterVids } = processItems(
+    row.commonFileListVO || []
+  );
+  const { images: issueImgs, videos: issueVids } = processItems(
+    row.commonFileListAfterVO || []
+  );
+
   beforeProductionImgs.value = beforeImgs;
   beforeProductionVideos.value = beforeVids;
-  
   afterProductionImgs.value = afterImgs;
   afterProductionVideos.value = afterVids;
-  
   productionIssuesImgs.value = issueImgs;
   productionIssuesVideos.value = issueVids;
-  
   dialogVisitable.value = true;
 };
 
-// 鏄剧ず濯掍綋锛堝浘鐗� or 瑙嗛锛�
-function showMedia(mediaArray, index, type) {
-  mediaList.value = mediaArray;
+const showMedia = (items, index, type) => {
+  mediaList.value = items;
   currentMediaIndex.value = index;
   mediaType.value = type;
   isMediaViewerVisible.value = true;
-}
+};
 
-// 鍏抽棴濯掍綋鏌ョ湅鍣�
-function closeMediaViewer() {
+const closeMediaViewer = () => {
   isMediaViewerVisible.value = false;
   mediaList.value = [];
-  mediaType.value = 'image';
-}
+  mediaType.value = "image";
+};
 
-// 琛ㄥ崟鍏抽棴鏂规硶
 const cancel = () => {
   dialogVisitable.value = false;
 };
 
 defineExpose({ openDialog });
 </script>
+
 <style scoped lang="scss">
 .upload-container {
   display: flex;
@@ -213,7 +229,7 @@
   padding: 20px;
   border: 1px solid #dcdfe6;
   box-sizing: border-box;
-  
+
   .form-container {
     flex: 1;
     width: 100%;
@@ -229,7 +245,7 @@
   padding-left: 10px;
   position: relative;
   margin: 6px 0;
-  
+
   &::before {
     content: "";
     position: absolute;
@@ -241,12 +257,48 @@
   }
 }
 
+.media-list {
+  display: flex;
+  flex-wrap: wrap;
+}
+
+.media-image {
+  max-width: 100px;
+  height: 100px;
+  margin: 5px;
+  cursor: pointer;
+}
+
+.video-item {
+  position: relative;
+  margin: 10px;
+  cursor: pointer;
+}
+
+.video-thumb {
+  width: 160px;
+  height: 90px;
+  background-color: #333;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+
+.video-icon {
+  width: 30px;
+  height: 30px;
+  opacity: 0.8;
+}
+
+.video-text {
+  text-align: center;
+  font-size: 12px;
+  color: #666;
+}
+
 .media-viewer-overlay {
   position: fixed;
-  top: 0;
-  left: 0;
-  right: 0;
-  bottom: 0;
+  inset: 0;
   background-color: rgba(0, 0, 0, 0.8);
   z-index: 9999;
   display: flex;
@@ -260,4 +312,13 @@
   max-height: 90vh;
   overflow: hidden;
 }
-</style>
\ No newline at end of file
+
+.video-player-wrap {
+  position: relative;
+}
+
+.video-player {
+  max-width: 90vw;
+  max-height: 80vh;
+}
+</style>
diff --git a/src/views/equipmentManagement/inspectionManagement/index.vue b/src/views/equipmentManagement/inspectionManagement/index.vue
index 44103ac..8c0d52c 100644
--- a/src/views/equipmentManagement/inspectionManagement/index.vue
+++ b/src/views/equipmentManagement/inspectionManagement/index.vue
@@ -52,7 +52,8 @@
                   total: total,
                   layout: 'total, sizes, prev, pager, next, jumper'
                 }"
-                  :table-style="{ width: '100%', height: 'calc(100vh - 23em)' }">
+                  height="calc(100vh - 23em)"
+                  :table-style="{ width: '100%' }">
           <template #inspector="{ row }">
             <div class="person-tags">
               <!-- 璋冭瘯淇℃伅锛屼笂绾挎椂鍒犻櫎 -->
@@ -71,7 +72,8 @@
             </div>
           </template>
           <template #isEnabled="{ row }">
-            <el-tag :type="row.isEnabled === 1 ? 'success' : 'danger'" size="small">
+            <el-tag :type="row.isEnabled === 1 ? 'success' : 'danger'"
+                    size="small">
               {{ row.isEnabled == 1 ? '鏄�' : '鍚�' }}
             </el-tag>
           </template>
@@ -81,6 +83,9 @@
     <form-dia ref="formDia"
               @closeDia="handleQuery"></form-dia>
     <view-files ref="viewFiles"></view-files>
+    <upload-files ref="uploadFiles"
+                  @success="handleQuery"
+                  @closeDia="handleQuery"></upload-files>
   </div>
 </template>
 
@@ -88,10 +93,12 @@
   import { Delete, Plus } from "@element-plus/icons-vue";
   import { onMounted, ref, reactive, getCurrentInstance, nextTick } from "vue";
   import { ElMessageBox } from "element-plus";
+  import dayjs from "dayjs";
 
   // 缁勪欢寮曞叆
   import PIMTable from "@/components/PIMTable/PIMTable.vue";
   import FormDia from "@/views/equipmentManagement/inspectionManagement/components/formDia.vue";
+  import UploadFiles from "@/views/equipmentManagement/inspectionManagement/components/uploadFiles.vue";
   import ViewFiles from "@/views/equipmentManagement/inspectionManagement/components/viewFiles.vue";
 
   // 鎺ュ彛寮曞叆
@@ -105,6 +112,7 @@
   const { proxy } = getCurrentInstance();
   const formDia = ref();
   const viewFiles = ref();
+  const uploadFiles = ref();
 
   // 鏌ヨ鍙傛暟
   const queryParams = reactive({
@@ -114,8 +122,8 @@
   // 鍗曢�夋閰嶇疆
   const activeRadio = ref("taskManage");
   const radios = reactive([
-    { name: "taskManage", label: "瀹氭椂浠诲姟绠$悊" },
-    { name: "task", label: "瀹氭椂浠诲姟璁板綍" },
+    { name: "taskManage", label: "宸℃浠诲姟" },
+    { name: "task", label: "宸℃璁板綍" },
   ]);
 
   // 琛ㄦ牸鏁版嵁
@@ -130,27 +138,21 @@
 
   // 鍒楅厤缃�
   const columns = ref([
-    { prop: "taskName", label: "宸℃浠诲姟鍚嶇О", minWidth: 160 },
-    { prop: "inspectionProject", label: "宸℃椤圭洰", minWidth: 150 },
-    { prop: "remarks", label: "澶囨敞", minWidth: 150 },
-    { prop: "inspector", label: "鎵ц宸℃浜�", minWidth: 150, slot: "inspector" },
+    { prop: "taskName", label: "宸℃浠诲姟鍚嶇О", minWidth: 200 },
+    { prop: "inspectionProject", label: "宸℃椤圭洰", minWidth: 180 },
+    { prop: "remarks", label: "澶囨敞", minWidth: 180 },
+    { prop: "inspector", label: "鎵ц宸℃浜�", minWidth: 180, slot: "inspector" },
     {
       prop: "isEnabled",
       label: "鏄惁鍚敤",
       minWidth: 100,
       dataType: "slot",
-      slot: "isEnabled"
+      slot: "isEnabled",
     },
     {
       prop: "frequencyType",
       label: "棰戞",
-      minWidth: 150,
-      // formatter: (_, __, val) => ({
-      //   DAILY: "姣忔棩",
-      //   WEEKLY: "姣忓懆",
-      //   MONTHLY: "姣忔湀",
-      //   QUARTERLY: "瀛e害"
-      // }[val] || "")
+      minWidth: 120,
       formatData: params => {
         return params === "DAILY"
           ? "姣忔棩"
@@ -166,7 +168,7 @@
     {
       prop: "frequencyDetail",
       label: "寮�濮嬫棩鏈熶笌鏃堕棿",
-      minWidth: 150,
+      minWidth: 200,
       formatter: (row, column, cellValue) => {
         // 鍏堝垽鏂槸鍚︽槸瀛楃涓�
         if (typeof cellValue !== "string") return "";
@@ -187,8 +189,33 @@
         );
       },
     },
-    { prop: "registrant", label: "鐧昏浜�", minWidth: 100 },
-    { prop: "createTime", label: "鐧昏鏃ユ湡", minWidth: 100 },
+    { prop: "registrant", label: "鐧昏浜�", minWidth: 120 },
+    {
+      prop: "createTime",
+      label: "鐧昏鏃ユ湡",
+      minWidth: 180,
+      formatData: cell => {
+        if (!cell) return "-";
+        try {
+          return dayjs(cell).format("YYYY-MM-DD HH:mm:ss");
+        } catch {
+          return cell;
+        }
+      },
+    },
+    // {
+    //   prop: "inspectionResult",
+    //   label: "宸℃缁撴灉",
+    //   minWidth: 100,
+    //   dataType: "tag",
+    //   formatData: val => {
+    //     return val == 1 ? "姝e父" : "寮傚父";
+    //   },
+    //   formatType: val => {
+    //     return val == 1 ? "success" : "danger";
+    //   },
+    // },
+    { prop: "abnormalDescription", label: "寮傚父鎻忚堪", minWidth: 150 },
   ]);
 
   // 鎿嶄綔鍒楅厤缃�
@@ -197,8 +224,9 @@
 
     const operationConfig = {
       label: "鎿嶄綔",
-      width: 130,
+      width: operations.length > 1 ? 180 : 130,
       fixed: "right",
+      align: "center",
       dataType: "action",
       operation: operations
         .map(op => {
@@ -207,6 +235,12 @@
               return {
                 name: "缂栬緫",
                 clickFun: handleAdd,
+                color: "#409EFF",
+              };
+            case "upload":
+              return {
+                name: "涓婁紶",
+                clickFun: openUploadDialog,
                 color: "#409EFF",
               };
             case "viewFile":
@@ -239,14 +273,14 @@
       ];
       operationsArr.value = ["edit"];
     } else if (value === "task") {
-      const operationColumn = getOperationColumn(["viewFile"]);
-      // 瀹氭椂浠诲姟璁板綍涓嶅睍绀�"鏄惁鍚敤"鍒�
+      const operationColumn = getOperationColumn(["upload", "viewFile"]);
+      // 宸℃璁板綍涓嶅睍绀�"鏄惁鍚敤"鍒�
       const taskColumns = columns.value.filter(col => col.prop !== "isEnabled");
       tableColumns.value = [
         ...taskColumns,
         ...(operationColumn ? [operationColumn] : []),
       ];
-      operationsArr.value = ["viewFile"];
+      operationsArr.value = ["upload", "viewFile"];
     }
     pageNum.value = 1;
     pageSize.value = 10;
@@ -288,6 +322,7 @@
         // 澶勭悊 inspector 瀛楁锛屽皢瀛楃涓茶浆鎹负鏁扮粍锛堥�傜敤浜庢墍鏈夋儏鍐碉級
         tableData.value = rawData.map(item => {
           const processedItem = { ...item };
+          processedItem.__raw = { ...item };
 
           // 澶勭悊 inspector 瀛楁
           if (processedItem.inspector) {
@@ -340,6 +375,12 @@
     });
   };
 
+  const openUploadDialog = row => {
+    nextTick(() => {
+      uploadFiles.value?.openDialog(row);
+    });
+  };
+
   // 鍒犻櫎鎿嶄綔
   const handleDelete = () => {
     if (!selectedRows.value.length) {
@@ -376,11 +417,11 @@
       .then(() => {
         // 鏍规嵁褰撳墠閫変腑鐨勬爣绛鹃〉璋冪敤涓嶅悓鐨勫鍑烘帴鍙�
         if (activeRadio.value === "taskManage") {
-          // 瀹氭椂浠诲姟绠$悊
-          proxy.download("/timingTask/export", {}, "瀹氭椂浠诲姟绠$悊.xlsx");
+          // 宸℃浠诲姟
+          proxy.download("/timingTask/export", {}, "宸℃浠诲姟.xlsx");
         } else if (activeRadio.value === "task") {
-          // 瀹氭椂浠诲姟璁板綍
-          proxy.download("/inspectionTask/export", {}, "瀹氭椂浠诲姟璁板綍.xlsx");
+          // 宸℃璁板綍
+          proxy.download("/inspectionTask/export", {}, "宸℃璁板綍.xlsx");
         }
       })
       .catch(() => {
@@ -405,4 +446,4 @@
     color: #909399;
     font-size: 14px;
   }
-</style>
\ No newline at end of file
+</style>
diff --git a/src/views/equipmentManagement/ledger/Form.vue b/src/views/equipmentManagement/ledger/Form.vue
index 45ca248..f1d21f2 100644
--- a/src/views/equipmentManagement/ledger/Form.vue
+++ b/src/views/equipmentManagement/ledger/Form.vue
@@ -156,6 +156,16 @@
 					/>
 				</el-form-item>
 			</el-col>
+      <el-col :span="24">
+        <el-form-item label="璁惧鍥剧墖" prop="storageBlobDTOs">
+          <AttachmentUploadImage
+            v-model:fileList="fileList"
+            :limit="20"
+            :fileSize="5"
+            :buttonText="'涓婁紶鍥剧墖'"
+          />
+        </el-form-item>
+      </el-col>
     </el-row>
   </el-form>
 </template>
@@ -170,7 +180,8 @@
   calculateTaxExclusiveTotalPrice,
 } from "@/utils/summarizeTable";
 import { ElMessage } from "element-plus";
-import {ref, getCurrentInstance} from "vue";
+import { ref, getCurrentInstance, computed } from "vue";
+import AttachmentUploadImage from '@/components/AttachmentUpload/image/index.vue';
 
 const { proxy } = getCurrentInstance();
 const { tax_rate } = proxy.useDict("tax_rate");
@@ -230,6 +241,18 @@
   // createUser: useUserStore().nickName, // 褰曞叆浜�
   createTime: dayjs().format("YYYY-MM-DD HH:mm:ss"), // 褰曞叆鏃ユ湡
 	planRuntimeTime: dayjs().format("YYYY-MM-DD"), // 褰曞叆鏃ユ湡
+  storageBlobDTOs: undefined, // 璁惧鍥剧墖鎻愪氦
+  storageBlobVOs: undefined, // 璁惧鍥剧墖灞曠ず
+});
+
+const fileList = computed({
+  get() {
+    return form.storageBlobVOs || [];
+  },
+  set(val) {
+    form.storageBlobDTOs = val;
+    form.storageBlobVOs = val;
+  }
 });
 
 const loadForm = async (id) => {
@@ -259,6 +282,8 @@
     } else {
       form.planRuntimeTime = undefined;
     }
+    form.storageBlobVOs = data.storageBlobVOs;
+    form.storageBlobDTOs = data.storageBlobVOs;
   }
 };
 
diff --git a/src/views/equipmentManagement/ledger/index.vue b/src/views/equipmentManagement/ledger/index.vue
index 93b9e6d..af10532 100644
--- a/src/views/equipmentManagement/ledger/index.vue
+++ b/src/views/equipmentManagement/ledger/index.vue
@@ -109,13 +109,52 @@
         </div>
       </template>
     </el-dialog>
+
+    <!-- 璇︽儏瀵硅瘽妗� -->
+    <el-dialog v-model="detailDialogVisible" title="璁惧鍙拌处璇︽儏" width="60%" draggable>
+      <el-descriptions :column="2" border>
+        <el-descriptions-item label="璁惧鍚嶇О">{{ detailData.deviceName }}</el-descriptions-item>
+        <el-descriptions-item label="瑙勬牸鍨嬪彿">{{ detailData.deviceModel }}</el-descriptions-item>
+        <el-descriptions-item label="璁惧鍝佺墝">{{ detailData.deviceBrand }}</el-descriptions-item>
+        <el-descriptions-item label="璁惧绫诲瀷">{{ detailData.type }}</el-descriptions-item>
+        <el-descriptions-item label="渚涘簲鍟�">{{ detailData.supplierName }}</el-descriptions-item>
+        <el-descriptions-item label="瀛樻斁浣嶇疆">{{ detailData.storageLocation }}</el-descriptions-item>
+        <el-descriptions-item label="鍗曚綅">{{ detailData.unit }}</el-descriptions-item>
+        <el-descriptions-item label="鏁伴噺">{{ detailData.number }}</el-descriptions-item>
+        <el-descriptions-item label="鍚敤鎶樻棫">{{ detailData.isDepr === 1 ? '鏄�' : '鍚�' }}</el-descriptions-item>
+        <el-descriptions-item label="姣忓勾鎶樻棫閲戦">{{ detailData.annualDepreciationAmount }}</el-descriptions-item>
+        <el-descriptions-item label="鍚◣鍗曚环">{{ detailData.taxIncludingPriceUnit }}</el-descriptions-item>
+        <el-descriptions-item label="鍚◣鎬讳环">{{ detailData.taxIncludingPriceTotal }}</el-descriptions-item>
+        <el-descriptions-item label="绋庣巼(%)">{{ detailData.taxRate }}</el-descriptions-item>
+        <el-descriptions-item label="涓嶅惈绋庢�讳环">{{ detailData.unTaxIncludingPriceTotal }}</el-descriptions-item>
+        <el-descriptions-item label="褰曞叆鏃ユ湡">{{ detailData.createTime }}</el-descriptions-item>
+        <el-descriptions-item label="棰勮杩愯鏃堕棿">{{ detailData.planRuntimeTime ? dayjs(detailData.planRuntimeTime).format('YYYY-MM-DD') : '' }}</el-descriptions-item>
+        <el-descriptions-item label="璁惧鍥剧墖" :span="2">
+          <div v-if="detailData.storageBlobVOs && detailData.storageBlobVOs.length > 0" style="display: flex; gap: 10px; flex-wrap: wrap;">
+            <el-image 
+              v-for="(file, index) in detailData.storageBlobVOs" 
+              :key="index" 
+              :src="file.previewURL || file.url" 
+              :preview-src-list="detailData.storageBlobVOs.map(u => u.previewURL || u.url)"
+              :initial-index="index"
+              style="width: 100px; height: 100px" 
+              fit="cover" 
+            />
+          </div>
+          <span v-else>鏃犲浘鐗�</span>
+        </el-descriptions-item>
+      </el-descriptions>
+      <template #footer>
+        <el-button @click="detailDialogVisible = false">鍏抽棴</el-button>
+      </template>
+    </el-dialog>
   </div>
 </template>
 
 <script setup>
 import { usePaginationApi } from "@/hooks/usePaginationApi";
 // import { Search } from "@element-plus/icons-vue";
-import { getLedgerPage, delLedger } from "@/api/equipmentManagement/ledger";
+import { getLedgerPage, delLedger, getLedgerById } from "@/api/equipmentManagement/ledger";
 import { onMounted, getCurrentInstance, ref, reactive } from "vue";
 import Modal from "./Modal.vue";
 import { ElMessageBox, ElMessage } from "element-plus";
@@ -135,6 +174,9 @@
 const qrDialogVisible = ref(false);
 const qrCodeUrl = ref("");
 const qrRowData = ref(null);
+
+const detailDialogVisible = ref(false);
+const detailData = ref({});
 
 // 瀵煎叆鐩稿叧
 const uploadRef = ref(null)
@@ -218,8 +260,14 @@
 			label: "鎿嶄綔",
 			align: "center",
 			fixed: 'right',
-			width: 150,
+			width: 180,
 			operation: [
+        {
+          name: "璇︽儏",
+          clickFun: (row) => {
+            handleDetail(row);
+          },
+        },
 				{
 					name: "缂栬緫",
 					clickFun: (row) => {
@@ -227,7 +275,7 @@
 					},
 				},
 				{
-					name: "鐢熸垚浜岀淮鐮�",
+					name: "浜岀淮鐮�",
 					clickFun: (row) => {
 						showQRCode(row)
 					},
@@ -248,6 +296,13 @@
 const edit = (id) => {
   modalRef.value.loadForm(id);
 };
+const handleDetail = async (row) => {
+  const { code, data } = await getLedgerById(row.id);
+  if (code == 200) {
+    detailData.value = data;
+    detailDialogVisible.value = true;
+  }
+};
 const changePage = ({ page, limit }) => {
   pagination.currentPage = page;
 	pagination.pageSize = limit;
diff --git a/src/views/equipmentManagement/measurementEquipment/filesDia.vue b/src/views/equipmentManagement/measurementEquipment/filesDia.vue
index 16c026e..045ebc0 100644
--- a/src/views/equipmentManagement/measurementEquipment/filesDia.vue
+++ b/src/views/equipmentManagement/measurementEquipment/filesDia.vue
@@ -1,38 +1,16 @@
 <template>
   <div>
-    <el-dialog
-        v-model="dialogFormVisible"
-        title="涓婁紶闄勪欢"
-        width="50%"
-        @close="closeDia"
-    >
+    <el-dialog v-model="dialogFormVisible" title="涓婁紶闄勪欢" width="50%" @close="closeDia">
       <div style="margin-bottom: 10px;text-align: right">
-        <el-upload
-            v-model:file-list="fileList"
-            class="upload-demo"
-            :action="uploadUrl"
-            :on-success="handleUploadSuccess"
-            :on-error="handleUploadError"
-            name="file"
-            :show-file-list="false"
-            :headers="headers"
-            style="display: inline;margin-right: 10px"
-        >
+        <el-upload v-model:file-list="fileList" class="upload-demo" :action="uploadUrl"
+          :on-success="handleUploadSuccess" :on-error="handleUploadError" name="files" :show-file-list="false"
+          :headers="headers" style="display: inline;margin-right: 10px">
           <el-button type="primary">涓婁紶闄勪欢</el-button>
         </el-upload>
         <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
       </div>
-      <PIMTable
-          rowKey="id"
-          :column="tableColumn"
-          :tableData="tableData"
-          :page="page"
-          :tableLoading="tableLoading"
-          :isSelection="true"
-          @selection-change="handleSelectionChange"
-          @pagination="paginationSearch"
-          height="500"
-      >
+      <PIMTable rowKey="id" :column="tableColumn" :tableData="tableData" :page="page" :tableLoading="tableLoading"
+        :isSelection="true" @selection-change="handleSelectionChange" @pagination="paginationSearch" height="500">
       </PIMTable>
       <template #footer>
         <div class="dialog-footer">
@@ -45,16 +23,16 @@
 </template>
 
 <script setup>
-import {ref, reactive, getCurrentInstance} from "vue";
-import {ElMessageBox} from "element-plus";
-import {getToken} from "@/utils/auth.js";
+import { ref, reactive, getCurrentInstance } from "vue";
+import { ElMessageBox } from "element-plus";
+import { getToken } from "@/utils/auth.js";
 import filePreview from '@/components/filePreview/index.vue'
 import PIMTable from "@/components/PIMTable/PIMTable.vue";
 import {
-  fileAdd,
-  fileDel,
-  fileListPage
-} from "@/api/financialManagement/revenueManagement.js";
+  addStorageAttachment,
+  delStorageAttachment,
+  getStorageAttachmentList
+} from "@/api/equipmentManagement/measurementEquipment.js";
 const { proxy } = getCurrentInstance()
 const emit = defineEmits(['close'])
 
@@ -90,9 +68,9 @@
   },
 ]);
 const page = reactive({
-	current: 1,
-	size: 100,
-	total: 0,
+  current: 1,
+  size: 100,
+  total: 0,
 });
 const tableData = ref([]);
 const fileList = ref([]);
@@ -101,24 +79,25 @@
 const headers = ref({
   Authorization: "Bearer " + getToken(),
 });
-const uploadUrl = ref(import.meta.env.VITE_APP_BASE_API + "/file/upload"); // 涓婁紶鐨勫浘鐗囨湇鍔″櫒鍦板潃
+const uploadUrl = ref(import.meta.env.VITE_APP_BASE_API + "/common/upload"); // 涓婁紶鐨勬湇鍔″櫒鍦板潃
 
 // 鎵撳紑寮规
-const openDialog = (row,type) => {
+const openDialog = (row, type) => {
   accountType.value = type;
   dialogFormVisible.value = true;
   currentId.value = row.id;
   getList()
 }
 const paginationSearch = (obj) => {
-	page.current = obj.page;
-	page.size = obj.limit;
-	getList();
+  page.current = obj.page;
+  page.size = obj.limit;
+  // 鍓嶇鍒嗛〉鏆備笉澶勭悊锛岀洿鎺ヨ皟鐢ㄨ幏鍙栧叏閲忓垪琛�
+  getList();
 };
 const getList = () => {
-  fileListPage({accountId: currentId.value,accountType:accountType.value, ...page}).then(res => {
-    tableData.value = res.data.records;
-		page.total = res.data.total;
+  getStorageAttachmentList({ recordId: currentId.value, recordType: accountType.value }).then(res => {
+    tableData.value = res.data;
+    page.total = res.data ? res.data.length : 0;
   })
 }
 // 琛ㄦ牸閫夋嫨鏁版嵁
@@ -134,22 +113,25 @@
 // 涓婁紶鎴愬姛澶勭悊
 function handleUploadSuccess(res, file) {
   // 濡傛灉涓婁紶鎴愬姛
-  if (res.code == 200) {
-    const fileRow = {}
-    fileRow.name = res.data.originalName
-    fileRow.url = res.data.tempPath
-    uploadFile(fileRow)
+  if (res.code == 200 && res.data && res.data.length > 0) {
+    const newFiles = res.data.map(item => ({
+      ...item,
+      name: item.originalFilename || item.name
+    }));
+    const mergedFiles = [...(tableData.value || []), ...newFiles];
+    const storageAttachmentDTO = {
+      recordType: accountType.value,
+      recordId: currentId.value,
+      application: "file",
+      storageBlobDTOs: mergedFiles
+    };
+    addStorageAttachment(storageAttachmentDTO).then(r => {
+      proxy.$modal.msgSuccess("鏂囦欢涓婁紶鎴愬姛");
+      getList()
+    })
   } else {
     proxy.$modal.msgError("鏂囦欢涓婁紶澶辫触");
   }
-}
-function uploadFile(file) {
-  file.accountId = currentId.value;
-  file.accountType = accountType.value;
-  fileAdd(file).then(res => {
-    proxy.$modal.msgSuccess("鏂囦欢涓婁紶鎴愬姛");
-    getList()
-  })
 }
 // 涓婁紶澶辫触澶勭悊
 function handleUploadError() {
@@ -157,13 +139,13 @@
 }
 // 涓嬭浇闄勪欢
 const downLoadFile = (row) => {
-	proxy.$download.byUrl(row.url, row.originalFilename);
+  proxy.$download.byUrl(row.url, row.originalFilename);
 }
 // 鍒犻櫎
 const handleDelete = () => {
   let ids = [];
   if (selectedRows.value.length > 0) {
-    ids = selectedRows.value.map((item) => item.id);
+    ids = selectedRows.value.map((item) => item.storageAttachmentId);
   } else {
     proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
     return;
@@ -173,7 +155,7 @@
     cancelButtonText: "鍙栨秷",
     type: "warning",
   }).then(() => {
-    fileDel(ids).then((res) => {
+    delStorageAttachment(ids).then((res) => {
       proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
       getList();
     });
@@ -191,6 +173,4 @@
 });
 </script>
 
-<style scoped>
-
-</style>
\ No newline at end of file
+<style scoped></style>
\ No newline at end of file
diff --git a/src/views/equipmentManagement/measurementEquipment/index.vue b/src/views/equipmentManagement/measurementEquipment/index.vue
index d2ec2d7..007eef6 100644
--- a/src/views/equipmentManagement/measurementEquipment/index.vue
+++ b/src/views/equipmentManagement/measurementEquipment/index.vue
@@ -1,320 +1,354 @@
 <template>
-	<div class="app-container">
-		<div class="search_form mb20">
-			<div>
-				<span class="search_title">褰曞叆鏃ユ湡锛�</span>
-				<el-date-picker
-					v-model="searchForm.recordDate"
-					value-format="YYYY-MM-DD"
-					format="YYYY-MM-DD"
-					type="date"
-					placeholder="璇烽�夋嫨"
-					clearable
-					style="width: 160px"
-					@change="handleQuery"
-				/>
-				<span class="search_title ml10">璁¢噺鍣ㄥ叿缂栧彿锛�</span>
-				<el-input v-model="searchForm.code" placeholder="璇疯緭鍏ョ紪鍙�" clearable style="width: 240px" @change="handleQuery"/>
-				<span class="search_title ml10">鐘舵�侊細</span>
-				<el-select v-model="searchForm.status" placeholder="璇烽�夋嫨鐘舵��" @change="handleQuery" style="width: 160px" clearable>
-					<el-option label="鏈夋晥" :value="1"></el-option>
-					<el-option label="閫炬湡" :value="2"></el-option>
-				</el-select>
-				<el-button type="primary" @click="handleQuery" style="margin-left: 10px"
-				>鎼滅储</el-button
-				>
-				<el-button @click="handleReset" style="margin-left: 10px">閲嶇疆</el-button>
-			</div>
-			<div>
-				<el-button type="primary" @click="openForm('add')">鏂板璁¢噺鍣ㄥ叿</el-button>
-				<el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
-				<el-button @click="handleOut">瀵煎嚭</el-button>
-			</div>
-		</div>
-		<div class="table_list">
-			<PIMTable
-				rowKey="id"
-				:column="tableColumn"
-				:tableData="tableData"
-				:page="page"
-				:isSelection="true"
-				@selection-change="handleSelectionChange"
-				:tableLoading="tableLoading"
-				@pagination="pagination"
-        :dbRowClick="dbRowClick"
-        :rowClassName="rowClassName"
-			></PIMTable>
-		</div>
-		<form-dia ref="formDia" @close="handleQuery"></form-dia>
-		<calibration-dia ref="calibrationDia" @close="handleQuery"></calibration-dia>
+  <div class="app-container">
+    <div class="search_form mb20">
+      <div>
+        <span class="search_title">褰曞叆鏃ユ湡锛�</span>
+        <el-date-picker v-model="searchForm.recordDate"
+                        value-format="YYYY-MM-DD"
+                        format="YYYY-MM-DD"
+                        type="date"
+                        placeholder="璇烽�夋嫨"
+                        clearable
+                        style="width: 160px"
+                        @change="handleQuery" />
+        <span class="search_title ml10">璁¢噺鍣ㄥ叿缂栧彿锛�</span>
+        <el-input v-model="searchForm.code"
+                  placeholder="璇疯緭鍏ョ紪鍙�"
+                  clearable
+                  style="width: 240px"
+                  @change="handleQuery" />
+        <span class="search_title ml10">鐘舵�侊細</span>
+        <el-select v-model="searchForm.status"
+                   placeholder="璇烽�夋嫨鐘舵��"
+                   @change="handleQuery"
+                   style="width: 160px"
+                   clearable>
+          <el-option label="鏈夋晥"
+                     :value="1"></el-option>
+          <el-option label="閫炬湡"
+                     :value="2"></el-option>
+        </el-select>
+        <el-button type="primary"
+                   @click="handleQuery"
+                   style="margin-left: 10px">鎼滅储</el-button>
+        <el-button @click="handleReset"
+                   style="margin-left: 10px">閲嶇疆</el-button>
+      </div>
+      <div>
+        <el-button type="primary"
+                   @click="openForm('add')">鏂板璁¢噺鍣ㄥ叿</el-button>
+        <el-button type="danger"
+                   plain
+                   @click="handleDelete">鍒犻櫎</el-button>
+        <el-button @click="handleOut">瀵煎嚭</el-button>
+      </div>
+    </div>
+    <div class="table_list">
+      <PIMTable rowKey="id"
+                :column="tableColumn"
+                :tableData="tableData"
+                :page="page"
+                :isSelection="true"
+                @selection-change="handleSelectionChange"
+                :tableLoading="tableLoading"
+                @pagination="pagination"
+                :dbRowClick="dbRowClick"
+                :rowClassName="rowClassName"></PIMTable>
+    </div>
+    <form-dia ref="formDia"
+              @close="handleQuery"></form-dia>
+    <calibration-dia ref="calibrationDia"
+                     @close="handleQuery"></calibration-dia>
     <files-dia ref="filesDia"></files-dia>
     <rowClickDataForm ref="rowClickData"></rowClickDataForm>
-	</div>
+  </div>
 </template>
 
 <script setup>
-import {onMounted, ref, reactive, toRefs, getCurrentInstance, nextTick} from "vue";
-import FormDia from "@/views/equipmentManagement/measurementEquipment/components/formDia.vue";
-import {ElMessageBox} from "element-plus";
-import useUserStore from "@/store/modules/user.js";
-import CalibrationDia from "@/views/equipmentManagement/measurementEquipment/components/calibrationDia.vue";
-import {
-  measuringInstrumentDelete,
-  measuringInstrumentListPage,
-} from "@/api/equipmentManagement/measurementEquipment.js";
-import FilesDia from "./filesDia.vue";
-import rowClickDataForm from "./components/rowClickData.vue"
-const { proxy } = getCurrentInstance();
-const userStore = useUserStore()
+  import {
+    onMounted,
+    ref,
+    reactive,
+    toRefs,
+    getCurrentInstance,
+    nextTick,
+  } from "vue";
+  import FormDia from "@/views/equipmentManagement/measurementEquipment/components/formDia.vue";
+  import { ElMessageBox } from "element-plus";
+  import useUserStore from "@/store/modules/user.js";
+  import CalibrationDia from "@/views/equipmentManagement/measurementEquipment/components/calibrationDia.vue";
+  import {
+    measuringInstrumentDelete,
+    measuringInstrumentListPage,
+  } from "@/api/equipmentManagement/measurementEquipment.js";
+  import FilesDia from "./filesDia.vue";
+  import rowClickDataForm from "./components/rowClickData.vue";
+  const { proxy } = getCurrentInstance();
+  const userStore = useUserStore();
 
-const data = reactive({
-	searchForm: {
-		recordDate: "",
-		code: "",
-		status: "",
-	},
-});
-const { searchForm } = toRefs(data);
+  const data = reactive({
+    searchForm: {
+      recordDate: "",
+      code: "",
+      status: "",
+    },
+  });
+  const { searchForm } = toRefs(data);
 
-const tableColumn = ref([
-	{
-		label: "鍑哄巶缂栧彿",
-		prop: "code",
-    minWidth:150,
-    align:"center"
-	},
-  {
-    label: "璁¢噺鍣ㄥ叿鍚嶇О",
-    prop: "name",
-    width: '160px',
-    align: "center",
-  },
-	{
-		label: "妫�瀹氬崟浣�",
-		prop: "unit",
-		width: 200,
-    align:"center"
-	},
-	{
-		label: "璇佷功缂栧彿",
-		prop: "model",
-		width:200,
-    align:"center"
-	},
-	{
-		label: "鏈�鏂伴壌瀹氭棩鏈�",
-		prop: "mostDate",
-		width: 130,
-    align:"center"
-	},
-	{
-		label: "褰曞叆浜�",
-		prop: "userName",
-		width: 130,
-    align:"center"
-	},
-	{
-		label: "褰曞叆鏃ユ湡",
-		prop: "recordDate",
-    align:"center",
-    minWidth: 130
-	},
-	{
-		label: "鏈夋晥鏃ユ湡",
-		prop: "valid",
-		width: 130,
-    align:"center"
-	},
-  {
-    label: "鐘舵��",
-    prop: "status",
-    width: 130,
-    align: "center",
-    formatData: (params) => {
-      if (params === 1) {
-        return "鏈夋晥";
-      } else if (params === 2) {
-        return "閫炬湡";
-      } else {
-        return null;
-      }
-    }
-  },
-	{
-		dataType: "action",
-		label: "鎿嶄綔",
-		align: "center",
-		width: '130',
-		fixed: 'right',
-		operation: [
-      {
-      	name: "闄勪欢",
-      	type: "text",
-      	clickFun: (row) => {
-          openFilesFormDia(row);
-      	},
+  const tableColumn = ref([
+    {
+      label: "鍑哄巶缂栧彿",
+      prop: "code",
+      minWidth: 150,
+      align: "center",
+    },
+    {
+      label: "璁¢噺鍣ㄥ叿鍚嶇О",
+      prop: "name",
+      width: "160px",
+      align: "center",
+    },
+    {
+      label: "妫�瀹氬崟浣�",
+      prop: "unit",
+      width: 200,
+      align: "center",
+    },
+    {
+      label: "璇佷功缂栧彿",
+      prop: "model",
+      width: 200,
+      align: "center",
+    },
+    {
+      label: "鏈�鏂伴壌瀹氭棩鏈�",
+      prop: "mostDate",
+      width: 130,
+      align: "center",
+    },
+    {
+      label: "褰曞叆浜�",
+      prop: "userName",
+      width: 130,
+      align: "center",
+    },
+    {
+      label: "褰曞叆鏃ユ湡",
+      prop: "recordDate",
+      align: "center",
+      minWidth: 130,
+    },
+    {
+      label: "鏈夋晥鏃ユ湡",
+      prop: "valid",
+      width: 130,
+      align: "center",
+    },
+    {
+      label: "鐘舵��",
+      prop: "status",
+      width: 130,
+      align: "center",
+      formatData: params => {
+        if (params === 1) {
+          return "鏈夋晥";
+        } else if (params === 2) {
+          return "閫炬湡";
+        } else {
+          return null;
+        }
       },
-			{
-				name: "鏌ョ湅",
-				type: "text",
-				clickFun: (row) => {
-					openCalibrationDia("verifying", row);
-				},
-			},
-		],
-	},
-]);
-const tableData = ref([]);
-const tableLoading = ref(false);
-const rowClickData = ref([])
-const filesDia = ref()
-const page = reactive({
-	current: 1,
-	size: 100,
-	total: 0,
-});
-const selectedRows = ref([]);
+    },
+    {
+      dataType: "action",
+      label: "鎿嶄綔",
+      align: "center",
+      width: "130",
+      fixed: "right",
+      operation: [
+        {
+          name: "闄勪欢",
+          type: "text",
+          clickFun: row => {
+            openFilesFormDia(row);
+          },
+        },
+        {
+          name: "缂栬緫",
+          type: "text",
+          clickFun: row => {
+            openCalibrationDia("verifying", row);
+          },
+        },
+      ],
+    },
+  ]);
+  const tableData = ref([]);
+  const tableLoading = ref(false);
+  const rowClickData = ref([]);
+  const filesDia = ref();
+  const page = reactive({
+    current: 1,
+    size: 100,
+    total: 0,
+  });
+  const selectedRows = ref([]);
 
-// 鎵撳紑闄勪欢寮规
-const openFilesFormDia = (row) => {
-    filesDia.value?.openDialog(row,'璁¢噺鍣ㄥ叿鍙拌处')
-};
+  // 鎵撳紑闄勪欢寮规
+  const openFilesFormDia = row => {
+    filesDia.value?.openDialog(row, "measuring_instrument_ledger");
+  };
 
-const dbRowClick = (row)=>{
-  rowClickData.value?.openDialog(row)
-}
+  const dbRowClick = row => {
+    rowClickData.value?.openDialog(row);
+  };
 
-// 琛屾牱寮忥細蹇埌鏈燂紙7澶╁唴锛夋垨閫炬湡鏍囩孩
-const rowClassName = ({ row }) => {
-  console.log('rowClassName called:', row);
-  // valid 鏄湁鏁堝ぉ鏁帮紝mostDate 鏄渶鏂版瀹氭棩鏈�
-  if (row.valid && row.mostDate) {
-    const mostDate = new Date(row.mostDate);
-    // 璁$畻鍒版湡鏃ユ湡 = 妫�瀹氭棩鏈� + 鏈夋晥澶╂暟
-    const validDays = parseInt(row.valid) || 0;
-    const expireDate = new Date(mostDate);
-    expireDate.setDate(expireDate.getDate() + validDays);
-    
-    const now = new Date();
-    const diffDays = Math.ceil((expireDate - now) / (1000 * 60 * 60 * 24));
-    console.log('row:', row.code, 'validDays:', validDays, 'expireDate:', expireDate, 'diffDays:', diffDays);
-    // 7澶╁唴鍒版湡鎴栧凡閫炬湡閮芥爣绾�
-    if (diffDays <= 7) {
-      console.log('return warning-row');
-      return 'warning-row';
+  // 琛屾牱寮忥細蹇埌鏈燂紙7澶╁唴锛夋垨閫炬湡鏍囩孩
+  const rowClassName = ({ row }) => {
+    console.log("rowClassName called:", row);
+    // valid 鏄湁鏁堝ぉ鏁帮紝mostDate 鏄渶鏂版瀹氭棩鏈�
+    if (row.valid && row.mostDate) {
+      const mostDate = new Date(row.mostDate);
+      // 璁$畻鍒版湡鏃ユ湡 = 妫�瀹氭棩鏈� + 鏈夋晥澶╂暟
+      const validDays = parseInt(row.valid) || 0;
+      const expireDate = new Date(mostDate);
+      expireDate.setDate(expireDate.getDate() + validDays);
+
+      const now = new Date();
+      const diffDays = Math.ceil((expireDate - now) / (1000 * 60 * 60 * 24));
+      console.log(
+        "row:",
+        row.code,
+        "validDays:",
+        validDays,
+        "expireDate:",
+        expireDate,
+        "diffDays:",
+        diffDays
+      );
+      // 7澶╁唴鍒版湡鎴栧凡閫炬湡閮芥爣绾�
+      if (diffDays <= 7) {
+        console.log("return warning-row");
+        return "warning-row";
+      }
+    } else {
+      console.log("row missing valid or mostDate:", row.valid, row.mostDate);
     }
-  } else {
-    console.log('row missing valid or mostDate:', row.valid, row.mostDate);
-  }
-  return '';
-}
+    return "";
+  };
 
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
-	selectedRows.value = selection;
-};
-const formDia = ref()
-const calibrationDia = ref()
+  // 琛ㄦ牸閫夋嫨鏁版嵁
+  const handleSelectionChange = selection => {
+    selectedRows.value = selection;
+  };
+  const formDia = ref();
+  const calibrationDia = ref();
 
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
-	page.current = 1;
-	getList();
-};
+  // 鏌ヨ鍒楄〃
+  /** 鎼滅储鎸夐挳鎿嶄綔 */
+  const handleQuery = () => {
+    page.current = 1;
+    getList();
+  };
 
-// 閲嶇疆鎼滅储鏉′欢
-const handleReset = () => {
-	searchForm.value.recordDate = "";
-	searchForm.value.code = "";
-	searchForm.value.status = "";
-	page.current = 1;
-	getList();
-};
-const pagination = (obj) => {
-	page.current = obj.page;
-	page.size = obj.limit;
-	getList();
-};
-const getList = () => {
-	tableLoading.value = true;
-	measuringInstrumentListPage({ ...searchForm.value, ...page }).then((res) => {
-		tableLoading.value = false;
-		tableData.value = res.data.records;
-		page.total = res.data.total;
-	}).catch((err) => {
-		tableLoading.value = false;
-	})
-};
+  // 閲嶇疆鎼滅储鏉′欢
+  const handleReset = () => {
+    searchForm.value.recordDate = "";
+    searchForm.value.code = "";
+    searchForm.value.status = "";
+    page.current = 1;
+    getList();
+  };
+  const pagination = obj => {
+    page.current = obj.page;
+    page.size = obj.limit;
+    getList();
+  };
+  const getList = () => {
+    tableLoading.value = true;
+    measuringInstrumentListPage({ ...searchForm.value, ...page })
+      .then(res => {
+        tableLoading.value = false;
+        tableData.value = res.data.records;
+        page.total = res.data.total;
+      })
+      .catch(err => {
+        tableLoading.value = false;
+      });
+  };
 
-// 鎵撳紑寮规
-const openForm = (type, row) => {
-	nextTick(() => {
-		formDia.value?.openDialog(type, row)
-	})
-};
-// 鎵撳紑妫�瀹氭牎鍑嗗脊妗�
-const openCalibrationDia = (type, row) => {
-	nextTick(() => {
-		calibrationDia.value?.openDialog(type, row)
-	})
-}
+  // 鎵撳紑寮规
+  const openForm = (type, row) => {
+    nextTick(() => {
+      formDia.value?.openDialog(type, row);
+    });
+  };
+  // 鎵撳紑妫�瀹氭牎鍑嗗脊妗�
+  const openCalibrationDia = (type, row) => {
+    nextTick(() => {
+      calibrationDia.value?.openDialog(type, row);
+    });
+  };
 
-const handleDelete = () => {
-	let ids = [];
-	if (selectedRows.value.length > 0) {
-		ids = selectedRows.value.map((item) => item.id);
-	} else {
-		proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
-		return;
-	}
-	ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鍒犻櫎鎻愮ず", {
-		confirmButtonText: "纭",
-		cancelButtonText: "鍙栨秷",
-		type: "warning",
-	})
-		.then(() => {
-			tableLoading.value = true;
-			measuringInstrumentDelete(ids)
-				.then((res) => {
-					proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
-					getList();
-				})
-				.finally(() => {
-					tableLoading.value = false;
-				});
-		})
-		.catch(() => {
-			proxy.$modal.msg("宸插彇娑�");
-		});
-};
-// 瀵煎嚭
-const handleOut = () => {
-	ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
-		confirmButtonText: "纭",
-		cancelButtonText: "鍙栨秷",
-		type: "warning",
-	})
-		.then(() => {
-			proxy.download("/measuringInstrumentLedger/export", {}, "璁¢噺鍣ㄥ叿鍙拌处.xlsx");
-		})
-		.catch(() => {
-			proxy.$modal.msg("宸插彇娑�");
-		});
-};
-onMounted(() => {
-	getList();
-});
+  const handleDelete = () => {
+    let ids = [];
+    if (selectedRows.value.length > 0) {
+      ids = selectedRows.value.map(item => item.id);
+    } else {
+      proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
+      return;
+    }
+    ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鍒犻櫎鎻愮ず", {
+      confirmButtonText: "纭",
+      cancelButtonText: "鍙栨秷",
+      type: "warning",
+    })
+      .then(() => {
+        tableLoading.value = true;
+        measuringInstrumentDelete(ids)
+          .then(res => {
+            proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+            getList();
+          })
+          .finally(() => {
+            tableLoading.value = false;
+          });
+      })
+      .catch(() => {
+        proxy.$modal.msg("宸插彇娑�");
+      });
+  };
+  // 瀵煎嚭
+  const handleOut = () => {
+    ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
+      confirmButtonText: "纭",
+      cancelButtonText: "鍙栨秷",
+      type: "warning",
+    })
+      .then(() => {
+        proxy.download(
+          "/measuringInstrumentLedger/export",
+          {},
+          "璁¢噺鍣ㄥ叿鍙拌处.xlsx"
+        );
+      })
+      .catch(() => {
+        proxy.$modal.msg("宸插彇娑�");
+      });
+  };
+  onMounted(() => {
+    getList();
+  });
 </script>
 
 <style scoped>
-:deep(.el-table .warning-row) {
-  background-color: #fef0f0 !important;
-}
-:deep(.el-table .warning-row:hover > td) {
-  background-color: #f9d5d5 !important;
-}
-:deep(.el-table .el-table__body tr.warning-row td) {
-  background-color: #fef0f0 !important;
-}
+  :deep(.el-table .warning-row) {
+    background-color: #fef0f0 !important;
+  }
+  :deep(.el-table .warning-row:hover > td) {
+    background-color: #f9d5d5 !important;
+  }
+  :deep(.el-table .el-table__body tr.warning-row td) {
+    background-color: #fef0f0 !important;
+  }
 </style>
\ No newline at end of file
diff --git a/src/views/equipmentManagement/repair/Modal/RepairModal.vue b/src/views/equipmentManagement/repair/Modal/RepairModal.vue
index 4e73833..4a10071 100644
--- a/src/views/equipmentManagement/repair/Modal/RepairModal.vue
+++ b/src/views/equipmentManagement/repair/Modal/RepairModal.vue
@@ -1,111 +1,126 @@
 <template>
-  <FormDialog
-    v-model="visible"
-    :title="id ? '缂栬緫璁惧鎶ヤ慨' : '鏂板璁惧鎶ヤ慨'"
-    width="800px"
-    @confirm="sendForm"
-    @cancel="handleCancel"
-    @close="handleClose"
-  >
-    <el-form :model="form" label-width="100px">
+  <FormDialog v-model="visible"
+              :title="computedTitle"
+              :operation-type="operationType"
+              width="800px"
+              @confirm="sendForm"
+              @cancel="handleCancel"
+              @close="handleClose">
+    <el-form :model="form"
+             label-width="100px">
       <el-row>
         <el-col :span="12">
           <el-form-item label="璁惧鍚嶇О">
-            <el-select v-model="form.deviceLedgerId" @change="setDeviceModel" filterable>
-              <el-option
-                v-for="(item, index) in deviceOptions"
-                :key="index"
-                :label="item.deviceName"
-                :value="item.id"
-              ></el-option>
+            <el-select v-model="form.deviceLedgerId"
+                       @change="setDeviceModel"
+                       filterable
+                       :disabled="operationType === 'view'">
+              <el-option v-for="(item, index) in deviceOptions"
+                         :key="index"
+                         :label="item.deviceName"
+                         :value="item.id"></el-option>
             </el-select>
           </el-form-item>
         </el-col>
         <el-col :span="12">
           <el-form-item label="瑙勬牸鍨嬪彿">
-            <el-input
-              v-model="form.deviceModel"
-              placeholder="璇疯緭鍏ヨ鏍煎瀷鍙�"
-              disabled
-            />
+            <el-input v-model="form.deviceModel"
+                      placeholder="璇疯緭鍏ヨ鏍煎瀷鍙�"
+                      disabled />
           </el-form-item>
         </el-col>
         <el-col :span="12">
           <el-form-item label="鎶ヤ慨鏃ユ湡">
-            <el-date-picker
-              v-model="form.repairTime"
-              placeholder="璇烽�夋嫨鎶ヤ慨鏃ユ湡"
-              format="YYYY-MM-DD"
-              value-format="YYYY-MM-DD"
-              type="date"
-              clearable
-              style="width: 100%"
-            />
+            <el-date-picker v-model="form.repairTime"
+                            placeholder="璇烽�夋嫨鎶ヤ慨鏃ユ湡"
+                            format="YYYY-MM-DD"
+                            value-format="YYYY-MM-DD"
+                            type="date"
+                            clearable
+                            style="width: 100%"
+                            :disabled="operationType === 'view'" />
           </el-form-item>
         </el-col>
         <el-col :span="12">
           <el-form-item label="鎶ヤ慨浜�">
-            <el-input v-model="form.repairName" placeholder="璇疯緭鍏ユ姤淇汉" />
+            <el-input v-model="form.repairName"
+                      placeholder="璇疯緭鍏ユ姤淇汉"
+                      :disabled="operationType === 'view'" />
           </el-form-item>
         </el-col>
         <el-col :span="12">
           <el-form-item label="鎶ヤ慨鎶ヤ慨椤圭洰">
-            <el-input v-model="form.machineryCategory" placeholder="璇疯緭鍏ユ姤淇姤淇」鐩�" />
+            <el-input v-model="form.machineryCategory"
+                      placeholder="璇疯緭鍏ユ姤淇姤淇」鐩�"
+                      :disabled="operationType === 'view'" />
           </el-form-item>
         </el-col>
       </el-row>
       <el-row>
         <el-col :span="12">
           <el-form-item label="缁翠慨浜�">
-            <el-input v-model="form.maintenanceName" placeholder="璇疯緭鍏ョ淮淇汉濮撳悕" />
+            <el-input v-model="form.maintenanceName"
+                      placeholder="璇疯緭鍏ョ淮淇汉濮撳悕"
+                      :disabled="operationType === 'view'" />
           </el-form-item>
         </el-col>
       </el-row>
       <el-row v-if="id">
         <el-col :span="12">
           <el-form-item label="鎶ヤ慨鐘舵��">
-            <el-select v-model="form.status" disabled>
-              <el-option label="寰呯淮淇�" :value="0"></el-option>
-              <el-option label="宸查獙鏀�" :value="1"></el-option>
-              <el-option label="澶辫触" :value="2"></el-option>
+            <el-select v-model="form.status"
+                       disabled>
+              <el-option label="寰呯淮淇�"
+                         :value="0"></el-option>
+              <el-option label="宸查獙鏀�"
+                         :value="1"></el-option>
+              <el-option label="澶辫触"
+                         :value="2"></el-option>
             </el-select>
           </el-form-item>
         </el-col>
       </el-row>
       <!-- 楠屾敹淇℃伅灞曠ず -->
-      <el-row v-if="id && form.status === 1">
+      <el-row v-if="id && (form.status === 1 || form.status === 3)">
         <el-col :span="12">
           <el-form-item label="楠屾敹浜�">
-            <el-input v-model="form.acceptanceName" disabled />
+            <el-input v-model="form.acceptanceName"
+                      disabled />
           </el-form-item>
         </el-col>
         <el-col :span="12">
           <el-form-item label="楠屾敹鏃堕棿">
-            <el-input v-model="form.acceptanceTime" disabled />
+            <el-input v-model="form.acceptanceTime"
+                      disabled />
           </el-form-item>
         </el-col>
         <el-col :span="24">
           <el-form-item label="楠屾敹澶囨敞">
-            <el-input v-model="form.acceptanceRemark" type="textarea" :rows="2" disabled />
+            <el-input v-model="form.acceptanceRemark"
+                      type="textarea"
+                      :rows="2"
+                      disabled />
           </el-form-item>
         </el-col>
       </el-row>
       <el-row>
         <el-col :span="24">
           <el-form-item label="鏁呴殰鐜拌薄">
-            <el-input
-              v-model="form.remark"
-              :rows="2"
-              type="textarea"
-              placeholder="璇疯緭鍏ユ晠闅滅幇璞�"
-            />
+            <el-input v-model="form.remark"
+                      :rows="2"
+                      type="textarea"
+                      placeholder="璇疯緭鍏ユ晠闅滅幇璞�"
+                      :disabled="operationType === 'view'" />
           </el-form-item>
         </el-col>
       </el-row>
-      <el-row :gutter="30">
+      <el-row v-if="operationType !== 'view'"
+              :gutter="30">
         <el-col :span="24">
-          <el-form-item label="闄勪欢" prop="attachmentIds">
-            <FileUpload v-model:file-list="form.storageBlobDTOs" />
+          <el-form-item label="闄勪欢"
+                        prop="attachmentIds">
+            <FileUpload v-model:file-list="form.storageBlobDTOs"
+                        :disabled="operationType === 'view'" />
           </el-form-item>
         </el-col>
       </el-row>
@@ -114,119 +129,140 @@
 </template>
 
 <script setup>
-import FormDialog from "@/components/Dialog/FormDialog.vue";
-import FileUpload from "@/components/AttachmentUpload/file/index.vue";
-import {
-  addRepair,
-  editRepair,
-  getRepairById,
-} from "@/api/equipmentManagement/repair";
-import { ElMessage } from "element-plus";
-import dayjs from "dayjs";
-import useFormData from "@/hooks/useFormData";
-import { getDeviceLedger } from "@/api/equipmentManagement/ledger";
-import useUserStore from "@/store/modules/user";
+  import FormDialog from "@/components/Dialog/FormDialog.vue";
+  import FileUpload from "@/components/AttachmentUpload/file/index.vue";
+  import {
+    addRepair,
+    editRepair,
+    getRepairById,
+  } from "@/api/equipmentManagement/repair";
+  import { ElMessage } from "element-plus";
+  import dayjs from "dayjs";
+  import useFormData from "@/hooks/useFormData";
+  import { getDeviceLedger } from "@/api/equipmentManagement/ledger";
+  import useUserStore from "@/store/modules/user";
 
-defineOptions({
-  name: "璁惧鎶ヤ慨寮圭獥",
-});
+  defineOptions({
+    name: "璁惧鎶ヤ慨寮圭獥",
+  });
 
-const emits = defineEmits(["ok"]);
+  const emits = defineEmits(["ok"]);
 
-const id = ref();
-const visible = ref(false);
-const loading = ref(false);
+  const id = ref();
+  const visible = ref(false);
+  const loading = ref(false);
+  const operationType = ref(""); // add, edit, view
 
-const userStore = useUserStore();
-const deviceOptions = ref([]);
-const fileList = ref([]);
+  const computedTitle = computed(() => {
+    if (operationType.value === "add") return "鏂板璁惧鎶ヤ慨";
+    if (operationType.value === "edit") return "缂栬緫璁惧鎶ヤ慨";
+    if (operationType.value === "view") return "璁惧鎶ヤ慨璇︽儏";
+    return "";
+  });
 
-const loadDeviceName = async () => {
-  const { data } = await getDeviceLedger();
-  deviceOptions.value = data;
-};
+  const userStore = useUserStore();
+  const deviceOptions = ref([]);
+  const fileList = ref([]);
 
-const { form, resetForm } = useFormData({
-  deviceLedgerId: undefined, // 璁惧Id
-  deviceName: undefined, // 璁惧鍚嶇О
-  deviceModel: undefined, // 瑙勬牸鍨嬪彿
-  repairTime: dayjs().format("YYYY-MM-DD"), // 鎶ヤ慨鏃ユ湡锛岄粯璁ゅ綋澶�
-  repairName: userStore.nickName, // 鎶ヤ慨浜�
-  remark: undefined, // 鏁呴殰鐜拌薄
-  status: 0, // 鎶ヤ慨鐘舵��
-  machineryCategory: undefined,
-  storageBlobDTOs: [],
-  maintenanceName: undefined, // 缁翠慨浜�
-});
+  const loadDeviceName = async () => {
+    const { data } = await getDeviceLedger();
+    deviceOptions.value = data;
+  };
 
-const setDeviceModel = (deviceId) => {
-  const option = deviceOptions.value.find((item) => item.id === deviceId);
-  form.deviceModel = option.deviceModel;
-};
+  const { form, resetForm } = useFormData({
+    deviceLedgerId: undefined, // 璁惧Id
+    deviceName: undefined, // 璁惧鍚嶇О
+    deviceModel: undefined, // 瑙勬牸鍨嬪彿
+    repairTime: dayjs().format("YYYY-MM-DD"), // 鎶ヤ慨鏃ユ湡锛岄粯璁ゅ綋澶�
+    repairName: userStore.nickName, // 鎶ヤ慨浜�
+    remark: undefined, // 鏁呴殰鐜拌薄
+    status: 0, // 鎶ヤ慨鐘舵��
+    machineryCategory: undefined,
+    storageBlobDTOs: [],
+    maintenanceName: undefined, // 缁翠慨浜�
+  });
 
-const setForm = (data) => {
-  form.deviceLedgerId = data.deviceLedgerId;
-  form.deviceName = data.deviceName;
-  form.deviceModel = data.deviceModel;
-  form.repairTime = data.repairTime;
-  form.repairName = data.repairName;
-  form.remark = data.remark;
-  form.status = data.status;
-  form.machineryCategory = data.machineryCategory;
-  form.storageBlobDTOs = data.storageBlobVOs || [];
-  form.maintenanceName = data.maintenanceName;
-  form.acceptanceName = data.acceptanceName;
-  form.acceptanceTime = data.acceptanceTime;
-  form.acceptanceRemark = data.acceptanceRemark;
-};
+  const setDeviceModel = deviceId => {
+    const option = deviceOptions.value.find(item => item.id === deviceId);
+    form.deviceModel = option.deviceModel;
+  };
 
-const sendForm = async () => {
-  loading.value = true;
-  try {
-    const { code } = id.value
-      ? await editRepair({ id: unref(id), ...form })
-      : await addRepair(form);
-    if (code == 200) {
-      ElMessage.success(`${id.value ? "缂栬緫" : "鏂板"}鎶ヤ慨鎴愬姛`);
-      visible.value = false;
-      emits("ok");
+  const setForm = data => {
+    form.deviceLedgerId = data.deviceLedgerId;
+    form.deviceName = data.deviceName;
+    form.deviceModel = data.deviceModel;
+    form.repairTime = data.repairTime;
+    form.repairName = data.repairName;
+    form.remark = data.remark;
+    form.status = data.status;
+    form.machineryCategory = data.machineryCategory;
+    form.storageBlobDTOs = data.storageBlobVOs || [];
+    form.maintenanceName = data.maintenanceName;
+    form.acceptanceName = data.acceptanceName;
+    form.acceptanceTime = data.acceptanceTime;
+    form.acceptanceRemark = data.acceptanceRemark;
+  };
+
+  const sendForm = async () => {
+    loading.value = true;
+    try {
+      const { code } = id.value
+        ? await editRepair({ id: unref(id), ...form })
+        : await addRepair(form);
+      if (code == 200) {
+        ElMessage.success(`${id.value ? "缂栬緫" : "鏂板"}鎶ヤ慨鎴愬姛`);
+        visible.value = false;
+        emits("ok");
+      }
+    } finally {
+      loading.value = false;
     }
-  } finally {
-    loading.value = false;
-  }
-};
+  };
 
-const handleCancel = () => {
-  resetForm();
-  visible.value = false;
-};
+  const handleCancel = () => {
+    resetForm();
+    visible.value = false;
+  };
 
-const handleClose = () => {
-  resetForm();
-  visible.value = false;
-};
+  const handleClose = () => {
+    resetForm();
+    visible.value = false;
+  };
 
-const openAdd = async () => {
-  id.value = undefined;
-  visible.value = true;
-  fileList.value = [];
-  await nextTick();
-  await loadDeviceName();
-};
+  const openAdd = async () => {
+    id.value = undefined;
+    operationType.value = "add";
+    visible.value = true;
+    fileList.value = [];
+    await nextTick();
+    await loadDeviceName();
+  };
 
-const openEdit = async (editId) => {
-  const { data } = await getRepairById(editId);
-  id.value = editId;
-  visible.value = true;
-  await nextTick();
-  await loadDeviceName();
-  setForm(data);
-};
+  const openEdit = async editId => {
+    const { data } = await getRepairById(editId);
+    id.value = editId;
+    operationType.value = "edit";
+    visible.value = true;
+    await nextTick();
+    await loadDeviceName();
+    setForm(data);
+  };
 
-defineExpose({
-  openAdd,
-  openEdit,
-});
+  const openView = async viewId => {
+    const { data } = await getRepairById(viewId);
+    id.value = viewId;
+    operationType.value = "view";
+    visible.value = true;
+    await nextTick();
+    await loadDeviceName();
+    setForm(data);
+  };
+
+  defineExpose({
+    openAdd,
+    openEdit,
+    openView,
+  });
 </script>
 
 <style lang="scss" scoped></style>
diff --git a/src/views/equipmentManagement/repair/index.vue b/src/views/equipmentManagement/repair/index.vue
index 2835356..f1573cb 100644
--- a/src/views/equipmentManagement/repair/index.vue
+++ b/src/views/equipmentManagement/repair/index.vue
@@ -1,193 +1,195 @@
 <template>
   <div class="app-container">
-    <el-form :model="filters" :inline="true">
+    <el-form :model="filters"
+             :inline="true">
       <el-form-item label="璁惧鍚嶇О">
-        <el-input
-            v-model="filters.deviceName"
-            style="width: 240px"
-            placeholder="璇疯緭鍏ヨ澶囧悕绉�"
-            clearable
-            :prefix-icon="Search"
-            @change="getTableData"
-        />
+        <el-input v-model="filters.deviceName"
+                  style="width: 240px"
+                  placeholder="璇疯緭鍏ヨ澶囧悕绉�"
+                  clearable
+                  :prefix-icon="Search"
+                  @change="getTableData" />
       </el-form-item>
       <el-form-item label="瑙勬牸鍨嬪彿">
-        <el-input
-            v-model="filters.deviceModel"
-            style="width: 240px"
-            placeholder="璇烽�夋嫨瑙勬牸鍨嬪彿"
-            clearable
-            :prefix-icon="Search"
-            @change="getTableData"
-        />
+        <el-input v-model="filters.deviceModel"
+                  style="width: 240px"
+                  placeholder="璇烽�夋嫨瑙勬牸鍨嬪彿"
+                  clearable
+                  :prefix-icon="Search"
+                  @change="getTableData" />
       </el-form-item>
       <el-form-item label="鏁呴殰鐜拌薄">
-        <el-input
-            v-model="filters.remark"
-            style="width: 240px"
-            placeholder="璇疯緭鍏ユ晠闅滅幇璞�"
-            clearable
-            :prefix-icon="Search"
-            @change="getTableData"
-        />
+        <el-input v-model="filters.remark"
+                  style="width: 240px"
+                  placeholder="璇疯緭鍏ユ晠闅滅幇璞�"
+                  clearable
+                  :prefix-icon="Search"
+                  @change="getTableData" />
       </el-form-item>
       <el-form-item label="缁翠慨浜�">
-        <el-input
-            v-model="filters.maintenanceName"
-            style="width: 240px"
-            placeholder="璇疯緭鍏ョ淮淇汉"
-            clearable
-            :prefix-icon="Search"
-            @change="getTableData"
-        />
+        <el-input v-model="filters.maintenanceName"
+                  style="width: 240px"
+                  placeholder="璇疯緭鍏ョ淮淇汉"
+                  clearable
+                  :prefix-icon="Search"
+                  @change="getTableData" />
       </el-form-item>
       <el-form-item label="鎶ヤ慨鏃ユ湡">
-        <el-date-picker
-            v-model="filters.repairTimeStr"
-            type="date"
-            placeholder="璇烽�夋嫨鎶ヤ慨鏃ユ湡"
-            size="default"
-            @change="(date) => handleDateChange(date,2)"
-        />
+        <el-date-picker v-model="filters.repairTimeStr"
+                        type="date"
+                        placeholder="璇烽�夋嫨鎶ヤ慨鏃ユ湡"
+                        size="default"
+                        @change="(date) => handleDateChange(date,2)" />
       </el-form-item>
       <el-form-item label="缁翠慨鏃ユ湡">
-        <el-date-picker
-            v-model="filters.maintenanceTimeStr"
-            type="date"
-            placeholder="璇烽�夋嫨缁翠慨鏃ユ湡"
-            size="default"
-            @change="(date) => handleDateChange(date,1)"
-        />
+        <el-date-picker v-model="filters.maintenanceTimeStr"
+                        type="date"
+                        placeholder="璇烽�夋嫨缁翠慨鏃ユ湡"
+                        size="default"
+                        @change="(date) => handleDateChange(date,1)" />
       </el-form-item>
       <el-form-item>
-        <el-button type="primary" @click="getTableData">鎼滅储</el-button>
+        <el-button type="primary"
+                   @click="getTableData">鎼滅储</el-button>
         <el-button @click="resetFilters">閲嶇疆</el-button>
       </el-form-item>
     </el-form>
     <div class="table_list">
       <div class="actions">
-        <el-text class="mx-1" size="large">璁惧鎶ヤ慨</el-text>
+        <el-text class="mx-1"
+                 size="large">璁惧鎶ヤ慨</el-text>
         <div>
-          <el-button type="success" icon="Van" @click="addRepair">
+          <el-button type="success"
+                     icon="Van"
+                     @click="addRepair">
             鏂板鎶ヤ慨
           </el-button>
           <el-button @click="handleOut">
             瀵煎嚭
           </el-button>
-          <el-button
-            type="danger"
-            icon="Delete"
-            :disabled="multipleList.length <= 0 || hasFinishedStatus"
-            @click="delRepairByIds(multipleList.map((item) => item.id))"
-          >
+          <el-button type="danger"
+                     icon="Delete"
+                     :disabled="multipleList.length <= 0 || hasFinishedStatus"
+                     @click="delRepairByIds(multipleList.map((item) => item.id))">
             鎵归噺鍒犻櫎
           </el-button>
         </div>
       </div>
-      <PIMTable
-          rowKey="id"
-          isSelection
-          :column="columns"
-          :tableData="dataList"
-          :page="{
+      <PIMTable rowKey="id"
+                isSelection
+                :column="columns"
+                :tableData="dataList"
+                :page="{
           current: pagination.currentPage,
           size: pagination.pageSize,
           total: pagination.total,
         }"
-          @selection-change="handleSelectionChange"
-          @pagination="changePage"
-      >
+                @selection-change="handleSelectionChange"
+                @pagination="changePage">
         <template #statusRef="{ row }">
-          <el-tag v-if="row.status === 2" type="danger">澶辫触</el-tag>
-          <el-tag v-if="row.status === 1" type="success">瀹岀粨</el-tag>
-          <el-tag v-if="row.status === 3" type="info">寰呴獙鏀�</el-tag>
-          <el-tag v-if="row.status === 0" type="warning">寰呯淮淇�</el-tag>
+          <el-tag v-if="row.status === 2"
+                  type="danger">澶辫触</el-tag>
+          <el-tag v-if="row.status === 1"
+                  type="success">瀹岀粨</el-tag>
+          <el-tag v-if="row.status === 3"
+                  type="info">寰呴獙鏀�</el-tag>
+          <el-tag v-if="row.status === 0"
+                  type="warning">寰呯淮淇�</el-tag>
         </template>
         <template #operation="{ row }">
-          <el-button
-            type="primary"
-            link
-            :disabled="row.status === 1 || row.status === 3"
-            @click="editRepair(row.id)"
-          >
+          <el-button type="primary"
+                     link
+                     @click="viewRepair(row.id)">
+            璇︽儏
+          </el-button>
+          <el-button type="primary"
+                     link
+                     :disabled="row.status === 1 || row.status === 3"
+                     @click="editRepair(row.id)">
             缂栬緫
           </el-button>
-          <el-button
-            type="success"
-            link
-            :disabled="row.status !== 0"
-            @click="addMaintain(row)"
-          >
+          <el-button type="success"
+                     link
+                     :disabled="row.status !== 0"
+                     @click="addMaintain(row)">
             缁翠慨
           </el-button>
-          <el-button
-            type="warning"
-            link
-            :disabled="row.status !== 3"
-            @click="openAcceptance(row)"
-          >
+          <el-button type="warning"
+                     link
+                     :disabled="row.status !== 3"
+                     @click="openAcceptance(row)">
             楠屾敹
           </el-button>
-          <el-button
-            type="danger"
-            link
-            :disabled="row.status === 1 || row.status === 3"
-            @click="delRepairByIds(row.id)"
-          >
+          <el-button type="danger"
+                     link
+                     :disabled="row.status === 1 || row.status === 3"
+                     @click="delRepairByIds(row.id)">
             鍒犻櫎
           </el-button>
-          <el-button
-              type="primary"
-              link
-              @click="openFileDialog(row)"
-          >
+          <el-button type="primary"
+                     link
+                     @click="openFileDialog(row)">
             闄勪欢
           </el-button>
         </template>
       </PIMTable>
     </div>
-    <RepairModal ref="repairModalRef" @ok="getTableData"/>
-    <MaintainModal ref="maintainModalRef" @ok="getTableData"/>
-    <AcceptanceModal ref="acceptanceModalRef" @ok="getTableData"/>
-    <FileList v-if="fileDialogVisible"  v-model:visible="fileDialogVisible" :record-type="'device_repair'" :record-id="recordId"  />
+    <RepairModal ref="repairModalRef"
+                 @ok="getTableData" />
+    <MaintainModal ref="maintainModalRef"
+                   @ok="getTableData" />
+    <AcceptanceModal ref="acceptanceModalRef"
+                     @ok="getTableData" />
+    <FileList v-if="fileDialogVisible"
+              v-model:visible="fileDialogVisible"
+              :record-type="'device_repair'"
+              :record-id="recordId" />
   </div>
 </template>
 
 <script setup>
-import {onMounted, getCurrentInstance, computed, ref, defineAsyncComponent} from "vue";
-import {usePaginationApi} from "@/hooks/usePaginationApi";
-import {getRepairPage, delRepair} from "@/api/equipmentManagement/repair";
-import RepairModal from "./Modal/RepairModal.vue";
-import {ElMessageBox, ElMessage} from "element-plus";
-import dayjs from "dayjs";
-import MaintainModal from "./Modal/MaintainModal.vue";
-import AcceptanceModal from "./Modal/AcceptanceModal.vue";
-const FileList = defineAsyncComponent(() => import("@/components/Dialog/FileList.vue"));
+  import {
+    onMounted,
+    getCurrentInstance,
+    computed,
+    ref,
+    defineAsyncComponent,
+  } from "vue";
+  import { usePaginationApi } from "@/hooks/usePaginationApi";
+  import { getRepairPage, delRepair } from "@/api/equipmentManagement/repair";
+  import RepairModal from "./Modal/RepairModal.vue";
+  import { ElMessageBox, ElMessage } from "element-plus";
+  import dayjs from "dayjs";
+  import MaintainModal from "./Modal/MaintainModal.vue";
+  import AcceptanceModal from "./Modal/AcceptanceModal.vue";
+  const FileList = defineAsyncComponent(() =>
+    import("@/components/Dialog/FileList.vue")
+  );
 
-defineOptions({
-  name: "璁惧鎶ヤ慨",
-});
+  defineOptions({
+    name: "璁惧鎶ヤ慨",
+  });
 
-const {proxy} = getCurrentInstance();
+  const { proxy } = getCurrentInstance();
 
-// 妯℃�佹瀹炰緥
-const repairModalRef = ref();
-const maintainModalRef = ref();
-const acceptanceModalRef = ref();
+  // 妯℃�佹瀹炰緥
+  const repairModalRef = ref();
+  const maintainModalRef = ref();
+  const acceptanceModalRef = ref();
 
-// 琛ㄦ牸澶氶�夋閫変腑椤�
-const multipleList = ref([]);
+  // 琛ㄦ牸澶氶�夋閫変腑椤�
+  const multipleList = ref([]);
 
-// 琛ㄦ牸閽╁瓙
-const {
-  filters,
-  columns,
-  dataList,
-  pagination,
-  getTableData,
-  resetFilters,
-  onCurrentChange,
-} = usePaginationApi(
+  // 琛ㄦ牸閽╁瓙
+  const {
+    filters,
+    columns,
+    dataList,
+    pagination,
+    getTableData,
+    resetFilters,
+    onCurrentChange,
+  } = usePaginationApi(
     getRepairPage,
     {
       deviceName: undefined,
@@ -209,52 +211,15 @@
         prop: "deviceModel",
       },
       {
-        label: "鎶ヤ慨椤圭洰",
-        align: "center",
-        prop: "machineryCategory",
-      },
-      {
         label: "鎶ヤ慨鏃ユ湡",
         align: "center",
         prop: "repairTime",
-        formatData: (cell) => dayjs(cell).format("YYYY-MM-DD"),
+        formatData: cell => dayjs(cell).format("YYYY-MM-DD"),
       },
       {
         label: "鎶ヤ慨浜�",
         align: "center",
         prop: "repairName",
-      },
-      {
-        label: "鏁呴殰鐜拌薄",
-        align: "center",
-        prop: "remark",
-      },
-      {
-        label: "缁翠慨浜�",
-        align: "center",
-        prop: "maintenanceName",
-      },
-      {
-        label: "缁翠慨缁撴灉",
-        align: "center",
-        prop: "maintenanceResult",
-      },
-      {
-        label: "缁翠慨鏃ユ湡",
-        align: "center",
-        prop: "maintenanceTime",
-        formatData: (cell) => (cell ? dayjs(cell).format("YYYY-MM-DD") : ""),
-      },
-      {
-        label: "楠屾敹浜�",
-        align: "center",
-        prop: "acceptanceName",
-      },
-      {
-        label: "楠屾敹鏃堕棿",
-        align: "center",
-        prop: "acceptanceTime",
-        formatData: (cell) => (cell ? dayjs(cell).format("YYYY-MM-DD HH:mm:ss") : ""),
       },
       {
         label: "鐘舵��",
@@ -269,127 +234,132 @@
         dataType: "slot",
         slot: "operation",
         align: "center",
-        width: "300px",
+        width: "320px",
       },
     ]
-);
+  );
 
-// type === 1 缁翠慨 2鎶ヤ慨闂�
-const handleDateChange = (value, type) => {
-  filters.maintenanceTimeStr = null
-  filters.c = null
-  if (type === 1) {
-    if (value) {
-      filters.maintenanceTimeStr = dayjs(value).format("YYYY-MM-DD");
+  // type === 1 缁翠慨 2鎶ヤ慨闂�
+  const handleDateChange = (value, type) => {
+    filters.maintenanceTimeStr = null;
+    filters.c = null;
+    if (type === 1) {
+      if (value) {
+        filters.maintenanceTimeStr = dayjs(value).format("YYYY-MM-DD");
+      }
+    } else {
+      if (value) {
+        filters.repairTimeStr = dayjs(value).format("YYYY-MM-DD");
+      }
     }
-  } else {
-    if (value) {
-      filters.repairTimeStr = dayjs(value).format("YYYY-MM-DD");
-    }
-  }
-  getTableData();
-};
+    getTableData();
+  };
 
-// 鎵撳紑闄勪欢寮圭獥
-const recordId =ref(0)
-const fileDialogVisible = ref(false)
+  // 鎵撳紑闄勪欢寮圭獥
+  const recordId = ref(0);
+  const fileDialogVisible = ref(false);
 
-const openFileDialog = async (row) => {
-  recordId.value = row.id
-  fileDialogVisible.value = true
-}
+  const openFileDialog = async row => {
+    recordId.value = row.id;
+    fileDialogVisible.value = true;
+  };
 
-// 澶氶�夊悗鍋氫粈涔�
-const handleSelectionChange = (selectionList) => {
-  multipleList.value = selectionList;
-};
+  // 澶氶�夊悗鍋氫粈涔�
+  const handleSelectionChange = selectionList => {
+    multipleList.value = selectionList;
+  };
 
-// 妫�鏌ラ�変腑鐨勮褰曚腑鏄惁鏈夊畬缁撶姸鎬佺殑
-const hasFinishedStatus = computed(() => {
-  return multipleList.value.some(item => item.status === 1)
-})
-
-// 鏂板鎶ヤ慨
-const addRepair = () => {
-  repairModalRef.value.openAdd();
-};
-
-// 缂栬緫鎶ヤ慨
-const editRepair = (id) => {
-  repairModalRef.value.openEdit(id);
-};
-
-// 鏂板缁翠慨
-const addMaintain = (row) => {
-  maintainModalRef.value.open(row.id, row);
-};
-
-// 鎵撳紑楠屾敹寮圭獥
-const openAcceptance = (row) => {
-  acceptanceModalRef.value.open(row);
-};
-
-const changePage = ({page, limit}) => {
-  pagination.currentPage = page;
-  pagination.pageSize = limit;
-  onCurrentChange(page);
-};
-
-// 鍗曡鍒犻櫎
-const delRepairByIds = async (ids) => {
-  // 妫�鏌ユ槸鍚︽湁瀹岀粨鐘舵�佺殑璁板綍
-  const idsArray = Array.isArray(ids) ? ids : [ids];
-  const hasFinished = idsArray.some(id => {
-    const record = dataList.value.find(item => item.id === id);
-    return record && record.status === 1;
+  // 妫�鏌ラ�変腑鐨勮褰曚腑鏄惁鏈夊畬缁撶姸鎬佺殑
+  const hasFinishedStatus = computed(() => {
+    return multipleList.value.some(item => item.status === 1);
   });
 
-  if (hasFinished) {
-    ElMessage.warning('涓嶈兘鍒犻櫎鐘舵�佷负瀹岀粨鐨勮褰�');
-    return;
-  }
+  // 鏂板鎶ヤ慨
+  const addRepair = () => {
+    repairModalRef.value.openAdd();
+  };
 
-  ElMessageBox.confirm("纭鍒犻櫎鎶ヤ慨鏁版嵁, 姝ゆ搷浣滀笉鍙��?", "璀﹀憡", {
-    confirmButtonText: "纭畾",
-    cancelButtonText: "鍙栨秷",
-    type: "warning",
-  }).then(async () => {
-    const {code} = await delRepair(ids);
-    if (code === 200) {
-      ElMessage.success("鍒犻櫎鎴愬姛");
-      getTableData();
+  // 璇︽儏鏌ョ湅
+  const viewRepair = id => {
+    repairModalRef.value.openView(id);
+  };
+
+  // 缂栬緫鎶ヤ慨
+  const editRepair = id => {
+    repairModalRef.value.openEdit(id);
+  };
+
+  // 鏂板缁翠慨
+  const addMaintain = row => {
+    maintainModalRef.value.open(row.id, row);
+  };
+
+  // 鎵撳紑楠屾敹寮圭獥
+  const openAcceptance = row => {
+    acceptanceModalRef.value.open(row);
+  };
+
+  const changePage = ({ page, limit }) => {
+    pagination.currentPage = page;
+    pagination.pageSize = limit;
+    onCurrentChange(page);
+  };
+
+  // 鍗曡鍒犻櫎
+  const delRepairByIds = async ids => {
+    // 妫�鏌ユ槸鍚︽湁瀹岀粨鐘舵�佺殑璁板綍
+    const idsArray = Array.isArray(ids) ? ids : [ids];
+    const hasFinished = idsArray.some(id => {
+      const record = dataList.value.find(item => item.id === id);
+      return record && record.status === 1;
+    });
+
+    if (hasFinished) {
+      ElMessage.warning("涓嶈兘鍒犻櫎鐘舵�佷负瀹岀粨鐨勮褰�");
+      return;
     }
-  });
-};
 
-// 瀵煎嚭
-const handleOut = () => {
-  ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
-    confirmButtonText: "纭",
-    cancelButtonText: "鍙栨秷",
-    type: "warning",
-  })
+    ElMessageBox.confirm("纭鍒犻櫎鎶ヤ慨鏁版嵁, 姝ゆ搷浣滀笉鍙��?", "璀﹀憡", {
+      confirmButtonText: "纭畾",
+      cancelButtonText: "鍙栨秷",
+      type: "warning",
+    }).then(async () => {
+      const { code } = await delRepair(ids);
+      if (code === 200) {
+        ElMessage.success("鍒犻櫎鎴愬姛");
+        getTableData();
+      }
+    });
+  };
+
+  // 瀵煎嚭
+  const handleOut = () => {
+    ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
+      confirmButtonText: "纭",
+      cancelButtonText: "鍙栨秷",
+      type: "warning",
+    })
       .then(() => {
         proxy.download("/device/repair/export", {}, "璁惧鎶ヤ慨.xlsx");
       })
       .catch(() => {
         ElMessage.info("宸插彇娑�");
       });
-};
+  };
 
-onMounted(() => {
-  getTableData();
-});
+  onMounted(() => {
+    getTableData();
+  });
 </script>
 
 <style lang="scss" scoped>
-.table_list {
-  margin-top: unset;
-}
+  .table_list {
+    margin-top: unset;
+  }
 
-.actions {
-  display: flex;
-  justify-content: space-between;
-  margin-bottom: 10px;
-}
+  .actions {
+    display: flex;
+    justify-content: space-between;
+    margin-bottom: 10px;
+  }
 </style>
diff --git a/src/views/equipmentManagement/upkeep/Form/MaintenanceModal.vue b/src/views/equipmentManagement/upkeep/Form/MaintenanceModal.vue
index e86b64a..0fcccb2 100644
--- a/src/views/equipmentManagement/upkeep/Form/MaintenanceModal.vue
+++ b/src/views/equipmentManagement/upkeep/Form/MaintenanceModal.vue
@@ -1,199 +1,216 @@
 <template>
-  <FormDialog
-    v-model="visible"
-    :title="'璁惧淇濆吇'"
-    width="500px"
-    @confirm="sendForm"
-    @cancel="handleCancel"
-    @close="handleClose"
-  >
-    <el-form :model="form" label-width="100px">
+  <FormDialog v-model="visible"
+              :title="'璁惧淇濆吇'"
+              width="500px"
+              @confirm="sendForm"
+              @cancel="handleCancel"
+              @close="handleClose">
+    <el-form :model="form"
+             label-width="100px">
       <el-form-item label="瀹為檯淇濆吇浜�">
-        <el-input
-          v-model="form.maintenanceActuallyName"
-          placeholder="璇疯緭鍏ュ疄闄呬繚鍏讳汉"
-        ></el-input>
+        <el-input v-model="form.maintenanceActuallyName"
+                  placeholder="璇疯緭鍏ュ疄闄呬繚鍏讳汉"></el-input>
       </el-form-item>
       <el-form-item label="瀹為檯淇濆吇鏃ユ湡">
-        <el-date-picker
-          v-model="form.maintenanceActuallyTime"
-          placeholder="璇烽�夋嫨瀹為檯淇濆吇鏃ユ湡"
-          format="YYYY-MM-DD HH:mm:ss"
-          value-format="YYYY-MM-DD HH:mm:ss"
-          type="datetime"
-          clearable
-          style="width: 100%"
-        />
+        <el-date-picker v-model="form.maintenanceActuallyTime"
+                        placeholder="璇烽�夋嫨瀹為檯淇濆吇鏃ユ湡"
+                        format="YYYY-MM-DD HH:mm:ss"
+                        value-format="YYYY-MM-DD HH:mm:ss"
+                        type="datetime"
+                        clearable
+                        style="width: 100%" />
       </el-form-item>
       <el-form-item label="淇濆吇鐘舵��">
         <el-select v-model="form.status">
-          <el-option label="寰呬繚鍏�" :value="0"></el-option>
-          <el-option label="瀹岀粨" :value="1"></el-option>
-          <el-option label="澶辫触" :value="2"></el-option>
+          <el-option label="寰呬繚鍏�"
+                     :value="0"></el-option>
+          <el-option label="瀹岀粨"
+                     :value="1"></el-option>
+          <el-option label="澶辫触"
+                     :value="2"></el-option>
         </el-select>
       </el-form-item>
       <el-form-item label="淇濆吇缁撴灉">
-        <el-input
-          v-model="form.maintenanceResult"
-          placeholder="璇疯緭鍏ヤ繚鍏荤粨鏋�"
-          type="text" />
+        <el-input v-model="form.maintenanceResult"
+                  placeholder="璇疯緭鍏ヤ繚鍏荤粨鏋�"
+                  type="text" />
       </el-form-item>
       <el-form-item label="璁惧澶囦欢">
-        <el-select v-model="form.sparePartsIds" :loading="loadingSparePartOptions" placeholder="璇烽�夋嫨璁惧澶囦欢" multiple filterable>
-          <el-option
-              v-for="item in sparePartOptions"
-              :key="item.id"
-              :label="item.name"
-              :value="item.id"
-          />
+        <el-select v-model="form.sparePartsIds"
+                   :loading="loadingSparePartOptions"
+                   placeholder="璇烽�夋嫨璁惧澶囦欢"
+                   multiple
+                   filterable>
+          <el-option v-for="item in sparePartOptions"
+                     :key="item.id"
+                     :label="item.name"
+                     :value="item.id" />
         </el-select>
       </el-form-item>
-
-      <el-form-item v-if="selectedSpareParts.length" label="棰嗙敤鏁伴噺">
+      <el-form-item v-if="selectedSpareParts.length"
+                    label="棰嗙敤鏁伴噺">
         <div style="width: 100%">
-          <div
-              v-for="item in selectedSpareParts"
-              :key="item.id"
-              style="display: flex; align-items: center; gap: 10px; margin-bottom: 10px;"
-          >
+          <div v-for="item in selectedSpareParts"
+               :key="item.id"
+               style="display: flex; align-items: center; gap: 10px; margin-bottom: 10px;">
             <div style="flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;">
               {{ item.name }}
-              <span v-if="item.quantity !== null && item.quantity !== undefined" style="color: #909399;">
+              <span v-if="item.quantity !== null && item.quantity !== undefined"
+                    style="color: #909399;">
                 锛堝簱瀛橈細{{ item.quantity }}锛�
               </span>
             </div>
-            <el-input-number
-                v-model="sparePartQtyMap[item.id]"
-                :min="1"
-                :max="item.quantity !== null && item.quantity !== undefined ? Number(item.quantity) : undefined"
-                :step="1"
-                controls-position="right"
-                style="width: 180px"
-            />
+            <el-input-number v-model="sparePartQtyMap[item.id]"
+                             :min="1"
+                             :max="item.quantity !== null && item.quantity !== undefined ? Number(item.quantity) : undefined"
+                             :step="1"
+                             controls-position="right"
+                             style="width: 180px" />
           </div>
         </div>
+      </el-form-item>
+      <el-form-item label="闄勪欢">
+        <FileUpload v-model:file-list="form.storageBlobDTOs" />
       </el-form-item>
     </el-form>
   </FormDialog>
 </template>
 
 <script setup>
-import FormDialog from "@/components/Dialog/FormDialog.vue";
-import { addMaintenance } from "@/api/equipmentManagement/upkeep";
-import useFormData from "@/hooks/useFormData";
-import dayjs from "dayjs";
-import useUserStore from "@/store/modules/user";
-import { ElMessage } from "element-plus";
-import {computed, ref} from "vue";
-import {getSparePartsList} from "@/api/equipmentManagement/spareParts.js";
+  import FormDialog from "@/components/Dialog/FormDialog.vue";
+  import FileUpload from "@/components/AttachmentUpload/file/index.vue";
+  import { addMaintenance } from "@/api/equipmentManagement/upkeep";
+  import useFormData from "@/hooks/useFormData";
+  import dayjs from "dayjs";
+  import useUserStore from "@/store/modules/user";
+  import { ElMessage } from "element-plus";
+  import { computed, ref, nextTick, getCurrentInstance } from "vue";
+  import { getSparePartsList } from "@/api/equipmentManagement/spareParts.js";
 
-defineOptions({
-  name: "淇濆吇妯℃�佹",
-});
+  defineOptions({
+    name: "淇濆吇妯℃�佹",
+  });
 
-const emits = defineEmits(["ok"]);
+  const emits = defineEmits(["ok"]);
 
-// 淇濆瓨璁″垝淇濆吇璁板綍鐨刬d
-const planId = ref();
-const visible = ref(false);
-const loading = ref(false);
-const userStore = useUserStore();
+  const { proxy } = getCurrentInstance();
+  // 淇濆瓨璁″垝淇濆吇璁板綍鐨刬d
+  const planId = ref();
+  const visible = ref(false);
+  const loading = ref(false);
+  const userStore = useUserStore();
 
-const { form, resetForm } = useFormData({
-  maintenanceActuallyName: undefined, // 瀹為檯淇濆吇浜�
-  maintenanceActuallyTime: undefined, // 瀹為檯淇濆吇鏃ユ湡
-  maintenanceResult: undefined, // 淇濆吇缁撴灉
-  status: 0, // 淇濆吇鐘舵��
-  sparePartsIds: [],
-});
+  const { form, resetForm } = useFormData({
+    maintenanceActuallyName: undefined, // 瀹為檯淇濆吇浜�
+    maintenanceActuallyTime: undefined, // 瀹為檯淇濆吇鏃ユ湡
+    maintenanceResult: undefined, // 淇濆吇缁撴灉
+    status: 0, // 淇濆吇鐘舵��
+    sparePartsIds: [],
+    storageBlobDTOs: [],
+  });
 
-const sparePartOptions = ref([])
-const loadingSparePartOptions = ref(true)
-const sparePartQtyMap = ref({})
+  const sparePartOptions = ref([]);
+  const loadingSparePartOptions = ref(true);
+  const sparePartQtyMap = ref({});
 
-const selectedSpareParts = computed(() => {
-  const ids = Array.isArray(form.sparePartsIds) ? form.sparePartsIds : [];
-  const set = new Set(ids.map((i) => String(i)));
-  return (sparePartOptions.value || []).filter((p) => set.has(String(p.id)));
-});
+  const selectedSpareParts = computed(() => {
+    const ids = Array.isArray(form.sparePartsIds) ? form.sparePartsIds : [];
+    const set = new Set(ids.map(i => String(i)));
+    return (sparePartOptions.value || []).filter(p => set.has(String(p.id)));
+  });
 
-const setForm = (data) => {
-  form.maintenanceActuallyName =
-    data.maintenanceActuallyName ?? userStore.nickName;
-  form.maintenanceActuallyTime =
-    data.maintenanceActuallyTime 
+  const setForm = data => {
+    form.maintenanceActuallyName =
+      data.maintenanceActuallyName ?? userStore.nickName;
+    form.maintenanceActuallyTime = data.maintenanceActuallyTime
       ? dayjs(data.maintenanceActuallyTime).format("YYYY-MM-DD HH:mm:ss")
       : dayjs().format("YYYY-MM-DD HH:mm:ss");
-  form.maintenanceResult = data.maintenanceResult;
-  form.status = 1; // 榛樿鐘舵�佷负瀹岀粨
-  // multiple 閫夋嫨鍣ㄨ姹傛暟缁勶紱鍚庣甯歌繑鍥� "1,2,3"
-  if (Array.isArray(data?.sparePartsIds)) {
-    form.sparePartsIds = data.sparePartsIds.map((v) => Number(v)).filter((v) => Number.isFinite(v));
-  } else if (typeof data?.sparePartsIds === "string") {
-    form.sparePartsIds = data.sparePartsIds
+    form.maintenanceResult = data.maintenanceResult;
+    form.status = 1; // 榛樿鐘舵�佷负瀹岀粨
+    // multiple 閫夋嫨鍣ㄨ姹傛暟缁勶紱鍚庣甯歌繑鍥� "1,2,3"
+    if (Array.isArray(data?.sparePartsIds)) {
+      form.sparePartsIds = data.sparePartsIds
+        .map(v => Number(v))
+        .filter(v => Number.isFinite(v));
+    } else if (typeof data?.sparePartsIds === "string") {
+      form.sparePartsIds = data.sparePartsIds
         .split(",")
-        .map((s) => Number(String(s).trim()))
-        .filter((v) => Number.isFinite(v));
-  } else if (typeof data?.sparePartsIds === "number") {
-    form.sparePartsIds = [data.sparePartsIds];
-  } else {
-    form.sparePartsIds = [];
-  }
-};
+        .map(s => Number(String(s).trim()))
+        .filter(v => Number.isFinite(v));
+    } else if (typeof data?.sparePartsIds === "number") {
+      form.sparePartsIds = [data.sparePartsIds];
+    } else {
+      form.sparePartsIds = [];
+    }
+    form.storageBlobDTOs = data.storageBlobVOs || [];
+  };
 
-/**
- * @desc 淇濆瓨淇濆吇
- */
-const sendForm = async () => {
-  loading.value = true;
-  try {
-    // 棰嗙敤鏁伴噺鏍¢獙
-    if (Array.isArray(form.sparePartsIds) && form.sparePartsIds.length > 0) {
-      for (const partId of form.sparePartsIds) {
-        const qty = Number(sparePartQtyMap.value?.[partId]);
-        if (!Number.isFinite(qty) || qty <= 0) {
-          proxy?.$modal?.msgError?.("璇峰~鍐欏浠堕鐢ㄦ暟閲�");
-          return;
-        }
-        const part = sparePartOptions.value.find((p) => String(p.id) === String(partId));
-        const stock = part?.quantity;
-        if (stock !== null && stock !== undefined && Number.isFinite(Number(stock))) {
-          if (qty > Number(stock)) {
-            proxy?.$modal?.msgError?.(`澶囦欢銆�${part?.name || ""}銆嶉鐢ㄦ暟閲忎笉鑳借秴杩囧簱瀛橈紙${stock}锛塦);
+  /**
+   * @desc 淇濆瓨淇濆吇
+   */
+  const sendForm = async () => {
+    loading.value = true;
+    try {
+      // 棰嗙敤鏁伴噺鏍¢獙
+      if (Array.isArray(form.sparePartsIds) && form.sparePartsIds.length > 0) {
+        for (const partId of form.sparePartsIds) {
+          const qty = Number(sparePartQtyMap.value?.[partId]);
+          if (!Number.isFinite(qty) || qty <= 0) {
+            proxy?.$modal?.msgError?.("璇峰~鍐欏浠堕鐢ㄦ暟閲�");
             return;
+          }
+          const part = sparePartOptions.value.find(
+            p => String(p.id) === String(partId)
+          );
+          const stock = part?.quantity;
+          if (
+            stock !== null &&
+            stock !== undefined &&
+            Number.isFinite(Number(stock))
+          ) {
+            if (qty > Number(stock)) {
+              proxy?.$modal?.msgError?.(
+                `澶囦欢銆�${part?.name || ""}銆嶉鐢ㄦ暟閲忎笉鑳借秴杩囧簱瀛橈紙${stock}锛塦
+              );
+              return;
+            }
           }
         }
       }
-    }
-    const data = {
-      id: planId.value,
-      ...form,
-      sparePartsIds: form.sparePartsIds ? form.sparePartsIds.join(",") : "",
-      sparePartsQty: form.sparePartsIds
-          ? form.sparePartsIds.map((id) => sparePartQtyMap.value?.[id] ?? 1).join(",")
+      const data = {
+        id: planId.value,
+        ...form,
+        sparePartsIds: form.sparePartsIds ? form.sparePartsIds.join(",") : "",
+        sparePartsQty: form.sparePartsIds
+          ? form.sparePartsIds
+              .map(id => sparePartQtyMap.value?.[id] ?? 1)
+              .join(",")
           : "",
-      sparePartsUseList: form.sparePartsIds
-          ? form.sparePartsIds.map((id) => ({ id, quantity: sparePartQtyMap.value?.[id] ?? 1 }))
+        sparePartsUseList: form.sparePartsIds
+          ? form.sparePartsIds.map(id => ({
+              id,
+              quantity: sparePartQtyMap.value?.[id] ?? 1,
+            }))
           : [],
+      };
+      const { code } = await addMaintenance(data);
+      if (code == 200) {
+        ElMessage.success("淇濆吇鎴愬姛");
+        emits("ok");
+        resetForm();
+        sparePartQtyMap.value = {};
+        visible.value = false;
+      }
+    } finally {
+      loading.value = false;
     }
-    const { code } = await addMaintenance(data);
-    if (code == 200) {
-      ElMessage.success("淇濆吇鎴愬姛");
-      emits("ok");
-      resetForm();
-      sparePartQtyMap.value = {};
-      visible.value = false;
-    }
-  } finally {
-    loading.value = false;
-  }
-};
+  };
 
-const fetchSparePartOptions = () => {
-  loadingSparePartOptions.value = true;
-  // 鍜屽浠剁鐞嗛〉涓�鑷达細/spareParts/listPage 鈫� res.data.records
-  getSparePartsList({ current: 1, size: 1000 })
-      .then((res) => {
+  const fetchSparePartOptions = () => {
+    loadingSparePartOptions.value = true;
+    // 鍜屽浠剁鐞嗛〉涓�鑷达細/spareParts/listPage 鈫� res.data.records
+    getSparePartsList({ current: 1, size: 1000 })
+      .then(res => {
         if (res.code === 200) {
           sparePartOptions.value = res?.data?.records || [];
         } else {
@@ -206,31 +223,31 @@
       .finally(() => {
         loadingSparePartOptions.value = false;
       });
-}
+  };
 
-const handleCancel = () => {
-  resetForm();
-  sparePartQtyMap.value = {};
-  visible.value = false;
-};
+  const handleCancel = () => {
+    resetForm();
+    sparePartQtyMap.value = {};
+    visible.value = false;
+  };
 
-const handleClose = () => {
-  resetForm();
-  sparePartQtyMap.value = {};
-  visible.value = false;
-};
+  const handleClose = () => {
+    resetForm();
+    sparePartQtyMap.value = {};
+    visible.value = false;
+  };
 
-const open = async (id, row) => {
-  planId.value = id; // 淇濆瓨璁″垝淇濆吇璁板綍鐨刬d
-  visible.value = true;
-  await nextTick();
-  fetchSparePartOptions()
-  setForm(row);
-};
+  const open = async (id, row) => {
+    planId.value = id; // 淇濆瓨璁″垝淇濆吇璁板綍鐨刬d
+    visible.value = true;
+    await nextTick();
+    fetchSparePartOptions();
+    setForm(row);
+  };
 
-defineExpose({
-  open,
-});
+  defineExpose({
+    open,
+  });
 </script>
 
 <style lang="scss" scoped></style>
diff --git a/src/views/equipmentManagement/upkeep/index.vue b/src/views/equipmentManagement/upkeep/index.vue
index 6bdbc8f..245a162 100644
--- a/src/views/equipmentManagement/upkeep/index.vue
+++ b/src/views/equipmentManagement/upkeep/index.vue
@@ -2,8 +2,8 @@
   <div class="app-container">
     <el-tabs v-model="activeTab"
              @tab-change="handleTabChange">
-      <!-- 瀹氭椂浠诲姟绠$悊tab -->
-      <el-tab-pane label="瀹氭椂浠诲姟绠$悊"
+      <!-- 淇濆吇浠诲姟tab -->
+      <el-tab-pane label="淇濆吇浠诲姟"
                    name="scheduled">
         <div class="search_form">
           <el-form :model="scheduledFilters"
@@ -37,7 +37,7 @@
         <div class="table_list">
           <div class="actions">
             <el-text class="mx-1"
-                     size="large">瀹氭椂浠诲姟绠$悊</el-text>
+                     size="large">淇濆吇浠诲姟</el-text>
             <div>
               <el-button type="primary"
                          icon="Plus"
@@ -84,8 +84,8 @@
           </PIMTable>
         </div>
       </el-tab-pane>
-      <!-- 浠诲姟璁板綍tab锛堝師璁惧淇濆吇椤甸潰锛� -->
-      <el-tab-pane label="浠诲姟璁板綍"
+      <!-- 淇濆吇璁板綍tab锛堝師璁惧淇濆吇椤甸潰锛� -->
+      <el-tab-pane label="淇濆吇璁板綍"
                    name="record">
         <div class="search_form">
           <el-form :model="filters"
@@ -130,7 +130,7 @@
         <div class="table_list">
           <div class="actions">
             <el-text class="mx-1"
-                     size="large">浠诲姟璁板綍</el-text>
+                     size="large">淇濆吇璁板綍</el-text>
             <div>
               <el-button type="success"
                          icon="Van"
@@ -262,7 +262,7 @@
   const fileDialogVisible = ref(false);
   const currentMaintenanceTaskId = ref(null);
 
-  // 浠诲姟璁板綍tab锛堝師璁惧淇濆吇椤甸潰锛夌浉鍏冲彉閲�
+  // 淇濆吇璁板綍tab锛堝師璁惧淇濆吇椤甸潰锛夌浉鍏冲彉閲�
   const filters = reactive({
     deviceName: "",
     maintenancePlanTime: "",
@@ -278,7 +278,7 @@
   });
   const multipleList = ref([]);
 
-  // 瀹氭椂浠诲姟绠$悊tab鐩稿叧鍙橀噺
+  // 淇濆吇浠诲姟tab鐩稿叧鍙橀噺
   const scheduledFilters = reactive({
     taskName: "",
     status: "",
@@ -292,7 +292,7 @@
   });
   const scheduledMultipleList = ref([]);
 
-  // 瀹氭椂浠诲姟绠$悊琛ㄦ牸鍒楅厤缃�
+  // 淇濆吇浠诲姟琛ㄦ牸鍒楅厤缃�
   const scheduledColumns = ref([
     { prop: "taskName", label: "璁惧鍚嶇О" },
     {
@@ -344,7 +344,13 @@
     },
     { prop: "maintenancePerson", label: "淇濆吇浜�", minWidth: 100 },
     { prop: "registrant", label: "鐧昏浜�", minWidth: 100 },
-    { prop: "registrationDate", label: "鐧昏鏃ユ湡", minWidth: 100 },
+    {
+      prop: "registrationDate",
+      label: "鐧昏鏃ユ湡",
+      minWidth: 100,
+      formatData: cell =>
+        cell ? dayjs(cell).format("YYYY-MM-DD HH:mm:ss") : "-",
+    },
     {
       fixed: "right",
       label: "鎿嶄綔",
@@ -355,7 +361,7 @@
     },
   ]);
 
-  // 浠诲姟璁板綍琛ㄦ牸鍒楅厤缃紙鍘熻澶囦繚鍏昏〃鏍煎垪锛�
+  // 淇濆吇璁板綍琛ㄦ牸鍒楅厤缃紙鍘熻澶囦繚鍏昏〃鏍煎垪锛�
   const columns = ref([
     {
       label: "璁惧鍚嶇О",
@@ -371,7 +377,9 @@
       label: "璁″垝淇濆吇鏃ユ湡",
       align: "center",
       prop: "maintenancePlanTime",
-      formatData: cell => dayjs(cell).format("YYYY-MM-DD"),
+      formatData: cell => {
+        return cell == null ? "-" : dayjs(cell).format("YYYY-MM-DD");
+      },
     },
     {
       label: "褰曞叆浜�",
@@ -436,7 +444,7 @@
     }
   };
 
-  // 瀹氭椂浠诲姟绠$悊鐩稿叧鏂规硶
+  // 淇濆吇浠诲姟鐩稿叧鏂规硶
   const getScheduledTableData = async () => {
     try {
       const params = {
@@ -503,7 +511,7 @@
     ElMessage.info("瀵煎嚭瀹氭椂浠诲姟鍔熻兘寰呭疄鐜�");
   };
 
-  // 浠诲姟璁板綍鐩稿叧鏂规硶锛堝師璁惧淇濆吇椤甸潰鏂规硶锛�
+  // 淇濆吇璁板綍鐩稿叧鏂规硶锛堝師璁惧淇濆吇椤甸潰鏂规硶锛�
   const getTableData = async () => {
     try {
       const params = {
diff --git a/src/views/financialManagement/expenseManagement/Modal.vue b/src/views/financialManagement/expenseManagement/Modal.vue
deleted file mode 100644
index 4d743c1..0000000
--- a/src/views/financialManagement/expenseManagement/Modal.vue
+++ /dev/null
@@ -1,177 +0,0 @@
-<template>
-  <FormDialog
-    v-model="dialogVisible"
-    :title="dialogTitle"
-    :operationType="operationType"
-    width="50%"
-    @confirm="sendForm"
-    @close="close"
-    @cancel="close"
-  >
-    <el-form :model="form" label-width="100px" :rules="formRules" ref="formRef">
-      <el-form-item label="鏀嚭鏃ユ湡" prop="expenseDate">
-        <el-date-picker
-          style="width: 100%"
-          v-model="form.expenseDate"
-          format="YYYY-MM-DD"
-          value-format="YYYY-MM-DD"
-          type="date"
-          placeholder="璇烽�夋嫨鏃ユ湡"
-          clearable
-        />
-      </el-form-item>
-      <el-form-item label="鏀嚭绫诲瀷" prop="expenseType">
-        <el-select
-          v-model="form.expenseType"
-          placeholder="璇烽�夋嫨"
-          clearable
-        >
-          <el-option :label="item.label" :value="item.value" v-for="(item,index) in expense_types" :key="index" />
-        </el-select>
-      </el-form-item>
-      <el-form-item label="渚涘簲鍟嗗悕绉�" prop="supplierName">
-        <el-input v-model="form.supplierName" placeholder="璇疯緭鍏�" />
-      </el-form-item>
-      <el-form-item label="鏀嚭閲戦" prop="expenseMoney">
-        <el-input-number :step="0.01" :min="0" style="width: 100%"
-          v-model="form.expenseMoney"
-          placeholder="璇疯緭鍏�"
-        />
-      </el-form-item>
-      <el-form-item label="鏀嚭鎻忚堪" prop="expenseDescribed">
-        <el-input v-model="form.expenseDescribed" placeholder="璇疯緭鍏�" />
-      </el-form-item>
-      <el-form-item label="浠樻鏂瑰紡" prop="expenseMethod">
-        <el-select
-          v-model="form.expenseMethod"
-          placeholder="璇烽�夋嫨"
-          clearable
-        >
-          <el-option :label="item.label" :value="item.value" v-for="(item,index) in checkout_payment" :key="index" />
-        </el-select>
-      </el-form-item>
-      <el-form-item label="鍙戠エ鍙风爜" prop="invoiceNumber">
-        <el-input v-model="form.invoiceNumber" placeholder="璇疯緭鍏�" />
-      </el-form-item>
-      <el-form-item label="澶囨敞" prop="note">
-        <el-input
-          v-model="form.note"
-          placeholder="澶囨敞"
-        />
-      </el-form-item>
-    </el-form>
-  </FormDialog>
-</template>
-
-<script setup>
-import { add, update, getAccountExpense } from "@/api/financialManagement/expenseManagement";
-import { ElMessage } from "element-plus";
-import useFormData from "@/hooks/useFormData";
-import FormDialog from "@/components/Dialog/FormDialog.vue";
-import { ref } from "vue";
-
-const { proxy } = getCurrentInstance()
-
-defineOptions({
-  name: "鏀嚭鏂板缂栬緫",
-});
-
-const emits = defineEmits(["success"]);
-
-const formRef = ref(null);
-const dialogVisible = ref(false);
-const operationType = ref("add"); // add | edit
-const id = ref(undefined);
-const submitting = ref(false);
-
-const dialogTitle = (type) => {
-  if (type === "edit") return "缂栬緫鏀嚭";
-  return "鏂板鏀嚭";
-};
-
-const { expense_types } = proxy.useDict("expense_types");
-const { checkout_payment } = proxy.useDict("checkout_payment");
-
-const formRules = {
-  supplierName: [{ required: true, trigger: "blur", message: "璇疯緭鍏�" }],
-  expenseMoney: [{ required: true, trigger: "blur", message: "璇疯緭鍏�" }],
-  expenseDescribed: [{ required: true, trigger: "blur", message: "璇疯緭鍏�" }],
-  expenseDate: [{ required: true, trigger: "change", message: "璇烽�夋嫨" }],
-  expenseType: [{ required: true, trigger: "change", message: "璇烽�夋嫨" }],
-  expenseMethod: [{ required: true, trigger: "change", message: "璇烽�夋嫨" }],
-}
-
-const { form, resetForm } = useFormData({
-  expenseDate: undefined, // 鏀嚭鏃ユ湡
-  expenseType: undefined, // 鏀嚭绫诲瀷
-  supplierName: undefined, // 渚涘簲鍟嗗悕绉�
-  expenseMoney: undefined, // 鏀嚭閲戦
-  expenseDescribed: undefined, // 鏀嚭鎻忚堪
-  expenseMethod: undefined, // 浠樻鏂瑰紡
-  invoiceNumber: undefined, // 鍙戠エ鍙风爜
-  note: undefined, // 澶囨敞
-});
-
-const sendForm = () => {
-  if (submitting.value) return;
-  formRef.value?.validate(async (valid) => {
-    if (valid) {
-      submitting.value = true;
-      try {
-        const { code } = id.value
-          ? await update({ id: id.value, ...form })
-          : await add(form);
-        if (code == 200) {
-          emits("success");
-          ElMessage({ message: "鎿嶄綔鎴愬姛", type: "success" });
-          close();
-        }
-      } finally {
-        submitting.value = false;
-      }
-    }
-  })
-};
-
-const close = () => {
-  resetForm();
-  formRef.value?.clearValidate();
-  id.value = undefined;
-  dialogVisible.value = false;
-};
-
-const loadForm = async (rowId) => {
-  operationType.value = "edit";
-  id.value = rowId;
-  dialogVisible.value = true;
-  if (rowId) {
-    const { code, data } = await getAccountExpense(rowId);
-    if (code == 200) {
-      form.expenseDate = data.expenseDate;
-      form.expenseType = data.expenseType;
-      form.supplierName = data.supplierName;
-      form.expenseMoney = data.expenseMoney;
-      form.expenseDescribed = data.expenseDescribed;
-      form.expenseMethod = data.expenseMethod;
-      form.invoiceNumber = data.invoiceNumber;
-      form.note = data.note;
-    }
-  } else {
-    resetForm();
-    formRef.value?.clearValidate();
-  }
-};
-
-const openModal = () => {
-  operationType.value = "add";
-  id.value = undefined;
-  resetForm();
-  formRef.value?.clearValidate();
-  dialogVisible.value = true;
-};
-
-defineExpose({
-  openModal,
-  loadForm,
-});
-</script>
diff --git a/src/views/financialManagement/expenseManagement/index.vue b/src/views/financialManagement/expenseManagement/index.vue
deleted file mode 100644
index 173f8e1..0000000
--- a/src/views/financialManagement/expenseManagement/index.vue
+++ /dev/null
@@ -1,332 +0,0 @@
-<template>
-  <div class="app-container">
-    <el-form :model="filters" :inline="true">
-      <el-form-item label="鏀嚭鏃ユ湡:">
-        <el-date-picker v-model="filters.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="daterange"
-                        placeholder="璇烽�夋嫨" clearable @change="changeDaterange" />
-      </el-form-item>
-      <el-form-item label="浠樻鏂瑰紡:">
-        <el-select
-                v-model="filters.expenseMethod"
-                placeholder="璇烽�夋嫨"
-                clearable
-                style="width: 200px;"
-              >
-                <el-option
-                  v-for="item in checkout_payment"
-                  :key="item.value"
-                  :label="item.label"
-                  :value="item.value"
-                />
-              </el-select>
-      </el-form-item>
-      <el-form-item>
-        <el-button type="primary" @click="getTableData">鎼滅储</el-button>
-        <el-button @click="resetFilters">閲嶇疆</el-button>
-      </el-form-item>
-    </el-form>
-    <div class="table_list">
-      <div class="actions">
-        <div></div>
-        <div>
-          <el-button type="primary" @click="add" icon="Plus"> 鏂板 </el-button>
-          <el-button @click="handleOut" icon="download">瀵煎嚭</el-button>
-          <el-button
-            type="danger"
-            icon="Delete"
-            :disabled="multipleList.length <= 0 || hasBusinessIdInSelection"
-            @click="handleBatchDelete"
-          >
-            鎵归噺鍒犻櫎
-          </el-button>
-        </div>
-      </div>
-      <PIMTable
-        rowKey="id"
-        isSelection
-        :column="columns"
-        :tableData="dataList"
-        :page="{
-          current: pagination.currentPage,
-          size: pagination.pageSize,
-          total: pagination.total,
-        }"
-        :isShowSummary="true"
-        :summaryMethod="summarizeMainTable"
-        @selection-change="handleSelectionChange"
-        @pagination="changePage"
-      >
-        <template #operation="{ row }">
-          <el-button 
-            type="primary" 
-            link 
-            :disabled="!!row.businessId"
-            @click="edit(row.id)"
-          >
-            缂栬緫
-          </el-button>
-          <el-button
-            type="primary"
-            link
-            @click="openFilesFormDia(row)"
-          >
-            闄勪欢
-          </el-button>
-        </template>
-      </PIMTable>
-    </div>
-    <Modal ref="modalRef" @success="getTableData"></Modal>
-    <FileList v-if="fileDialogVisible"  v-model:visible="fileDialogVisible" record-type="account_expense" :record-id="recordId"  />
-  </div>
-</template>
-
-<script setup>
-import { usePaginationApi } from "@/hooks/usePaginationApi";
-import { listPage, delAccountExpense } from "@/api/financialManagement/expenseManagement";
-import {onMounted, getCurrentInstance, ref, computed, defineAsyncComponent} from "vue";
-import Modal from "./Modal.vue";
-import { ElMessageBox, ElMessage } from "element-plus";
-import dayjs from "dayjs";
-const FileList = defineAsyncComponent(() => import("@/components/Dialog/FileList.vue"));
-
-defineOptions({
-  name: "鏀嚭绠$悊",
-});
-
-// 琛ㄦ牸澶氶�夋閫変腑椤�
-const multipleList = ref([]);
-const { proxy } = getCurrentInstance();
-const modalRef = ref();
-const { checkout_payment } = proxy.useDict("checkout_payment");
-const { expense_types } = proxy.useDict("expense_types");
-const accountType = ref('鏀嚭');
-
-const {
-  filters,
-  columns,
-  dataList,
-  pagination,
-  getTableData,
-  resetFilters,
-  onCurrentChange,
-} = usePaginationApi(
-  listPage,
-  {
-    expenseMethod: undefined,
-    entryDate: undefined,
-  },
-  [
-    {
-      label: "鏀嚭鏃ユ湡",
-      prop: "expenseDate",
-    },
-    {
-      label: "鏀嚭绫诲瀷",
-      align: "center",
-      prop: "expenseType",
-      dataType: "tag",
-      formatData: (params) => {
-        if (expense_types.value.find((m) => m.value == params)) {
-          return expense_types.value.find((m) => m.value == params).label;
-        } else {
-          return null
-        }
-      },
-    },
-    {
-      label: "渚涘簲鍟嗗悕绉�",
-      prop: "supplierName",
-
-    },
-    {
-      label: "鏀嚭閲戦",
-      prop: "expenseMoney",
-
-    },
-    {
-      label: "鏀嚭鎻忚堪",
-      prop: "expenseDescribed",
-
-    },
-    {
-      label: "浠樻鏂瑰紡",
-      align: "center",
-      prop: "expenseMethod",
-			width: '120',
-      dataType: "tag",
-      formatData: (params) => {
-        if (checkout_payment.value.find((m) => m.value == params)) {
-          return checkout_payment.value.find((m) => m.value == params).label;
-        } else {
-          return null
-        }
-      },
-    },
-    {
-      label: "鍙戠エ鍙风爜",
-      prop: "invoiceNumber",
-
-    },
-    {
-      label: "澶囨敞",
-      prop: "note",
-
-    },
-    {
-      label: "褰曞叆浜�",
-      prop: "inputUser",
-    },
-    {
-      label: "褰曞叆鏃ユ湡",
-      prop: "inputTime",
-
-    },
-    {
-      fixed: "right",
-      label: "鎿嶄綔",
-      dataType: "slot",
-      slot: "operation",
-      align: "center",
-      width: "160px",
-    },
-  ]
-);
-
-// 琛ㄦ牸鍚堣锛氭敮鍑洪噾棰�
-const summarizeMainTable = (param) => {
-  return proxy.summarizeTable(param, ["expenseMoney"]);
-};
-
-// 澶氶�夊悗鍋氫粈涔�
-const handleSelectionChange = (selectionList) => {
-  multipleList.value = selectionList;
-};
-
-// 鍒ゆ柇閫変腑鐨勯」涓槸鍚︽湁 businessId
-const hasBusinessIdInSelection = computed(() => {
-  return multipleList.value.some(item => item.businessId);
-});
-
-const add = () => {
-  modalRef.value.openModal();
-};
-const edit = (id) => {
-  // 妫�鏌ュ綋鍓嶈鏄惁鏈� businessId
-  const row = dataList.value.find(item => item.id === id);
-  if (row && row.businessId) {
-    proxy.$modal.msgWarning("璇ヨ褰曞凡鍏宠仈涓氬姟锛屼笉鑳界紪杈�");
-    return;
-  }
-  modalRef.value.loadForm(id);
-};
-const changePage = ({ page, limit }) => {
-  pagination.currentPage = page;
-	pagination.pageSize = limit;
-  onCurrentChange(page);
-};
-const deleteRow = (id) => {
-  // 濡傛灉鏄暟缁勶紝妫�鏌ユ槸鍚︽湁 businessId
-  if (Array.isArray(id)) {
-    const hasBusinessId = id.some(itemId => {
-      const row = dataList.value.find(item => item.id === itemId);
-      return row && row.businessId;
-    });
-    if (hasBusinessId) {
-      proxy.$modal.msgWarning("閫変腑鐨勮褰曚腑鍖呭惈宸插叧鑱斾笟鍔$殑璁板綍锛屼笉鑳藉垹闄�");
-      return;
-    }
-  } else {
-    // 鍗曚釜鍒犻櫎锛屾鏌ユ槸鍚︽湁 businessId
-    const row = dataList.value.find(item => item.id === id);
-    if (row && row.businessId) {
-      proxy.$modal.msgWarning("璇ヨ褰曞凡鍏宠仈涓氬姟锛屼笉鑳藉垹闄�");
-      return;
-    }
-  }
-  
-  ElMessageBox.confirm("姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ユ暟鎹�, 鏄惁缁х画?", "鎻愮ず", {
-    confirmButtonText: "纭畾",
-    cancelButtonText: "鍙栨秷",
-    type: "warning",
-  }).then(async () => {
-    const { code } = await delAccountExpense(id);
-    if (code == 200) {
-      ElMessage({
-        type: "success",
-        message: "鍒犻櫎鎴愬姛",
-      });
-      getTableData();
-    }
-  });
-};
-
-// 鎵归噺鍒犻櫎
-const handleBatchDelete = () => {
-  if (multipleList.value.length === 0) {
-    proxy.$modal.msgWarning("璇烽�夋嫨瑕佸垹闄ょ殑鏁版嵁");
-    return;
-  }
-  
-  // 妫�鏌ユ槸鍚︽湁 businessId
-  if (hasBusinessIdInSelection.value) {
-    proxy.$modal.msgWarning("閫変腑鐨勮褰曚腑鍖呭惈宸插叧鑱斾笟鍔$殑璁板綍锛屼笉鑳藉垹闄�");
-    return;
-  }
-  
-  const ids = multipleList.value.map((item) => item.id);
-  deleteRow(ids);
-};
-
-const changeDaterange = (value) => {
-  if (value) {
-    filters.entryDate = value;
-    filters.entryDateStart = dayjs(value[0]).format("YYYY-MM-DD");
-    filters.entryDateEnd = dayjs(value[1]).format("YYYY-MM-DD");
-  } else {
-    filters.entryDate = null;
-    filters.entryDateStart = undefined;
-    filters.entryDateEnd = undefined;
-  }
-  getTableData();
-};
-
-const handleOut = () => {
-  ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
-    confirmButtonText: "纭",
-    cancelButtonText: "鍙栨秷",
-    type: "warning",
-  })
-    .then(() => {
-      proxy.download(`/account/accountExpense/export`, {}, "鏀嚭鍙拌处.xlsx");
-    })
-    .catch(() => {
-      proxy.$modal.msg("宸插彇娑�");
-    });
-};
-
-// 鎵撳紑闄勪欢寮圭獥
-const recordId =ref(0)
-const fileDialogVisible = ref(false)
-
-// 鎵撳紑闄勪欢寮规
-const openFilesFormDia = async (row) => {
-  recordId.value = row.id
-  fileDialogVisible.value = true
-}
-
-onMounted(() => {
-  getTableData();
-});
-</script>
-
-<style lang="scss" scoped>
-.table_list {
-  margin-top: unset;
-}
-.actions {
-  display: flex;
-  justify-content: space-between;
-  margin-bottom: 10px;
-}
-</style>
-
diff --git a/src/views/financialManagement/financialStatements/index.vue b/src/views/financialManagement/financialStatements/index.vue
index cf4eee5..5dbce9b 100644
--- a/src/views/financialManagement/financialStatements/index.vue
+++ b/src/views/financialManagement/financialStatements/index.vue
@@ -1,160 +1,186 @@
- <template>
+<template>
   <div style="padding: 20px;">
     <!-- 椤甸潰鏍囬鍜屾湀浠界瓫閫� -->
-    <div class="w-full md:w-auto flex items-center gap-3" style="margin-bottom: 20px;">
-      <el-date-picker
-        v-model="dateRange"
-        type="monthrange"
-        format="YYYY-MM"
-        value-format="YYYY-MM"
-        range-separator="鑷�"
-        start-placeholder="寮�濮嬫湀浠�"
-        end-placeholder="缁撴潫鏈堜唤"
-        :disabled-date="disabledDate"
-        @change="handleDateChange"
-        class="w-full md:w-auto"
-        style="margin-right: 30px;"
-      />
-      
-      <el-button 
-        type="primary" 
-        icon="Refresh" 
-        @click="resetDateRange"
-        size="default"
-      >
+    <div class="w-full md:w-auto flex items-center gap-3"
+         style="margin-bottom: 20px;">
+      <el-date-picker v-model="dateRange"
+                      type="monthrange"
+                      format="YYYY-MM"
+                      value-format="YYYY-MM"
+                      range-separator="鑷�"
+                      start-placeholder="寮�濮嬫湀浠�"
+                      end-placeholder="缁撴潫鏈堜唤"
+                      :disabled-date="disabledDate"
+                      @change="handleDateChange"
+                      class="w-full md:w-auto"
+                      style="margin-right: 30px;" />
+      <el-button type="primary"
+                 icon="Refresh"
+                 @click="resetDateRange"
+                 size="default">
         閲嶇疆
       </el-button>
     </div>
-    
     <main class="container mx-auto px-4 pb-10">
       <!-- 璐㈠姟鎸囨爣鍗$墖 -->
       <div class="stats-cards">
-        <!-- 鎬昏惀鏀� -->
         <div class="stat-card stat-card-blue">
-          <div class="stat-icon">
-            <img src="@/assets/icons/png/walletBlue@2x.png" alt="鎬昏惀鏀�" />
-          </div>
+          <div class="stat-icon"><img src="@/assets/icons/png/walletBlue@2x.png"
+                 alt="鎬昏惀鏀�" /></div>
           <div class="stat-content">
             <div class="stat-label">鎬昏惀鏀�</div>
-            <div class="stat-value">{{ formatMoney(pageInfo.totalIncome || 0) }} 鍏�</div>
+            <div class="stat-value">{{ formatMoney(pageInfo.totalIncome || 0) }}{{ Math.abs(pageInfo.totalIncome) < 10000 ? ' 鍏�' : '' }}</div>
           </div>
         </div>
-        
-        <!-- 鎬绘敮鍑� -->
         <div class="stat-card stat-card-orange">
-          <div class="stat-icon">
-            <img src="@/assets/icons/png/walletOrange@2x.png" alt="鎬绘敮鍑�" />
-          </div>
+          <div class="stat-icon"><img src="@/assets/icons/png/walletOrange@2x.png"
+                 alt="鎬绘敮鍑�" /></div>
           <div class="stat-content">
             <div class="stat-label">鎬绘敮鍑�</div>
-            <div class="stat-value">{{ formatMoney(pageInfo.totalExpense || 0) }} 鍏�</div>
+            <div class="stat-value">{{ formatMoney(pageInfo.totalExpense || 0) }}{{ Math.abs(pageInfo.totalExpense) < 10000 ? ' 鍏�' : '' }}</div>
           </div>
         </div>
-        
-        <!-- 鎬绘敹鍏ョ瑪鏁� -->
         <div class="stat-card stat-card-green">
-          <div class="stat-icon">
-            <img src="@/assets/icons/png/walletGreen@2x.png" alt="鎬绘敹鍏ョ瑪鏁�" />
-          </div>
+          <div class="stat-icon"><img src="@/assets/icons/png/walletGreen@2x.png"
+                 alt="搴旀敹璐︽" /></div>
           <div class="stat-content">
-            <div class="stat-label">鎬绘敹鍏ョ瑪鏁�</div>
-            <div class="stat-value">{{ pageInfo.incomeNumber || 0 }} 绗�</div>
+            <div class="stat-label">搴旀敹璐︽</div>
+            <div class="stat-value">{{ formatMoney(pageInfo.totalReceivable || 0) }}{{ Math.abs(pageInfo.totalReceivable) < 10000 ? ' 鍏�' : '' }}</div>
           </div>
         </div>
-        
-        <!-- 鎬绘敮鍑虹瑪鏁� -->
         <div class="stat-card stat-card-red">
-          <div class="stat-icon">
-            <img src="@/assets/icons/png/walletRed@2x.png" alt="鎬绘敮鍑虹瑪鏁�" />
-          </div>
+          <div class="stat-icon"><img src="@/assets/icons/png/walletRed@2x.png"
+                 alt="搴斾粯璐︽" /></div>
           <div class="stat-content">
-            <div class="stat-label">鎬绘敮鍑虹瑪鏁�</div>
-            <div class="stat-value">{{ pageInfo.expenseNumber || 0 }} 绗�</div>
+            <div class="stat-label">搴斾粯璐︽</div>
+            <div class="stat-value">{{ formatMoney(pageInfo.totalPayable || 0) }}{{ Math.abs(pageInfo.totalPayable) < 10000 ? ' 鍏�' : '' }}</div>
           </div>
         </div>
-        
-        <!-- 鍑�鏀跺叆 -->
         <div class="stat-card stat-card-yellow">
-          <div class="stat-icon">
-            <img src="@/assets/icons/png/walletYellow@2x.png" alt="鍑�鏀跺叆" />
-          </div>
+          <div class="stat-icon"><img src="@/assets/icons/png/walletYellow@2x.png"
+                 alt="鍑�鍒╂鼎" /></div>
           <div class="stat-content">
-            <div class="stat-label">鍑�鏀跺叆</div>
-            <div class="stat-value">{{ formatMoney(pageInfo.netRevenue || 0) }} 鍏�</div>
+            <div class="stat-label">鍑�鍒╂鼎</div>
+            <div class="stat-value">{{ formatMoney(pageInfo.netRevenue || 0) }}{{ Math.abs(pageInfo.netRevenue) < 10000 ? ' 鍏�' : '' }}</div>
           </div>
         </div>
       </div>
-      
-      <!-- 涓棿鍥捐〃鍖哄煙 -->
+      <!-- 鍥捐〃鍖哄煙 -->
       <div class="charts-row">
-        <!-- 宸︿晶锛氭敹鍏ユ敮鍑哄垎鏋� -->
+        <!-- 1. 鏀舵敮鏋勬垚鍒嗘瀽 (鍙岀幆褰㈠浘 + 鍑�鍒╀腑蹇�) -->
         <el-card class="chart-card">
-          <h2 class="section-title">鏀跺叆鏀嚭鍒嗘瀽</h2>
-          <div class="pie-chart-container">
-            <Echarts 
-              :legend="pieLegendIncomeExpense" 
-              :chartStyle="chartStylePie"
-              :series="pieSeriesIncomeExpense"
-              :tooltip="pieTooltipIncomeExpense" 
-              style="height: 320px; width: 100%;">
-            </Echarts>
-            <div class="pie-stats">
-              <div class="bar-stat-item">
-                <span class="bar-stat-label">鏀跺叆鏁伴噺</span>
-                <span class="bar-stat-value">{{ pageInfo.incomeNumber || 0 }}</span>
+          <template #header>
+            <div class="card-header">
+              <span class="header-title">鏀舵敮鏋勬垚鍙婂噣鍒╁垎鏋�</span>
+              <el-tooltip content="宸︿晶涓烘敹鍏ユ瀯鎴愶紝鍙充晶涓烘敮鍑烘瀯鎴愶紝涓棿灞曠ず鐩堜簭鍑�棰�"
+                          placement="top">
+                <el-icon>
+                  <QuestionFilled />
+                </el-icon>
+              </el-tooltip>
+            </div>
+          </template>
+          <div class="financial-overview-container">
+            <!-- 鏀跺叆灞曠ず (宸︿晶) -->
+            <div style="width:60%">
+              <div class="overview-item income"
+                   style="margin-bottom: 20px;">
+                <div class="overview-box">
+                  <div class="icon-circle">
+                    <el-icon>
+                      <TrendCharts />
+                    </el-icon>
+                  </div>
+                  <div class="data-content">
+                    <div class="label">鏈湡鎬绘敹鍏�</div>
+                    <div class="value">{{ formatMoney(pageInfo.totalIncome) }}</div>
+                    <div class="unit">RMB{{ Math.abs(pageInfo.totalIncome) < 10000 ? ' / 鍏�' : '' }}</div>
+                  </div>
+                  <div class="bg-decoration">INCOME</div>
+                </div>
               </div>
-              <div class="bar-stat-item">
-                <span class="bar-stat-label">鏀嚭鏁伴噺</span>
-                <span class="bar-stat-value">{{ pageInfo.expenseNumber || 0 }}</span>
+              <div class="overview-item expense">
+                <div class="overview-box">
+                  <div class="icon-circle">
+                    <el-icon>
+                      <Sell />
+                    </el-icon>
+                  </div>
+                  <div class="data-content">
+                    <div class="label">鏈湡鎬绘敮鍑�</div>
+                    <div class="value">{{ formatMoney(pageInfo.totalExpense) }}</div>
+                    <div class="unit">RMB{{ Math.abs(pageInfo.totalExpense) < 10000 ? ' / 鍏�' : '' }}</div>
+                  </div>
+                  <div class="bg-decoration">EXPENSE</div>
+                </div>
               </div>
             </div>
+            <!-- 鍑�鍒╂鼎鏍稿績鎸囩ず (涓棿) -->
+            <div class="profit-indicator">
+              <div class="profit-gauge-wrapper">
+                <Echarts :chartStyle="chartStylePie"
+                         :series="profitGaugeSeries"
+                         :tooltip="gaugeTooltip"
+                         style="height: 200px; width: 100%; max-width: 200px;">
+                </Echarts>
+                <div class="profit-center-text">
+                  <div class="label">鍑�鍒╂鼎</div>
+                  <div class="value"
+                       :class="pageInfo.netRevenue >= 0 ? 'plus' : 'minus'">
+                    {{ pageInfo.netRevenue >= 0 ? '+' : '' }}{{ formatMoney(pageInfo.netRevenue) }}
+                  </div>
+                  <div class="rate">鍒╂鼎鐜�: {{ pageInfo.totalIncome > 0 ? ((pageInfo.netRevenue / pageInfo.totalIncome) * 100).toFixed(1) : 0 }}%</div>
+                </div>
+              </div>
+            </div>
+            <!-- 鏀嚭灞曠ず (鍙充晶) -->
           </div>
         </el-card>
-        
-        <!-- 鍙充晶锛氳椤圭泩鍒╁垎鏋� -->
+        <!-- 2. 搴旀敹/搴斾粯瀵瑰啿鍒嗘瀽 (鏌辩姸鍥�) -->
         <el-card class="chart-card">
-          <h2 class="section-title">琛岄」鐩堝埄鍒嗘瀽</h2>
-          <div class="bar-chart-header">
-            <div class="bar-stat-item">
-              <span class="bar-stat-label">褰撳墠鎬讳釜鏁�</span>
-              <span class="bar-stat-value">{{ allBarTypes.value?.length || 0 }}</span>
+          <template #header>
+            <div class="card-header">
+              <span class="header-title">搴旀敹/搴斾粯姒傝</span>
+              <el-tooltip content="瀵规瘮褰撳墠鍚勬湀浠界殑搴旀敹璐︽涓庡簲浠樿处娆�"
+                          placement="top">
+                <el-icon>
+                  <QuestionFilled />
+                </el-icon>
+              </el-tooltip>
             </div>
-            <div class="bar-stat-item">
-              <span class="bar-stat-label">鏀嚭閲戦</span>
-              <span class="bar-stat-value">{{ formatMoney(pageInfo.totalExpense || 0) }}</span>
-            </div>
-            <div class="bar-stat-item">
-              <span class="bar-stat-label">鏀跺叆閲戦</span>
-              <span class="bar-stat-value">{{ formatMoney(pageInfo.totalIncome || 0) }}</span>
-            </div>
-          </div>
-          <Echarts 
-            ref="barChart"
-            :chartStyle="chartStyle"
-            :grid="barGrid"
-            :legend="barLegend"
-            :series="barSeries"
-            :tooltip="barTooltip"
-            :xAxis="barXAxis"
-            :yAxis="barYAxis"
-            style="height: 300px; width: 100%;">
+          </template>
+          <Echarts :chartStyle="chartStyle"
+                   :grid="barGrid"
+                   :legend="barLegend"
+                   :series="barSeries"
+                   :tooltip="barTooltip"
+                   :xAxis="barXAxis"
+                   :yAxis="barYAxis"
+                   style="height: 270px; width: 100%;">
           </Echarts>
         </el-card>
       </div>
-      
-      <!-- 搴曢儴锛氳惀鏀惰秼鍔垮垎鏋� -->
+      <!-- 3. 璐㈠姟缁煎悎瓒嬪娍鍒嗘瀽 (鎶樼嚎鍥�) -->
       <el-card class="trend-chart-card">
-        <h2 class="section-title">钀ユ敹瓒嬪娍鍒嗘瀽</h2>
-        <Echarts 
-          ref="trendChart"
-          :chartStyle="chartStyle"
-          :grid="grid"
-          :legend="trendLegend"
-          :series="trendSeries"
-          :tooltip="tooltip"
-          :xAxis="xAxis0"
-          :yAxis="trendYAxis"
-          style="height: 350px; width: 100%;">
+        <template #header>
+          <div class="card-header">
+            <span class="header-title">璐㈠姟缁╂晥缁煎悎瓒嬪娍</span>
+            <el-tooltip content="灞曠ず鏀跺叆銆佹敮鍑哄強鍑�鍒╂鼎鐨勬湀搴﹀彉鍖栬秼鍔�"
+                        placement="top">
+              <el-icon>
+                <QuestionFilled />
+              </el-icon>
+            </el-tooltip>
+          </div>
+        </template>
+        <Echarts :chartStyle="chartStyle"
+                 :grid="trendGrid"
+                 :legend="trendLegend"
+                 :series="trendSeries"
+                 :tooltip="trendTooltip"
+                 :xAxis="trendXAxis"
+                 :yAxis="trendYAxis"
+                 style="height: 350px; width: 100%;">
         </Echarts>
       </el-card>
     </main>
@@ -162,833 +188,461 @@
 </template>
 
 <script setup>
-import { ref, computed, onMounted, reactive, nextTick, getCurrentInstance } from 'vue';
-import 'element-plus/dist/index.css';
-import Echarts from "@/components/Echarts/echarts.vue";
-import { reportForms,reportIncome,reportExpense } from "@/api/financialManagement/financialStatements";
-import dayjs from "dayjs";
+  import {
+    ref,
+    computed,
+    onMounted,
+    reactive,
+    nextTick,
+    getCurrentInstance,
+  } from "vue";
+  import { QuestionFilled, TrendCharts, Sell } from "@element-plus/icons-vue";
+  import Echarts from "@/components/Echarts/echarts.vue";
+  import { accountStatementDetailsByMonth } from "@/api/financialManagement/financialStatements";
+  import dayjs from "dayjs";
 
-// 鏃ユ湡鑼冨洿
-const dateRange = ref(null);
-const { proxy } = getCurrentInstance();
-const chartStyle = {
-	width: '100%',
-	height: '100%', // 璁剧疆鍥捐〃瀹瑰櫒鐨勯珮搴�
-  position:'relative',
-}
-const grid = {
-	left: '3%',
-		right: '4%',
-		bottom: '3%',
-		containLabel: true
-}
-const lineLegend = {
-	show: false,
-}
-// 鎶樼嚎鍥炬彁绀烘
-const tooltip = reactive({
-  trigger: 'axis',
-  axisPointer: {
-    type: 'line',
-    lineStyle: { color: '#aaa' }
-  },
-  // 鑷畾涔夊唴瀹�
-  formatter: function (params) {
-    if (!params || !params.length) return ''
-    const axisLabel = params[0].axisValueLabel || params[0].axisValue || ''
-    const rows = params
-      .map(p => {
-        const colorDot = `<span style="display:inline-block;margin-right:6px;width:8px;height:8px;border-radius:50%;background:${p.color}"></span>`
-        return `${colorDot}${p.seriesName}: ${p.value}`
-      })
-      .join('<br/>')
-    return `<div>${axisLabel}</div><div>${rows}</div>`
-  }
-})
-const lineSeries0 = ref([])
-const lineSeries1 = ref([])
+  const { proxy } = getCurrentInstance();
+  const dateRange = ref(null);
+  const pageInfo = reactive({
+    totalIncome: 0,
+    totalExpense: 0,
+    totalReceivable: 0,
+    totalPayable: 0,
+    netRevenue: 0,
+  });
 
-// 鏍规嵁鏈堜唤鑼冨洿鐢熸垚 x 杞存暟鎹�
-const generateMonthLabels = (startMonth, endMonth) => {
-  const labels = [];
-  let current = dayjs(startMonth);
-  const end = dayjs(endMonth);
-  
-  while (current.isBefore(end) || current.isSame(end, 'month')) {
-    labels.push(`${current.month() + 1}鏈坄);
-    current = current.add(1, 'month');
-  }
-  
-  return labels;
-};
+  const chartStyle = { width: "100%", height: "100%", position: "relative" };
+  const chartStylePie = { width: "100%", height: "100%" };
 
-const xAxis0 = ref([
-  {
-    type: 'category',
-    axisTick: { show: true, alignWithLabel: true },
-    data: [],
-  },
-]);
-const xAxis1 = ref([
-  {
-    type: 'category',
-    axisTick: { show: true, alignWithLabel: true },
-    data: [],
-  },
-]);
-const yAxis0 = [
-{
-    type: 'value',
-    name: '鏀跺叆缁熻', // 宸︿晶y杞�
-    position: 'left',
-    min: 0,
-    // 鍧愭爣杞村悕绉版牱寮�
-    nameTextStyle: {
-      color: '#000',
-      fontSize: 14,
-    },
-  }
-]
+  const monthlyTrendList = ref([]);
+  const receivablePayableList = ref([]);
 
-const yAxis1 = [
-{
-    type: 'value',
-    name: '鏀嚭缁熻', // 宸︿晶y杞�
-    position: 'left',
-    min: 0,
-    // 鍧愭爣杞村悕绉版牱寮�
-    nameTextStyle: {
-      color: '#000',
-      fontSize: 14,
-    },
-  }
-]
+  // --- 1. 鏀舵敮鏋勬垚鍒嗘瀽 (绠�鍖栫増閫昏緫) ---
+  const gaugeTooltip = { show: false };
 
-const chartStylePie = {
-	width: '100%',
-	height: '100%' // 璁剧疆鍥捐〃瀹瑰櫒鐨勯珮搴�
-}
-const pieColors = ['#F04864','#FACC14', '#8543E0', '#1890FF', '#13C2C2','#2FC25B']; // 鍙牴鎹疄闄呰皟鏁�
-const pieData0 = ref([]);
-const pieData1 = ref([]);
-
-const pieLegend0 = computed(() => ({
-  show: true,
-  top: 'center',
-  left: '60%',
-  orient: 'vertical',
-  icon: 'circle',
-  data: (pieData0.value || []).filter(item => item && item.name).map(item => item.name),
-  formatter: function(name) {
-    if (!name) return '';
-    const item = pieData0.value.find(i => i && i.name === name);
-    if (!item) return name;
-    return `${name} | ${item.percent} ${item.amount}`;
-  },
-  textStyle: {
-    color: '#333',
-    fontSize: 14,
-    lineHeight: 26,
-  }
-}));
-const pieLegend1 = computed(() => ({
-  show: true,
-  top: 'center',
-  left: '60%',
-  orient: 'vertical',
-  icon: 'circle',
-  data: (pieData1.value || []).filter(item => item && item.name).map(item => item.name),
-  formatter: function(name) {
-    if (!name) return '';
-    const item = pieData1.value.find(i => i && i.name === name);
-    if (!item) return name;
-    return `${name} | ${item.percent} ${item.amount}`;
-  },
-  textStyle: {
-    color: '#333',
-    fontSize: 14,
-    lineHeight: 26,
-  }
-}));
-
-const materialPieSeries0 = computed(() => [
-  {
-    type: 'pie',
-    radius: ['50%', '65%'],
-    center: ['25%', '50%'],
-    avoidLabelOverlap: false,
-    itemStyle: {
-      borderColor: '#fff',
-      borderWidth: 2
-    },
-    label: {
-      show: false
-    },
-    data: (pieData0.value || []).filter(item => item && item.name),
-    color: pieColors
-  }
-]);
-const materialPieSeries1 = computed(() => [
-  {
-    type: 'pie',
-    radius: ['50%', '65%'],
-    center: ['25%', '50%'],
-    avoidLabelOverlap: false,
-    itemStyle: {
-      borderColor: '#fff',
-      borderWidth: 2
-    },
-    label: {
-      show: false
-    },
-    data: (pieData1.value || []).filter(item => item && item.name),
-    color: pieColors
-  }
-]);
-const pieTooltip = reactive({
-	trigger: 'item',
-  formatter: function(params) {
-    // 妫�鏌ユ暟鎹槸鍚﹀瓨鍦�
-    if (!params.data) return params.name;
-    // 鎷兼帴瀹屾暣鍐呭
-    return `
-      <div>
-        <div style="color:${params.color};font-size:16px;">鈼�</div>
-        <div>${params.name}</div>
-        <div>鍗犳瘮锛�${params.data.percent}</div>
-        <div>閲戦锛�${params.data.amount}</div>
-      </div>
-    `;
-  }
-})
-
-
-const pageInfo = ref({
-})
-
-// 鏍煎紡鍖栭噾棰�
-const formatMoney = (value) => {
-  if (!value && value !== 0) return '0';
-  return Number(value).toLocaleString('zh-CN', { minimumFractionDigits: 2, maximumFractionDigits: 2 });
-};
-
-// 鏀跺叆鏀嚭鍒嗘瀽楗煎浘
-const pieDataIncomeExpense = computed(() => {
-  const totalIncome = Number(pageInfo.value.totalIncome) || 0;
-  const totalExpense = Number(pageInfo.value.totalExpense) || 0;
-  const total = totalIncome + totalExpense;
-  if (total === 0) {
-    return [
-      { name: '鏀跺叆', value: 0, percent: '0%' },
-      { name: '鏀嚭', value: 0, percent: '0%' }
-    ];
-  }
-  const incomePercent = ((totalIncome / total) * 100).toFixed(0);
-  const expensePercent = ((totalExpense / total) * 100).toFixed(0);
-  return [
-    { name: '鏀跺叆', value: totalIncome, percent: `${incomePercent}%` },
-    { name: '鏀嚭', value: totalExpense, percent: `${expensePercent}%` }
-  ];
-});
-
-const pieLegendIncomeExpense = computed(() => ({
-  show: false
-}));
-
-const pieTooltipIncomeExpense = reactive({
-  trigger: 'item',
-  formatter: function(params) {
-    if (!params.data) return params.name;
-    return `${params.name}鍗犳瘮 ${params.percent}%`;
-  }
-});
-
-const pieSeriesIncomeExpense = computed(() => [
-  {
-    type: 'pie',
-    radius: ['0%', '70%'],
-    center: ['50%', '50%'],
-    avoidLabelOverlap: true,
-    itemStyle: {
-      borderColor: '#fff',
-      borderWidth: 2
-    },
-    label: {
-      show: true,
-      position: 'outside',
-      formatter: function(params) {
-        return `${params.name}鍗犳瘮 ${params.percent}%`;
-      },
-      fontSize: 14,
-      color: '#333'
-    },
-    labelLine: {
-      show: true,
-      length: 15,
-      length2: 10,
-      lineStyle: {
-        color: '#333'
-      }
-    },
-    emphasis: {
-      label: {
-        show: true,
-        fontSize: 16,
-        fontWeight: 'bold'
-      }
-    },
-    data: pieDataIncomeExpense.value,
-    color: ['#1890FF', '#FACC14']
-  }
-]);
-
-// 琛岄」鐩堝埄鍒嗘瀽鏌辩姸鍥�
-const barXAxis = computed(() => {
-  return [{
-    type: 'category',
-    data: (allBarTypes.value && allBarTypes.value.length > 0) ? allBarTypes.value : ['椤圭洰1', '椤圭洰2', '椤圭洰3', '椤圭洰4', '椤圭洰5', '椤圭洰6', '椤圭洰7'],
-    axisTick: { show: true, alignWithLabel: true },
-  }];
-});
-
-const barYAxis = [{
-  type: 'value',
-  name: '鍗曚綅: 鍏�',
-  position: 'left',
-  min: 0,
-  nameTextStyle: {
-    color: '#000',
-    fontSize: 14,
-  },
-}];
-
-const barGrid = {
-  left: '3%',
-  right: '4%',
-  bottom: '3%',
-  containLabel: true
-};
-
-const barLegend = {
-  show: true,
-  top: 10,
-  right: 10,
-};
-
-// 鑾峰彇鎵�鏈夌被鍨嬪悕绉�
-const allBarTypes = computed(() => {
-  const incomeTypes = (lineSeries0.value || []).map(item => item.name || item.typeName).filter(Boolean);
-  const expenseTypes = (lineSeries1.value || []).map(item => item.name || item.typeName).filter(Boolean);
-  return [...new Set([...incomeTypes, ...expenseTypes])];
-});
-
-const barSeries = computed(() => {
-  if (allBarTypes.value.length === 0) {
+  const profitGaugeSeries = computed(() => {
+    const rate =
+      pageInfo.totalIncome > 0
+        ? (pageInfo.netRevenue / pageInfo.totalIncome) * 100
+        : 0;
     return [
       {
-        name: '鏀嚭',
-        type: 'bar',
-        data: [],
-        itemStyle: { color: '#1890FF' }
+        type: "gauge",
+        startAngle: 210,
+        endAngle: -30,
+        min: 0,
+        max: 100,
+        splitNumber: 10,
+        radius: "100%",
+        progress: {
+          show: true,
+          width: 14,
+          itemStyle: { color: pageInfo.netRevenue >= 0 ? "#10b981" : "#f43f5e" },
+        },
+        pointer: { show: false },
+        axisLine: { lineStyle: { width: 14, color: [[1, "#f1f5f9"]] } },
+        axisTick: { show: false },
+        splitLine: { show: false },
+        axisLabel: { show: false },
+        anchor: { show: false },
+        title: { show: false },
+        detail: { show: false },
+        data: [{ value: Math.max(0, Math.min(100, rate)) }],
       },
-      {
-        name: '鏀跺叆',
-        type: 'bar',
-        data: [],
-        itemStyle: { color: '#13C2C2' }
-      }
     ];
-  }
-  
-  // 璁$畻姣忎釜椤圭洰鐨勬�绘敹鍏ワ紙姹囨�绘墍鏈夋湀浠斤級
-  const incomeData = allBarTypes.value.map(typeName => {
-    const incomeItem = (lineSeries0.value || []).find(item => (item.name || item.typeName) === typeName);
-    if (incomeItem && incomeItem.data && Array.isArray(incomeItem.data)) {
-      return incomeItem.data.reduce((sum, val) => sum + (Number(val) || 0), 0);
-    }
-    return 0;
   });
-  
-  // 璁$畻姣忎釜椤圭洰鐨勬�绘敮鍑猴紙姹囨�绘墍鏈夋湀浠斤級
-  const expenseData = allBarTypes.value.map(typeName => {
-    const expenseItem = (lineSeries1.value || []).find(item => (item.name || item.typeName) === typeName);
-    if (expenseItem && expenseItem.data && Array.isArray(expenseItem.data)) {
-      return expenseItem.data.reduce((sum, val) => sum + (Number(val) || 0), 0);
-    }
-    return 0;
-  });
-  
-  return [
+
+  // --- 2. 搴旀敹/搴斾粯姒傝 (鏌辩姸鍥�) ---
+  const barGrid = { left: "3%", right: "4%", bottom: "3%", containLabel: true };
+  const barLegend = { top: "0", right: "center" };
+  const barXAxis = computed(() => [
     {
-      name: '鏀嚭',
-      type: 'bar',
-      data: expenseData,
-      itemStyle: { color: '#1890FF' }
+      type: "category",
+      data: receivablePayableList.value.map(item => item.month || ""),
+      axisTick: { alignWithLabel: true },
+    },
+  ]);
+  const barYAxis = [{ type: "value", name: "閲戦 (鍏�)" }];
+  const barTooltip = { trigger: "axis", axisPointer: { type: "shadow" } };
+  const barSeries = computed(() => [
+    {
+      name: "搴旀敹璐︽",
+      type: "bar",
+      barWidth: "30%",
+      data: receivablePayableList.value.map(item => item.receivable || 0),
+      itemStyle: { color: "#10b981" },
     },
     {
-      name: '鏀跺叆',
-      type: 'bar',
-      data: incomeData,
-      itemStyle: { color: '#13C2C2' }
-    }
-  ];
-});
+      name: "搴斾粯璐︽",
+      type: "bar",
+      barWidth: "30%",
+      data: receivablePayableList.value.map(item => item.payable || 0),
+      itemStyle: { color: "#ef4444" },
+    },
+  ]);
 
-const barTooltip = reactive({
-  trigger: 'axis',
-  axisPointer: {
-    type: 'shadow'
-  },
-  formatter: function (params) {
-    if (!params || !params.length) return '';
-    const axisLabel = params[0].axisValueLabel || params[0].axisValue || '';
-    const rows = params
-      .map(p => {
-        const colorDot = `<span style="display:inline-block;margin-right:6px;width:8px;height:8px;border-radius:50%;background:${p.color}"></span>`;
-        const value = typeof p.value === 'number' ? p.value.toFixed(2) : p.value;
-        return `${colorDot}${p.seriesName} ${value}`;
-      })
-      .join('<br/>');
-    return `<div>${axisLabel}</div><div>${rows}</div>`;
-  }
-});
-
-// 钀ユ敹瓒嬪娍鍒嗘瀽
-const trendLegend = {
-  show: true,
-  top: 10,
-  right: 10,
-};
-
-const trendYAxis = [{
-  type: 'value',
-  name: '鍗曚綅: 鍏�',
-  position: 'left',
-  min: 0,
-  nameTextStyle: {
-    color: '#000',
-    fontSize: 14,
-  },
-}];
-
-const trendSeries = computed(() => {
-  // 姹囨�绘墍鏈夋敮鍑虹被鍨嬬殑鏁版嵁
-  let expenseTrend = [];
-  if (lineSeries1.value.length > 0) {
-    const monthCount = Math.max(...lineSeries1.value.map(item => item.data?.length || 0));
-    expenseTrend = Array(monthCount).fill(0);
-    lineSeries1.value.forEach(item => {
-      if (item.data && Array.isArray(item.data)) {
-        item.data.forEach((val, index) => {
-          if (index < monthCount) {
-            expenseTrend[index] += Number(val) || 0;
-          }
-        });
-      }
-    });
-  }
-  
-  // 姹囨�绘墍鏈夋敹鍏ョ被鍨嬬殑鏁版嵁
-  let incomeTrend = [];
-  if (lineSeries0.value.length > 0) {
-    const monthCount = Math.max(...lineSeries0.value.map(item => item.data?.length || 0));
-    incomeTrend = Array(monthCount).fill(0);
-    lineSeries0.value.forEach(item => {
-      if (item.data && Array.isArray(item.data)) {
-        item.data.forEach((val, index) => {
-          if (index < monthCount) {
-            incomeTrend[index] += Number(val) || 0;
-          }
-        });
-      }
-    });
-  }
-  
-  return [
+  // --- 3. 璐㈠姟缁煎悎瓒嬪娍鍒嗘瀽 (鎶樼嚎鍥�) ---
+  const trendGrid = { left: "3%", right: "4%", bottom: "3%", containLabel: true };
+  const trendLegend = { top: "0", right: "center" };
+  const trendXAxis = computed(() => [
     {
-      name: '鏀嚭',
-      type: 'line',
-      data: expenseTrend,
-      itemStyle: { color: '#1890FF' },
-      smooth: true
+      type: "category",
+      boundaryGap: false,
+      data: monthlyTrendList.value.map(item => item.month || ""),
+    },
+  ]);
+  const trendYAxis = [{ type: "value", name: "閲戦 (鍏�)" }];
+  const trendTooltip = { trigger: "axis" };
+  const trendSeries = computed(() => [
+    {
+      name: "鎬昏惀鏀�",
+      type: "line",
+      smooth: true,
+      data: monthlyTrendList.value.map(item => item.income || 0),
+      itemStyle: { color: "#4f46e5" },
+      areaStyle: { opacity: 0.1 },
     },
     {
-      name: '鏀跺叆',
-      type: 'line',
-      data: incomeTrend,
-      itemStyle: { color: '#13C2C2' },
-      smooth: true
-    }
-  ];
-});
+      name: "鎬绘敮鍑�",
+      type: "line",
+      smooth: true,
+      data: monthlyTrendList.value.map(item => item.expense || 0),
+      itemStyle: { color: "#f97316" },
+    },
+    {
+      name: "鍑�鍒╂鼎",
+      type: "line",
+      smooth: true,
+      data: monthlyTrendList.value.map(item => item.profit || 0),
+      lineStyle: { width: 4, type: "dashed" },
+      itemStyle: { color: "#10b981" },
+    },
+  ]);
 
-// 鑾峰彇鏈�杩戝叚涓湀鐨勮寖鍥�
-const getLastSixMonths = () => {
-  const endMonth = dayjs().format('YYYY-MM');
-  const startMonth = dayjs().subtract(5, 'month').format('YYYY-MM');
-  return [startMonth, endMonth];
-};
+  // --- 鍏敤閫昏緫 ---
+  const formatMoney = val => {
+    return val;
+  };
 
-const getData = async () => {
-  if (!dateRange.value || !Array.isArray(dateRange.value) || dateRange.value.length !== 2) {
-    return;
-  }
-  const startDateStr = dateRange.value[0];
-  const endDateStr = dateRange.value[1];
-  if (!startDateStr || !endDateStr) {
-    return;
-  }
-  
-  // 楠岃瘉鏃ユ湡鏍煎紡骞惰浆鎹负瀹屾暣鏃ユ湡
-  const startDate = dayjs(startDateStr);
-  const endDate = dayjs(endDateStr);
-  if (!startDate.isValid() || !endDate.isValid()) {
-    console.error('鏃犳晥鐨勬棩鏈熸牸寮�');
-    return;
-  }
-  
-  // 鏇存柊 x 杞存暟鎹�
-  const monthLabels = generateMonthLabels(startDateStr, endDateStr);
-  xAxis0.value[0].data = monthLabels;
-  xAxis1.value[0].data = monthLabels;
-  
-  // 寮�濮嬫湀浠芥嫾鎺ョ涓�澶╋紝缁撴潫鏈堜唤鎷兼帴鏈�鍚庝竴澶�
-  const entryDateStart = startDate.startOf('month').format('YYYY-MM-DD');
-  const entryDateEnd = endDate.endOf('month').format('YYYY-MM-DD');
-  
-  try {
-    const {code,data} = await reportForms({entryDateStart, entryDateEnd});
-    if(code === 200 && data) {
-      pageInfo.value = data || {};
-      // 瀹夊叏澶勭悊鏁版嵁锛岃繃婊ゆ帀 null 鎴� undefined
-      pieData0.value = (data.incomeType || []).filter(item => item && item.typeName).map(item=>({
-        name:item.typeName || '',
-        value:item.account || 0,
-        percent:`${((item.proportion || 0) * 100).toFixed(2)}%`,
-        amount:`楼${(item.account || 0).toFixed(2)}`
-      }))
-      pieData1.value = (data.expenseType || []).filter(item => item && item.typeName).map(item=>({
-        name:item.typeName || '',
-        value:item.account || 0,
-        percent:`${((item.proportion || 0) * 100).toFixed(2)}%`,
-        amount:`楼${(item.account || 0).toFixed(2)}`
-      }))
-    }
-  } catch (error) {
-    console.error('鑾峰彇璐㈠姟鎸囨爣鏁版嵁澶辫触锛�', error);
-  }
-  try{
-    const {code,data} = await reportIncome({entryDateStart, entryDateEnd});
-    if(code==200 && data && Array.isArray(data)){
-      lineSeries0.value = data.filter(item => item && item.typeName).map(item=>({
-        name:item.typeName || '',
-        type: 'line',
-        data:(item.account || []).map(val => Number(val) || 0)
-      }))
-    }
-  }catch (error) {
-    console.error('鑾峰彇璐㈠姟鎸囨爣鏁版嵁澶辫触锛�', error);
-  }
-  try{
-    const {code,data} = await reportExpense({entryDateStart, entryDateEnd});
-    if(code==200 && data && Array.isArray(data)){
-      lineSeries1.value = data.filter(item => item && item.typeName).map(item=>({
-        name:item.typeName || '',
-        type: 'line',
-        data:(item.account || []).map(val => Number(val) || 0)
-      }))
-    }
-  }catch (error) {
-    console.error('鑾峰彇璐㈠姟鎸囨爣鏁版嵁澶辫触锛�', error);
-  }
-};
+  const handleDateChange = val => {
+    if (val) getData();
+  };
 
-
-// 鍒濆鍖�
-onMounted(() => {
-  // 璁剧疆榛樿鍊间负鏈�杩戝叚涓湀
-  const defaultRange = getLastSixMonths();
-  dateRange.value = defaultRange;
-  // 浣跨敤 nextTick 纭繚缁勪欢瀹屽叏娓叉煋鍚庡啀璋冪敤
-  nextTick(() => {
+  const resetDateRange = () => {
+    dateRange.value = [
+      dayjs().subtract(5, "month").format("YYYY-MM"),
+      dayjs().format("YYYY-MM"),
+    ];
     getData();
+  };
+
+  const disabledDate = time => dayjs(time).isAfter(dayjs(), "month");
+
+  const getData = async () => {
+    if (!dateRange.value || dateRange.value.length !== 2) return;
+
+    const params = {
+      entryDateStart: dayjs(dateRange.value[0])
+        .startOf("month")
+        .format("YYYY-MM-DD"),
+      entryDateEnd: dayjs(dateRange.value[1]).endOf("month").format("YYYY-MM-DD"),
+    };
+
+    try {
+      const res = await accountStatementDetailsByMonth(params);
+      if (res.code === 200 && res.data) {
+        const data = res.data;
+        // 鏇存柊椤堕儴姹囨�诲崱鐗囨暟鎹�
+        pageInfo.totalIncome = data.totalIncome || 0;
+        pageInfo.totalExpense = data.totalExpense || 0;
+        pageInfo.totalReceivable = data.accountsReceivable || 0;
+        pageInfo.totalPayable = data.accountsPayable || 0;
+        pageInfo.netRevenue = data.netRevenue || 0;
+
+        // 鏇存柊鍥捐〃鏁版嵁
+        monthlyTrendList.value = data.monthlyTrendList || [];
+        receivablePayableList.value = data.receivablePayableList || [];
+      }
+    } catch (error) {
+      console.error("鑾峰彇璐㈠姟鎶ヨ〃鏁版嵁澶辫触锛�", error);
+    }
+  };
+
+  onMounted(() => {
+    resetDateRange();
   });
-});
-
-// 闄愬埗鏈堜唤閫夋嫨鑼冨洿锛堟渶澶�12涓湀锛�
-const disabledDate = (time) => {
-  // 濡傛灉娌℃湁閫夋嫨寮�濮嬫湀浠斤紝涓嶇鐢ㄤ换浣曟棩鏈�
-  if (!dateRange.value || !Array.isArray(dateRange.value) || !dateRange.value[0]) {
-    return false;
-  }
-  
-  const startMonth = dayjs(dateRange.value[0]);
-  const currentMonth = dayjs(time);
-  
-  // 濡傛灉褰撳墠鏈堜唤鍦ㄥ紑濮嬫湀浠戒箣鍓嶏紝绂佺敤
-  if (currentMonth.isBefore(startMonth, 'month')) {
-    return true;
-  }
-  
-  // 璁$畻鏈�澶у厑璁哥殑鏈堜唤锛堝紑濮嬫湀浠� + 11涓湀 = 12涓湀锛�
-  const maxMonth = startMonth.add(11, 'month');
-  
-  // 绂佺敤瓒呰繃12涓湀鐨勬湀浠�
-  return currentMonth.isAfter(maxMonth, 'month');
-};
-
-// 澶勭悊鏈堜唤鑼冨洿鍙樺寲
-const handleDateChange = (newRange) => {
-  if (!newRange || !Array.isArray(newRange) || newRange.length !== 2) {
-    return;
-  }
-  
-  // 楠岃瘉鏈堜唤鑼冨洿涓嶈秴杩�12涓湀
-  const startDate = dayjs(newRange[0]);
-  const endDate = dayjs(newRange[1]);
-  const monthDiff = endDate.diff(startDate, 'month');
-  
-  if (monthDiff > 11) {
-    proxy.$modal.msgWarning('鏈�澶氬彧鑳介�夋嫨12涓湀浠�');
-    // 鑷姩璋冩暣涓�12涓湀
-    const adjustedEnd = startDate.add(11, 'month').format('YYYY-MM');
-    dateRange.value = [newRange[0], adjustedEnd];
-    getData();
-    return;
-  }
-  
-  dateRange.value = newRange;
-  getData();
-};
-
-// 閲嶇疆鏈堜唤鑼冨洿
-const resetDateRange = () => {
-  // 閲嶇疆涓烘渶杩戝叚涓湀
-  dateRange.value = getLastSixMonths();
-  getData();
-};
-
 </script>
 
 <style scoped lang="scss">
-/* 鍩虹鏍峰紡琛ュ厖 */
-:root {
-  --el-color-primary: #4f46e5;
-}
-
-/* 缁熻鍗$墖鏍峰紡 */
-.stats-cards {
-  display: grid;
-  grid-template-columns: repeat(5, 1fr);
-  gap: 20px;
-  margin-bottom: 20px;
-}
-
-.stat-card {
-  background: #fff;
-  border: 1px solid #e4e7ed;
-  border-radius: 8px;
-  padding: 20px;
-  display: flex;
-  align-items: center;
-  gap: 15px;
-  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
-  transition: all 0.3s;
-  
-  &:hover {
-    box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
-    transform: translateY(-2px);
-  }
-  
-  .stat-icon {
-    width: 48px;
-    height: 48px;
-    flex-shrink: 0;
-    
-    img {
-      width: 100%;
-      height: 100%;
-      object-fit: contain;
-    }
-  }
-  
-  .stat-content {
-    flex: 1;
-    display: flex;
-    flex-direction: column;
-    gap: 8px;
-  }
-  
-  .stat-label {
-    font-size: 14px;
-    color: #666;
-    line-height: 1.2;
-  }
-  
-  .stat-value {
-    font-size: 24px;
-    font-weight: 600;
-    color: #333;
-    line-height: 1.2;
-  }
-  
-  .stat-trend {
-    font-size: 12px;
-    line-height: 1.2;
-    
-    &.trend-up {
-      color: #f56c6c;
-    }
-    
-    &.trend-down {
-      color: #67c23a;
-    }
-  }
-}
-
-/* 鍥捐〃琛屽竷灞� */
-.charts-row {
-  display: grid;
-  grid-template-columns: 1fr 1fr;
-  gap: 20px;
-  margin-bottom: 20px;
-}
-
-.chart-card {
-  border: 1px solid #e4e7ed;
-  border-radius: 8px;
-  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
-  
-  :deep(.el-card__body) {
-    padding: 20px !important;
-  }
-}
-
-.trend-chart-card {
-  border: 1px solid #e4e7ed;
-  border-radius: 8px;
-  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
-  
-  :deep(.el-card__body) {
-    padding: 20px !important;
-  }
-}
-
-/* 楗煎浘瀹瑰櫒 */
-.pie-chart-container {
-  position: relative;
-  
-  .pie-stats {
-    display: flex;
-    justify-content: space-between;
+  .stats-cards {
+    display: grid;
+    grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
     gap: 20px;
-    margin-top: 20px;
-    
-    .bar-stat-item {
+    margin-bottom: 24px;
+  }
+
+  .stat-card {
+    background: #fff;
+    border: 1px solid #edf2f7;
+    border-radius: 12px;
+    padding: 24px;
+    display: flex;
+    align-items: center;
+    gap: 16px;
+    box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.05);
+    transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
+
+    &:hover {
+      box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
+      transform: translateY(-4px);
+    }
+
+    .stat-icon {
+      width: 56px;
+      height: 56px;
+      background: #f7fafc;
+      border-radius: 12px;
       display: flex;
-      flex-direction: column;
+      align-items: center;
+      justify-content: center;
+      img {
+        width: 32px;
+        height: 32px;
+      }
+    }
+
+    .stat-content {
+      .stat-label {
+        font-size: 14px;
+        color: #718096;
+        margin-bottom: 4px;
+      }
+      .stat-value {
+        font-size: 20px;
+        font-weight: 700;
+        color: #2d3748;
+      }
+    }
+  }
+
+  .charts-row {
+    display: grid;
+    grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
+    gap: 24px;
+    margin-bottom: 24px;
+  }
+
+  @media (min-width: 1200px) {
+    .charts-row {
+      grid-template-columns: repeat(2, 1fr);
+    }
+  }
+
+  .chart-card,
+  .trend-chart-card {
+    border-radius: 16px;
+    border: none;
+    box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.05);
+
+    .card-header {
+      display: flex;
       align-items: center;
       gap: 8px;
-      padding: 15px;
-      background: #f5f7fa;
-      border-radius: 6px;
-      flex: 1;
-      
-      .bar-stat-label {
-        font-size: 14px;
-        color: #666;
-      }
-      
-      .bar-stat-value {
-        font-size: 18px;
+      .header-title {
+        font-size: 16px;
         font-weight: 600;
-        color: #333;
+        color: #1a202c;
+      }
+      .el-icon {
+        color: #a0aec0;
+        cursor: help;
       }
     }
   }
-}
 
-/* 鏌辩姸鍥惧ご閮ㄧ粺璁� */
-.bar-chart-header {
-  display: flex;
-  justify-content: space-between;
-  gap: 20px;
-  margin-bottom: 20px;
-  
-  .bar-stat-item {
+  .financial-overview-container {
     display: flex;
-    flex-direction: column;
+    justify-content: space-between;
     align-items: center;
-    gap: 8px;
-    padding: 15px;
-    background: #f5f7fa;
-    border-radius: 6px;
-    flex: 1;
-    
-    .bar-stat-label {
-      font-size: 14px;
-      color: #666;
+    flex-wrap: nowrap;
+    gap: 10px;
+    padding: 20px 0;
+    width: 100%;
+    overflow: hidden;
+
+    .overview-item {
+      flex: 1;
+      min-width: 0; // 鍏佽鍦� flex 瀹瑰櫒涓缉鍐欙紝闃叉鍐呭鎾戝紑
+      display: flex;
+      justify-content: center;
+
+      .overview-box {
+        position: relative;
+        width: 100%;
+        max-width: 320px;
+        height: 110px;
+        background: #f8fafc;
+        border-radius: 12px;
+        padding: 12px 16px;
+        display: flex;
+        align-items: center;
+        gap: 12px;
+        overflow: hidden;
+        transition: all 0.3s ease;
+
+        &:hover {
+          transform: translateY(-5px);
+          box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
+        }
+
+        .icon-circle {
+          flex-shrink: 0;
+          width: 42px;
+          height: 42px;
+          border-radius: 10px;
+          display: flex;
+          align-items: center;
+          justify-content: center;
+          font-size: 20px;
+          z-index: 2;
+        }
+
+        .data-content {
+          z-index: 2;
+          min-width: 0;
+          .label {
+            font-size: 13px;
+            color: #718096;
+            margin-bottom: 2px;
+            font-weight: 500;
+            white-space: nowrap;
+          }
+          .value {
+            font-size: 18px;
+            font-weight: 800;
+            color: #1a202c;
+            line-height: 1.2;
+            overflow: hidden;
+            text-overflow: ellipsis;
+            white-space: nowrap;
+          }
+          .unit {
+            font-size: 11px;
+            color: #a0aec0;
+          }
+        }
+
+        .bg-decoration {
+          position: absolute;
+          right: -5px;
+          bottom: -5px;
+          font-size: 32px;
+          font-weight: 950;
+          color: rgba(0, 0, 0, 0.03);
+          font-style: italic;
+          user-select: none;
+          z-index: 1;
+        }
+      }
+
+      &.income {
+        .icon-circle {
+          background: #eef2ff;
+          color: #4f46e5;
+        }
+        .overview-box {
+          border-left: 5px solid #4f46e5;
+        }
+      }
+
+      &.expense {
+        .icon-circle {
+          background: #fff7ed;
+          color: #f97316;
+        }
+        .overview-box {
+          border-left: 5px solid #f97316;
+        }
+      }
     }
-    
-    .bar-stat-value {
-      font-size: 18px;
-      font-weight: 600;
-      color: #333;
+
+    .profit-indicator {
+      flex: 0 40%; // 鍥哄畾瀹藉害锛屼笉鍙備笌寮规�х缉鏀句互淇濊瘉浠〃鐩樺畬鏁�
+      display: flex;
+      justify-content: center;
+      align-items: center;
+
+      .profit-gauge-wrapper {
+        position: relative;
+        display: flex;
+        justify-content: center;
+        align-items: center;
+        width: 100%;
+        // max-width: 180px;
+
+        .profit-center-text {
+          position: absolute;
+          top: 50%;
+          left: 50%;
+          transform: translate(-50%, -50%);
+          text-align: center;
+          width: 100%;
+
+          .label {
+            font-size: 12px;
+            color: #718096;
+            font-weight: 500;
+          }
+
+          .value {
+            font-size: 20px;
+            font-weight: 800;
+            margin: 2px 0;
+            overflow: hidden;
+            text-overflow: ellipsis;
+            white-space: nowrap;
+
+            &.plus {
+              color: #10b981;
+            }
+
+            &.minus {
+              color: #f43f5e;
+            }
+          }
+
+          .rate {
+            font-size: 11px;
+            color: #a0aec0;
+            font-weight: 500;
+          }
+        }
+      }
+    }
+
+    // 閽堝闈炲父绐勭殑灞忓箷杩涜鏁翠綋缂╂斁
+    @media (max-width: 1400px) {
+      transform-origin: center;
+      // 濡傛灉瀹瑰櫒澶獎锛岄�氳繃缂╁皬鍐呴儴鍏冪礌鏉ラ�傚簲
+      // 杩欓噷涓嶄娇鐢� transform: scale 鍥犱负浼氬奖鍝嶅竷灞�娴侊紝鏀圭敤鍐呴儴灏哄寰皟
+      .overview-item .overview-box {
+        padding: 10px;
+        gap: 8px;
+        .value {
+          font-size: 16px;
+        }
+        .icon-circle {
+          width: 36px;
+          height: 36px;
+          font-size: 18px;
+        }
+      }
+      .profit-indicator {
+        flex: 0 40%;
+        .profit-gauge-wrapper .value {
+          font-size: 18px;
+        }
+      }
     }
   }
-}
-
-/* 鏍囬鏍峰紡 */
-.section-title {
-  position: relative;
-  font-size: 18px;
-  color: #333;
-  padding-left: 12px;
-  margin-bottom: 20px;
-  font-weight: 700;
-  
-  &::before {
-    position: absolute;
-    left: 0;
-    top: 2px;
-    content: '';
-    width: 4px;
-    height: 18px;
-    background-color: #002FA7;
-    border-radius: 2px;
-  }
-}
-
-/* 鍝嶅簲寮忚璁� */
-@media (max-width: 1400px) {
-  .stats-cards {
-    grid-template-columns: repeat(3, 1fr);
-  }
-}
-
-@media (max-width: 1024px) {
-  .stats-cards {
-    grid-template-columns: repeat(2, 1fr);
-  }
-  
-  .charts-row {
-    grid-template-columns: 1fr;
-  }
-}
-
-@media (max-width: 640px) {
-  .stats-cards {
-    grid-template-columns: 1fr;
-  }
-}
 </style>
-
-
-
-
-
-
-
-
-
-
diff --git a/src/views/financialManagement/loanManagement/Modal.vue b/src/views/financialManagement/loanManagement/Modal.vue
deleted file mode 100644
index 73b2cc3..0000000
--- a/src/views/financialManagement/loanManagement/Modal.vue
+++ /dev/null
@@ -1,222 +0,0 @@
-<template>
-  <FormDialog
-    v-model="dialogVisible"
-    :title="dialogTitle"
-    :operationType="operationType"
-    width="60%"
-    @confirm="sendForm"
-    @close="close"
-    @cancel="close"
-  >
-    <el-form
-      ref="formRef"
-      :model="form"
-      :rules="formRules"
-      label-width="120px"
-    >
-      <el-form-item label="鍊熸浜哄鍚�" prop="borrowerName">
-        <el-input v-model="form.borrowerName" placeholder="璇疯緭鍏ュ�熸浜哄鍚�" />
-      </el-form-item>
-      <el-form-item label="鍊熸閲戦锛堝厓锛�" prop="borrowAmount">
-        <el-input-number
-          :step="0.01"
-          :min="0"
-          :precision="2"
-          style="width: 100%"
-          v-model="form.borrowAmount"
-          placeholder="璇疯緭鍏ュ�熸閲戦"
-        />
-      </el-form-item>
-      <el-form-item label="鍊熸鍒╃巼锛�%锛�" prop="interestRate">
-        <el-input-number
-          :step="0.01"
-          :min="0"
-          :precision="2"
-          style="width: 100%"
-          v-model="form.interestRate"
-          placeholder="璇疯緭鍏ュ�熸鍒╃巼锛屽锛�5.85"
-        />
-      </el-form-item>
-      <el-form-item label="鍊熸鏃ユ湡" prop="borrowDate">
-        <el-date-picker
-          style="width: 100%"
-          v-model="form.borrowDate"
-          format="YYYY-MM-DD"
-          value-format="YYYY-MM-DD"
-          type="date"
-          placeholder="璇烽�夋嫨鍊熸鏃ユ湡"
-          clearable
-        />
-      </el-form-item>
-      <!-- 瀹為檯杩樻鏃ユ湡锛氫粎鈥滆繕娆锯�濇椂鍙~ -->
-      <el-form-item
-        v-if="operationType === 'repay'"
-        label="瀹為檯杩樻鏃ユ湡"
-        prop="repayDate"
-      >
-        <el-date-picker
-          style="width: 100%"
-          v-model="form.repayDate"
-          format="YYYY-MM-DD"
-          value-format="YYYY-MM-DD"
-          type="date"
-          placeholder="璇烽�夋嫨瀹為檯杩樻鏃ユ湡锛堣繕娆惧悗濉啓锛�"
-          clearable
-        />
-      </el-form-item>
-      <el-form-item label="澶囨敞" prop="remark">
-        <el-input
-          v-model="form.remark"
-          type="textarea"
-          :rows="3"
-          placeholder="璇疯緭鍏ュ娉紙鍊熸璇存槑锛�"
-        />
-      </el-form-item>
-    </el-form>
-  </FormDialog>
-</template>
-
-<script setup>
-import { add, update } from "@/api/financialManagement/loanManagement";
-import useFormData from "@/hooks/useFormData";
-import FormDialog from "@/components/Dialog/FormDialog.vue";
-import { ElMessage } from "element-plus";
-import { ref } from "vue";
-
-defineOptions({
-  name: "鍊熸鏂板缂栬緫",
-});
-
-const emits = defineEmits(["success"]);
-
-const formRef = ref(null);
-const dialogVisible = ref(false);
-const operationType = ref("add"); // add | edit
-const id = ref(undefined);
-const submitting = ref(false);
-
-const dialogTitle = (type) => {
-  if (type === "edit") return "缂栬緫鍊熸";
-  if (type === "repay") return "杩樻";
-  return "鏂板鍊熸";
-};
-
-const formRules = {
-  borrowerName: [{ required: true, trigger: "blur", message: "璇疯緭鍏ュ�熸浜哄鍚�" }],
-  borrowAmount: [{ required: true, trigger: "blur", message: "璇疯緭鍏ュ�熸閲戦" }],
-  interestRate: [{ required: true, trigger: "blur", message: "璇疯緭鍏ュ�熸鍒╃巼" }],
-  borrowDate: [{ required: true, trigger: "change", message: "璇烽�夋嫨鍊熸鏃ユ湡" }],
-  repayDate: [
-    {
-      validator: (_rule, value, callback) => {
-        if (operationType.value === "repay" && !value) {
-          callback(new Error("璇烽�夋嫨瀹為檯杩樻鏃ユ湡"));
-          return;
-        }
-        callback();
-      },
-      trigger: "change",
-    },
-  ],
-};
-
-const { form, resetForm } = useFormData({
-  borrowerName: undefined, // 鍊熸浜哄鍚�
-  borrowAmount: undefined, // 鍊熸閲戦锛堝厓锛�
-  interestRate: undefined, // 鍊熸鍒╃巼锛堝锛�5.85 浠h〃5.85%锛�
-  borrowDate: undefined, // 鍊熸鏃ユ湡
-  repayDate: undefined, // 瀹為檯杩樻鏃ユ湡锛堣繕娆惧悗濉厖锛�
-  remark: undefined, // 澶囨敞锛堝�熸璇存槑锛�
-});
-
-const sendForm = () => {
-  if (submitting.value) return;
-  formRef.value?.validate(async (valid) => {
-    if (valid) {
-      submitting.value = true;
-      try {
-        const isRepay = operationType.value === "repay";
-        // 杩樻锛氫笉灞曠ず status锛屼絾鎻愪氦鏃跺己鍒朵紶 status=2锛岃蛋鏇存柊鎺ュ彛
-        const payload = isRepay
-          ? { id: id.value, ...form, status: 2 }
-          : id.value
-            ? { id: id.value, ...form }
-            : form;
-
-        const { code } = isRepay
-          ? await update(payload)
-          : id.value
-            ? await update(payload)
-            : await add(payload);
-        if (code == 200) {
-          emits("success");
-          ElMessage({ message: "鎿嶄綔鎴愬姛", type: "success" });
-          close();
-        }
-      } finally {
-        submitting.value = false;
-      }
-    }
-  });
-};
-
-const close = () => {
-  resetForm();
-  formRef.value?.clearValidate();
-  id.value = undefined;
-  dialogVisible.value = false;
-};
-
-// 缂栬緫锛氱洿鎺ョ敤鍒楄〃琛屾暟鎹洖濉紙閬垮厤渚濊禆璇︽儏鎺ュ彛锛�
-const loadForm = async (row) => {
-  const rowId = row?.id;
-  operationType.value = "edit";
-  id.value = rowId;
-  dialogVisible.value = true;
-  if (rowId) {
-    form.borrowerName = row.borrowerName;
-    form.borrowAmount = row.borrowAmount;
-    form.interestRate = row.interestRate;
-    form.borrowDate = row.borrowDate;
-    form.repayDate = row.repayDate;
-    form.remark = row.remark;
-  } else {
-    resetForm();
-    formRef.value?.clearValidate();
-  }
-};
-
-// 杩樻锛氭墦寮�寮圭獥锛屼粎濉啓瀹為檯杩樻鏃ユ湡锛屾彁浜ゆ椂寮哄埗 status=2
-const repay = async (row) => {
-  const rowId = row?.id;
-  operationType.value = "repay";
-  id.value = rowId;
-  dialogVisible.value = true;
-  if (rowId) {
-    // 涓轰簡璧� update 鎺ュ彛鏇寸ǔ濡ワ紝甯︿笂鍘熸湁鏁版嵁锛涘彧璁╃敤鎴烽�� repayDate
-    form.borrowerName = row.borrowerName;
-    form.borrowAmount = row.borrowAmount;
-    form.interestRate = row.interestRate;
-    form.borrowDate = row.borrowDate;
-    form.remark = row.remark;
-    form.repayDate = undefined;
-  } else {
-    resetForm();
-    formRef.value?.clearValidate();
-  }
-};
-
-const openModal = () => {
-  operationType.value = "add";
-  id.value = undefined;
-  resetForm();
-  formRef.value?.clearValidate();
-  dialogVisible.value = true;
-};
-
-defineExpose({
-  openModal,
-  loadForm,
-  repay,
-});
-</script>
diff --git a/src/views/financialManagement/loanManagement/index.vue b/src/views/financialManagement/loanManagement/index.vue
deleted file mode 100644
index cb52ff1..0000000
--- a/src/views/financialManagement/loanManagement/index.vue
+++ /dev/null
@@ -1,278 +0,0 @@
-<template>
-  <div class="app-container">
-    <el-form :model="filters" :inline="true">
-      <el-form-item label="鍊熸浜哄鍚�:">
-        <el-input
-          v-model="filters.borrowerName"
-          placeholder="璇疯緭鍏ュ�熸浜哄鍚�"
-          clearable
-          style="width: 200px;"
-        />
-      </el-form-item>
-      <el-form-item label="鍊熸鏃ユ湡:">
-        <el-date-picker
-          v-model="filters.borrowDate"
-          value-format="YYYY-MM-DD"
-          format="YYYY-MM-DD"
-          type="daterange"
-          range-separator="鑷�"
-          start-placeholder="寮�濮嬫棩鏈�"
-          end-placeholder="缁撴潫鏃ユ湡"
-          clearable
-          @change="changeDaterange"
-        />
-      </el-form-item>
-      <el-form-item label="鍊熸鐘舵��:">
-        <el-select
-          v-model="filters.status"
-          placeholder="璇烽�夋嫨"
-          clearable
-          style="width: 200px;"
-        >
-          <el-option label="寰呰繕娆�" :value="1" />
-          <el-option label="宸茶繕娆�" :value="2" />
-        </el-select>
-      </el-form-item>
-      <el-form-item>
-        <el-button type="primary" @click="getTableData">鎼滅储</el-button>
-        <el-button @click="resetFilters">閲嶇疆</el-button>
-      </el-form-item>
-    </el-form>
-    <div class="table_list">
-      <div class="actions">
-        <div></div>
-        <div>
-          <el-button type="primary" @click="add" icon="Plus"> 鏂板 </el-button>
-          <el-button @click="handleOut" icon="download">瀵煎嚭</el-button>
-          <el-button
-            type="danger"
-            icon="Delete"
-            :disabled="multipleList.length <= 0"
-            @click="deleteRow(multipleList.map((item) => item.id))"
-          >
-            鎵归噺鍒犻櫎
-          </el-button>
-        </div>
-      </div>
-      <PIMTable
-        rowKey="id"
-        isSelection
-        :column="columns"
-        :tableData="dataList"
-        :page="{
-          current: pagination.currentPage,
-          size: pagination.pageSize,
-          total: pagination.total,
-        }"
-        :isShowSummary="true"
-        :summaryMethod="summarizeMainTable"
-        @selection-change="handleSelectionChange"
-        @pagination="changePage"
-      >
-        <template #operation="{ row }">
-          <el-button type="primary" link @click="edit(row)">
-            缂栬緫
-          </el-button>
-          <el-button
-            :disabled="row.status !== 1"
-            type="primary"
-            link
-            @click="repay(row)"
-          >
-            杩樻
-          </el-button>
-        </template>
-      </PIMTable>
-    </div>
-    <Modal ref="modalRef" @success="getTableData"></Modal>
-  </div>
-</template>
-
-<script setup>
-import { usePaginationApi } from "@/hooks/usePaginationApi";
-import { listPage, delAccountLoan } from "@/api/financialManagement/loanManagement";
-import { onMounted, getCurrentInstance, ref, nextTick } from "vue";
-import Modal from "./Modal.vue";
-import { ElMessageBox, ElMessage } from "element-plus";
-import dayjs from "dayjs";
-
-defineOptions({
-  name: "鍊熸绠$悊",
-});
-
-// 琛ㄦ牸澶氶�夋閫変腑椤�
-const multipleList = ref([]);
-const { proxy } = getCurrentInstance();
-const modalRef = ref();
-
-const {
-  filters,
-  columns,
-  dataList,
-  pagination,
-  getTableData,
-  resetFilters,
-  onCurrentChange,
-} = usePaginationApi(
-  listPage,
-  {
-    borrowerName: undefined,
-    borrowDate: undefined,
-    status: undefined,
-  },
-  [
-    {
-      label: "鍊熸浜哄鍚�",
-      prop: "borrowerName",
-    },
-    {
-      label: "鍊熸閲戦锛堝厓锛�",
-      prop: "borrowAmount",
-      formatData: (val) => {
-        return val ? `楼${parseFloat(val).toLocaleString('zh-CN', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}` : '楼0.00';
-      },
-    },
-    {
-      label: "鍊熸鍒╃巼锛�%锛�",
-      prop: "interestRate",
-      formatData: (val) => {
-        return val ? `${parseFloat(val).toFixed(2)}%` : '-';
-      },
-    },
-    {
-      label: "鍊熸鏃ユ湡",
-      prop: "borrowDate",
-    },
-    {
-      label: "瀹為檯杩樻鏃ユ湡",
-      prop: "repayDate",
-    },
-    {
-      label: "鍊熸鐘舵��",
-      prop: "status",
-      dataType: "tag",
-			align: 'center',
-      formatData: (params) => {
-        if (params == 1) {
-          return "寰呰繕娆�";
-        } else if (params == 2) {
-          return "宸茶繕娆�";
-        }
-        return null;
-      },
-      formatType: (params) => {
-        if (params == 1) {
-          return "error";
-        } else if (params == 2) {
-          return "success";
-        }
-        return null;
-      },
-    },
-    {
-      fixed: "right",
-      label: "鎿嶄綔",
-      dataType: "slot",
-      slot: "operation",
-      align: "center",
-      width: "120px",
-    },
-  ],
-  null,
-  {
-    // 灏嗗墠绔�熸鏃ユ湡鑼冨洿杞崲涓哄悗绔渶瑕佺殑 entryDateStart / entryDateEnd锛屽苟涓斾笉浼� borrowDate
-    borrowDate: (val) => {
-      if (val && val.length === 2) {
-        return {
-          entryDateStart: dayjs(val[0]).format("YYYY-MM-DD"),
-          entryDateEnd: dayjs(val[1]).format("YYYY-MM-DD"),
-        };
-      }
-      return {};
-    },
-  }
-);
-
-// 琛ㄦ牸鍚堣锛氬�熸閲戦
-const summarizeMainTable = (param) => {
-  return proxy.summarizeTable(param, ["borrowAmount"]);
-};
-
-// 澶氶�夊悗鍋氫粈涔�
-const handleSelectionChange = (selectionList) => {
-  multipleList.value = selectionList;
-};
-
-const add = () => {
-  modalRef.value.openModal();
-};
-
-const edit = (row) => {
-  modalRef.value.loadForm(row);
-};
-
-const repay = (row) => {
-  modalRef.value.repay(row);
-};
-
-const changePage = ({ page, limit }) => {
-  pagination.currentPage = page;
-  pagination.pageSize = limit;
-  onCurrentChange(page);
-};
-
-const deleteRow = (id) => {
-  ElMessageBox.confirm("姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ユ暟鎹�, 鏄惁缁х画?", "鎻愮ず", {
-    confirmButtonText: "纭畾",
-    cancelButtonText: "鍙栨秷",
-    type: "warning",
-  }).then(async () => {
-    const { code } = await delAccountLoan(id);
-    if (code == 200) {
-      ElMessage({
-        type: "success",
-        message: "鍒犻櫎鎴愬姛",
-      });
-      getTableData();
-    }
-  });
-};
-
-const changeDaterange = (value) => {
-  if (value) {
-    filters.borrowDate = value;
-  } else {
-    filters.borrowDate = null;
-  }
-  getTableData();
-};
-
-const handleOut = () => {
-  ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
-    confirmButtonText: "纭",
-    cancelButtonText: "鍙栨秷",
-    type: "warning",
-  })
-    .then(() => {
-      proxy.download(`/borrowInfo/export`, {}, "鍊熸鍙拌处.xlsx");
-    })
-    .catch(() => {
-      proxy.$modal.msg("宸插彇娑�");
-    });
-};
-
-onMounted(() => {
-  getTableData();
-});
-</script>
-
-<style lang="scss" scoped>
-.table_list {
-  margin-top: unset;
-}
-.actions {
-  display: flex;
-  justify-content: space-between;
-  margin-bottom: 10px;
-}
-</style>
diff --git a/src/views/financialManagement/payable/input-invoice.vue b/src/views/financialManagement/payable/input-invoice.vue
index 660d0dd..86ebd09 100644
--- a/src/views/financialManagement/payable/input-invoice.vue
+++ b/src/views/financialManagement/payable/input-invoice.vue
@@ -1,50 +1,61 @@
 <template>
   <div class="app-container">
     <el-form :model="filters" :inline="true">
-      <el-form-item label="鍙戠エ浠g爜:">
-        <el-input v-model="filters.invoiceCode" placeholder="璇疯緭鍏ュ彂绁ㄤ唬鐮�" clearable style="width: 200px;" />
-      </el-form-item>
       <el-form-item label="鍙戠エ鍙风爜:">
-        <el-input v-model="filters.invoiceNo" placeholder="璇疯緭鍏ュ彂绁ㄥ彿鐮�" clearable style="width: 200px;" />
+        <el-input v-model="filters.invoiceNumber" placeholder="璇疯緭鍏ュ彂绁ㄥ彿鐮�" clearable style="width: 200px;" />
       </el-form-item>
       <el-form-item label="渚涘簲鍟�:">
-        <el-select v-model="filters.supplierId" placeholder="璇烽�夋嫨渚涘簲鍟�" clearable style="width: 200px;">
-          <el-option v-for="item in supplierList" :key="item.id" :label="item.name" :value="item.id" />
+        <el-select v-model="filters.supplierId" placeholder="璇烽�夋嫨渚涘簲鍟�" clearable filterable style="width: 200px;">
+          <el-option
+            v-for="item in supplierList"
+            :key="item.id"
+            :label="item.supplierName"
+            :value="item.id"
+          />
         </el-select>
       </el-form-item>
-      <el-form-item label="璁よ瘉鐘舵��:">
-        <el-select v-model="filters.certifyStatus" placeholder="璇烽�夋嫨璁よ瘉鐘舵��" clearable style="width: 150px;">
-          <el-option label="鏈璇�" value="uncertified" />
-          <el-option label="宸茶璇�" value="certified" />
-          <el-option label="璁よ瘉澶辫触" value="failed" />
+      <el-form-item label="寮�绁ㄦ棩鏈�:">
+        <el-date-picker
+          v-model="filters.dateRange"
+          type="daterange"
+          value-format="YYYY-MM-DD"
+          format="YYYY-MM-DD"
+          range-separator="鑷�"
+          start-placeholder="寮�濮嬫棩鏈�"
+          end-placeholder="缁撴潫鏃ユ湡"
+          clearable
+          style="width: 240px;"
+        />
+      </el-form-item>
+      <el-form-item label="鐘舵��:">
+        <el-select v-model="filters.status" placeholder="璇烽�夋嫨鐘舵��" clearable style="width: 150px;">
+          <el-option label="姝e父" :value="0" />
+          <el-option label="浣滃簾" :value="1" />
         </el-select>
       </el-form-item>
       <el-form-item>
-        <el-button type="primary" @click="getTableData">鎼滅储</el-button>
+        <el-button type="primary" @click="onSearch">鎼滅储</el-button>
         <el-button @click="resetFilters">閲嶇疆</el-button>
       </el-form-item>
     </el-form>
     <div class="table_list">
       <div class="actions">
-        <div>
-          <el-button type="success" @click="handleBatchCertify" icon="Check" :disabled="selectedRows.length === 0">鎵归噺璁よ瘉</el-button>
-        </div>
+        <div></div>
         <div>
           <el-button type="primary" @click="add" icon="Plus">褰曞叆鍙戠エ</el-button>
-          <el-button @click="handleOut" icon="Download">瀵煎嚭</el-button>
+          <el-button @click="handleExport" icon="Download">瀵煎嚭</el-button>
         </div>
       </div>
       <PIMTable
         rowKey="id"
-        isSelection
         :column="columns"
         :tableData="dataList"
+        :tableLoading="tableLoading"
         :page="{
           current: pagination.currentPage,
           size: pagination.pageSize,
           total: pagination.total,
         }"
-        @selection-change="handleSelectionChange"
         @pagination="changePage"
       >
         <template #amount="{ row }">
@@ -56,54 +67,123 @@
         <template #totalAmount="{ row }">
           <span class="text-success">楼{{ formatMoney(row.totalAmount) }}</span>
         </template>
-        <template #certifyStatus="{ row }">
-          <el-tag :type="getCertifyStatusType(row.certifyStatus)">{{ getCertifyStatusLabel(row.certifyStatus) }}</el-tag>
+        <template #status="{ row }">
+          <el-tag :type="getStatusType(row.status)" effect="light" round>
+            {{ getStatusLabel(row.status) }}
+          </el-tag>
         </template>
         <template #operation="{ row }">
           <el-button type="primary" link @click="view(row)">鏌ョ湅</el-button>
-          <el-button type="primary" link @click="edit(row)">缂栬緫</el-button>
-          <el-button type="success" link @click="handleCertify(row)" v-if="row.certifyStatus === 'uncertified'">璁よ瘉</el-button>
+          <el-button type="warning" link @click="handleCancel(row)" v-if="isNormalStatus(row.status)">浣滃簾</el-button>
+          <el-button type="danger" link @click="handleDelete(row)">鍒犻櫎</el-button>
         </template>
       </PIMTable>
     </div>
 
-    <FormDialog :title="dialogTitle" v-model="dialogVisible" width="800px" @confirm="submitForm" @cancel="dialogVisible = false">
+    <FormDialog
+      :title="dialogTitle"
+      v-model="dialogVisible"
+      width="800px"
+      :operation-type="isView ? 'detail' : ''"
+      @confirm="submitForm"
+      @cancel="closeDialog"
+    >
       <el-form :model="form" :rules="rules" ref="formRef" label-width="120px">
-        <el-row :gutter="20">
+        <el-row v-if="isView" :gutter="20">
           <el-col :span="12">
-            <el-form-item label="鍙戠エ浠g爜" prop="invoiceCode">
-              <el-input v-model="form.invoiceCode" placeholder="璇疯緭鍏ュ彂绁ㄤ唬鐮�" />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="鍙戠エ鍙风爜" prop="invoiceNo">
-              <el-input v-model="form.invoiceNo" placeholder="璇疯緭鍏ュ彂绁ㄥ彿鐮�" />
+            <el-form-item label="鐘舵��">
+              <el-tag :type="getStatusType(form.status)" effect="light" round>
+                {{ getStatusLabel(form.status) }}
+              </el-tag>
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="20">
           <el-col :span="12">
+            <el-form-item label="鍙戠エ鍙风爜" prop="invoiceNo">
+              <el-input v-model="form.invoiceNo" placeholder="璇疯緭鍏ュ彂绁ㄥ彿鐮�" :disabled="isView" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
             <el-form-item label="渚涘簲鍟�" prop="supplierId">
-              <el-select v-model="form.supplierId" placeholder="璇烽�夋嫨渚涘簲鍟�" style="width: 100%;">
-                <el-option v-for="item in supplierList" :key="item.id" :label="item.name" :value="item.id" />
+              <el-select
+                v-model="form.supplierId"
+                placeholder="璇烽�夋嫨渚涘簲鍟�"
+                style="width: 100%;"
+                filterable
+                :disabled="isView"
+                @change="handleSupplierChange"
+              >
+                <el-option
+                  v-for="item in supplierList"
+                  :key="item.id"
+                  :label="item.supplierName"
+                  :value="item.id"
+                />
               </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="鍏宠仈鍏ュ簱鍗�" prop="stockInRecordIds">
+              <el-input
+                :model-value="inboundBatchDisplayText"
+                placeholder="璇峰厛閫夋嫨渚涘簲鍟�"
+                readonly
+                :disabled="!form.supplierId || isView"
+                class="inbound-batch-input"
+                @click="handleInboundInputClick"
+              >
+                <template v-if="!isView" #append>
+                  <el-button
+                    :disabled="!form.supplierId"
+                    :loading="inboundBatchLoading"
+                    @click.stop="openInboundSelectDialog"
+                  >
+                    閫夋嫨
+                  </el-button>
+                </template>
+              </el-input>
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="寮�绁ㄦ棩鏈�" prop="invoiceDate">
-              <el-date-picker v-model="form.invoiceDate" type="date" placeholder="閫夋嫨鏃ユ湡" value-format="YYYY-MM-DD" style="width: 100%;" />
+              <el-date-picker
+                v-model="form.invoiceDate"
+                type="date"
+                placeholder="閫夋嫨鏃ユ湡"
+                value-format="YYYY-MM-DD"
+                style="width: 100%;"
+                :disabled="isView"
+              />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="20">
-          <el-col :span="8">
-            <el-form-item label="閲戦(涓嶅惈绋�)" prop="amount">
-              <el-input-number v-model="form.amount" :min="0" :precision="2" style="width: 100%;" @change="calculateTax" />
+          <el-col :span="12">
+            <el-form-item label="鍙戠エ绫诲瀷" prop="invoiceType">
+              <el-select
+                v-model="form.invoiceType"
+                placeholder="璇烽�夋嫨鍙戠エ绫诲瀷"
+                style="width: 100%;"
+                :disabled="isView"
+              >
+                <el-option label="澧炲�肩◣涓撶敤鍙戠エ" value="澧炲�肩◣涓撶敤鍙戠エ" />
+                <el-option label="澧炲�肩◣鏅�氬彂绁�" value="澧炲�肩◣鏅�氬彂绁�" />
+                <el-option label="鐢靛瓙鍙戠エ" value="鐢靛瓙鍙戠エ" />
+              </el-select>
             </el-form-item>
           </el-col>
-          <el-col :span="8">
+          <el-col :span="12">
             <el-form-item label="绋庣巼" prop="taxRate">
-              <el-select v-model="form.taxRate" placeholder="璇烽�夋嫨绋庣巼" style="width: 100%;" @change="calculateTax">
+              <el-select
+                v-model="form.taxRate"
+                placeholder="璇烽�夋嫨绋庣巼"
+                style="width: 100%;"
+                :disabled="isView"
+                @change="handleTaxRateChange"
+              >
                 <el-option
                   v-for="dict in tax_rate"
                   :key="dict.value"
@@ -113,47 +193,109 @@
               </el-select>
             </el-form-item>
           </el-col>
-          <el-col :span="8">
-            <el-form-item label="绋庨">
-              <el-input v-model="form.taxAmount" disabled />
-            </el-form-item>
-          </el-col>
         </el-row>
         <el-row :gutter="20">
-          <el-col :span="12">
-            <el-form-item label="璁よ瘉鐘舵��" prop="certifyStatus">
-              <el-select v-model="form.certifyStatus" placeholder="璇烽�夋嫨璁よ瘉鐘舵��" style="width: 100%;" disabled>
-                <el-option label="鏈璇�" value="uncertified" />
-                <el-option label="宸茶璇�" value="certified" />
-                <el-option label="璁よ瘉澶辫触" value="failed" />
-              </el-select>
+          <el-col :span="8">
+            <el-form-item label="閲戦(涓嶅惈绋�)" prop="amount">
+              <el-input-number
+                v-model="form.amount"
+                :min="0"
+                :precision="2"
+                style="width: 100%;"
+                :disabled="isView"
+                placeholder="鏍规嵁鍏ュ簱鍗曞惈绋庨噾棰濊嚜鍔ㄦ崲绠楋紝鍙慨鏀�"
+                @change="calculateTaxFromExclusive"
+              />
             </el-form-item>
           </el-col>
-          <el-col :span="12">
-            <el-form-item label="璁よ瘉鏃ユ湡" prop="certifyDate">
-              <el-date-picker v-model="form.certifyDate" type="date" placeholder="閫夋嫨鏃ユ湡" value-format="YYYY-MM-DD" style="width: 100%;" disabled />
+          <el-col :span="8">
+            <el-form-item label="绋庨">
+              <el-input-number
+                v-model="form.taxAmount"
+                :min="0"
+                :precision="2"
+                :controls="false"
+                style="width: 100%;"
+                disabled
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="浠风◣鍚堣">
+              <el-input-number
+                v-model="form.totalAmount"
+                :min="0"
+                :precision="2"
+                :controls="false"
+                style="width: 100%;"
+                disabled
+              />
             </el-form-item>
           </el-col>
         </el-row>
         <el-form-item label="鍙戠エ鍐呭" prop="content">
-          <el-input v-model="form.content" type="textarea" :rows="3" placeholder="璇疯緭鍏ュ彂绁ㄥ唴瀹�" />
+          <el-input v-model="form.content" type="textarea" :rows="3" placeholder="璇疯緭鍏ュ彂绁ㄥ唴瀹�" :disabled="isView" />
         </el-form-item>
         <el-form-item label="澶囨敞" prop="remark">
-          <el-input v-model="form.remark" type="textarea" :rows="2" placeholder="璇疯緭鍏ュ娉�" />
+          <el-input v-model="form.remark" type="textarea" :rows="2" placeholder="璇疯緭鍏ュ娉�" :disabled="isView" />
         </el-form-item>
       </el-form>
-      <template #footer>
-        <el-button type="primary" @click="submitForm">纭畾</el-button>
-        <el-button @click="dialogVisible = false">鍙栨秷</el-button>
+      <template v-if="!isView" #footer>
+        <el-button type="primary" :loading="submitLoading" @click="submitForm">纭畾</el-button>
+        <el-button @click="closeDialog">鍙栨秷</el-button>
       </template>
     </FormDialog>
+
+    <el-dialog
+      v-model="inboundSelectVisible"
+      title="閫夋嫨鍏ュ簱鍗曞彿"
+      width="1100px"
+      append-to-body
+      destroy-on-close
+      :close-on-click-modal="false"
+      @closed="handleInboundDialogClosed"
+    >
+      <el-table
+        ref="inboundTableRef"
+        v-loading="inboundBatchLoading"
+        :data="inboundBatchList"
+        row-key="id"
+        border
+        stripe
+        max-height="480"
+        @selection-change="handleInboundDialogSelectionChange"
+      >
+        <el-table-column type="selection" width="55" align="center" />
+        <el-table-column prop="inboundBatches" label="鍏ュ簱鍗曞彿" min-width="140" show-overflow-tooltip />
+        <el-table-column prop="supplierName" label="渚涘簲鍟�" min-width="120" show-overflow-tooltip />
+        <el-table-column prop="productName" label="浜у搧鍚嶇О" min-width="120" show-overflow-tooltip />
+        <el-table-column prop="specificationModel" label="瑙勬牸鍨嬪彿" min-width="140" show-overflow-tooltip />
+        <el-table-column prop="purchaseContractNumber" label="閲囪喘璁㈠崟鍙�" min-width="140" show-overflow-tooltip />
+        <el-table-column prop="inboundDate" label="鍏ュ簱鏃ユ湡" width="110" align="center" />
+        <el-table-column prop="inboundAmount" label="鍏ュ簱閲戦(鍚◣)" width="120" align="right">
+          <template #default="{ row }">楼{{ formatMoney(getInboundRowTaxInclusiveAmount(row)) }}</template>
+        </el-table-column>
+      </el-table>
+      <template #footer>
+        <el-button type="primary" @click="confirmInboundSelection">纭畾</el-button>
+        <el-button @click="inboundSelectVisible = false">鍙栨秷</el-button>
+      </template>
+    </el-dialog>
   </div>
 </template>
 
 <script setup>
-import { ref, reactive, onMounted, getCurrentInstance } from "vue";
+import { ref, reactive, computed, onMounted, nextTick, getCurrentInstance } from "vue";
 import { ElMessage, ElMessageBox } from "element-plus";
 import FormDialog from "@/components/Dialog/FormDialog.vue";
+import { getOptions } from "@/api/procurementManagement/procurementLedger.js";
+import {
+  getInboundBatchesBySupplier,
+  addAccountPurchaseInvoice,
+  listPageAccountPurchaseInvoice,
+  cancelAccountPurchaseInvoice,
+  deleteAccountPurchaseInvoice,
+} from "@/api/financialManagement/accountPurchaseInvoice.js";
 
 defineOptions({
   name: "杩涢」鍙戠エ",
@@ -163,10 +305,10 @@
 const { tax_rate } = proxy.useDict("tax_rate");
 
 const filters = reactive({
-  invoiceCode: "",
-  invoiceNo: "",
+  invoiceNumber: "",
   supplierId: "",
-  certifyStatus: "",
+  dateRange: [],
+  status: "",
 });
 
 const pagination = reactive({
@@ -176,211 +318,601 @@
 });
 
 const columns = [
-  { label: "鍙戠エ浠g爜", prop: "invoiceCode", width: "130" },
-  { label: "鍙戠エ鍙风爜", prop: "invoiceNo", width: "120" },
+  { label: "鍙戠エ鍙风爜", prop: "invoiceNo", width: "140" },
   { label: "渚涘簲鍟�", prop: "supplierName", width: "180" },
   { label: "寮�绁ㄦ棩鏈�", prop: "invoiceDate", width: "120" },
-  { label: "閲戦", prop: "amount", slot: "amount" },
-  { label: "绋庨", prop: "taxAmount", slot: "taxAmount" },
-  { label: "浠风◣鍚堣", prop: "totalAmount", slot: "totalAmount" },
-  { label: "璁よ瘉鐘舵��", prop: "certifyStatus", slot: "certifyStatus" },
-  { label: "鎿嶄綔", prop: "operation", slot: "operation", width: "180", fixed: "right" },
+  { label: "閲戦", prop: "amount", dataType: "slot", slot: "amount" },
+  { label: "绋庨", prop: "taxAmount", dataType: "slot", slot: "taxAmount" },
+  { label: "浠风◣鍚堣", prop: "totalAmount", dataType: "slot", slot: "totalAmount" },
+  { label: "鍙戠エ绫诲瀷", prop: "invoiceType", width: "130" },
+  { label: "鐘舵��", prop: "status", dataType: "slot", slot: "status", width: "90", align: "center" },
+  { label: "鎿嶄綔", prop: "operation", dataType: "slot", slot: "operation", width: "200", fixed: "right" },
 ];
 
 const dataList = ref([]);
-const selectedRows = ref([]);
+const tableLoading = ref(false);
 const dialogVisible = ref(false);
 const dialogTitle = ref("");
 const formRef = ref(null);
-const isEdit = ref(false);
-const currentId = ref(null);
+const isView = ref(false);
+const submitLoading = ref(false);
+const supplierList = ref([]);
 
-const supplierList = [
-  { id: 1, name: "鍖椾含鍘熸潗鏂欎緵搴斿晢" },
-  { id: 2, name: "涓婃捣鐢靛瓙鍏冨櫒浠跺叕鍙�" },
-  { id: 3, name: "骞垮窞鍖呰鏉愭枡鍘�" },
-  { id: 4, name: "娣卞湷浜旈噾閰嶄欢鍏徃" },
-];
+const inboundBatchList = ref([]);
+const inboundBatchOptions = ref([]);
+const inboundBatchLoading = ref(false);
+const inboundSelectVisible = ref(false);
+const inboundTableRef = ref(null);
+const dialogInboundSelection = ref([]);
+
+const STATUS_LABEL_MAP = { 0: "姝e父", 1: "浣滃簾" };
+const STATUS_TYPE_MAP = { 0: "success", 1: "info" };
 
 const form = reactive({
-  invoiceCode: "",
   invoiceNo: "",
   supplierId: "",
   invoiceDate: "",
-  amount: 0,
+  invoiceType: "澧炲�肩◣涓撶敤鍙戠エ",
   taxRate: 13,
+  amount: 0,
   taxAmount: 0,
   totalAmount: 0,
-  certifyStatus: "uncertified",
-  certifyDate: "",
   content: "",
   remark: "",
+  stockInRecordIds: [],
+  inboundBatches: "",
+  storageAttachmentId: undefined,
+  status: 0,
 });
 
 const rules = {
-  invoiceCode: [{ required: true, message: "璇疯緭鍏ュ彂绁ㄤ唬鐮�", trigger: "blur" }],
   invoiceNo: [{ required: true, message: "璇疯緭鍏ュ彂绁ㄥ彿鐮�", trigger: "blur" }],
   supplierId: [{ required: true, message: "璇烽�夋嫨渚涘簲鍟�", trigger: "change" }],
+  stockInRecordIds: [{ required: true, type: "array", min: 1, message: "璇烽�夋嫨鍏宠仈鍏ュ簱鍗�", trigger: "change" }],
   invoiceDate: [{ required: true, message: "璇烽�夋嫨寮�绁ㄦ棩鏈�", trigger: "change" }],
-  amount: [{ required: true, message: "璇疯緭鍏ラ噾棰�", trigger: "blur" }],
+  invoiceType: [{ required: true, message: "璇烽�夋嫨鍙戠エ绫诲瀷", trigger: "change" }],
   taxRate: [{ required: true, message: "璇烽�夋嫨绋庣巼", trigger: "change" }],
+  amount: [{ required: true, message: "璇疯緭鍏ラ噾棰�", trigger: "blur" }],
 };
-
-const mockData = [
-  { id: 1, invoiceCode: "0440021001", invoiceNo: "12345678", supplierId: 1, supplierName: "鍖椾含鍘熸潗鏂欎緵搴斿晢", invoiceDate: "2024-01-08", amount: 8000, taxRate: 13, taxAmount: 1040, totalAmount: 9040, certifyStatus: "certified", certifyDate: "2024-01-15", content: "鍘熸潗鏂欓噰璐�", remark: "" },
-  { id: 2, invoiceCode: "0440021002", invoiceNo: "87654321", supplierId: 2, supplierName: "涓婃捣鐢靛瓙鍏冨櫒浠跺叕鍙�", invoiceDate: "2024-01-10", amount: 12000, taxRate: 13, taxAmount: 1560, totalAmount: 13560, certifyStatus: "uncertified", certifyDate: "", content: "鐢靛瓙鍏冨櫒浠�", remark: "" },
-  { id: 3, invoiceCode: "0440021003", invoiceNo: "11112222", supplierId: 3, supplierName: "骞垮窞鍖呰鏉愭枡鍘�", invoiceDate: "2024-01-12", amount: 3500, taxRate: 13, taxAmount: 455, totalAmount: 3955, certifyStatus: "certified", certifyDate: "2024-01-18", content: "鍖呰鏉愭枡", remark: "" },
-];
 
 const formatMoney = (value) => {
   if (value === undefined || value === null) return "0.00";
   return Number(value).toFixed(2).replace(/\B(?=(\d{3})+(?!\d))/g, ",");
 };
 
-const calculateTax = () => {
+const normalizeStatus = (status) => {
+  if (status === undefined || status === null || status === "") return 0;
+  const num = Number(status);
+  return Number.isNaN(num) ? 0 : num;
+};
+
+const isNormalStatus = (status) => normalizeStatus(status) === 0;
+
+const getStatusLabel = (status) => STATUS_LABEL_MAP[normalizeStatus(status)] ?? "姝e父";
+
+const getStatusType = (status) => STATUS_TYPE_MAP[normalizeStatus(status)] ?? "success";
+
+const parseStockInRecordIds = (value) => {
+  if (!value) return [];
+  if (Array.isArray(value)) return value;
+  return String(value)
+    .split(/[,锛宂/)
+    .map((s) => s.trim())
+    .filter(Boolean)
+    .map((s) => (/^\d+$/.test(s) ? Number(s) : s));
+};
+
+const formatInboundBatches = (value) => {
+  if (value === undefined || value === null || value === "") return "";
+  if (Array.isArray(value)) return value.filter(Boolean).join("銆�");
+  return String(value)
+    .split(/[,锛宂/)
+    .map((s) => s.trim())
+    .filter(Boolean)
+    .join("銆�");
+};
+
+const isSameInboundId = (a, b) => String(a) === String(b);
+
+const getInboundRowId = (row) => row?.id ?? row?.stockInRecordId;
+
+/** 鍏ュ簱鍗曢噾棰濅负鍚◣浠� */
+const getInboundRowTaxInclusiveAmount = (row) =>
+  Number(row?.inboundAmount ?? row?.taxInclusivePrice ?? row?.totalAmount ?? 0);
+
+const normalizeInboundBatchOptions = (data) => {
+  const list = Array.isArray(data) ? data : [];
+  return list.map((item, index) => {
+    if (typeof item === "string" || typeof item === "number") {
+      const text = String(item);
+      return { label: text, value: text, inboundAmount: 0 };
+    }
+    const label =
+      item.inboundBatches ?? item.batchNo ?? item.inboundNo ?? item.label ?? `鍏ュ簱鍗�${index + 1}`;
+    const value = item.id ?? item.stockInRecordId ?? label;
+    return {
+      label: String(label),
+      value,
+      inboundAmount: getInboundRowTaxInclusiveAmount(item),
+    };
+  });
+};
+
+/** 涓嶅惈绋庨噾棰濆彉鏇达細绋庨銆佷环绋庡悎璁℃鍚戣绠� */
+const calculateTaxFromExclusive = () => {
   form.taxAmount = Number((form.amount * form.taxRate / 100).toFixed(2));
   form.totalAmount = Number((form.amount + form.taxAmount).toFixed(2));
 };
 
-const getCertifyStatusLabel = (status) => {
-  const map = { uncertified: "鏈璇�", certified: "宸茶璇�", failed: "璁よ瘉澶辫触" };
-  return map[status] || status;
+/** 浠风◣鍚堣鍙樻洿锛氭寜绋庣巼鍙嶇畻涓嶅惈绋庨噾棰濄�佺◣棰� */
+const calculateTaxFromInclusive = (inclusiveTotal) => {
+  const total = Number(inclusiveTotal ?? form.totalAmount ?? 0);
+  if (total <= 0) {
+    form.amount = 0;
+    form.taxAmount = 0;
+    form.totalAmount = 0;
+    return;
+  }
+  const rate = Number(form.taxRate) / 100;
+  form.totalAmount = Number(total.toFixed(2));
+  form.amount = Number((form.totalAmount / (1 + rate)).toFixed(2));
+  form.taxAmount = Number((form.totalAmount - form.amount).toFixed(2));
 };
 
-const getCertifyStatusType = (status) => {
-  const map = { uncertified: "info", certified: "success", failed: "danger" };
-  return map[status] || "";
+const handleTaxRateChange = () => {
+  if (form.totalAmount > 0) {
+    calculateTaxFromInclusive(form.totalAmount);
+  } else {
+    calculateTaxFromExclusive();
+  }
+};
+
+/** 鏍规嵁宸查�夊叆搴撳崟姹囨�诲惈绋庨噾棰濓紝鍙嶇畻涓嶅惈绋庨噾棰濅笌绋庨 */
+const syncInvoiceAmount = () => {
+  const selected = form.stockInRecordIds || [];
+  const sumFromOptions = inboundBatchOptions.value
+    .filter((opt) => selected.some((id) => isSameInboundId(id, opt.value)))
+    .reduce((acc, opt) => acc + (Number(opt.inboundAmount) || 0), 0);
+
+  let taxInclusiveSum = sumFromOptions;
+  if (taxInclusiveSum <= 0 && selected.length) {
+    taxInclusiveSum = inboundBatchList.value
+      .filter((row) => selected.some((id) => isSameInboundId(id, getInboundRowId(row))))
+      .reduce((acc, row) => acc + getInboundRowTaxInclusiveAmount(row), 0);
+  }
+
+  calculateTaxFromInclusive(taxInclusiveSum > 0 ? Number(taxInclusiveSum.toFixed(2)) : 0);
+};
+
+const inboundBatchDisplayText = computed(() => {
+  if (form.inboundBatches) return form.inboundBatches;
+  const ids = form.stockInRecordIds || [];
+  if (!ids.length) return "";
+  const labels = inboundBatchOptions.value
+    .filter((opt) => ids.some((id) => isSameInboundId(id, opt.value)))
+    .map((opt) => opt.label);
+  if (labels.length) return labels.join("銆�");
+  return ids.join("銆�");
+});
+
+const normalizeTableRow = (row) => ({
+  ...row,
+  invoiceNo: row.invoiceNumber ?? row.invoiceNo,
+  invoiceDate: row.issueDate ?? row.invoiceDate,
+  amount: row.taxExclusivelPrice ?? row.amount,
+  taxAmount: row.taxPrice ?? row.taxAmount,
+  totalAmount: row.taxInclusivePrice ?? row.totalAmount,
+  content: row.invoiceContent ?? row.content,
+  status: normalizeStatus(row.status),
+  stockInRecordIds: row.stockInRecordIds ?? "",
+  inboundBatches: formatInboundBatches(row.inboundBatches),
+});
+
+const toFormNumber = (val) => {
+  const n = Number(val);
+  return Number.isFinite(n) ? n : 0;
+};
+
+const resolveFormAmounts = (row) => {
+  let amount = toFormNumber(row.taxExclusivelPrice ?? row.amount);
+  let taxAmount = toFormNumber(row.taxPrice ?? row.taxAmount);
+  let totalAmount = toFormNumber(row.taxInclusivePrice ?? row.totalAmount);
+  const taxRate = toFormNumber(row.taxRate) || 13;
+
+  if (totalAmount > 0 && amount === 0 && taxAmount === 0) {
+    amount = Number((totalAmount / (1 + taxRate / 100)).toFixed(2));
+    taxAmount = Number((totalAmount - amount).toFixed(2));
+  } else if (totalAmount > 0 && amount > 0 && taxAmount === 0) {
+    taxAmount = Number((totalAmount - amount).toFixed(2));
+  } else if (amount > 0 && taxAmount === 0 && totalAmount === 0) {
+    taxAmount = Number((amount * taxRate / 100).toFixed(2));
+    totalAmount = Number((amount + taxAmount).toFixed(2));
+  } else if (amount > 0 && taxAmount > 0 && totalAmount === 0) {
+    totalAmount = Number((amount + taxAmount).toFixed(2));
+  }
+
+  return { amount, taxAmount, totalAmount };
+};
+
+const fillFormFromRow = (row) => {
+  const stockInRecordIds = parseStockInRecordIds(row.stockInRecordIds);
+  const { amount, taxAmount, totalAmount } = resolveFormAmounts(row);
+  Object.assign(form, {
+    invoiceNo: row.invoiceNo ?? row.invoiceNumber ?? "",
+    supplierId: row.supplierId,
+    invoiceDate: row.invoiceDate ?? row.issueDate ?? "",
+    invoiceType: row.invoiceType ?? "澧炲�肩◣涓撶敤鍙戠エ",
+    taxRate: row.taxRate ?? 13,
+    amount,
+    taxAmount,
+    totalAmount,
+    content: row.content ?? row.invoiceContent ?? "",
+    remark: row.remark ?? "",
+    stockInRecordIds,
+    inboundBatches: formatInboundBatches(row.inboundBatches),
+    storageAttachmentId: row.storageAttachmentId,
+    status: normalizeStatus(row.status),
+  });
+};
+
+const buildCancelPayload = (row) => ({
+  id: row.id,
+  invoiceNumber: row.invoiceNumber ?? row.invoiceNo,
+  taxRate: row.taxRate,
+  invoiceType: row.invoiceType,
+  issueDate: row.issueDate ?? row.invoiceDate,
+  taxExclusivelPrice: row.taxExclusivelPrice ?? row.amount,
+  taxPrice: row.taxPrice ?? row.taxAmount,
+  taxInclusivePrice: row.taxInclusivePrice ?? row.totalAmount,
+  remark: row.remark ?? "",
+  invoiceContent: row.invoiceContent ?? row.content,
+  supplierId: row.supplierId,
+  storageAttachmentId: row.storageAttachmentId,
+  stockInRecordIds: row.stockInRecordIds ?? "",
+  status: 1,
+});
+
+const buildSubmitPayload = () => ({
+  invoiceNumber: form.invoiceNo,
+  supplierId: form.supplierId,
+  issueDate: form.invoiceDate,
+  invoiceType: form.invoiceType,
+  taxRate: form.taxRate,
+  taxExclusivelPrice: form.amount,
+  taxPrice: form.taxAmount,
+  taxInclusivePrice: form.totalAmount,
+  invoiceContent: form.content,
+  remark: form.remark || "",
+  stockInRecordIds: (form.stockInRecordIds || []).join(","),
+  status: 0,
+  storageAttachmentId: form.storageAttachmentId,
+});
+
+const getSupplierList = () => {
+  getOptions().then((res) => {
+    if (res.code === 200) {
+      supplierList.value = res.data ?? [];
+    }
+  });
+};
+
+const appendFilterParams = (params) => {
+  if (filters.invoiceNumber) {
+    params.invoiceNumber = filters.invoiceNumber;
+  }
+  if (filters.supplierId) {
+    params.supplierId = filters.supplierId;
+  }
+  if (filters.dateRange?.length === 2) {
+    params.startDate = filters.dateRange[0];
+    params.endDate = filters.dateRange[1];
+  }
+  if (filters.status !== "" && filters.status != null) {
+    params.status = filters.status;
+  }
+  return params;
+};
+
+const buildListParams = () =>
+  appendFilterParams({
+    current: pagination.currentPage,
+    size: pagination.pageSize,
+  });
+
+const buildExportParams = () => appendFilterParams({});
+
+const handleExport = () => {
+  proxy.download(
+    "/accountPurchaseInvoice/exportAccountPurchaseInvoice",
+    buildExportParams(),
+    `杩涢」鍙戠エ_${Date.now()}.xlsx`
+  );
 };
 
 const getTableData = () => {
-  let result = [...mockData];
-  if (filters.invoiceCode) {
-    result = result.filter(item => item.invoiceCode.includes(filters.invoiceCode));
-  }
-  if (filters.invoiceNo) {
-    result = result.filter(item => item.invoiceNo.includes(filters.invoiceNo));
-  }
-  if (filters.supplierId) {
-    result = result.filter(item => item.supplierId === filters.supplierId);
-  }
-  if (filters.certifyStatus) {
-    result = result.filter(item => item.certifyStatus === filters.certifyStatus);
-  }
-  pagination.total = result.length;
-  dataList.value = result.slice((pagination.currentPage - 1) * pagination.pageSize, pagination.currentPage * pagination.pageSize);
+  tableLoading.value = true;
+  listPageAccountPurchaseInvoice(buildListParams())
+    .then((res) => {
+      if (res.code === 200) {
+        const records = res.data?.records ?? [];
+        dataList.value = records.map(normalizeTableRow);
+        pagination.total = res.data?.total ?? 0;
+      } else {
+        dataList.value = [];
+        pagination.total = 0;
+        ElMessage.error(res.msg || "鏌ヨ澶辫触");
+      }
+    })
+    .catch(() => {
+      dataList.value = [];
+      pagination.total = 0;
+      ElMessage.error("鏌ヨ澶辫触");
+    })
+    .finally(() => {
+      tableLoading.value = false;
+    });
 };
 
-const resetFilters = () => {
-  filters.invoiceCode = "";
-  filters.invoiceNo = "";
-  filters.supplierId = "";
-  filters.certifyStatus = "";
+const onSearch = () => {
   pagination.currentPage = 1;
   getTableData();
 };
 
-const changePage = ({ current, size }) => {
-  pagination.currentPage = current;
-  pagination.pageSize = size;
+const resetFilters = () => {
+  filters.invoiceNumber = "";
+  filters.supplierId = "";
+  filters.dateRange = [];
+  filters.status = "";
+  pagination.currentPage = 1;
   getTableData();
 };
 
-const handleSelectionChange = (selection) => {
-  selectedRows.value = selection;
+const changePage = ({ page, limit }) => {
+  pagination.currentPage = page;
+  pagination.pageSize = limit;
+  getTableData();
+};
+
+const closeDialog = () => {
+  dialogVisible.value = false;
+  isView.value = false;
+  inboundSelectVisible.value = false;
+};
+
+const resetForm = () => {
+  Object.assign(form, {
+    invoiceNo: "",
+    supplierId: "",
+    invoiceDate: new Date().toISOString().split("T")[0],
+    invoiceType: "澧炲�肩◣涓撶敤鍙戠エ",
+    taxRate: 13,
+    amount: 0,
+    taxAmount: 0,
+    totalAmount: 0,
+    content: "",
+    remark: "",
+    stockInRecordIds: [],
+    inboundBatches: "",
+    storageAttachmentId: undefined,
+    status: 0,
+  });
+  inboundBatchList.value = [];
+  inboundBatchOptions.value = [];
 };
 
 const add = () => {
-  isEdit.value = false;
+  isView.value = false;
   dialogTitle.value = "褰曞叆鍙戠エ";
-  Object.assign(form, {
-    invoiceCode: "",
-    invoiceNo: "",
-    supplierId: "",
-    invoiceDate: new Date().toISOString().split('T')[0],
-    amount: 0,
-    taxRate: 13,
-    taxAmount: 0,
-    totalAmount: 0,
-    certifyStatus: "uncertified",
-    certifyDate: "",
-    content: "",
-    remark: "",
-  });
-  dialogVisible.value = true;
-};
-
-const edit = (row) => {
-  isEdit.value = true;
-  currentId.value = row.id;
-  dialogTitle.value = "缂栬緫鍙戠エ";
-  Object.assign(form, row);
+  resetForm();
   dialogVisible.value = true;
 };
 
 const view = (row) => {
-  ElMessage.info(`鏌ョ湅鍙戠エ: ${row.invoiceCode}-${row.invoiceNo}`);
+  isView.value = true;
+  dialogTitle.value = "鏌ョ湅鍙戠エ";
+  fillFormFromRow(row);
+  if (row.supplierId) {
+    loadInboundBatches(row.supplierId, true, false);
+  }
+  dialogVisible.value = true;
 };
 
-const handleCertify = (row) => {
-  ElMessageBox.confirm("纭璁よ瘉璇ュ彂绁ㄥ悧锛�", "鎻愮ず", {
-    confirmButtonText: "纭",
+const handleCancel = (row) => {
+  ElMessageBox.confirm(`纭浣滃簾鍙戠エ銆�${row.invoiceNo ?? row.invoiceNumber}銆嶅悧锛焋, "浣滃簾纭", {
+    confirmButtonText: "纭畾",
     cancelButtonText: "鍙栨秷",
-    type: "info",
+    type: "warning",
   }).then(() => {
-    const index = mockData.findIndex(item => item.id === row.id);
-    if (index !== -1) {
-      mockData[index].certifyStatus = "certified";
-      mockData[index].certifyDate = new Date().toISOString().split('T')[0];
-    }
-    ElMessage.success("璁よ瘉鎴愬姛");
-    getTableData();
+    cancelAccountPurchaseInvoice(buildCancelPayload(row))
+      .then((res) => {
+        if (res.code === 200) {
+          ElMessage.success("浣滃簾鎴愬姛");
+          getTableData();
+        } else {
+          ElMessage.error(res.msg || "浣滃簾澶辫触");
+        }
+      })
+      .catch(() => {
+        ElMessage.error("浣滃簾澶辫触");
+      });
   });
 };
 
-const handleBatchCertify = () => {
-  ElMessageBox.confirm(`纭鎵归噺璁よ瘉閫変腑鐨� ${selectedRows.value.length} 寮犲彂绁ㄥ悧锛焋, "鎻愮ず", {
-    confirmButtonText: "纭",
+const handleDelete = (row) => {
+  ElMessageBox.confirm(`纭鍒犻櫎鍙戠エ銆�${row.invoiceNo ?? row.invoiceNumber}銆嶅悧锛焋, "鍒犻櫎纭", {
+    confirmButtonText: "纭畾",
     cancelButtonText: "鍙栨秷",
-    type: "info",
+    type: "warning",
   }).then(() => {
-    selectedRows.value.forEach(row => {
-      const index = mockData.findIndex(item => item.id === row.id);
-      if (index !== -1 && mockData[index].certifyStatus === "uncertified") {
-        mockData[index].certifyStatus = "certified";
-        mockData[index].certifyDate = new Date().toISOString().split('T')[0];
-      }
-    });
-    ElMessage.success("鎵归噺璁よ瘉鎴愬姛");
-    getTableData();
+    deleteAccountPurchaseInvoice([row.id])
+      .then((res) => {
+        if (res.code === 200) {
+          ElMessage.success("鍒犻櫎鎴愬姛");
+          getTableData();
+        } else {
+          ElMessage.error(res.msg || "鍒犻櫎澶辫触");
+        }
+      })
+      .catch(() => {
+        ElMessage.error("鍒犻櫎澶辫触");
+      });
   });
-};
-
-const handleOut = () => {
-  ElMessage.success("瀵煎嚭鎴愬姛");
 };
 
 const submitForm = () => {
-  formRef.value.validate((valid) => {
-    if (valid) {
-      const supplier = supplierList.find(item => item.id === form.supplierId);
-      if (isEdit.value) {
-        const index = mockData.findIndex(item => item.id === currentId.value);
-        if (index !== -1) {
-          mockData[index] = { ...mockData[index], ...form, supplierName: supplier?.name };
+  formRef.value?.validate((valid) => {
+    if (!valid) return;
+    submitLoading.value = true;
+    addAccountPurchaseInvoice(buildSubmitPayload())
+      .then((res) => {
+        if (res.code === 200) {
+          ElMessage.success("褰曞叆鎴愬姛");
+          closeDialog();
+          pagination.currentPage = 1;
+          getTableData();
+        } else {
+          ElMessage.error(res.msg || "褰曞叆澶辫触");
         }
-        ElMessage.success("缂栬緫鎴愬姛");
-      } else {
-        const newId = mockData.length > 0 ? Math.max(...mockData.map(item => item.id)) + 1 : 1;
-        mockData.push({ id: newId, ...form, supplierName: supplier?.name });
-        ElMessage.success("褰曞叆鎴愬姛");
-      }
-      dialogVisible.value = false;
-      getTableData();
-    }
+      })
+      .catch(() => {
+        ElMessage.error("褰曞叆澶辫触");
+      })
+      .finally(() => {
+        submitLoading.value = false;
+      });
   });
 };
 
+const ensureInboundOptionsForSelected = () => {
+  const ids = form.stockInRecordIds || [];
+  ids.forEach((id) => {
+    const exists = inboundBatchOptions.value.some((opt) => isSameInboundId(opt.value, id));
+    if (exists) return;
+    const fromList = inboundBatchList.value.find((row) => isSameInboundId(getInboundRowId(row), id));
+    if (fromList) {
+      const [option] = normalizeInboundBatchOptions([fromList]);
+      if (option) inboundBatchOptions.value.push(option);
+      return;
+    }
+    inboundBatchOptions.value.push({
+      label: String(id),
+      value: id,
+      inboundAmount: 0,
+    });
+  });
+};
+
+const restoreInboundTableSelection = () => {
+  nextTick(() => {
+    const table = inboundTableRef.value;
+    if (!table) return;
+    table.clearSelection();
+    const selectedIds = new Set((form.stockInRecordIds || []).map((id) => String(id)));
+    inboundBatchList.value.forEach((row) => {
+      const rowId = getInboundRowId(row);
+      if (rowId !== undefined && rowId !== null && selectedIds.has(String(rowId))) {
+        table.toggleRowSelection(row, true);
+      }
+    });
+  });
+};
+
+const loadInboundBatches = (supplierId, keepSelected = false, syncAmount = true) => {
+  if (!supplierId) {
+    inboundBatchList.value = [];
+    inboundBatchOptions.value = [];
+    if (!keepSelected) {
+      form.stockInRecordIds = [];
+      form.inboundBatches = "";
+      form.amount = 0;
+      form.taxAmount = 0;
+      form.totalAmount = 0;
+    }
+    return Promise.resolve();
+  }
+  inboundBatchLoading.value = true;
+  return getInboundBatchesBySupplier({ supplierId })
+    .then((res) => {
+      if (res.code === 200) {
+        const list = res.data?.records ?? res.data ?? [];
+        inboundBatchList.value = Array.isArray(list) ? list : [];
+        inboundBatchOptions.value = normalizeInboundBatchOptions(list);
+      } else {
+        inboundBatchList.value = [];
+        inboundBatchOptions.value = [];
+      }
+    })
+    .catch(() => {
+      inboundBatchList.value = [];
+      inboundBatchOptions.value = [];
+    })
+    .finally(() => {
+      inboundBatchLoading.value = false;
+      if (keepSelected) {
+        ensureInboundOptionsForSelected();
+        restoreInboundTableSelection();
+        if (syncAmount && !isView.value) {
+          syncInvoiceAmount();
+        }
+      }
+    });
+};
+
+const handleSupplierChange = (supplierId) => {
+  form.stockInRecordIds = [];
+  form.inboundBatches = "";
+  form.amount = 0;
+  form.taxAmount = 0;
+  form.totalAmount = 0;
+  loadInboundBatches(supplierId);
+};
+
+const handleInboundInputClick = () => {
+  if (isView.value) return;
+  openInboundSelectDialog();
+};
+
+const openInboundSelectDialog = () => {
+  if (!form.supplierId || isView.value) return;
+  inboundSelectVisible.value = true;
+  loadInboundBatches(form.supplierId, true).then(() => {
+    restoreInboundTableSelection();
+  });
+};
+
+const handleInboundDialogSelectionChange = (selection) => {
+  dialogInboundSelection.value = selection;
+};
+
+const confirmInboundSelection = () => {
+  if (dialogInboundSelection.value.length === 0) {
+    ElMessage.warning("璇疯嚦灏戦�夋嫨涓�鏉″叆搴撳崟");
+    return;
+  }
+  form.stockInRecordIds = dialogInboundSelection.value
+    .map((row) => getInboundRowId(row))
+    .filter((id) => id !== undefined && id !== null);
+  form.inboundBatches = dialogInboundSelection.value
+    .map((row) => row.inboundBatches ?? row.batchNo ?? "")
+    .filter(Boolean)
+    .join("銆�");
+  dialogInboundSelection.value.forEach((row) => {
+    const [option] = normalizeInboundBatchOptions([row]);
+    if (option && !inboundBatchOptions.value.some((opt) => isSameInboundId(opt.value, option.value))) {
+      inboundBatchOptions.value.push(option);
+    }
+  });
+  inboundSelectVisible.value = false;
+  syncInvoiceAmount();
+  formRef.value?.validateField("stockInRecordIds");
+};
+
+const handleInboundDialogClosed = () => {
+  dialogInboundSelection.value = [];
+};
+
 onMounted(() => {
+  getSupplierList();
   getTableData();
 });
 </script>
@@ -406,4 +938,8 @@
   color: #67c23a;
   font-weight: bold;
 }
+
+.inbound-batch-input :deep(.el-input__wrapper) {
+  cursor: pointer;
+}
 </style>
diff --git a/src/views/financialManagement/payable/payment.vue b/src/views/financialManagement/payable/payment.vue
index d4774fe..18e7941 100644
--- a/src/views/financialManagement/payable/payment.vue
+++ b/src/views/financialManagement/payable/payment.vue
@@ -1,377 +1,299 @@
 <template>
   <div class="app-container">
-    <el-form :model="filters" :inline="true">
+    <el-form :model="filters"
+             :inline="true">
       <el-form-item label="浠樻鍗曞彿:">
-        <el-input v-model="filters.paymentCode" placeholder="璇疯緭鍏ヤ粯娆惧崟鍙�" clearable style="width: 200px;" />
+        <el-input v-model="filters.paymentNumber"
+                  placeholder="璇疯緭鍏ヤ粯娆惧崟鍙�"
+                  clearable
+                  style="width: 200px;" />
       </el-form-item>
       <el-form-item label="渚涘簲鍟�:">
-        <el-select v-model="filters.supplierId" placeholder="璇烽�夋嫨渚涘簲鍟�" clearable style="width: 200px;">
-          <el-option v-for="item in supplierList" :key="item.id" :label="item.name" :value="item.id" />
+        <el-select v-model="filters.supplierId"
+                   placeholder="璇烽�夋嫨渚涘簲鍟�"
+                   clearable
+                   filterable
+                   style="width: 200px;">
+          <el-option v-for="item in supplierList"
+                     :key="item.id"
+                     :label="item.supplierName"
+                     :value="item.id" />
         </el-select>
       </el-form-item>
       <el-form-item label="浠樻鏂瑰紡:">
-        <el-select v-model="filters.paymentMethod" placeholder="璇烽�夋嫨浠樻鏂瑰紡" clearable style="width: 150px;">
-          <el-option label="閾惰杞处" value="bank_transfer" />
-          <el-option label="鐜伴噾" value="cash" />
-          <el-option label="鏀エ" value="check" />
-          <el-option label="姹囩エ" value="draft" />
+        <el-select v-model="filters.paymentMethod"
+                   placeholder="璇烽�夋嫨浠樻鏂瑰紡"
+                   clearable
+                   style="width: 150px;">
+          <el-option v-for="item in checkout_payment"
+                     :key="item.value"
+                     :label="item.label"
+                     :value="item.value" />
         </el-select>
       </el-form-item>
-      <el-form-item label="鐘舵��:">
-        <el-select v-model="filters.status" placeholder="璇烽�夋嫨鐘舵��" clearable style="width: 150px;">
-          <el-option label="寰呬粯娆�" value="pending" />
-          <el-option label="宸插畬鎴�" value="completed" />
-          <el-option label="宸插彇娑�" value="cancelled" />
-        </el-select>
+      <el-form-item label="浠樻鏃ユ湡:">
+        <el-date-picker v-model="filters.dateRange"
+                        type="daterange"
+                        value-format="YYYY-MM-DD"
+                        format="YYYY-MM-DD"
+                        range-separator="鑷�"
+                        start-placeholder="寮�濮嬫棩鏈�"
+                        end-placeholder="缁撴潫鏃ユ湡"
+                        clearable
+                        style="width: 240px;" />
       </el-form-item>
       <el-form-item>
-        <el-button type="primary" @click="getTableData">鎼滅储</el-button>
+        <el-button type="primary"
+                   @click="onSearch">鎼滅储</el-button>
         <el-button @click="resetFilters">閲嶇疆</el-button>
       </el-form-item>
     </el-form>
     <div class="table_list">
       <div class="actions">
         <div>
-          <el-statistic title="鏈湡浠樻鍚堣" :value="totalPaymentAmount" precision="2" prefix="楼" />
+          <el-statistic title="鏈〉浠樻鍚堣"
+                        :value="totalPaymentAmount"
+                        :precision="2"
+                        prefix="楼" />
         </div>
         <div>
-          <el-button type="primary" @click="add" icon="Plus">鏂板浠樻</el-button>
-          <el-button @click="handleOut" icon="Download">瀵煎嚭</el-button>
+          <el-button @click="handleExport"
+                     icon="Download">瀵煎嚭</el-button>
         </div>
       </div>
-      <PIMTable
-        rowKey="id"
-        :column="columns"
-        :tableData="dataList"
-        :page="{
+      <PIMTable rowKey="id"
+                :column="columns"
+                :tableData="dataList"
+                :tableLoading="tableLoading"
+                :page="{
           current: pagination.currentPage,
           size: pagination.pageSize,
           total: pagination.total,
         }"
-        @pagination="changePage"
-      >
+                @pagination="changePage">
         <template #amount="{ row }">
           <span class="text-danger">楼{{ formatMoney(row.amount) }}</span>
         </template>
         <template #paymentMethod="{ row }">
           <el-tag>{{ getPaymentMethodLabel(row.paymentMethod) }}</el-tag>
         </template>
-        <template #status="{ row }">
-          <el-tag :type="row.status === 'completed' ? 'success' : row.status === 'pending' ? 'warning' : 'info'">
-            {{ row.status === 'completed' ? '宸插畬鎴�' : row.status === 'pending' ? '寰呬粯娆�' : '宸插彇娑�' }}
-          </el-tag>
-        </template>
         <template #operation="{ row }">
-          <el-button type="primary" link @click="view(row)">鏌ョ湅</el-button>
-          <el-button type="primary" link @click="edit(row)" v-if="row.status === 'pending'">缂栬緫</el-button>
-          <el-button type="success" link @click="handleComplete(row)" v-if="row.status === 'pending'">瀹屾垚</el-button>
-          <el-button type="danger" link @click="handleCancel(row)" v-if="row.status === 'pending'">鍙栨秷</el-button>
+          <el-button :disabled="row.accountStatemen"
+                     type="danger"
+                     link
+                     @click="handleDelete(row)">鍒犻櫎</el-button>
         </template>
       </PIMTable>
     </div>
-
-    <FormDialog :title="dialogTitle" v-model="dialogVisible" width="800px" @confirm="submitForm" @cancel="dialogVisible = false">
-      <el-form :model="form" :rules="rules" ref="formRef" label-width="120px">
-        <el-row :gutter="20">
-          <el-col :span="12">
-            <el-form-item label="浠樻鍗曞彿" prop="paymentCode">
-              <el-input v-model="form.paymentCode" placeholder="绯荤粺鑷姩鐢熸垚" disabled />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="鍏宠仈鐢宠鍗�" prop="applyCode">
-              <el-select v-model="form.applyCode" placeholder="璇烽�夋嫨鍏宠仈鐢宠鍗�" style="width: 100%;" :disabled="isEdit">
-                <el-option v-for="item in applyList" :key="item.applyCode" :label="item.applyCode" :value="item.applyCode" />
-              </el-select>
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="20">
-          <el-col :span="12">
-            <el-form-item label="渚涘簲鍟�" prop="supplierId">
-              <el-select v-model="form.supplierId" placeholder="璇烽�夋嫨渚涘簲鍟�" style="width: 100%;" :disabled="isEdit">
-                <el-option v-for="item in supplierList" :key="item.id" :label="item.name" :value="item.id" />
-              </el-select>
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="浠樻鏃ユ湡" prop="paymentDate">
-              <el-date-picker v-model="form.paymentDate" type="date" placeholder="閫夋嫨鏃ユ湡" value-format="YYYY-MM-DD" style="width: 100%;" />
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="20">
-          <el-col :span="12">
-            <el-form-item label="浠樻閲戦" prop="amount">
-              <el-input-number v-model="form.amount" :min="0" :precision="2" style="width: 100%;" />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="浠樻鏂瑰紡" prop="paymentMethod">
-              <el-select v-model="form.paymentMethod" placeholder="璇烽�夋嫨浠樻鏂瑰紡" style="width: 100%;">
-                <el-option label="閾惰杞处" value="bank_transfer" />
-                <el-option label="鐜伴噾" value="cash" />
-                <el-option label="鏀エ" value="check" />
-                <el-option label="姹囩エ" value="draft" />
-              </el-select>
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="20">
-          <el-col :span="12">
-            <el-form-item label="閾惰璐﹀彿" prop="bankAccount" v-if="form.paymentMethod === 'bank_transfer'">
-              <el-input v-model="form.bankAccount" placeholder="璇疯緭鍏ラ摱琛岃处鍙�" />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="寮�鎴疯" prop="bankName" v-if="form.paymentMethod === 'bank_transfer'">
-              <el-input v-model="form.bankName" placeholder="璇疯緭鍏ュ紑鎴疯" />
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-form-item label="澶囨敞" prop="remark">
-          <el-input v-model="form.remark" type="textarea" :rows="3" placeholder="璇疯緭鍏ュ娉�" />
-        </el-form-item>
-      </el-form>
-      <template #footer>
-        <el-button type="primary" @click="submitForm">纭畾</el-button>
-        <el-button @click="dialogVisible = false">鍙栨秷</el-button>
-      </template>
-    </FormDialog>
   </div>
 </template>
 
 <script setup>
-import { ref, reactive, onMounted, computed } from "vue";
-import { ElMessage, ElMessageBox } from "element-plus";
-import FormDialog from "@/components/Dialog/FormDialog.vue";
+  import { ref, reactive, computed, onMounted, getCurrentInstance } from "vue";
+  import { ElMessage, ElMessageBox } from "element-plus";
+  import { getOptions } from "@/api/procurementManagement/procurementLedger.js";
+  import {
+    listPageAccountPurchasePayment,
+    deleteAccountPurchasePayment,
+  } from "@/api/financialManagement/accountPurchasePayment.js";
 
-defineOptions({
-  name: "浠樻鍗�",
-});
+  defineOptions({
+    name: "浠樻鍗�",
+  });
 
-const filters = reactive({
-  paymentCode: "",
-  supplierId: "",
-  paymentMethod: "",
-  status: "",
-});
+  const { proxy } = getCurrentInstance();
+  const { checkout_payment } = proxy.useDict("checkout_payment");
 
-const pagination = reactive({
-  currentPage: 1,
-  pageSize: 10,
-  total: 0,
-});
-
-const columns = [
-  { label: "浠樻鍗曞彿", prop: "paymentCode", width: "150" },
-  { label: "鍏宠仈鐢宠鍗�", prop: "applyCode", width: "150" },
-  { label: "渚涘簲鍟�", prop: "supplierName", width: "180" },
-  { label: "浠樻鏃ユ湡", prop: "paymentDate", width: "120" },
-  { label: "浠樻閲戦", prop: "amount", slot: "amount" },
-  { label: "浠樻鏂瑰紡", prop: "paymentMethod", slot: "paymentMethod" },
-  { label: "鐘舵��", prop: "status", slot: "status" },
-  { label: "澶囨敞", prop: "remark", showOverflowTooltip: true },
-  { label: "鎿嶄綔", prop: "operation", slot: "operation", width: "220", fixed: "right" },
-];
-
-const dataList = ref([]);
-const dialogVisible = ref(false);
-const dialogTitle = ref("");
-const formRef = ref(null);
-const isEdit = ref(false);
-const currentId = ref(null);
-
-const supplierList = [
-  { id: 1, name: "鍖椾含鍘熸潗鏂欎緵搴斿晢" },
-  { id: 2, name: "涓婃捣鐢靛瓙鍏冨櫒浠跺叕鍙�" },
-  { id: 3, name: "骞垮窞鍖呰鏉愭枡鍘�" },
-  { id: 4, name: "娣卞湷浜旈噾閰嶄欢鍏徃" },
-];
-
-const applyList = [
-  { applyCode: "FK2024001", supplierId: 1, amount: 5000 },
-  { applyCode: "FK2024002", supplierId: 2, amount: 8000 },
-  { applyCode: "FK2024003", supplierId: 3, amount: 3000 },
-];
-
-const form = reactive({
-  paymentCode: "",
-  applyCode: "",
-  supplierId: "",
-  paymentDate: "",
-  amount: 0,
-  paymentMethod: "bank_transfer",
-  bankAccount: "",
-  bankName: "",
-  remark: "",
-});
-
-const rules = {
-  applyCode: [{ required: true, message: "璇烽�夋嫨鍏宠仈鐢宠鍗�", trigger: "change" }],
-  supplierId: [{ required: true, message: "璇烽�夋嫨渚涘簲鍟�", trigger: "change" }],
-  paymentDate: [{ required: true, message: "璇烽�夋嫨浠樻鏃ユ湡", trigger: "change" }],
-  amount: [{ required: true, message: "璇疯緭鍏ヤ粯娆鹃噾棰�", trigger: "blur" }],
-  paymentMethod: [{ required: true, message: "璇烽�夋嫨浠樻鏂瑰紡", trigger: "change" }],
-};
-
-const mockData = [
-  { id: 1, paymentCode: "FKD2024001", applyCode: "FK2024001", supplierId: 1, supplierName: "鍖椾含鍘熸潗鏂欎緵搴斿晢", paymentDate: "2024-01-15", amount: 5000, paymentMethod: "bank_transfer", status: "completed", bankAccount: "6222021234567890123", bankName: "宸ュ晢閾惰", remark: "" },
-  { id: 2, paymentCode: "FKD2024002", applyCode: "FK2024002", supplierId: 2, supplierName: "涓婃捣鐢靛瓙鍏冨櫒浠跺叕鍙�", paymentDate: "2024-01-18", amount: 8000, paymentMethod: "bank_transfer", status: "pending", bankAccount: "6222029876543210987", bankName: "寤鸿閾惰", remark: "" },
-  { id: 3, paymentCode: "FKD2024003", applyCode: "FK2024003", supplierId: 3, supplierName: "骞垮窞鍖呰鏉愭枡鍘�", paymentDate: "2024-01-20", amount: 3000, paymentMethod: "cash", status: "completed", remark: "" },
-];
-
-const totalPaymentAmount = computed(() => {
-  return dataList.value.reduce((sum, item) => sum + Number(item.amount), 0);
-});
-
-const formatMoney = (value) => {
-  if (value === undefined || value === null) return "0.00";
-  return Number(value).toFixed(2).replace(/\B(?=(\d{3})+(?!\d))/g, ",");
-};
-
-const getPaymentMethodLabel = (method) => {
-  const map = {
-    bank_transfer: "閾惰杞处",
-    cash: "鐜伴噾",
-    check: "鏀エ",
-    draft: "姹囩エ",
-  };
-  return map[method] || method;
-};
-
-const getTableData = () => {
-  let result = [...mockData];
-  if (filters.paymentCode) {
-    result = result.filter(item => item.paymentCode.includes(filters.paymentCode));
-  }
-  if (filters.supplierId) {
-    result = result.filter(item => item.supplierId === filters.supplierId);
-  }
-  if (filters.paymentMethod) {
-    result = result.filter(item => item.paymentMethod === filters.paymentMethod);
-  }
-  if (filters.status) {
-    result = result.filter(item => item.status === filters.status);
-  }
-  pagination.total = result.length;
-  dataList.value = result.slice((pagination.currentPage - 1) * pagination.pageSize, pagination.currentPage * pagination.pageSize);
-};
-
-const resetFilters = () => {
-  filters.paymentCode = "";
-  filters.supplierId = "";
-  filters.paymentMethod = "";
-  filters.status = "";
-  pagination.currentPage = 1;
-  getTableData();
-};
-
-const changePage = ({ current, size }) => {
-  pagination.currentPage = current;
-  pagination.pageSize = size;
-  getTableData();
-};
-
-const add = () => {
-  isEdit.value = false;
-  dialogTitle.value = "鏂板浠樻";
-  Object.assign(form, {
-    paymentCode: "FKD" + Date.now().toString().slice(-8),
-    applyCode: "",
+  const filters = reactive({
+    paymentNumber: "",
     supplierId: "",
-    paymentDate: new Date().toISOString().split('T')[0],
-    amount: 0,
-    paymentMethod: "bank_transfer",
-    bankAccount: "",
-    bankName: "",
-    remark: "",
+    paymentMethod: "",
+    dateRange: [],
   });
-  dialogVisible.value = true;
-};
 
-const edit = (row) => {
-  isEdit.value = true;
-  currentId.value = row.id;
-  dialogTitle.value = "缂栬緫浠樻";
-  Object.assign(form, row);
-  dialogVisible.value = true;
-};
-
-const view = (row) => {
-  ElMessage.info(`鏌ョ湅浠樻鍗�: ${row.paymentCode}`);
-};
-
-const handleComplete = (row) => {
-  ElMessageBox.confirm("纭璇ヤ粯娆惧崟宸插畬鎴愬悧锛�", "鎻愮ず", {
-    confirmButtonText: "纭",
-    cancelButtonText: "鍙栨秷",
-    type: "info",
-  }).then(() => {
-    const index = mockData.findIndex(item => item.id === row.id);
-    if (index !== -1) {
-      mockData[index].status = "completed";
-    }
-    ElMessage.success("浠樻瀹屾垚");
-    getTableData();
+  const pagination = reactive({
+    currentPage: 1,
+    pageSize: 10,
+    total: 0,
   });
-};
 
-const handleCancel = (row) => {
-  ElMessageBox.confirm("纭鍙栨秷璇ヤ粯娆惧崟鍚楋紵", "鎻愮ず", {
-    confirmButtonText: "纭",
-    cancelButtonText: "鍙栨秷",
-    type: "warning",
-  }).then(() => {
-    const index = mockData.findIndex(item => item.id === row.id);
-    if (index !== -1) {
-      mockData[index].status = "cancelled";
-    }
-    ElMessage.success("宸插彇娑�");
-    getTableData();
+  const columns = [
+    { label: "浠樻鍗曞彿", prop: "paymentNumber", width: "150" },
+    { label: "鍏宠仈鐢宠鍗�", prop: "invoiceApplicationNo", width: "150" },
+    { label: "渚涘簲鍟�", prop: "supplierName", width: "180" },
+    { label: "浠樻鏃ユ湡", prop: "paymentDate", width: "120" },
+    { label: "浠樻閲戦", prop: "amount", dataType: "slot", slot: "amount" },
+    {
+      label: "浠樻鏂瑰紡",
+      prop: "paymentMethod",
+      dataType: "slot",
+      slot: "paymentMethod",
+      width: "120",
+    },
+    { label: "澶囨敞", prop: "remark", showOverflowTooltip: true },
+    {
+      label: "鎿嶄綔",
+      prop: "operation",
+      dataType: "slot",
+      slot: "operation",
+      width: "80",
+      fixed: "right",
+    },
+  ];
+
+  const dataList = ref([]);
+  const tableLoading = ref(false);
+  const supplierList = ref([]);
+
+  const totalPaymentAmount = computed(() =>
+    dataList.value.reduce((sum, item) => sum + Number(item.amount ?? 0), 0)
+  );
+
+  const formatMoney = value => {
+    if (value === undefined || value === null) return "0.00";
+    return Number(value)
+      .toFixed(2)
+      .replace(/\B(?=(\d{3})+(?!\d))/g, ",");
+  };
+
+  const getPaymentMethodLabel = value => {
+    if (value === undefined || value === null || value === "") return "-";
+    const item = checkout_payment.value?.find(
+      m => String(m.value) === String(value)
+    );
+    return item?.label ?? value;
+  };
+
+  const normalizeTableRow = row => ({
+    ...row,
+    paymentNumber: row.paymentNumber ?? row.paymentCode,
+    invoiceApplicationNo: row.invoiceApplicationNo ?? row.applyCode ?? "",
+    amount: row.paymentAmount ?? row.amount,
+    bankAccountNum: row.bankAccountNum ?? row.bankAccount ?? "",
+    bankAccountName: row.bankAccountName ?? row.bankName ?? "",
   });
-};
 
-const handleOut = () => {
-  ElMessage.success("瀵煎嚭鎴愬姛");
-};
-
-const submitForm = () => {
-  formRef.value.validate((valid) => {
-    if (valid) {
-      const supplier = supplierList.find(item => item.id === form.supplierId);
-      if (isEdit.value) {
-        const index = mockData.findIndex(item => item.id === currentId.value);
-        if (index !== -1) {
-          mockData[index] = { ...mockData[index], ...form, supplierName: supplier?.name };
-        }
-        ElMessage.success("缂栬緫鎴愬姛");
-      } else {
-        const newId = mockData.length > 0 ? Math.max(...mockData.map(item => item.id)) + 1 : 1;
-        mockData.push({ id: newId, ...form, supplierName: supplier?.name, status: "pending" });
-        ElMessage.success("鏂板鎴愬姛");
+  const getSupplierList = () => {
+    getOptions().then(res => {
+      if (res.code === 200) {
+        supplierList.value = res.data ?? [];
       }
-      dialogVisible.value = false;
-      getTableData();
-    }
-  });
-};
+    });
+  };
 
-onMounted(() => {
-  getTableData();
-});
+  const appendFilterParams = params => {
+    if (filters.paymentNumber) {
+      params.paymentNumber = filters.paymentNumber;
+    }
+    if (filters.supplierId) {
+      params.supplierId = filters.supplierId;
+    }
+    if (filters.paymentMethod) {
+      params.paymentMethod = filters.paymentMethod;
+    }
+    if (filters.dateRange?.length === 2) {
+      params.startDate = filters.dateRange[0];
+      params.endDate = filters.dateRange[1];
+    }
+    return params;
+  };
+
+  const buildListParams = () =>
+    appendFilterParams({
+      current: pagination.currentPage,
+      size: pagination.pageSize,
+    });
+
+  const buildExportParams = () => appendFilterParams({});
+
+  const handleExport = () => {
+    proxy.download(
+      "/accountPurchasePayment/exportAccountPurchasePayment",
+      buildExportParams(),
+      `浠樻鍗昣${Date.now()}.xlsx`
+    );
+  };
+
+  const getTableData = () => {
+    tableLoading.value = true;
+    listPageAccountPurchasePayment(buildListParams())
+      .then(res => {
+        if (res.code === 200) {
+          dataList.value = (res.data?.records ?? []).map(normalizeTableRow);
+          pagination.total = res.data?.total ?? 0;
+        } else {
+          dataList.value = [];
+          pagination.total = 0;
+          ElMessage.error(res.msg || "鏌ヨ澶辫触");
+        }
+      })
+      .catch(() => {
+        dataList.value = [];
+        pagination.total = 0;
+        ElMessage.error("鏌ヨ澶辫触");
+      })
+      .finally(() => {
+        tableLoading.value = false;
+      });
+  };
+
+  const onSearch = () => {
+    pagination.currentPage = 1;
+    getTableData();
+  };
+
+  const resetFilters = () => {
+    filters.paymentNumber = "";
+    filters.supplierId = "";
+    filters.paymentMethod = "";
+    filters.dateRange = [];
+    pagination.currentPage = 1;
+    getTableData();
+  };
+
+  const changePage = ({ page, limit }) => {
+    pagination.currentPage = page;
+    pagination.pageSize = limit;
+    getTableData();
+  };
+
+  const handleDelete = row => {
+    ElMessageBox.confirm(`纭鍒犻櫎浠樻鍗曘��${row.paymentNumber}銆嶅悧锛焋, "鎻愮ず", {
+      confirmButtonText: "纭畾",
+      cancelButtonText: "鍙栨秷",
+      type: "warning",
+    }).then(() => {
+      deleteAccountPurchasePayment([row.id])
+        .then(res => {
+          if (res.code === 200) {
+            ElMessage.success("鍒犻櫎鎴愬姛");
+            getTableData();
+          } else {
+            ElMessage.error(res.msg || "鍒犻櫎澶辫触");
+          }
+        })
+        .catch(() => {
+          ElMessage.error("鍒犻櫎澶辫触");
+        });
+    });
+  };
+
+  onMounted(() => {
+    getSupplierList();
+    getTableData();
+  });
 </script>
 
 <style lang="scss" scoped>
-.actions {
-  display: flex;
-  justify-content: space-between;
-  align-items: center;
-  margin-bottom: 15px;
-}
+  .actions {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    margin-bottom: 15px;
+  }
 
-.text-danger {
-  color: #f56c6c;
-  font-weight: bold;
-}
+  .text-danger {
+    color: #f56c6c;
+    font-weight: bold;
+  }
 </style>
diff --git a/src/views/financialManagement/payable/paymentApply.vue b/src/views/financialManagement/payable/paymentApply.vue
index fb23db3..3937e96 100644
--- a/src/views/financialManagement/payable/paymentApply.vue
+++ b/src/views/financialManagement/payable/paymentApply.vue
@@ -2,23 +2,40 @@
   <div class="app-container">
     <el-form :model="filters" :inline="true">
       <el-form-item label="鐢宠鍗曞彿:">
-        <el-input v-model="filters.applyCode" placeholder="璇疯緭鍏ョ敵璇峰崟鍙�" clearable style="width: 200px;" />
+        <el-input v-model="filters.invoiceApplicationNo" placeholder="璇疯緭鍏ョ敵璇峰崟鍙�" clearable style="width: 200px;" />
       </el-form-item>
       <el-form-item label="渚涘簲鍟�:">
-        <el-select v-model="filters.supplierId" placeholder="璇烽�夋嫨渚涘簲鍟�" clearable style="width: 200px;">
-          <el-option v-for="item in supplierList" :key="item.id" :label="item.name" :value="item.id" />
+        <el-select v-model="filters.supplierId" placeholder="璇烽�夋嫨渚涘簲鍟�" clearable filterable style="width: 200px;">
+          <el-option
+            v-for="item in supplierList"
+            :key="item.id"
+            :label="item.supplierName"
+            :value="item.id"
+          />
         </el-select>
       </el-form-item>
-      <el-form-item label="鐘舵��:">
+      <el-form-item label="瀹℃牳鐘舵��:">
         <el-select v-model="filters.status" placeholder="璇烽�夋嫨鐘舵��" clearable style="width: 150px;">
-          <el-option label="寰呭鎵�" value="pending" />
-          <el-option label="宸插鎵�" value="approved" />
-          <el-option label="宸查┏鍥�" value="rejected" />
-          <el-option label="宸蹭粯娆�" value="paid" />
+          <el-option label="寰呭鏍�" :value="0" />
+          <el-option label="瀹℃牳閫氳繃" :value="1" />
+          <el-option label="瀹℃牳涓嶉�氳繃" :value="2" />
         </el-select>
+      </el-form-item>
+      <el-form-item label="鐢宠鏃ユ湡:">
+        <el-date-picker
+          v-model="filters.dateRange"
+          type="daterange"
+          value-format="YYYY-MM-DD"
+          format="YYYY-MM-DD"
+          range-separator="鑷�"
+          start-placeholder="寮�濮嬫棩鏈�"
+          end-placeholder="缁撴潫鏃ユ湡"
+          clearable
+          style="width: 240px;"
+        />
       </el-form-item>
       <el-form-item>
-        <el-button type="primary" @click="getTableData">鎼滅储</el-button>
+        <el-button type="primary" @click="onSearch">鎼滅储</el-button>
         <el-button @click="resetFilters">閲嶇疆</el-button>
       </el-form-item>
     </el-form>
@@ -27,20 +44,19 @@
         <div></div>
         <div>
           <el-button type="primary" @click="add" icon="Plus">鏂板鐢宠</el-button>
-          <el-button @click="handleBatchApply" icon="Document" :disabled="selectedRows.length === 0">鎵归噺鐢宠</el-button>
+          <el-button @click="handleExport" icon="Download">瀵煎嚭</el-button>
         </div>
       </div>
       <PIMTable
         rowKey="id"
-        isSelection
         :column="columns"
         :tableData="dataList"
+        :tableLoading="tableLoading"
         :page="{
           current: pagination.currentPage,
           size: pagination.pageSize,
           total: pagination.total,
         }"
-        @selection-change="handleSelectionChange"
         @pagination="changePage"
       >
         <template #amount="{ row }">
@@ -54,90 +70,291 @@
         </template>
         <template #operation="{ row }">
           <el-button type="primary" link @click="view(row)">鏌ョ湅</el-button>
-          <el-button type="primary" link @click="edit(row)" v-if="row.status === 'pending'">缂栬緫</el-button>
-          <el-button type="success" link @click="handleAudit(row)" v-if="row.status === 'pending'">瀹℃壒</el-button>
+          <el-button type="primary" link @click="edit(row)" v-if="isPendingStatus(row.status)">缂栬緫</el-button>
+          <el-button type="success" link @click="handleAudit(row)" v-if="isPendingStatus(row.status)">瀹℃牳</el-button>
+          <el-button type="warning" link @click="openPaymentDialog(row)" v-if="isApprovedStatus(row.status)">浠樻</el-button>
+          <el-button type="danger" link @click="handleDelete(row)" v-if="isPendingStatus(row.status)">鍒犻櫎</el-button>
         </template>
       </PIMTable>
     </div>
 
-    <FormDialog :title="dialogTitle" v-model="dialogVisible" width="800px" @confirm="submitForm" @cancel="dialogVisible = false">
+    <FormDialog
+      :title="dialogTitle"
+      v-model="dialogVisible"
+      width="800px"
+      :operation-type="isView ? 'detail' : ''"
+      @confirm="submitForm"
+      @cancel="closeDialog"
+    >
       <el-form :model="form" :rules="rules" ref="formRef" label-width="120px">
+        <el-row v-if="isView" :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="瀹℃牳鐘舵��">
+              <el-tag :type="getStatusType(form.status)">{{ getStatusLabel(form.status) }}</el-tag>
+            </el-form-item>
+          </el-col>
+        </el-row>
         <el-row :gutter="20">
           <el-col :span="12">
-            <el-form-item label="鐢宠鍗曞彿" prop="applyCode">
-              <el-input v-model="form.applyCode" placeholder="绯荤粺鑷姩鐢熸垚" disabled />
+            <el-form-item label="鐢宠鍗曞彿" prop="invoiceApplicationNo">
+              <el-input v-model="form.invoiceApplicationNo" placeholder="绯荤粺鑷姩鐢熸垚" disabled />
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="渚涘簲鍟�" prop="supplierId">
-              <el-select v-model="form.supplierId" placeholder="璇烽�夋嫨渚涘簲鍟�" style="width: 100%;" :disabled="isEdit">
-                <el-option v-for="item in supplierList" :key="item.id" :label="item.name" :value="item.id" />
+              <el-select
+                v-model="form.supplierId"
+                placeholder="璇烽�夋嫨渚涘簲鍟�"
+                style="width: 100%;"
+                filterable
+                :disabled="isEdit || isView"
+                @change="handleSupplierChange"
+              >
+                <el-option
+                  v-for="item in supplierList"
+                  :key="item.id"
+                  :label="item.supplierName"
+                  :value="item.id"
+                />
               </el-select>
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="20">
           <el-col :span="12">
-            <el-form-item label="浠樻閲戦" prop="amount">
-              <el-input-number v-model="form.amount" :min="0" :precision="2" style="width: 100%;" />
+            <el-form-item label="鍏宠仈鍏ュ簱鍗�" prop="stockInRecordIds">
+              <el-input
+                :model-value="inboundBatchDisplayText"
+                placeholder="璇峰厛閫夋嫨渚涘簲鍟�"
+                readonly
+                :disabled="!form.supplierId || isEdit || isView"
+                class="inbound-batch-input"
+                @click="handleInboundInputClick"
+              >
+                <template v-if="!isEdit && !isView" #append>
+                  <el-button
+                    :disabled="!form.supplierId"
+                    :loading="inboundBatchLoading"
+                    @click.stop="openInboundSelectDialog"
+                  >
+                    閫夋嫨
+                  </el-button>
+                </template>
+              </el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鐢宠鏃ユ湡" prop="applyDate">
+              <el-date-picker
+                v-model="form.applyDate"
+                type="date"
+                placeholder="閫夋嫨鏃ユ湡"
+                value-format="YYYY-MM-DD"
+                style="width: 100%;"
+                :disabled="isView"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="浠樻閲戦" prop="paymentAmount">
+              <el-input-number
+                v-model="form.paymentAmount"
+                :min="0"
+                :precision="2"
+                style="width: 100%;"
+                :disabled="isView"
+                placeholder="鏍规嵁鍏ュ簱鍗曡嚜鍔ㄦ眹鎬伙紝鍙慨鏀�"
+              />
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="浠樻鏂瑰紡" prop="paymentMethod">
-              <el-select v-model="form.paymentMethod" placeholder="璇烽�夋嫨浠樻鏂瑰紡" style="width: 100%;">
-                <el-option label="閾惰杞处" value="bank_transfer" />
-                <el-option label="鐜伴噾" value="cash" />
-                <el-option label="鏀エ" value="check" />
-                <el-option label="姹囩エ" value="draft" />
+              <el-select
+                v-model="form.paymentMethod"
+                placeholder="璇烽�夋嫨浠樻鏂瑰紡"
+                style="width: 100%;"
+                :disabled="isView"
+              >
+                <el-option
+                  v-for="item in checkout_payment"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value"
+                />
               </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-form-item label="浠樻浜嬬敱" prop="paymentContent">
+          <el-input
+            v-model="form.paymentContent"
+            type="textarea"
+            :rows="3"
+            placeholder="璇疯緭鍏ヤ粯娆句簨鐢�"
+            :disabled="isView"
+          />
+        </el-form-item>
+        <el-form-item label="澶囨敞" prop="remark">
+          <el-input v-model="form.remark" type="textarea" :rows="2" placeholder="璇疯緭鍏ュ娉�" :disabled="isView" />
+        </el-form-item>
+      </el-form>
+      <template v-if="!isView" #footer>
+        <el-button type="primary" :loading="submitLoading" @click="submitForm">纭畾</el-button>
+        <el-button @click="closeDialog">鍙栨秷</el-button>
+      </template>
+    </FormDialog>
+
+    <FormDialog
+      title="浠樻"
+      v-model="paymentDialogVisible"
+      width="800px"
+      @confirm="submitPayment"
+      @cancel="paymentDialogVisible = false"
+    >
+      <el-form :model="paymentForm" :rules="paymentRules" ref="paymentFormRef" label-width="120px">
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="浠樻鍗曞彿" prop="paymentNumber">
+              <el-input v-model="paymentForm.paymentNumber" placeholder="绯荤粺鑷姩鐢熸垚" disabled />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鍏宠仈鐢宠鍗�" prop="invoiceApplicationNo">
+              <el-input v-model="paymentForm.invoiceApplicationNo" disabled />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="20">
           <el-col :span="12">
-            <el-form-item label="鐢宠鏃ユ湡" prop="applyDate">
-              <el-date-picker v-model="form.applyDate" type="date" placeholder="閫夋嫨鏃ユ湡" value-format="YYYY-MM-DD" style="width: 100%;" />
+            <el-form-item label="渚涘簲鍟�">
+              <el-input v-model="paymentForm.supplierName" disabled />
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="鏈熸湜浠樻鏃ユ湡" prop="expectedDate">
-              <el-date-picker v-model="form.expectedDate" type="date" placeholder="閫夋嫨鏃ユ湡" value-format="YYYY-MM-DD" style="width: 100%;" />
+            <el-form-item label="浠樻鏃ユ湡" prop="paymentDate">
+              <el-date-picker
+                v-model="paymentForm.paymentDate"
+                type="date"
+                placeholder="閫夋嫨鏃ユ湡"
+                value-format="YYYY-MM-DD"
+                style="width: 100%;"
+              />
             </el-form-item>
           </el-col>
         </el-row>
-        <el-form-item label="鍏宠仈鍏ュ簱鍗�" prop="relatedDocs">
-          <el-select v-model="form.relatedDocs" multiple placeholder="璇烽�夋嫨鍏宠仈鍏ュ簱鍗�" style="width: 100%;">
-            <el-option v-for="item in inList" :key="item.inCode" :label="item.inCode" :value="item.inCode" />
-          </el-select>
-        </el-form-item>
-        <el-form-item label="浠樻浜嬬敱" prop="reason">
-          <el-input v-model="form.reason" type="textarea" :rows="3" placeholder="璇疯緭鍏ヤ粯娆句簨鐢�" />
-        </el-form-item>
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="浠樻閲戦" prop="paymentAmount">
+              <el-input-number
+                v-model="paymentForm.paymentAmount"
+                :min="0"
+                :precision="2"
+                style="width: 100%;"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="浠樻鏂瑰紡" prop="paymentMethod">
+              <el-select v-model="paymentForm.paymentMethod" placeholder="璇烽�夋嫨浠樻鏂瑰紡" style="width: 100%;">
+                <el-option
+                  v-for="item in checkout_payment"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row v-if="isBankTransferPayment(paymentForm.paymentMethod)" :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="閾惰璐﹀彿" prop="bankAccount">
+              <el-input v-model="paymentForm.bankAccount" placeholder="閾惰璐﹀彿" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="寮�鎴疯" prop="bankName">
+              <el-input v-model="paymentForm.bankName" placeholder="寮�鎴疯" />
+            </el-form-item>
+          </el-col>
+        </el-row>
         <el-form-item label="澶囨敞" prop="remark">
-          <el-input v-model="form.remark" type="textarea" :rows="2" placeholder="璇疯緭鍏ュ娉�" />
+          <el-input v-model="paymentForm.remark" type="textarea" :rows="3" placeholder="璇疯緭鍏ュ娉�" />
         </el-form-item>
       </el-form>
       <template #footer>
-        <el-button type="primary" @click="submitForm">纭畾</el-button>
-        <el-button @click="dialogVisible = false">鍙栨秷</el-button>
+        <el-button type="primary" :loading="paymentSubmitLoading" @click="submitPayment">纭畾</el-button>
+        <el-button @click="paymentDialogVisible = false">鍙栨秷</el-button>
       </template>
     </FormDialog>
+
+    <el-dialog
+      v-model="inboundSelectVisible"
+      title="閫夋嫨鍏ュ簱鍗曞彿"
+      width="1100px"
+      append-to-body
+      destroy-on-close
+      :close-on-click-modal="false"
+      @closed="handleInboundDialogClosed"
+    >
+      <el-table
+        ref="inboundTableRef"
+        v-loading="inboundBatchLoading"
+        :data="inboundBatchList"
+        row-key="id"
+        border
+        stripe
+        max-height="480"
+        @selection-change="handleInboundDialogSelectionChange"
+      >
+        <el-table-column type="selection" width="55" align="center" />
+        <el-table-column prop="inboundBatches" label="鍏ュ簱鍗曞彿" min-width="140" show-overflow-tooltip />
+        <el-table-column prop="supplierName" label="渚涘簲鍟�" min-width="120" show-overflow-tooltip />
+        <el-table-column prop="productName" label="浜у搧鍚嶇О" min-width="120" show-overflow-tooltip />
+        <el-table-column prop="specificationModel" label="瑙勬牸鍨嬪彿" min-width="140" show-overflow-tooltip />
+        <el-table-column prop="purchaseContractNumber" label="閲囪喘璁㈠崟鍙�" min-width="140" show-overflow-tooltip />
+        <el-table-column prop="inboundDate" label="鍏ュ簱鏃ユ湡" width="110" align="center" />
+        <el-table-column prop="inboundAmount" label="鍏ュ簱閲戦(鍚◣)" width="120" align="right">
+          <template #default="{ row }">楼{{ formatMoney(getInboundRowTaxInclusiveAmount(row)) }}</template>
+        </el-table-column>
+      </el-table>
+      <template #footer>
+        <el-button type="primary" @click="confirmInboundSelection">纭畾</el-button>
+        <el-button @click="inboundSelectVisible = false">鍙栨秷</el-button>
+      </template>
+    </el-dialog>
   </div>
 </template>
 
 <script setup>
-import { ref, reactive, onMounted } from "vue";
+import { ref, reactive, computed, onMounted, nextTick, getCurrentInstance } from "vue";
 import { ElMessage, ElMessageBox } from "element-plus";
 import FormDialog from "@/components/Dialog/FormDialog.vue";
+import { getOptions } from "@/api/procurementManagement/procurementLedger.js";
+import {
+  getInboundBatchesBySupplier,
+  addAccountPaymentApplication,
+  listPageAccountPaymentApplication,
+  updateAccountPaymentApplication,
+  auditAccountPaymentApplication,
+  deleteAccountPaymentApplication,
+} from "@/api/financialManagement/accountPaymentApplication.js";
+import { addAccountPurchasePayment } from "@/api/financialManagement/accountPurchasePayment.js";
 
 defineOptions({
   name: "浠樻鐢宠",
 });
 
+const { proxy } = getCurrentInstance();
+const { checkout_payment } = proxy.useDict("checkout_payment");
+
 const filters = reactive({
-  applyCode: "",
+  invoiceApplicationNo: "",
   supplierId: "",
   status: "",
+  dateRange: [],
 });
 
 const pagination = reactive({
@@ -149,199 +366,634 @@
 const columns = [
   { label: "鐢宠鍗曞彿", prop: "applyCode", width: "150" },
   { label: "渚涘簲鍟�", prop: "supplierName", width: "180" },
-  { label: "浠樻閲戦", prop: "amount", slot: "amount" },
-  { label: "浠樻鏂瑰紡", prop: "paymentMethod", slot: "paymentMethod" },
+  { label: "浠樻閲戦", prop: "amount", dataType: "slot", slot: "amount" },
+  { label: "浠樻鏂瑰紡", prop: "paymentMethod", dataType: "slot", slot: "paymentMethod", width: "120" },
   { label: "鐢宠鏃ユ湡", prop: "applyDate", width: "120" },
-  { label: "鏈熸湜浠樻鏃�", prop: "expectedDate", width: "120" },
-  { label: "鐘舵��", prop: "status", slot: "status" },
-  { label: "鎿嶄綔", prop: "operation", slot: "operation", width: "200", fixed: "right" },
+  { label: "鐘舵��", prop: "status", dataType: "slot", slot: "status", width: "100" },
+  { label: "鎿嶄綔", prop: "operation", dataType: "slot", slot: "operation", width: "260", fixed: "right" },
 ];
 
 const dataList = ref([]);
-const selectedRows = ref([]);
+const tableLoading = ref(false);
 const dialogVisible = ref(false);
 const dialogTitle = ref("");
 const formRef = ref(null);
 const isEdit = ref(false);
+const isView = ref(false);
+const submitLoading = ref(false);
 const currentId = ref(null);
+const supplierList = ref([]);
 
-const supplierList = [
-  { id: 1, name: "鍖椾含鍘熸潗鏂欎緵搴斿晢" },
-  { id: 2, name: "涓婃捣鐢靛瓙鍏冨櫒浠跺叕鍙�" },
-  { id: 3, name: "骞垮窞鍖呰鏉愭枡鍘�" },
-  { id: 4, name: "娣卞湷浜旈噾閰嶄欢鍏徃" },
-];
+const inboundBatchList = ref([]);
+const inboundBatchOptions = ref([]);
+const inboundBatchLoading = ref(false);
+const inboundSelectVisible = ref(false);
+const inboundTableRef = ref(null);
+const dialogInboundSelection = ref([]);
 
-const inList = [
-  { inCode: "RK2024001", supplierId: 1 },
-  { inCode: "RK2024002", supplierId: 2 },
-  { inCode: "RK2024003", supplierId: 3 },
-];
+const paymentDialogVisible = ref(false);
+const paymentFormRef = ref(null);
+const paymentSubmitLoading = ref(false);
+
+const paymentForm = reactive({
+  paymentNumber: "",
+  invoiceApplicationNo: "",
+  supplierName: "",
+  supplierId: "",
+  accountPaymentApplicationId: null,
+  paymentDate: "",
+  paymentAmount: 0,
+  paymentMethod: "",
+  bankAccount: "",
+  bankName: "",
+  remark: "",
+});
+
+const paymentRules = {
+  paymentDate: [{ required: true, message: "璇烽�夋嫨浠樻鏃ユ湡", trigger: "change" }],
+  paymentAmount: [{ required: true, message: "璇疯緭鍏ヤ粯娆鹃噾棰�", trigger: "blur" }],
+  paymentMethod: [{ required: true, message: "璇烽�夋嫨浠樻鏂瑰紡", trigger: "change" }],
+};
+
+const STATUS_LABEL_MAP = { 0: "寰呭鏍�", 1: "瀹℃牳閫氳繃", 2: "瀹℃牳涓嶉�氳繃" };
+const STATUS_TYPE_MAP = { 0: "warning", 1: "success", 2: "danger" };
 
 const form = reactive({
-  applyCode: "",
+  invoiceApplicationNo: "",
   supplierId: "",
-  amount: 0,
-  paymentMethod: "bank_transfer",
+  paymentAmount: 0,
+  paymentMethod: "",
   applyDate: "",
-  expectedDate: "",
-  relatedDocs: [],
-  reason: "",
+  paymentContent: "",
   remark: "",
+  stockInRecordIds: [],
+  inboundBatches: "",
+  status: 0,
 });
 
 const rules = {
   supplierId: [{ required: true, message: "璇烽�夋嫨渚涘簲鍟�", trigger: "change" }],
-  amount: [{ required: true, message: "璇疯緭鍏ヤ粯娆鹃噾棰�", trigger: "blur" }],
+  stockInRecordIds: [{ required: true, type: "array", min: 1, message: "璇烽�夋嫨鍏宠仈鍏ュ簱鍗�", trigger: "change" }],
+  paymentAmount: [{ required: true, message: "璇疯緭鍏ヤ粯娆鹃噾棰�", trigger: "blur" }],
   paymentMethod: [{ required: true, message: "璇烽�夋嫨浠樻鏂瑰紡", trigger: "change" }],
   applyDate: [{ required: true, message: "璇烽�夋嫨鐢宠鏃ユ湡", trigger: "change" }],
-  expectedDate: [{ required: true, message: "璇烽�夋嫨鏈熸湜浠樻鏃ユ湡", trigger: "change" }],
 };
-
-const mockData = [
-  { id: 1, applyCode: "FK2024001", supplierId: 1, supplierName: "鍖椾含鍘熸潗鏂欎緵搴斿晢", amount: 5000, paymentMethod: "bank_transfer", applyDate: "2024-01-12", expectedDate: "2024-01-15", status: "pending", relatedDocs: ["RK2024001"], reason: "鏀粯鍘熸潗鏂欒揣娆�", remark: "" },
-  { id: 2, applyCode: "FK2024002", supplierId: 2, supplierName: "涓婃捣鐢靛瓙鍏冨櫒浠跺叕鍙�", amount: 8000, paymentMethod: "bank_transfer", applyDate: "2024-01-14", expectedDate: "2024-01-18", status: "approved", relatedDocs: ["RK2024002"], reason: "鏀粯鐢靛瓙鍏冨櫒浠惰揣娆�", remark: "" },
-  { id: 3, applyCode: "FK2024003", supplierId: 3, supplierName: "骞垮窞鍖呰鏉愭枡鍘�", amount: 3000, paymentMethod: "cash", applyDate: "2024-01-16", expectedDate: "2024-01-20", status: "paid", relatedDocs: ["RK2024003"], reason: "鏀粯鍖呰鏉愭枡璐ф", remark: "" },
-];
 
 const formatMoney = (value) => {
   if (value === undefined || value === null) return "0.00";
   return Number(value).toFixed(2).replace(/\B(?=(\d{3})+(?!\d))/g, ",");
 };
 
-const getPaymentMethodLabel = (method) => {
-  const map = {
-    bank_transfer: "閾惰杞处",
-    cash: "鐜伴噾",
-    check: "鏀エ",
-    draft: "姹囩エ",
+const normalizeStatus = (status) => {
+  if (status === undefined || status === null || status === "") return 0;
+  const num = Number(status);
+  return Number.isNaN(num) ? 0 : num;
+};
+
+const isPendingStatus = (status) => normalizeStatus(status) === 0;
+
+const isApprovedStatus = (status) => normalizeStatus(status) === 1;
+
+const isBankTransferPayment = (method) => {
+  if (method === undefined || method === null || method === "") return false;
+  const item = checkout_payment.value?.find((m) => String(m.value) === String(method));
+  if (item?.label?.includes("閾惰")) return true;
+  return String(method) === "bank_transfer" || String(method).toLowerCase().includes("bank");
+};
+
+const getStatusLabel = (status) => STATUS_LABEL_MAP[normalizeStatus(status)] ?? "寰呭鏍�";
+
+const getStatusType = (status) => STATUS_TYPE_MAP[normalizeStatus(status)] ?? "warning";
+
+const getPaymentMethodLabel = (value) => {
+  if (value === undefined || value === null || value === "") return "-";
+  const item = checkout_payment.value?.find((m) => String(m.value) === String(value));
+  return item?.label ?? value;
+};
+
+const getDefaultPaymentMethod = () => checkout_payment.value?.[0]?.value ?? "";
+
+const parseStockInRecordIds = (value) => {
+  if (!value) return [];
+  if (Array.isArray(value)) return value;
+  return String(value)
+    .split(/[,锛宂/)
+    .map((s) => s.trim())
+    .filter(Boolean)
+    .map((s) => (/^\d+$/.test(s) ? Number(s) : s));
+};
+
+const formatInboundBatches = (value) => {
+  if (value === undefined || value === null || value === "") return "";
+  if (Array.isArray(value)) return value.filter(Boolean).join("銆�");
+  return String(value)
+    .split(/[,锛宂/)
+    .map((s) => s.trim())
+    .filter(Boolean)
+    .join("銆�");
+};
+
+const isSameInboundId = (a, b) => String(a) === String(b);
+
+const getInboundRowId = (row) => row?.id ?? row?.stockInRecordId;
+
+const getInboundRowTaxInclusiveAmount = (row) =>
+  Number(row?.inboundAmount ?? row?.taxInclusivePrice ?? row?.totalAmount ?? row?.amount ?? 0);
+
+const normalizeInboundBatchOptions = (data) => {
+  const list = Array.isArray(data) ? data : [];
+  return list.map((item, index) => {
+    const label =
+      item.inboundBatches ?? item.batchNo ?? item.inboundNo ?? `鍏ュ簱鍗�${index + 1}`;
+    const value = item.id ?? item.stockInRecordId ?? label;
+    return {
+      label: String(label),
+      value,
+      inboundAmount: getInboundRowTaxInclusiveAmount(item),
+    };
+  });
+};
+
+const syncPaymentAmount = () => {
+  const selected = form.stockInRecordIds || [];
+  let sum = inboundBatchOptions.value
+    .filter((opt) => selected.some((id) => isSameInboundId(id, opt.value)))
+    .reduce((acc, opt) => acc + (Number(opt.inboundAmount) || 0), 0);
+
+  if (sum <= 0 && selected.length) {
+    sum = inboundBatchList.value
+      .filter((row) => selected.some((id) => isSameInboundId(id, getInboundRowId(row))))
+      .reduce((acc, row) => acc + getInboundRowTaxInclusiveAmount(row), 0);
+  }
+
+  form.paymentAmount = sum > 0 ? Number(sum.toFixed(2)) : 0;
+};
+
+const inboundBatchDisplayText = computed(() => {
+  if (form.inboundBatches) return form.inboundBatches;
+  const ids = form.stockInRecordIds || [];
+  if (!ids.length) return "";
+  const labels = inboundBatchOptions.value
+    .filter((opt) => ids.some((id) => isSameInboundId(id, opt.value)))
+    .map((opt) => opt.label);
+  if (labels.length) return labels.join("銆�");
+  return ids.join("銆�");
+});
+
+const normalizeTableRow = (row) => ({
+  ...row,
+  applyCode: row.invoiceApplicationNo ?? row.applyCode,
+  amount: row.paymentAmount ?? row.amount,
+  reason: row.paymentContent ?? row.reason,
+  status: normalizeStatus(row.status),
+  stockInRecordIds: row.stockInRecordIds ?? "",
+  inboundBatches: formatInboundBatches(row.inboundBatches),
+});
+
+const fillFormFromRow = (row) => {
+  const stockInRecordIds = parseStockInRecordIds(row.stockInRecordIds);
+  Object.assign(form, {
+    invoiceApplicationNo: row.invoiceApplicationNo ?? row.applyCode ?? "",
+    supplierId: row.supplierId,
+    paymentAmount: Number(row.paymentAmount ?? row.amount ?? 0),
+    paymentMethod: row.paymentMethod ?? getDefaultPaymentMethod(),
+    applyDate: row.applyDate ?? "",
+    paymentContent: row.paymentContent ?? row.reason ?? "",
+    remark: row.remark ?? "",
+    stockInRecordIds,
+    inboundBatches: formatInboundBatches(row.inboundBatches),
+    status: normalizeStatus(row.status),
+  });
+};
+
+const buildPayloadFromRow = (row, statusOverride) => ({
+  id: row.id,
+  supplierId: row.supplierId,
+  stockInRecordIds:
+    typeof row.stockInRecordIds === "string"
+      ? row.stockInRecordIds
+      : (row.stockInRecordIds || []).join(","),
+  invoiceApplicationNo: row.invoiceApplicationNo ?? row.applyCode ?? "",
+  paymentMethod: row.paymentMethod,
+  paymentContent: row.paymentContent ?? row.reason ?? "",
+  applyDate: row.applyDate,
+  remark: row.remark ?? "",
+  status: statusOverride !== undefined ? statusOverride : normalizeStatus(row.status),
+  paymentAmount: Number(row.paymentAmount ?? row.amount ?? 0),
+});
+
+const buildSubmitPayload = (forUpdate = false) => {
+  const payload = {
+    supplierId: form.supplierId,
+    stockInRecordIds: (form.stockInRecordIds || []).join(","),
+    invoiceApplicationNo: form.invoiceApplicationNo || "",
+    paymentMethod: form.paymentMethod,
+    paymentContent: form.paymentContent || "",
+    applyDate: form.applyDate,
+    remark: form.remark || "",
+    status: 0,
+    paymentAmount: form.paymentAmount,
   };
-  return map[method] || method;
+  if (forUpdate) {
+    payload.id = currentId.value;
+  }
+  return payload;
 };
 
-const getStatusLabel = (status) => {
-  const map = { pending: "寰呭鎵�", approved: "宸插鎵�", rejected: "宸查┏鍥�", paid: "宸蹭粯娆�" };
-  return map[status] || status;
+const getSupplierList = () => {
+  getOptions().then((res) => {
+    if (res.code === 200) {
+      supplierList.value = res.data ?? [];
+    }
+  });
 };
 
-const getStatusType = (status) => {
-  const map = { pending: "warning", approved: "success", rejected: "danger", paid: "primary" };
-  return map[status] || "";
+const appendFilterParams = (params) => {
+  if (filters.invoiceApplicationNo) {
+    params.invoiceApplicationNo = filters.invoiceApplicationNo;
+  }
+  if (filters.supplierId) {
+    params.supplierId = filters.supplierId;
+  }
+  if (filters.status !== "" && filters.status != null) {
+    params.status = filters.status;
+  }
+  if (filters.dateRange?.length === 2) {
+    params.startDate = filters.dateRange[0];
+    params.endDate = filters.dateRange[1];
+  }
+  return params;
+};
+
+const buildListParams = () =>
+  appendFilterParams({
+    current: pagination.currentPage,
+    size: pagination.pageSize,
+  });
+
+const buildExportParams = () => appendFilterParams({});
+
+const handleExport = () => {
+  proxy.download(
+    "/accountPaymentApplication/exportAccountPaymentApplication",
+    buildExportParams(),
+    `浠樻鐢宠_${Date.now()}.xlsx`
+  );
 };
 
 const getTableData = () => {
-  let result = [...mockData];
-  if (filters.applyCode) {
-    result = result.filter(item => item.applyCode.includes(filters.applyCode));
-  }
-  if (filters.supplierId) {
-    result = result.filter(item => item.supplierId === filters.supplierId);
-  }
-  if (filters.status) {
-    result = result.filter(item => item.status === filters.status);
-  }
-  pagination.total = result.length;
-  dataList.value = result.slice((pagination.currentPage - 1) * pagination.pageSize, pagination.currentPage * pagination.pageSize);
+  tableLoading.value = true;
+  listPageAccountPaymentApplication(buildListParams())
+    .then((res) => {
+      if (res.code === 200) {
+        dataList.value = (res.data?.records ?? []).map(normalizeTableRow);
+        pagination.total = res.data?.total ?? 0;
+      } else {
+        dataList.value = [];
+        pagination.total = 0;
+        ElMessage.error(res.msg || "鏌ヨ澶辫触");
+      }
+    })
+    .catch(() => {
+      dataList.value = [];
+      pagination.total = 0;
+      ElMessage.error("鏌ヨ澶辫触");
+    })
+    .finally(() => {
+      tableLoading.value = false;
+    });
 };
 
-const resetFilters = () => {
-  filters.applyCode = "";
-  filters.supplierId = "";
-  filters.status = "";
+const onSearch = () => {
   pagination.currentPage = 1;
   getTableData();
 };
 
-const changePage = ({ current, size }) => {
-  pagination.currentPage = current;
-  pagination.pageSize = size;
+const resetFilters = () => {
+  filters.invoiceApplicationNo = "";
+  filters.supplierId = "";
+  filters.status = "";
+  filters.dateRange = [];
+  pagination.currentPage = 1;
   getTableData();
 };
 
-const handleSelectionChange = (selection) => {
-  selectedRows.value = selection;
+const changePage = ({ page, limit }) => {
+  pagination.currentPage = page;
+  pagination.pageSize = limit;
+  getTableData();
+};
+
+const closeDialog = () => {
+  dialogVisible.value = false;
+  isView.value = false;
+  isEdit.value = false;
+  inboundSelectVisible.value = false;
+};
+
+const resetForm = () => {
+  Object.assign(form, {
+    invoiceApplicationNo: "",
+    supplierId: "",
+    paymentAmount: 0,
+    paymentMethod: getDefaultPaymentMethod(),
+    applyDate: new Date().toISOString().split("T")[0],
+    paymentContent: "",
+    remark: "",
+    stockInRecordIds: [],
+    inboundBatches: "",
+    status: 0,
+  });
+  inboundBatchList.value = [];
+  inboundBatchOptions.value = [];
 };
 
 const add = () => {
   isEdit.value = false;
+  isView.value = false;
   dialogTitle.value = "鏂板浠樻鐢宠";
-  Object.assign(form, {
-    applyCode: "FK" + Date.now().toString().slice(-8),
-    supplierId: "",
-    amount: 0,
-    paymentMethod: "bank_transfer",
-    applyDate: new Date().toISOString().split('T')[0],
-    expectedDate: "",
-    relatedDocs: [],
-    reason: "",
-    remark: "",
-  });
+  resetForm();
   dialogVisible.value = true;
 };
 
 const edit = (row) => {
   isEdit.value = true;
+  isView.value = false;
   currentId.value = row.id;
   dialogTitle.value = "缂栬緫浠樻鐢宠";
-  Object.assign(form, row);
+  fillFormFromRow(row);
   dialogVisible.value = true;
 };
 
 const view = (row) => {
-  ElMessage.info(`鏌ョ湅鐢宠鍗�: ${row.applyCode}`);
+  isView.value = true;
+  isEdit.value = false;
+  dialogTitle.value = "鏌ョ湅浠樻鐢宠";
+  fillFormFromRow(row);
+  if (row.supplierId) {
+    loadInboundBatches(row.supplierId, true, false);
+  }
+  dialogVisible.value = true;
+};
+
+const submitAudit = (row, status) => {
+  auditAccountPaymentApplication(buildPayloadFromRow(row, status))
+    .then((res) => {
+      if (res.code === 200) {
+        ElMessage.success(status === 1 ? "瀹℃牳閫氳繃" : "瀹℃牳涓嶉�氳繃");
+        getTableData();
+      } else {
+        ElMessage.error(res.msg || "瀹℃牳澶辫触");
+      }
+    })
+    .catch(() => {
+      ElMessage.error("瀹℃牳澶辫触");
+    });
 };
 
 const handleAudit = (row) => {
-  ElMessageBox.confirm("纭瀹℃壒閫氳繃璇ヤ粯娆剧敵璇峰悧锛�", "鎻愮ず", {
-    confirmButtonText: "閫氳繃",
-    cancelButtonText: "椹冲洖",
+  ElMessageBox.confirm("璇烽�夋嫨瀹℃牳缁撴灉", "浠樻鐢宠瀹℃牳", {
+    confirmButtonText: "瀹℃牳閫氳繃",
+    cancelButtonText: "瀹℃牳涓嶉�氳繃",
     distinguishCancelAndClose: true,
     type: "warning",
-  }).then(() => {
-    const index = mockData.findIndex(item => item.id === row.id);
-    if (index !== -1) {
-      mockData[index].status = "approved";
-    }
-    ElMessage.success("瀹℃壒閫氳繃");
-    getTableData();
-  }).catch((action) => {
-    if (action === "cancel") {
-      const index = mockData.findIndex(item => item.id === row.id);
-      if (index !== -1) {
-        mockData[index].status = "rejected";
+  })
+    .then(() => {
+      submitAudit(row, 1);
+    })
+    .catch((action) => {
+      if (action === "cancel") {
+        submitAudit(row, 2);
       }
-      ElMessage.warning("宸查┏鍥�");
-      getTableData();
-    }
+    });
+};
+
+const openPaymentDialog = (row) => {
+  Object.assign(paymentForm, {
+    paymentNumber: "",
+    invoiceApplicationNo: row.invoiceApplicationNo ?? row.applyCode ?? "",
+    supplierName: row.supplierName ?? "",
+    supplierId: row.supplierId,
+    accountPaymentApplicationId: row.id,
+    paymentDate: new Date().toISOString().split("T")[0],
+    paymentAmount: Number(row.paymentAmount ?? row.amount ?? 0),
+    paymentMethod: row.paymentMethod ?? getDefaultPaymentMethod(),
+    bankAccount: row.bankAccountNum ?? row.bankAccount ?? "",
+    bankName: row.bankAccountName ?? row.bankName ?? "",
+    remark: "",
+  });
+  paymentDialogVisible.value = true;
+  nextTick(() => {
+    paymentFormRef.value?.clearValidate();
   });
 };
 
-const handleBatchApply = () => {
-  ElMessage.success(`鎵归噺鐢宠 ${selectedRows.value.length} 鏉¤褰昤);
+const submitPayment = () => {
+  paymentFormRef.value?.validate((valid) => {
+    if (!valid) return;
+    paymentSubmitLoading.value = true;
+    addAccountPurchasePayment({
+      accountPaymentApplicationId: paymentForm.accountPaymentApplicationId,
+      supplierId: paymentForm.supplierId,
+      paymentDate: paymentForm.paymentDate,
+      paymentMethod: paymentForm.paymentMethod,
+      paymentAmount: paymentForm.paymentAmount,
+      paymentNumber: paymentForm.paymentNumber || "",
+      remark: paymentForm.remark || "",
+    })
+      .then((res) => {
+        if (res.code === 200) {
+          ElMessage.success("浠樻鎴愬姛");
+          paymentDialogVisible.value = false;
+          getTableData();
+        } else {
+          ElMessage.error(res.msg || "浠樻澶辫触");
+        }
+      })
+      .catch(() => {
+        ElMessage.error("浠樻澶辫触");
+      })
+      .finally(() => {
+        paymentSubmitLoading.value = false;
+      });
+  });
+};
+
+const handleDelete = (row) => {
+  ElMessageBox.confirm(`纭鍒犻櫎鐢宠鍗曘��${row.applyCode ?? row.invoiceApplicationNo}銆嶅悧锛焋, "鎻愮ず", {
+    confirmButtonText: "纭畾",
+    cancelButtonText: "鍙栨秷",
+    type: "warning",
+  }).then(() => {
+    deleteAccountPaymentApplication([row.id])
+      .then((res) => {
+        if (res.code === 200) {
+          ElMessage.success("鍒犻櫎鎴愬姛");
+          getTableData();
+        } else {
+          ElMessage.error(res.msg || "鍒犻櫎澶辫触");
+        }
+      })
+      .catch(() => {
+        ElMessage.error("鍒犻櫎澶辫触");
+      });
+  });
 };
 
 const submitForm = () => {
-  formRef.value.validate((valid) => {
-    if (valid) {
-      const supplier = supplierList.find(item => item.id === form.supplierId);
-      if (isEdit.value) {
-        const index = mockData.findIndex(item => item.id === currentId.value);
-        if (index !== -1) {
-          mockData[index] = { ...mockData[index], ...form, supplierName: supplier?.name };
+  formRef.value?.validate((valid) => {
+    if (!valid) return;
+    submitLoading.value = true;
+    const request = isEdit.value
+      ? updateAccountPaymentApplication(buildSubmitPayload(true))
+      : addAccountPaymentApplication(buildSubmitPayload(false));
+
+    request
+      .then((res) => {
+        if (res.code === 200) {
+          ElMessage.success(isEdit.value ? "缂栬緫鎴愬姛" : "鏂板鎴愬姛");
+          closeDialog();
+          pagination.currentPage = 1;
+          getTableData();
+        } else {
+          ElMessage.error(res.msg || "淇濆瓨澶辫触");
         }
-        ElMessage.success("缂栬緫鎴愬姛");
-      } else {
-        const newId = mockData.length > 0 ? Math.max(...mockData.map(item => item.id)) + 1 : 1;
-        mockData.push({ id: newId, ...form, supplierName: supplier?.name, status: "pending" });
-        ElMessage.success("鏂板鎴愬姛");
-      }
-      dialogVisible.value = false;
-      getTableData();
-    }
+      })
+      .catch(() => {
+        ElMessage.error("淇濆瓨澶辫触");
+      })
+      .finally(() => {
+        submitLoading.value = false;
+      });
   });
 };
 
+const ensureInboundOptionsForSelected = () => {
+  const ids = form.stockInRecordIds || [];
+  ids.forEach((id) => {
+    const exists = inboundBatchOptions.value.some((opt) => isSameInboundId(opt.value, id));
+    if (exists) return;
+    const fromList = inboundBatchList.value.find((row) => isSameInboundId(getInboundRowId(row), id));
+    if (fromList) {
+      const [option] = normalizeInboundBatchOptions([fromList]);
+      if (option) inboundBatchOptions.value.push(option);
+      return;
+    }
+    inboundBatchOptions.value.push({
+      label: String(id),
+      value: id,
+      inboundAmount: 0,
+    });
+  });
+};
+
+const restoreInboundTableSelection = () => {
+  nextTick(() => {
+    const table = inboundTableRef.value;
+    if (!table) return;
+    table.clearSelection();
+    const selectedIds = new Set((form.stockInRecordIds || []).map((id) => String(id)));
+    inboundBatchList.value.forEach((row) => {
+      const rowId = getInboundRowId(row);
+      if (rowId !== undefined && rowId !== null && selectedIds.has(String(rowId))) {
+        table.toggleRowSelection(row, true);
+      }
+    });
+  });
+};
+
+const loadInboundBatches = (supplierId, keepSelected = false, syncAmount = true) => {
+  if (!supplierId) {
+    inboundBatchList.value = [];
+    inboundBatchOptions.value = [];
+    if (!keepSelected) {
+      form.stockInRecordIds = [];
+      form.inboundBatches = "";
+      form.paymentAmount = 0;
+    }
+    return Promise.resolve();
+  }
+  inboundBatchLoading.value = true;
+  return getInboundBatchesBySupplier({ supplierId })
+    .then((res) => {
+      if (res.code === 200) {
+        const list = res.data?.records ?? res.data ?? [];
+        inboundBatchList.value = Array.isArray(list) ? list : [];
+        inboundBatchOptions.value = normalizeInboundBatchOptions(list);
+      } else {
+        inboundBatchList.value = [];
+        inboundBatchOptions.value = [];
+      }
+    })
+    .catch(() => {
+      inboundBatchList.value = [];
+      inboundBatchOptions.value = [];
+    })
+    .finally(() => {
+      inboundBatchLoading.value = false;
+      if (keepSelected) {
+        ensureInboundOptionsForSelected();
+        restoreInboundTableSelection();
+        if (syncAmount && !isView.value) {
+          syncPaymentAmount();
+        }
+      }
+    });
+};
+
+const handleSupplierChange = (supplierId) => {
+  form.stockInRecordIds = [];
+  form.inboundBatches = "";
+  form.paymentAmount = 0;
+  loadInboundBatches(supplierId);
+};
+
+const handleInboundInputClick = () => {
+  if (isEdit.value || isView.value) return;
+  openInboundSelectDialog();
+};
+
+const openInboundSelectDialog = () => {
+  if (!form.supplierId || isEdit.value || isView.value) return;
+  inboundSelectVisible.value = true;
+  loadInboundBatches(form.supplierId, true, false).then(() => {
+    restoreInboundTableSelection();
+  });
+};
+
+const handleInboundDialogSelectionChange = (selection) => {
+  dialogInboundSelection.value = selection;
+};
+
+const confirmInboundSelection = () => {
+  if (dialogInboundSelection.value.length === 0) {
+    ElMessage.warning("璇疯嚦灏戦�夋嫨涓�鏉″叆搴撳崟");
+    return;
+  }
+  form.stockInRecordIds = dialogInboundSelection.value
+    .map((row) => getInboundRowId(row))
+    .filter((id) => id !== undefined && id !== null);
+  form.inboundBatches = dialogInboundSelection.value
+    .map((row) => row.inboundBatches ?? row.batchNo ?? "")
+    .filter(Boolean)
+    .join("銆�");
+  dialogInboundSelection.value.forEach((row) => {
+    const [option] = normalizeInboundBatchOptions([row]);
+    if (option && !inboundBatchOptions.value.some((opt) => isSameInboundId(opt.value, option.value))) {
+      inboundBatchOptions.value.push(option);
+    }
+  });
+  inboundSelectVisible.value = false;
+  syncPaymentAmount();
+  formRef.value?.validateField("stockInRecordIds");
+};
+
+const handleInboundDialogClosed = () => {
+  dialogInboundSelection.value = [];
+};
+
 onMounted(() => {
+  getSupplierList();
   getTableData();
 });
 </script>
@@ -357,4 +1009,8 @@
   color: #f56c6c;
   font-weight: bold;
 }
+
+.inbound-batch-input :deep(.el-input__wrapper) {
+  cursor: pointer;
+}
 </style>
diff --git a/src/views/financialManagement/payable/purchaseIn.vue b/src/views/financialManagement/payable/purchaseIn.vue
index 4fadcbb..fcb768f 100644
--- a/src/views/financialManagement/payable/purchaseIn.vue
+++ b/src/views/financialManagement/payable/purchaseIn.vue
@@ -1,27 +1,39 @@
 <template>
   <!-- 閲囪喘鍏ュ簱 -->
   <div class="app-container">
-    <el-form :model="filters" :inline="true">
+    <el-form :model="filters"
+             :inline="true">
       <el-form-item label="鍏ュ簱鍗曞彿:">
-        <el-input v-model="filters.inboundBatches" placeholder="璇疯緭鍏ュ叆搴撳崟鍙�" clearable style="width: 200px;" />
+        <el-input v-model="filters.inboundBatches"
+                  placeholder="璇疯緭鍏ュ叆搴撳崟鍙�"
+                  clearable
+                  style="width: 200px;" />
       </el-form-item>
       <el-form-item label="渚涘簲鍟�:">
-        <el-input v-model="filters.supplierName" placeholder="璇疯緭鍏ヤ緵搴斿晢" clearable style="width: 200px;" />
+        <el-select v-model="filters.supplierId"
+                   placeholder="璇烽�夋嫨渚涘簲鍟�"
+                   clearable
+                   filterable
+                   style="width: 200px;">
+          <el-option v-for="item in supplierList"
+                     :key="item.id"
+                     :label="item.supplierName"
+                     :value="item.id" />
+        </el-select>
       </el-form-item>
       <el-form-item label="鍏ュ簱鏃ユ湡:">
-        <el-date-picker
-          v-model="filters.dateRange"
-          value-format="YYYY-MM-DD"
-          format="YYYY-MM-DD"
-          type="daterange"
-          range-separator="鑷�"
-          start-placeholder="寮�濮嬫棩鏈�"
-          end-placeholder="缁撴潫鏃ユ湡"
-          clearable
-        />
+        <el-date-picker v-model="filters.dateRange"
+                        value-format="YYYY-MM-DD"
+                        format="YYYY-MM-DD"
+                        type="daterange"
+                        range-separator="鑷�"
+                        start-placeholder="寮�濮嬫棩鏈�"
+                        end-placeholder="缁撴潫鏃ユ湡"
+                        clearable />
       </el-form-item>
       <el-form-item>
-        <el-button type="primary" @click="onSearch">鎼滅储</el-button>
+        <el-button type="primary"
+                   @click="onSearch">鎼滅储</el-button>
         <el-button @click="resetFilters">閲嶇疆</el-button>
       </el-form-item>
     </el-form>
@@ -29,23 +41,22 @@
       <div class="actions">
         <div></div>
         <div>
-          <el-button @click="handleOut" icon="Download">瀵煎嚭</el-button>
+          <el-button @click="handleOut"
+                     icon="Download">瀵煎嚭</el-button>
         </div>
       </div>
-      <PIMTable
-        rowKey="id"
-        :column="columns"
-        :tableData="dataList"
-        :tableLoading="tableLoading"
-        :page="{
+      <PIMTable rowKey="id"
+                :column="columns"
+                :tableData="dataList"
+                :tableLoading="tableLoading"
+                :page="{
           current: pagination.currentPage,
           size: pagination.pageSize,
           total: pagination.total,
         }"
-        @pagination="changePage"
-      >
+                @pagination="changePage">
         <template #inboundDate="{ row }">
-          {{ row.InboundDate || row.inboundDate || "" }}
+          {{ row.inboundDate ?? row.InboundDate ?? "" }}
         </template>
       </PIMTable>
     </div>
@@ -53,119 +64,149 @@
 </template>
 
 <script setup>
-import { ref, reactive, onMounted, getCurrentInstance } from "vue";
-import { ElMessage } from "element-plus";
-import { listPageAccountPurchase } from "@/api/financialManagement/accountPurchase";
+  import { ref, reactive, onMounted, getCurrentInstance } from "vue";
+  import { ElMessage } from "element-plus";
+  import { listPageAccountPurchase } from "@/api/financialManagement/accountPurchase";
+  import { listSupplier } from "@/api/basicData/supplierManageFile.js";
 
-defineOptions({
-  name: "閲囪喘鍏ュ簱",
-});
+  defineOptions({
+    name: "閲囪喘鍏ュ簱",
+  });
 
-const { proxy } = getCurrentInstance();
+  const { proxy } = getCurrentInstance();
 
-const filters = reactive({
-  inboundBatches: "",
-  supplierName: "",
-  dateRange: [],
-});
+  const filters = reactive({
+    inboundBatches: "",
+    supplierId: "",
+    dateRange: [],
+  });
 
-const pagination = reactive({
-  currentPage: 1,
-  pageSize: 10,
-  total: 0,
-});
+  const pagination = reactive({
+    currentPage: 1,
+    pageSize: 10,
+    total: 0,
+  });
 
-const columns = [
-  { label: "鍏ュ簱鍗曞彿", prop: "inboundBatches", minWidth: "150" },
-  { label: "渚涘簲鍟�", prop: "supplierName", minWidth: "180" },
-  {
-    label: "鍏ュ簱鏃ユ湡",
-    prop: "InboundDate",
-    minWidth: "170",
-    dataType: "slot",
-    slot: "inboundDate",
-  },
-  { label: "浜у搧鍚嶇О", prop: "productName", minWidth: "140" },
-  { label: "浜у搧瑙勬牸", prop: "specificationModel", minWidth: "140" },
-  { label: "閲囪喘璁㈠崟鍙�", prop: "purchaseContractNumber", minWidth: "150" },
-];
+  const columns = [
+    { label: "鍏ュ簱鍗曞彿", prop: "inboundBatches", minWidth: "150" },
+    { label: "渚涘簲鍟�", prop: "supplierName", minWidth: "180" },
+    {
+      label: "鍏ュ簱鏃ユ湡",
+      prop: "inboundDate",
+      minWidth: "170",
+      dataType: "slot",
+      slot: "inboundDate",
+    },
+    { label: "浜у搧鍚嶇О", prop: "productName", minWidth: "140" },
+    { label: "浜у搧瑙勬牸", prop: "specificationModel", minWidth: "140" },
+    {
+      label: "閲戦",
+      prop: "inboundAmount",
+      minWidth: "120",
+      align: "right",
+      formatData: val =>
+        val === null || val === undefined || val === ""
+          ? ""
+          : Number(val).toLocaleString("zh-CN", {
+              minimumFractionDigits: 2,
+              maximumFractionDigits: 2,
+            }),
+    },
+    { label: "閲囪喘璁㈠崟鍙�", prop: "purchaseContractNumber", minWidth: "150" },
+  ];
 
-const dataList = ref([]);
-const tableLoading = ref(false);
+  const dataList = ref([]);
+  const tableLoading = ref(false);
+  const supplierList = ref([]);
 
-function buildFilterParams() {
-  const params = {
-    inboundBatches: filters.inboundBatches || undefined,
-    supplierName: filters.supplierName || undefined,
+  const buildFilterParams = () => {
+    const params = {};
+    if (filters.inboundBatches) {
+      params.inboundBatches = filters.inboundBatches;
+    }
+    if (filters.supplierId) {
+      params.supplierId = filters.supplierId;
+    }
+    if (filters.dateRange?.length === 2) {
+      params.startDate = filters.dateRange[0];
+      params.endDate = filters.dateRange[1];
+    }
+    return params;
   };
-  if (filters.dateRange && filters.dateRange.length === 2) {
-    params.startDate = filters.dateRange[0];
-    params.endDate = filters.dateRange[1];
-  }
-  return params;
-}
 
-const onSearch = () => {
-  pagination.currentPage = 1;
-  getTableData();
-};
-
-const getTableData = () => {
-  tableLoading.value = true;
-  listPageAccountPurchase({
-    ...buildFilterParams(),
-    current: pagination.currentPage,
-    size: pagination.pageSize,
-  })
-    .then((res) => {
-      const ok = res.code === 200 || res.code === 0;
-      if (ok && res.data) {
-        pagination.total = res.data.total ?? 0;
-        dataList.value = res.data.records ?? [];
-      } else {
-        ElMessage.error(res.msg || "鏌ヨ澶辫触");
-        dataList.value = [];
+  const getSupplierList = () => {
+    listSupplier({ current: -1, size: -1, isWhite: 0 }).then(res => {
+      if (res.code === 200) {
+        supplierList.value = res.data?.records ?? [];
       }
-    })
-    .catch(() => {
-      dataList.value = [];
-    })
-    .finally(() => {
-      tableLoading.value = false;
     });
-};
+  };
 
-const resetFilters = () => {
-  filters.inboundBatches = "";
-  filters.supplierName = "";
-  filters.dateRange = [];
-  pagination.currentPage = 1;
-  getTableData();
-};
+  const onSearch = () => {
+    pagination.currentPage = 1;
+    getTableData();
+  };
 
-const changePage = ({ page, limit }) => {
-  pagination.currentPage = page;
-  pagination.pageSize = limit;
-  getTableData();
-};
+  const getTableData = () => {
+    tableLoading.value = true;
+    listPageAccountPurchase({
+      ...buildFilterParams(),
+      current: pagination.currentPage,
+      size: pagination.pageSize,
+    })
+      .then(res => {
+        const ok = res.code === 200 || res.code === 0;
+        if (ok && res.data) {
+          pagination.total = res.data.total ?? 0;
+          dataList.value = res.data.records ?? [];
+        } else {
+          ElMessage.error(res.msg || "鏌ヨ澶辫触");
+          dataList.value = [];
+          pagination.total = 0;
+        }
+      })
+      .catch(() => {
+        dataList.value = [];
+        pagination.total = 0;
+        ElMessage.error("鏌ヨ澶辫触");
+      })
+      .finally(() => {
+        tableLoading.value = false;
+      });
+  };
 
-const handleOut = () => {
-  proxy.download(
-    "/accountPurchase/exportAccountPurchaseInbound",
-    buildFilterParams(),
-    `閲囪喘鍏ュ簱_${new Date().getTime()}.xlsx`
-  );
-};
+  const resetFilters = () => {
+    filters.inboundBatches = "";
+    filters.supplierId = "";
+    filters.dateRange = [];
+    pagination.currentPage = 1;
+    getTableData();
+  };
 
-onMounted(() => {
-  getTableData();
-});
+  const changePage = ({ page, limit }) => {
+    pagination.currentPage = page;
+    pagination.pageSize = limit;
+    getTableData();
+  };
+
+  const handleOut = () => {
+    proxy.download(
+      "/accountPurchase/exportAccountPurchaseInbound",
+      buildFilterParams(),
+      `閲囪喘鍏ュ簱_${Date.now()}.xlsx`
+    );
+  };
+
+  onMounted(() => {
+    getSupplierList();
+    getTableData();
+  });
 </script>
 
 <style lang="scss" scoped>
-.actions {
-  display: flex;
-  justify-content: space-between;
-  margin-bottom: 15px;
-}
+  .actions {
+    display: flex;
+    justify-content: space-between;
+    margin-bottom: 15px;
+  }
 </style>
diff --git a/src/views/financialManagement/payable/purchaseReturn.vue b/src/views/financialManagement/payable/purchaseReturn.vue
index e7ca665..eeec383 100644
--- a/src/views/financialManagement/payable/purchaseReturn.vue
+++ b/src/views/financialManagement/payable/purchaseReturn.vue
@@ -1,26 +1,20 @@
 <template>
   <!-- 閲囪喘閫�璐� -->
-
   <div class="app-container">
     <el-form :model="filters" :inline="true">
       <el-form-item label="閫�璐у崟鍙�:">
-        <el-input
-          v-model="filters.returnNo"
-          placeholder="璇疯緭鍏ラ��璐у崟鍙�"
-          clearable
-          style="width: 200px"
-        />
+        <el-input v-model="filters.returnNo" placeholder="璇疯緭鍏ラ��璐у崟鍙�" clearable style="width: 200px;" />
       </el-form-item>
-
       <el-form-item label="渚涘簲鍟�:">
-        <el-input
-          v-model="filters.supplierName"
-          placeholder="璇疯緭鍏ヤ緵搴斿晢"
-          clearable
-          style="width: 200px"
-        />
+        <el-select v-model="filters.supplierId" placeholder="璇烽�夋嫨渚涘簲鍟�" clearable filterable style="width: 200px;">
+          <el-option
+            v-for="item in supplierList"
+            :key="item.id"
+            :label="item.supplierName"
+            :value="item.id"
+          />
+        </el-select>
       </el-form-item>
-
       <el-form-item label="閫�璐ф棩鏈�:">
         <el-date-picker
           v-model="filters.dateRange"
@@ -33,23 +27,18 @@
           clearable
         />
       </el-form-item>
-
       <el-form-item>
         <el-button type="primary" @click="onSearch">鎼滅储</el-button>
-
         <el-button @click="resetFilters">閲嶇疆</el-button>
       </el-form-item>
     </el-form>
-
     <div class="table_list">
       <div class="actions">
         <div></div>
-
         <div>
           <el-button @click="handleOut" icon="Download">瀵煎嚭</el-button>
         </div>
       </div>
-
       <PIMTable
         rowKey="id"
         :column="columns"
@@ -57,9 +46,7 @@
         :tableLoading="tableLoading"
         :page="{
           current: pagination.currentPage,
-
           size: pagination.pageSize,
-
           total: pagination.total,
         }"
         @pagination="changePage"
@@ -68,14 +55,11 @@
   </div>
 </template>
 
-
-
 <script setup>
 import { ref, reactive, onMounted, getCurrentInstance } from "vue";
-
 import { ElMessage } from "element-plus";
-
 import { listPageAccountPurchaseReturn } from "@/api/financialManagement/accountPurchase";
+import { listSupplier } from "@/api/basicData/supplierManageFile.js";
 
 defineOptions({
   name: "閲囪喘閫�璐�",
@@ -85,38 +69,26 @@
 
 const filters = reactive({
   returnNo: "",
-
-  supplierName: "",
-
+  supplierId: "",
   dateRange: [],
 });
 
 const pagination = reactive({
   currentPage: 1,
-
   pageSize: 10,
-
   total: 0,
 });
 
 const columns = [
   { label: "閫�璐у崟鍙�", prop: "returnNo", minWidth: "150" },
-
   { label: "渚涘簲鍟�", prop: "supplierName", minWidth: "180" },
-
   { label: "鍏宠仈鍏ュ簱鍗曞彿", prop: "inboundBatches", minWidth: "150" },
-
   { label: "閫�璐ф棩鏈�", prop: "preparedAt", minWidth: "170" },
-
   {
     label: "閫�娆炬�婚",
-
     prop: "totalAmount",
-
     minWidth: "150",
-
     align: "right",
-
     formatData: (val) =>
       val === null || val === undefined || val === ""
         ? ""
@@ -125,66 +97,65 @@
             maximumFractionDigits: 2,
           }),
   },
-
   { label: "閫�璐ф柟寮�", prop: "returnType", minWidth: "150" },
-
   { label: "閲囪喘璁㈠崟鍙�", prop: "purchaseContractNumber", minWidth: "150" },
 ];
 
 const dataList = ref([]);
-
 const tableLoading = ref(false);
+const supplierList = ref([]);
 
-function buildFilterParams() {
-  const params = {
-    returnNo: filters.returnNo || undefined,
-
-    supplierName: filters.supplierName || undefined,
-  };
-
-  if (filters.dateRange && filters.dateRange.length === 2) {
+const buildFilterParams = () => {
+  const params = {};
+  if (filters.returnNo) {
+    params.returnNo = filters.returnNo;
+  }
+  if (filters.supplierId) {
+    params.supplierId = filters.supplierId;
+  }
+  if (filters.dateRange?.length === 2) {
     params.startDate = filters.dateRange[0];
-
     params.endDate = filters.dateRange[1];
   }
-
   return params;
-}
+};
+
+const getSupplierList = () => {
+  listSupplier({ current: -1, size: -1, isWhite: 0 }).then((res) => {
+    if (res.code === 200) {
+      supplierList.value = res.data?.records ?? [];
+    }
+  });
+};
 
 const onSearch = () => {
   pagination.currentPage = 1;
-
   getTableData();
 };
 
 const getTableData = () => {
   tableLoading.value = true;
-
   listPageAccountPurchaseReturn({
     ...buildFilterParams(),
-
     current: pagination.currentPage,
-
     size: pagination.pageSize,
   })
     .then((res) => {
       const ok = res.code === 200 || res.code === 0;
-
       if (ok && res.data) {
         pagination.total = res.data.total ?? 0;
-
         dataList.value = res.data.records ?? [];
       } else {
         ElMessage.error(res.msg || "鏌ヨ澶辫触");
-
         dataList.value = [];
+        pagination.total = 0;
       }
     })
-
     .catch(() => {
       dataList.value = [];
+      pagination.total = 0;
+      ElMessage.error("鏌ヨ澶辫触");
     })
-
     .finally(() => {
       tableLoading.value = false;
     });
@@ -192,48 +163,36 @@
 
 const resetFilters = () => {
   filters.returnNo = "";
-
-  filters.supplierName = "";
-
+  filters.supplierId = "";
   filters.dateRange = [];
-
   pagination.currentPage = 1;
-
   getTableData();
 };
 
 const changePage = ({ page, limit }) => {
   pagination.currentPage = page;
-
   pagination.pageSize = limit;
-
   getTableData();
 };
 
 const handleOut = () => {
   proxy.download(
     "/accountPurchase/exportAccountPurchaseReturn",
-
     buildFilterParams(),
-
-    `閲囪喘閫�璐${new Date().getTime()}.xlsx`
+    `閲囪喘閫�璐${Date.now()}.xlsx`
   );
 };
 
 onMounted(() => {
+  getSupplierList();
   getTableData();
 });
 </script>
 
-
-
 <style lang="scss" scoped>
 .actions {
   display: flex;
-
   justify-content: space-between;
-
   margin-bottom: 15px;
 }
 </style>
-
diff --git a/src/views/financialManagement/payable/reconciliation.vue b/src/views/financialManagement/payable/reconciliation.vue
index 3aa23cd..e749e56 100644
--- a/src/views/financialManagement/payable/reconciliation.vue
+++ b/src/views/financialManagement/payable/reconciliation.vue
@@ -2,8 +2,13 @@
   <div class="app-container">
     <el-form :model="filters" :inline="true">
       <el-form-item label="渚涘簲鍟�:">
-        <el-select v-model="filters.supplierId" placeholder="璇烽�夋嫨渚涘簲鍟�" clearable style="width: 200px;">
-          <el-option v-for="item in supplierList" :key="item.id" :label="item.name" :value="item.id" />
+        <el-select v-model="filters.supplierId" placeholder="璇烽�夋嫨渚涘簲鍟�" clearable filterable style="width: 200px;">
+          <el-option
+            v-for="item in supplierList"
+            :key="item.id"
+            :label="item.supplierName"
+            :value="item.id"
+          />
         </el-select>
       </el-form-item>
       <el-form-item label="瀵硅处鏈熼棿:">
@@ -12,7 +17,7 @@
         <el-date-picker v-model="filters.endMonth" type="month" placeholder="缁撴潫鏈堜唤" value-format="YYYY-MM" style="width: 140px;" />
       </el-form-item>
       <el-form-item>
-        <el-button type="primary" @click="getTableData">鎼滅储</el-button>
+        <el-button type="primary" @click="onSearch">鎼滅储</el-button>
         <el-button @click="resetFilters">閲嶇疆</el-button>
       </el-form-item>
     </el-form>
@@ -29,6 +34,7 @@
         rowKey="id"
         :column="columns"
         :tableData="dataList"
+        :tableLoading="tableLoading"
         :page="{
           current: pagination.currentPage,
           size: pagination.pageSize,
@@ -36,21 +42,21 @@
         }"
         @pagination="changePage"
       >
-        <template #beginBalance="{ row }">
-          <span :class="row.beginBalance >= 0 ? 'text-success' : 'text-danger'">楼{{ formatMoney(row.beginBalance) }}</span>
+        <template #openingBalance="{ row }">
+          <span :class="row.openingBalance >= 0 ? 'text-success' : 'text-danger'">楼{{ formatMoney(row.openingBalance) }}</span>
         </template>
-        <template #currentPayable="{ row }">
-          <span class="text-danger">楼{{ formatMoney(row.currentPayable) }}</span>
+        <template #currentPlan="{ row }">
+          <span class="text-danger">楼{{ formatMoney(row.currentPlan) }}</span>
         </template>
-        <template #currentPayment="{ row }">
-          <span class="text-success">楼{{ formatMoney(row.currentPayment) }}</span>
+        <template #currentActually="{ row }">
+          <span class="text-success">楼{{ formatMoney(row.currentActually) }}</span>
         </template>
-        <template #endBalance="{ row }">
-          <span :class="row.endBalance >= 0 ? 'text-success' : 'text-danger'">楼{{ formatMoney(row.endBalance) }}</span>
+        <template #closingBalance="{ row }">
+          <span :class="row.closingBalance >= 0 ? 'text-success' : 'text-danger'">楼{{ formatMoney(row.closingBalance) }}</span>
         </template>
         <template #operation="{ row }">
           <el-button type="primary" link @click="viewDetail(row)">鏌ョ湅鏄庣粏</el-button>
-          <el-button type="primary" link @click="printStatement(row)">鎵撳嵃</el-button>
+          <el-button type="danger" link @click="handleDelete(row)">鍒犻櫎</el-button>
         </template>
       </PIMTable>
     </div>
@@ -60,7 +66,7 @@
         <h3>{{ currentSupplier }} 搴斾粯瀵硅处鍗�</h3>
         <p>瀵硅处鏈熼棿: {{ currentPeriod }}</p>
       </div>
-      <el-table :data="detailData" border style="width: 100%">
+      <el-table :data="detailData" border style="width: 100%" v-loading="detailLoading">
         <el-table-column prop="date" label="鏃ユ湡" width="120" />
         <el-table-column prop="type" label="绫诲瀷" width="100">
           <template #default="{ row }">
@@ -77,6 +83,7 @@
         <el-table-column prop="credit" label="璐锋柟(搴斾粯)" width="120">
           <template #default="{ row }">
             <span v-if="row.credit > 0" class="text-danger">楼{{ formatMoney(row.credit) }}</span>
+            <span v-else-if="row.credit < 0" class="text-success">楼{{ formatMoney(Math.abs(row.credit)) }}</span>
             <span v-else>-</span>
           </template>
         </el-table-column>
@@ -98,52 +105,80 @@
         <el-row :gutter="20">
           <el-col :span="12">
             <el-form-item label="閫夋嫨渚涘簲鍟�" prop="supplierId">
-              <el-select v-model="generateForm.supplierId" placeholder="璇烽�夋嫨渚涘簲鍟�" style="width: 100%;" @change="onSupplierChange">
-                <el-option v-for="item in supplierList" :key="item.id" :label="item.name" :value="item.id" />
+              <el-select
+                v-model="generateForm.supplierId"
+                placeholder="璇烽�夋嫨渚涘簲鍟�"
+                style="width: 100%;"
+                filterable
+                @change="onSupplierChange"
+              >
+                <el-option
+                  v-for="item in supplierList"
+                  :key="item.id"
+                  :label="item.supplierName"
+                  :value="item.id"
+                />
               </el-select>
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="瀵硅处鏈堜唤" prop="period">
-              <el-date-picker v-model="generateForm.period" type="month" placeholder="閫夋嫨鏈堜唤" value-format="YYYY-MM" style="width: 100%;" @change="onPeriodChange" />
+            <el-form-item label="瀵硅处鏈堜唤" prop="statementMonth">
+              <el-date-picker
+                v-model="generateForm.statementMonth"
+                type="month"
+                placeholder="閫夋嫨鏈堜唤"
+                value-format="YYYY-MM"
+                style="width: 100%;"
+                @change="onStatementMonthChange"
+              />
             </el-form-item>
           </el-col>
         </el-row>
       </el-form>
 
-      <div v-if="purchaseData.length > 0" class="purchase-section">
-        <div class="section-title">鏈湀閲囪喘鏁版嵁</div>
-        <el-table :data="purchaseData" border style="width: 100%; margin-bottom: 15px;" v-loading="purchaseLoading" @selection-change="handlePurchaseSelectionChange">
+      <div v-if="statementDetailLoaded" class="purchase-section">
+        <div v-if="purchaseData.length > 0" class="section-title">鏈湀閲囪喘鏁版嵁</div>
+        <el-table
+          v-if="purchaseData.length > 0"
+          ref="purchaseTableRef"
+          :data="purchaseData"
+          border
+          row-key="id"
+          style="width: 100%; margin-bottom: 15px;"
+          v-loading="purchaseLoading"
+          @selection-change="handlePurchaseSelectionChange"
+        >
           <el-table-column type="selection" width="55" align="center" />
-          <el-table-column prop="date" label="鏃ユ湡" width="120" />
-          <el-table-column prop="code" label="鍗曟嵁缂栧彿" width="150" />
+          <el-table-column prop="occurrenceDate" label="鏃ユ湡" width="120" />
+          <el-table-column prop="receiptNumber" label="鍗曟嵁缂栧彿" width="150" />
           <el-table-column prop="type" label="绫诲瀷" width="100">
             <template #default="{ row }">
-              <el-tag :type="row.type === '鍏ュ簱' ? 'success' : 'danger'">{{ row.type }}</el-tag>
+              <el-tag :type="getDetailTypeTagType(row.type)">{{ row.typeLabel }}</el-tag>
             </template>
           </el-table-column>
           <el-table-column prop="amount" label="閲戦" width="120">
             <template #default="{ row }">
-              <span :class="row.type === '鍏ュ簱' ? 'text-danger' : 'text-success'">楼{{ formatMoney(row.amount) }}</span>
+              <span :class="getDetailAmountClass(row.type)">楼{{ formatMoney(row.amount) }}</span>
             </template>
           </el-table-column>
           <el-table-column prop="remark" label="澶囨敞" />
         </el-table>
+        <el-empty v-else description="璇ヤ緵搴斿晢鏈湀鏆傛棤鏄庣粏鏁版嵁" :image-size="80" />
 
         <div class="summary-row">
-          <span>鏈熷垵浣欓: <strong class="text-primary">楼{{ formatMoney(generateForm.beginBalance) }}</strong></span>
-          <span>鏈湡搴斾粯: <strong class="text-danger">楼{{ formatMoney(generateForm.currentPayable) }}</strong></span>
-          <span>鏈湡浠樻: <strong class="text-success">楼{{ formatMoney(generateForm.currentPayment) }}</strong></span>
-          <span>鏈熸湯浣欓: <strong class="text-primary">楼{{ formatMoney(calculateEndBalance(generateForm.beginBalance, generateForm.currentPayable, generateForm.currentPayment)) }}</strong></span>
+          <span>鏈熷垵浣欓: <strong class="text-primary">楼{{ formatMoney(generateForm.openingBalance) }}</strong></span>
+          <span>鏈湡搴斾粯: <strong class="text-danger">楼{{ formatMoney(generateForm.currentPlan) }}</strong></span>
+          <span>鏈湡浠樻: <strong class="text-success">楼{{ formatMoney(generateForm.currentActually) }}</strong></span>
+          <span>鏈熸湯浣欓: <strong :class="displayClosingBalance >= 0 ? 'text-success' : 'text-danger'">楼{{ formatMoney(displayClosingBalance) }}</strong></span>
         </div>
       </div>
 
-      <div v-else-if="generateForm.supplierId && !purchaseLoading" class="empty-tip">
+      <div v-else-if="generateForm.supplierId && generateForm.statementMonth && !purchaseLoading" class="empty-tip">
         <el-empty description="璇ヤ緵搴斿晢鏈湀鏆傛棤閲囪喘鏁版嵁" />
       </div>
 
       <template #footer>
-        <el-button type="primary" @click="confirmGenerate" :disabled="!canGenerate">纭鐢熸垚</el-button>
+        <el-button type="primary" @click="confirmGenerate" :disabled="!canGenerate" :loading="submitLoading">纭鐢熸垚</el-button>
         <el-button @click="generateDialogVisible = false">鍙栨秷</el-button>
       </template>
     </FormDialog>
@@ -151,9 +186,20 @@
 </template>
 
 <script setup>
-import { ref, reactive, onMounted, computed } from "vue";
-import { ElMessage } from "element-plus";
+import { ref, reactive, onMounted, computed, nextTick, getCurrentInstance } from "vue";
+import { ElMessage, ElMessageBox } from "element-plus";
 import FormDialog from "@/components/Dialog/FormDialog.vue";
+import { getOptions } from "@/api/procurementManagement/procurementLedger.js";
+import {
+  getAccountStatementDetailsByMonth,
+  addAccountStatement,
+  listPageAccountStatement,
+  deleteAccountStatement,
+} from "@/api/financialManagement/accountStatement.js";
+
+const ACCOUNT_TYPE_PAYABLE = 2;
+
+const { proxy } = getCurrentInstance();
 
 defineOptions({
   name: "搴斾粯瀵硅处",
@@ -172,56 +218,192 @@
 });
 
 const columns = [
-  { label: "瀵硅处鍗曞彿", prop: "statementCode", width: "150" },
+  { label: "瀵硅处鍗曞彿", prop: "statementNumber", width: "150" },
   { label: "渚涘簲鍟�", prop: "supplierName", width: "180" },
-  { label: "瀵硅处鏈熼棿", prop: "period", width: "150" },
-  { label: "鏈熷垵浣欓", prop: "beginBalance", slot: "beginBalance" },
-  { label: "鏈湡搴斾粯", prop: "currentPayable", slot: "currentPayable" },
-  { label: "鏈湡浠樻", prop: "currentPayment", slot: "currentPayment" },
-  { label: "鏈熸湯浣欓", prop: "endBalance", slot: "endBalance" },
-  { label: "鎿嶄綔", prop: "operation", slot: "operation", width: "150", fixed: "right" },
+  { label: "瀵硅处鏈熼棿", prop: "statementMonth", width: "150" },
+  { label: "鏈熷垵浣欓", prop: "openingBalance", dataType: "slot", slot: "openingBalance" },
+  { label: "鏈湡搴斾粯", prop: "currentPlan", dataType: "slot", slot: "currentPlan" },
+  { label: "鏈湡浠樻", prop: "currentActually", dataType: "slot", slot: "currentActually" },
+  { label: "鏈熸湯浣欓", prop: "closingBalance", dataType: "slot", slot: "closingBalance" },
+  { label: "鎿嶄綔", prop: "operation", dataType: "slot", slot: "operation", width: "200", fixed: "right" },
 ];
 
 const dataList = ref([]);
+const tableLoading = ref(false);
+const submitLoading = ref(false);
 const detailDialogVisible = ref(false);
 const currentSupplier = ref("");
 const currentPeriod = ref("");
 const detailData = ref([]);
+const detailLoading = ref(false);
 
 const generateDialogVisible = ref(false);
 const purchaseLoading = ref(false);
+const statementDetailLoaded = ref(false);
 const purchaseData = ref([]);
 const selectedPurchases = ref([]);
+const purchaseTableRef = ref(null);
+const supplierList = ref([]);
+
+/** 鏄庣粏 type锛�1鍑哄簱 2鍏ュ簱 3鏀舵 4浠樻 5閫�璐� */
+const STATEMENT_DETAIL_TYPE_MAP = {
+  1: "鍑哄簱",
+  2: "鍏ュ簱",
+  3: "鏀舵",
+  4: "浠樻",
+  5: "閫�璐�",
+};
+
+const calculateEndBalance = (openingBalance, currentPlan, currentActually) => {
+  return openingBalance + currentPlan - currentActually;
+};
+
+const getDetailTypeLabel = (type) => STATEMENT_DETAIL_TYPE_MAP[Number(type)] ?? "";
+
+const getDetailTypeTagType = (type) => {
+  const t = Number(type);
+  if (t === 2) return "success";
+  if (t === 4) return "primary";
+  if (t === 5) return "danger";
+  return "info";
+};
+
+const getDetailAmountClass = (type) => {
+  const t = Number(type);
+  if (t === 2) return "text-danger";
+  if (t === 4) return "text-success";
+  return "text-danger";
+};
 
 const generateForm = reactive({
   supplierId: "",
   supplierName: "",
-  period: "",
-  beginBalance: 0,
-  currentPayable: 0,
-  currentPayment: 0,
+  statementMonth: "",
+  openingBalance: 0,
+  currentPlan: 0,
+  currentActually: 0,
+  closingBalance: 0,
 });
 
-const canGenerate = computed(() => {
-  return generateForm.supplierId && generateForm.period && selectedPurchases.value.length > 0;
-});
+const displayClosingBalance = computed(() =>
+  calculateEndBalance(
+    generateForm.openingBalance,
+    generateForm.currentPlan,
+    generateForm.currentActually
+  )
+);
 
-const supplierList = [
-  { id: 1, name: "鍖椾含鍘熸潗鏂欎緵搴斿晢" },
-  { id: 2, name: "涓婃捣鐢靛瓙鍏冨櫒浠跺叕鍙�" },
-  { id: 3, name: "骞垮窞鍖呰鏉愭枡鍘�" },
-  { id: 4, name: "娣卞湷浜旈噾閰嶄欢鍏徃" },
-];
+const canGenerate = computed(
+  () => generateForm.supplierId && generateForm.statementMonth && selectedPurchases.value.length > 0
+);
 
-const mockData = [
-  { id: 1, statementCode: "DZ202401001", supplierId: 1, supplierName: "鍖椾含鍘熸潗鏂欎緵搴斿晢", period: "2024-01", beginBalance: 20000, currentPayable: 15000, currentPayment: 10000, endBalance: 25000 },
-  { id: 2, statementCode: "DZ202401002", supplierId: 2, supplierName: "涓婃捣鐢靛瓙鍏冨櫒浠跺叕鍙�", period: "2024-01", beginBalance: 10000, currentPayable: 20000, currentPayment: 15000, endBalance: 15000 },
-  { id: 3, statementCode: "DZ202402001", supplierId: 1, supplierName: "鍖椾含鍘熸潗鏂欎緵搴斿晢", period: "2024-02", beginBalance: 25000, currentPayable: 18000, currentPayment: 20000, endBalance: 23000 },
-];
-
-const calculateEndBalance = (beginBalance, currentPayable, currentPayment) => {
-  return beginBalance + currentPayable - currentPayment;
+const applyStatementSummary = (data) => {
+  generateForm.openingBalance = Number(data.openingBalance ?? 0);
+  generateForm.currentPlan = Number(data.currentPlan ?? 0);
+  generateForm.currentActually = Number(data.currentActually ?? 0);
+  generateForm.closingBalance = Number(
+    data.closingBalance ??
+      calculateEndBalance(
+        generateForm.openingBalance,
+        generateForm.currentPlan,
+        generateForm.currentActually
+      )
+  );
 };
+
+const getSupplierList = () => {
+  getOptions().then((res) => {
+    if (res.code === 200) {
+      supplierList.value = res.data ?? [];
+    }
+  });
+};
+
+const normalizePurchaseRows = (list) => {
+  const rows = Array.isArray(list) ? list : [];
+  return rows.map((item, index) => {
+    const type = Number(item.type);
+    return {
+      id: item.id ?? `detail-${index}`,
+      accountStatementId: item.accountStatementId,
+      occurrenceDate: item.occurrenceDate ?? "",
+      receiptNumber: item.receiptNumber ?? "",
+      type,
+      typeLabel: getDetailTypeLabel(type),
+      amount: Math.abs(Number(item.amount ?? 0)),
+      remark: item.remark ?? "",
+    };
+  });
+};
+
+const selectAllPurchaseRows = (keepApiSummary = false) => {
+  nextTick(() => {
+    const table = purchaseTableRef.value;
+    if (!table) return;
+    table.clearSelection();
+    purchaseData.value.forEach((row) => table.toggleRowSelection(row, true));
+    selectedPurchases.value = [...purchaseData.value];
+    if (!keepApiSummary) {
+      calculateSummary();
+    }
+  });
+};
+
+const isNumericId = (id) => id !== undefined && id !== null && id !== "" && /^\d+$/.test(String(id));
+
+const buildFilterParams = (params = {}) => {
+  const result = { ...params, accountType: ACCOUNT_TYPE_PAYABLE };
+  if (filters.supplierId) {
+    result.customerId = filters.supplierId;
+  }
+  if (filters.startMonth && filters.endMonth && filters.startMonth === filters.endMonth) {
+    result.statementMonth = filters.startMonth;
+  } else if (filters.startMonth) {
+    result.startMonth = filters.startMonth;
+  }
+  if (filters.endMonth && filters.startMonth !== filters.endMonth) {
+    result.endMonth = filters.endMonth;
+  }
+  return result;
+};
+
+const buildListParams = () =>
+  buildFilterParams({
+    current: pagination.currentPage,
+    size: pagination.pageSize,
+  });
+
+const buildExportParams = () => buildFilterParams({});
+
+const buildDetailSubmitItem = (row) => {
+  const item = {
+    occurrenceDate: row.occurrenceDate,
+    receiptNumber: row.receiptNumber,
+    type: row.type,
+    amount: row.amount,
+    remark: row.remark ?? "",
+  };
+  if (isNumericId(row.id)) {
+    item.id = Number(row.id);
+  }
+  if (row.accountStatementId) {
+    item.accountStatementId = row.accountStatementId;
+  }
+  return item;
+};
+
+const buildAddPayload = () => ({
+  customerId: generateForm.supplierId,
+  customerName: generateForm.supplierName,
+  statementMonth: generateForm.statementMonth,
+  accountType: ACCOUNT_TYPE_PAYABLE,
+  statementNumber: "",
+  openingBalance: generateForm.openingBalance,
+  currentPlan: generateForm.currentPlan,
+  currentActually: generateForm.currentActually,
+  closingBalance: generateForm.closingBalance,
+  accountStatementDetails: selectedPurchases.value.map(buildDetailSubmitItem),
+});
 
 const formatMoney = (value) => {
   if (value === undefined || value === null) return "0.00";
@@ -229,15 +411,35 @@
 };
 
 const getTableData = () => {
-  let result = [...mockData];
-  if (filters.supplierId) {
-    result = result.filter(item => item.supplierId === filters.supplierId);
-  }
-  if (filters.startMonth && filters.endMonth) {
-    result = result.filter(item => item.period >= filters.startMonth && item.period <= filters.endMonth);
-  }
-  pagination.total = result.length;
-  dataList.value = result.slice((pagination.currentPage - 1) * pagination.pageSize, pagination.currentPage * pagination.pageSize);
+  tableLoading.value = true;
+  listPageAccountStatement(buildListParams())
+    .then((res) => {
+      const ok = res.code === 200 || res.code === 0;
+      if (ok && res.data) {
+        pagination.total = res.data.total ?? 0;
+        dataList.value = (res.data.records ?? []).map((row) => ({
+          ...row,
+          supplierName: row.supplierName ?? row.customerName,
+        }));
+      } else {
+        ElMessage.error(res.msg || "鏌ヨ澶辫触");
+        dataList.value = [];
+        pagination.total = 0;
+      }
+    })
+    .catch(() => {
+      dataList.value = [];
+      pagination.total = 0;
+      ElMessage.error("鏌ヨ澶辫触");
+    })
+    .finally(() => {
+      tableLoading.value = false;
+    });
+};
+
+const onSearch = () => {
+  pagination.currentPage = 1;
+  getTableData();
 };
 
 const resetFilters = () => {
@@ -248,92 +450,106 @@
   getTableData();
 };
 
-const changePage = ({ current, size }) => {
-  pagination.currentPage = current;
-  pagination.pageSize = size;
+const changePage = ({ page, limit }) => {
+  pagination.currentPage = page;
+  pagination.pageSize = limit;
   getTableData();
 };
 
 const generateStatement = () => {
   generateForm.supplierId = "";
   generateForm.supplierName = "";
-  generateForm.period = "";
-  generateForm.beginBalance = 0;
-  generateForm.currentPayable = 0;
-  generateForm.currentPayment = 0;
+  generateForm.statementMonth = "";
+  generateForm.openingBalance = 0;
+  generateForm.currentPlan = 0;
+  generateForm.currentActually = 0;
+  generateForm.closingBalance = 0;
+  statementDetailLoaded.value = false;
   purchaseData.value = [];
   selectedPurchases.value = [];
   generateDialogVisible.value = true;
 };
 
 const onSupplierChange = (supplierId) => {
-  const supplier = supplierList.find(item => item.id === supplierId);
-  if (supplier) {
-    generateForm.supplierName = supplier.name;
-  }
+  const supplier = supplierList.value.find((item) => item.id === supplierId);
+  generateForm.supplierName = supplier?.supplierName ?? "";
   loadPurchaseData();
 };
 
-const onPeriodChange = () => {
+const onStatementMonthChange = () => {
   loadPurchaseData();
 };
 
 const loadPurchaseData = () => {
-  if (!generateForm.supplierId || !generateForm.period) {
+  if (!generateForm.supplierId || !generateForm.statementMonth) {
     purchaseData.value = [];
+    selectedPurchases.value = [];
+    statementDetailLoaded.value = false;
+    generateForm.openingBalance = 0;
+    generateForm.currentPlan = 0;
+    generateForm.currentActually = 0;
+    generateForm.closingBalance = 0;
     return;
   }
 
   purchaseLoading.value = true;
+  selectedPurchases.value = [];
+  statementDetailLoaded.value = false;
 
-  setTimeout(() => {
-    const mockPurchaseData = [
-      { id: 1, date: generateForm.period + "-05", code: "RK2024001", type: "鍏ュ簱", amount: 8000, remark: "鍘熸潗鏂欓噰璐�" },
-      { id: 2, date: generateForm.period + "-10", code: "FK2024001", type: "浠樻", amount: 5000, remark: "鏀粯璐ф" },
-      { id: 3, date: generateForm.period + "-15", code: "RK2024002", type: "鍏ュ簱", amount: 12000, remark: "鐢靛瓙鍏冨櫒浠�" },
-      { id: 4, date: generateForm.period + "-18", code: "TH2024001", type: "閫�璐�", amount: 2000, remark: "璐ㄩ噺闂閫�璐�" },
-      { id: 5, date: generateForm.period + "-22", code: "RK2024003", type: "鍏ュ簱", amount: 6000, remark: "鍖呰鏉愭枡" },
-      { id: 6, date: generateForm.period + "-25", code: "FK2024002", type: "浠樻", amount: 8000, remark: "鏀粯璐ф" },
-    ];
+  getAccountStatementDetailsByMonth({
+    accountType: ACCOUNT_TYPE_PAYABLE,
+    customerId: generateForm.supplierId,
+    statementMonth: generateForm.statementMonth,
+  })
+    .then((res) => {
+      if (res.code === 200) {
+        const data = res.data ?? {};
+        const details = data.accountStatementDetails;
+        const list = Array.isArray(details) ? details : [];
+        purchaseData.value = normalizePurchaseRows(list);
+        applyStatementSummary(data);
+        statementDetailLoaded.value = true;
 
-    purchaseData.value = mockPurchaseData;
-
-    const lastPeriod = getLastPeriod(generateForm.period);
-    const lastStatement = mockData.find(item =>
-      item.supplierId === generateForm.supplierId && item.period === lastPeriod
-    );
-    generateForm.beginBalance = lastStatement ? lastStatement.endBalance : 0;
-
-    calculateSummary();
-
-    purchaseLoading.value = false;
-  }, 500);
-};
-
-const getLastPeriod = (period) => {
-  const [year, month] = period.split("-").map(Number);
-  if (month === 1) {
-    return `${year - 1}-12`;
-  }
-  return `${year}-${String(month - 1).padStart(2, "0")}`;
+        if (purchaseData.value.length > 0) {
+          selectAllPurchaseRows(true);
+        }
+      } else {
+        purchaseData.value = [];
+        statementDetailLoaded.value = false;
+        ElMessage.error(res.msg || "鏌ヨ瀵硅处鏄庣粏澶辫触");
+      }
+    })
+    .catch(() => {
+      purchaseData.value = [];
+      statementDetailLoaded.value = false;
+      ElMessage.error("鏌ヨ瀵硅处鏄庣粏澶辫触");
+    })
+    .finally(() => {
+      purchaseLoading.value = false;
+    });
 };
 
 const calculateSummary = () => {
   let payable = 0;
   let payment = 0;
 
-  selectedPurchases.value.forEach(item => {
-    if (item.type === "鍏ュ簱") {
+  selectedPurchases.value.forEach((item) => {
+    if (item.type === 2) {
       payable += item.amount;
-    } else if (item.type === "閫�璐�") {
+    } else if (item.type === 5) {
       payable -= item.amount;
-    } else if (item.type === "浠樻") {
+    } else if (item.type === 4) {
       payment += item.amount;
     }
   });
 
-  generateForm.currentPayable = payable;
-  generateForm.currentPayment = payment;
+  generateForm.currentPlan = payable;
+  generateForm.currentActually = payment;
+  generateForm.closingBalance = calculateEndBalance(
+    generateForm.openingBalance,
+    generateForm.currentPlan,
+    generateForm.currentActually
+  );
 };
 
 const handlePurchaseSelectionChange = (selection) => {
@@ -342,51 +558,127 @@
 };
 
 const confirmGenerate = () => {
-  const newId = mockData.length > 0 ? Math.max(...mockData.map(item => item.id)) + 1 : 1;
-  const endBalance = calculateEndBalance(generateForm.beginBalance, generateForm.currentPayable, generateForm.currentPayment);
+  if (!canGenerate.value) return;
+  submitLoading.value = true;
+  addAccountStatement(buildAddPayload())
+    .then((res) => {
+      if (res.code === 200) {
+        generateDialogVisible.value = false;
+        ElMessage.success("瀵硅处鍗曠敓鎴愭垚鍔�");
+        pagination.currentPage = 1;
+        getTableData();
+      } else {
+        ElMessage.error(res.msg || "鐢熸垚澶辫触");
+      }
+    })
+    .catch(() => {
+      ElMessage.error("鐢熸垚澶辫触");
+    })
+    .finally(() => {
+      submitLoading.value = false;
+    });
+};
 
-  mockData.unshift({
-    id: newId,
-    statementCode: "DZ" + Date.now(),
-    supplierId: generateForm.supplierId,
-    supplierName: generateForm.supplierName,
-    period: generateForm.period,
-    beginBalance: generateForm.beginBalance,
-    currentPayable: generateForm.currentPayable,
-    currentPayment: generateForm.currentPayment,
-    endBalance,
+const handleDelete = (row) => {
+  ElMessageBox.confirm(`纭鍒犻櫎瀵硅处鍗曘��${row.statementNumber || row.id}銆嶅悧锛焋, "鎻愮ず", {
+    confirmButtonText: "纭畾",
+    cancelButtonText: "鍙栨秷",
+    type: "warning",
+  }).then(() => {
+    deleteAccountStatement([row.id])
+      .then((res) => {
+        if (res.code === 200) {
+          ElMessage.success("鍒犻櫎鎴愬姛");
+          getTableData();
+        } else {
+          ElMessage.error(res.msg || "鍒犻櫎澶辫触");
+        }
+      })
+      .catch(() => {
+        ElMessage.error("鍒犻櫎澶辫触");
+      });
+  });
+};
+
+const buildDetailTableFromApi = (data, statementMonth) => {
+  const details = Array.isArray(data.accountStatementDetails) ? data.accountStatementDetails : [];
+  let runningBalance = Number(data.openingBalance ?? 0);
+  const rows = [
+    {
+      date: statementMonth ?? "",
+      type: "鏈熷垵",
+      code: "-",
+      debit: 0,
+      credit: 0,
+      balance: runningBalance,
+      remark: "鏈熷垵浣欓",
+    },
+  ];
+
+  details.forEach((item) => {
+    const amount = Math.abs(Number(item.amount ?? 0));
+    const type = Number(item.type);
+    let debit = 0;
+    let credit = 0;
+
+    if (type === 2) {
+      credit = amount;
+      runningBalance += amount;
+    } else if (type === 4) {
+      debit = amount;
+      runningBalance -= amount;
+    } else if (type === 5) {
+      credit = -amount;
+      runningBalance -= amount;
+    }
+
+    rows.push({
+      date: item.occurrenceDate ?? "",
+      type: getDetailTypeLabel(type),
+      code: item.receiptNumber ?? "",
+      debit,
+      credit,
+      balance: runningBalance,
+      remark: item.remark ?? "",
+    });
   });
 
-  generateDialogVisible.value = false;
-  ElMessage.success("瀵硅处鍗曠敓鎴愭垚鍔�");
-  getTableData();
+  return rows;
 };
 
 const viewDetail = (row) => {
-  currentSupplier.value = row.supplierName;
-  currentPeriod.value = row.period;
+  const partnerId = row.customerId ?? row.supplierId;
+  if (!partnerId || !row.statementMonth) {
+    ElMessage.warning("缂哄皯渚涘簲鍟嗘垨瀵硅处鏈堜唤锛屾棤娉曟煡璇㈡槑缁�");
+    return;
+  }
 
-  const purchaseInAmount = Math.floor(row.currentPayable * 0.7);
-  const returnAmount = Math.floor(row.currentPayable * 0.1);
-  const firstPayment = Math.floor(row.currentPayment * 0.5);
-  const secondPayment = row.currentPayment - firstPayment;
-
-  let runningBalance = row.beginBalance;
-
-  detailData.value = [
-    { date: row.period + "-01", type: "鏈熷垵", code: "-", debit: 0, credit: 0, balance: runningBalance, remark: "鏈熷垵浣欓" },
-    { date: row.period + "-05", type: "鍏ュ簱", code: "RK2024001", debit: 0, credit: purchaseInAmount, balance: runningBalance += purchaseInAmount, remark: "閲囪喘鍏ュ簱" },
-    { date: row.period + "-10", type: "浠樻", code: "FK2024001", debit: firstPayment, credit: 0, balance: runningBalance -= firstPayment, remark: "鏀粯璐ф" },
-    { date: row.period + "-15", type: "鍏ュ簱", code: "RK2024002", debit: 0, credit: row.currentPayable - purchaseInAmount - returnAmount, balance: runningBalance += (row.currentPayable - purchaseInAmount - returnAmount), remark: "閲囪喘鍏ュ簱" },
-    { date: row.period + "-20", type: "閫�璐�", code: "TH2024001", debit: 0, credit: -returnAmount, balance: runningBalance -= returnAmount, remark: "閲囪喘閫�璐�" },
-    { date: row.period + "-25", type: "浠樻", code: "FK2024002", debit: secondPayment, credit: 0, balance: runningBalance -= secondPayment, remark: "鏀粯璐ф" },
-  ];
-
+  currentSupplier.value = row.supplierName ?? row.customerName ?? "";
+  currentPeriod.value = row.statementMonth ?? "";
+  detailData.value = [];
   detailDialogVisible.value = true;
-};
+  detailLoading.value = true;
 
-const printStatement = (row) => {
-  ElMessage.info(`鎵撳嵃瀵硅处鍗�: ${row.statementCode}`);
+  getAccountStatementDetailsByMonth({
+    accountType: ACCOUNT_TYPE_PAYABLE,
+    customerId: partnerId,
+    statementMonth: row.statementMonth,
+  })
+    .then((res) => {
+      if (res.code === 200) {
+        detailData.value = buildDetailTableFromApi(res.data ?? {}, row.statementMonth);
+      } else {
+        ElMessage.error(res.msg || "鏌ヨ鏄庣粏澶辫触");
+        detailDialogVisible.value = false;
+      }
+    })
+    .catch(() => {
+      ElMessage.error("鏌ヨ鏄庣粏澶辫触");
+      detailDialogVisible.value = false;
+    })
+    .finally(() => {
+      detailLoading.value = false;
+    });
 };
 
 const printDetail = () => {
@@ -394,10 +686,15 @@
 };
 
 const handleOut = () => {
-  ElMessage.success("瀵煎嚭鎴愬姛");
+  proxy.download(
+    "/accountStatement/exportAccountStatement",
+    buildExportParams(),
+    `搴斾粯瀵硅处鍗昣${Date.now()}.xlsx`
+  );
 };
 
 onMounted(() => {
+  getSupplierList();
   getTableData();
 });
 </script>
@@ -415,6 +712,10 @@
 
 .text-danger {
   color: #f56c6c;
+}
+
+.text-primary {
+  color: #409eff;
 }
 
 .statement-header {
@@ -461,9 +762,5 @@
 
 .empty-tip {
   margin-top: 30px;
-}
-
-.text-primary {
-  color: #409eff;
 }
 </style>
diff --git a/src/views/financialManagement/receivable/invoiceApply.vue b/src/views/financialManagement/receivable/invoiceApply.vue
index 2a4bd81..31b6345 100644
--- a/src/views/financialManagement/receivable/invoiceApply.vue
+++ b/src/views/financialManagement/receivable/invoiceApply.vue
@@ -6,19 +6,31 @@
       </el-form-item>
       <el-form-item label="瀹㈡埛:">
         <el-select v-model="filters.customerId" placeholder="璇烽�夋嫨瀹㈡埛" clearable style="width: 200px;">
-          <el-option v-for="item in customerList" :key="item.id" :label="item.name" :value="item.id" />
+          <el-option v-for="item in customerList" :key="item.id" :label="item.customerName" :value="item.id" />
         </el-select>
       </el-form-item>
-      <el-form-item label="鐘舵��:">
-        <el-select v-model="filters.status" placeholder="璇烽�夋嫨鐘舵��" clearable style="width: 150px;">
-          <el-option label="寰呭鏍�" value="pending" />
-          <el-option label="宸插鏍�" value="approved" />
-          <el-option label="宸查┏鍥�" value="rejected" />
-          <el-option label="宸插紑绁�" value="invoiced" />
+      <el-form-item label="瀹℃牳鐘舵��:">
+        <el-select v-model="filters.status" placeholder="璇烽�夋嫨瀹℃牳鐘舵��" clearable style="width: 150px;">
+          <el-option label="寰呭鏍�" :value="0" />
+          <el-option label="瀹℃牳閫氳繃" :value="1" />
+          <el-option label="瀹℃牳涓嶉�氳繃" :value="2" />
         </el-select>
+      </el-form-item>
+      <el-form-item label="鐢宠鏃ユ湡:">
+        <el-date-picker
+          v-model="filters.dateRange"
+          type="daterange"
+          value-format="YYYY-MM-DD"
+          format="YYYY-MM-DD"
+          range-separator="鑷�"
+          start-placeholder="寮�濮嬫棩鏈�"
+          end-placeholder="缁撴潫鏃ユ湡"
+          clearable
+          style="width: 240px;"
+        />
       </el-form-item>
       <el-form-item>
-        <el-button type="primary" @click="getTableData">鎼滅储</el-button>
+        <el-button type="primary" @click="onSearch">鎼滅储</el-button>
         <el-button @click="resetFilters">閲嶇疆</el-button>
       </el-form-item>
     </el-form>
@@ -27,12 +39,13 @@
         <div></div>
         <div>
           <el-button type="primary" @click="add" icon="Plus">鏂板鐢宠</el-button>
-          <el-button @click="handleBatchApply" icon="Document" :disabled="selectedRows.length === 0">鎵归噺鐢宠</el-button>
+          <el-button type="success" @click="handleExport" icon="Download">瀵煎嚭寮�绁ㄧ敵璇�</el-button>
         </div>
       </div>
       <PIMTable
         rowKey="id"
         isSelection
+        v-loading="tableLoading"
         :column="columns"
         :tableData="dataList"
         :page="{
@@ -50,42 +63,99 @@
           <span>{{ row.taxRate }}%</span>
         </template>
         <template #status="{ row }">
-          <el-tag :type="getStatusType(row.status)">{{ getStatusLabel(row.status) }}</el-tag>
+          <el-tag :type="getStatusType(row.status)" effect="light" round>
+            {{ getStatusLabel(row.status) }}
+          </el-tag>
         </template>
         <template #operation="{ row }">
           <el-button type="primary" link @click="view(row)">鏌ョ湅</el-button>
-          <el-button type="primary" link @click="edit(row)" v-if="row.status === 'pending'">缂栬緫</el-button>
-          <el-button type="success" link @click="handleAudit(row)" v-if="row.status === 'pending'">瀹℃牳</el-button>
-          <el-button type="warning" link @click="handleInvoice(row)" v-if="row.status === 'approved'">寮�绁�</el-button>
+          <el-button type="primary" link @click="edit(row)" v-if="isPendingStatus(row.status)">缂栬緫</el-button>
+          <el-button type="danger" link @click="handleDelete(row)" v-if="isPendingStatus(row.status)">鍒犻櫎</el-button>
+          <el-button type="success" link @click="handleAudit(row)" v-if="isPendingStatus(row.status)">瀹℃牳</el-button>
+          <el-button type="primary" link @click="openFileDialog(row)" v-if="isApprovedStatus(row.status)">闄勪欢</el-button>
         </template>
       </PIMTable>
     </div>
 
-    <FormDialog :title="dialogTitle" v-model="dialogVisible" width="800px" @confirm="submitForm" @cancel="dialogVisible = false">
+    <FormDialog
+      :title="dialogTitle"
+      v-model="dialogVisible"
+      width="800px"
+      :operation-type="isView ? 'detail' : ''"
+      @confirm="submitForm"
+      @cancel="closeDialog"
+    >
       <el-form :model="form" :rules="rules" ref="formRef" label-width="120px">
-        <el-row :gutter="20">
+        <el-row v-if="isView" :gutter="20">
           <el-col :span="12">
+            <el-form-item label="瀹℃牳鐘舵��">
+              <el-tag :type="getStatusType(form.status)" effect="light" round>
+                {{ getStatusLabel(form.status) }}
+              </el-tag>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="24">
             <el-form-item label="鐢宠鍗曞彿" prop="applyCode">
               <el-input v-model="form.applyCode" placeholder="绯荤粺鑷姩鐢熸垚" disabled />
             </el-form-item>
           </el-col>
+        </el-row>
+        <el-row :gutter="20">
           <el-col :span="12">
             <el-form-item label="瀹㈡埛" prop="customerId">
-              <el-select v-model="form.customerId" placeholder="璇烽�夋嫨瀹㈡埛" style="width: 100%;" :disabled="isEdit">
-                <el-option v-for="item in customerList" :key="item.id" :label="item.name" :value="item.id" />
+              <el-select
+                v-model="form.customerId"
+                placeholder="璇烽�夋嫨瀹㈡埛"
+                style="width: 100%;"
+                :disabled="isEdit || isView"
+                filterable
+                @change="handleCustomerChange"
+              >
+                <el-option v-for="item in customerList" :key="item.id" :label="item.customerName" :value="item.id" />
               </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鍑哄簱鍗曞彿" prop="outboundBatchNos">
+              <el-input
+                :model-value="outboundBatchDisplayText"
+                placeholder="璇峰厛閫夋嫨瀹㈡埛"
+                readonly
+                :disabled="!form.customerId || isEdit || isView"
+                class="outbound-batch-input"
+                @click="handleOutboundInputClick"
+              >
+                <template v-if="!isEdit && !isView" #append>
+                  <el-button
+                    :disabled="!form.customerId"
+                    :loading="outboundBatchLoading"
+                    @click.stop="openOutboundSelectDialog"
+                  >
+                    閫夋嫨
+                  </el-button>
+                </template>
+              </el-input>
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="20">
           <el-col :span="12">
             <el-form-item label="寮�绁ㄩ噾棰�" prop="amount">
-              <el-input-number v-model="form.amount" :min="0" :precision="2" style="width: 100%;" />
+              <el-input-number
+                v-model="form.amount"
+                :min="0"
+                :precision="2"
+                :disabled="isView"
+                style="width: 100%;"
+                placeholder="鏍规嵁鎵�閫夊嚭搴撳崟鑷姩姹囨�伙紝鍙慨鏀�"
+              />
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="绋庣巼" prop="taxRate">
-              <el-select v-model="form.taxRate" placeholder="璇烽�夋嫨绋庣巼" style="width: 100%;">
+              <el-select v-model="form.taxRate" placeholder="璇烽�夋嫨绋庣巼" style="width: 100%;" :disabled="isView">
                 <el-option
                   v-for="dict in tax_rate"
                   :key="dict.value"
@@ -99,38 +169,103 @@
         <el-row :gutter="20">
           <el-col :span="12">
             <el-form-item label="鍙戠エ绫诲瀷" prop="invoiceType">
-              <el-select v-model="form.invoiceType" placeholder="璇烽�夋嫨鍙戠エ绫诲瀷" style="width: 100%;">
-                <el-option label="澧炲�肩◣涓撶敤鍙戠エ" value="special" />
-                <el-option label="澧炲�肩◣鏅�氬彂绁�" value="normal" />
-                <el-option label="鐢靛瓙鍙戠エ" value="electronic" />
+              <el-select v-model="form.invoiceType" placeholder="璇烽�夋嫨鍙戠エ绫诲瀷" style="width: 100%;" :disabled="isView">
+                <el-option label="澧炲�肩◣涓撶敤鍙戠エ" value="澧炲�肩◣涓撶敤鍙戠エ" />
+                <el-option label="澧炲�肩◣鏅�氬彂绁�" value="澧炲�肩◣鏅�氬彂绁�" />
+                <el-option label="鐢靛瓙鍙戠エ" value="鐢靛瓙鍙戠エ" />
               </el-select>
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="鐢宠鏃ユ湡" prop="applyDate">
-              <el-date-picker v-model="form.applyDate" type="date" placeholder="閫夋嫨鏃ユ湡" value-format="YYYY-MM-DD" style="width: 100%;" />
+              <el-date-picker
+                v-model="form.applyDate"
+                type="date"
+                placeholder="閫夋嫨鏃ユ湡"
+                value-format="YYYY-MM-DD"
+                style="width: 100%;"
+                :disabled="isView"
+              />
             </el-form-item>
           </el-col>
         </el-row>
         <el-form-item label="鍙戠エ鍐呭" prop="content">
-          <el-input v-model="form.content" type="textarea" :rows="3" placeholder="璇疯緭鍏ュ彂绁ㄥ唴瀹�" />
+          <el-input v-model="form.content" type="textarea" :rows="3" placeholder="璇疯緭鍏ュ彂绁ㄥ唴瀹�" :disabled="isView" />
         </el-form-item>
         <el-form-item label="澶囨敞" prop="remark">
-          <el-input v-model="form.remark" type="textarea" :rows="2" placeholder="璇疯緭鍏ュ娉�" />
+          <el-input v-model="form.remark" type="textarea" :rows="2" placeholder="璇疯緭鍏ュ娉�" :disabled="isView" />
         </el-form-item>
       </el-form>
-      <template #footer>
-        <el-button type="primary" @click="submitForm">纭畾</el-button>
-        <el-button @click="dialogVisible = false">鍙栨秷</el-button>
+      <template v-if="!isView" #footer>
+        <el-button type="primary" :loading="submitLoading" @click="submitForm">纭畾</el-button>
+        <el-button @click="closeDialog">鍙栨秷</el-button>
       </template>
     </FormDialog>
+
+    <el-dialog
+      v-model="outboundSelectVisible"
+      title="閫夋嫨鍑哄簱鍗�"
+      width="1200px"
+      append-to-body
+      destroy-on-close
+      :close-on-click-modal="false"
+      @closed="handleOutboundDialogClosed"
+    >
+      <el-table
+        ref="outboundTableRef"
+        v-loading="outboundBatchLoading"
+        :data="outboundBatchList"
+        row-key="id"
+        border
+        stripe
+        max-height="480"
+        @selection-change="handleOutboundDialogSelectionChange"
+      >
+        <el-table-column type="selection" width="55" align="center" />
+        <el-table-column prop="outboundBatches" label="鍑哄簱鍗曞彿" min-width="140" show-overflow-tooltip />
+        <el-table-column prop="customerName" label="瀹㈡埛鍚嶇О" min-width="120" show-overflow-tooltip />
+        <el-table-column prop="productName" label="浜у搧鍚嶇О" min-width="120" show-overflow-tooltip />
+        <el-table-column prop="specificationModel" label="瑙勬牸鍨嬪彿" min-width="140" show-overflow-tooltip />
+        <el-table-column prop="salesContractNo" label="閿�鍞悎鍚屽彿" min-width="140" show-overflow-tooltip />
+        <el-table-column prop="shippingNo" label="鍙戣揣鍗曞彿" min-width="130" show-overflow-tooltip />
+        <el-table-column prop="shippingDate" label="鍙戣揣鏃ユ湡" width="110" align="center" />
+        <el-table-column prop="outboundAmount" label="鍑哄簱閲戦" width="110" align="right">
+          <template #default="{ row }">楼{{ formatMoney(row.outboundAmount) }}</template>
+        </el-table-column>
+        <el-table-column prop="taxRate" label="绋庣巼" width="80" align="center">
+          <template #default="{ row }">{{ row.taxRate }}%</template>
+        </el-table-column>
+      </el-table>
+      <template #footer>
+        <el-button type="primary" @click="confirmOutboundSelection">纭畾</el-button>
+        <el-button @click="outboundSelectVisible = false">鍙栨秷</el-button>
+      </template>
+    </el-dialog>
+
+    <FileList
+      v-if="fileDialogVisible"
+      v-model:visible="fileDialogVisible"
+      record-type="account_invoice_application"
+      :record-id="currentRecordId"
+    />
   </div>
 </template>
 
 <script setup>
-import { ref, reactive, onMounted, getCurrentInstance } from "vue";
+import { ref, reactive, computed, onMounted, nextTick, getCurrentInstance, defineAsyncComponent } from "vue";
 import { ElMessage, ElMessageBox } from "element-plus";
 import FormDialog from "@/components/Dialog/FormDialog.vue";
+import { listCustomer } from "@/api/basicData/customer.js";
+import {
+  getOutboundBatchesByCustomer,
+  addAccountInvoiceApplication,
+  listPageAccountInvoiceApplication,
+  auditAccountInvoiceApplication,
+  updateAccountInvoiceApplication,
+  deleteAccountInvoiceApplication,
+} from "@/api/financialManagement/invoiceApply.js";
+
+const FileList = defineAsyncComponent(() => import("@/components/Dialog/FileList.vue"));
 
 defineOptions({
   name: "寮�绁ㄧ敵璇�",
@@ -143,6 +278,7 @@
   applyCode: "",
   customerId: "",
   status: "",
+  dateRange: [],
 });
 
 const pagination = reactive({
@@ -154,35 +290,237 @@
 const columns = [
   { label: "鐢宠鍗曞彿", prop: "applyCode", width: "150" },
   { label: "瀹㈡埛鍚嶇О", prop: "customerName", width: "180" },
-  { label: "寮�绁ㄩ噾棰�", prop: "amount", slot: "amount" },
-  { label: "绋庣巼", prop: "taxRate", slot: "taxRate" },
-  { label: "鍙戠エ绫诲瀷", prop: "invoiceTypeLabel", width: "130" },
+  { label: "寮�绁ㄩ噾棰�", prop: "amount", dataType: "slot", slot: "amount" },
+  { label: "绋庣巼", prop: "taxRate", dataType: "slot", slot: "taxRate" },
+  { label: "鍙戠エ绫诲瀷", prop: "invoiceType", width: "130" },
   { label: "鐢宠鏃ユ湡", prop: "applyDate", width: "120" },
-  { label: "鐘舵��", prop: "status", slot: "status" },
-  { label: "鎿嶄綔", prop: "operation", slot: "operation", width: "200", fixed: "right" },
+  { label: "瀹℃牳鐘舵��", prop: "status", dataType: "slot", slot: "status", width: "110", align: "center" },
+  { label: "鎿嶄綔", prop: "operation", dataType: "slot", slot: "operation", width: "300", fixed: "right" },
 ];
 
 const dataList = ref([]);
+const tableLoading = ref(false);
 const selectedRows = ref([]);
 const dialogVisible = ref(false);
 const dialogTitle = ref("");
 const formRef = ref(null);
 const isEdit = ref(false);
+const isView = ref(false);
 const currentId = ref(null);
 
-const customerList = [
-  { id: 1, name: "鍖椾含绉戞妧鏈夐檺鍏徃" },
-  { id: 2, name: "涓婃捣璐告槗鍏徃" },
-  { id: 3, name: "骞垮窞瀹炰笟鏈夐檺鍏徃" },
-  { id: 4, name: "娣卞湷鐢靛瓙鍏徃" },
-];
+const closeDialog = () => {
+  dialogVisible.value = false;
+  outboundSelectVisible.value = false;
+  isView.value = false;
+  isEdit.value = false;
+};
+
+const customerList = ref([]);
+const outboundBatchList = ref([]);
+const outboundBatchOptions = ref([]);
+const outboundBatchLoading = ref(false);
+const outboundSelectVisible = ref(false);
+const outboundTableRef = ref(null);
+const dialogOutboundSelection = ref([]);
+
+const getCustomerList = () => {
+  listCustomer({ current: -1, size: -1, type: 0 }).then((res) => {
+    if (res.code === 200) {
+      customerList.value = res.data?.records || [];
+    }
+  });
+};
+
+const normalizeOutboundBatchOptions = (data) => {
+  const list = Array.isArray(data) ? data : [];
+  return list.map((item, index) => {
+    if (typeof item === "string" || typeof item === "number") {
+      const text = String(item);
+      return { label: text, value: text, outboundAmount: 0 };
+    }
+    const label =
+      item.outboundBatches ??
+      item.batchNo ??
+      item.shippingNo ??
+      item.outboundNo ??
+      item.label ??
+      `鍑哄簱鍗�${index + 1}`;
+    const value = item.id ?? item.stockOutRecordId ?? item.stockOutRecordIds ?? label;
+    const outboundAmount = Number(item.outboundAmount) || 0;
+    const taxRate =
+      item.taxRate !== undefined && item.taxRate !== null && item.taxRate !== ""
+        ? Number(item.taxRate)
+        : undefined;
+    return { label: String(label), value, outboundAmount, taxRate };
+  });
+};
+
+const isSameOutboundId = (a, b) => String(a) === String(b);
+
+const getSelectedOutboundOptions = () => {
+  const selected = form.outboundBatchNos || [];
+  return outboundBatchOptions.value.filter((opt) =>
+    selected.some((id) => isSameOutboundId(id, opt.value))
+  );
+};
+
+/** 鏍¢獙鎵�閫夊嚭搴撳崟绋庣巼鏄惁涓�鑷达紝涓�鑷村垯鍥炲~ form.taxRate */
+const checkTaxRateConsistency = (showMessage = true) => {
+  const selected = getSelectedOutboundOptions();
+  if (selected.length === 0) return true;
+
+  const withTaxRate = selected.filter(
+    (opt) => opt.taxRate !== undefined && opt.taxRate !== null && !Number.isNaN(opt.taxRate)
+  );
+  if (withTaxRate.length === 0) return true;
+
+  const uniqueRates = [...new Set(withTaxRate.map((opt) => Number(opt.taxRate)))];
+  if (uniqueRates.length > 1) {
+    if (showMessage) {
+      const detail = withTaxRate.map((opt) => `${opt.label}(${opt.taxRate}%)`).join("銆�");
+      ElMessage.error(`鎵�閫夊嚭搴撳崟绋庣巼涓嶄竴鑷达紝鏃犳硶寮�绁細${detail}`);
+    }
+    return false;
+  }
+
+  form.taxRate = uniqueRates[0];
+  return true;
+};
+
+/** 鏍规嵁鎵�閫夊嚭搴撳崟姹囨�� outboundAmount 浣滀负寮�绁ㄩ噾棰� */
+const syncInvoiceAmount = () => {
+  const selected = form.outboundBatchNos || [];
+  const sum = outboundBatchOptions.value
+    .filter((opt) => selected.some((id) => isSameOutboundId(id, opt.value)))
+    .reduce((acc, opt) => acc + (Number(opt.outboundAmount) || 0), 0);
+  form.amount = sum > 0 ? Number(sum.toFixed(2)) : 0;
+};
+
+const getOutboundRowId = (row) => row?.id ?? row?.stockOutRecordId;
+
+const outboundBatchDisplayText = computed(() => {
+  if (isEdit.value || isView.value) {
+    return form.outboundBatches || "";
+  }
+  if (form.outboundBatches) return form.outboundBatches;
+  const ids = form.outboundBatchNos || [];
+  if (!ids.length) return "";
+  return outboundBatchOptions.value
+    .filter((opt) => ids.some((id) => isSameOutboundId(id, opt.value)))
+    .map((opt) => opt.label)
+    .join("銆�");
+});
+
+const handleOutboundInputClick = () => {
+  if (isEdit.value || isView.value) return;
+  openOutboundSelectDialog();
+};
+
+const restoreOutboundTableSelection = () => {
+  nextTick(() => {
+    const table = outboundTableRef.value;
+    if (!table) return;
+    table.clearSelection();
+    const selectedIds = new Set((form.outboundBatchNos || []).map((id) => String(id)));
+    outboundBatchList.value.forEach((row) => {
+      const rowId = getOutboundRowId(row);
+      if (rowId !== undefined && rowId !== null && selectedIds.has(String(rowId))) {
+        table.toggleRowSelection(row, true);
+      }
+    });
+  });
+};
+
+const openOutboundSelectDialog = () => {
+  if (!form.customerId || isEdit.value || isView.value) return;
+  outboundSelectVisible.value = true;
+  loadOutboundBatches(form.customerId, true).then(() => {
+    restoreOutboundTableSelection();
+  });
+};
+
+const handleOutboundDialogSelectionChange = (selection) => {
+  dialogOutboundSelection.value = selection;
+};
+
+const confirmOutboundSelection = () => {
+  if (dialogOutboundSelection.value.length === 0) {
+    ElMessage.warning("璇疯嚦灏戦�夋嫨涓�鏉″嚭搴撳崟");
+    return;
+  }
+  const prevIds = [...(form.outboundBatchNos || [])];
+  const prevBatches = form.outboundBatches;
+  form.outboundBatchNos = dialogOutboundSelection.value
+    .map((row) => getOutboundRowId(row))
+    .filter((id) => id !== undefined && id !== null);
+  form.outboundBatches = dialogOutboundSelection.value
+    .map((row) => row.outboundBatches ?? row.batchNo ?? row.shippingNo ?? "")
+    .filter(Boolean)
+    .join("銆�");
+  if (!checkTaxRateConsistency()) {
+    form.outboundBatchNos = prevIds;
+    form.outboundBatches = prevBatches;
+    return;
+  }
+  outboundSelectVisible.value = false;
+  syncInvoiceAmount();
+  formRef.value?.validateField("outboundBatchNos");
+};
+
+const handleOutboundDialogClosed = () => {
+  dialogOutboundSelection.value = [];
+};
+
+const loadOutboundBatches = (customerId, keepSelected = false) => {
+  if (!customerId) {
+    outboundBatchList.value = [];
+    outboundBatchOptions.value = [];
+    if (!keepSelected) {
+      form.outboundBatchNos = [];
+      form.amount = 0;
+    }
+    return Promise.resolve();
+  }
+  outboundBatchLoading.value = true;
+  return getOutboundBatchesByCustomer({ customerId })
+    .then((res) => {
+      if (res.code === 200) {
+        const list = res.data?.records ?? res.data ?? [];
+        outboundBatchList.value = Array.isArray(list) ? list : [];
+        outboundBatchOptions.value = normalizeOutboundBatchOptions(list);
+      } else {
+        outboundBatchList.value = [];
+        outboundBatchOptions.value = [];
+      }
+    })
+    .catch(() => {
+      outboundBatchList.value = [];
+      outboundBatchOptions.value = [];
+    })
+    .finally(() => {
+      outboundBatchLoading.value = false;
+      if (keepSelected) {
+        syncInvoiceAmount();
+        checkTaxRateConsistency(false);
+      }
+    });
+};
+
+const handleCustomerChange = (customerId) => {
+  form.outboundBatchNos = [];
+  form.outboundBatches = "";
+  form.amount = 0;
+  loadOutboundBatches(customerId);
+};
 
 const form = reactive({
   applyCode: "",
   customerId: "",
+  outboundBatchNos: [],
+  outboundBatches: "",
   amount: 0,
   taxRate: 13,
-  invoiceType: "special",
+  invoiceType: "澧炲�肩◣涓撶敤鍙戠エ",
   applyDate: "",
   content: "",
   remark: "",
@@ -190,17 +528,103 @@
 
 const rules = {
   customerId: [{ required: true, message: "璇烽�夋嫨瀹㈡埛", trigger: "change" }],
+  outboundBatchNos: [{ required: true, type: "array", min: 1, message: "璇烽�夋嫨鍑哄簱鍗曞彿", trigger: "change" }],
   amount: [{ required: true, message: "璇疯緭鍏ュ紑绁ㄩ噾棰�", trigger: "blur" }],
   taxRate: [{ required: true, message: "璇烽�夋嫨绋庣巼", trigger: "change" }],
   invoiceType: [{ required: true, message: "璇烽�夋嫨鍙戠エ绫诲瀷", trigger: "change" }],
   applyDate: [{ required: true, message: "璇烽�夋嫨鐢宠鏃ユ湡", trigger: "change" }],
 };
 
-const mockData = [
-  { id: 1, applyCode: "KP2024001", customerId: 1, customerName: "鍖椾含绉戞妧鏈夐檺鍏徃", amount: 5000, taxRate: 13, invoiceType: "special", invoiceTypeLabel: "澧炲�肩◣涓撶敤鍙戠エ", applyDate: "2024-01-15", status: "pending", content: "杞欢鏈嶅姟璐�", remark: "" },
-  { id: 2, applyCode: "KP2024002", customerId: 2, customerName: "涓婃捣璐告槗鍏徃", amount: 8000, taxRate: 13, invoiceType: "normal", invoiceTypeLabel: "澧炲�肩◣鏅�氬彂绁�", applyDate: "2024-01-16", status: "approved", content: "鍟嗗搧閿�鍞�", remark: "" },
-  { id: 3, applyCode: "KP2024003", customerId: 3, customerName: "骞垮窞瀹炰笟鏈夐檺鍏徃", amount: 12000, taxRate: 6, invoiceType: "electronic", invoiceTypeLabel: "鐢靛瓙鍙戠エ", applyDate: "2024-01-18", status: "invoiced", content: "鎶�鏈湇鍔¤垂", remark: "" },
-];
+/** 瀹℃牳鐘舵�侊細0寰呭鏍� 1瀹℃牳閫氳繃 2瀹℃牳涓嶉�氳繃 */
+const STATUS_LABEL_MAP = {
+  0: "寰呭鏍�",
+  1: "瀹℃牳閫氳繃",
+  2: "瀹℃牳涓嶉�氳繃",
+};
+
+const STATUS_TYPE_MAP = {
+  0: "warning",
+  1: "success",
+  2: "danger",
+};
+
+const normalizeStatus = (status) => {
+  if (status === undefined || status === null || status === "") return status;
+  const num = Number(status);
+  return Number.isNaN(num) ? status : num;
+};
+
+const isPendingStatus = (status) => normalizeStatus(status) === 0;
+const isApprovedStatus = (status) => normalizeStatus(status) === 1;
+
+const fileDialogVisible = ref(false);
+const currentRecordId = ref(0);
+
+const openFileDialog = (row) => {
+  currentRecordId.value = row.id;
+  fileDialogVisible.value = true;
+};
+
+const formatOutboundBatches = (value) => {
+  if (value === undefined || value === null || value === "") return "";
+  if (Array.isArray(value)) return value.filter(Boolean).join("銆�");
+  return String(value)
+    .split(/[,锛宂/)
+    .map((s) => s.trim())
+    .filter(Boolean)
+    .join("銆�");
+};
+
+const normalizeTableRow = (row) => ({
+  ...row,
+  applyCode: row.invoiceApplicationNo ?? row.applyCode,
+  amount: row.invoiceAmount ?? row.amount,
+  content: row.invoiceContent ?? row.content,
+  status: normalizeStatus(row.status ?? row.auditStatus),
+  stockOutRecordIds: row.stockOutRecordIds ?? row.stockOutRecordId ?? "",
+  outboundBatches: formatOutboundBatches(row.outboundBatches),
+});
+
+const appendFilterParams = (params) => {
+  if (filters.applyCode) {
+    params.invoiceApplicationNo = filters.applyCode;
+  }
+  if (filters.customerId) {
+    params.customerId = filters.customerId;
+  }
+  if (filters.status !== "" && filters.status != null) {
+    params.status = filters.status;
+  }
+  if (filters.dateRange?.length === 2) {
+    params.startDate = filters.dateRange[0];
+    params.endDate = filters.dateRange[1];
+  }
+  return params;
+};
+
+const buildListParams = () => {
+  return appendFilterParams({
+    current: pagination.currentPage,
+    size: pagination.pageSize,
+  });
+};
+
+const buildExportParams = () => {
+  const params = appendFilterParams({});
+  if (selectedRows.value.length > 0) {
+    params.ids = selectedRows.value.map((row) => row.id).join(",");
+  }
+  return params;
+};
+
+const handleExport = () => {
+  const params = buildExportParams();
+  const filename =
+    selectedRows.value.length > 0
+      ? `寮�绁ㄧ敵璇穇宸查��${selectedRows.value.length}鏉${Date.now()}.xlsx`
+      : `寮�绁ㄧ敵璇穇${Date.now()}.xlsx`;
+  proxy.download("/accountInvoiceApplication/exportAccountInvoiceApplication", params, filename);
+};
 
 const formatMoney = (value) => {
   if (value === undefined || value === null) return "0.00";
@@ -208,34 +632,54 @@
 };
 
 const getStatusLabel = (status) => {
-  const map = { pending: "寰呭鏍�", approved: "宸插鏍�", rejected: "宸查┏鍥�", invoiced: "宸插紑绁�" };
-  return map[status] || status;
+  const num = normalizeStatus(status);
+  if (num === 0 || num === 1 || num === 2) {
+    return STATUS_LABEL_MAP[num];
+  }
+  return "-";
 };
 
 const getStatusType = (status) => {
-  const map = { pending: "warning", approved: "success", rejected: "danger", invoiced: "primary" };
-  return map[status] || "";
+  const num = normalizeStatus(status);
+  if (num === 0 || num === 1 || num === 2) {
+    return STATUS_TYPE_MAP[num];
+  }
+  return "info";
+};
+
+const onSearch = () => {
+  pagination.currentPage = 1;
+  getTableData();
 };
 
 const getTableData = () => {
-  let result = [...mockData];
-  if (filters.applyCode) {
-    result = result.filter(item => item.applyCode.includes(filters.applyCode));
-  }
-  if (filters.customerId) {
-    result = result.filter(item => item.customerId === filters.customerId);
-  }
-  if (filters.status) {
-    result = result.filter(item => item.status === filters.status);
-  }
-  pagination.total = result.length;
-  dataList.value = result.slice((pagination.currentPage - 1) * pagination.pageSize, pagination.currentPage * pagination.pageSize);
+  tableLoading.value = true;
+  listPageAccountInvoiceApplication(buildListParams())
+    .then((res) => {
+      const ok = res.code === 200 || res.code === 0;
+      if (ok && res.data) {
+        pagination.total = res.data.total ?? 0;
+        dataList.value = (res.data.records ?? []).map(normalizeTableRow);
+      } else {
+        ElMessage.error(res.msg || "鏌ヨ澶辫触");
+        dataList.value = [];
+        pagination.total = 0;
+      }
+    })
+    .catch(() => {
+      dataList.value = [];
+      pagination.total = 0;
+    })
+    .finally(() => {
+      tableLoading.value = false;
+    });
 };
 
 const resetFilters = () => {
   filters.applyCode = "";
   filters.customerId = "";
   filters.status = "";
+  filters.dateRange = [];
   pagination.currentPage = 1;
   getTableData();
 };
@@ -250,57 +694,140 @@
   selectedRows.value = selection;
 };
 
+const fillFormFromRow = (row) => {
+  const outboundBatchNos = Array.isArray(row.outboundBatchNos)
+    ? row.outboundBatchNos
+    : parseStockOutRecordIds(row.stockOutRecordIds ?? row.stockOutRecordId);
+  Object.assign(form, {
+    ...row,
+    applyCode: row.applyCode ?? row.invoiceApplicationNo ?? "",
+    amount: Number(row.amount ?? row.invoiceAmount ?? 0),
+    content: row.content ?? row.invoiceContent,
+    status: normalizeStatus(row.status ?? row.auditStatus),
+    outboundBatchNos,
+    outboundBatches: formatOutboundBatches(row.outboundBatches),
+  });
+};
+
 const add = () => {
   isEdit.value = false;
+  isView.value = false;
   dialogTitle.value = "鏂板寮�绁ㄧ敵璇�";
   Object.assign(form, {
     applyCode: "KP" + Date.now().toString().slice(-8),
     customerId: "",
+    outboundBatchNos: [],
+    outboundBatches: "",
     amount: 0,
     taxRate: 13,
-    invoiceType: "special",
-    applyDate: new Date().toISOString().split('T')[0],
+    invoiceType: "澧炲�肩◣涓撶敤鍙戠エ",
+    applyDate: new Date().toISOString().split("T")[0],
     content: "",
     remark: "",
   });
+  outboundBatchList.value = [];
+  outboundBatchOptions.value = [];
   dialogVisible.value = true;
+};
+
+const parseStockOutRecordIds = (value) => {
+  if (!value) return [];
+  if (Array.isArray(value)) return value;
+  return String(value)
+    .split(/[,锛宂/)
+    .map((s) => s.trim())
+    .filter(Boolean)
+    .map((s) => (/^\d+$/.test(s) ? Number(s) : s));
+};
+
+const buildSubmitPayload = (forUpdate = false) => {
+  const payload = {
+    customerId: form.customerId,
+    stockOutRecordIds: (form.outboundBatchNos || []).join(","),
+    invoiceApplicationNo: form.applyCode || "",
+    invoiceType: form.invoiceType,
+    applyDate: form.applyDate,
+    invoiceContent: form.content,
+    remark: form.remark || "",
+    invoiceAmount: form.amount,
+    taxRate: form.taxRate,
+    status: 0,
+  };
+  if (forUpdate) {
+    payload.id = currentId.value;
+  }
+  return payload;
 };
 
 const edit = (row) => {
   isEdit.value = true;
+  isView.value = false;
   currentId.value = row.id;
   dialogTitle.value = "缂栬緫寮�绁ㄧ敵璇�";
-  Object.assign(form, row);
+  fillFormFromRow(row);
   dialogVisible.value = true;
+  loadOutboundBatches(form.customerId, true);
 };
 
 const view = (row) => {
-  ElMessage.info(`鏌ョ湅鐢宠鍗�: ${row.applyCode}`);
+  isView.value = true;
+  isEdit.value = false;
+  dialogTitle.value = "鏌ョ湅寮�绁ㄧ敵璇�";
+  fillFormFromRow(row);
+  dialogVisible.value = true;
+};
+
+const submitAudit = (row, status) => {
+  auditAccountInvoiceApplication({ id: row.id, status })
+    .then((res) => {
+      if (res.code === 200) {
+        ElMessage.success(status === 1 ? "瀹℃牳閫氳繃" : "瀹℃牳涓嶉�氳繃");
+        getTableData();
+      } else {
+        ElMessage.error(res.msg || "瀹℃壒澶辫触");
+      }
+    })
+    .catch(() => {
+      ElMessage.error("瀹℃壒澶辫触");
+    });
+};
+
+const handleDelete = (row) => {
+  ElMessageBox.confirm(`纭鍒犻櫎鐢宠鍗曘��${row.applyCode ?? row.invoiceApplicationNo}銆嶅悧锛焋, "鎻愮ず", {
+    confirmButtonText: "纭畾",
+    cancelButtonText: "鍙栨秷",
+    type: "warning",
+  }).then(() => {
+    deleteAccountInvoiceApplication([row.id])
+      .then((res) => {
+        if (res.code === 200) {
+          ElMessage.success("鍒犻櫎鎴愬姛");
+          getTableData();
+        } else {
+          ElMessage.error(res.msg || "鍒犻櫎澶辫触");
+        }
+      })
+      .catch(() => {
+        ElMessage.error("鍒犻櫎澶辫触");
+      });
+  });
 };
 
 const handleAudit = (row) => {
-  ElMessageBox.confirm("纭瀹℃牳閫氳繃璇ュ紑绁ㄧ敵璇峰悧锛�", "鎻愮ず", {
-    confirmButtonText: "閫氳繃",
-    cancelButtonText: "椹冲洖",
+  ElMessageBox.confirm("璇烽�夋嫨瀹℃壒缁撴灉", "寮�绁ㄧ敵璇峰鏍�", {
+    confirmButtonText: "瀹℃牳閫氳繃",
+    cancelButtonText: "瀹℃牳涓嶉�氳繃",
     distinguishCancelAndClose: true,
     type: "warning",
-  }).then(() => {
-    const index = mockData.findIndex(item => item.id === row.id);
-    if (index !== -1) {
-      mockData[index].status = "approved";
-    }
-    ElMessage.success("瀹℃牳閫氳繃");
-    getTableData();
-  }).catch((action) => {
-    if (action === "cancel") {
-      const index = mockData.findIndex(item => item.id === row.id);
-      if (index !== -1) {
-        mockData[index].status = "rejected";
+  })
+    .then(() => {
+      submitAudit(row, 1);
+    })
+    .catch((action) => {
+      if (action === "cancel") {
+        submitAudit(row, 2);
       }
-      ElMessage.warning("宸查┏鍥�");
-      getTableData();
-    }
-  });
+    });
 };
 
 const handleInvoice = (row) => {
@@ -309,10 +836,6 @@
     cancelButtonText: "鍙栨秷",
     type: "info",
   }).then(() => {
-    const index = mockData.findIndex(item => item.id === row.id);
-    if (index !== -1) {
-      mockData[index].status = "invoiced";
-    }
     ElMessage.success("寮�绁ㄥ畬鎴�");
     getTableData();
   });
@@ -322,29 +845,39 @@
   ElMessage.success(`鎵归噺鐢宠 ${selectedRows.value.length} 鏉¤褰昤);
 };
 
+const submitLoading = ref(false);
+
 const submitForm = () => {
   formRef.value.validate((valid) => {
-    if (valid) {
-      const customer = customerList.find(item => item.id === form.customerId);
-      const invoiceTypeMap = { special: "澧炲�肩◣涓撶敤鍙戠エ", normal: "澧炲�肩◣鏅�氬彂绁�", electronic: "鐢靛瓙鍙戠エ" };
-      if (isEdit.value) {
-        const index = mockData.findIndex(item => item.id === currentId.value);
-        if (index !== -1) {
-          mockData[index] = { ...mockData[index], ...form, customerName: customer?.name, invoiceTypeLabel: invoiceTypeMap[form.invoiceType] };
+    if (!valid) return;
+    if (!checkTaxRateConsistency()) return;
+
+    submitLoading.value = true;
+    const request = isEdit.value
+      ? updateAccountInvoiceApplication(buildSubmitPayload(true))
+      : addAccountInvoiceApplication(buildSubmitPayload());
+
+    request
+      .then((res) => {
+        if (res.code === 200) {
+          ElMessage.success(isEdit.value ? "淇敼鎴愬姛" : "鏂板鎴愬姛");
+          closeDialog();
+          getTableData();
+        } else {
+          ElMessage.error(res.msg || (isEdit.value ? "淇敼澶辫触" : "鏂板澶辫触"));
         }
-        ElMessage.success("缂栬緫鎴愬姛");
-      } else {
-        const newId = mockData.length > 0 ? Math.max(...mockData.map(item => item.id)) + 1 : 1;
-        mockData.push({ id: newId, ...form, customerName: customer?.name, invoiceTypeLabel: invoiceTypeMap[form.invoiceType], status: "pending" });
-        ElMessage.success("鏂板鎴愬姛");
-      }
-      dialogVisible.value = false;
-      getTableData();
-    }
+      })
+      .catch(() => {
+        ElMessage.error(isEdit.value ? "淇敼澶辫触" : "鏂板澶辫触");
+      })
+      .finally(() => {
+        submitLoading.value = false;
+      });
   });
 };
 
 onMounted(() => {
+  getCustomerList();
   getTableData();
 });
 </script>
@@ -360,4 +893,10 @@
   color: #409eff;
   font-weight: bold;
 }
+
+.outbound-batch-input:not(.is-disabled) {
+  :deep(.el-input__wrapper) {
+    cursor: pointer;
+  }
+}
 </style>
diff --git a/src/views/financialManagement/receivable/outputInvoice.vue b/src/views/financialManagement/receivable/outputInvoice.vue
index 3e597db..d746aea 100644
--- a/src/views/financialManagement/receivable/outputInvoice.vue
+++ b/src/views/financialManagement/receivable/outputInvoice.vue
@@ -1,19 +1,35 @@
 <template>
   <div class="app-container">
     <el-form :model="filters" :inline="true">
-      <el-form-item label="鍙戠エ浠g爜:">
-        <el-input v-model="filters.invoiceCode" placeholder="璇疯緭鍏ュ彂绁ㄤ唬鐮�" clearable style="width: 200px;" />
-      </el-form-item>
       <el-form-item label="鍙戠エ鍙风爜:">
-        <el-input v-model="filters.invoiceNo" placeholder="璇疯緭鍏ュ彂绁ㄥ彿鐮�" clearable style="width: 200px;" />
+        <el-input v-model="filters.invoiceNumber" placeholder="璇疯緭鍏ュ彂绁ㄥ彿鐮�" clearable style="width: 200px;" />
       </el-form-item>
       <el-form-item label="瀹㈡埛:">
         <el-select v-model="filters.customerId" placeholder="璇烽�夋嫨瀹㈡埛" clearable style="width: 200px;">
-          <el-option v-for="item in customerList" :key="item.id" :label="item.name" :value="item.id" />
+          <el-option v-for="item in customerList" :key="item.id" :label="item.customerName" :value="item.id" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="寮�绁ㄦ棩鏈�:">
+        <el-date-picker
+          v-model="filters.dateRange"
+          type="daterange"
+          value-format="YYYY-MM-DD"
+          format="YYYY-MM-DD"
+          range-separator="鑷�"
+          start-placeholder="寮�濮嬫棩鏈�"
+          end-placeholder="缁撴潫鏃ユ湡"
+          clearable
+          style="width: 240px;"
+        />
+      </el-form-item>
+      <el-form-item label="鐘舵��:">
+        <el-select v-model="filters.status" placeholder="璇烽�夋嫨鐘舵��" clearable style="width: 150px;">
+          <el-option label="姝e父" :value="0" />
+          <el-option label="浣滃簾" :value="1" />
         </el-select>
       </el-form-item>
       <el-form-item>
-        <el-button type="primary" @click="getTableData">鎼滅储</el-button>
+        <el-button type="primary" @click="onSearch">鎼滅储</el-button>
         <el-button @click="resetFilters">閲嶇疆</el-button>
       </el-form-item>
     </el-form>
@@ -21,13 +37,13 @@
       <div class="actions">
         <div></div>
         <div>
-          <el-button type="primary" @click="add" icon="Plus">褰曞叆鍙戠エ</el-button>
-          <el-button @click="handleImport" icon="Upload">瀵煎叆</el-button>
-          <el-button @click="handleOut" icon="Download">瀵煎嚭</el-button>
+          <!-- <el-button type="primary" @click="add" icon="Plus">褰曞叆鍙戠エ</el-button> -->
+          <el-button type="success" @click="handleExport" icon="Download">瀵煎嚭</el-button>
         </div>
       </div>
       <PIMTable
         rowKey="id"
+        v-loading="tableLoading"
         :column="columns"
         :tableData="dataList"
         :page="{
@@ -46,58 +62,98 @@
         <template #totalAmount="{ row }">
           <span class="text-success">楼{{ formatMoney(row.totalAmount) }}</span>
         </template>
-        <template #invoiceType="{ row }">
-          <el-tag :type="row.invoiceType === 'special' ? 'danger' : 'primary'">{{ row.invoiceTypeLabel }}</el-tag>
+        <template #status="{ row }">
+          <el-tag :type="getStatusType(row.status)" effect="light" round>
+            {{ getStatusLabel(row.status) }}
+          </el-tag>
         </template>
         <template #operation="{ row }">
           <el-button type="primary" link @click="view(row)">鏌ョ湅</el-button>
-          <el-button type="primary" link @click="edit(row)">缂栬緫</el-button>
-          <el-button type="danger" link @click="handleDelete(row)">浣滃簾</el-button>
+          <el-button
+            type="primary"
+            link
+            @click="openFileDialog(row)"
+            v-if="row.accountInvoiceApplicationId"
+          >
+            闄勪欢
+          </el-button>
+          <el-button type="warning" link @click="handleCancel(row)" v-if="isNormalStatus(row.status)">浣滃簾</el-button>
+          <el-button type="danger" link @click="handleDelete(row)">鍒犻櫎</el-button>
         </template>
       </PIMTable>
     </div>
 
-    <FormDialog :title="dialogTitle" v-model="dialogVisible" width="800px" @confirm="submitForm" @cancel="dialogVisible = false">
+    <FormDialog
+      :title="dialogTitle"
+      v-model="dialogVisible"
+      width="800px"
+      :operation-type="isView ? 'detail' : ''"
+      @confirm="submitForm"
+      @cancel="closeDialog"
+    >
       <el-form :model="form" :rules="rules" ref="formRef" label-width="120px">
-        <el-row :gutter="20">
+        <el-row v-if="isView" :gutter="20">
           <el-col :span="12">
-            <el-form-item label="鍙戠エ浠g爜" prop="invoiceCode">
-              <el-input v-model="form.invoiceCode" placeholder="璇疯緭鍏ュ彂绁ㄤ唬鐮�" />
+            <el-form-item label="鐘舵��">
+              <el-tag :type="getStatusType(form.status)" effect="light" round>
+                {{ getStatusLabel(form.status) }}
+              </el-tag>
             </el-form-item>
           </el-col>
+        </el-row>
+        <el-row :gutter="20">
           <el-col :span="12">
             <el-form-item label="鍙戠エ鍙风爜" prop="invoiceNo">
-              <el-input v-model="form.invoiceNo" placeholder="璇疯緭鍏ュ彂绁ㄥ彿鐮�" />
+              <el-input v-model="form.invoiceNo" placeholder="璇疯緭鍏ュ彂绁ㄥ彿鐮�" :disabled="isView" />
             </el-form-item>
           </el-col>
-        </el-row>
-        <el-row :gutter="20">
           <el-col :span="12">
             <el-form-item label="瀹㈡埛" prop="customerId">
-              <el-select v-model="form.customerId" placeholder="璇烽�夋嫨瀹㈡埛" style="width: 100%;">
-                <el-option v-for="item in customerList" :key="item.id" :label="item.name" :value="item.id" />
+              <el-select v-model="form.customerId" placeholder="璇烽�夋嫨瀹㈡埛" style="width: 100%;" :disabled="isView">
+                <el-option v-for="item in customerList" :key="item.id" :label="item.customerName" :value="item.id" />
               </el-select>
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="寮�绁ㄦ棩鏈�" prop="invoiceDate">
-              <el-date-picker v-model="form.invoiceDate" type="date" placeholder="閫夋嫨鏃ユ湡" value-format="YYYY-MM-DD" style="width: 100%;" />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="20">
           <el-col :span="12">
-            <el-form-item label="鍙戠エ绫诲瀷" prop="invoiceType">
-              <el-select v-model="form.invoiceType" placeholder="璇烽�夋嫨鍙戠エ绫诲瀷" style="width: 100%;" @change="handleInvoiceTypeChange">
-                <el-option label="澧炲�肩◣涓撶敤鍙戠エ" value="special" />
-                <el-option label="澧炲�肩◣鏅�氬彂绁�" value="normal" />
-                <el-option label="鐢靛瓙鍙戠エ" value="electronic" />
-              </el-select>
+            <el-form-item label="寮�绁ㄦ棩鏈�" prop="invoiceDate">
+              <el-date-picker
+                v-model="form.invoiceDate"
+                type="date"
+                placeholder="閫夋嫨鏃ユ湡"
+                value-format="YYYY-MM-DD"
+                style="width: 100%;"
+                :disabled="isView"
+              />
             </el-form-item>
           </el-col>
           <el-col :span="12">
+            <el-form-item label="鍙戠エ绫诲瀷" prop="invoiceType">
+              <el-select
+                v-model="form.invoiceType"
+                placeholder="璇烽�夋嫨鍙戠エ绫诲瀷"
+                style="width: 100%;"
+                :disabled="isView"
+                @change="handleInvoiceTypeChange"
+              >
+                <el-option label="澧炲�肩◣涓撶敤鍙戠エ" value="澧炲�肩◣涓撶敤鍙戠エ" />
+                <el-option label="澧炲�肩◣鏅�氬彂绁�" value="澧炲�肩◣鏅�氬彂绁�" />
+                <el-option label="鐢靛瓙鍙戠エ" value="鐢靛瓙鍙戠エ" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="12">
             <el-form-item label="绋庣巼" prop="taxRate">
-              <el-select v-model="form.taxRate" placeholder="璇烽�夋嫨绋庣巼" style="width: 100%;" @change="calculateTax">
+              <el-select
+                v-model="form.taxRate"
+                placeholder="璇烽�夋嫨绋庣巼"
+                style="width: 100%;"
+                :disabled="isView"
+                @change="calculateTax"
+              >
                 <el-option
                   v-for="dict in tax_rate"
                   :key="dict.value"
@@ -111,7 +167,14 @@
         <el-row :gutter="20">
           <el-col :span="8">
             <el-form-item label="閲戦(涓嶅惈绋�)" prop="amount">
-              <el-input-number v-model="form.amount" :min="0" :precision="2" style="width: 100%;" @change="calculateTax" />
+              <el-input-number
+                v-model="form.amount"
+                :min="0"
+                :precision="2"
+                style="width: 100%;"
+                :disabled="isView"
+                @change="calculateTax"
+              />
             </el-form-item>
           </el-col>
           <el-col :span="8">
@@ -126,24 +189,41 @@
           </el-col>
         </el-row>
         <el-form-item label="鍙戠エ鍐呭" prop="content">
-          <el-input v-model="form.content" type="textarea" :rows="3" placeholder="璇疯緭鍏ュ彂绁ㄥ唴瀹�" />
+          <el-input v-model="form.content" type="textarea" :rows="3" placeholder="璇疯緭鍏ュ彂绁ㄥ唴瀹�" :disabled="isView" />
         </el-form-item>
         <el-form-item label="澶囨敞" prop="remark">
-          <el-input v-model="form.remark" type="textarea" :rows="2" placeholder="璇疯緭鍏ュ娉�" />
+          <el-input v-model="form.remark" type="textarea" :rows="2" placeholder="璇疯緭鍏ュ娉�" :disabled="isView" />
         </el-form-item>
       </el-form>
-      <template #footer>
-        <el-button type="primary" @click="submitForm">纭畾</el-button>
-        <el-button @click="dialogVisible = false">鍙栨秷</el-button>
+      <template v-if="!isView" #footer>
+        <el-button type="primary" :loading="submitLoading" @click="submitForm">纭畾</el-button>
+        <el-button @click="closeDialog">鍙栨秷</el-button>
       </template>
     </FormDialog>
+
+    <FileList
+      v-if="fileDialogVisible"
+      v-model:visible="fileDialogVisible"
+      record-type="account_invoice_application"
+      :record-id="currentRecordId"
+      :editable="false"
+    />
   </div>
 </template>
 
 <script setup>
-import { ref, reactive, onMounted, computed, getCurrentInstance } from "vue";
+import { ref, reactive, onMounted, getCurrentInstance, defineAsyncComponent } from "vue";
 import { ElMessage, ElMessageBox } from "element-plus";
 import FormDialog from "@/components/Dialog/FormDialog.vue";
+import { listCustomer } from "@/api/basicData/customer.js";
+import {
+  addAccountSalesInvoice,
+  listPageAccountSalesInvoice,
+  cancelAccountSalesInvoice,
+  deleteAccountSalesInvoice,
+} from "@/api/financialManagement/accountSalesInvoice.js";
+
+const FileList = defineAsyncComponent(() => import("@/components/Dialog/FileList.vue"));
 
 defineOptions({
   name: "閿�椤瑰彂绁�",
@@ -153,9 +233,10 @@
 const { tax_rate } = proxy.useDict("tax_rate");
 
 const filters = reactive({
-  invoiceCode: "",
-  invoiceNo: "",
+  invoiceNumber: "",
   customerId: "",
+  dateRange: [],
+  status: "",
 });
 
 const pagination = reactive({
@@ -165,47 +246,76 @@
 });
 
 const columns = [
-  { label: "鍙戠エ浠g爜", prop: "invoiceCode", width: "130" },
-  { label: "鍙戠エ鍙风爜", prop: "invoiceNo", width: "120" },
+  { label: "鍙戠エ鍙风爜", prop: "invoiceNo", width: "140" },
   { label: "瀹㈡埛鍚嶇О", prop: "customerName", width: "180" },
   { label: "寮�绁ㄦ棩鏈�", prop: "invoiceDate", width: "120" },
-  { label: "閲戦", prop: "amount", slot: "amount" },
-  { label: "绋庨", prop: "taxAmount", slot: "taxAmount" },
-  { label: "浠风◣鍚堣", prop: "totalAmount", slot: "totalAmount" },
-  { label: "鍙戠エ绫诲瀷", prop: "invoiceType", slot: "invoiceType" },
-  { label: "鎿嶄綔", prop: "operation", slot: "operation", width: "180", fixed: "right" },
+  { label: "閲戦", prop: "amount", dataType: "slot", slot: "amount" },
+  { label: "绋庨", prop: "taxAmount", dataType: "slot", slot: "taxAmount" },
+  { label: "浠风◣鍚堣", prop: "totalAmount", dataType: "slot", slot: "totalAmount" },
+  { label: "鍙戠エ绫诲瀷", prop: "invoiceType", width: "130" },
+  { label: "鐘舵��", prop: "status", dataType: "slot", slot: "status", width: "90", align: "center" },
+  { label: "鎿嶄綔", prop: "operation", dataType: "slot", slot: "operation", width: "260", fixed: "right" },
 ];
 
 const dataList = ref([]);
+const tableLoading = ref(false);
 const dialogVisible = ref(false);
 const dialogTitle = ref("");
 const formRef = ref(null);
-const isEdit = ref(false);
-const currentId = ref(null);
+const isView = ref(false);
+const submitLoading = ref(false);
 
-const customerList = [
-  { id: 1, name: "鍖椾含绉戞妧鏈夐檺鍏徃" },
-  { id: 2, name: "涓婃捣璐告槗鍏徃" },
-  { id: 3, name: "骞垮窞瀹炰笟鏈夐檺鍏徃" },
-  { id: 4, name: "娣卞湷鐢靛瓙鍏徃" },
-];
+const customerList = ref([]);
+const fileDialogVisible = ref(false);
+const currentRecordId = ref(0);
+
+const openFileDialog = (row) => {
+  if (!row.accountInvoiceApplicationId) {
+    ElMessage.warning("鏈叧鑱斿紑绁ㄧ敵璇凤紝鏃犳硶鏌ョ湅闄勪欢");
+    return;
+  }
+  currentRecordId.value = row.accountInvoiceApplicationId;
+  fileDialogVisible.value = true;
+};
+
+/** 鐘舵�侊細0姝e父 1浣滃簾 */
+const STATUS_LABEL_MAP = { 0: "姝e父", 1: "浣滃簾" };
+const STATUS_TYPE_MAP = { 0: "success", 1: "info" };
+
+const normalizeStatus = (status) => {
+  if (status === undefined || status === null || status === "") return 0;
+  const num = Number(status);
+  return Number.isNaN(num) ? 0 : num;
+};
+
+const isNormalStatus = (status) => normalizeStatus(status) === 0;
+
+const getStatusLabel = (status) => {
+  const num = normalizeStatus(status);
+  return STATUS_LABEL_MAP[num] ?? "姝e父";
+};
+
+const getStatusType = (status) => {
+  const num = normalizeStatus(status);
+  return STATUS_TYPE_MAP[num] ?? "success";
+};
 
 const form = reactive({
-  invoiceCode: "",
   invoiceNo: "",
   customerId: "",
   invoiceDate: "",
-  invoiceType: "special",
+  invoiceType: "澧炲�肩◣涓撶敤鍙戠エ",
   taxRate: 13,
   amount: 0,
   taxAmount: 0,
   totalAmount: 0,
   content: "",
   remark: "",
+  accountInvoiceApplicationId: undefined,
+  storageAttachmentId: undefined,
 });
 
 const rules = {
-  invoiceCode: [{ required: true, message: "璇疯緭鍏ュ彂绁ㄤ唬鐮�", trigger: "blur" }],
   invoiceNo: [{ required: true, message: "璇疯緭鍏ュ彂绁ㄥ彿鐮�", trigger: "blur" }],
   customerId: [{ required: true, message: "璇烽�夋嫨瀹㈡埛", trigger: "change" }],
   invoiceDate: [{ required: true, message: "璇烽�夋嫨寮�绁ㄦ棩鏈�", trigger: "change" }],
@@ -213,12 +323,6 @@
   taxRate: [{ required: true, message: "璇烽�夋嫨绋庣巼", trigger: "change" }],
   amount: [{ required: true, message: "璇疯緭鍏ラ噾棰�", trigger: "blur" }],
 };
-
-const mockData = [
-  { id: 1, invoiceCode: "0440021001", invoiceNo: "12345678", customerId: 1, customerName: "鍖椾含绉戞妧鏈夐檺鍏徃", invoiceDate: "2024-01-15", amount: 5000, taxRate: 13, taxAmount: 650, totalAmount: 5650, invoiceType: "special", invoiceTypeLabel: "澧炲�肩◣涓撶敤鍙戠エ", content: "杞欢鏈嶅姟璐�", remark: "" },
-  { id: 2, invoiceCode: "0440021002", invoiceNo: "87654321", customerId: 2, customerName: "涓婃捣璐告槗鍏徃", invoiceDate: "2024-01-16", amount: 8000, taxRate: 13, taxAmount: 1040, totalAmount: 9040, invoiceType: "normal", invoiceTypeLabel: "澧炲�肩◣鏅�氬彂绁�", content: "鍟嗗搧閿�鍞�", remark: "" },
-  { id: 3, invoiceCode: "0440021003", invoiceNo: "11112222", customerId: 3, customerName: "骞垮窞瀹炰笟鏈夐檺鍏徃", invoiceDate: "2024-01-18", amount: 12000, taxRate: 6, taxAmount: 720, totalAmount: 12720, invoiceType: "electronic", invoiceTypeLabel: "鐢靛瓙鍙戠エ", content: "鎶�鏈湇鍔¤垂", remark: "" },
-];
 
 const formatMoney = (value) => {
   if (value === undefined || value === null) return "0.00";
@@ -231,33 +335,142 @@
 };
 
 const handleInvoiceTypeChange = () => {
-  if (form.invoiceType === "special") {
-    form.taxRate = 13;
-  } else {
-    form.taxRate = 13;
-  }
   calculateTax();
 };
 
-const getTableData = () => {
-  let result = [...mockData];
-  if (filters.invoiceCode) {
-    result = result.filter(item => item.invoiceCode.includes(filters.invoiceCode));
-  }
-  if (filters.invoiceNo) {
-    result = result.filter(item => item.invoiceNo.includes(filters.invoiceNo));
+const normalizeTableRow = (row) => ({
+  ...row,
+  invoiceNo: row.invoiceNumber ?? row.invoiceNo,
+  invoiceDate: row.issueDate ?? row.invoiceDate,
+  amount: row.taxExclusivelPrice ?? row.amount,
+  taxAmount: row.taxPrice ?? row.taxAmount,
+  totalAmount: row.taxInclusivePrice ?? row.totalAmount,
+  content: row.invoiceContent ?? row.content,
+  status: normalizeStatus(row.status),
+});
+
+const fillFormFromRow = (row) => {
+  Object.assign(form, {
+    invoiceNo: row.invoiceNo ?? row.invoiceNumber ?? "",
+    customerId: row.customerId,
+    invoiceDate: row.invoiceDate ?? row.issueDate ?? "",
+    invoiceType: row.invoiceType ?? "澧炲�肩◣涓撶敤鍙戠エ",
+    taxRate: row.taxRate ?? 13,
+    amount: row.amount ?? row.taxExclusivelPrice ?? 0,
+    taxAmount: row.taxAmount ?? row.taxPrice ?? 0,
+    totalAmount: row.totalAmount ?? row.taxInclusivePrice ?? 0,
+    content: row.content ?? row.invoiceContent ?? "",
+    remark: row.remark ?? "",
+    accountInvoiceApplicationId: row.accountInvoiceApplicationId,
+    storageAttachmentId: row.storageAttachmentId,
+    status: normalizeStatus(row.status),
+  });
+};
+
+const buildCancelPayload = (row) => ({
+  id: row.id,
+  accountInvoiceApplicationId: row.accountInvoiceApplicationId,
+  invoiceNumber: row.invoiceNumber ?? row.invoiceNo,
+  taxRate: row.taxRate,
+  invoiceType: row.invoiceType,
+  issueDate: row.issueDate ?? row.invoiceDate,
+  taxExclusivelPrice: row.taxExclusivelPrice ?? row.amount,
+  taxPrice: row.taxPrice ?? row.taxAmount,
+  taxInclusivePrice: row.taxInclusivePrice ?? row.totalAmount,
+  remark: row.remark ?? "",
+  invoiceContent: row.invoiceContent ?? row.content,
+  customerId: row.customerId,
+  storageAttachmentId: row.storageAttachmentId,
+  status: 1,
+});
+
+const buildSubmitPayload = () => ({
+  invoiceNumber: form.invoiceNo,
+  customerId: form.customerId,
+  issueDate: form.invoiceDate,
+  invoiceType: form.invoiceType,
+  taxRate: form.taxRate,
+  taxExclusivelPrice: form.amount,
+  taxPrice: form.taxAmount,
+  taxInclusivePrice: form.totalAmount,
+  invoiceContent: form.content,
+  remark: form.remark || "",
+  accountInvoiceApplicationId: form.accountInvoiceApplicationId,
+  storageAttachmentId: form.storageAttachmentId,
+});
+
+const getCustomerList = () => {
+  listCustomer({ current: -1, size: -1, type: 0 }).then((res) => {
+    if (res.code === 200) {
+      customerList.value = res.data?.records || [];
+    }
+  });
+};
+
+const appendFilterParams = (params) => {
+  if (filters.invoiceNumber) {
+    params.invoiceNumber = filters.invoiceNumber;
   }
   if (filters.customerId) {
-    result = result.filter(item => item.customerId === filters.customerId);
+    params.customerId = filters.customerId;
   }
-  pagination.total = result.length;
-  dataList.value = result.slice((pagination.currentPage - 1) * pagination.pageSize, pagination.currentPage * pagination.pageSize);
+  if (filters.dateRange?.length === 2) {
+    params.startDate = filters.dateRange[0];
+    params.endDate = filters.dateRange[1];
+  }
+  if (filters.status !== "" && filters.status != null) {
+    params.status = filters.status;
+  }
+  return params;
+};
+
+const buildListParams = () =>
+  appendFilterParams({
+    current: pagination.currentPage,
+    size: pagination.pageSize,
+  });
+
+const buildExportParams = () => appendFilterParams({});
+
+const handleExport = () => {
+  const params = buildExportParams();
+  proxy.download("/accountSalesInvoice/exportAccountSalesInvoice", params, `閿�椤瑰彂绁╛${Date.now()}.xlsx`);
+};
+
+const getTableData = () => {
+  tableLoading.value = true;
+  listPageAccountSalesInvoice(buildListParams())
+    .then((res) => {
+      if (res.code === 200) {
+        const records = res.data?.records ?? [];
+        dataList.value = records.map(normalizeTableRow);
+        pagination.total = res.data?.total ?? 0;
+      } else {
+        dataList.value = [];
+        pagination.total = 0;
+        ElMessage.error(res.msg || "鏌ヨ澶辫触");
+      }
+    })
+    .catch(() => {
+      dataList.value = [];
+      pagination.total = 0;
+      ElMessage.error("鏌ヨ澶辫触");
+    })
+    .finally(() => {
+      tableLoading.value = false;
+    });
+};
+
+const onSearch = () => {
+  pagination.currentPage = 1;
+  getTableData();
 };
 
 const resetFilters = () => {
-  filters.invoiceCode = "";
-  filters.invoiceNo = "";
+  filters.invoiceNumber = "";
   filters.customerId = "";
+  filters.dateRange = [];
+  filters.status = "";
   pagination.currentPage = 1;
   getTableData();
 };
@@ -268,83 +481,105 @@
   getTableData();
 };
 
+const closeDialog = () => {
+  dialogVisible.value = false;
+  isView.value = false;
+};
+
 const add = () => {
-  isEdit.value = false;
+  isView.value = false;
   dialogTitle.value = "褰曞叆鍙戠エ";
   Object.assign(form, {
-    invoiceCode: "",
     invoiceNo: "",
     customerId: "",
-    invoiceDate: new Date().toISOString().split('T')[0],
-    invoiceType: "special",
+    invoiceDate: new Date().toISOString().split("T")[0],
+    invoiceType: "澧炲�肩◣涓撶敤鍙戠エ",
     taxRate: 13,
     amount: 0,
     taxAmount: 0,
     totalAmount: 0,
     content: "",
     remark: "",
+    accountInvoiceApplicationId: undefined,
+    storageAttachmentId: undefined,
   });
-  dialogVisible.value = true;
-};
-
-const edit = (row) => {
-  isEdit.value = true;
-  currentId.value = row.id;
-  dialogTitle.value = "缂栬緫鍙戠エ";
-  Object.assign(form, row);
   dialogVisible.value = true;
 };
 
 const view = (row) => {
-  ElMessage.info(`鏌ョ湅鍙戠エ: ${row.invoiceCode}-${row.invoiceNo}`);
+  isView.value = true;
+  dialogTitle.value = "鏌ョ湅鍙戠エ";
+  fillFormFromRow(row);
+  dialogVisible.value = true;
 };
 
-const handleDelete = (row) => {
-  ElMessageBox.confirm("纭浣滃簾璇ュ彂绁ㄥ悧锛�", "鎻愮ず", {
+const handleCancel = (row) => {
+  ElMessageBox.confirm(`纭浣滃簾鍙戠エ銆�${row.invoiceNo ?? row.invoiceNumber}銆嶅悧锛焋, "浣滃簾纭", {
     confirmButtonText: "纭畾",
     cancelButtonText: "鍙栨秷",
     type: "warning",
   }).then(() => {
-    const index = mockData.findIndex(item => item.id === row.id);
-    if (index !== -1) {
-      mockData.splice(index, 1);
-    }
-    ElMessage.success("浣滃簾鎴愬姛");
-    getTableData();
+    cancelAccountSalesInvoice(buildCancelPayload(row))
+      .then((res) => {
+        if (res.code === 200) {
+          ElMessage.success("浣滃簾鎴愬姛");
+          getTableData();
+        } else {
+          ElMessage.error(res.msg || "浣滃簾澶辫触");
+        }
+      })
+      .catch(() => {
+        ElMessage.error("浣滃簾澶辫触");
+      });
   });
 };
 
-const handleImport = () => {
-  ElMessage.info("瀵煎叆鍔熻兘");
-};
-
-const handleOut = () => {
-  ElMessage.success("瀵煎嚭鎴愬姛");
+const handleDelete = (row) => {
+  ElMessageBox.confirm(`纭鍒犻櫎鍙戠エ銆�${row.invoiceNo ?? row.invoiceNumber}銆嶅悧锛熷垹闄ゅ悗涓嶅彲鎭㈠銆俙, "鍒犻櫎纭", {
+    confirmButtonText: "纭畾",
+    cancelButtonText: "鍙栨秷",
+    type: "warning",
+  }).then(() => {
+    deleteAccountSalesInvoice([row.id])
+      .then((res) => {
+        if (res.code === 200) {
+          ElMessage.success("鍒犻櫎鎴愬姛");
+          getTableData();
+        } else {
+          ElMessage.error(res.msg || "鍒犻櫎澶辫触");
+        }
+      })
+      .catch(() => {
+        ElMessage.error("鍒犻櫎澶辫触");
+      });
+  });
 };
 
 const submitForm = () => {
   formRef.value.validate((valid) => {
-    if (valid) {
-      const customer = customerList.find(item => item.id === form.customerId);
-      const invoiceTypeMap = { special: "澧炲�肩◣涓撶敤鍙戠エ", normal: "澧炲�肩◣鏅�氬彂绁�", electronic: "鐢靛瓙鍙戠エ" };
-      if (isEdit.value) {
-        const index = mockData.findIndex(item => item.id === currentId.value);
-        if (index !== -1) {
-          mockData[index] = { ...mockData[index], ...form, customerName: customer?.name, invoiceTypeLabel: invoiceTypeMap[form.invoiceType] };
+    if (!valid) return;
+    submitLoading.value = true;
+    addAccountSalesInvoice(buildSubmitPayload())
+      .then((res) => {
+        if (res.code === 200) {
+          ElMessage.success("褰曞叆鎴愬姛");
+          closeDialog();
+          getTableData();
+        } else {
+          ElMessage.error(res.msg || "褰曞叆澶辫触");
         }
-        ElMessage.success("缂栬緫鎴愬姛");
-      } else {
-        const newId = mockData.length > 0 ? Math.max(...mockData.map(item => item.id)) + 1 : 1;
-        mockData.push({ id: newId, ...form, customerName: customer?.name, invoiceTypeLabel: invoiceTypeMap[form.invoiceType] });
-        ElMessage.success("褰曞叆鎴愬姛");
-      }
-      dialogVisible.value = false;
-      getTableData();
-    }
+      })
+      .catch(() => {
+        ElMessage.error("褰曞叆澶辫触");
+      })
+      .finally(() => {
+        submitLoading.value = false;
+      });
   });
 };
 
 onMounted(() => {
+  getCustomerList();
   getTableData();
 });
 </script>
diff --git a/src/views/financialManagement/receivable/receipt.vue b/src/views/financialManagement/receivable/receipt.vue
index 2bbbb96..6ddb3fe 100644
--- a/src/views/financialManagement/receivable/receipt.vue
+++ b/src/views/financialManagement/receivable/receipt.vue
@@ -1,356 +1,855 @@
 <template>
   <div class="app-container">
-    <el-form :model="filters" :inline="true">
+    <el-form :model="filters"
+             :inline="true">
       <el-form-item label="鏀舵鍗曞彿:">
-        <el-input v-model="filters.receiptCode" placeholder="璇疯緭鍏ユ敹娆惧崟鍙�" clearable style="width: 200px;" />
+        <el-input v-model="filters.collectionNumber"
+                  placeholder="璇疯緭鍏ユ敹娆惧崟鍙�"
+                  clearable
+                  style="width: 200px;" />
       </el-form-item>
       <el-form-item label="瀹㈡埛:">
-        <el-select v-model="filters.customerId" placeholder="璇烽�夋嫨瀹㈡埛" clearable style="width: 200px;">
-          <el-option v-for="item in customerList" :key="item.id" :label="item.name" :value="item.id" />
+        <el-select v-model="filters.customerId"
+                   placeholder="璇烽�夋嫨瀹㈡埛"
+                   clearable
+                   filterable
+                   style="width: 200px;">
+          <el-option v-for="item in customerList"
+                     :key="item.id"
+                     :label="item.customerName"
+                     :value="item.id" />
         </el-select>
       </el-form-item>
       <el-form-item label="鏀舵鏂瑰紡:">
-        <el-select v-model="filters.receiptMethod" placeholder="璇烽�夋嫨鏀舵鏂瑰紡" clearable style="width: 150px;">
-          <el-option label="閾惰杞处" value="bank_transfer" />
-          <el-option label="鐜伴噾" value="cash" />
-          <el-option label="鏀エ" value="check" />
-          <el-option label="姹囩エ" value="draft" />
-          <el-option label="鏀粯瀹�" value="alipay" />
-          <el-option label="寰俊" value="wechat" />
+        <el-select v-model="filters.collectionMethod"
+                   placeholder="璇烽�夋嫨鏀舵鏂瑰紡"
+                   clearable
+                   style="width: 150px;">
+          <el-option v-for="item in payment_methods"
+                     :key="item.value"
+                     :label="item.label"
+                     :value="item.value" />
         </el-select>
       </el-form-item>
+      <el-form-item label="鏀舵鏃ユ湡:">
+        <el-date-picker v-model="filters.dateRange"
+                        type="daterange"
+                        value-format="YYYY-MM-DD"
+                        format="YYYY-MM-DD"
+                        range-separator="鑷�"
+                        start-placeholder="寮�濮嬫棩鏈�"
+                        end-placeholder="缁撴潫鏃ユ湡"
+                        clearable
+                        style="width: 240px;" />
+      </el-form-item>
       <el-form-item>
-        <el-button type="primary" @click="getTableData">鎼滅储</el-button>
+        <el-button type="primary"
+                   @click="onSearch">鎼滅储</el-button>
         <el-button @click="resetFilters">閲嶇疆</el-button>
       </el-form-item>
     </el-form>
     <div class="table_list">
       <div class="actions">
         <div>
-          <el-statistic title="鏈湡鏀舵鍚堣" :value="totalReceiptAmount" precision="2" prefix="楼" />
+          <el-statistic title="鏈〉鏀舵鍚堣"
+                        :value="totalReceiptAmount"
+                        :precision="2"
+                        prefix="楼" />
         </div>
         <div>
-          <el-button type="primary" @click="add" icon="Plus">鏂板鏀舵</el-button>
-          <el-button @click="handleOut" icon="Download">瀵煎嚭</el-button>
+          <el-button type="primary"
+                     @click="add"
+                     icon="Plus">鏂板鏀舵</el-button>
+          <el-button type="success"
+                     @click="handleExport"
+                     icon="Download">瀵煎嚭</el-button>
         </div>
       </div>
-      <PIMTable
-        rowKey="id"
-        :column="columns"
-        :tableData="dataList"
-        :page="{
+      <PIMTable rowKey="id"
+                v-loading="tableLoading"
+                :column="columns"
+                :tableData="dataList"
+                :page="{
           current: pagination.currentPage,
           size: pagination.pageSize,
           total: pagination.total,
         }"
-        @pagination="changePage"
-      >
+                @pagination="changePage">
         <template #amount="{ row }">
           <span class="text-success">楼{{ formatMoney(row.amount) }}</span>
         </template>
         <template #receiptMethod="{ row }">
-          <el-tag>{{ getReceiptMethodLabel(row.receiptMethod) }}</el-tag>
-        </template>
-        <template #status="{ row }">
-          <el-tag :type="row.status === 'confirmed' ? 'success' : 'warning'">{{ row.status === 'confirmed' ? '宸茬‘璁�' : '寰呯‘璁�' }}</el-tag>
+          <span>{{ getReceiptMethodLabel(row.receiptMethod) }}</span>
         </template>
         <template #operation="{ row }">
-          <el-button type="primary" link @click="view(row)">鏌ョ湅</el-button>
-          <el-button type="primary" link @click="edit(row)" v-if="row.status === 'pending'">缂栬緫</el-button>
-          <el-button type="success" link @click="handleConfirm(row)" v-if="row.status === 'pending'">纭</el-button>
-          <el-button type="danger" link @click="handleDelete(row)" v-if="row.status === 'pending'">鍒犻櫎</el-button>
+          <el-button type="primary"
+                     link
+                     @click="view(row)">鏌ョ湅</el-button>
+          <el-button :disabled="row.accountStatemen"
+                     type="primary"
+                     link
+                     @click="edit(row)">缂栬緫</el-button>
+          <el-button :disabled="row.accountStatemen"
+                     type="danger"
+                     link
+                     @click="handleDelete(row)">鍒犻櫎</el-button>
         </template>
       </PIMTable>
     </div>
-
-    <FormDialog :title="dialogTitle" v-model="dialogVisible" width="800px" @confirm="submitForm" @cancel="dialogVisible = false">
-      <el-form :model="form" :rules="rules" ref="formRef" label-width="120px">
+    <FormDialog :title="dialogTitle"
+                v-model="dialogVisible"
+                width="800px"
+                :operation-type="isView ? 'detail' : ''"
+                @confirm="submitForm"
+                @cancel="closeDialog">
+      <el-form :model="form"
+               :rules="rules"
+               ref="formRef"
+               label-width="120px">
         <el-row :gutter="20">
-          <el-col :span="12">
-            <el-form-item label="鏀舵鍗曞彿" prop="receiptCode">
-              <el-input v-model="form.receiptCode" placeholder="绯荤粺鑷姩鐢熸垚" disabled />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="瀹㈡埛" prop="customerId">
-              <el-select v-model="form.customerId" placeholder="璇烽�夋嫨瀹㈡埛" style="width: 100%;" :disabled="isEdit">
-                <el-option v-for="item in customerList" :key="item.id" :label="item.name" :value="item.id" />
-              </el-select>
+          <el-col :span="24">
+            <el-form-item label="鏀舵鍗曞彿"
+                          prop="receiptCode">
+              <el-input v-model="form.receiptCode"
+                        placeholder="绯荤粺鑷姩鐢熸垚"
+                        disabled />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="20">
           <el-col :span="12">
-            <el-form-item label="鏀舵鏃ユ湡" prop="receiptDate">
-              <el-date-picker v-model="form.receiptDate" type="date" placeholder="閫夋嫨鏃ユ湡" value-format="YYYY-MM-DD" style="width: 100%;" />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="鏀舵閲戦" prop="amount">
-              <el-input-number v-model="form.amount" :min="0" :precision="2" style="width: 100%;" />
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="20">
-          <el-col :span="12">
-            <el-form-item label="鏀舵鏂瑰紡" prop="receiptMethod">
-              <el-select v-model="form.receiptMethod" placeholder="璇烽�夋嫨鏀舵鏂瑰紡" style="width: 100%;">
-                <el-option label="閾惰杞处" value="bank_transfer" />
-                <el-option label="鐜伴噾" value="cash" />
-                <el-option label="鏀エ" value="check" />
-                <el-option label="姹囩エ" value="draft" />
-                <el-option label="鏀粯瀹�" value="alipay" />
-                <el-option label="寰俊" value="wechat" />
+            <el-form-item label="瀹㈡埛"
+                          prop="customerId">
+              <el-select v-model="form.customerId"
+                         placeholder="璇烽�夋嫨瀹㈡埛"
+                         style="width: 100%;"
+                         :disabled="isEdit || isView"
+                         filterable
+                         @change="handleCustomerChange">
+                <el-option v-for="item in customerList"
+                           :key="item.id"
+                           :label="item.customerName"
+                           :value="item.id" />
               </el-select>
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="閾惰璐﹀彿" prop="bankAccount" v-if="form.receiptMethod === 'bank_transfer'">
-              <el-input v-model="form.bankAccount" placeholder="璇疯緭鍏ラ摱琛岃处鍙�" />
+            <el-form-item label="鍏宠仈鍗曟嵁"
+                          prop="stockOutRecordIds">
+              <el-input :model-value="outboundBatchDisplayText"
+                        placeholder="璇峰厛閫夋嫨瀹㈡埛"
+                        readonly
+                        :disabled="!form.customerId || isEdit || isView"
+                        class="outbound-batch-input"
+                        @click="handleOutboundInputClick">
+                <template v-if="!isEdit && !isView"
+                          #append>
+                  <el-button :disabled="!form.customerId"
+                             :loading="outboundBatchLoading"
+                             @click.stop="openOutboundSelectDialog">
+                    閫夋嫨
+                  </el-button>
+                </template>
+              </el-input>
             </el-form-item>
           </el-col>
         </el-row>
-        <el-form-item label="鍏宠仈鍗曟嵁" prop="relatedDocs">
-          <el-select v-model="form.relatedDocs" multiple placeholder="璇烽�夋嫨鍏宠仈鍗曟嵁" style="width: 100%;">
-            <el-option v-for="item in outList" :key="item.outCode" :label="item.outCode" :value="item.outCode" />
-          </el-select>
-        </el-form-item>
-        <el-form-item label="澶囨敞" prop="remark">
-          <el-input v-model="form.remark" type="textarea" :rows="3" placeholder="璇疯緭鍏ュ娉�" />
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="鏀舵鏃ユ湡"
+                          prop="receiptDate">
+              <el-date-picker v-model="form.receiptDate"
+                              type="date"
+                              placeholder="閫夋嫨鏃ユ湡"
+                              value-format="YYYY-MM-DD"
+                              style="width: 100%;"
+                              :disabled="isView" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鏀舵閲戦"
+                          prop="amount">
+              <el-input-number v-model="form.amount"
+                               :min="0"
+                               :precision="2"
+                               style="width: 100%;"
+                               :disabled="isView"
+                               placeholder="鏍规嵁鍏宠仈鍗曟嵁鑷姩姹囨�伙紝鍙慨鏀�" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="鏀舵鏂瑰紡"
+                          prop="receiptMethod">
+              <el-select v-model="form.receiptMethod"
+                         placeholder="璇烽�夋嫨鏀舵鏂瑰紡"
+                         style="width: 100%;"
+                         :disabled="isView">
+                <el-option v-for="item in payment_methods"
+                           :key="item.value"
+                           :label="item.label"
+                           :value="item.value" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-form-item label="澶囨敞"
+                      prop="remark">
+          <el-input v-model="form.remark"
+                    type="textarea"
+                    :rows="3"
+                    placeholder="璇疯緭鍏ュ娉�"
+                    :disabled="isView" />
         </el-form-item>
       </el-form>
-      <template #footer>
-        <el-button type="primary" @click="submitForm">纭畾</el-button>
-        <el-button @click="dialogVisible = false">鍙栨秷</el-button>
+      <template v-if="!isView"
+                #footer>
+        <el-button type="primary"
+                   :loading="submitLoading"
+                   @click="submitForm">纭畾</el-button>
+        <el-button @click="closeDialog">鍙栨秷</el-button>
       </template>
     </FormDialog>
+    <el-dialog v-model="outboundSelectVisible"
+               title="閫夋嫨鍏宠仈鍗曟嵁"
+               width="1200px"
+               append-to-body
+               destroy-on-close
+               :close-on-click-modal="false"
+               @closed="handleOutboundDialogClosed">
+      <el-table ref="outboundTableRef"
+                v-loading="outboundBatchLoading"
+                :data="outboundBatchList"
+                row-key="id"
+                border
+                stripe
+                max-height="480"
+                @selection-change="handleOutboundDialogSelectionChange">
+        <el-table-column type="selection"
+                         width="55"
+                         align="center" />
+        <el-table-column prop="outboundBatches"
+                         label="鍑哄簱鍗曞彿"
+                         min-width="140"
+                         show-overflow-tooltip />
+        <el-table-column prop="customerName"
+                         label="瀹㈡埛鍚嶇О"
+                         min-width="120"
+                         show-overflow-tooltip />
+        <el-table-column prop="productName"
+                         label="浜у搧鍚嶇О"
+                         min-width="120"
+                         show-overflow-tooltip />
+        <el-table-column prop="specificationModel"
+                         label="瑙勬牸鍨嬪彿"
+                         min-width="140"
+                         show-overflow-tooltip />
+        <el-table-column prop="salesContractNo"
+                         label="閿�鍞悎鍚屽彿"
+                         min-width="140"
+                         show-overflow-tooltip />
+        <el-table-column prop="shippingNo"
+                         label="鍙戣揣鍗曞彿"
+                         min-width="130"
+                         show-overflow-tooltip />
+        <el-table-column prop="shippingDate"
+                         label="鍙戣揣鏃ユ湡"
+                         width="110"
+                         align="center" />
+        <el-table-column prop="outboundAmount"
+                         label="鍑哄簱閲戦"
+                         width="110"
+                         align="right">
+          <template #default="{ row }">楼{{ formatMoney(row.outboundAmount) }}</template>
+        </el-table-column>
+        <el-table-column prop="taxRate"
+                         label="绋庣巼"
+                         width="80"
+                         align="center">
+          <template #default="{ row }">{{ row.taxRate }}%</template>
+        </el-table-column>
+      </el-table>
+      <template #footer>
+        <el-button type="primary"
+                   @click="confirmOutboundSelection">纭畾</el-button>
+        <el-button @click="outboundSelectVisible = false">鍙栨秷</el-button>
+      </template>
+    </el-dialog>
   </div>
 </template>
 
 <script setup>
-import { ref, reactive, onMounted, computed } from "vue";
-import { ElMessage, ElMessageBox } from "element-plus";
-import FormDialog from "@/components/Dialog/FormDialog.vue";
+  import {
+    ref,
+    reactive,
+    computed,
+    onMounted,
+    nextTick,
+    getCurrentInstance,
+  } from "vue";
+  import { ElMessage, ElMessageBox } from "element-plus";
+  import FormDialog from "@/components/Dialog/FormDialog.vue";
+  import { listCustomer } from "@/api/basicData/customer.js";
+  import {
+    getOutboundBatchesByCustomer,
+    addAccountSalesCollection,
+    listPageAccountSalesCollection,
+    updateAccountSalesCollection,
+    deleteAccountSalesCollection,
+  } from "@/api/financialManagement/accountSalesCollection.js";
 
-defineOptions({
-  name: "鏀舵鍗�",
-});
+  defineOptions({
+    name: "鏀舵鍗�",
+  });
 
-const filters = reactive({
-  receiptCode: "",
-  customerId: "",
-  receiptMethod: "",
-});
+  const { proxy } = getCurrentInstance();
+  const { payment_methods } = proxy.useDict("payment_methods");
 
-const pagination = reactive({
-  currentPage: 1,
-  pageSize: 10,
-  total: 0,
-});
-
-const columns = [
-  { label: "鏀舵鍗曞彿", prop: "receiptCode", width: "150" },
-  { label: "瀹㈡埛鍚嶇О", prop: "customerName", width: "180" },
-  { label: "鏀舵鏃ユ湡", prop: "receiptDate", width: "120" },
-  { label: "鏀舵閲戦", prop: "amount", slot: "amount" },
-  { label: "鏀舵鏂瑰紡", prop: "receiptMethod", slot: "receiptMethod" },
-  { label: "鐘舵��", prop: "status", slot: "status" },
-  { label: "澶囨敞", prop: "remark", showOverflowTooltip: true },
-  { label: "鎿嶄綔", prop: "operation", slot: "operation", width: "220", fixed: "right" },
-];
-
-const dataList = ref([]);
-const dialogVisible = ref(false);
-const dialogTitle = ref("");
-const formRef = ref(null);
-const isEdit = ref(false);
-const currentId = ref(null);
-
-const customerList = [
-  { id: 1, name: "鍖椾含绉戞妧鏈夐檺鍏徃" },
-  { id: 2, name: "涓婃捣璐告槗鍏徃" },
-  { id: 3, name: "骞垮窞瀹炰笟鏈夐檺鍏徃" },
-  { id: 4, name: "娣卞湷鐢靛瓙鍏徃" },
-];
-
-const outList = [
-  { outCode: "CK2024001", customerId: 1 },
-  { outCode: "CK2024002", customerId: 2 },
-  { outCode: "CK2024003", customerId: 3 },
-];
-
-const form = reactive({
-  receiptCode: "",
-  customerId: "",
-  receiptDate: "",
-  amount: 0,
-  receiptMethod: "bank_transfer",
-  bankAccount: "",
-  relatedDocs: [],
-  remark: "",
-});
-
-const rules = {
-  customerId: [{ required: true, message: "璇烽�夋嫨瀹㈡埛", trigger: "change" }],
-  receiptDate: [{ required: true, message: "璇烽�夋嫨鏀舵鏃ユ湡", trigger: "change" }],
-  amount: [{ required: true, message: "璇疯緭鍏ユ敹娆鹃噾棰�", trigger: "blur" }],
-  receiptMethod: [{ required: true, message: "璇烽�夋嫨鏀舵鏂瑰紡", trigger: "change" }],
-};
-
-const mockData = [
-  { id: 1, receiptCode: "SK2024001", customerId: 1, customerName: "鍖椾含绉戞妧鏈夐檺鍏徃", receiptDate: "2024-01-16", amount: 3000, receiptMethod: "bank_transfer", status: "confirmed", relatedDocs: ["CK2024001"], remark: "" },
-  { id: 2, receiptCode: "SK2024002", customerId: 2, customerName: "涓婃捣璐告槗鍏徃", receiptDate: "2024-01-18", amount: 5000, receiptMethod: "cash", status: "pending", relatedDocs: ["CK2024002"], remark: "" },
-  { id: 3, receiptCode: "SK2024003", customerId: 3, customerName: "骞垮窞瀹炰笟鏈夐檺鍏徃", receiptDate: "2024-01-20", amount: 8000, receiptMethod: "alipay", status: "confirmed", relatedDocs: ["CK2024003"], remark: "" },
-];
-
-const totalReceiptAmount = computed(() => {
-  return dataList.value.reduce((sum, item) => sum + Number(item.amount), 0);
-});
-
-const formatMoney = (value) => {
-  if (value === undefined || value === null) return "0.00";
-  return Number(value).toFixed(2).replace(/\B(?=(\d{3})+(?!\d))/g, ",");
-};
-
-const getReceiptMethodLabel = (method) => {
-  const map = {
-    bank_transfer: "閾惰杞处",
-    cash: "鐜伴噾",
-    check: "鏀エ",
-    draft: "姹囩エ",
-    alipay: "鏀粯瀹�",
-    wechat: "寰俊",
-  };
-  return map[method] || method;
-};
-
-const getTableData = () => {
-  let result = [...mockData];
-  if (filters.receiptCode) {
-    result = result.filter(item => item.receiptCode.includes(filters.receiptCode));
-  }
-  if (filters.customerId) {
-    result = result.filter(item => item.customerId === filters.customerId);
-  }
-  if (filters.receiptMethod) {
-    result = result.filter(item => item.receiptMethod === filters.receiptMethod);
-  }
-  pagination.total = result.length;
-  dataList.value = result.slice((pagination.currentPage - 1) * pagination.pageSize, pagination.currentPage * pagination.pageSize);
-};
-
-const resetFilters = () => {
-  filters.receiptCode = "";
-  filters.customerId = "";
-  filters.receiptMethod = "";
-  pagination.currentPage = 1;
-  getTableData();
-};
-
-const changePage = ({ current, size }) => {
-  pagination.currentPage = current;
-  pagination.pageSize = size;
-  getTableData();
-};
-
-const add = () => {
-  isEdit.value = false;
-  dialogTitle.value = "鏂板鏀舵";
-  Object.assign(form, {
-    receiptCode: "SK" + Date.now().toString().slice(-8),
+  const filters = reactive({
+    collectionNumber: "",
     customerId: "",
-    receiptDate: new Date().toISOString().split('T')[0],
+    collectionMethod: "",
+    dateRange: [],
+  });
+
+  const pagination = reactive({
+    currentPage: 1,
+    pageSize: 10,
+    total: 0,
+  });
+
+  const columns = [
+    { label: "鏀舵鍗曞彿", prop: "receiptCode", width: "150" },
+    { label: "瀹㈡埛鍚嶇О", prop: "customerName", width: "180" },
+    { label: "鏀舵鏃ユ湡", prop: "receiptDate", width: "120" },
+    { label: "鏀舵閲戦", prop: "amount", dataType: "slot", slot: "amount" },
+    {
+      label: "鏀舵鏂瑰紡",
+      prop: "receiptMethod",
+      dataType: "slot",
+      slot: "receiptMethod",
+      width: "120",
+    },
+    { label: "澶囨敞", prop: "remark", showOverflowTooltip: true },
+    {
+      label: "鎿嶄綔",
+      prop: "operation",
+      dataType: "slot",
+      slot: "operation",
+      width: "200",
+      fixed: "right",
+    },
+  ];
+
+  const dataList = ref([]);
+  const tableLoading = ref(false);
+  const dialogVisible = ref(false);
+  const dialogTitle = ref("");
+  const formRef = ref(null);
+  const isEdit = ref(false);
+  const isView = ref(false);
+  const currentId = ref(null);
+  const submitLoading = ref(false);
+
+  const customerList = ref([]);
+  const outboundBatchList = ref([]);
+  const outboundBatchOptions = ref([]);
+  const outboundBatchLoading = ref(false);
+  const outboundSelectVisible = ref(false);
+  const outboundTableRef = ref(null);
+  const dialogOutboundSelection = ref([]);
+
+  const getReceiptMethodLabel = value => {
+    if (value === undefined || value === null || value === "") return "-";
+    const item = payment_methods.value?.find(
+      m => String(m.value) === String(value)
+    );
+    return item?.label ?? value;
+  };
+
+  const getDefaultReceiptMethod = () => payment_methods.value?.[0]?.value ?? "";
+
+  const form = reactive({
+    receiptCode: "",
+    customerId: "",
+    receiptDate: "",
     amount: 0,
-    receiptMethod: "bank_transfer",
-    bankAccount: "",
-    relatedDocs: [],
+    receiptMethod: "",
+    stockOutRecordIds: [],
+    outboundBatches: "",
     remark: "",
   });
-  dialogVisible.value = true;
-};
 
-const edit = (row) => {
-  isEdit.value = true;
-  currentId.value = row.id;
-  dialogTitle.value = "缂栬緫鏀舵";
-  Object.assign(form, row);
-  dialogVisible.value = true;
-};
+  const rules = {
+    customerId: [{ required: true, message: "璇烽�夋嫨瀹㈡埛", trigger: "change" }],
+    stockOutRecordIds: [
+      {
+        required: true,
+        type: "array",
+        min: 1,
+        message: "璇烽�夋嫨鍏宠仈鍗曟嵁",
+        trigger: "change",
+      },
+    ],
+    receiptDate: [
+      { required: true, message: "璇烽�夋嫨鏀舵鏃ユ湡", trigger: "change" },
+    ],
+    amount: [{ required: true, message: "璇疯緭鍏ユ敹娆鹃噾棰�", trigger: "blur" }],
+    receiptMethod: [
+      { required: true, message: "璇烽�夋嫨鏀舵鏂瑰紡", trigger: "change" },
+    ],
+  };
 
-const view = (row) => {
-  ElMessage.info(`鏌ョ湅鏀舵鍗�: ${row.receiptCode}`);
-};
+  const totalReceiptAmount = computed(() =>
+    dataList.value.reduce((sum, item) => sum + Number(item.amount || 0), 0)
+  );
 
-const handleConfirm = (row) => {
-  ElMessageBox.confirm("纭璇ユ敹娆惧崟鍚楋紵", "鎻愮ず", {
-    confirmButtonText: "纭",
-    cancelButtonText: "鍙栨秷",
-    type: "info",
-  }).then(() => {
-    const index = mockData.findIndex(item => item.id === row.id);
-    if (index !== -1) {
-      mockData[index].status = "confirmed";
-    }
-    ElMessage.success("纭鎴愬姛");
-    getTableData();
+  const formatMoney = value => {
+    if (value === undefined || value === null) return "0.00";
+    return Number(value)
+      .toFixed(2)
+      .replace(/\B(?=(\d{3})+(?!\d))/g, ",");
+  };
+
+  const parseStockOutRecordIds = value => {
+    if (!value) return [];
+    if (Array.isArray(value)) return value;
+    return String(value)
+      .split(/[,锛宂/)
+      .map(s => s.trim())
+      .filter(Boolean)
+      .map(s => (/^\d+$/.test(s) ? Number(s) : s));
+  };
+
+  const formatOutboundBatches = value => {
+    if (value === undefined || value === null || value === "") return "";
+    if (Array.isArray(value)) return value.filter(Boolean).join("銆�");
+    return String(value)
+      .split(/[,锛宂/)
+      .map(s => s.trim())
+      .filter(Boolean)
+      .join("銆�");
+  };
+
+  const normalizeTableRow = row => ({
+    ...row,
+    receiptCode: row.collectionNumber ?? row.receiptCode,
+    receiptDate: row.collectionDate ?? row.receiptDate,
+    amount: row.collectionAmount ?? row.amount,
+    receiptMethod: row.collectionMethod ?? row.receiptMethod ?? "",
+    stockOutRecordIds: row.stockOutRecordIds ?? row.stockOutRecordId ?? "",
+    outboundBatches: formatOutboundBatches(row.outboundBatches),
   });
-};
 
-const handleDelete = (row) => {
-  ElMessageBox.confirm("纭鍒犻櫎璇ユ敹娆惧崟鍚楋紵", "鎻愮ず", {
-    confirmButtonText: "纭畾",
-    cancelButtonText: "鍙栨秷",
-    type: "warning",
-  }).then(() => {
-    const index = mockData.findIndex(item => item.id === row.id);
-    if (index !== -1) {
-      mockData.splice(index, 1);
-    }
-    ElMessage.success("鍒犻櫎鎴愬姛");
-    getTableData();
-  });
-};
-
-const handleOut = () => {
-  ElMessage.success("瀵煎嚭鎴愬姛");
-};
-
-const submitForm = () => {
-  formRef.value.validate((valid) => {
-    if (valid) {
-      const customer = customerList.find(item => item.id === form.customerId);
-      if (isEdit.value) {
-        const index = mockData.findIndex(item => item.id === currentId.value);
-        if (index !== -1) {
-          mockData[index] = { ...mockData[index], ...form, customerName: customer?.name };
-        }
-        ElMessage.success("缂栬緫鎴愬姛");
-      } else {
-        const newId = mockData.length > 0 ? Math.max(...mockData.map(item => item.id)) + 1 : 1;
-        mockData.push({ id: newId, ...form, customerName: customer?.name, status: "pending" });
-        ElMessage.success("鏂板鎴愬姛");
+  const getCustomerList = () => {
+    listCustomer({ current: -1, size: -1, type: 0 }).then(res => {
+      if (res.code === 200) {
+        customerList.value = res.data?.records || [];
       }
-      dialogVisible.value = false;
-      getTableData();
-    }
-  });
-};
+    });
+  };
 
-onMounted(() => {
-  getTableData();
-});
+  const normalizeOutboundBatchOptions = data => {
+    const list = Array.isArray(data) ? data : [];
+    return list.map((item, index) => {
+      if (typeof item === "string" || typeof item === "number") {
+        const text = String(item);
+        return { label: text, value: text, outboundAmount: 0 };
+      }
+      const label =
+        item.outboundBatches ??
+        item.batchNo ??
+        item.shippingNo ??
+        item.outboundNo ??
+        item.label ??
+        `鍑哄簱鍗�${index + 1}`;
+      const value = item.id ?? item.stockOutRecordId ?? label;
+      return {
+        label: String(label),
+        value,
+        outboundAmount: Number(item.outboundAmount) || 0,
+      };
+    });
+  };
+
+  const isSameOutboundId = (a, b) => String(a) === String(b);
+
+  const getOutboundRowId = row => row?.id ?? row?.stockOutRecordId;
+
+  const outboundBatchDisplayText = computed(() => {
+    if (isEdit.value || isView.value) {
+      return form.outboundBatches || "";
+    }
+    if (form.outboundBatches) return form.outboundBatches;
+    const ids = form.stockOutRecordIds || [];
+    if (!ids.length) return "";
+    const labels = outboundBatchOptions.value
+      .filter(opt => ids.some(id => isSameOutboundId(id, opt.value)))
+      .map(opt => opt.label);
+    if (labels.length) return labels.join("銆�");
+    return ids.join("銆�");
+  });
+
+  const handleOutboundInputClick = () => {
+    if (isEdit.value || isView.value) return;
+    openOutboundSelectDialog();
+  };
+
+  /** 涓哄凡閫� ID 琛ュ叏閫夐」锛堢紪杈�/鏌ョ湅鍥炴樉锛� */
+  const ensureOutboundOptionsForSelected = () => {
+    const ids = form.stockOutRecordIds || [];
+    ids.forEach(id => {
+      const exists = outboundBatchOptions.value.some(opt =>
+        isSameOutboundId(opt.value, id)
+      );
+      if (exists) return;
+      const fromList = outboundBatchList.value.find(row =>
+        isSameOutboundId(getOutboundRowId(row), id)
+      );
+      if (fromList) {
+        const [option] = normalizeOutboundBatchOptions([fromList]);
+        if (option) outboundBatchOptions.value.push(option);
+        return;
+      }
+      outboundBatchOptions.value.push({
+        label: String(id),
+        value: id,
+        outboundAmount: 0,
+      });
+    });
+  };
+
+  const syncCollectionAmount = () => {
+    const selected = form.stockOutRecordIds || [];
+    const sum = outboundBatchOptions.value
+      .filter(opt => selected.some(id => isSameOutboundId(id, opt.value)))
+      .reduce((acc, opt) => acc + (Number(opt.outboundAmount) || 0), 0);
+    form.amount = sum > 0 ? Number(sum.toFixed(2)) : 0;
+  };
+
+  const restoreOutboundTableSelection = () => {
+    nextTick(() => {
+      const table = outboundTableRef.value;
+      if (!table) return;
+      table.clearSelection();
+      const selectedIds = new Set(
+        (form.stockOutRecordIds || []).map(id => String(id))
+      );
+      outboundBatchList.value.forEach(row => {
+        const rowId = getOutboundRowId(row);
+        if (
+          rowId !== undefined &&
+          rowId !== null &&
+          selectedIds.has(String(rowId))
+        ) {
+          table.toggleRowSelection(row, true);
+        }
+      });
+    });
+  };
+
+  const loadOutboundBatches = (customerId, keepSelected = false) => {
+    if (!customerId) {
+      outboundBatchList.value = [];
+      outboundBatchOptions.value = [];
+      if (!keepSelected) {
+        form.stockOutRecordIds = [];
+        form.amount = 0;
+      }
+      return Promise.resolve();
+    }
+    outboundBatchLoading.value = true;
+    return getOutboundBatchesByCustomer({ customerId })
+      .then(res => {
+        if (res.code === 200) {
+          const list = res.data?.records ?? res.data ?? [];
+          outboundBatchList.value = Array.isArray(list) ? list : [];
+          outboundBatchOptions.value = normalizeOutboundBatchOptions(list);
+        } else {
+          outboundBatchList.value = [];
+          outboundBatchOptions.value = [];
+        }
+      })
+      .catch(() => {
+        outboundBatchList.value = [];
+        outboundBatchOptions.value = [];
+      })
+      .finally(() => {
+        outboundBatchLoading.value = false;
+        if (keepSelected) {
+          ensureOutboundOptionsForSelected();
+          restoreOutboundTableSelection();
+        }
+      });
+  };
+
+  const handleCustomerChange = customerId => {
+    form.stockOutRecordIds = [];
+    form.outboundBatches = "";
+    form.amount = 0;
+    loadOutboundBatches(customerId);
+  };
+
+  const openOutboundSelectDialog = () => {
+    if (!form.customerId || isEdit.value || isView.value) return;
+    outboundSelectVisible.value = true;
+    loadOutboundBatches(form.customerId, true).then(() => {
+      restoreOutboundTableSelection();
+    });
+  };
+
+  const handleOutboundDialogSelectionChange = selection => {
+    dialogOutboundSelection.value = selection;
+  };
+
+  const confirmOutboundSelection = () => {
+    if (dialogOutboundSelection.value.length === 0) {
+      ElMessage.warning("璇疯嚦灏戦�夋嫨涓�鏉″叧鑱斿崟鎹�");
+      return;
+    }
+    form.stockOutRecordIds = dialogOutboundSelection.value
+      .map(row => getOutboundRowId(row))
+      .filter(id => id !== undefined && id !== null);
+    form.outboundBatches = dialogOutboundSelection.value
+      .map(row => row.outboundBatches ?? row.batchNo ?? row.shippingNo ?? "")
+      .filter(Boolean)
+      .join("銆�");
+    outboundSelectVisible.value = false;
+    syncCollectionAmount();
+    formRef.value?.validateField("stockOutRecordIds");
+  };
+
+  const handleOutboundDialogClosed = () => {
+    dialogOutboundSelection.value = [];
+  };
+
+  const appendFilterParams = params => {
+    if (filters.collectionNumber) {
+      params.collectionNumber = filters.collectionNumber;
+    }
+    if (filters.customerId) {
+      params.customerId = filters.customerId;
+    }
+    if (filters.collectionMethod) {
+      params.collectionMethod = filters.collectionMethod;
+    }
+    if (filters.dateRange?.length === 2) {
+      params.startDate = filters.dateRange[0];
+      params.endDate = filters.dateRange[1];
+    }
+    return params;
+  };
+
+  const buildListParams = () =>
+    appendFilterParams({
+      current: pagination.currentPage,
+      size: pagination.pageSize,
+    });
+
+  const buildExportParams = () => appendFilterParams({});
+
+  const buildSubmitPayload = (forUpdate = false) => {
+    const payload = {
+      customerId: form.customerId,
+      collectionDate: form.receiptDate,
+      collectionAmount: form.amount,
+      collectionMethod: form.receiptMethod,
+      collectionNumber: form.receiptCode || "",
+      remark: form.remark || "",
+      stockOutRecordIds: (form.stockOutRecordIds || []).join(","),
+    };
+    if (forUpdate) {
+      payload.id = currentId.value;
+    }
+    return payload;
+  };
+
+  const fillFormFromRow = row => {
+    const stockOutRecordIds = parseStockOutRecordIds(
+      row.stockOutRecordIds ?? row.stockOutRecordId
+    );
+    Object.assign(form, {
+      receiptCode: row.receiptCode ?? row.collectionNumber ?? "",
+      customerId: row.customerId,
+      receiptDate: row.receiptDate ?? row.collectionDate ?? "",
+      amount: Number(row.amount ?? row.collectionAmount ?? 0),
+      receiptMethod: row.receiptMethod ?? row.collectionMethod ?? "",
+      stockOutRecordIds,
+      outboundBatches: formatOutboundBatches(row.outboundBatches),
+      remark: row.remark ?? "",
+    });
+  };
+
+  const closeDialog = () => {
+    dialogVisible.value = false;
+    outboundSelectVisible.value = false;
+    isView.value = false;
+    isEdit.value = false;
+  };
+
+  const handleExport = () => {
+    const params = buildExportParams();
+    proxy.download(
+      "/accountSalesCollection/exportAccountSalesCollection",
+      params,
+      `鏀舵鍗昣${Date.now()}.xlsx`
+    );
+  };
+
+  const getTableData = () => {
+    tableLoading.value = true;
+    listPageAccountSalesCollection(buildListParams())
+      .then(res => {
+        const ok = res.code === 200 || res.code === 0;
+        if (ok && res.data) {
+          pagination.total = res.data.total ?? 0;
+          dataList.value = (res.data.records ?? []).map(normalizeTableRow);
+        } else {
+          ElMessage.error(res.msg || "鏌ヨ澶辫触");
+          dataList.value = [];
+          pagination.total = 0;
+        }
+      })
+      .catch(() => {
+        dataList.value = [];
+        pagination.total = 0;
+        ElMessage.error("鏌ヨ澶辫触");
+      })
+      .finally(() => {
+        tableLoading.value = false;
+      });
+  };
+
+  const onSearch = () => {
+    pagination.currentPage = 1;
+    getTableData();
+  };
+
+  const resetFilters = () => {
+    filters.collectionNumber = "";
+    filters.customerId = "";
+    filters.collectionMethod = "";
+    filters.dateRange = [];
+    pagination.currentPage = 1;
+    getTableData();
+  };
+
+  const changePage = ({ current, size }) => {
+    pagination.currentPage = current;
+    pagination.pageSize = size;
+    getTableData();
+  };
+
+  const add = () => {
+    isEdit.value = false;
+    isView.value = false;
+    dialogTitle.value = "鏂板鏀舵";
+    Object.assign(form, {
+      receiptCode: "SK" + Date.now().toString().slice(-8),
+      customerId: "",
+      receiptDate: new Date().toISOString().split("T")[0],
+      amount: 0,
+      receiptMethod: getDefaultReceiptMethod(),
+      stockOutRecordIds: [],
+      outboundBatches: "",
+      remark: "",
+    });
+    outboundBatchList.value = [];
+    outboundBatchOptions.value = [];
+    dialogVisible.value = true;
+  };
+
+  const edit = row => {
+    isEdit.value = true;
+    isView.value = false;
+    currentId.value = row.id;
+    dialogTitle.value = "缂栬緫鏀舵";
+    fillFormFromRow(row);
+    dialogVisible.value = true;
+  };
+
+  const view = row => {
+    isView.value = true;
+    isEdit.value = false;
+    dialogTitle.value = "鏌ョ湅鏀舵";
+    fillFormFromRow(row);
+    dialogVisible.value = true;
+  };
+
+  const handleDelete = row => {
+    ElMessageBox.confirm(
+      `纭鍒犻櫎鏀舵鍗曘��${row.receiptCode ?? row.collectionNumber}銆嶅悧锛焋,
+      "鎻愮ず",
+      {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning",
+      }
+    ).then(() => {
+      deleteAccountSalesCollection([row.id])
+        .then(res => {
+          if (res.code === 200) {
+            ElMessage.success("鍒犻櫎鎴愬姛");
+            getTableData();
+          } else {
+            ElMessage.error(res.msg || "鍒犻櫎澶辫触");
+          }
+        })
+        .catch(() => {
+          ElMessage.error("鍒犻櫎澶辫触");
+        });
+    });
+  };
+
+  const submitForm = () => {
+    formRef.value.validate(valid => {
+      if (!valid) return;
+      submitLoading.value = true;
+      const request = isEdit.value
+        ? updateAccountSalesCollection(buildSubmitPayload(true))
+        : addAccountSalesCollection(buildSubmitPayload());
+      request
+        .then(res => {
+          if (res.code === 200) {
+            ElMessage.success(isEdit.value ? "淇敼鎴愬姛" : "鏂板鎴愬姛");
+            closeDialog();
+            getTableData();
+          } else {
+            ElMessage.error(res.msg || (isEdit.value ? "淇敼澶辫触" : "鏂板澶辫触"));
+          }
+        })
+        .catch(() => {
+          ElMessage.error(isEdit.value ? "淇敼澶辫触" : "鏂板澶辫触");
+        })
+        .finally(() => {
+          submitLoading.value = false;
+        });
+    });
+  };
+
+  onMounted(() => {
+    getCustomerList();
+    getTableData();
+  });
 </script>
 
 <style lang="scss" scoped>
-.actions {
-  display: flex;
-  justify-content: space-between;
-  align-items: center;
-  margin-bottom: 15px;
-}
+  .actions {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    margin-bottom: 15px;
+  }
 
-.text-success {
-  color: #67c23a;
-  font-weight: bold;
-}
+  .text-success {
+    color: #67c23a;
+    font-weight: bold;
+  }
+
+  .outbound-batch-input:not(.is-disabled) {
+    :deep(.el-input__wrapper) {
+      cursor: pointer;
+    }
+  }
 </style>
diff --git a/src/views/financialManagement/receivable/reconciliation.vue b/src/views/financialManagement/receivable/reconciliation.vue
index 883e12e..b1bff0e 100644
--- a/src/views/financialManagement/receivable/reconciliation.vue
+++ b/src/views/financialManagement/receivable/reconciliation.vue
@@ -2,8 +2,8 @@
   <div class="app-container">
     <el-form :model="filters" :inline="true">
       <el-form-item label="瀹㈡埛:">
-        <el-select v-model="filters.customerId" placeholder="璇烽�夋嫨瀹㈡埛" clearable style="width: 200px;">
-          <el-option v-for="item in customerList" :key="item.id" :label="item.name" :value="item.id" />
+        <el-select v-model="filters.customerId" placeholder="璇烽�夋嫨瀹㈡埛" clearable filterable style="width: 200px;">
+          <el-option v-for="item in customerList" :key="item.id" :label="item.customerName" :value="item.id" />
         </el-select>
       </el-form-item>
       <el-form-item label="瀵硅处鏈熼棿:">
@@ -29,6 +29,7 @@
         rowKey="id"
         :column="columns"
         :tableData="dataList"
+        :tableLoading="tableLoading"
         :page="{
           current: pagination.currentPage,
           size: pagination.pageSize,
@@ -36,21 +37,22 @@
         }"
         @pagination="changePage"
       >
-        <template #beginBalance="{ row }">
-          <span :class="row.beginBalance >= 0 ? 'text-success' : 'text-danger'">楼{{ formatMoney(row.beginBalance) }}</span>
+        <template #openingBalance="{ row }">
+          <span :class="row.openingBalance >= 0 ? 'text-success' : 'text-danger'">楼{{ formatMoney(row.openingBalance) }}</span>
         </template>
-        <template #currentReceivable="{ row }">
-          <span class="text-primary">楼{{ formatMoney(row.currentReceivable) }}</span>
+        <template #currentPlan="{ row }">
+          <span class="text-primary">楼{{ formatMoney(row.currentPlan) }}</span>
         </template>
-        <template #currentReceipt="{ row }">
-          <span class="text-success">楼{{ formatMoney(row.currentReceipt) }}</span>
+        <template #currentActually="{ row }">
+          <span class="text-success">楼{{ formatMoney(row.currentActually) }}</span>
         </template>
-        <template #endBalance="{ row }">
-          <span :class="row.endBalance >= 0 ? 'text-success' : 'text-danger'">楼{{ formatMoney(row.endBalance) }}</span>
+        <template #closingBalance="{ row }">
+          <span :class="row.closingBalance >= 0 ? 'text-success' : 'text-danger'">楼{{ formatMoney(row.closingBalance) }}</span>
         </template>
         <template #operation="{ row }">
           <el-button type="primary" link @click="viewDetail(row)">鏌ョ湅鏄庣粏</el-button>
-          <el-button type="primary" link @click="printStatement(row)">鎵撳嵃</el-button>
+          <!-- <el-button type="primary" link @click="printStatement(row)">鎵撳嵃</el-button> -->
+          <el-button type="danger" link @click="handleDelete(row)">鍒犻櫎</el-button>
         </template>
       </PIMTable>
     </div>
@@ -60,7 +62,7 @@
         <h3>{{ currentCustomer }} 搴旀敹瀵硅处鍗�</h3>
         <p>瀵硅处鏈熼棿: {{ currentPeriod }}</p>
       </div>
-      <el-table :data="detailData" border style="width: 100%">
+      <el-table :data="detailData" border style="width: 100%" v-loading="detailLoading">
         <el-table-column prop="date" label="鏃ユ湡" width="120" />
         <el-table-column prop="type" label="绫诲瀷" width="100">
           <template #default="{ row }">
@@ -98,52 +100,68 @@
         <el-row :gutter="20">
           <el-col :span="12">
             <el-form-item label="閫夋嫨瀹㈡埛" prop="customerId">
-              <el-select v-model="generateForm.customerId" placeholder="璇烽�夋嫨瀹㈡埛" style="width: 100%;" @change="onCustomerChange">
-                <el-option v-for="item in customerList" :key="item.id" :label="item.name" :value="item.id" />
+              <el-select
+                v-model="generateForm.customerId"
+                placeholder="璇烽�夋嫨瀹㈡埛"
+                style="width: 100%;"
+                filterable
+                @change="onCustomerChange"
+              >
+                <el-option v-for="item in customerList" :key="item.id" :label="item.customerName" :value="item.id" />
               </el-select>
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="瀵硅处鏈堜唤" prop="period">
-              <el-date-picker v-model="generateForm.period" type="month" placeholder="閫夋嫨鏈堜唤" value-format="YYYY-MM" style="width: 100%;" @change="onPeriodChange" />
+            <el-form-item label="瀵硅处鏈堜唤" prop="statementMonth">
+              <el-date-picker v-model="generateForm.statementMonth" type="month" placeholder="閫夋嫨鏈堜唤" value-format="YYYY-MM" style="width: 100%;" @change="onStatementMonthChange" />
             </el-form-item>
           </el-col>
         </el-row>
       </el-form>
 
-      <div v-if="salesData.length > 0" class="sales-section">
-        <div class="section-title">鏈湀閿�鍞暟鎹�</div>
-        <el-table :data="salesData" border style="width: 100%; margin-bottom: 15px;" v-loading="salesLoading" @selection-change="handleSalesSelectionChange">
+      <div v-if="statementDetailLoaded" class="sales-section">
+        <div v-if="salesData.length > 0" class="section-title">鏈湀閿�鍞暟鎹�</div>
+        <el-table
+          v-if="salesData.length > 0"
+          ref="salesTableRef"
+          :data="salesData"
+          border
+          row-key="id"
+          style="width: 100%; margin-bottom: 15px;"
+          v-loading="salesLoading"
+          @selection-change="handleSalesSelectionChange"
+        >
           <el-table-column type="selection" width="55" align="center" />
-          <el-table-column prop="date" label="鏃ユ湡" width="120" />
-          <el-table-column prop="code" label="鍗曟嵁缂栧彿" width="150" />
+          <el-table-column prop="occurrenceDate" label="鏃ユ湡" width="120" />
+          <el-table-column prop="receiptNumber" label="鍗曟嵁缂栧彿" width="150" />
           <el-table-column prop="type" label="绫诲瀷" width="100">
             <template #default="{ row }">
-              <el-tag :type="row.type === '鍑哄簱' ? 'success' : row.type === '鏀舵' ? 'primary' : 'danger'">{{ row.type }}</el-tag>
+              <el-tag :type="getDetailTypeTagType(row.type)">{{ row.typeLabel }}</el-tag>
             </template>
           </el-table-column>
           <el-table-column prop="amount" label="閲戦" width="120">
             <template #default="{ row }">
-              <span :class="row.type === '鍑哄簱' ? 'text-primary' : row.type === '鏀舵' ? 'text-success' : 'text-danger'">楼{{ formatMoney(row.amount) }}</span>
+              <span :class="getDetailAmountClass(row.type)">楼{{ formatMoney(row.amount) }}</span>
             </template>
           </el-table-column>
           <el-table-column prop="remark" label="澶囨敞" />
         </el-table>
+        <el-empty v-else description="璇ュ鎴锋湰鏈堟殏鏃犳槑缁嗘暟鎹�" :image-size="80" />
 
         <div class="summary-row">
-          <span>鏈熷垵浣欓: <strong class="text-primary">楼{{ formatMoney(generateForm.beginBalance) }}</strong></span>
-          <span>鏈湡搴旀敹: <strong class="text-primary">楼{{ formatMoney(generateForm.currentReceivable) }}</strong></span>
-          <span>鏈湡鏀舵: <strong class="text-success">楼{{ formatMoney(generateForm.currentReceipt) }}</strong></span>
-          <span>鏈熸湯浣欓: <strong :class="calculateEndBalance(generateForm.beginBalance, generateForm.currentReceivable, generateForm.currentReceipt) >= 0 ? 'text-success' : 'text-danger'">楼{{ formatMoney(calculateEndBalance(generateForm.beginBalance, generateForm.currentReceivable, generateForm.currentReceipt)) }}</strong></span>
+          <span>鏈熷垵浣欓: <strong class="text-primary">楼{{ formatMoney(generateForm.openingBalance) }}</strong></span>
+          <span>鏈湡搴旀敹: <strong class="text-primary">楼{{ formatMoney(generateForm.currentPlan) }}</strong></span>
+          <span>鏈湡鏀舵: <strong class="text-success">楼{{ formatMoney(generateForm.currentActually) }}</strong></span>
+          <span>鏈熸湯浣欓: <strong :class="displayClosingBalance >= 0 ? 'text-success' : 'text-danger'">楼{{ formatMoney(displayClosingBalance) }}</strong></span>
         </div>
       </div>
 
-      <div v-else-if="generateForm.customerId && !salesLoading" class="empty-tip">
+      <div v-else-if="generateForm.customerId && generateForm.statementMonth && !salesLoading" class="empty-tip">
         <el-empty description="璇ュ鎴锋湰鏈堟殏鏃犻攢鍞暟鎹�" />
       </div>
 
       <template #footer>
-        <el-button type="primary" @click="confirmGenerate" :disabled="!canGenerate">纭鐢熸垚</el-button>
+        <el-button type="primary" @click="confirmGenerate" :disabled="!canGenerate" :loading="submitLoading">纭鐢熸垚</el-button>
         <el-button @click="generateDialogVisible = false">鍙栨秷</el-button>
       </template>
     </FormDialog>
@@ -151,9 +169,20 @@
 </template>
 
 <script setup>
-import { ref, reactive, onMounted, computed } from "vue";
-import { ElMessage } from "element-plus";
+import { ref, reactive, onMounted, computed, nextTick, getCurrentInstance } from "vue";
+import { ElMessage, ElMessageBox } from "element-plus";
 import FormDialog from "@/components/Dialog/FormDialog.vue";
+import { listCustomer } from "@/api/basicData/customer.js";
+import {
+  getAccountStatementDetailsByMonth,
+  addAccountStatement,
+  listPageAccountStatement,
+  deleteAccountStatement,
+} from "@/api/financialManagement/accountStatement.js";
+
+const ACCOUNT_TYPE_RECEIVABLE = 1;
+
+const { proxy } = getCurrentInstance();
 
 defineOptions({
   name: "搴旀敹瀵硅处",
@@ -172,56 +201,192 @@
 });
 
 const columns = [
-  { label: "瀵硅处鍗曞彿", prop: "statementCode", width: "150" },
+  { label: "瀵硅处鍗曞彿", prop: "statementNumber", width: "150" },
   { label: "瀹㈡埛鍚嶇О", prop: "customerName", width: "180" },
-  { label: "瀵硅处鏈熼棿", prop: "period", width: "150" },
-  { label: "鏈熷垵浣欓", prop: "beginBalance", slot: "beginBalance" },
-  { label: "鏈湡搴旀敹", prop: "currentReceivable", slot: "currentReceivable" },
-  { label: "鏈湡鏀舵", prop: "currentReceipt", slot: "currentReceipt" },
-  { label: "鏈熸湯浣欓", prop: "endBalance", slot: "endBalance" },
-  { label: "鎿嶄綔", prop: "operation", slot: "operation", width: "150", fixed: "right" },
+  { label: "瀵硅处鏈熼棿", prop: "statementMonth", width: "150" },
+  { label: "鏈熷垵浣欓", prop: "openingBalance", dataType: "slot", slot: "openingBalance" },
+  { label: "鏈湡搴旀敹", prop: "currentPlan", dataType: "slot", slot: "currentPlan" },
+  { label: "鏈湡鏀舵", prop: "currentActually", dataType: "slot", slot: "currentActually" },
+  { label: "鏈熸湯浣欓", prop: "closingBalance", dataType: "slot", slot: "closingBalance" },
+  { label: "鎿嶄綔", prop: "operation", dataType: "slot", slot: "operation", width: "200", fixed: "right" },
 ];
 
 const dataList = ref([]);
+const tableLoading = ref(false);
+const submitLoading = ref(false);
 const detailDialogVisible = ref(false);
 const currentCustomer = ref("");
 const currentPeriod = ref("");
 const detailData = ref([]);
+const detailLoading = ref(false);
 
 const generateDialogVisible = ref(false);
 const salesLoading = ref(false);
+const statementDetailLoaded = ref(false);
 const salesData = ref([]);
 const selectedSales = ref([]);
+const salesTableRef = ref(null);
+const customerList = ref([]);
+
+/** 鏄庣粏 type锛�1鍑哄簱 2鍏ュ簱 3鏀舵 4浠樻 5閫�璐� */
+const STATEMENT_DETAIL_TYPE_MAP = {
+  1: "鍑哄簱",
+  2: "鍏ュ簱",
+  3: "鏀舵",
+  4: "浠樻",
+  5: "閫�璐�",
+};
+
+const calculateEndBalance = (openingBalance, currentPlan, currentActually) => {
+  return openingBalance + currentPlan - currentActually;
+};
+
+const getDetailTypeLabel = (type) => STATEMENT_DETAIL_TYPE_MAP[Number(type)] ?? "";
+
+const getDetailTypeTagType = (type) => {
+  const t = Number(type);
+  if (t === 1) return "success";
+  if (t === 3) return "primary";
+  if (t === 5) return "danger";
+  return "info";
+};
+
+const getDetailAmountClass = (type) => {
+  const t = Number(type);
+  if (t === 1) return "text-primary";
+  if (t === 3) return "text-success";
+  return "text-danger";
+};
 
 const generateForm = reactive({
   customerId: "",
   customerName: "",
-  period: "",
-  beginBalance: 0,
-  currentReceivable: 0,
-  currentReceipt: 0,
+  statementMonth: "",
+  openingBalance: 0,
+  currentPlan: 0,
+  currentActually: 0,
+  closingBalance: 0,
+});
+
+const displayClosingBalance = computed(() => {
+  return calculateEndBalance(
+    generateForm.openingBalance,
+    generateForm.currentPlan,
+    generateForm.currentActually
+  );
 });
 
 const canGenerate = computed(() => {
-  return generateForm.customerId && generateForm.period && selectedSales.value.length > 0;
+  return generateForm.customerId && generateForm.statementMonth && selectedSales.value.length > 0;
 });
 
-const customerList = [
-  { id: 1, name: "鍖椾含绉戞妧鏈夐檺鍏徃" },
-  { id: 2, name: "涓婃捣璐告槗鍏徃" },
-  { id: 3, name: "骞垮窞瀹炰笟鏈夐檺鍏徃" },
-  { id: 4, name: "娣卞湷鐢靛瓙鍏徃" },
-];
-
-const mockData = [
-  { id: 1, statementCode: "DZ202401001", customerId: 1, customerName: "鍖椾含绉戞妧鏈夐檺鍏徃", period: "2024-01", beginBalance: 10000, currentReceivable: 15000, currentReceipt: 8000, endBalance: 17000 },
-  { id: 2, statementCode: "DZ202401002", customerId: 2, customerName: "涓婃捣璐告槗鍏徃", period: "2024-01", beginBalance: 5000, currentReceivable: 12000, currentReceipt: 10000, endBalance: 7000 },
-  { id: 3, statementCode: "DZ202402001", customerId: 1, customerName: "鍖椾含绉戞妧鏈夐檺鍏徃", period: "2024-02", beginBalance: 17000, currentReceivable: 20000, currentReceipt: 15000, endBalance: 22000 },
-];
-
-const calculateEndBalance = (beginBalance, currentReceivable, currentReceipt) => {
-  return beginBalance + currentReceivable - currentReceipt;
+const applyStatementSummary = (data) => {
+  generateForm.openingBalance = Number(data.openingBalance ?? 0);
+  generateForm.currentPlan = Number(data.currentPlan ?? 0);
+  generateForm.currentActually = Number(data.currentActually ?? 0);
+  generateForm.closingBalance = Number(
+    data.closingBalance ??
+      calculateEndBalance(
+        generateForm.openingBalance,
+        generateForm.currentPlan,
+        generateForm.currentActually
+      )
+  );
 };
+
+const getCustomerList = () => {
+  listCustomer({ current: -1, size: -1, type: 0 }).then((res) => {
+    if (res.code === 200) {
+      customerList.value = res.data?.records || [];
+    }
+  });
+};
+
+const normalizeSalesRows = (list) => {
+  const rows = Array.isArray(list) ? list : [];
+  return rows.map((item, index) => {
+    const type = Number(item.type);
+    return {
+      id: item.id ?? `detail-${index}`,
+      accountStatementId: item.accountStatementId,
+      occurrenceDate: item.occurrenceDate ?? "",
+      receiptNumber: item.receiptNumber ?? "",
+      type,
+      typeLabel: getDetailTypeLabel(type),
+      amount: Math.abs(Number(item.amount ?? 0)),
+      remark: item.remark ?? "",
+    };
+  });
+};
+
+const selectAllSalesRows = (keepApiSummary = false) => {
+  nextTick(() => {
+    const table = salesTableRef.value;
+    if (!table) return;
+    table.clearSelection();
+    salesData.value.forEach((row) => table.toggleRowSelection(row, true));
+    selectedSales.value = [...salesData.value];
+    if (!keepApiSummary) {
+      calculateSummary();
+    }
+  });
+};
+
+const isNumericId = (id) => id !== undefined && id !== null && id !== "" && /^\d+$/.test(String(id));
+
+const buildFilterParams = (params = {}) => {
+  const result = { ...params, accountType: ACCOUNT_TYPE_RECEIVABLE };
+  if (filters.customerId) {
+    result.customerId = filters.customerId;
+  }
+  if (filters.startMonth && filters.endMonth && filters.startMonth === filters.endMonth) {
+    result.statementMonth = filters.startMonth;
+  } else if (filters.startMonth) {
+    result.startMonth = filters.startMonth;
+  }
+  if (filters.endMonth && filters.startMonth !== filters.endMonth) {
+    result.endMonth = filters.endMonth;
+  }
+  return result;
+};
+
+const buildListParams = () =>
+  buildFilterParams({
+    current: pagination.currentPage,
+    size: pagination.pageSize,
+  });
+
+const buildExportParams = () => buildFilterParams({});
+
+const buildDetailSubmitItem = (row) => {
+  const item = {
+    occurrenceDate: row.occurrenceDate,
+    receiptNumber: row.receiptNumber,
+    type: row.type,
+    amount: row.amount,
+    remark: row.remark ?? "",
+  };
+  if (isNumericId(row.id)) {
+    item.id = Number(row.id);
+  }
+  if (row.accountStatementId) {
+    item.accountStatementId = row.accountStatementId;
+  }
+  return item;
+};
+
+const buildAddPayload = () => ({
+  customerId: generateForm.customerId,
+  customerName: generateForm.customerName,
+  statementMonth: generateForm.statementMonth,
+  accountType: ACCOUNT_TYPE_RECEIVABLE,
+  statementNumber: "",
+  openingBalance: generateForm.openingBalance,
+  currentPlan: generateForm.currentPlan,
+  currentActually: generateForm.currentActually,
+  closingBalance: generateForm.closingBalance,
+  accountStatementDetails: selectedSales.value.map(buildDetailSubmitItem),
+});
 
 const formatMoney = (value) => {
   if (value === undefined || value === null) return "0.00";
@@ -229,15 +394,27 @@
 };
 
 const getTableData = () => {
-  let result = [...mockData];
-  if (filters.customerId) {
-    result = result.filter(item => item.customerId === filters.customerId);
-  }
-  if (filters.startMonth && filters.endMonth) {
-    result = result.filter(item => item.period >= filters.startMonth && item.period <= filters.endMonth);
-  }
-  pagination.total = result.length;
-  dataList.value = result.slice((pagination.currentPage - 1) * pagination.pageSize, pagination.currentPage * pagination.pageSize);
+  tableLoading.value = true;
+  listPageAccountStatement(buildListParams())
+    .then((res) => {
+      const ok = res.code === 200 || res.code === 0;
+      if (ok && res.data) {
+        pagination.total = res.data.total ?? 0;
+        dataList.value = res.data.records ?? [];
+      } else {
+        ElMessage.error(res.msg || "鏌ヨ澶辫触");
+        dataList.value = [];
+        pagination.total = 0;
+      }
+    })
+    .catch(() => {
+      dataList.value = [];
+      pagination.total = 0;
+      ElMessage.error("鏌ヨ澶辫触");
+    })
+    .finally(() => {
+      tableLoading.value = false;
+    });
 };
 
 const resetFilters = () => {
@@ -257,83 +434,97 @@
 const generateStatement = () => {
   generateForm.customerId = "";
   generateForm.customerName = "";
-  generateForm.period = "";
-  generateForm.beginBalance = 0;
-  generateForm.currentReceivable = 0;
-  generateForm.currentReceipt = 0;
+  generateForm.statementMonth = "";
+  generateForm.openingBalance = 0;
+  generateForm.currentPlan = 0;
+  generateForm.currentActually = 0;
+  generateForm.closingBalance = 0;
+  statementDetailLoaded.value = false;
   salesData.value = [];
   selectedSales.value = [];
   generateDialogVisible.value = true;
 };
 
 const onCustomerChange = (customerId) => {
-  const customer = customerList.find(item => item.id === customerId);
-  if (customer) {
-    generateForm.customerName = customer.name;
-  }
+  const customer = customerList.value.find((item) => item.id === customerId);
+  generateForm.customerName = customer?.customerName ?? "";
   loadSalesData();
 };
 
-const onPeriodChange = () => {
+const onStatementMonthChange = () => {
   loadSalesData();
 };
 
 const loadSalesData = () => {
-  if (!generateForm.customerId || !generateForm.period) {
+  if (!generateForm.customerId || !generateForm.statementMonth) {
     salesData.value = [];
+    selectedSales.value = [];
+    statementDetailLoaded.value = false;
+    generateForm.openingBalance = 0;
+    generateForm.currentPlan = 0;
+    generateForm.currentActually = 0;
+    generateForm.closingBalance = 0;
     return;
   }
 
   salesLoading.value = true;
+  selectedSales.value = [];
+  statementDetailLoaded.value = false;
 
-  setTimeout(() => {
-    const mockSalesData = [
-      { id: 1, date: generateForm.period + "-03", code: "CK2024001", type: "鍑哄簱", amount: 8000, remark: "浜у搧A閿�鍞�" },
-      { id: 2, date: generateForm.period + "-08", code: "SK2024001", type: "鏀舵", amount: 5000, remark: "瀹㈡埛鍥炴" },
-      { id: 3, date: generateForm.period + "-12", code: "CK2024002", type: "鍑哄簱", amount: 12000, remark: "浜у搧B閿�鍞�" },
-      { id: 4, date: generateForm.period + "-15", code: "TH2024001", type: "閫�璐�", amount: 2000, remark: "璐ㄩ噺闂閫�璐�" },
-      { id: 5, date: generateForm.period + "-20", code: "CK2024003", type: "鍑哄簱", amount: 5000, remark: "浜у搧C閿�鍞�" },
-      { id: 6, date: generateForm.period + "-25", code: "SK2024002", type: "鏀舵", amount: 8000, remark: "瀹㈡埛鍥炴" },
-    ];
+  getAccountStatementDetailsByMonth({
+    accountType: ACCOUNT_TYPE_RECEIVABLE,
+    customerId: generateForm.customerId,
+    statementMonth: generateForm.statementMonth,
+  })
+    .then((res) => {
+      if (res.code === 200) {
+        const data = res.data ?? {};
+        const details = data.accountStatementDetails;
+        const list = Array.isArray(details) ? details : [];
+        salesData.value = normalizeSalesRows(list);
+        applyStatementSummary(data);
+        statementDetailLoaded.value = true;
 
-    salesData.value = mockSalesData;
-
-    const lastPeriod = getLastPeriod(generateForm.period);
-    const lastStatement = mockData.find(item =>
-      item.customerId === generateForm.customerId && item.period === lastPeriod
-    );
-    generateForm.beginBalance = lastStatement ? lastStatement.endBalance : 0;
-
-    calculateSummary();
-
-    salesLoading.value = false;
-  }, 500);
-};
-
-const getLastPeriod = (period) => {
-  const [year, month] = period.split("-").map(Number);
-  if (month === 1) {
-    return `${year - 1}-12`;
-  }
-  return `${year}-${String(month - 1).padStart(2, "0")}`;
+        if (salesData.value.length > 0) {
+          selectAllSalesRows(true);
+        }
+      } else {
+        salesData.value = [];
+        statementDetailLoaded.value = false;
+        ElMessage.error(res.msg || "鏌ヨ瀵硅处鏄庣粏澶辫触");
+      }
+    })
+    .catch(() => {
+      salesData.value = [];
+      statementDetailLoaded.value = false;
+      ElMessage.error("鏌ヨ瀵硅处鏄庣粏澶辫触");
+    })
+    .finally(() => {
+      salesLoading.value = false;
+    });
 };
 
 const calculateSummary = () => {
   let receivable = 0;
   let receipt = 0;
 
-  selectedSales.value.forEach(item => {
-    if (item.type === "鍑哄簱") {
+  selectedSales.value.forEach((item) => {
+    if (item.type === 1) {
       receivable += item.amount;
-    } else if (item.type === "閫�璐�") {
+    } else if (item.type === 5) {
       receivable -= item.amount;
-    } else if (item.type === "鏀舵") {
+    } else if (item.type === 3) {
       receipt += item.amount;
     }
   });
 
-  generateForm.currentReceivable = receivable;
-  generateForm.currentReceipt = receipt;
+  generateForm.currentPlan = receivable;
+  generateForm.currentActually = receipt;
+  generateForm.closingBalance = calculateEndBalance(
+    generateForm.openingBalance,
+    generateForm.currentPlan,
+    generateForm.currentActually
+  );
 };
 
 const handleSalesSelectionChange = (selection) => {
@@ -342,51 +533,127 @@
 };
 
 const confirmGenerate = () => {
-  const newId = mockData.length > 0 ? Math.max(...mockData.map(item => item.id)) + 1 : 1;
-  const endBalance = calculateEndBalance(generateForm.beginBalance, generateForm.currentReceivable, generateForm.currentReceipt);
+  if (!canGenerate.value) return;
+  submitLoading.value = true;
+  addAccountStatement(buildAddPayload())
+    .then((res) => {
+      if (res.code === 200) {
+        generateDialogVisible.value = false;
+        ElMessage.success("瀵硅处鍗曠敓鎴愭垚鍔�");
+        pagination.currentPage = 1;
+        getTableData();
+      } else {
+        ElMessage.error(res.msg || "鐢熸垚澶辫触");
+      }
+    })
+    .catch(() => {
+      ElMessage.error("鐢熸垚澶辫触");
+    })
+    .finally(() => {
+      submitLoading.value = false;
+    });
+};
 
-  mockData.unshift({
-    id: newId,
-    statementCode: "DZ" + Date.now(),
-    customerId: generateForm.customerId,
-    customerName: generateForm.customerName,
-    period: generateForm.period,
-    beginBalance: generateForm.beginBalance,
-    currentReceivable: generateForm.currentReceivable,
-    currentReceipt: generateForm.currentReceipt,
-    endBalance,
+const handleDelete = (row) => {
+  ElMessageBox.confirm(`纭鍒犻櫎瀵硅处鍗曘��${row.statementNumber || row.id}銆嶅悧锛焋, "鎻愮ず", {
+    confirmButtonText: "纭畾",
+    cancelButtonText: "鍙栨秷",
+    type: "warning",
+  }).then(() => {
+    deleteAccountStatement([row.id])
+      .then((res) => {
+        if (res.code === 200) {
+          ElMessage.success("鍒犻櫎鎴愬姛");
+          getTableData();
+        } else {
+          ElMessage.error(res.msg || "鍒犻櫎澶辫触");
+        }
+      })
+      .catch(() => {
+        ElMessage.error("鍒犻櫎澶辫触");
+      });
+  });
+};
+
+const buildDetailTableFromApi = (data, statementMonth) => {
+  const details = Array.isArray(data.accountStatementDetails) ? data.accountStatementDetails : [];
+  let runningBalance = Number(data.openingBalance ?? 0);
+  const rows = [
+    {
+      date: statementMonth ?? "",
+      type: "鏈熷垵",
+      code: "-",
+      debit: 0,
+      credit: 0,
+      balance: runningBalance,
+      remark: "鏈熷垵浣欓",
+    },
+  ];
+
+  details.forEach((item) => {
+    const amount = Math.abs(Number(item.amount ?? 0));
+    const type = Number(item.type);
+    let debit = 0;
+    let credit = 0;
+
+    if (type === 1) {
+      debit = amount;
+      runningBalance += amount;
+    } else if (type === 3 || type === 5) {
+      credit = amount;
+      runningBalance -= amount;
+    }
+
+    rows.push({
+      date: item.occurrenceDate ?? "",
+      type: getDetailTypeLabel(type),
+      code: item.receiptNumber ?? "",
+      debit,
+      credit,
+      balance: runningBalance,
+      remark: item.remark ?? "",
+    });
   });
 
-  generateDialogVisible.value = false;
-  ElMessage.success("瀵硅处鍗曠敓鎴愭垚鍔�");
-  getTableData();
+  return rows;
 };
 
 const viewDetail = (row) => {
-  currentCustomer.value = row.customerName;
-  currentPeriod.value = row.period;
+  if (!row.customerId || !row.statementMonth) {
+    ElMessage.warning("缂哄皯瀹㈡埛鎴栧璐︽湀浠斤紝鏃犳硶鏌ヨ鏄庣粏");
+    return;
+  }
 
-  const saleOutAmount = Math.floor(row.currentReceivable * 0.6);
-  const returnAmount = Math.floor(row.currentReceivable * 0.1);
-  const firstReceipt = Math.floor(row.currentReceipt * 0.4);
-  const secondReceipt = row.currentReceipt - firstReceipt;
-
-  let runningBalance = row.beginBalance;
-
-  detailData.value = [
-    { date: row.period + "-01", type: "鏈熷垵", code: "-", debit: 0, credit: 0, balance: runningBalance, remark: "鏈熷垵浣欓" },
-    { date: row.period + "-05", type: "鍑哄簱", code: "CK2024001", debit: saleOutAmount, credit: 0, balance: runningBalance += saleOutAmount, remark: "閿�鍞嚭搴�" },
-    { date: row.period + "-10", type: "鏀舵", code: "SK2024001", debit: 0, credit: firstReceipt, balance: runningBalance -= firstReceipt, remark: "瀹㈡埛鍥炴" },
-    { date: row.period + "-15", type: "鍑哄簱", code: "CK2024002", debit: row.currentReceivable - saleOutAmount - returnAmount, credit: 0, balance: runningBalance += (row.currentReceivable - saleOutAmount - returnAmount), remark: "閿�鍞嚭搴�" },
-    { date: row.period + "-20", type: "閫�璐�", code: "TH2024001", debit: 0, credit: returnAmount, balance: runningBalance -= returnAmount, remark: "閿�鍞��璐�" },
-    { date: row.period + "-25", type: "鏀舵", code: "SK2024002", debit: 0, credit: secondReceipt, balance: runningBalance -= secondReceipt, remark: "瀹㈡埛鍥炴" },
-  ];
-
+  currentCustomer.value = row.customerName ?? "";
+  currentPeriod.value = row.statementMonth ?? "";
+  detailData.value = [];
   detailDialogVisible.value = true;
+  detailLoading.value = true;
+
+  getAccountStatementDetailsByMonth({
+    accountType: ACCOUNT_TYPE_RECEIVABLE,
+    customerId: row.customerId,
+    statementMonth: row.statementMonth,
+  })
+    .then((res) => {
+      if (res.code === 200) {
+        detailData.value = buildDetailTableFromApi(res.data ?? {}, row.statementMonth);
+      } else {
+        ElMessage.error(res.msg || "鏌ヨ鏄庣粏澶辫触");
+        detailDialogVisible.value = false;
+      }
+    })
+    .catch(() => {
+      ElMessage.error("鏌ヨ鏄庣粏澶辫触");
+      detailDialogVisible.value = false;
+    })
+    .finally(() => {
+      detailLoading.value = false;
+    });
 };
 
 const printStatement = (row) => {
-  ElMessage.info(`鎵撳嵃瀵硅处鍗�: ${row.statementCode}`);
+  ElMessage.info(`鎵撳嵃瀵硅处鍗�: ${row.statementNumber}`);
 };
 
 const printDetail = () => {
@@ -394,10 +661,12 @@
 };
 
 const handleOut = () => {
-  ElMessage.success("瀵煎嚭鎴愬姛");
+  const params = buildExportParams();
+  proxy.download("/accountStatement/exportAccountStatement", params, `搴旀敹瀵硅处鍗昣${Date.now()}.xlsx`);
 };
 
 onMounted(() => {
+  getCustomerList();
   getTableData();
 });
 </script>
diff --git a/src/views/financialManagement/revenueManagement/Modal.vue b/src/views/financialManagement/revenueManagement/Modal.vue
deleted file mode 100644
index 7dd6865..0000000
--- a/src/views/financialManagement/revenueManagement/Modal.vue
+++ /dev/null
@@ -1,177 +0,0 @@
-<template>
-  <FormDialog
-    v-model="dialogVisible"
-    :title="dialogTitle"
-    :operationType="operationType"
-    width="30%"
-    @confirm="sendForm"
-    @close="close"
-    @cancel="close"
-  >
-    <el-form :model="form" label-width="100px" :rules="formRules" ref="formRef">
-      <el-form-item label="鏀跺叆鏃ユ湡" prop="incomeDate">
-        <el-date-picker
-          style="width: 100%"
-          v-model="form.incomeDate"
-          format="YYYY-MM-DD"
-          value-format="YYYY-MM-DD"
-          type="date"
-          placeholder="璇烽�夋嫨鏃ユ湡"
-          clearable
-        />
-      </el-form-item>
-      <el-form-item label="鏀跺叆绫诲瀷" prop="incomeType">
-        <el-select
-          v-model="form.incomeType"
-          placeholder="璇烽�夋嫨"
-          clearable
-        >
-          <el-option :label="item.label" :value="item.value" v-for="(item,index) in income_types.filter(item => item.value != 3)" :key="index" />
-        </el-select>
-      </el-form-item>
-      <el-form-item label="瀹㈡埛鍚嶇О" prop="customerName">
-        <el-input v-model="form.customerName" placeholder="璇疯緭鍏�" />
-      </el-form-item>
-      <el-form-item label="鏀跺叆閲戦" prop="incomeMoney">
-        <el-input-number :step="0.01" :min="0" style="width: 100%"
-          v-model="form.incomeMoney"
-          placeholder="璇疯緭鍏�"
-        />
-      </el-form-item>
-      <el-form-item label="鏀跺叆鎻忚堪" prop="incomeDescribed">
-        <el-input v-model="form.incomeDescribed" placeholder="璇疯緭鍏�" />
-      </el-form-item>
-      <el-form-item label="鏀舵鏂瑰紡" prop="incomeMethod">
-        <el-select
-          v-model="form.incomeMethod"
-          placeholder="璇烽�夋嫨"
-          clearable
-        >
-          <el-option :label="item.label" :value="item.value" v-for="(item,index) in payment_methods" :key="index" />
-        </el-select>
-      </el-form-item>
-      <el-form-item label="鍙戠エ鍙风爜" prop="invoiceNumber">
-        <el-input v-model="form.invoiceNumber" placeholder="璇疯緭鍏�" />
-      </el-form-item>
-      <el-form-item label="澶囨敞" prop="note">
-        <el-input
-          v-model="form.note"
-          placeholder="澶囨敞"
-        />
-      </el-form-item>
-    </el-form>
-  </FormDialog>
-</template>
-
-<script setup>
-import { add, update, getAccountIncome } from "@/api/financialManagement/revenueManagement";
-import { ElMessage } from "element-plus";
-import useFormData from "@/hooks/useFormData";
-import FormDialog from "@/components/Dialog/FormDialog.vue";
-import { ref } from "vue";
-
-const { proxy } = getCurrentInstance()
-
-defineOptions({
-  name: "鏀跺叆鏂板缂栬緫",
-});
-
-const emits = defineEmits(["success"]);
-
-const formRef = ref(null);
-const dialogVisible = ref(false);
-const operationType = ref("add"); // add | edit
-const id = ref(undefined);
-const submitting = ref(false);
-
-const dialogTitle = (type) => {
-  if (type === "edit") return "缂栬緫鏀跺叆";
-  return "鏂板鏀跺叆";
-};
-
-const { income_types } = proxy.useDict("income_types");
-const { payment_methods } = proxy.useDict("payment_methods");
-
-const formRules = {
-  customerName: [{ required: true, trigger: "blur", message: "璇疯緭鍏�" }],
-  incomeMoney: [{ required: true, trigger: "blur", message: "璇疯緭鍏�" }],
-  incomeDescribed: [{ required: true, trigger: "blur", message: "璇疯緭鍏�" }],
-  incomeDate: [{ required: true, trigger: "change", message: "璇烽�夋嫨" }],
-  incomeType: [{ required: true, trigger: "change", message: "璇烽�夋嫨" }],
-  incomeMethod: [{ required: true, trigger: "change", message: "璇烽�夋嫨" }],
-}
-
-const { form, resetForm } = useFormData({
-  incomeDate: undefined, // 鏀跺叆鏃ユ湡
-  incomeType: undefined, // 鏀跺叆绫诲瀷
-  customerName: undefined, // 瀹㈡埛鍚嶇О
-  incomeMoney: undefined, // 鏀跺叆閲戦
-  incomeDescribed: undefined, // 鏀跺叆鎻忚堪
-  incomeMethod: undefined, // 鏀舵鏂瑰紡
-  invoiceNumber: undefined, // 鍙戠エ鍙风爜
-  note: undefined, // 澶囨敞
-});
-
-const sendForm = () => {
-  if (submitting.value) return;
-  formRef.value?.validate(async (valid) => {
-    if (valid) {
-      submitting.value = true;
-      try {
-        const { code } = id.value
-          ? await update({ id: id.value, ...form })
-          : await add(form);
-        if (code == 200) {
-          emits("success");
-          ElMessage({ message: "鎿嶄綔鎴愬姛", type: "success" });
-          close();
-        }
-      } finally {
-        submitting.value = false;
-      }
-    }
-  })
-};
-
-const close = () => {
-  resetForm();
-  formRef.value?.clearValidate();
-  id.value = undefined;
-  dialogVisible.value = false;
-};
-
-const loadForm = async (rowId) => {
-  operationType.value = "edit";
-  id.value = rowId;
-  dialogVisible.value = true;
-  if (rowId) {
-    const { code, data } = await getAccountIncome(rowId);
-    if (code == 200) {
-      form.incomeDate = data.incomeDate;
-      form.incomeType = data.incomeType;
-      form.customerName = data.customerName;
-      form.incomeMoney = data.incomeMoney;
-      form.incomeDescribed = data.incomeDescribed;
-      form.incomeMethod = data.incomeMethod;
-      form.invoiceNumber = data.invoiceNumber;
-      form.note = data.note;
-    }
-  } else {
-    resetForm();
-    formRef.value?.clearValidate();
-  }
-};
-
-const openModal = () => {
-  operationType.value = "add";
-  id.value = undefined;
-  resetForm();
-  formRef.value?.clearValidate();
-  dialogVisible.value = true;
-};
-
-defineExpose({
-  openModal,
-  loadForm,
-});
-</script>
diff --git a/src/views/financialManagement/revenueManagement/index.vue b/src/views/financialManagement/revenueManagement/index.vue
deleted file mode 100644
index bcef5b6..0000000
--- a/src/views/financialManagement/revenueManagement/index.vue
+++ /dev/null
@@ -1,355 +0,0 @@
-<template>
-  <div class="app-container">
-    <el-form :model="filters" :inline="true">
-      <el-form-item label="鏀跺叆鏃ユ湡:">
-        <el-date-picker v-model="filters.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="daterange"
-                        placeholder="璇烽�夋嫨" clearable @change="changeDaterange"/>
-      </el-form-item>
-      <el-form-item label="鏀舵鏂瑰紡:">
-        <el-select
-            v-model="filters.incomeMethodLabel"
-            placeholder="璇烽�夋嫨"
-            clearable
-            style="width: 200px;"
-        >
-          <el-option
-              v-for="item in incomeMethodOptions"
-              :key="item.value"
-              :label="item.label"
-              :value="item.value"
-          />
-        </el-select>
-      </el-form-item>
-      <el-form-item>
-        <el-button type="primary" @click="getTableData">鎼滅储</el-button>
-        <el-button @click="resetFilters">閲嶇疆</el-button>
-      </el-form-item>
-    </el-form>
-    <div class="table_list">
-      <div class="actions">
-        <div></div>
-        <div>
-          <el-button type="primary" @click="add" icon="Plus"> 鏂板</el-button>
-          <el-button @click="handleOut" icon="download">瀵煎嚭</el-button>
-          <el-button
-              type="danger"
-              icon="Delete"
-              :disabled="multipleList.length <= 0 || hasBusinessIdInSelection"
-              @click="handleBatchDelete"
-          >
-            鎵归噺鍒犻櫎
-          </el-button>
-        </div>
-      </div>
-      <PIMTable
-          rowKey="id"
-          isSelection
-          :column="columns"
-          :tableData="dataList"
-          :page="{
-          current: pagination.currentPage,
-          size: pagination.pageSize,
-          total: pagination.total,
-        }"
-          :isShowSummary="true"
-          :summaryMethod="summarizeMainTable"
-          @selection-change="handleSelectionChange"
-          @pagination="changePage"
-      >
-        <template #incomeMethodSlot="{ row }">
-          <el-tag>
-            {{ getIncomeMethodLabel(row) }}
-          </el-tag>
-        </template>
-        <template #operation="{ row }">
-          <el-button
-              type="primary"
-              link
-              :disabled="!!row.businessId"
-              @click="edit(row.id)"
-          >
-            缂栬緫
-          </el-button>
-          <el-button
-              type="primary"
-              link
-              @click="openFilesFormDia(row)"
-          >
-            闄勪欢
-          </el-button>
-        </template>
-      </PIMTable>
-    </div>
-    <Modal ref="modalRef" @success="getTableData"></Modal>
-    <FileListDialog v-if="fileListDialogVisible" :record-id="currentRecordId" record-type="account_income" v-model:visible="fileListDialogVisible"/>
-  </div>
-</template>
-
-<script setup>
-import {usePaginationApi} from "@/hooks/usePaginationApi";
-import {listPage, delAccountIncome} from "@/api/financialManagement/revenueManagement";
-import {onMounted, getCurrentInstance, ref, computed} from "vue";
-import {ElMessageBox, ElMessage} from "element-plus";
-import dayjs from "dayjs";
-
-defineOptions({
-  name: "鏀跺叆绠$悊",
-});
-
-// 琛ㄦ牸澶氶�夋閫変腑椤�
-const multipleList = ref([]);
-const {proxy} = getCurrentInstance();
-const modalRef = ref();
-const {payment_methods} = proxy.useDict("payment_methods");
-const {receipt_payment_type} = proxy.useDict("receipt_payment_type");
-const {income_types} = proxy.useDict("income_types");
-const fileListRef = ref(null);
-const fileListDialogVisible = ref(false);
-const currentRecordId = ref(0);
-
-const incomeMethodOptions = computed(() => {
-  const merged = [...(payment_methods.value || []), ...(receipt_payment_type.value || [])];
-  const uniqueMap = new Map();
-  merged.forEach((item) => {
-    const label = item?.label;
-    if (!label) return;
-    if (!uniqueMap.has(label)) {
-      uniqueMap.set(label, {label, value: label});
-    }
-  });
-  return Array.from(uniqueMap.values());
-});
-
-const {
-  filters,
-  columns,
-  dataList,
-  pagination,
-  getTableData,
-  resetFilters,
-  onCurrentChange,
-} = usePaginationApi(
-    listPage,
-    {
-      incomeMethodLabel: undefined,
-      entryDate: undefined,
-    },
-    [
-      {
-        label: "鏀跺叆鏃ユ湡",
-        prop: "incomeDate",
-      },
-      {
-        label: "鏀跺叆绫诲瀷",
-        prop: "incomeType",
-        dataType: "tag",
-        formatData: (params) => {
-          if (income_types.value.find((m) => m.value == params)) {
-            return income_types.value.find((m) => m.value == params).label;
-          } else {
-            return null
-          }
-        },
-      },
-      {
-        label: "瀹㈡埛鍚嶇О",
-        prop: "customerName",
-        width: '200'
-
-      },
-      {
-        label: "鏀跺叆閲戦",
-        prop: "incomeMoney",
-
-      },
-      {
-        label: "鏀跺叆鎻忚堪",
-        prop: "incomeDescribed",
-
-      },
-      {
-        label: "鏀舵鏂瑰紡",
-        prop: "incomeMethodLabel",
-        align: 'center',
-        width: '100',
-        dataType: "slot",
-        slot: "incomeMethodSlot",
-      },
-      {
-        label: "鍙戠エ鍙风爜",
-        prop: "invoiceNumber",
-
-      },
-      {
-        label: "澶囨敞",
-        prop: "note",
-
-      },
-      {
-        label: "褰曞叆浜�",
-        prop: "inputUser",
-      },
-      {
-        label: "褰曞叆鏃ユ湡",
-        prop: "inputTime",
-
-      },
-      {
-        fixed: "right",
-        label: "鎿嶄綔",
-        dataType: "slot",
-        slot: "operation",
-        align: "center",
-        width: "160px",
-      },
-    ],
-    undefined,
-    {
-      incomeMethodLabel: (value) => ({
-        incomeMethodLabel: value || undefined,
-      }),
-    }
-);
-
-// 琛ㄦ牸鍚堣锛氭敹鍏ラ噾棰�
-const summarizeMainTable = (param) => {
-  return proxy.summarizeTable(param, ["incomeMoney"]);
-};
-
-const getIncomeMethodLabel = (row) => {
-  const methodValue = row?.incomeMethod;
-  const dictList = String(row?.businessType) === "1"
-      ? receipt_payment_type.value
-      : payment_methods.value;
-  return dictList.find((item) => item.value == methodValue)?.label || "--";
-};
-
-// 澶氶�夊悗鍋氫粈涔�
-const handleSelectionChange = (selectionList) => {
-  multipleList.value = selectionList;
-};
-
-// 鍒ゆ柇閫変腑鐨勯」涓槸鍚︽湁 businessId
-const hasBusinessIdInSelection = computed(() => {
-  return multipleList.value.some(item => item.businessId);
-});
-
-const add = () => {
-  modalRef.value.openModal();
-};
-const edit = (id) => {
-  // 妫�鏌ュ綋鍓嶈鏄惁鏈� businessId
-  const row = dataList.value.find(item => item.id === id);
-  if (row && row.businessId) {
-    proxy.$modal.msgWarning("璇ヨ褰曞凡鍏宠仈涓氬姟锛屼笉鑳界紪杈�");
-    return;
-  }
-  modalRef.value.loadForm(id);
-};
-const changePage = ({page, limit}) => {
-  pagination.currentPage = page;
-  pagination.pageSize = limit;
-  onCurrentChange(page);
-};
-const deleteRow = (id) => {
-  // 濡傛灉鏄暟缁勶紝妫�鏌ユ槸鍚︽湁 businessId
-  if (Array.isArray(id)) {
-    const hasBusinessId = id.some(itemId => {
-      const row = dataList.value.find(item => item.id === itemId);
-      return row && row.businessId;
-    });
-    if (hasBusinessId) {
-      proxy.$modal.msgWarning("閫変腑鐨勮褰曚腑鍖呭惈宸插叧鑱斾笟鍔$殑璁板綍锛屼笉鑳藉垹闄�");
-      return;
-    }
-  } else {
-    // 鍗曚釜鍒犻櫎锛屾鏌ユ槸鍚︽湁 businessId
-    const row = dataList.value.find(item => item.id === id);
-    if (row && row.businessId) {
-      proxy.$modal.msgWarning("璇ヨ褰曞凡鍏宠仈涓氬姟锛屼笉鑳藉垹闄�");
-      return;
-    }
-  }
-
-  ElMessageBox.confirm("姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ユ暟鎹�, 鏄惁缁х画?", "鎻愮ず", {
-    confirmButtonText: "纭畾",
-    cancelButtonText: "鍙栨秷",
-    type: "warning",
-  }).then(async () => {
-    const {code} = await delAccountIncome(id);
-    if (code == 200) {
-      ElMessage({
-        type: "success",
-        message: "鍒犻櫎鎴愬姛",
-      });
-      getTableData();
-    }
-  });
-};
-
-// 鎵归噺鍒犻櫎
-const handleBatchDelete = () => {
-  if (multipleList.value.length === 0) {
-    proxy.$modal.msgWarning("璇烽�夋嫨瑕佸垹闄ょ殑鏁版嵁");
-    return;
-  }
-
-  // 妫�鏌ユ槸鍚︽湁 businessId
-  if (hasBusinessIdInSelection.value) {
-    proxy.$modal.msgWarning("閫変腑鐨勮褰曚腑鍖呭惈宸插叧鑱斾笟鍔$殑璁板綍锛屼笉鑳藉垹闄�");
-    return;
-  }
-
-  const ids = multipleList.value.map((item) => item.id);
-  deleteRow(ids);
-};
-
-const changeDaterange = (value) => {
-  if (value) {
-    filters.entryDate = value;
-    filters.entryDateStart = dayjs(value[0]).format("YYYY-MM-DD");
-    filters.entryDateEnd = dayjs(value[1]).format("YYYY-MM-DD");
-  } else {
-    filters.entryDate = null;
-    filters.entryDateStart = undefined;
-    filters.entryDateEnd = undefined;
-  }
-  getTableData();
-};
-
-const handleOut = () => {
-  ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
-    confirmButtonText: "纭",
-    cancelButtonText: "鍙栨秷",
-    type: "warning",
-  })
-      .then(() => {
-        proxy.download(`/account/accountIncome/export`, {}, "鏀跺叆鍙拌处.xlsx");
-      })
-      .catch(() => {
-        proxy.$modal.msg("宸插彇娑�");
-      });
-};
-// 鎵撳紑闄勪欢寮规
-const openFilesFormDia = async (row) => {
-  currentRecordId.value = row.id;
-  fileListDialogVisible.value = true;
-};
-
-onMounted(() => {
-  getTableData();
-});
-</script>
-
-<style lang="scss" scoped>
-.table_list {
-  margin-top: unset;
-}
-
-.actions {
-  display: flex;
-  justify-content: space-between;
-  margin-bottom: 10px;
-}
-</style>
-
diff --git a/src/views/financialManagement/salesRefund/components/ReceiptandRefundPopupWindow.vue b/src/views/financialManagement/salesRefund/components/ReceiptandRefundPopupWindow.vue
deleted file mode 100644
index 35215a5..0000000
--- a/src/views/financialManagement/salesRefund/components/ReceiptandRefundPopupWindow.vue
+++ /dev/null
@@ -1,227 +0,0 @@
-<template>
-  <FormDialog v-model="visible" title="鏀舵/閫�娆�" width="90%" @confirm="submit" @cancel="visible=false">
-    <div class="section">
-      <div class="section-title descriptions">鍩虹璧勬枡</div>
-      <el-form :model="form" label-width="100px">
-        <el-row :gutter="20">
-          <el-col :span="6">
-            <el-form-item label="鍗曟嵁缂栧彿">
-              <el-input v-model="form.billNo" placeholder="浣跨敤绯荤粺缂栧彿" />
-            </el-form-item>
-          </el-col>
-          <el-col :span="6">
-            <el-form-item label="瀹㈡埛">
-              <el-select v-model="form.customerId" placeholder="璇烽�夋嫨">
-                <el-option v-for="c in customerOptions" :key="c.value" :label="c.label" :value="c.value" />
-              </el-select>
-            </el-form-item>
-          </el-col>
-          <el-col :span="6">
-            <el-form-item label="鍒跺崟浜�">
-              <el-select v-model="form.makerId" placeholder="璇烽�夋嫨">
-                <el-option v-for="u in userOptions" :key="u.value" :label="u.label" :value="u.value" />
-              </el-select>
-            </el-form-item>
-          </el-col>
-          <el-col :span="6">
-            <el-form-item label="鍒跺崟鏃ユ湡">
-              <el-date-picker v-model="form.makeDate" type="date" value-format="YYYY-MM-DD" />
-            </el-form-item>
-          </el-col>
-          <el-col :span="6">
-            <el-form-item label="鐢宠閮ㄩ棬">
-              <el-select v-model="form.applyDeptId" placeholder="璇烽�夋嫨">
-                <el-option v-for="d in deptOptions" :key="d.value" :label="d.label" :value="d.value" />
-              </el-select>
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="澶囨敞">
-              <el-input v-model="form.remark" maxlength="100" show-word-limit placeholder="璇疯緭鍏�" />
-            </el-form-item>
-          </el-col>
-          <el-col :span="6">
-            <el-form-item label="闄勪欢">
-              <el-upload :action="uploadUrl" :headers="uploadHeaders" name="files" :on-success="onUploadSuccess">
-                <el-button>涓婁紶鏂囦欢</el-button>
-              </el-upload>
-            </el-form-item>
-          </el-col>
-        </el-row>
-      </el-form>
-    </div>
-
-    <div class="section">
-      <div class="toolbar">
-      <div class="section-title descriptions">浠樻鍒楄〃</div>
-        <el-input v-model="form.discountAmount" placeholder="浼樻儬閲戦" style="width:240px" />
-      </div>
-      <el-table :data="form.paymentList" border>
-        <el-table-column label="浠樻璐﹀彿" minWidth="160">
-          <template #default="scope">
-            <el-input v-model="scope.row.accountNo" placeholder="璇疯緭鍏�" />
-          </template>
-        </el-table-column>
-        <el-table-column label="浠樻璐﹀彿鍚嶇О" minWidth="180">
-          <template #default="scope">
-            <el-select v-model="scope.row.accountName" placeholder="璇烽�夋嫨">
-              <el-option v-for="a in accountOptions" :key="a.value" :label="a.label" :value="a.label" />
-            </el-select>
-          </template>
-        </el-table-column>
-        <el-table-column label="浠樻鏂瑰紡" minWidth="140">
-          <template #default="scope">
-            <el-select v-model="scope.row.payMethod" placeholder="璇烽�夋嫨">
-              <el-option v-for="m in payMethodOptions" :key="m.value" :label="m.label" :value="m.value" />
-            </el-select>
-          </template>
-        </el-table-column>
-        <el-table-column label="瀹為檯浠樻閲戦" minWidth="160">
-          <template #default="scope">
-            <el-input v-model="scope.row.amount" placeholder="璇疯緭鍏�" />
-          </template>
-        </el-table-column>
-        <el-table-column label="鎵嬬画璐�" minWidth="140">
-          <template #default="scope">
-            <el-input v-model="scope.row.fee" placeholder="璇疯緭鍏�" />
-          </template>
-        </el-table-column>
-        <el-table-column label="浜ゆ槗鍙�/绁ㄦ嵁鍙�" minWidth="180">
-          <template #default="scope">
-            <el-input v-model="scope.row.txNo" placeholder="璇疯緭鍏�" />
-          </template>
-        </el-table-column>
-        <el-table-column label="澶囨敞" minWidth="200">
-          <template #default="scope">
-            <el-input v-model="scope.row.remark" maxlength="30" show-word-limit placeholder="璇疯緭鍏�" />
-          </template>
-        </el-table-column>
-        <el-table-column label="鎿嶄綔" minWidth="120" fixed="right">
-          <template #default="scope">
-            <el-button link type="primary" @click="addPayment">鏂板涓�琛�</el-button>
-            <el-button link type="danger" @click="removePayment(scope.$index)">鍒犻櫎</el-button>
-          </template>
-        </el-table-column>
-      </el-table>
-      <div class="summary">鍚堣</div>
-    </div>
-
-    <div class="section">
-      <div class="section-container">
-        <div class="section-title descriptions">婧愬崟淇℃伅</div>
-      <div class="source-toolbar">
-        <el-button @click="clearSource">娓呯┖</el-button>
-        <el-button @click="selectSource">閫夋嫨婧愬崟</el-button>
-        <el-button type="primary" @click="autoWriteOff">鑷姩鏍搁攢</el-button>
-      </div>
-      </div>
-      <el-table :data="form.sourceList" border>
-        <el-table-column label="鍗曟嵁鏃ユ湡" minWidth="160" prop="billDate" />
-        <el-table-column label="鍗曟嵁绫诲瀷" minWidth="160" prop="billType" />
-        <el-table-column label="鍗曟嵁缂栧彿" minWidth="200" prop="billNo" />
-        <el-table-column label="鍗曟嵁閲戦" minWidth="120" prop="billAmount" />
-        <el-table-column label="宸叉牳閿�閲戦" minWidth="120" prop="wroteAmount" />
-        <el-table-column label="鏈牳閿�閲戦" minWidth="120" prop="unWroteAmount" />
-        <el-table-column label="鏈鏍搁攢閲戦" minWidth="160">
-          <template #default="scope">
-            <el-input v-model="scope.row.thisWriteOffAmount" />
-          </template>
-        </el-table-column>
-        <el-table-column label="鎿嶄綔" width="100" fixed="right">
-          <template #default="scope">
-            <el-button link type="danger" @click="removeSource(scope.$index)">鍒犻櫎</el-button>
-          </template>
-        </el-table-column>
-      </el-table>
-      <div class="summary">鍚堣</div>
-    </div>
-
-    <template #footer>
-      <el-button type="primary" @click="submit">纭</el-button>
-      <el-button @click="visible=false">鍙栨秷</el-button>
-    </template>
-  </FormDialog>
-</template>
-
-<script setup>
-import { ref } from 'vue';
-import { getToken } from '@/utils/auth';
-import FormDialog from "@/components/Dialog/FormDialog.vue";
-
-const visible = ref(false);
-const form = ref({
-  billNo: '',
-  customerId: undefined,
-  makerId: undefined,
-  makeDate: '',
-  applyDeptId: undefined,
-  remark: '',
-  discountAmount: '',
-  paymentList: [{ accountNo: '', accountName: '', payMethod: '', amount: '', fee: '', txNo: '', remark: '' }],
-  sourceList: [{ billDate: '', billType: '', billNo: '', billAmount: 0, wroteAmount: 0, unWroteAmount: 0, thisWriteOffAmount: '' }]
-});
-
-const customerOptions = ref([]);
-const userOptions = ref([]);
-const deptOptions = ref([]);
-const accountOptions = ref([]);
-const payMethodOptions = ref([]);
-
-const uploadUrl = import.meta.env.VITE_APP_BASE_API + '/basic/customer-follow/upload';
-const uploadHeaders = { Authorization: 'Bearer ' + getToken() };
-
-function addPayment() {
-  form.value.paymentList.push({ accountNo: '', accountName: '', payMethod: '', amount: '', fee: '', txNo: '', remark: '' });
-}
-function removePayment(i) {
-  form.value.paymentList.splice(i, 1);
-}
-function removeSource(i) {
-  form.value.sourceList.splice(i, 1);
-}
-function clearSource() {
-  form.value.sourceList = [];
-}
-function selectSource() {}
-function autoWriteOff() {}
-function onUploadSuccess() {}
-
-function open(payload) {
-  visible.value = true;
-}
-function submit() {
-  visible.value = false;
-  emit('submitted');
-}
-
-defineExpose({ open });
-</script>
-
-<style scoped>
-.section { background: #fff; border-radius: 8px; box-shadow: 0 2px 12px 0 rgba(0,0,0,0.05); padding: 16px; margin-bottom: 16px; }
-.section-title { font-weight: 600; margin-bottom: 12px; }
-.descriptions {
-  margin-bottom: 20px;
-  display: inline-block;
-  font-size: 1rem;
-  font-weight: 600;
-  padding-left: 12px;
-  position: relative;
-}
-.descriptions::before {
-  content: "";
-  position: absolute;
-  left: 0;
-  top: 50%;
-  transform: translateY(-50%);
-  width: 4px;
-  height: 1rem;
-  background-color: #002FA7;
-  border-radius: 2px;
-}
-.toolbar { margin-bottom: 10px; display: flex;     justify-content: space-between;
-    align-items: center; }
-.source-toolbar { margin-bottom: 10px; display: flex; gap: 8px; }
-.summary { padding: 8px 12px; background: #fff7e6; color: #ad6800; }
-.section-container{display: flex;align-items: center;justify-content: space-between; }
-</style>
diff --git a/src/views/financialManagement/salesRefund/index.vue b/src/views/financialManagement/salesRefund/index.vue
deleted file mode 100644
index ccb775f..0000000
--- a/src/views/financialManagement/salesRefund/index.vue
+++ /dev/null
@@ -1,134 +0,0 @@
-<template>
-  <div class="app-container">
-    <!-- 浣跨敤鍏叡鎼滅储缁勪欢 -->
-    <SearchPanel
-      v-model="queryParams"
-      :schema="searchSchema"
-      @search="handleQuery"
-      @reset="resetQuery"
-    />
-
-    <!-- 琛ㄦ牸鍖哄煙 -->
-    <el-card class="table-card">
-      <el-table :data="refundList" v-loading="loading" border>
-        <el-table-column label="閫�璐у崟鍙�" prop="returnManagementNo" align="center" />
-        <el-table-column label="瀹㈡埛鍚嶇О" prop="customerName" align="center" />
-        <el-table-column label="閿�鍞崟鍙�" prop="salesContractNo" align="center" />
-        <el-table-column label="搴旈��娆鹃噾棰�" prop="refundAmount" align="center" />
-        <el-table-column label="宸查��娆鹃噾棰�" prop="refundedAmount" align="center" />
-        <el-table-column label="鏈��娆鹃噾棰�" prop="notRefundedAmount" align="center" />
-        <el-table-column label="鐘舵��" prop="status" align="center">
-          <template #default="scope">
-            <dict-tag :options="dictRef.sales_refund_status.value" :value="scope.row.status" />
-          </template>
-        </el-table-column>
-        <el-table-column label="鍒涘缓浜�" prop="createUserName" align="center" />
-        <el-table-column label="鍒涘缓鏃堕棿" prop="createTime" align="center" />
-        <el-table-column label="鎿嶄綔" align="center" width="150">
-          <template #default="scope">
-            <el-button link type="primary" @click="openDetail(scope.row)" style="color: #67C23A">璇︽儏</el-button>
-            <el-button link type="primary" @click="openConfirm(scope.row)">纭</el-button>
-          </template>
-        </el-table-column>
-      </el-table>
-
-      <pagination
-        v-show="total > 0"
-        :total="total"
-        v-model:page="queryParams.pageNum"
-        v-model:limit="queryParams.pageSize"
-        @pagination="getList"
-      />
-    </el-card>
-<ReceiptandRefundPopupWindow ref="popupRef" @submitted="getList" />
-  </div>
-</template>
-
-<script setup name="SalesRefund">
-import { ref, reactive, onMounted, computed, getCurrentInstance } from 'vue';
-const { proxy } = getCurrentInstance();
-import { listPage, add, update, del } from '@/api/financialManagement/salesRefund';
-import SearchPanel from '@/components/SearchPanel/index.vue';
-import ReceiptandRefundPopupWindow from './components/ReceiptandRefundPopupWindow.vue';
-
-// 鏌ヨ鍙傛暟
-const queryParams = reactive({
-  pageNum: 1,
-  pageSize: 10,
-  returnManagementNo: undefined,
-  customerName: undefined,
-  salesContractNo: undefined,
-  createUserName: undefined,
-  status: undefined
-});
-
-const dictRef = proxy.useDict('sales_refund_status');
-const salesRefundStatusOptions = computed(() => dictRef.sales_refund_status.value || []);
-
-// 鎼滅储鏍忛厤缃�
-const searchSchema = [
-  { type: 'input', prop: 'returnManagementNo', placeholder: '閫�璐у崟鍙�' },
-  { type: 'input', prop: 'customerName', placeholder: '瀹㈡埛鍚嶇О' },
-  { type: 'input', prop: 'salesContractNo', placeholder: '閿�鍞崟鍙�' },
-  { type: 'input', prop: 'createUserName', placeholder: '鍒涘缓浜哄悕绉�' },
-  { type: 'select', prop: 'status', placeholder: '鐘舵��', options: salesRefundStatusOptions }
-];
-
-const loading = ref(false);
-const total = ref(0);
-const refundList = ref([]);
-const popupRef = ref(null);
-
-/** 鏌ヨ鍒楄〃 */
-function getList() {
-  loading.value = true;
-  const { pageNum, pageSize, ...filters } = queryParams;
-  listPage({
-    current: pageNum,
-    size: pageSize,
-    ...filters
-  })
-    .then(res => {
-      refundList.value = res?.data?.records || res?.rows || [];
-      total.value = res?.data?.total || res?.total || 0;
-    })
-    .finally(() => {
-      loading.value = false;
-    });
-}
-
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-function handleQuery() {
-  queryParams.pageNum = 1;
-  getList();
-}
-
-/** 閲嶇疆鎸夐挳鎿嶄綔 */
-function resetQuery() {
-  handleQuery();
-}
-
-function openDetail(row) {
-  if (popupRef.value) {
-    popupRef.value.open({ mode: 'detail', row });
-  }
-}
-function openConfirm(row) {
-  if (popupRef.value) {
-    popupRef.value.open({ mode: 'confirm', row });
-  }
-}
-
-onMounted(() => {
-  getList();
-});
-</script>
-
-<style scoped lang="scss">
-.table-card {
-  border-radius: 8px;
-  box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.05);
-}
-</style>
-
-<!-- keep-alive child -->
diff --git a/src/views/index.vue b/src/views/index.vue
index 6c0b729..e12ded2 100644
--- a/src/views/index.vue
+++ b/src/views/index.vue
@@ -1,161 +1,326 @@
 <template>
-  <div class="dashboard">
-    <!-- 椤堕儴妯悜涓ゆ爮 -->
-    <div class="dashboard-top">
-      <!-- 宸︼細浼佷笟淇℃伅+涓夊ぇ鏁版嵁鍗$墖锛堜笂涓嬫帓鍒楋級 -->
-      <div class="top-left">
-        <div class="company-info">
-          <!-- 椤堕儴闂�欐潯 -->
-          <div class="welcome-banner">
-            <div class="welcome-title">
-              <span class="welcome-user">{{ userStore.nickName || '绯荤粺绠$悊鍛�' }}</span>
-              <span> 鎮ㄥソ锛佺鎮ㄥ紑蹇冩瘡涓�澶�</span>
-            </div>
-            <div class="welcome-time">鐧诲綍浜�: {{ userStore.currentLoginTime }}</div>
+  <div class="dashboard-cockpit">
+    <section class="cockpit-panel welcome-panel">
+      <div class="welcome-user">
+        <el-avatar :src="welcomeAvatar" class="avatar" @error="handleWelcomeAvatarError">
+          <el-icon><UserFilled /></el-icon>
+        </el-avatar>
+        <div class="welcome-text">
+          <div class="welcome-title">
+            {{ greetingText }}锛寋{ userStore.nickName || userStore.name || "瓒呯骇绠$悊鍛�" }} 馃憢
           </div>
+          <div class="welcome-subtitle">涓撴敞宸ヤ笟鏁板瓧鍖栵紝鍔╁姏鏅洪�犲崌绾�</div>
+        </div>
+      </div>
+      <div class="welcome-meta">
+        <div class="meta-time digital-number">{{ nowTime }}</div>
+        <div class="meta-tip">MES / MOM 鐢熶骇杩愯惀椹鹃┒鑸�</div>
+      </div>
+    </section>
 
-          <!-- 鐢ㄦ埛淇℃伅鍗$墖 -->
-          <div class="user-card">
-            <img :src="userStore.avatar" class="avatar" alt="" />
-            <div class="user-card-main">
-              <div class="user-name">{{ userStore.name }}</div>
-              <div class="user-role">{{ userStore.roleName }}</div>
-              <div class="user-meta">
-                <span>{{ userStore.phoneNumber || '123456789' }}</span>
-                <span class="sep">|</span>
-                <span>{{ userStore.deptName || '缁勭粐鏋舵瀯' }}</span>
-                <span class="sep">|</span>
-                <span>{{ userStore.postName || '宀椾綅鍚�' }}</span>
+    <section v-if="dashboardCards.length > 0" class="top-row">
+      <div class="stats-grid">
+        <article
+            v-for="card in dashboardCards"
+            :key="card.key"
+            class="stat-card"
+            :class="card.key"
+        >
+          <div class="stat-header">
+            <div class="stat-title-wrap">
+              <div class="stat-title">{{ card.title }}</div>
+              <div class="stat-desc">{{ card.desc }}</div>
+            </div>
+            <div class="stat-icon-orb">
+              <el-icon>
+                <component :is="card.icon" />
+              </el-icon>
+            </div>
+          </div>
+          <div class="stat-value digital-number">{{ card.value }}</div>
+          <div class="stat-footer">
+            <span>{{ card.subLabel }}</span>
+            <strong class="digital-number">{{ card.subValue }}</strong>
+          </div>
+          <div class="stat-trend">{{ card.trend }}</div>
+          <div class="stat-wave" aria-hidden="true"></div>
+        </article>
+      </div>
+    </section>
+
+    <section v-if="hasVisiblePanels" class="main-grid">
+      <div v-if="hasLeftPanels" class="left-column">
+        <div v-if="visiblePanels.process" class="cockpit-panel process-panel">
+          <div class="panel-title-row">
+            <div class="panel-title">宸ュ簭鏁版嵁鐢熶骇缁熻鏄庣粏</div>
+            <div class="panel-actions">
+              <el-button type="primary" size="small" plain @click="openProcessDialog">閫夋嫨宸ュ簭</el-button>
+              <el-button size="small" plain @click="resetProcessFilter">閲嶇疆</el-button>
+              <el-radio-group v-model="processRange" size="small" @change="refreshProcessStats">
+                <el-radio-button :value="1">鏃�</el-radio-button>
+                <el-radio-button :value="2">鍛�</el-radio-button>
+                <el-radio-button :value="3">鏈�</el-radio-button>
+              </el-radio-group>
+            </div>
+          </div>
+          <div class="process-body">
+            <div class="process-chart" :class="{ empty: !hasProcessData }">
+              <Echarts
+                  :options="chartBaseOptions"
+                  :chartStyle="{ width: '100%', height: '100%' }"
+                  :grid="processGrid"
+                  :series="processSeries"
+                  :tooltip="processTooltip"
+                  :xAxis="processXAxis"
+                  :yAxis="processYAxis"
+                  :style="{ height: hasProcessData ? '340px' : '280px' }"
+                  @click="handleChartClick"
+              />
+              <div v-if="!hasProcessData" class="chart-empty">
+                <el-icon><DataAnalysis /></el-icon>
+                <div class="chart-empty-title">鏆傛棤宸ュ簭鏁版嵁</div>
+                <div class="chart-empty-desc">绛夊緟鐢熶骇鎶ュ伐鏁版嵁鎺ュ叆鍚庤嚜鍔ㄧ敓鎴愮粺璁″浘琛�</div>
+                <div class="chart-empty-actions">
+                  <el-button size="small" @click="refreshProcessStats">鍒锋柊鏁版嵁</el-button>
+                  <el-button size="small" type="primary" plain @click="openProcessDialog">閫夋嫨宸ュ簭</el-button>
+                </div>
+              </div>
+            </div>
+            <div class="process-aside">
+              <div class="process-legend">
+                <div class="process-name">{{ processAside.processName }}</div>
+                <div class="process-legend-item"><span class="dot dot-blue"></span>鎶曞叆閲�</div>
+                <div class="process-legend-item"><span class="dot dot-orange"></span>鎶ュ簾閲�</div>
+                <div class="process-legend-item"><span class="dot dot-cyan"></span>浜у嚭閲�</div>
+              </div>
+              <div class="process-card">
+                <div class="process-label">绱鎬绘姇鍏�</div>
+                <div class="process-value digital-number">{{ formatAmount(processAside.totalInput) }}</div>
+              </div>
+              <div class="process-card">
+                <div class="process-label">绱鎬绘姤搴�</div>
+                <div class="process-value digital-number">{{ formatAmount(processAside.totalScrap) }}</div>
+              </div>
+              <div class="process-card">
+                <div class="process-label">绱鎬讳骇鍑�</div>
+                <div class="process-value digital-number">{{ formatAmount(processAside.totalOutput) }}</div>
               </div>
             </div>
           </div>
         </div>
-      </div>
-      <div class="data-cards">
-        <div class="data-card sales">
-          <div class="data-title">閿�鍞暟鎹�</div>
-          <div class="data-num">
-            <div>
-              <div class="data-desc">鏈湀閿�鍞/鍏�</div>
-              <div class="data-value">{{ businessInfo.monthSaleMoney }}</div>
-            </div>
-            <div>
-              <div class="data-desc">鏈紑绁ㄩ噾棰�/鍏�</div>
-              <div class="data-value">{{ businessInfo.monthSaleHaveMoney }}</div>
-            </div>
-          </div>
 
-        </div>
-        <div class="data-card purchase">
-          <div class="data-title">閲囪喘鏁版嵁</div>
-          <div class="data-num">
-            <div>
-              <div class="data-desc">鏈湀閲囪喘棰�/鍏�</div>
-              <div class="data-value">{{ businessInfo.monthPurchaseMoney }}</div>
-            </div>
-            <div>
-              <div class="data-desc">寰呬粯娆鹃噾棰�/鍏�</div>
-              <div class="data-value">{{ businessInfo.monthPurchaseHaveMoney }}</div>
-            </div>
-          </div>
-        </div>
-        <div class="data-card inventory">
-          <div class="data-title">搴撳瓨鏁版嵁</div>
-          <div class="data-num">
-            <div>
-              <div class="data-desc">褰撳墠搴撳瓨鎬婚噺/浠�</div>
-              <div class="data-value">{{ businessInfo.inventoryNum }}</div>
-            </div>
-            <div>
-              <div class="data-desc">浠婃棩鍏ュ簱/浠�</div>
-              <div class="data-value">{{ businessInfo.todayInventoryNum }}</div>
-            </div>
-          </div>
-        </div>
-      </div>
-      <!-- 鍙筹細寰呭姙浜嬮」 -->
-      <div class="todo-panel">
-        <div class="section-title">寰呭姙浜嬮」</div>
-        <ul class="todo-list" v-if="todoList.length > 0">
-          <li v-for="item in todoList" :key="item.id">
-            <div style="display: flex;flex-direction: column;justify-content: space-between;width: 100%;gap: 20px">
-              <div style="display: flex;justify-content: space-between;align-items: center;">
-                <div class="todo-title">寰呭姙缂栧彿锛歿{ item.approveId }}</div>
-                <div class="todo-division">閮ㄩ棬锛歿{ item.approveDeptName }}</div>
-                <div class="todo-time">{{ item.approveTime }}</div>
-              </div>
-              <div class="todo-division">寰呭姙浜嬬敱锛歿{ item.approveReason }}</div>
-            </div>
-          </li>
-        </ul>
-        <div v-else style="text-align: center">
-          鏆傛棤鏁版嵁
-        </div>
-      </div>
-    </div>
-    <div class="dashboard-row">
-      <div class="main-panel process-panel">
-        <div class="process-panel__header">
-          <div class="section-title">宸ュ簭鏁版嵁鐢熶骇缁熻鏄庣粏</div>
-          <div style="display: flex; gap: 10px; align-items: center;">
-            <el-button type="primary" size="small" plain icon="Filter" @click="openProcessDialog">閫夋嫨宸ュ簭</el-button>
-            <el-button type="info" size="small" plain icon="Refresh" @click="resetProcessFilter">閲嶇疆</el-button>
-            <el-radio-group v-model="processRange" size="small" @change="refreshProcessStats">
-              <el-radio-button :value="1">鏃�</el-radio-button>
-              <el-radio-button :value="2">鍛�</el-radio-button>
-              <el-radio-button :value="3">鏈�</el-radio-button>
+        <div v-if="visiblePanels.order" class="cockpit-panel order-panel">
+          <div class="panel-title-row">
+            <div class="panel-title">鐢熶骇璁㈠崟杩涘害</div>
+            <el-radio-group v-model="orderFilter" size="small">
+              <el-radio-button :value="'all'">鍏ㄩ儴({{ orderProgressMeta.total }})</el-radio-button>
+              <el-radio-button :value="'waiting'">寰呭紑濮�({{ orderProgressMeta.waitingCount }})</el-radio-button>
+              <el-radio-button :value="'inProgress'">杩涜涓�({{ orderProgressMeta.inProgressCount }})</el-radio-button>
+              <el-radio-button :value="'completed'">宸插畬鎴�({{ orderProgressMeta.completedCount }})</el-radio-button>
+              <el-radio-button :value="'paused'">宸叉殏鍋�({{ orderProgressMeta.pausedCount }})</el-radio-button>
             </el-radio-group>
           </div>
+          <el-table :data="filteredOrders" stripe>
+            <el-table-column prop="orderNo" label="璁㈠崟缂栧彿" min-width="150" />
+            <el-table-column prop="productName" label="浜у搧鍚嶇О" min-width="120" />
+            <el-table-column prop="planQty" label="璁″垝鏁伴噺" min-width="90" />
+            <el-table-column prop="completedQty" label="宸插畬鎴�" min-width="90" />
+            <el-table-column label="瀹屾垚鐜�" min-width="180">
+              <template #default="{ row }">
+                <div class="table-progress">
+                  <el-progress
+                      :stroke-width="8"
+                      :percentage="row.completionRate"
+                      :show-text="false"
+                      status="success"
+                  />
+                  <span>{{ row.completionRate }}%</span>
+                </div>
+              </template>
+            </el-table-column>
+            <el-table-column prop="deliveryDate" label="浜ゆ湡" min-width="110" />
+            <el-table-column label="鐘舵��" min-width="90">
+              <template #default="{ row }">
+                <el-tag :type="getOrderStatusType(row.status)" effect="light">
+                  {{ row.statusLabel || getOrderStatusText(row.status) }}
+                </el-tag>
+              </template>
+            </el-table-column>
+          </el-table>
         </div>
 
-        <div class="process-panel__body">
-          <div class="process-panel__chart">
-            <Echarts :chartStyle="{ width: '100%', height: '100%' }" :grid="processGrid" :series="processSeries"
-              :tooltip="processTooltip" :xAxis="processXAxis" :yAxis="processYAxis" style="height: 100%"
-              @click="handleChartClick" />
-          </div>
-
-          <div class="process-panel__aside">
-            <div class="process-legend">
-              <div class="process-legend__item">
-                <span class="dot dot-blue"></span><span>鎶曞叆閲�</span>
-              </div>
-              <div class="process-legend__item">
-                <span class="dot dot-yellow"></span><span>鎶ュ簾閲�</span>
-              </div>
-              <div class="process-legend__item">
-                <span class="dot dot-teal"></span><span>浜у嚭閲�</span>
+        <div v-if="visiblePanels.contract" class="cockpit-panel contract-panel">
+          <div class="panel-title">瀹㈡埛鍚堝悓閲戦鍒嗘瀽</div>
+          <div class="contract-summary">
+            <div class="contract-card">
+              <div class="contract-name">鎬诲悎鍚岄噾棰�(鍏�)</div>
+              <div class="contract-main digital-number">{{ formatNumber(sum) }}</div>
+              <div class="contract-compare">
+                鍚屾瘮
+                <span class="rise">{{ trendText(yny) }}</span>
+                鐜瘮
+                <span class="rise">{{ trendText(chain) }}</span>
               </div>
             </div>
-
-            <div class="process-card process-card--name">{{ processAside.processName }}</div>
-
-            <div class="process-card">
-              <div class="process-card__label">绱鎬绘姇鍏�</div>
-              <div class="process-card__value">{{ formatAmount(processAside.totalInput) }}
-              </div>
-            </div>
-            <div class="process-card">
-              <div class="process-card__label">绱鎬绘姤搴�</div>
-              <div class="process-card__value">{{ formatAmount(processAside.totalScrap) }}
-              </div>
-            </div>
-            <div class="process-card">
-              <div class="process-card__label">绱鎬讳骇鍑�</div>
-              <div class="process-card__value">{{ formatAmount(processAside.totalOutput) }}
-              </div>
+            <div class="contract-chart-wrap">
+              <Echarts
+                  :options="chartBaseOptions"
+                  :legend="pieLegend"
+                  :chartStyle="chartStylePie"
+                  :series="materialPieSeries"
+                  :tooltip="pieTooltip"
+              />
             </div>
           </div>
+          <ul class="contract-list">
+            <li v-for="item in materialPieSeries[0].data" :key="item.name">
+              <span class="legend-dot" :style="{ backgroundColor: item.itemStyle?.color }"></span>
+              <span class="contract-item-name">{{ item.name }}</span>
+              <span class="contract-item-rate">{{ item.rate }}%</span>
+              <span class="contract-item-value digital-number">楼{{ formatNumber(item.value) }}</span>
+            </li>
+          </ul>
+        </div>
+
+        <div v-if="visiblePanels.quality" class="cockpit-panel quality-panel">
+          <div class="panel-title-row">
+            <div class="panel-title">璐ㄩ噺缁熻</div>
+            <el-radio-group v-model="qualityRange" size="small" @change="qualityStatisticsInfo">
+              <el-radio-button :value="1">鍛�</el-radio-button>
+              <el-radio-button :value="2">鏈�</el-radio-button>
+              <el-radio-button :value="3">瀛e害</el-radio-button>
+            </el-radio-group>
+          </div>
+          <div class="quality-cards">
+            <div class="quality-card one">鍘熸潗鏂欏凡妫�鏁伴噺 <span>{{ qualityStatisticsObject.supplierNum }}浠�</span></div>
+            <div class="quality-card two">杩囩▼妫�楠屾暟閲� <span>{{ qualityStatisticsObject.processNum }}浠�</span></div>
+            <div class="quality-card three">鍑哄巶宸叉鏁伴噺 <span>{{ qualityStatisticsObject.factoryNum }}浠�</span></div>
+          </div>
+          <Echarts
+              :options="chartBaseOptions"
+              :chartStyle="chartStyle"
+              :grid="grid"
+              :legend="barLegend"
+              :series="barSeries1"
+              :tooltip="tooltip"
+              :xAxis="xAxis1"
+              :yAxis="yAxis1"
+              style="height: 270px"
+          />
         </div>
       </div>
-    </div>
 
-    <!-- 宸ュ簭閫夋嫨寮圭獥 -->
+      <div v-if="hasRightPanels" class="right-column">
+        <div v-if="visiblePanels.todo" class="cockpit-panel todo-panel">
+          <div class="panel-title-row">
+            <div class="panel-title">寰呭姙浜嬮」</div>
+            <span class="panel-more">鏇村</span>
+          </div>
+          <ul class="todo-list" v-if="todoList.length > 0">
+            <li v-for="item in todoList" :key="item.id" class="todo-item">
+              <div class="todo-head">
+                <span class="todo-no">寰呭姙缂栧彿锛歿{ item.approveId }}</span>
+                <span class="todo-time">{{ item.approveTime }}</span>
+              </div>
+              <div class="todo-desc">閮ㄩ棬锛歿{ item.approveDeptName }}</div>
+              <div class="todo-desc">浜嬬敱锛歿{ item.approveReason }}</div>
+            </li>
+          </ul>
+          <div v-else class="panel-empty">鏆傛棤鏁版嵁</div>
+        </div>
+
+        <div v-if="visiblePanels.realtime" class="cockpit-panel realtime-panel">
+          <div class="panel-title-row">
+            <div class="panel-title">鐢熶骇瀹炴椂鐪嬫澘</div>
+            <span class="panel-more">鏇村</span>
+          </div>
+          <div class="realtime-grid">
+            <div class="realtime-item" v-for="item in realtimeBoard" :key="item.key">
+              <el-progress
+                  type="circle"
+                  :percentage="item.percent"
+                  :stroke-width="10"
+                  :width="94"
+                  :color="item.color"
+              >
+                <template #default>
+                  <div class="realtime-value digital-number">{{ item.display }}</div>
+                </template>
+              </el-progress>
+              <div class="realtime-label">{{ item.label }}</div>
+              <div class="realtime-delta" :class="item.trend">{{ item.delta }}</div>
+            </div>
+          </div>
+        </div>
+
+        <div v-if="visiblePanels.quick" class="cockpit-panel quick-panel">
+          <div class="panel-title-row">
+            <div class="panel-title">蹇嵎鍔熻兘</div>
+          </div>
+          <div class="quick-grid">
+            <button
+                v-for="item in quickEntries"
+                :key="item.label"
+                class="quick-item"
+                type="button"
+                @click="goToQuick(item.path)"
+            >
+              <span class="quick-icon">
+                <el-icon>
+                  <component :is="item.icon" />
+                </el-icon>
+              </span>
+              <span>{{ item.label }}</span>
+            </button>
+          </div>
+        </div>
+
+        <div v-if="visiblePanels.plan" class="cockpit-panel plan-panel">
+          <div class="panel-title-row">
+            <div class="panel-title">浠婃棩鐢熶骇璁″垝</div>
+            <span class="panel-more">{{ todayPlanTotal }}椤�</span>
+          </div>
+          <ul class="plan-list">
+            <li v-for="item in todayPlanList" :key="item.orderNo" class="plan-item">
+              <div class="plan-main">
+                <span class="plan-order">{{ item.orderNo }}</span>
+                <span class="plan-name">{{ item.productName }}</span>
+              </div>
+              <div class="plan-meta">
+                <span>璁″垝 {{ item.planQty }}</span>
+                <span>浜ゆ湡 {{ item.deliveryDate }}</span>
+              </div>
+            </li>
+          </ul>
+        </div>
+
+        <div v-if="visiblePanels.receipt" class="cockpit-panel receipt-panel">
+          <div class="panel-title">鍥炴涓庡紑绁ㄥ垎鏋�</div>
+          <Echarts
+              :options="chartBaseOptions"
+              :chartStyle="chartStyle"
+              :grid="grid"
+              :legend="lineLegend"
+              :series="lineSeries"
+              :tooltip="tooltipLine"
+              :xAxis="xAxis2"
+              :yAxis="yAxis2"
+              style="height: 300px"
+          />
+        </div>
+
+      </div>
+    </section>
+
+    <section v-else class="cockpit-panel empty-home-panel">
+      褰撳墠璐﹀彿娌℃湁鍙睍绀虹殑棣栭〉妯″潡
+    </section>
+
     <el-dialog v-model="processDialogVisible" title="閫夋嫨宸ュ簭" width="500px" append-to-body>
       <div class="process-selection-wrapper">
         <el-checkbox-group v-model="tempProcessIds">
           <div class="process-grid">
-            <el-checkbox v-for="item in processOptions" :key="item.id" :label="item.id" border>
+            <el-checkbox v-for="item in processOptions" :key="item.id" :value="item.id" border>
               {{ item.name }}
             </el-checkbox>
           </div>
@@ -168,105 +333,99 @@
         </span>
       </template>
     </el-dialog>
-    <!-- 涓儴妯悜涓ゆ爮 -->
-    <div class="dashboard-row">
-      <div class="main-panel">
-        <div class="section-title">瀹㈡埛鍚堝悓閲戦鍒嗘瀽</div>
-        <div class="contract-summary">
-          <div class="contract-info">
-            <img src="../assets/images/khtitle.png" alt="" style="width: 42px" />
-            <div class="contract-card">
-              <div class="contract-name">鎬诲悎鍚岄噾棰�(鍏�)</div>
-              <div class="contract-meta">
-                <div class="main-amount">{{ sum }}</div>
-                <div>鍛ㄥ悓姣�: <span class="up">{{ yny }}% </span> 鏃ョ幆姣�: <span class="up">{{ chain }}% </span></div>
-              </div>
-            </div>
-          </div>
-        </div>
-        <div
-          style="display: flex;align-items: center;gap: 20px;justify-content: space-evenly;height: 180px;margin-top: 20px">
-          <div>
-            <Echarts ref="chart" :legend="pieLegend" :chartStyle="chartStylePie" :series="materialPieSeries"
-              :tooltip="pieTooltip"></Echarts>
-          </div>
-          <ul class="contract-list">
-            <li v-for="item in materialPieSeries[0].data" :key="item.name">
-              <div style="display: flex;align-items: center;justify-content: space-between;width: 100%">
-                <div class="line" :style="{ color: item.itemStyle.color }">鈼弡{ item.name }}</div>
-                <div style="width: 70px">{{ item.rate }}%</div>
-                <div>锟{ item.value }}</div>
-              </div>
-            </li>
-          </ul>
-        </div>
-      </div>
-      <div class="main-panel">
-        <div style="display: flex;justify-content: space-between;">
-          <div class="section-title">搴旀敹搴斾粯缁熻</div>
-          <!--					<el-radio-group v-model="radio1" size="large" @change="statisticsReceivable">-->
-          <!--						<el-radio-button label="鎸夊懆" :value="1" />-->
-          <!--						<el-radio-button label="鎸夋湀" :value="2" />-->
-          <!--						<el-radio-button label="鎸夊搴�" :value="3" />-->
-          <!--					</el-radio-group>-->
-        </div>
-        <Echarts ref="chart" :color="barColors2" :chartStyle="chartStyle" :grid="grid" :series="barSeries"
-          :tooltip="tooltip" :xAxis="xAxis" :yAxis="yAxis" style="height: 260px"></Echarts>
-      </div>
-    </div>
-
-    <!-- 搴曢儴妯悜涓ゆ爮 -->
-    <div class="dashboard-row">
-      <div class="main-panel">
-        <div style="display: flex;justify-content: space-between;align-items: center;margin-bottom: 10px;">
-          <div class="section-title" style="margin-bottom: 0;">璐ㄩ噺缁熻</div>
-          <el-radio-group v-model="qualityRange" size="small" @change="qualityStatisticsInfo">
-            <el-radio-button :value="1">鍛�</el-radio-button>
-            <el-radio-button :value="2">鏈�</el-radio-button>
-            <el-radio-button :value="3">瀛e害</el-radio-button>
-          </el-radio-group>
-        </div>
-        <div class="quality-cards">
-          <div class="quality-card one">鍘熸潗鏂欏凡妫�娴嬫暟 <span>{{ qualityStatisticsObject.supplierNum }}浠�</span></div>
-          <div class="quality-card two">杩囩▼妫�楠屾暟閲� <span>{{ qualityStatisticsObject.processNum }}浠�</span></div>
-          <div class="quality-card three">鍑哄巶宸叉鏁伴噺 <span>{{ qualityStatisticsObject.factoryNum }}浠�</span></div>
-        </div>
-        <Echarts ref="chart" :chartStyle="chartStyle" :grid="grid" :legend="barLegend" :series="barSeries1"
-          :tooltip="tooltip" :xAxis="xAxis1" :yAxis="yAxis1" style="height: 260px"></Echarts>
-      </div>
-
-      <div class="main-panel">
-        <div class="section-title">鍥炴涓庡紑绁ㄥ垎鏋�</div>
-        <Echarts ref="invoiceChart" :chartStyle="chartStyle" :grid="grid" :legend="lineLegend" :series="lineSeries"
-          :tooltip="tooltipLine" :xAxis="xAxis2" :yAxis="yAxis2" style="height: 270px;" />
-      </div>
-    </div>
   </div>
 </template>
 
 <script setup>
-import { ref, onMounted, computed, reactive } from 'vue'
+import { ref, onMounted, onUnmounted, computed, reactive, watch } from "vue";
+import { useRouter } from "vue-router";
+import dayjs from "dayjs";
+import * as echarts from "echarts";
+import {
+  Box,
+  Calendar,
+  Checked,
+  DataAnalysis,
+  DataLine,
+  EditPen,
+  Operation,
+  Search,
+  ShoppingCartFull,
+  Tickets,
+  Tools,
+  UserFilled,
+} from "@element-plus/icons-vue";
 import Echarts from "@/components/Echarts/echarts.vue";
-import * as echarts from 'echarts';
+import usePermissionStore from "@/store/modules/permission";
 import useUserStore from "@/store/modules/user.js";
 import {
-  analysisCustomerContractAmounts, getAmountHalfYear,
+  analysisCustomerContractAmounts,
+  getAmountHalfYear,
   getBusiness,
   homeTodos,
   processDataProductionStatistics,
+  productionOrderProgress,
+  productionOverview,
+  productionRealtimeBoard,
+  qualityInspectionStatistics,
   statisticsReceivablePayable,
-  qualityInspectionStatistics
+  todayProductionPlan,
 } from "@/api/viewIndex.js";
-import { list } from '@/api/productionManagement/productionProcess';
+import { list } from "@/api/productionManagement/productionProcess";
 
+const router = useRouter();
+const userStore = useUserStore();
+const permissionStore = usePermissionStore();
+const defaultWelcomeAvatar = new URL("../assets/images/profile.jpg", import.meta.url).href;
 
-const userStore = useUserStore()
+const nowTime = ref("");
+const welcomeAvatarLoadFailed = ref(false);
+let clockTimer = null;
+const weatherText = "澶氫簯 28掳C";
 
-const processOptions = ref([])
-const selectedProcessIds = ref([])
-const tempProcessIds = ref([])
-const processDialogVisible = ref(false)
-const activeProcessIndex = ref(0)
+const nowDate = computed(() => (nowTime.value ? nowTime.value.slice(0, 10) : dayjs().format("YYYY-MM-DD")));
+
+const greetingText = computed(() => {
+  const hour = dayjs().hour();
+  if (hour < 6) return "鍑屾櫒濂�";
+  if (hour < 9) return "鏃╀笂濂�";
+  if (hour < 12) return "涓婂崍濂�";
+  if (hour < 14) return "涓崍濂�";
+  if (hour < 18) return "涓嬪崍濂�";
+  return "鏅氫笂濂�";
+});
+
+const welcomeAvatar = computed(() =>
+    welcomeAvatarLoadFailed.value || !userStore.avatar ? defaultWelcomeAvatar : userStore.avatar
+);
+
+const handleWelcomeAvatarError = () => {
+  if (welcomeAvatar.value !== defaultWelcomeAvatar) {
+    welcomeAvatarLoadFailed.value = true;
+  }
+};
+
+watch(
+    () => userStore.avatar,
+    () => {
+      welcomeAvatarLoadFailed.value = false;
+    }
+);
+
+const axisTextColor = "#5f6f86";
+const axisLineColor = "rgba(148, 163, 184, 0.45)";
+const splitLineColor = "rgba(148, 163, 184, 0.18)";
+
+const chartBaseOptions = reactive({
+  backgroundColor: "transparent",
+  textStyle: { color: axisTextColor },
+});
+
+const processOptions = ref([]);
+const selectedProcessIds = ref([]);
+const tempProcessIds = ref([]);
+const processDialogVisible = ref(false);
+const activeProcessIndex = ref(0);
 
 const businessInfo = ref({
   inventoryNum: 0,
@@ -275,988 +434,2037 @@
   monthSaleHaveMoney: 0,
   monthSaleMoney: 0,
   todayInventoryNum: 0,
-})
+});
+
 const qualityStatisticsObject = ref({
   supplierNum: 0,
   processNum: 0,
   factoryNum: 0,
-})
-const sum = ref(0)
-const yny = ref(0)
-const chain = ref(0)
+});
 
-const pieLegend = reactive({
-  show: false,
-})
+const productionOverviewData = ref({
+  totalOutput: 0,
+  totalScrap: 0,
+  yieldRate: 0,
+});
+
+const realtimeBoardData = ref({
+  deviceOee: { value: 0, compareYesterday: 0 },
+  orderAchievementRate: { value: 0, compareYesterday: 0 },
+  defectRate: { value: 0, compareYesterday: 0 },
+});
+
+const orderProgressMeta = ref({
+  status: "all",
+  tab: "all",
+  bizDate: null,
+  total: 0,
+  pageNum: 1,
+  pageSize: 10,
+  waitingCount: 0,
+  inProgressCount: 0,
+  completedCount: 0,
+  pausedCount: 0,
+});
+
+const todayPlanList = ref([]);
+const todayPlanTotal = ref(0);
+
+const sum = ref(0);
+const yny = ref(0);
+const chain = ref(0);
+
+const pieLegend = reactive({ show: false });
+const piePalette = ["#2563eb", "#14b8a6", "#7c3aed", "#f97316", "#38bdf8", "#f43f5e"];
+
+const chartStyle = {
+  width: "100%",
+  height: "100%",
+};
+
+const chartStylePie = {
+  width: "100%",
+  height: "200px",
+};
+
+const grid = {
+  left: "3%",
+  right: "4%",
+  bottom: "2%",
+  top: "12%",
+  containLabel: true,
+};
+
+const tooltip = {
+  trigger: "axis",
+  axisPointer: { type: "shadow" },
+  backgroundColor: "rgba(255, 255, 255, 0.97)",
+  borderColor: "rgba(148, 163, 184, 0.26)",
+  textStyle: { color: "#334155" },
+};
+
+const barColors2 = ["#2563eb", "#14b8a6"];
+
+const xAxis = [
+  {
+    type: "value",
+    axisLine: { lineStyle: { color: axisLineColor } },
+    splitLine: { lineStyle: { color: splitLineColor } },
+    axisLabel: { color: axisTextColor },
+  },
+];
+
+const yAxis = [
+  {
+    type: "category",
+    data: ["搴斾粯璐︽", "搴旀敹璐︽"],
+    axisTick: { show: false },
+    axisLine: { lineStyle: { color: axisLineColor } },
+    axisLabel: { color: axisTextColor },
+  },
+];
+
 const barSeries = ref([
   {
-    type: 'bar',
+    type: "bar",
+    barWidth: 22,
+    itemStyle: { borderRadius: [0, 8, 8, 0] },
+    label: { show: true, position: "right", color: "#334155" },
     data: [],
-    label: {
-      show: true,
-    }
   },
-])
+]);
+
+const barLegend = {
+  show: true,
+  textStyle: { color: axisTextColor },
+  data: ["鍘熸潗鏂欎笉鍚堟牸鏁�", "杩囩▼涓嶅悎鏍兼暟", "鍑哄巶涓嶅悎鏍兼暟"],
+};
+
+const xAxis1 = ref([
+  {
+    type: "category",
+    axisTick: { show: false },
+    axisLine: { lineStyle: { color: axisLineColor } },
+    axisLabel: { color: axisTextColor },
+    data: [],
+  },
+]);
+
+const yAxis1 = [
+  {
+    type: "value",
+    splitLine: { lineStyle: { color: splitLineColor } },
+    axisLine: { lineStyle: { color: axisLineColor } },
+    axisLabel: { color: axisTextColor },
+  },
+];
 
 const barSeries1 = ref([
   {
-    name: '鍘熸潗鏂欎笉鍚堟牸鏁�',
-    type: 'bar',
+    name: "鍘熸潗鏂欎笉鍚堟牸鏁�",
+    type: "bar",
     barGap: 0,
-    emphasis: {
-      focus: 'series'
-    },
-    data: []
+    itemStyle: { color: "#2563eb", borderRadius: [6, 6, 0, 0] },
+    emphasis: { focus: "series" },
+    data: [],
   },
   {
-    name: '杩囩▼涓嶅悎鏍兼暟',
-    type: 'bar',
-    emphasis: {
-      focus: 'series'
-    },
-    data: []
+    name: "杩囩▼涓嶅悎鏍兼暟",
+    type: "bar",
+    itemStyle: { color: "#14b8a6", borderRadius: [6, 6, 0, 0] },
+    emphasis: { focus: "series" },
+    data: [],
   },
   {
-    name: '鍑哄巶涓嶅悎鏍兼暟',
-    type: 'bar',
-    emphasis: {
-      focus: 'series'
-    },
-    data: []
+    name: "鍑哄巶涓嶅悎鏍兼暟",
+    type: "bar",
+    itemStyle: { color: "#f59e0b", borderRadius: [6, 6, 0, 0] },
+    emphasis: { focus: "series" },
+    data: [],
   },
-])
-const chartStyle = {
-  width: '100%',
-  height: '100%' // 璁剧疆鍥捐〃瀹瑰櫒鐨勯珮搴�
-}
-const chartStylePie = {
-  width: '140%',
-  height: '140%' // 璁剧疆鍥捐〃瀹瑰櫒鐨勯珮搴�
-}
-const grid = {
-  left: '3%',
-  right: '4%',
-  bottom: '3%',
-  containLabel: true
-}
-const barLegend = {
-  show: true,
-  data: ['鍘熸潗鏂欎笉鍚堟牸鏁�', '杩囩▼涓嶅悎鏍兼暟', '鍑哄巶涓嶅悎鏍兼暟']
-}
-const barLegend1 = {
-  show: true,
-  data: ['棰勪粯璐︽', '搴斾粯璐︽', '棰勬敹璐︽', '搴旀敹璐︽']
-}
+]);
+
 const lineLegend = {
   show: true,
-  data: ['寮�绁�', '鍥炴']
-}
-const tooltip = {
-  trigger: 'axis',
-  axisPointer: {
-    type: 'shadow'
-  }
-}
-const xAxis = [{
-  type: 'value',
-}]
-const xAxis1 = ref([{
-  type: 'category',
-  axisTick: { show: false },
-  data: []
-}])
-const yAxis = [{
-  type: 'category',
-  data: ['搴斾粯璐︽', '搴旀敹璐︽',]
-}]
-const yAxis1 = [{
-  type: 'value'
-}]
-const pieTooltip = reactive({
-  trigger: 'item',
-  formatter: function (params) {
-    // 鍔ㄦ�佺敓鎴愭彁绀轰俊鎭紝鍩轰簬鏁版嵁椤圭殑 name 灞炴��
-    const description = params.name === '鏈湀鍥炴閲戦' ? '鏈湀鍥炴閲戦' : '搴旀敹娆鹃噾棰�';
-    return `${description} ${formatNumber(params.value)}鍏� ${params.percent}%`;
-  },
-  position: 'right'
-})
-const materialPieSeries = ref([
-  {
-    type: 'pie',
-    radius: ['66%', '90%'],
-    avoidLabelOverlap: false,
-    itemStyle: {
-      borderColor: '#fff',
-      borderWidth: 2
-    },
-    label: {
-      show: false
-    },
-    data: []
-  }
-])
-const lineSeries = ref([
-  {
-    type: 'line',
-    data: [],
-    label: {
-      show: true
-    },
-    showSymbol: true, // 鏄剧ず鍦嗙偣
-  },
-])
-const tooltipLine = {
-  trigger: 'axis',
-}
-const yAxis2 = ref([
-  {
-    type: 'value',
-  }
-])
+  textStyle: { color: axisTextColor },
+  data: ["寮�绁�", "鍥炴"],
+};
+
 const xAxis2 = ref([
   {
-    type: 'category',
+    type: "category",
     data: [],
+    axisLine: { lineStyle: { color: axisLineColor } },
     axisLabel: {
+      color: axisTextColor,
       interval: 0,
-      formatter: function (value) {
-        return value.replace(/~/g, '\n');
-      },
-    }
-  }
-])
-
-// 寰呭姙浜嬮」
-const todoList = ref([])
-const radio1 = ref(1)
-const qualityRange = ref(1)
-
-// 鍥捐〃寮曠敤
-const barChart = ref(null)
-const lineChart = ref(null)
-const barColors2 = ['#5181DB', '#D369E0', '#F2CA6D', '#60CCA8']
-
-// 闅忔満棰滆壊鐢熸垚鍑芥暟
-const getRandomColor = () => {
-  return '#' + Math.floor(Math.random() * 0xffffff).toString(16).padStart(6, '0');
-}
-
-onMounted(() => {
-  getBusinessData()
-  analysisCustomer()
-  todoInfoS()
-  statisticsReceivable()
-  qualityStatisticsInfo()
-  getAmountHalfYearNum()
-  getProcessList()
-})
-// 鏁版嵁缁熻
-const getBusinessData = () => {
-  getBusiness().then((res) => {
-    businessInfo.value = { ...res.data }
-  })
-}
-// 鍚堝悓閲戦
-const analysisCustomer = () => {
-  analysisCustomerContractAmounts().then((res) => {
-    sum.value = res.data.sum
-    yny.value = res.data.yny
-    chain.value = res.data.chain
-    // 涓烘瘡涓暟鎹」鍒嗛厤闅忔満棰滆壊
-    materialPieSeries.value[0].data = res.data.item.map(item => ({
-      ...item,
-      itemStyle: { color: getRandomColor() }
-    }))
-  })
-}
-// 寰呭姙浜嬮」
-const todoInfoS = () => {
-  homeTodos().then((res) => {
-    todoList.value = res.data
-  })
-}
-// 鑾峰彇宸ュ簭鍒楄〃
-const getProcessList = () => {
-  list().then(res => {
-    processOptions.value = res.data.records
-  })
-}
-
-const openProcessDialog = () => {
-  tempProcessIds.value = [...selectedProcessIds.value]
-  processDialogVisible.value = true
-}
-
-const handleProcessDialogConfirm = () => {
-  selectedProcessIds.value = [...tempProcessIds.value]
-  processDialogVisible.value = false
-  refreshProcessStats()
-}
-
-const resetProcessFilter = () => {
-  selectedProcessIds.value = []
-  tempProcessIds.value = []
-  refreshProcessStats()
-}
-
-const handleChartClick = (params) => {
-  if (params && params.dataIndex !== undefined) {
-    activeProcessIndex.value = params.dataIndex
-  }
-}
-// 搴斾粯搴旀敹缁熻
-const statisticsReceivable = () => {
-  statisticsReceivablePayable({ type: radio1.value }).then((res) => {
-    barSeries.value[0].data = [
-      // { value: res.data.prepayMoney, itemStyle: { color: barColors2[0] } },
-      { value: res.data.payableMoney, itemStyle: { color: barColors2[0] } },
-      // { value: res.data.advanceMoney, itemStyle: { color: barColors2[2] } },
-      { value: res.data.receivableMoney, itemStyle: { color: barColors2[1] } }
-    ]
-  })
-}
-// 璐ㄦ缁熻
-const qualityStatisticsInfo = () => {
-  qualityInspectionStatistics({ type: qualityRange.value }).then((res) => {
-    xAxis1.value[0].data = []
-    barSeries1.value[0].data = []
-    barSeries1.value[1].data = []
-    barSeries1.value[2].data = []
-    res.data.item.forEach(item => {
-      xAxis1.value[0].data.push(item.date)
-      barSeries1.value[0].data.push(item.supplierNum)
-      barSeries1.value[1].data.push(item.processNum)
-      barSeries1.value[2].data.push(item.factoryNum)
-    })
-    qualityStatisticsObject.value.supplierNum = res.data.supplierNum
-    qualityStatisticsObject.value.processNum = res.data.processNum
-    qualityStatisticsObject.value.factoryNum = res.data.factoryNum
-  })
-}
-const getAmountHalfYearNum = async () => {
-  const res = await getAmountHalfYear()
-  console.log(res)
-  const monthName = []
-  const receiptAmount = []
-  const invoiceAmount = []
-  res.data.forEach(item => {
-    monthName.push(item.month)
-    receiptAmount.push(item.receiptAmount)
-    invoiceAmount.push(item.invoiceAmount)
-  })
-  // 姝g‘鍝嶅簲寮忚祴鍊硷細鍒涘缓鏂扮殑 xAxis 鍜� series 瀵硅薄
-  xAxis2.value[0].data = monthName
-  xAxis2.value[0].data = monthName.map(item => item.replace(/~/g, '\n~'));
-  lineSeries.value = [
-    {
-      name: '寮�绁�',
-      type: 'line',
-      data: invoiceAmount,
-      stack: 'Total',
-      areaStyle: {
-        color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
-          {
-            offset: 0,
-            color: 'rgba(131, 207, 255, 1)'
-          },
-          {
-            offset: 1,
-            color: 'rgba(186, 228, 255, 1)'
-          }
-        ])
-      },
-      itemStyle: {
-        color: '#2D99FF',
-        borderColor: '#2D99FF'
-      },
-      emphasis: {
-        focus: 'series'
-      },
-      lineStyle: {
-        width: 0
-      },
-      showSymbol: true,
+      formatter: (value) => value.replace(/~/g, "\n"),
     },
-    {
-      name: '鍥炴',
-      type: 'line',
-      data: receiptAmount,
-      stack: 'Total',
-      lineStyle: {
-        width: 0
-      },
-      itemStyle: {
-        color: '#83CFFF',
-        borderColor: '#83CFFF'
-      },
-      showSymbol: true,
-      areaStyle: {
-        color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
-          {
-            offset: 0,
-            color: 'rgba(54, 153, 255, 1)'
-          },
-          {
-            offset: 1,
-            color: 'rgba(89, 169, 254, 1)'
-          }
-        ])
-      },
-      emphasis: {
-        focus: 'series'
-      },
-    }
-  ]
-}
+  },
+]);
 
-// 宸ュ簭鏁版嵁鐢熶骇缁熻鏄庣粏锛堝亣鏁版嵁 + 鍥捐〃锛�
-const processRange = ref(1)
-const processChartData = ref([])
+const yAxis2 = ref([
+  {
+    type: "value",
+    splitLine: { lineStyle: { color: splitLineColor } },
+    axisLine: { lineStyle: { color: axisLineColor } },
+    axisLabel: { color: axisTextColor },
+  },
+]);
+
+const tooltipLine = {
+  trigger: "axis",
+  backgroundColor: "rgba(255, 255, 255, 0.97)",
+  borderColor: "rgba(148, 163, 184, 0.26)",
+  textStyle: { color: "#334155" },
+};
+
+const lineSeries = ref([
+  {
+    name: "寮�绁�",
+    type: "line",
+    data: [],
+    smooth: true,
+    itemStyle: { color: "#2563eb" },
+    lineStyle: { width: 2, color: "#2563eb" },
+    showSymbol: true,
+    areaStyle: {
+      color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+        { offset: 0, color: "rgba(37, 99, 235, 0.24)" },
+        { offset: 1, color: "rgba(37, 99, 235, 0.02)" },
+      ]),
+    },
+  },
+  {
+    name: "鍥炴",
+    type: "line",
+    data: [],
+    smooth: true,
+    itemStyle: { color: "#14b8a6" },
+    lineStyle: { width: 2, color: "#14b8a6" },
+    showSymbol: true,
+    areaStyle: {
+      color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+        { offset: 0, color: "rgba(20, 184, 166, 0.2)" },
+        { offset: 1, color: "rgba(20, 184, 166, 0.02)" },
+      ]),
+    },
+  },
+]);
+
+const pieTooltip = reactive({
+  trigger: "item",
+  backgroundColor: "rgba(255, 255, 255, 0.97)",
+  borderColor: "rgba(148, 163, 184, 0.26)",
+  textStyle: { color: "#334155" },
+  formatter: (params) => `${params.name} ${formatNumber(params.value)}鍏� ${params.percent}%`,
+});
+
+const materialPieSeries = ref([
+  {
+    type: "pie",
+    radius: ["62%", "88%"],
+    avoidLabelOverlap: false,
+    itemStyle: {
+      borderColor: "rgba(255, 255, 255, 0.95)",
+      borderWidth: 2,
+    },
+    label: { show: false },
+    data: [],
+  },
+]);
+
+const todoList = ref([]);
+const qualityRange = ref(1);
+const processRange = ref(1);
+const processChartData = ref([]);
 
 const processXAxis = ref([
   {
-    nameTextStyle: { color: 'rgba(0,0,0,0.35)', fontSize: 12 },
-    axisLabel: { color: 'rgba(0,0,0,0.35)' },
-    splitLine: { lineStyle: { color: 'rgba(0,0,0,0.06)', type: 'dashed' } },
+    type: "value",
+    axisLine: { lineStyle: { color: axisLineColor } },
+    splitLine: { lineStyle: { color: splitLineColor, type: "dashed" } },
+    axisLabel: { color: axisTextColor },
   },
-])
+]);
 
 const processYAxis = ref([
   {
-    type: 'category',
+    type: "category",
     axisTick: { show: false },
     axisLine: { show: false },
-    axisLabel: { color: 'rgba(0,0,0,0.45)' },
+    axisLabel: { color: axisTextColor },
     data: [],
   },
-])
+]);
 
-const processGrid = reactive({ left: 0, right: 100, top: 30, bottom: 20, containLabel: true })
+const processGrid = reactive({ left: "4%", right: "4%", top: 20, bottom: 18, containLabel: true });
 
 const processTooltip = reactive({
-  trigger: 'axis',
-  axisPointer: { type: 'shadow' },
+  trigger: "axis",
+  axisPointer: { type: "shadow" },
+  backgroundColor: "rgba(255, 255, 255, 0.97)",
+  borderColor: "rgba(148, 163, 184, 0.26)",
+  textStyle: { color: "#334155" },
   formatter: (params) => {
-    const name = params?.[0]?.name ?? ''
-    const list = Array.isArray(params) ? params : []
+    const name = params?.[0]?.name ?? "";
+    const list = Array.isArray(params) ? params : [];
     const lines = list
-      .map((p) => {
-        const colorBox = `<span style="display:inline-block;margin-right:6px;border-radius:2px;width:10px;height:10px;background:${p.color}"></span>`
-        return `${colorBox}${p.seriesName} <b style="float:right;">${Number(p.value || 0).toFixed(2)}</b>`
-      })
-      .join('<br/>')
-    return `<div style="min-width:140px;"><div style="font-weight:700;margin-bottom:6px;">${name}</div>${lines}</div>`
+        .map((p) => {
+          const colorBox = `<span style="display:inline-block;margin-right:6px;border-radius:2px;width:10px;height:10px;background:${p.color}"></span>`;
+          return `${colorBox}${p.seriesName}<b style="float:right;">${Number(p.value || 0).toFixed(2)}</b>`;
+        })
+        .join("<br/>");
+    return `<div style="min-width:140px;"><div style="font-weight:700;margin-bottom:6px;">${name}</div>${lines}</div>`;
   },
-})
+});
 
 const processSeries = computed(() => {
-  const input = processChartData.value.map((i) => i.input)
-  const scrap = processChartData.value.map((i) => i.scrap)
-  const output = processChartData.value.map((i) => i.output)
-
+  const input = processChartData.value.map((item) => item.input);
+  const scrap = processChartData.value.map((item) => item.scrap);
+  const output = processChartData.value.map((item) => item.output);
   return [
     {
-      name: '鎶曞叆閲�',
-      type: 'bar',
-      stack: 'total',
-      barWidth: 22,
-      itemStyle: { color: '#1E5BFF', borderRadius: [6, 0, 0, 6] },
+      name: "鎶曞叆閲�",
+      type: "bar",
+      stack: "total",
+      barWidth: 18,
+      itemStyle: { color: "#2563eb", borderRadius: [8, 0, 0, 8] },
       data: input,
     },
     {
-      name: '鎶ュ簾閲�',
-      type: 'bar',
-      stack: 'total',
-      barWidth: 22,
-      itemStyle: { color: '#F7B500' },
+      name: "鎶ュ簾閲�",
+      type: "bar",
+      stack: "total",
+      barWidth: 18,
+      itemStyle: { color: "#f59e0b" },
       data: scrap,
     },
     {
-      name: '浜у嚭閲�',
-      type: 'bar',
-      stack: 'total',
-      barWidth: 22,
-      itemStyle: { color: '#19C6C6', borderRadius: [0, 6, 6, 0] },
+      name: "浜у嚭閲�",
+      type: "bar",
+      stack: "total",
+      barWidth: 18,
+      itemStyle: { color: "#14b8a6", borderRadius: [0, 8, 8, 0] },
       data: output,
     },
-  ]
-})
+  ];
+});
 
 const processAside = computed(() => {
-  const list = processChartData.value
-  const item = list[activeProcessIndex.value] || {}
+  const listData = processChartData.value;
+  const item = listData[activeProcessIndex.value] || {};
   return {
-    processName: item.name || '鏆傛棤鏁版嵁',
+    processName: item.name || "鏆傛棤鏁版嵁",
     totalInput: item.input || 0,
     totalScrap: item.scrap || 0,
     totalOutput: item.output || 0,
+  };
+});
+
+const processTotals = computed(() =>
+    processChartData.value.reduce(
+        (acc, cur) => {
+          acc.input += Number(cur.input || 0);
+          acc.scrap += Number(cur.scrap || 0);
+          acc.output += Number(cur.output || 0);
+          return acc;
+        },
+        { input: 0, scrap: 0, output: 0 }
+    )
+);
+
+const hasProcessData = computed(() => {
+  if (!processChartData.value.length) return false;
+  return processChartData.value.some((item) => {
+    const input = Number(item.input || 0);
+    const scrap = Number(item.scrap || 0);
+    const output = Number(item.output || 0);
+    return input > 0 || scrap > 0 || output > 0;
+  });
+});
+
+const dashboardCards = computed(() => [
+  {
+    key: "sales",
+    title: "閿�鍞暟鎹�",
+    desc: "鏈湀閿�鍞(鍏�)",
+    value: formatNumber(businessInfo.value.monthSaleMoney),
+    subLabel: "鏈紑绁ㄩ噾棰�",
+    subValue: formatNumber(businessInfo.value.monthSaleHaveMoney),
+    trend: `鍗犳瘮 ${ratioText(businessInfo.value.monthSaleHaveMoney, businessInfo.value.monthSaleMoney)}`,
+    icon: DataLine,
+    visible: visibleModules.value.sales,
+  },
+  {
+    key: "purchase",
+    title: "閲囪喘鏁版嵁",
+    desc: "鏈湀閲囪喘棰�(鍏�)",
+    value: formatNumber(businessInfo.value.monthPurchaseMoney),
+    subLabel: "寰呬粯娆鹃噾棰�",
+    subValue: formatNumber(businessInfo.value.monthPurchaseHaveMoney),
+    trend: `鍗犳瘮 ${ratioText(
+        businessInfo.value.monthPurchaseHaveMoney,
+        businessInfo.value.monthPurchaseMoney
+    )}`,
+    icon: ShoppingCartFull,
+    visible: visibleModules.value.procurement,
+  },
+  {
+    key: "inventory",
+    title: "搴撳瓨鏁版嵁",
+    desc: "褰撳墠搴撳瓨鎬婚噺(浠�)",
+    value: formatNumber(businessInfo.value.inventoryNum),
+    subLabel: "浠婃棩鍏ュ簱",
+    subValue: formatNumber(businessInfo.value.todayInventoryNum),
+    trend: "搴撳瓨缁撴瀯鎸佺画浼樺寲",
+    icon: Box,
+    visible: visibleModules.value.inventory,
+  },
+  {
+    key: "production",
+    title: "鐢熶骇鎬昏",
+    desc: "绱浜у嚭(浠�)",
+    value: formatNumber(productionOverviewData.value.totalOutput),
+    subLabel: "绱鎶ュ簾",
+    subValue: formatNumber(productionOverviewData.value.totalScrap),
+    trend: `鑹巼 ${Number(productionOverviewData.value.yieldRate || 0).toFixed(2)}%`,
+    icon: Operation,
+    visible: visibleModules.value.production,
+  },
+].filter((item) => item.visible));
+
+const productionOrders = ref([]);
+
+const orderFilterOptions = ["all", "waiting", "inProgress", "completed", "paused"];
+const orderFilterAliasMap = {
+  1: "waiting",
+  2: "inProgress",
+  3: "completed",
+  4: "paused",
+};
+const orderFilter = ref("all");
+const filteredOrders = computed(() => productionOrders.value);
+
+const normalizeOrderFilter = (value, fallback = "all") => {
+  const safeFallback = orderFilterOptions.includes(fallback) ? fallback : "all";
+  const text = String(value ?? "").trim();
+  if (orderFilterAliasMap[text]) {
+    return orderFilterAliasMap[text];
   }
-})
+  return orderFilterOptions.includes(text) ? text : safeFallback;
+};
 
-const formatAmount = (n) => {
-  const num = Number(n || 0)
-  return num.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })
-}
+const parseCount = (value) => {
+  if (value === null || value === undefined || value === "") return null;
+  const num = Number(value);
+  return Number.isFinite(num) ? num : null;
+};
 
-const refreshProcessStats = () => {
-  processDataProductionStatistics({
+const resolveProgressCount = (rawValue, currentStatus, targetStatus, total) => {
+  const count = parseCount(rawValue);
+  if (count !== null) return count;
+  return currentStatus === targetStatus ? total : 0;
+};
+
+const getCompareTrend = (value) => {
+  const num = Number(value || 0);
+  if (num > 0) return "up";
+  if (num < 0) return "down";
+  return "flat";
+};
+
+const getCompareText = (value) => {
+  const num = Number(value || 0);
+  const abs = Math.abs(num).toFixed(2);
+  if (num > 0) return `杈冩槰鏃� 鈫� ${abs}%`;
+  if (num < 0) return `杈冩槰鏃� 鈫� ${abs}%`;
+  return "杈冩槰鏃� 鎸佸钩";
+};
+
+const realtimeBoard = computed(() => {
+  const oee = Number(realtimeBoardData.value.deviceOee?.value || 0);
+  const orderAchievement = Number(realtimeBoardData.value.orderAchievementRate?.value || 0);
+  const defectRate = Number(realtimeBoardData.value.defectRate?.value || 0);
+  const oeeCompare = Number(realtimeBoardData.value.deviceOee?.compareYesterday || 0);
+  const orderCompare = Number(realtimeBoardData.value.orderAchievementRate?.compareYesterday || 0);
+  const defectCompare = Number(realtimeBoardData.value.defectRate?.compareYesterday || 0);
+  return [
+    {
+      key: "oee",
+      label: "璁惧 OEE",
+      percent: clampPercent(oee),
+      display: `${oee.toFixed(2)}%`,
+      delta: getCompareText(oeeCompare),
+      trend: getCompareTrend(oeeCompare),
+      color: "#2d8cff",
+    },
+    {
+      key: "order",
+      label: "璁㈠崟杈炬垚鐜�",
+      percent: clampPercent(orderAchievement),
+      display: `${orderAchievement.toFixed(2)}%`,
+      delta: getCompareText(orderCompare),
+      trend: getCompareTrend(orderCompare),
+      color: "#31d2ff",
+    },
+    {
+      key: "defect",
+      label: "涓嶈壇鐜�",
+      percent: clampPercent(defectRate),
+      display: `${defectRate.toFixed(2)}%`,
+      delta: getCompareText(defectCompare),
+      trend: getCompareTrend(defectCompare),
+      color: "#f6a23f",
+    },
+  ];
+});
+
+const warningList = ref([
+  {
+    id: 1,
+    level: "device",
+    title: "璁惧棰勮",
+    desc: "CNC-001 璁惧鎸姩寮傚父",
+    time: "10:24:32",
+  },
+  {
+    id: 2,
+    level: "quality",
+    title: "璐ㄩ噺棰勮",
+    desc: "璁㈠崟 SO-20260517 涓嶈壇鐜囪秴鏍�",
+    time: "09:15:47",
+  },
+  {
+    id: 3,
+    level: "material",
+    title: "鐗╂枡棰勮",
+    desc: "鐗╂枡 1002001 搴撳瓨涓嶈冻",
+    time: "08:47:21",
+  },
+]);
+
+const quickEntryConfigs = [
+  { label: "涓荤敓浜ц鍒�", icon: Calendar, titles: ["涓荤敓浜ц鍒�"], fallbackPath: "/productionPlan/productionPlan" },
+  { label: "鐢熶骇璁㈠崟", icon: Tickets, titles: ["鐢熶骇璁㈠崟"], fallbackPath: "/productionManagement/productionOrder" },
+  { label: "鐢熶骇鎶ュ伐", icon: EditPen, titles: ["鐢熶骇鎶ュ伐"], fallbackPath: "/productionManagement/productionReporting" },
+  { label: "璁惧鍙拌处", icon: Tools, titles: ["璁惧鍙拌处"], fallbackPath: "/equipmentManagement/ledger" },
+  { label: "閿�鍞彴璐�", icon: DataLine, titles: ["閿�鍞彴璐�"], fallbackPath: "/salesManagement/salesLedger" },
+  { label: "閲囪喘鍙拌处", icon: ShoppingCartFull, titles: ["閲囪喘鍙拌处"], fallbackPath: "/procurementManagement/procurementLedger" },
+  { label: "鍛樺伐鍙拌处", icon: UserFilled, titles: ["鍛樺伐鍙拌处", "鍦ㄨ亴鍛樺伐鍙拌处"], fallbackPath: "/personnelManagement/employeeRecord" },
+  { label: "搴撳瓨绠$悊", icon: Box, titles: ["搴撳瓨绠$悊"], fallbackPath: "/inventoryManagement/stockManage" },
+];
+
+const normalizeMenuTitle = (title) => String(title || "").replace(/\s+/g, "").trim();
+const normalizeRoutePath = (path) =>
+    String(path || "")
+        .trim()
+        .replace(/\/+/g, "/")
+        .replace(/\/$/, "")
+        .toLowerCase();
+
+const resolveRoutePath = (route, parentPath = "") => {
+  const currentPath = String(route?.path || "").trim();
+  if (!currentPath) return parentPath || "";
+  if (/^(https?:)?\/\//.test(currentPath)) return currentPath;
+  if (currentPath.startsWith("/")) return currentPath;
+  const basePath = parentPath && parentPath !== "/" ? parentPath.replace(/\/$/, "") : "";
+  return `${basePath}/${currentPath}`.replace(/\/+/g, "/");
+};
+
+const collectAccessibleRoutes = (routes = [], parentPath = "") => {
+  const items = [];
+  (routes || []).forEach((route) => {
+    if (!route) return;
+    const fullPath = resolveRoutePath(route, parentPath);
+    const title = route.meta?.title ?? route.title ?? "";
+    if (title && fullPath && !String(route.redirect || "").includes("noRedirect")) {
+      items.push({
+        title: normalizeMenuTitle(title),
+        path: normalizeRoutePath(fullPath),
+      });
+    }
+    if (Array.isArray(route.children) && route.children.length > 0) {
+      items.push(...collectAccessibleRoutes(route.children, fullPath));
+    }
+  });
+  return items;
+};
+
+const accessibleMenuRoutes = computed(() => {
+  const routePool =
+      permissionStore.defaultRoutes?.length > 0
+          ? permissionStore.defaultRoutes
+          : permissionStore.sidebarRouters?.length > 0
+              ? permissionStore.sidebarRouters
+              : permissionStore.routes;
+  return collectAccessibleRoutes(routePool || []);
+});
+
+const moduleAccessConfig = {
+  sales: {
+    titles: ["閿�鍞鐞�", "閿�鍞彴璐�"],
+    pathPrefixes: ["/salesmanagement"],
+  },
+  procurement: {
+    titles: ["閲囪喘绠$悊", "閲囪喘鍙拌处"],
+    pathPrefixes: ["/procurementmanagement"],
+  },
+  inventory: {
+    titles: ["搴撳瓨绠$悊"],
+    pathPrefixes: ["/inventorymanagement"],
+  },
+  production: {
+    titles: ["鐢熶骇绠$悊", "涓荤敓浜ц鍒�", "鐢熶骇璁㈠崟", "鐢熶骇鎶ュ伐"],
+    pathPrefixes: ["/productionmanagement", "/productionplan"],
+  },
+  quality: {
+    titles: ["璐ㄩ噺绠$悊"],
+    pathPrefixes: ["/qualitymanagement"],
+  },
+  equipment: {
+    titles: ["璁惧绠$悊", "璁惧鍙拌处"],
+    pathPrefixes: ["/equipmentmanagement"],
+  },
+  personnel: {
+    titles: ["浜轰簨绠$悊", "鍛樺伐鍙拌处", "鍦ㄨ亴鍛樺伐鍙拌处"],
+    pathPrefixes: ["/personnelmanagement"],
+  },
+  approval: {
+    titles: ["鍗忓悓瀹℃壒", "寰呭姙浜嬮」"],
+    pathPrefixes: ["/collaborativeapproval"],
+  },
+  finance: {
+    titles: ["璐㈠姟绠$悊", "璐㈠姟鍒嗘瀽", "鍥炴绠$悊", "寮�绁ㄧ鐞�"],
+    pathPrefixes: ["/financesuite", "/financialmanagement"],
+  },
+};
+
+const hasModuleAccess = (config) =>
+    accessibleMenuRoutes.value.some((route) => {
+      const matchedTitle = (config.titles || []).some((title) => route.title === normalizeMenuTitle(title));
+      const matchedPath = (config.pathPrefixes || []).some(
+          (prefix) => route.path === prefix || route.path.startsWith(`${prefix}/`)
+      );
+      return matchedTitle || matchedPath;
+    });
+
+const visibleModules = computed(() => ({
+  sales: hasModuleAccess(moduleAccessConfig.sales),
+  procurement: hasModuleAccess(moduleAccessConfig.procurement),
+  inventory: hasModuleAccess(moduleAccessConfig.inventory),
+  production: hasModuleAccess(moduleAccessConfig.production),
+  quality: hasModuleAccess(moduleAccessConfig.quality),
+  equipment: hasModuleAccess(moduleAccessConfig.equipment),
+  personnel: hasModuleAccess(moduleAccessConfig.personnel),
+  approval: hasModuleAccess(moduleAccessConfig.approval),
+  finance: hasModuleAccess(moduleAccessConfig.finance),
+}));
+
+const visiblePanels = computed(() => ({
+  process: visibleModules.value.production,
+  order: visibleModules.value.production,
+  contract: visibleModules.value.sales,
+  quality: visibleModules.value.quality,
+  todo: visibleModules.value.approval,
+  realtime: visibleModules.value.production,
+  quick: quickEntries.value.length > 0,
+  plan: visibleModules.value.production,
+  receipt: visibleModules.value.sales || visibleModules.value.finance,
+}));
+
+const hasLeftPanels = computed(
+    () => visiblePanels.value.process || visiblePanels.value.order || visiblePanels.value.contract || visiblePanels.value.quality
+);
+const hasRightPanels = computed(
+    () => visiblePanels.value.todo || visiblePanels.value.realtime || visiblePanels.value.quick || visiblePanels.value.plan || visiblePanels.value.receipt
+);
+const hasVisiblePanels = computed(() => hasLeftPanels.value || hasRightPanels.value);
+
+const quickEntries = computed(() =>
+    quickEntryConfigs
+        .map((item) => {
+          const targetRoute = accessibleMenuRoutes.value.find((route) =>
+              item.titles.some((title) => route.title === normalizeMenuTitle(title))
+          );
+          const resolvedPath = targetRoute?.path || "";
+          return resolvedPath
+              ? {
+                label: item.label,
+                icon: item.icon,
+                path: resolvedPath,
+              }
+              : null;
+        })
+        .filter(Boolean)
+);
+
+const updateNowTime = () => {
+  nowTime.value = dayjs().format("YYYY-MM-DD HH:mm:ss");
+};
+
+const formatNumber = (value) => {
+  const num = Number(value || 0);
+  return num.toLocaleString(undefined, {
+    minimumFractionDigits: 2,
+    maximumFractionDigits: 2,
+  });
+};
+
+const formatAmount = (value) => {
+  const num = Number(value || 0);
+  return num.toLocaleString(undefined, {
+    minimumFractionDigits: 2,
+    maximumFractionDigits: 2,
+  });
+};
+
+const trendText = (value) => {
+  const num = Number(value || 0);
+  const flag = num >= 0 ? "鈫�" : "鈫�";
+  return `${flag} ${Math.abs(num).toFixed(1)}%`;
+};
+
+const ratioNumber = (numerator, denominator) => {
+  const n = Number(numerator || 0);
+  const d = Number(denominator || 0);
+  if (!d) return 0;
+  return (n / d) * 100;
+};
+
+const ratioText = (numerator, denominator) => `${ratioNumber(numerator, denominator).toFixed(1)}%`;
+
+const clampPercent = (val) => Math.max(0, Math.min(100, Number(val || 0)));
+
+const getOrderStatusText = (status) => {
+  const mapping = {
+    1: "寰呭紑濮�",
+    2: "杩涜涓�",
+    3: "宸插畬鎴�",
+    4: "宸叉殏鍋�",
+  };
+  return mapping[status] || "鏈煡";
+};
+
+const getOrderStatusType = (status) => {
+  const mapping = {
+    1: "info",
+    2: "success",
+    3: "primary",
+    4: "warning",
+  };
+  return mapping[status] || "info";
+};
+
+const formatDueDate = (value) => {
+  if (!value) return "--";
+  const date = dayjs(value);
+  return date.isValid() ? date.format("YYYY-MM-DD") : "--";
+};
+
+const mapOrderProgressRecord = (item = {}) => ({
+  orderNo: item.orderNo || "--",
+  productName: item.productName || "--",
+  planQty: Number(item.plannedQuantity || 0),
+  completedQty: Number(item.completedQuantity || 0),
+  completionRate: clampPercent(Number(item.completionRate || 0)),
+  deliveryDate: formatDueDate(item.dueDate),
+  status: Number(item.status || 0),
+  statusLabel: item.statusLabel || "",
+});
+
+const mapTodayPlanRecord = (item = {}) => ({
+  orderNo: item.orderNo || "--",
+  productName: item.productName || "--",
+  planQty: Number(item.plannedQuantity || 0),
+  deliveryDate: formatDueDate(item.dueDate),
+  status: Number(item.status || 0),
+  statusLabel: item.statusLabel || "",
+});
+
+const refreshProductionOverview = async () => {
+  try {
+    const res = await productionOverview();
+    const data = res?.data || {};
+    productionOverviewData.value = {
+      totalOutput: Number(data.totalOutput || 0),
+      totalScrap: Number(data.totalScrap || 0),
+      yieldRate: Number(data.yieldRate || 0),
+    };
+  } catch {
+    productionOverviewData.value = {
+      totalOutput: 0,
+      totalScrap: 0,
+      yieldRate: 0,
+    };
+  }
+};
+
+const refreshProductionRealtimeBoard = async () => {
+  try {
+    const res = await productionRealtimeBoard();
+    const data = res?.data || {};
+    realtimeBoardData.value = {
+      deviceOee: {
+        value: Number(data.deviceOee?.value || 0),
+        compareYesterday: Number(data.deviceOee?.compareYesterday || 0),
+      },
+      orderAchievementRate: {
+        value: Number(data.orderAchievementRate?.value || 0),
+        compareYesterday: Number(data.orderAchievementRate?.compareYesterday || 0),
+      },
+      defectRate: {
+        value: Number(data.defectRate?.value || 0),
+        compareYesterday: Number(data.defectRate?.compareYesterday || 0),
+      },
+    };
+  } catch {
+    realtimeBoardData.value = {
+      deviceOee: { value: 0, compareYesterday: 0 },
+      orderAchievementRate: { value: 0, compareYesterday: 0 },
+      defectRate: { value: 0, compareYesterday: 0 },
+    };
+  }
+};
+
+const refreshProductionOrderProgress = async () => {
+  try {
+    const res = await productionOrderProgress({
+      status: orderFilter.value,
+      tab: orderFilter.value,
+      pageNum: 1,
+      pageSize: 10,
+    });
+    const data = res?.data || {};
+    const statusValue = normalizeOrderFilter(data.status, orderFilter.value);
+    const total = Number(data.total || 0);
+    orderProgressMeta.value = {
+      status: statusValue,
+      tab: data.tab || orderFilter.value,
+      bizDate: data.bizDate || null,
+      total,
+      pageNum: Number(data.pageNum || 1),
+      pageSize: Number(data.pageSize || 10),
+      waitingCount: resolveProgressCount(data.waitingCount, statusValue, "waiting", total),
+      inProgressCount: resolveProgressCount(data.inProgressCount, statusValue, "inProgress", total),
+      completedCount: resolveProgressCount(data.completedCount, statusValue, "completed", total),
+      pausedCount: resolveProgressCount(data.pausedCount, statusValue, "paused", total),
+    };
+    productionOrders.value = (data.records || []).map(mapOrderProgressRecord);
+  } catch {
+    orderProgressMeta.value = {
+      status: orderFilter.value,
+      tab: orderFilter.value,
+      bizDate: null,
+      total: 0,
+      pageNum: 1,
+      pageSize: 10,
+      waitingCount: 0,
+      inProgressCount: 0,
+      completedCount: 0,
+      pausedCount: 0,
+    };
+    productionOrders.value = [];
+  }
+};
+
+const refreshTodayProductionPlan = async () => {
+  try {
+    const res = await todayProductionPlan({
+      limit: 4,
+      planDate: nowDate.value,
+    });
+    const data = res?.data || {};
+    todayPlanTotal.value = Number(data.total || 0);
+    todayPlanList.value = (data.records || []).map(mapTodayPlanRecord);
+  } catch {
+    todayPlanTotal.value = 0;
+    todayPlanList.value = [];
+  }
+};
+
+const getBusinessData = async () => {
+  const res = await getBusiness();
+  businessInfo.value = { ...res.data };
+};
+
+const analysisCustomer = async () => {
+  const res = await analysisCustomerContractAmounts();
+  sum.value = res.data.sum;
+  yny.value = res.data.yny;
+  chain.value = res.data.chain;
+  materialPieSeries.value[0].data = (res.data.item || []).map((item, index) => ({
+    ...item,
+    rate: Number(item.rate || 0),
+    itemStyle: { color: piePalette[index % piePalette.length] },
+  }));
+};
+
+const todoInfoS = async () => {
+  const res = await homeTodos();
+  todoList.value = res.data || [];
+};
+
+const statisticsReceivable = async () => {
+  const res = await statisticsReceivablePayable({ type: 1 });
+  const data = res?.data || {};
+  const payableMoney = Number(data.payableMoney ?? 0);
+  const receivableMoney = Number(data.receivableMoney ?? 0);
+  barSeries.value[0].data = [
+    { value: payableMoney, itemStyle: { color: barColors2[0] } },
+    { value: receivableMoney, itemStyle: { color: barColors2[1] } },
+  ];
+};
+
+const qualityStatisticsInfo = async () => {
+  const res = await qualityInspectionStatistics({ type: qualityRange.value });
+  xAxis1.value[0].data = [];
+  barSeries1.value[0].data = [];
+  barSeries1.value[1].data = [];
+  barSeries1.value[2].data = [];
+  const data = res.data || {};
+  (data.item || []).forEach((item) => {
+    xAxis1.value[0].data.push(item.date);
+    barSeries1.value[0].data.push(item.supplierNum);
+    barSeries1.value[1].data.push(item.processNum);
+    barSeries1.value[2].data.push(item.factoryNum);
+  });
+  qualityStatisticsObject.value.supplierNum = data.supplierNum || 0;
+  qualityStatisticsObject.value.processNum = data.processNum || 0;
+  qualityStatisticsObject.value.factoryNum = data.factoryNum || 0;
+};
+
+const getAmountHalfYearNum = async () => {
+  const res = await getAmountHalfYear();
+  const monthName = [];
+  const receiptAmount = [];
+  const invoiceAmount = [];
+  (res.data || []).forEach((item) => {
+    monthName.push(item.month);
+    receiptAmount.push(item.receiptAmount);
+    invoiceAmount.push(item.invoiceAmount);
+  });
+
+  xAxis2.value[0].data = monthName.map((item) => item.replace(/~/g, "\n~"));
+  lineSeries.value[0].data = invoiceAmount;
+  lineSeries.value[1].data = receiptAmount;
+};
+
+const getProcessList = async () => {
+  const res = await list();
+  processOptions.value = res.data.records || [];
+};
+
+const refreshProcessStats = async () => {
+  const res = await processDataProductionStatistics({
     type: processRange.value,
-    processIds: selectedProcessIds.value.length > 0 ? selectedProcessIds.value.join(',') : null
-  }).then(res => {
-    processChartData.value = res.data.map(item => ({
-      name: item.processName,
-      input: item.totalInput,
-      scrap: item.totalScrap,
-      output: item.totalOutput
-    }))
-    processYAxis.value[0].data = processChartData.value.map((i) => i.name)
-    activeProcessIndex.value = 0
-  })
-}
+    processIds: selectedProcessIds.value.length > 0 ? selectedProcessIds.value.join(",") : null,
+  });
+  processChartData.value = (res.data || []).map((item) => ({
+    name: item.processName,
+    input: item.totalInput,
+    scrap: item.totalScrap,
+    output: item.totalOutput,
+  }));
+  processYAxis.value[0].data = processChartData.value.map((item) => item.name);
+  activeProcessIndex.value = 0;
+};
+
+const openProcessDialog = () => {
+  tempProcessIds.value = [...selectedProcessIds.value];
+  processDialogVisible.value = true;
+};
+
+const handleProcessDialogConfirm = () => {
+  selectedProcessIds.value = [...tempProcessIds.value];
+  processDialogVisible.value = false;
+  refreshProcessStats();
+};
+
+const resetProcessFilter = () => {
+  selectedProcessIds.value = [];
+  tempProcessIds.value = [];
+  refreshProcessStats();
+};
+
+const handleChartClick = (params) => {
+  if (params && params.dataIndex !== undefined) {
+    activeProcessIndex.value = params.dataIndex;
+  }
+};
+
+const goToQuick = (path) => {
+  if (!path) return;
+  router.push(path).catch(() => {});
+};
+
+watch(orderFilter, () => {
+  if (visiblePanels.value.order) {
+    refreshProductionOrderProgress();
+  }
+});
 
 onMounted(() => {
-  getBusinessData()
-  analysisCustomer()
-  todoInfoS()
-  statisticsReceivable()
-  qualityStatisticsInfo()
-  getAmountHalfYearNum()
-  refreshProcessStats()
-})
+  updateNowTime();
+  clockTimer = setInterval(updateNowTime, 1000);
+  if (dashboardCards.value.length > 0) {
+    getBusinessData();
+  }
+  if (visibleModules.value.production) {
+    refreshProductionOverview();
+  }
+  if (visiblePanels.value.contract) {
+    analysisCustomer();
+  }
+  if (visiblePanels.value.todo) {
+    todoInfoS();
+  }
+  if (visiblePanels.value.quality) {
+    qualityStatisticsInfo();
+  }
+  if (visiblePanels.value.receipt) {
+    statisticsReceivable();
+    getAmountHalfYearNum();
+  }
+  if (visiblePanels.value.process) {
+    getProcessList();
+    refreshProcessStats();
+  }
+  if (visiblePanels.value.order) {
+    refreshProductionOrderProgress();
+  }
+  if (visiblePanels.value.realtime) {
+    refreshProductionRealtimeBoard();
+  }
+  if (visiblePanels.value.plan) {
+    refreshTodayProductionPlan();
+  }
+});
+
+onUnmounted(() => {
+  if (clockTimer) {
+    clearInterval(clockTimer);
+  }
+});
 </script>
 
 <style scoped>
-.dashboard {
-  min-height: 100vh;
-  padding: 20px;
-  box-sizing: border-box;
-}
-
-.dashboard-top {
-  display: flex;
-  gap: 20px;
-  margin-bottom: 20px;
-  align-items: flex-start;
-  justify-content: space-evenly;
-}
-
-.company-info {
+.dashboard-cockpit {
+  min-height: calc(100vh - var(--topbar-height) - var(--tagsbar-height));
+  width: 100%;
+  min-width: 0;
   padding: 0;
-  overflow: hidden;
-  border-radius: 12px;
-  background: #fff;
-  height: 100%;
+  display: flex;
+  flex-direction: column;
+  gap: 16px;
+  overflow-x: clip;
+  margin-top: 10px;
 }
 
-.welcome-banner {
-  padding: 10px 10px;
-  background: linear-gradient(135deg, rgba(229, 240, 255, 0.9), rgba(214, 232, 255, 0.7), rgba(207, 236, 255, 0.9));
+.digital-number {
+  font-family: "DIN Alternate Bold", "Segoe UI", "PingFang SC", sans-serif;
+  letter-spacing: 0;
 }
 
-.welcome-title {
-  font-size: 18px;
-  font-weight: 700;
-  color: #222;
-  line-height: 1.3;
+.cockpit-panel {
+  position: relative;
+  background: rgba(255, 255, 255, 0.9);
+  border: 1px solid rgba(148, 163, 184, 0.18);
+  border-radius: 16px;
+  box-shadow: 0 12px 32px rgba(15, 23, 42, 0.06);
+  backdrop-filter: blur(12px);
+  padding: 16px;
+}
+
+.welcome-panel {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  min-height: 92px;
+  padding: 18px 22px;
+  background:
+      radial-gradient(circle at 8% 20%, rgba(59, 130, 246, 0.12), transparent 32%),
+      linear-gradient(135deg, rgba(255, 255, 255, 0.94), rgba(239, 246, 255, 0.88));
 }
 
 .welcome-user {
-  margin-right: 6px;
-}
-
-.welcome-time {
-  margin-top: 10px;
-  font-size: 16px;
-  color: rgba(0, 0, 0, 0.55);
-}
-
-.user-card {
   display: flex;
   align-items: center;
-  gap: 10px;
-  padding: 18px 22px;
-}
-
-.user-card-main {
-  display: flex;
-  flex-direction: column;
-  gap: 5px;
-  min-width: 0;
-}
-
-.user-name {
-  font-size: 16px;
-  font-weight: bold;
-  color: #111;
-  letter-spacing: 1px;
-}
-
-.user-role {
-  display: inline-flex;
-  align-items: center;
-  justify-content: center;
-  height: 20px;
-  padding: 5px 10px;
-  background: rgba(245, 246, 248, 1);
-  color: #333;
-  width: fit-content;
-  font-weight: 600;
-}
-
-.user-meta {
-  font-size: 12px;
-  color: rgba(0, 0, 0, 0.55);
-  white-space: nowrap;
-  overflow: hidden;
-  text-overflow: ellipsis;
-}
-
-.user-meta .sep {
-  margin: 0 10px;
-  color: rgba(0, 0, 0, 0.25);
+  gap: 12px;
 }
 
 .avatar {
-  width: 90px;
-  height: 90px;
-  border-radius: 50%;
+  width: 52px;
+  height: 52px;
+  border: 1px solid rgba(147, 197, 253, 0.42);
+  background: linear-gradient(145deg, #ffffff, #eef5ff);
+  box-shadow: 0 8px 20px rgba(37, 99, 235, 0.14);
+}
+
+.avatar :deep(img) {
+  width: 100%;
+  height: 100%;
   object-fit: cover;
-  flex: 0 0 auto;
 }
 
-.data-cards {
-  width: 50%;
-  display: flex;
-  gap: 16px;
-  justify-content: flex-start;
-  background: #ffffff;
-  border-radius: 12px;
-  padding: 20px;
+.avatar :deep(.el-icon) {
+  font-size: 24px;
+  color: #3b82f6;
 }
 
-.data-title {
+.welcome-title {
+  font-size: 28px;
   font-weight: 700;
-  font-size: 26px;
-  color: #FFFFFF;
+  color: #1e3a5f;
+  line-height: 1.08;
 }
 
-.data-num {
+.welcome-subtitle {
+  margin-top: 6px;
+  color: #64748b;
+  font-size: 14px;
+}
+
+.welcome-meta {
+  text-align: right;
+}
+
+.meta-time {
+  font-size: 28px;
+  color: #1f3658;
+  font-weight: 700;
+}
+
+.meta-extra {
+  margin-top: 6px;
+  display: flex;
+  justify-content: flex-end;
+  gap: 14px;
+  color: #64748b;
+  font-size: 13px;
+}
+
+.meta-tip {
+  margin-top: 4px;
+  color: #7a8ca6;
+  font-size: 13px;
+}
+
+.top-row {
+  display: block;
+}
+
+.stats-grid {
+  display: grid;
+  grid-template-columns: repeat(4, minmax(0, 1fr));
+  gap: 14px;
+}
+
+.stat-card {
+  position: relative;
+  border-radius: 18px;
+  padding: 18px 20px 22px;
+  min-height: 182px;
+  height: auto;
+  overflow: hidden;
+  border: 1px solid rgba(148, 163, 184, 0.2);
+  box-shadow: 0 10px 26px rgba(15, 23, 42, 0.06);
+  transition: transform 0.22s ease, box-shadow 0.22s ease;
+}
+
+.stat-card:hover {
+  transform: translateY(-2px);
+  box-shadow: 0 18px 40px rgba(37, 99, 235, 0.1);
+}
+
+.stat-card.sales {
+  background: linear-gradient(135deg, #ffffff 0%, #eaf3ff 100%);
+}
+
+.stat-card.purchase {
+  background: linear-gradient(135deg, #ffffff 0%, #e8fffb 100%);
+}
+
+.stat-card.inventory {
+  background: linear-gradient(135deg, #ffffff 0%, #f2edff 100%);
+}
+
+.stat-card.production {
+  background: linear-gradient(135deg, #ffffff 0%, #fff4e6 100%);
+}
+
+.stat-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: flex-start;
+  position: relative;
+  z-index: 2;
+}
+
+.stat-title {
+  font-size: 16px;
+  font-weight: 700;
+}
+
+.stat-card.sales .stat-title {
+  color: #1d4ed8;
+}
+
+.stat-card.purchase .stat-title {
+  color: #0f766e;
+}
+
+.stat-card.inventory .stat-title {
+  color: #6d28d9;
+}
+
+.stat-card.production .stat-title {
+  color: #c2410c;
+}
+
+.stat-desc {
+  margin-top: 6px;
+  color: #64748b;
+  font-size: 13px;
+}
+
+.stat-icon-orb {
+  width: 52px;
+  height: 52px;
+  border-radius: 50%;
   display: flex;
   align-items: center;
-  justify-content: space-between;
-  margin-top: 20px;
+  justify-content: center;
+  font-size: 22px;
+  color: #fff;
 }
 
-.data-card {
-  background: #fff;
-  border-radius: 12px;
-  padding: 14px 10px 10px 10px;
-  min-width: 160px;
-  box-shadow: 0 2px 8px #eee;
-  display: flex;
-  flex-direction: column;
-  width: 32%;
-  height: 140px;
+.stat-card.sales .stat-icon-orb {
+  background: linear-gradient(135deg, #2563eb, #60a5fa);
+  box-shadow: 0 10px 24px rgba(37, 99, 235, 0.32);
 }
 
-.data-card.sales {
-  background-image: url("../assets/images/xioashoushuju.png");
-  background-size: cover;
-  background-position: center;
-  background-repeat: no-repeat;
+.stat-card.purchase .stat-icon-orb {
+  background: linear-gradient(135deg, #14b8a6, #5eead4);
+  box-shadow: 0 10px 24px rgba(20, 184, 166, 0.3);
 }
 
-.data-card.purchase {
-  background-image: url("../assets/images/caigou.png");
-  background-size: cover;
-  background-position: center;
-  background-repeat: no-repeat;
+.stat-card.inventory .stat-icon-orb {
+  background: linear-gradient(135deg, #7c3aed, #a78bfa);
+  box-shadow: 0 10px 24px rgba(124, 58, 237, 0.28);
 }
 
-.data-card.inventory {
-  background-image: url("../assets/images/kucun.png");
-  background-size: cover;
-  background-position: center;
-  background-repeat: no-repeat;
+.stat-card.production .stat-icon-orb {
+  background: linear-gradient(135deg, #f97316, #fdba74);
+  box-shadow: 0 10px 24px rgba(249, 115, 22, 0.3);
 }
 
-.data-desc {
-  font-weight: 500;
+.stat-value {
+  margin-top: 14px;
+  font-size: 30px;
+  line-height: 1.08;
+  font-weight: 700;
+  color: #0f172a;
+  position: relative;
+  z-index: 2;
+}
+
+.stat-footer {
+  margin-top: 8px;
+  color: #64748b;
   font-size: 13px;
-  color: #FFFFFF;
-}
-
-.data-value {
-  font-size: 18px;
-  font-weight: 500;
-  margin: 10px 0;
-  color: #FFFFFF;
-}
-
-.top-left {
   display: flex;
-  flex-direction: column;
-  gap: 20px;
-  height: 180px;
-  width: 20%;
+  justify-content: space-between;
+  align-items: center;
+  position: relative;
+  z-index: 2;
+}
+
+.stat-trend {
+  margin-top: 6px;
+  color: #0ea5a4;
+  font-size: 13px;
+  line-height: 1.25;
+  font-weight: 600;
+  position: relative;
+  z-index: 2;
+}
+
+.stat-wave {
+  position: absolute;
+  left: 10px;
+  right: 10px;
+  bottom: 6px;
+  height: 30px;
+  opacity: 0.62;
+  z-index: 1;
+  pointer-events: none;
+  background:
+      url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 340 40' preserveAspectRatio='none'%3E%3Cpath d='M0 31C20 16 44 36 66 24C87 12 107 31 129 18C148 8 169 28 193 16C214 5 237 25 259 14C280 3 306 19 340 8' fill='none' stroke='%236ea4ee' stroke-width='1.5'/%3E%3C/svg%3E")
+      center / 100% 100% no-repeat;
 }
 
 .todo-panel {
-  background: #fff;
-  border-radius: 12px;
-  padding: 20px;
-  height: 180px;
-  width: 30%;
+  padding: 12px;
+}
+
+.panel-title-row {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  gap: 12px;
+}
+
+.panel-title {
+  font-size: 18px;
+  font-weight: 700;
+  color: #1f3658;
+  position: relative;
+  padding-left: 12px;
+}
+
+.panel-title::before {
+  content: "";
+  position: absolute;
+  left: 0;
+  top: 50%;
+  transform: translateY(-50%);
+  width: 4px;
+  height: 18px;
+  border-radius: 4px;
+  background: linear-gradient(180deg, #2563eb, #38bdf8);
+}
+
+.panel-more {
+  font-size: 14px;
+  color: #2563eb;
+  cursor: pointer;
 }
 
 .todo-list {
-  height: 100px;
-  list-style: none;
+  margin: 10px 0 0;
   padding: 0;
-  margin: 0;
-  font-size: 15px;
+  list-style: none;
+  display: flex;
+  flex-direction: column;
+  gap: 8px;
+  max-height: 230px;
   overflow-y: auto;
 }
 
-.todo-list li {
-  border-radius: 8px;
-  margin-bottom: 12px;
-  padding: 8px 20px;
-  height: 74px;
+.todo-item {
+  border: 1px solid rgba(148, 163, 184, 0.2);
+  border-radius: 12px;
+  background: #f7fbff;
+  padding: 10px 12px;
+}
+
+.todo-head {
   display: flex;
   justify-content: space-between;
-  align-items: center;
-  background: rgba(225, 227, 250, 0.62);
-}
-
-.todo-title {
-  font-weight: 400;
-  font-size: 12px;
-  color: #000000;
-  position: relative;
-}
-
-.todo-title::before {
-  content: '';
-  /* 蹇呴渶锛岃〃绀鸿繖閲屾湁涓�涓唴瀹� */
-  position: absolute;
-  left: -10px;
-  /* 瀹氫綅鍒板乏渚� */
-  top: 50%;
-  /* 鍨傜洿灞呬腑 */
-  transform: translateY(-50%);
-  /* 寰皟鍨傜洿灞呬腑 */
-  width: 6px;
-  /* 鍦嗙殑鐩村緞 */
-  height: 6px;
-  /* 鍦嗙殑鐩村緞 */
-  background: #498CEB;
-  border-radius: 50%;
-  /* 璁╁叾鍙樻垚鍦嗗舰 */
-}
-
-.todo-division {
-  font-weight: 400;
-  font-size: 12px;
-  color: #000000;
-}
-
-.todo-time {
-  font-weight: 400;
-  font-size: 12px;
-  color: #000000;
-}
-
-.todo-meta {
-  color: #888;
+  gap: 10px;
+  color: #334155;
   font-size: 13px;
 }
 
-.dashboard-row {
-  display: flex;
-  gap: 20px;
-  margin-bottom: 20px;
-}
-
-.main-panel {
-  background: #fff;
-  border-radius: 12px;
-  padding: 20px;
-  flex: 1;
-  min-width: 0;
-  display: flex;
-  flex-direction: column;
-}
-
-.section-title {
-  position: relative;
-  font-size: 18px;
-  color: #333;
-  padding-left: 10px;
-  margin-bottom: 10px;
-  font-weight: 700;
-}
-
-.section-title::before {
-  position: absolute;
-  left: 0;
-  top: 4px;
-  content: '';
-  width: 4px;
-  height: 18px;
-  background-color: #002FA7;
-  border-radius: 2px;
-}
-
-.contract-info {
-  display: flex;
-  align-items: center;
-  gap: 20px;
-  height: 90px;
-  background: rgba(245, 245, 245, 0.59);
-  width: 100%;
-  border-radius: 10px;
-  padding: 10px 30px;
-}
-
-.contract-summary {
-  display: flex;
-  align-items: center;
-  gap: 30px;
-}
-
-.contract-card {
-  display: flex;
-  flex-direction: column;
-  gap: 10px;
-}
-
-.contract-name {
-  font-weight: 400;
-  font-size: 14px;
-  color: #050505;
-}
-
-.contract-meta {
-  display: flex;
-  align-items: center;
-  width: 100%;
-  gap: 80px;
-}
-
-.main-amount {
-  font-size: 24px;
-  color: rgba(51, 50, 50, 0.85);
-}
-
-.up {
-  color: #e57373;
-}
-
-.contract-list {
-  margin-top: 16px;
-  font-size: 14px;
-  color: #666;
-  list-style: none;
-  padding: 0;
-  height: 190px;
-  overflow-y: auto;
-  width: 460px;
-}
-
-.line {
-  position: relative;
-  width: 230px;
-}
-
-.line::after {
-  content: '';
-  position: absolute;
-  right: 2px;
-  top: 0;
-  bottom: 0;
-  width: 1px;
-  background-color: #C9C5C5;
-  border-radius: 2px;
-}
-
-.contract-list li {
-  margin-top: 10px;
-}
-
-.quality-cards {
-  display: flex;
-  gap: 12px;
-  margin-bottom: 12px;
-}
-
-.quality-card {
-  border-radius: 8px;
-  padding: 15px 10px 10px 50px;
-  font-weight: 400;
+.todo-desc {
+  margin-top: 6px;
+  color: #64748b;
   font-size: 12px;
-  color: rgba(0, 0, 0, 0.67);
-  width: 236px;
-  height: 49px;
-  background-size: cover;
-  background-position: center;
-  background-repeat: no-repeat;
+  line-height: 1.45;
 }
 
-.quality-card.one {
-  background-image: url("../assets/images/yuancailiao.png");
+.todo-no {
+  color: #1f3658;
+  font-weight: 600;
 }
 
-.quality-card.two {
-  background-image: url("../assets/images/guocheng.png");
+.panel-empty {
+  min-height: 140px;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  color: var(--text-tertiary);
 }
 
-.quality-card.three {
-  background-image: url("../assets/images/chuchang.png");
-
+.empty-home-panel {
+  min-height: 220px;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  color: #64748b;
+  font-size: 14px;
 }
 
-.quality-card span {
-  color: #4fc3f7;
-  font-weight: bold;
-  margin-left: 6px;
+.main-grid {
+  display: grid;
+  grid-template-columns: minmax(0, 1fr) 400px;
+  gap: 16px;
+  align-items: start;
 }
 
-.chart {
-  width: 100%;
-  height: 220px;
-  margin-top: 10px;
+.left-column,
+.right-column {
+  display: flex;
+  flex-direction: column;
+  gap: 16px;
+  min-width: 0;
 }
 
 .process-panel {
-  padding-bottom: 10px;
+  padding-bottom: 12px;
 }
 
-.process-panel__header {
+.panel-actions {
   display: flex;
-  justify-content: space-between;
+  gap: 8px;
   align-items: center;
+  flex-wrap: wrap;
 }
 
-.process-panel__body {
-  display: flex;
-  gap: 24px;
-  align-items: stretch;
+.process-body {
   margin-top: 10px;
+  display: grid;
+  grid-template-columns: minmax(0, 1fr) 232px;
+  gap: 12px;
+  align-items: stretch;
+  min-height: 0;
 }
 
-.process-panel__chart {
-  flex: 1;
-  min-width: 0;
-  padding: 6px 0;
+.process-chart {
+  position: relative;
+  border: 1px solid rgba(148, 163, 184, 0.24);
+  border-radius: 14px;
+  background:
+      linear-gradient(180deg, rgba(255, 255, 255, 0.92), rgba(244, 249, 255, 0.9)),
+      repeating-linear-gradient(
+          to right,
+          rgba(148, 163, 184, 0.07) 0,
+          rgba(148, 163, 184, 0.07) 1px,
+          transparent 1px,
+          transparent 48px
+      ),
+      repeating-linear-gradient(
+          to bottom,
+          rgba(148, 163, 184, 0.06) 0,
+          rgba(148, 163, 184, 0.06) 1px,
+          transparent 1px,
+          transparent 34px
+      );
+  overflow: hidden;
+  padding: 10px;
 }
 
-.process-panel__aside {
-  width: 260px;
+.process-chart.empty :deep(canvas) {
+  opacity: 0.2;
+}
+
+.chart-empty {
+  position: absolute;
+  inset: 0;
   display: flex;
   flex-direction: column;
-  gap: 12px;
+  align-items: center;
+  justify-content: center;
+  gap: 8px;
+  color: #64748b;
+  font-size: 14px;
+  text-align: center;
+  pointer-events: auto;
+  padding: 12px;
+}
+
+.chart-empty .el-icon {
+  color: #2563eb;
+  font-size: 28px;
+}
+
+.chart-empty-title {
+  font-size: 16px;
+  font-weight: 700;
+  color: #334155;
+}
+
+.chart-empty-desc {
+  font-size: 13px;
+  color: #64748b;
+}
+
+.chart-empty-actions {
+  margin-top: 4px;
+  display: flex;
+  gap: 8px;
+}
+
+.process-aside {
+  display: flex;
+  flex-direction: column;
+  gap: 8px;
+}
+
+.process-legend,
+.process-card {
+  border: 1px solid rgba(148, 163, 184, 0.22);
+  border-radius: 12px;
+  background: rgba(255, 255, 255, 0.84);
+  padding: 10px 12px;
+}
+
+.process-card {
+  min-height: 74px;
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
 }
 
 .process-legend {
+  min-height: 74px;
   display: flex;
   flex-direction: column;
-  gap: 10px;
-  align-items: flex-start;
-  padding: 8px 6px;
+  gap: 6px;
+  justify-content: center;
 }
 
-.process-legend__item {
+.process-legend-item {
+  color: #475569;
+  font-size: 12px;
   display: flex;
   align-items: center;
   gap: 8px;
-  font-size: 13px;
-  color: rgba(0, 0, 0, 0.55);
 }
 
 .dot {
   width: 10px;
   height: 10px;
-  border-radius: 2px;
+  border-radius: 3px;
   display: inline-block;
 }
 
 .dot-blue {
-  background: #1E5BFF;
+  background: #2563eb;
 }
 
-.dot-yellow {
-  background: #F7B500;
+.dot-orange {
+  background: #f59e0b;
 }
 
-.dot-teal {
-  background: #19C6C6;
+.dot-cyan {
+  background: #14b8a6;
 }
 
-.process-card {
-  background: rgba(245, 247, 250, 0.9);
-  border-radius: 10px;
-  padding: 16px 16px;
-}
-
-.process-card--name {
-  background: rgba(235, 242, 255, 1);
-  color: #1E5BFF;
-  font-weight: 800;
+.process-name {
+  color: #2563eb;
+  font-weight: 700;
   font-size: 14px;
+  line-height: 1.2;
+  margin-bottom: 2px;
 }
 
-.process-card__label {
-  font-size: 13px;
-  color: rgba(0, 0, 0, 0.55);
-  margin-bottom: 10px;
-}
-
-.process-card__value {
-  font-size: 24px;
-  font-weight: 800;
-  color: rgba(0, 0, 0, 0.8);
-}
-
-.process-card__value .unit {
+.process-label {
   font-size: 12px;
+  color: #64748b;
+}
+
+.process-value {
+  margin-top: 4px;
+  font-size: 24px;
+  color: #0f172a;
+  font-weight: 700;
+}
+
+.chart-row {
+  display: grid;
+  grid-template-columns: repeat(2, minmax(0, 1fr));
+  gap: 16px;
+}
+
+.contract-summary {
+  display: grid;
+  grid-template-columns: 1fr 190px;
+  gap: 12px;
+  align-items: center;
+  margin-top: 8px;
+}
+
+.contract-card {
+  border-radius: 14px;
+  border: 1px solid rgba(148, 163, 184, 0.2);
+  background: #f8fbff;
+  padding: 12px;
+}
+
+.contract-name {
+  color: #64748b;
+  font-size: 13px;
+}
+
+.contract-main {
+  margin-top: 8px;
+  font-size: 34px;
+  font-weight: 700;
+  color: #0f172a;
+}
+
+.contract-compare {
+  margin-top: 8px;
+  font-size: 13px;
+  color: #64748b;
+  display: flex;
+  gap: 10px;
+}
+
+.rise {
+  color: #0ea5a4;
   font-weight: 600;
-  color: rgba(0, 0, 0, 0.45);
+}
+
+.contract-list {
+  margin: 8px 0 0;
+  padding: 0;
+  list-style: none;
+  display: flex;
+  flex-direction: column;
+  gap: 8px;
+}
+
+.contract-list li {
+  display: grid;
+  grid-template-columns: 12px minmax(0, 1fr) 56px auto;
+  align-items: center;
+  gap: 8px;
+  color: #475569;
+  font-size: 13px;
+}
+
+.legend-dot {
+  width: 8px;
+  height: 8px;
+  border-radius: 50%;
+}
+
+.contract-item-name {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+.contract-item-rate {
+  text-align: right;
+  color: #64748b;
+}
+
+.contract-item-value {
+  color: #1f3658;
+  text-align: right;
+}
+
+.quality-cards {
+  margin: 8px 0 10px;
+  display: grid;
+  grid-template-columns: repeat(3, minmax(0, 1fr));
+  gap: 10px;
+}
+
+.quality-card {
+  border-radius: 12px;
+  border: 1px solid rgba(148, 163, 184, 0.2);
+  padding: 10px 12px;
+  color: #475569;
+  font-size: 13px;
+}
+
+.quality-card.one {
+  background: linear-gradient(135deg, #ffffff, #edf4ff);
+}
+
+.quality-card.two {
+  background: linear-gradient(135deg, #ffffff, #ebfffc);
+}
+
+.quality-card.three {
+  background: linear-gradient(135deg, #ffffff, #fff3e6);
+}
+
+.quality-card span {
+  color: #0f172a;
+  font-weight: 700;
   margin-left: 6px;
 }
 
-@media (max-width: 1200px) {
-  .process-panel__body {
-    flex-direction: column;
-  }
+.realtime-grid {
+  margin-top: 10px;
+  display: grid;
+  grid-template-columns: repeat(3, minmax(0, 1fr));
+  gap: 10px;
+}
 
-  .process-panel__aside {
-    width: 100%;
-    flex-direction: row;
-    flex-wrap: wrap;
-  }
+.realtime-item {
+  border: 1px solid rgba(148, 163, 184, 0.2);
+  border-radius: 12px;
+  background: #f8fbff;
+  padding: 10px 8px;
+  text-align: center;
+}
 
-  .process-card {
-    flex: 1;
-    min-width: 220px;
-  }
+.realtime-value {
+  font-size: 26px;
+  color: #0f172a;
+  font-weight: 700;
+}
+
+.realtime-label {
+  margin-top: 8px;
+  font-size: 12px;
+  color: #475569;
+}
+
+.realtime-delta {
+  margin-top: 4px;
+  font-size: 12px;
+}
+
+.realtime-delta.up {
+  color: #0ea5a4;
+}
+
+.realtime-delta.down {
+  color: #f59e0b;
+}
+
+.realtime-delta.flat {
+  color: #64748b;
+}
+
+.warning-list {
+  margin-top: 10px;
+  display: flex;
+  flex-direction: column;
+  gap: 8px;
+  max-height: 300px;
+  overflow-y: auto;
+}
+
+.warning-item {
+  display: grid;
+  grid-template-columns: 10px minmax(0, 1fr) 72px;
+  align-items: center;
+  gap: 10px;
+  border: 1px solid rgba(148, 163, 184, 0.2);
+  border-radius: 12px;
+  background: #f8fbff;
+  padding: 10px;
+}
+
+.warning-dot {
+  width: 8px;
+  height: 8px;
+  border-radius: 50%;
+  display: block;
+}
+
+.warning-dot.device {
+  background: #ef4444;
+}
+
+.warning-dot.quality {
+  background: #f59e0b;
+}
+
+.warning-dot.material {
+  background: #3b82f6;
+}
+
+.warning-title {
+  color: #334155;
+  font-size: 13px;
+  font-weight: 600;
+}
+
+.warning-desc {
+  color: #64748b;
+  font-size: 12px;
+  margin-top: 4px;
+}
+
+.warning-time {
+  color: #64748b;
+  font-size: 12px;
+  text-align: right;
+}
+
+.order-panel {
+  min-height: 0;
+}
+
+.quick-panel {
+  min-height: 0;
+}
+
+.table-progress {
+  display: flex;
+  align-items: center;
+  gap: 10px;
+}
+
+.table-progress span {
+  font-size: 12px;
+  color: #475569;
+}
+
+.quick-grid {
+  margin-top: 10px;
+  display: grid;
+  grid-template-columns: repeat(2, minmax(0, 1fr));
+  grid-auto-rows: 58px;
+  gap: 10px;
+}
+
+.quick-item {
+  border: 1px solid rgba(148, 163, 184, 0.22);
+  background: rgba(255, 255, 255, 0.92);
+  border-radius: 12px;
+  color: #334155;
+  display: flex;
+  align-items: center;
+  gap: 8px;
+  padding: 0 10px;
+  font-size: 12px;
+  cursor: pointer;
+  transition: transform 0.2s ease, box-shadow 0.2s ease, border-color 0.2s ease;
+}
+
+.plan-panel {
+  min-height: 236px;
+}
+
+.quality-panel {
+  min-height: 0;
+}
+
+.receipt-panel {
+  min-height: 340px;
+}
+
+.plan-list {
+  margin: 10px 0 0;
+  padding: 0;
+  list-style: none;
+  display: flex;
+  flex-direction: column;
+  gap: 8px;
+}
+
+.plan-item {
+  border: 1px solid rgba(148, 163, 184, 0.18);
+  border-radius: 12px;
+  background: #f8fbff;
+  padding: 10px 12px;
+}
+
+.plan-main {
+  display: flex;
+  justify-content: space-between;
+  gap: 10px;
+  align-items: center;
+}
+
+.plan-order {
+  font-size: 13px;
+  color: #1f3658;
+  font-weight: 600;
+}
+
+.plan-name {
+  font-size: 13px;
+  color: #334155;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+.plan-meta {
+  margin-top: 6px;
+  display: flex;
+  justify-content: space-between;
+  gap: 8px;
+  font-size: 12px;
+  color: #64748b;
+}
+
+.quick-item:hover {
+  transform: translateY(-2px);
+  border-color: rgba(96, 165, 250, 0.45);
+  box-shadow: 0 14px 28px rgba(37, 99, 235, 0.1);
+}
+
+.quick-icon {
+  width: 30px;
+  height: 30px;
+  border-radius: 8px;
+  background: linear-gradient(135deg, #2563eb, #38bdf8);
+  display: inline-flex;
+  align-items: center;
+  justify-content: center;
+  font-size: 16px;
+  color: #fff;
+}
+
+.quick-item:nth-child(2) .quick-icon,
+.quick-item:nth-child(6) .quick-icon {
+  background: linear-gradient(135deg, #14b8a6, #5eead4);
+}
+
+.quick-item:nth-child(3) .quick-icon,
+.quick-item:nth-child(5) .quick-icon {
+  background: linear-gradient(135deg, #7c3aed, #a78bfa);
+}
+
+.quick-item:nth-child(4) .quick-icon,
+.quick-item:nth-child(7) .quick-icon {
+  background: linear-gradient(135deg, #f97316, #fdba74);
 }
 
 .process-selection-wrapper {
   max-height: 400px;
   overflow-y: auto;
-  padding: 10px;
+  padding: 8px;
 }
 
 .process-grid {
   display: grid;
   grid-template-columns: repeat(auto-fill, minmax(130px, 1fr));
-  gap: 12px;
+  gap: 10px;
 }
 
 :deep(.el-checkbox.is-bordered) {
   margin-left: 0 !important;
   width: 100%;
 }
-</style>
\ No newline at end of file
+
+:deep(.el-radio-button__inner) {
+  border-radius: 10px !important;
+  background: #f8fbff;
+  border-color: rgba(148, 163, 184, 0.22) !important;
+  color: #475569 !important;
+}
+
+:deep(.el-radio-button__original-radio:checked + .el-radio-button__inner) {
+  background: linear-gradient(135deg, #2f80ff, #38bdf8) !important;
+  border-color: transparent !important;
+  color: #fff !important;
+}
+
+:deep(.el-progress-circle__track) {
+  stroke: rgba(148, 163, 184, 0.3);
+}
+
+:deep(.el-progress-bar__outer) {
+  background-color: rgba(148, 163, 184, 0.2);
+}
+
+:deep(.order-panel .el-progress-bar__inner) {
+  background: linear-gradient(90deg, #2563eb, #38bdf8) !important;
+}
+
+:deep(.order-panel .el-table) {
+  border-radius: 14px;
+}
+
+:deep(.order-panel .el-table th.el-table__cell) {
+  background: #f2f7ff !important;
+}
+
+:deep(.order-panel .el-table__body tr:hover > td.el-table__cell) {
+  background: #f8fbff !important;
+}
+
+:deep(.order-panel .el-tag--success) {
+  color: #0f766e;
+  background: #e9fdf7;
+  border-color: #b7f2e0;
+}
+
+:deep(.order-panel .el-tag--warning) {
+  color: #b45309;
+  background: #fff6e8;
+  border-color: #fde0b8;
+}
+
+:deep(.order-panel .el-tag--primary) {
+  color: #2563eb;
+  background: #eaf2ff;
+  border-color: #b8d2ff;
+}
+
+@media (max-width: 1600px) {
+  .main-grid {
+    grid-template-columns: minmax(0, 1fr) 380px;
+  }
+}
+
+@media (max-width: 1366px) {
+  .main-grid {
+    grid-template-columns: minmax(0, 1fr) 340px;
+  }
+
+  .stats-grid {
+    grid-template-columns: repeat(2, minmax(0, 1fr));
+  }
+}
+
+@media (max-width: 1200px) {
+  .main-grid {
+    grid-template-columns: 1fr;
+  }
+
+  .right-column {
+    display: grid;
+    grid-template-columns: repeat(2, minmax(0, 1fr));
+    gap: 14px;
+  }
+
+  .chart-row {
+    grid-template-columns: 1fr;
+  }
+
+  .process-body {
+    grid-template-columns: 1fr;
+  }
+
+  .realtime-grid {
+    grid-template-columns: repeat(3, minmax(0, 1fr));
+  }
+
+  .quality-cards {
+    grid-template-columns: 1fr;
+  }
+}
+
+@media (max-width: 768px) {
+  .welcome-panel {
+    flex-direction: column;
+    align-items: flex-start;
+    gap: 10px;
+  }
+
+  .welcome-meta {
+    text-align: left;
+  }
+
+  .meta-extra {
+    justify-content: flex-start;
+  }
+
+  .stats-grid {
+    grid-template-columns: repeat(2, minmax(0, 1fr));
+  }
+
+  .right-column {
+    grid-template-columns: 1fr;
+  }
+
+  .realtime-grid {
+    grid-template-columns: 1fr;
+  }
+}
+</style>
diff --git a/src/views/inventoryManagement/dispatchLog/Record.vue b/src/views/inventoryManagement/dispatchLog/Record.vue
index dd47cb4..fb24e40 100644
--- a/src/views/inventoryManagement/dispatchLog/Record.vue
+++ b/src/views/inventoryManagement/dispatchLog/Record.vue
@@ -1,41 +1,84 @@
 <template>
   <div>
     <div class="search_form" style="margin-bottom: 10px">
-      <div>
-        <span class="search_title ml10">鍑哄簱鏃ユ湡锛�</span>
-        <el-date-picker
-          v-model="searchForm.timeStr"
-          type="date"
-          placeholder="璇烽�夋嫨鏃ユ湡"
-          value-format="YYYY-MM-DD"
-          format="YYYY-MM-DD"
-          clearable
-          @change="handleQuery"
-        />
-        <span class="search_title ml10">鏉ユ簮锛�</span>
-        <el-select
-          v-model="searchForm.recordType"
-          style="width: 240px"
-          placeholder="璇烽�夋嫨"
-          clearable
-        >
-          <el-option
-            v-for="item in stockRecordTypeOptions"
-            :key="item.value"
-            :label="item.label"
-            :value="item.value"
-          />
-        </el-select>
-        <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
-          >鎼滅储</el-button
-        >
-      </div>
-      <div>
-        <el-button type="primary" @click="handleBatchApprove">瀹℃壒</el-button>
-        <el-button @click="handleOut">瀵煎嚭</el-button>
-        <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
-        <el-button type="primary" plain @click="handlePrint">鎵撳嵃</el-button>
-      </div>
+      <el-form
+          ref="searchFormRef"
+          :model="searchForm"
+          class="demo-form-inline"
+      >
+        <el-row :gutter="20">
+          <el-col :span="4">
+            <el-form-item label="鍑哄簱鏃ユ湡" prop="timeStr">
+              <el-date-picker v-model="searchForm.timeStr"
+                              type="date"
+                              placeholder="璇烽�夋嫨鏃ユ湡"
+                              value-format="YYYY-MM-DD"
+                              format="YYYY-MM-DD"
+                              clearable/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="4">
+            <el-form-item label="浜у搧澶х被" prop="productName">
+              <el-input v-model="searchForm.productName"
+                        style="width: 240px"
+                        placeholder="璇疯緭鍏�"
+                        clearable/>
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="4">
+            <el-form-item label="浜у搧瑙勬牸" prop="model">
+              <el-input v-model="searchForm.model"
+                        style="width: 240px"
+                        placeholder="璇疯緭鍏�"
+                        clearable/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="4">
+            <el-form-item label="鎵瑰彿" prop="batchNo">
+              <el-input v-model="searchForm.batchNo"
+                        style="width: 240px"
+                        placeholder="璇疯緭鍏�"
+                        clearable/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="4">
+            <el-form-item label="鏉ユ簮" prop="recordType">
+              <el-select
+                  v-model="searchForm.recordType"
+                  style="width: 240px"
+                  placeholder="璇烽�夋嫨"
+                  clearable
+              >
+                <el-option
+                    v-for="item in stockRecordTypeOptions"
+                    :key="item.value"
+                    :label="item.label"
+                    :value="item.value"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <!-- 鎸夐挳 -->
+          <el-col :span="4">
+            <el-form-item>
+              <el-button type="primary" @click="getList">
+                鎼滅储
+              </el-button>
+
+              <el-button @click="resetSearch">
+                閲嶇疆
+              </el-button>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+    </div>
+    <div class="actions">
+      <el-button type="primary" @click="handleBatchApprove">瀹℃壒</el-button>
+      <el-button @click="handleOut">瀵煎嚭</el-button>
+      <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
+      <el-button type="primary" plain @click="handlePrint">鎵撳嵃</el-button>
     </div>
     <div class="table_list">
       <el-table
@@ -162,12 +205,14 @@
 });
 const { searchForm } = toRefs(data);
 
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
+const searchFormRef = ref(null);
+
+const resetSearch = () => {
+  searchFormRef.value?.resetFields();
   page.current = 1;
   getList();
-};
+}
+
 const paginationChange = (obj) => {
   page.current = obj.page;
   page.size = obj.limit;
@@ -812,4 +857,10 @@
     page-break-after: avoid;
   }
 }
+
+.actions {
+  display: flex;
+  justify-content: flex-end;
+  margin-bottom: 10px;
+}
 </style>
diff --git a/src/views/inventoryManagement/receiptManagement/Record.vue b/src/views/inventoryManagement/receiptManagement/Record.vue
index 9485188..3fce379 100644
--- a/src/views/inventoryManagement/receiptManagement/Record.vue
+++ b/src/views/inventoryManagement/receiptManagement/Record.vue
@@ -1,43 +1,87 @@
 <template>
   <div>
     <div class="search_form" style="margin-bottom: 10px;">
-      <div>
-        <span class="search_title ml10">鍏ュ簱鏃ユ湡锛�</span>
-        <el-date-picker v-model="searchForm.timeStr"
-                        type="date"
-                        placeholder="璇烽�夋嫨鏃ユ湡"
-                        value-format="YYYY-MM-DD"
-                        format="YYYY-MM-DD"
-                        clearable
-                        @change="handleQuery"/>
-        <span class="search_title ml10">浜у搧澶х被锛�</span>
-        <el-input v-model="searchForm.productName"
-                  style="width: 240px"
-                  placeholder="璇疯緭鍏�"
-                  clearable/>
-        <span class="search_title ml10">鏉ユ簮锛�</span>
-        <el-select v-model="searchForm.recordType"
-                  style="width: 240px"
-                  placeholder="璇烽�夋嫨"
-                  clearable>
-          <el-option v-for="item in stockRecordTypeOptions"
-                     :key="item.value"
-                     :label="item.label"
-                     :value="item.value"/>
-        </el-select>
-        <el-button type="primary"
-                   @click="handleQuery"
-                   style="margin-left: 10px">鎼滅储
-        </el-button>
-      </div>
-      <div>
-        <el-button type="primary" @click="handleBatchApprove">瀹℃壒</el-button>
-        <el-button @click="handleOut">瀵煎嚭</el-button>
-        <el-button type="danger"
-                   plain
-                   @click="handleDelete">鍒犻櫎
-        </el-button>
-      </div>
+      <el-form
+          ref="searchFormRef"
+          :model="searchForm"
+          class="demo-form-inline"
+      >
+        <el-row :gutter="20">
+          <el-col :span="4">
+            <el-form-item label="鍏ュ簱鏃ユ湡" prop="timeStr">
+              <el-date-picker v-model="searchForm.timeStr"
+                              type="date"
+                              placeholder="璇烽�夋嫨鏃ユ湡"
+                              value-format="YYYY-MM-DD"
+                              format="YYYY-MM-DD"
+                              clearable/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="4">
+            <el-form-item label="浜у搧澶х被" prop="productName">
+              <el-input v-model="searchForm.productName"
+                        style="width: 240px"
+                        placeholder="璇疯緭鍏�"
+                        clearable/>
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="4">
+            <el-form-item label="浜у搧瑙勬牸" prop="model">
+              <el-input v-model="searchForm.model"
+                        style="width: 240px"
+                        placeholder="璇疯緭鍏�"
+                        clearable/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="4">
+            <el-form-item label="鎵瑰彿" prop="batchNo">
+              <el-input v-model="searchForm.batchNo"
+                        style="width: 240px"
+                        placeholder="璇疯緭鍏�"
+                        clearable/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="4">
+            <el-form-item label="鏉ユ簮" prop="recordType">
+              <el-select v-model="searchForm.recordType"
+                         style="width: 240px"
+                         placeholder="璇烽�夋嫨"
+                         clearable>
+                <el-option v-for="item in stockRecordTypeOptions"
+                           :key="item.value"
+                           :label="item.label"
+                           :value="item.value"/>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <!-- 鎸夐挳 -->
+          <el-col :span="4">
+            <el-form-item>
+              <el-button type="primary" @click="getList">
+                鎼滅储
+              </el-button>
+
+              <el-button @click="resetSearch">
+                閲嶇疆
+              </el-button>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+    </div>
+    <div class="actions">
+      <el-button type="primary"
+                 :disabled="!canBatchApprove"
+                 @click="handleBatchApprove">瀹℃壒</el-button>
+      <el-button :disabled="!canReverseApprove"
+                 @click="handleReverseApprove">鍙嶅</el-button>
+      <el-button @click="handleOut">瀵煎嚭</el-button>
+      <el-button type="danger"
+                 plain
+                 :disabled="!canDelete"
+                 @click="handleDelete">鍒犻櫎
+      </el-button>
     </div>
     <div class="table_list">
       <el-table :data="tableData"
@@ -50,7 +94,7 @@
                 height="calc(100vh - 18.5em)">
         <el-table-column align="center"
                          type="selection"
-                         :selectable="isRowSelectableForApprove"
+                         :selectable="isRowSelectable"
                          width="55"/>
         <el-table-column align="center"
                          label="搴忓彿"
@@ -58,7 +102,7 @@
                          width="60"/>
         <el-table-column label="鍏ュ簱鎵规"
                          prop="inboundBatches"
-                         width="280"
+                         width="200"
                          show-overflow-tooltip/>
         <el-table-column label="鍏ュ簱鏃堕棿"
                          prop="createTime"
@@ -88,6 +132,16 @@
             {{ getRecordType(scope.row.recordType) }}
           </template>
         </el-table-column>
+        <el-table-column
+            v-if="showSourceOrderNoColumn"
+            label="婧愬崟鍙�"
+            width="150"
+            prop="sourceOrderNo"
+            show-overflow-tooltip>
+          <template #default="scope">
+            {{ formatSourceOrderNo(scope.row?.sourceOrderNo) }}
+          </template>
+        </el-table-column>
         <el-table-column label="瀹℃壒鐘舵��"
                          prop="approvalStatus"
                          show-overflow-tooltip>
@@ -114,6 +168,7 @@
   ref,
   reactive,
   toRefs,
+  computed,
   onMounted,
   getCurrentInstance,
 } from "vue";
@@ -122,6 +177,7 @@
   getStockInRecordListPage,
   batchDeletePendingStockInRecords,
   batchApproveStockInRecords,
+  batchUnapproveStockInRecords,
 } from "@/api/inventoryManagement/stockInRecord.js";
 import {
   findAllQualifiedStockInRecordTypeOptions, 
@@ -156,17 +212,20 @@
 const data = reactive({
   searchForm: {
     productName: "",
+    batchNo: "",
+    model: "",
     timeStr: "",
     recordType: "",
   },
 });
 const {searchForm} = toRefs(data);
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
+const searchFormRef = ref(null);
+
+const resetSearch = () => {
+  searchFormRef.value?.resetFields();
   page.current = 1;
   getList();
-};
+}
 
 const getRecordType = (recordType) => {
   return stockRecordTypeOptions.value.find(item => item.value === recordType)?.label || ''
@@ -203,8 +262,33 @@
   return status === 0 || status === "0" || status === "pending" || status === "PENDING" || status === null || status === undefined || status === "";
 };
 
-const isRowSelectableForApprove = row => {
-  return isPendingApproval(row?.approvalStatus);
+const isRejectedApproval = status => {
+  return status === 2 || status === "2" || status === "rejected" || status === "REJECTED";
+};
+
+const isRowSelectable = row => {
+  return isPendingApproval(row?.approvalStatus) || isRejectedApproval(row?.approvalStatus);
+};
+
+const canBatchApprove = computed(() => {
+  return selectedRows.value.length > 0
+      && selectedRows.value.every(row => isPendingApproval(row.approvalStatus));
+});
+
+const canReverseApprove = computed(() => {
+  return selectedRows.value.length > 0
+      && selectedRows.value.every(row => isRejectedApproval(row.approvalStatus));
+});
+
+const canDelete = computed(() => canBatchApprove.value);
+const showSourceOrderNoColumn = computed(() => {
+  const topParentProductId = Number(props.topParentProductId);
+  return topParentProductId === 276 || topParentProductId === 278;
+});
+
+const formatSourceOrderNo = (value) => {
+  const text = String(value ?? "").trim();
+  return text || "--";
 };
 
 const pageProductChange = obj => {
@@ -215,11 +299,7 @@
 
 const getList = () => {
   tableLoading.value = true;
-  const params = {...page,  topParentProductId: props.topParentProductId};
-  params.timeStr = searchForm.value.timeStr;
-  params.productName = searchForm.value.productName;
-  params.recordType = searchForm.value.recordType;
-  getStockInRecordListPage(params)
+  getStockInRecordListPage(Object.assign({}, {...searchForm.value, ...page,  topParentProductId: props.topParentProductId}))
       .then(res => {
         tableData.value = res.data.records;
         total.value = res.data.total || 0;
@@ -245,14 +325,40 @@
 
 // 琛ㄦ牸閫夋嫨鏁版嵁
 const handleSelectionChange = selection => {
-  selectedRows.value = selection.filter(item => item.id && isPendingApproval(item.approvalStatus));
+  selectedRows.value = selection.filter(item => item.id && isRowSelectable(item));
 };
 
 const expandedRowKeys = ref([]);
 
+const handleReverseApprove = () => {
+  if (!canReverseApprove.value) {
+    proxy.$modal.msgWarning("璇烽�夋嫨宸查┏鍥炵殑鏁版嵁");
+    return;
+  }
+  const ids = selectedRows.value.map(item => item.id);
+  ElMessageBox.confirm("鍙嶅鍚庤褰曞皢鎭㈠涓哄緟瀹℃壒鐘舵�侊紝鏄惁纭鍙嶅锛�", "鍙嶅", {
+    confirmButtonText: "纭",
+    cancelButtonText: "鍙栨秷",
+    type: "warning",
+  })
+      .then(() => {
+        batchUnapproveStockInRecords({ids})
+            .then(() => {
+              proxy.$modal.msgSuccess("鍙嶅鎴愬姛");
+              getList();
+            })
+            .catch(() => {
+              proxy.$modal.msgError("鍙嶅澶辫触");
+            });
+      })
+      .catch(() => {
+        proxy.$modal.msg("宸插彇娑�");
+      });
+};
+
 const handleBatchApprove = () => {
-  if (selectedRows.value.length === 0) {
-    proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
+  if (!canBatchApprove.value) {
+    proxy.$modal.msgWarning("璇烽�夋嫨寰呭鎵圭殑鏁版嵁");
     return;
   }
   const ids = selectedRows.value.map(item => item.id);
@@ -306,8 +412,8 @@
 
 // 鍒犻櫎
 const handleDelete = () => {
-  if (selectedRows.value.length === 0) {
-    proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
+  if (!canDelete.value) {
+    proxy.$modal.msgWarning("璇烽�夋嫨寰呭鎵圭殑鏁版嵁");
     return;
   }
   const ids = selectedRows.value.map(item => item.id);
@@ -346,7 +452,10 @@
 );
 </script>
 
-<style scoped lang="scss"></style>
-
-
-
+<style scoped lang="scss">
+.actions {
+  display: flex;
+  justify-content: flex-end;
+  margin-bottom: 10px;
+}
+</style>
diff --git a/src/views/inventoryManagement/stockManagement/Record.vue b/src/views/inventoryManagement/stockManagement/Record.vue
index 3b532f8..dee5e66 100644
--- a/src/views/inventoryManagement/stockManagement/Record.vue
+++ b/src/views/inventoryManagement/stockManagement/Record.vue
@@ -1,18 +1,51 @@
 <template>
   <div>
     <div class="search_form mb10">
-      <div>
-        <span class="search_title ml10">浜у搧澶х被锛�</span>
-        <el-input
-          v-model="searchForm.productName"
-          style="width: 240px"
-          placeholder="璇疯緭鍏�"
-          clearable
-        />
-        <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
-          >鎼滅储</el-button
-        >
-      </div>
+      <el-form
+          ref="searchFormRef"
+          :model="searchForm"
+          class="demo-form-inline"
+      >
+        <el-row :gutter="20">
+          <el-col :span="4">
+            <el-form-item label="浜у搧澶х被" prop="productName">
+              <el-input v-model="searchForm.productName"
+                        style="width: 240px"
+                        placeholder="璇疯緭鍏�"
+                        clearable/>
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="4">
+            <el-form-item label="浜у搧瑙勬牸" prop="model">
+              <el-input v-model="searchForm.model"
+                        style="width: 240px"
+                        placeholder="璇疯緭鍏�"
+                        clearable/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="4">
+            <el-form-item label="鎵瑰彿" prop="batchNo">
+              <el-input v-model="searchForm.batchNo"
+                        style="width: 240px"
+                        placeholder="璇疯緭鍏�"
+                        clearable/>
+            </el-form-item>
+          </el-col>
+          <!-- 鎸夐挳 -->
+          <el-col :span="4">
+            <el-form-item>
+              <el-button type="primary" @click="getList">
+                鎼滅储
+              </el-button>
+
+              <el-button @click="resetSearch">
+                閲嶇疆
+              </el-button>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
       <div>
         <el-button type="primary" @click="isShowNewModal = true"
           >鏂板搴撳瓨</el-button
@@ -200,10 +233,19 @@
 const data = reactive({
   searchForm: {
     productName: "",
+    model: "",
+    batchNo: "",
     topParentProductId: props.productId,
   },
 });
 const { searchForm } = toRefs(data);
+const searchFormRef = ref(null);
+
+const resetSearch = () => {
+  searchFormRef.value?.resetFields();
+  page.current = 1;
+  getList();
+}
 
 // 鏌ヨ鍒楄〃
 /** 鎼滅储鎸夐挳鎿嶄綔 */
diff --git a/src/views/login.vue b/src/views/login.vue
index 872537b..c7db15a 100644
--- a/src/views/login.vue
+++ b/src/views/login.vue
@@ -1,96 +1,180 @@
 <template>
   <div class="login-page">
-    <div class="login-shell">
-      <section class="login-brand">
-        <div class="brand-badge">PRODUCT INVENTORY</div>
-        <img :src="brandLogo" alt="brand logo" class="brand-logo" />
-        <h1 class="brand-title">{{ title }}</h1>
-        <p class="brand-copy">
-          缁熶竴绠$悊搴撳瓨銆佹祦绋嬩笌涓氬姟鏁版嵁锛岃绯荤粺鍏ュ彛鍜屽悗鍙颁富鐣岄潰淇濇寔鍚屼竴濂楃畝绾﹁瑙夎瑷�銆�
-        </p>
-        <div class="brand-points">
-          <div class="brand-point">
-            <span class="point-dot"></span>
-            <span>娓呮櫚鐨勬暟鎹叆鍙�</span>
+    <main class="page">
+      <section class="factory">
+        <div class="brand hero-brand">
+          <div class="logo hero-logo">
+            <img
+              :src="brandLogoUrl"
+              :alt="`${companyName} logo`"
+              class="logo-image hero-logo-image"
+              @error="handleLogoError"
+            />
           </div>
-          <div class="brand-point">
-            <span class="point-dot"></span>
-            <span>鏇磋交鐨勭晫闈㈠眰娆�</span>
-          </div>
-          <div class="brand-point">
-            <span class="point-dot"></span>
-            <span>绋冲畾鐨勪笟鍔″崗鍚屼綋楠�</span>
-          </div>
+        </div>
+
+        <div class="hero">
+          <div class="chip">鏁板瓧宸ュ巶 路 鏅鸿兘鎺掍骇 路 璁惧浜掕仈 路 璐ㄩ噺杩芥函</div>
+          <h1>鏁板瓧宸ュ巶<br />MOM 鏅洪�犲钩鍙�</h1>
+          <p>
+            浠ュ疄鏃舵暟鎹┍鍔ㄧ敓浜х幇鍦猴紝鎶婂伐鍗曘�佽澶囥�佺墿鏂欍�佽川閲忋�佽兘鑰椾笌浠撳偍杩炴帴鎴愪竴寮犻�忔槑鐨勫埗閫犺繍钀ョ綉缁溿��
+          </p>
+        </div>
+
+        <div class="scene" aria-hidden="true">
+          <div class="floor"></div>
+          <svg class="factory-svg" viewBox="0 0 920 360" preserveAspectRatio="xMidYMid meet">
+            <defs>
+              <linearGradient id="g1" x1="0" y1="0" x2="1" y2="1">
+                <stop offset="0" stop-color="#40e4ff" stop-opacity=".9" />
+                <stop offset="1" stop-color="#1f78ff" stop-opacity=".68" />
+              </linearGradient>
+              <linearGradient id="g2" x1="0" y1="0" x2="1" y2="1">
+                <stop offset="0" stop-color="#ffffff" stop-opacity=".28" />
+                <stop offset="1" stop-color="#ffffff" stop-opacity=".06" />
+              </linearGradient>
+            </defs>
+
+            <path d="M45 255H830" stroke="url(#g1)" stroke-width="16" stroke-linecap="round" opacity=".55" />
+            <path class="belt" d="M45 255H830" stroke="#fff" stroke-width="3" stroke-linecap="round" opacity=".75" />
+
+            <g class="box">
+              <rect x="60" y="212" width="54" height="42" rx="8" fill="#ffb15f" />
+              <path d="M60 225h54" stroke="#fff" opacity=".45" />
+            </g>
+            <g class="box two">
+              <rect x="60" y="212" width="54" height="42" rx="8" fill="#28d9cd" />
+              <path d="M60 225h54" stroke="#fff" opacity=".45" />
+            </g>
+            <g class="box three">
+              <rect x="60" y="212" width="54" height="42" rx="8" fill="#8b5cf6" />
+              <path d="M60 225h54" stroke="#fff" opacity=".45" />
+            </g>
+
+            <g>
+              <rect x="120" y="112" width="138" height="128" rx="18" fill="url(#g2)" stroke="rgba(255,255,255,.42)" />
+              <path d="M145 185h88M145 210h58" stroke="#40e4ff" stroke-width="6" stroke-linecap="round" />
+              <path d="M145 140h88" stroke="#fff" stroke-opacity=".5" stroke-width="4" stroke-linecap="round" />
+            </g>
+
+            <g>
+              <rect x="315" y="76" width="190" height="164" rx="22" fill="url(#g2)" stroke="rgba(255,255,255,.42)" />
+              <path d="M350 126h120M350 158h90M350 190h112" stroke="#fff" stroke-opacity=".5" stroke-width="6" stroke-linecap="round" />
+              <circle class="signal" cx="472" cy="104" r="10" fill="#20e0d2" />
+              <circle class="signal two" cx="448" cy="104" r="10" fill="#1f78ff" />
+              <circle class="signal three" cx="424" cy="104" r="10" fill="#ff8a3d" />
+            </g>
+
+            <g class="arm">
+              <path d="M612 124h92" stroke="#40e4ff" stroke-width="14" stroke-linecap="round" />
+              <path d="M704 124l42 56" stroke="#40e4ff" stroke-width="14" stroke-linecap="round" />
+              <circle cx="612" cy="124" r="25" fill="#1f78ff" stroke="#fff" stroke-opacity=".45" />
+              <circle cx="704" cy="124" r="18" fill="#20e0d2" />
+              <path d="M744 180v34M727 214h34" stroke="#fff" stroke-width="7" stroke-linecap="round" />
+            </g>
+
+            <g>
+              <rect x="690" y="82" width="148" height="158" rx="20" fill="url(#g2)" stroke="rgba(255,255,255,.42)" />
+              <path d="M724 206V134M764 206V112M804 206V154" stroke="#20e0d2" stroke-width="12" stroke-linecap="round" />
+              <path d="M720 206h92" stroke="#fff" stroke-opacity=".44" stroke-width="5" stroke-linecap="round" />
+            </g>
+
+            <path
+              d="M190 112C265 42 348 48 410 76C502 118 568 76 612 124C654 170 700 74 764 82"
+              fill="none"
+              stroke="#20e0d2"
+              stroke-width="2"
+              stroke-dasharray="8 10"
+              opacity=".58"
+            >
+              <animate attributeName="stroke-dashoffset" from="80" to="0" dur="2s" repeatCount="indefinite" />
+            </path>
+          </svg>
         </div>
       </section>
 
-      <section class="login-panel">
-        <el-form ref="loginRef" :model="loginForm" :rules="loginRules" class="login-form">
-          <div class="panel-head">
-            <p class="panel-kicker">WELCOME BACK</p>
-            <h2 class="panel-title">鐧诲綍绯荤粺</h2>
-            <p class="panel-subtitle">杈撳叆璐﹀彿鍜屽瘑鐮佽繘鍏ュ伐浣滃彴銆�</p>
+      <section class="login-wrap">
+        <div class="time">
+          <span>{{ todayLabel }}</span>
+          {{ clockLabel }}
+        </div>
+
+        <form class="login-card" @submit.prevent="handleLogin">
+          <div class="brand card-brand">
+            <div class="logo">
+              <img :src="brandIconUrl" :alt="`${companyName} icon`" class="logo-image card-logo-image" />
+            </div>
+						<div class="brand-copy card-brand-copy">
+							<div class="brand-title">{{ companyName }}</div>
+							<small>鏁板瓧宸ュ巶缁熶竴鍏ュ彛</small>
+						</div>
           </div>
 
-          <el-form-item prop="username">
-            <el-input
-              v-model="loginForm.username"
-              type="text"
-              size="large"
-              auto-complete="off"
-              placeholder="璐﹀彿"
-            >
-              <template #prefix><el-icon><User /></el-icon></template>
-            </el-input>
-          </el-form-item>
+          <h2>娆㈣繋鐧诲綍</h2>
+          <p class="sub">杩涘叆 MOM 鏁板瓧宸ュ巶杩愯惀椹鹃┒鑸�</p>
 
-          <el-form-item prop="password">
-            <el-input
-              v-model="loginForm.password"
-              type="password"
-              size="large"
-              auto-complete="off"
-              placeholder="瀵嗙爜"
-              show-password
-              @keyup.enter="handleLogin"
-            >
-              <template #prefix><svg-icon icon-class="password" class="el-input__icon input-icon" /></template>
-            </el-input>
-          </el-form-item>
-
-          <div class="login-options">
-            <el-checkbox v-model="loginForm.rememberMe">璁颁綇瀵嗙爜</el-checkbox>
-            <router-link v-if="register" class="register-link" :to="'/register'">绔嬪嵆娉ㄥ唽</router-link>
+          <div class="form-row">
+            <label>璐﹀彿</label>
+            <div class="input">
+              <svg viewBox="0 0 24 24" fill="none">
+                <path d="M20 21a8 8 0 0 0-16 0" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" />
+                <path d="M12 12a4 4 0 1 0 0-8 4 4 0 0 0 0 8Z" stroke="currentColor" stroke-width="1.8" />
+              </svg>
+              <input v-model.trim="loginForm.username" type="text" placeholder="璇疯緭鍏ョ鐞嗗憳璐﹀彿" />
+            </div>
           </div>
 
-          <el-button
-            :loading="loading"
-            size="large"
-            type="primary"
-            class="login-submit"
-            @click.prevent="handleLogin"
-          >
-            <span v-if="!loading">鐧诲綍</span>
-            <span v-else>鐧诲綍涓�...</span>
-          </el-button>
-        </el-form>
+          <div class="form-row">
+            <label>瀵嗙爜</label>
+            <div class="input">
+              <svg viewBox="0 0 24 24" fill="none">
+                <path d="M7 10V8a5 5 0 0 1 10 0v2" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" />
+                <path d="M6.8 10h10.4A1.8 1.8 0 0 1 19 11.8v6.4A1.8 1.8 0 0 1 17.2 20H6.8A1.8 1.8 0 0 1 5 18.2v-6.4A1.8 1.8 0 0 1 6.8 10Z" stroke="currentColor" stroke-width="1.8" />
+              </svg>
+              <input
+                v-model="loginForm.password"
+                type="password"
+                placeholder="璇疯緭鍏ョ櫥褰曞瘑鐮�"
+                autocomplete="current-password"
+                @keyup.enter="handleLogin"
+              />
+            </div>
+          </div>
+
+          <div class="options">
+            <label class="check"><input v-model="loginForm.rememberMe" type="checkbox" />璁颁綇璐﹀彿</label>
+          </div>
+
+          <button class="login-btn" type="submit" :disabled="loading">
+            {{ loading ? "鐧诲綍涓�..." : "鐧诲綍鏁板瓧宸ュ巶" }}
+          </button>
+        </form>
       </section>
-    </div>
+    </main>
   </div>
 </template>
 
 <script setup>
-import { getCodeImg } from "@/api/login"
+import { ElMessage } from "element-plus"
 import Cookies from "js-cookie"
 import { encrypt, decrypt } from "@/utils/jsencrypt"
 import useUserStore from "@/store/modules/user"
-import brandLogo from "@/assets/logo/logo.png"
+import defaultBrandLogo from "@/assets/logo/logo.png"
 
-const title = import.meta.env.VITE_APP_TITLE
 const userStore = useUserStore()
 const route = useRoute()
 const router = useRouter()
-const { proxy } = getCurrentInstance()
+
+const appTitle = String(import.meta.env.VITE_APP_TITLE || "鏁板瓧宸ュ巶 MOM 绯荤粺").trim()
+const companySubtitle = String(import.meta.env.VITE_LOGIN_SUBTITLE || "Digital Factory Operation Center").trim()
+const configuredLogo = String(import.meta.env.VITE_APP_LOGO || "").trim()
+const logoModules = import.meta.glob("/src/assets/logo/*.png", { eager: true })
+const brandIconUrl = `${import.meta.env.BASE_URL}favicon.ico`
+
+const redirect = ref("")
+const loading = ref(false)
+const now = ref(new Date())
+const brandLogoUrl = ref(defaultBrandLogo)
 
 const loginForm = ref({
   username: "",
@@ -98,304 +182,712 @@
   rememberMe: false,
 })
 
-const loginRules = {
-  username: [{ required: true, trigger: "blur", message: "璇疯緭鍏ユ偍鐨勮处鍙�" }],
-  password: [{ required: true, trigger: "blur", message: "璇疯緭鍏ユ偍鐨勫瘑鐮�" }],
-}
+const companyName = computed(() => {
+  const currentFactoryName = String(userStore.currentFactoryName || "").trim()
+  return currentFactoryName || appTitle
+})
 
-const codeUrl = ref("")
-const loading = ref(false)
-const captchaEnabled = ref(true)
-const register = ref(false)
-const redirect = ref(undefined)
+const todayLabel = computed(() => {
+  const date = now.value
+  return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`
+})
+
+const clockLabel = computed(() => {
+  const date = now.value
+  return `${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(date.getSeconds())}`
+})
 
 watch(
   route,
   (newRoute) => {
-    redirect.value = newRoute.query && newRoute.query.redirect
+    redirect.value = String(newRoute.query?.redirect || "")
   },
   { immediate: true }
 )
 
-function handleLogin() {
-  proxy.$refs.loginRef.validate((valid) => {
-    if (valid) {
-      loading.value = true
-      Cookies.set("username", loginForm.value.username, { expires: 30 })
-      Cookies.set("password", encrypt(loginForm.value.password), { expires: 30 })
-      Cookies.set("rememberMe", loginForm.value.rememberMe, { expires: 30 })
-      userStore
-        .loginCheckFactory(loginForm.value)
-        .then(() => {
-          const query = route.query
-          const otherQueryParams = Object.keys(query).reduce((acc, cur) => {
-            if (cur !== "redirect") {
-              acc[cur] = query[cur]
-            }
-            return acc
-          }, {})
-          router.push({ path: redirect.value || "/", query: otherQueryParams })
-        })
-        .catch(() => {
-          loading.value = false
-          if (captchaEnabled.value) {
-            getCode()
-          }
-        })
-    }
-  })
+watch(
+  () => userStore.currentFactoryName,
+  () => updateBrandLogo(),
+  { immediate: true }
+)
+
+let timer = 0
+onMounted(() => {
+  timer = window.setInterval(() => {
+    now.value = new Date()
+  }, 1000)
+})
+
+onBeforeUnmount(() => {
+  if (timer) {
+    window.clearInterval(timer)
+    timer = 0
+  }
+})
+
+function pad(value) {
+  return String(value).padStart(2, "0")
 }
 
-function getCode() {
-  getCodeImg().then((res) => {
-    captchaEnabled.value = res.captchaEnabled === undefined ? true : res.captchaEnabled
-    if (captchaEnabled.value) {
-      codeUrl.value = "data:image/gif;base64," + res.img
-      loginForm.value.uuid = res.uuid
-    }
-  })
+function resolveConfiguredLogo() {
+  if (!configuredLogo) {
+    return ""
+  }
+
+  if (/^(https?:)?\/\//.test(configuredLogo) || configuredLogo.startsWith("data:")) {
+    return configuredLogo
+  }
+
+  const cleanPath = configuredLogo.replace(/^\/+/, "")
+  const fullPath = cleanPath.startsWith("src/") ? `/${cleanPath}` : `/src/${cleanPath}`
+  const localLogo = logoModules[fullPath]
+
+  if (localLogo && localLogo.default) {
+    return localLogo.default
+  }
+
+  if (configuredLogo.startsWith("/")) {
+    return configuredLogo
+  }
+
+  return `${import.meta.env.BASE_URL}${cleanPath}`
+}
+
+function updateBrandLogo() {
+  const logoFromConfig = resolveConfiguredLogo()
+  if (logoFromConfig) {
+    brandLogoUrl.value = logoFromConfig
+    return
+  }
+
+  const currentFactoryName = String(userStore.currentFactoryName || "").trim()
+  if (!currentFactoryName) {
+    brandLogoUrl.value = defaultBrandLogo
+    return
+  }
+
+  const factoryLogoPath = `/src/assets/logo/${currentFactoryName}.png`
+  const matched = logoModules[factoryLogoPath]
+  brandLogoUrl.value = matched && matched.default ? matched.default : defaultBrandLogo
+}
+
+function handleLogoError() {
+  brandLogoUrl.value = defaultBrandLogo
+}
+
+function handleRememberCookie() {
+  if (!loginForm.value.rememberMe) {
+    Cookies.remove("username")
+    Cookies.remove("password")
+    Cookies.remove("rememberMe")
+    return
+  }
+
+  Cookies.set("username", loginForm.value.username, { expires: 30 })
+  Cookies.set("password", encrypt(loginForm.value.password), { expires: 30 })
+  Cookies.set("rememberMe", "true", { expires: 30 })
 }
 
 function getCookie() {
   const username = Cookies.get("username")
   const password = Cookies.get("password")
   const rememberMe = Cookies.get("rememberMe")
-  loginForm.value = {
-    username: username === undefined ? loginForm.value.username : username,
-    password: password === undefined ? loginForm.value.password : decrypt(password),
-    rememberMe: rememberMe === undefined ? false : Boolean(rememberMe),
-  }
+
+  loginForm.value.username = username || ""
+  loginForm.value.password = password ? decrypt(password) : ""
+  loginForm.value.rememberMe = rememberMe === "true"
 }
 
-getCode()
+function handleLogin() {
+  if (!loginForm.value.username) {
+    ElMessage.error("璇疯緭鍏ヨ处鍙�")
+    return
+  }
+  if (!loginForm.value.password) {
+    ElMessage.error("璇疯緭鍏ュ瘑鐮�")
+    return
+  }
+
+  loading.value = true
+  handleRememberCookie()
+    userStore
+      .loginCheckFactory(loginForm.value)
+      .then(() => {
+      const query = route.query
+      const otherQueryParams = Object.keys(query).reduce((acc, cur) => {
+        if (cur !== "redirect") {
+          acc[cur] = query[cur]
+        }
+        return acc
+        }, {})
+        router.push({ path: redirect.value || "/", query: otherQueryParams })
+      })
+      .catch(() => {})
+      .finally(() => {
+        loading.value = false
+      })
+}
+
 getCookie()
 </script>
 
-<style lang="scss" scoped>
+<style scoped lang="scss">
+* {
+  box-sizing: border-box;
+}
+
 .login-page {
+  --blue: #1f78ff;
+  --cyan: #20e0d2;
+  --violet: #8b5cf6;
+  --orange: #ff8a3d;
+  --text: #09203f;
+  --muted: #7a8da8;
+  --line: rgba(113, 154, 214, 0.24);
+  --shadow: 0 28px 80px rgba(14, 57, 120, 0.18);
   min-height: 100vh;
-  display: flex;
-  align-items: center;
-  justify-content: center;
-  padding: 32px;
-  background:
-    radial-gradient(circle at top left, rgba(207, 223, 214, 0.95), transparent 30%),
-    radial-gradient(circle at bottom right, rgba(222, 232, 227, 0.9), transparent 28%),
-    linear-gradient(180deg, #f7faf8 0%, #eef2ee 100%);
-}
-
-.login-shell {
-  width: min(1120px, 100%);
-  min-height: 680px;
-  display: grid;
-  grid-template-columns: 1.1fr 0.9fr;
-  border: 1px solid rgba(216, 225, 219, 0.9);
-  border-radius: 32px;
   overflow: hidden;
-  background: rgba(255, 255, 255, 0.76);
-  box-shadow: 0 26px 80px rgba(31, 49, 38, 0.12);
-  backdrop-filter: blur(24px);
-}
-
-.login-brand {
-  position: relative;
-  display: flex;
-  flex-direction: column;
-  justify-content: center;
-  padding: 56px 64px;
   background:
-    linear-gradient(180deg, rgba(244, 248, 245, 0.9), rgba(233, 240, 236, 0.9)),
-    linear-gradient(135deg, rgba(31, 122, 114, 0.05), rgba(255, 255, 255, 0));
-
-  &::after {
-    content: "";
-    position: absolute;
-    inset: 28px;
-    border: 1px solid rgba(31, 122, 114, 0.08);
-    border-radius: 28px;
-    pointer-events: none;
-  }
+    radial-gradient(circle at 12% 16%, rgba(31, 120, 255, 0.22), transparent 32%),
+    radial-gradient(circle at 84% 14%, rgba(32, 224, 210, 0.24), transparent 28%),
+    radial-gradient(circle at 80% 84%, rgba(139, 92, 246, 0.14), transparent 28%),
+    linear-gradient(135deg, #eef6ff 0%, #f7fbff 52%, #edf8ff 100%);
 }
 
-.brand-badge {
-  width: fit-content;
-  padding: 8px 14px;
-  border-radius: 999px;
-  background: rgba(31, 122, 114, 0.1);
-  color: #1f7a72;
-  font-size: 12px;
-  font-weight: 700;
-  letter-spacing: 0.14em;
+.login-page::before {
+  content: "";
+  position: fixed;
+  inset: 0;
+  background-image:
+    linear-gradient(rgba(22, 78, 160, 0.055) 1px, transparent 1px),
+    linear-gradient(90deg, rgba(22, 78, 160, 0.055) 1px, transparent 1px);
+  background-size: 36px 36px;
+  mask-image: radial-gradient(circle at center, #000 0%, transparent 78%);
+  pointer-events: none;
 }
 
-.brand-logo {
-  width: 160px;
-  height: auto;
-  margin: 30px 0 24px;
+.page {
+  position: relative;
+  display: grid;
+  grid-template-columns: 1.15fr 0.85fr;
+  gap: 28px;
+  min-height: 100vh;
+  padding: 36px;
+}
+
+.factory {
+  position: relative;
+  overflow: hidden;
+  min-height: calc(100vh - 72px);
+  border-radius: 30px;
+  padding: 32px;
+  color: #fff;
+  background:
+    linear-gradient(135deg, rgba(5, 27, 67, 0.98), rgba(9, 71, 143, 0.92)),
+    radial-gradient(circle at 76% 18%, rgba(32, 224, 210, 0.38), transparent 30%);
+  box-shadow: var(--shadow);
+  border: 1px solid rgba(255, 255, 255, 0.16);
+  animation: enter 0.8s ease both;
+}
+
+.factory::before {
+  content: "";
+  position: absolute;
+  inset: 0;
+  background:
+    linear-gradient(120deg, transparent 0%, rgba(255, 255, 255, 0.11) 46%, transparent 72%),
+    linear-gradient(rgba(255, 255, 255, 0.055) 1px, transparent 1px),
+    linear-gradient(90deg, rgba(255, 255, 255, 0.055) 1px, transparent 1px);
+  background-size: 100% 100%, 44px 44px, 44px 44px;
+  opacity: 0.86;
+}
+
+.brand {
+  position: relative;
+  z-index: 2;
+  display: inline-flex;
+  align-items: center;
+}
+
+.logo {
+  width: 76px;
+  height: 76px;
+  border-radius: 14px;
+  display: grid;
+  place-items: center;
+  background: linear-gradient(135deg, var(--blue), var(--cyan));
+  box-shadow: 0 16px 40px rgba(32, 224, 210, 0.26);
+  overflow: hidden;
+  position: relative;
+}
+
+.logo-image {
+  width: 82%;
+  height: 82%;
   object-fit: contain;
 }
 
-.brand-title {
-  margin: 0;
-  font-size: 42px;
-  line-height: 1.12;
-  color: #21313f;
-  letter-spacing: -0.03em;
+.hero-brand {
+  display: block;
 }
 
-.brand-copy {
-  max-width: 460px;
-  margin: 18px 0 0;
-  font-size: 16px;
-  line-height: 1.75;
-  color: #5f6d7e;
+.hero-logo {
+  width: 240px;
+  height: 84px;
+  border-radius: 0;
+  background: transparent;
+  box-shadow: none;
+  overflow: visible;
+  place-items: center start;
 }
 
-.brand-points {
-  margin-top: 34px;
-  display: flex;
-  flex-direction: column;
-  gap: 14px;
+.hero-logo-image {
+  width: 100%;
+  height: auto;
+  max-height: 100%;
+  object-fit: contain;
 }
 
-.brand-point {
-  display: flex;
+.hero {
+  position: relative;
+  z-index: 2;
+  margin-top: 64px;
+  max-width: 680px;
+}
+
+.chip {
+  display: inline-flex;
   align-items: center;
-  gap: 12px;
-  color: #3d4b59;
-  font-size: 15px;
-  font-weight: 500;
+  gap: 8px;
+  padding: 8px 14px;
+  border-radius: 999px;
+  border: 1px solid rgba(255, 255, 255, 0.18);
+  background: rgba(255, 255, 255, 0.1);
+  color: rgba(255, 255, 255, 0.78);
+  font-size: 13px;
+  animation: enter 0.75s ease 0.15s both;
 }
 
-.point-dot {
-  width: 10px;
-  height: 10px;
-  border-radius: 50%;
-  background: linear-gradient(135deg, #1f7a72, #5ca39c);
-  box-shadow: 0 0 0 6px rgba(31, 122, 114, 0.08);
+.hero h1 {
+  margin: 24px 0 14px;
+  font-size: clamp(42px, 5.6vw, 78px);
+  line-height: 1.02;
+  font-weight: 900;
+  letter-spacing: 0;
+  animation: enter 0.8s ease 0.25s both;
 }
 
-.login-panel {
+.hero p {
+  margin: 0;
+  max-width: 630px;
+  font-size: 17px;
+  line-height: 1.8;
+  color: rgba(255, 255, 255, 0.72);
+  animation: enter 0.8s ease 0.35s both;
+}
+
+.scene {
+  position: absolute;
+  left: 42px;
+  right: 42px;
+  bottom: 24px;
+  height: 44%;
+  z-index: 1;
+}
+
+.floor {
+  position: absolute;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  height: 48%;
+  border-radius: 28px;
+  background:
+    linear-gradient(90deg, rgba(32, 224, 210, 0), rgba(32, 224, 210, 0.22), rgba(31, 120, 255, 0)),
+    repeating-linear-gradient(90deg, rgba(255, 255, 255, 0.1) 0 1px, transparent 1px 64px),
+    repeating-linear-gradient(0deg, rgba(255, 255, 255, 0.1) 0 1px, transparent 1px 34px);
+  transform: perspective(620px) rotateX(58deg);
+  transform-origin: bottom;
+  opacity: 0.82;
+}
+
+.factory-svg {
+  position: absolute;
+  left: 0;
+  right: 0;
+  bottom: 18%;
+  width: 100%;
+  height: 78%;
+  filter: drop-shadow(0 28px 30px rgba(0, 0, 0, 0.18));
+}
+
+.belt {
+  stroke-dasharray: 10 12;
+  animation: flow 1.2s linear infinite;
+}
+
+.arm {
+  transform-origin: 612px 124px;
+  animation: armMove 3.6s ease-in-out infinite;
+}
+
+.box {
+  animation: boxMove 5.4s linear infinite;
+}
+
+.box.two {
+  animation-delay: -1.8s;
+}
+
+.box.three {
+  animation-delay: -3.6s;
+}
+
+.signal {
+  opacity: 0.8;
+  animation: pulse 2.2s ease-in-out infinite;
+}
+
+.signal.two {
+  animation-delay: -0.7s;
+}
+
+.signal.three {
+  animation-delay: -1.4s;
+}
+
+.login-wrap {
+  position: relative;
+  z-index: 2;
   display: flex;
   align-items: center;
   justify-content: center;
-  padding: 40px;
-  background: rgba(255, 255, 255, 0.7);
+  min-height: calc(100vh - 72px);
+  border-radius: 30px;
+  border: 1px solid rgba(255, 255, 255, 0.8);
+  background: rgba(255, 255, 255, 0.62);
+  backdrop-filter: blur(20px);
+  box-shadow: var(--shadow);
+  animation: enter 0.8s ease 0.12s both;
 }
 
-.login-form {
-  width: min(420px, 100%);
-  padding: 38px 34px 34px;
-  border: 1px solid rgba(216, 225, 219, 0.92);
+.time {
+  position: absolute;
+  top: 26px;
+  right: 28px;
+  display: flex;
+  gap: 9px;
+  align-items: center;
+  font-weight: 900;
+  color: #12325e;
+}
+
+.time span {
+  padding: 8px 12px;
+  border-radius: 999px;
+  background: rgba(255, 255, 255, 0.66);
+  border: 1px solid var(--line);
+  color: var(--muted);
+  font-size: 13px;
+  font-weight: 700;
+}
+
+.login-card {
+  width: min(440px, 100%);
+  padding: 34px;
   border-radius: 28px;
+  border: 1px solid rgba(255, 255, 255, 0.95);
   background: rgba(255, 255, 255, 0.88);
-  box-shadow: 0 18px 52px rgba(31, 49, 38, 0.1);
+  box-shadow: 0 22px 60px rgba(21, 73, 143, 0.15);
+  position: relative;
+  overflow: hidden;
 }
 
-.panel-head {
-  margin-bottom: 28px;
+.login-card::before {
+  content: "";
+  position: absolute;
+  right: -92px;
+  top: -92px;
+  width: 190px;
+  height: 190px;
+  border-radius: 999px;
+  background: conic-gradient(from 0deg, rgba(31, 120, 255, 0.2), rgba(32, 224, 210, 0.32), rgba(139, 92, 246, 0.18), rgba(31, 120, 255, 0.2));
+  animation: rotate 9s linear infinite;
 }
 
-.panel-kicker {
-  margin: 0 0 10px;
-  color: #8a98a8;
-  font-size: 12px;
-  font-weight: 700;
-  letter-spacing: 0.16em;
+.login-card > * {
+  position: relative;
+  z-index: 1;
 }
 
-.panel-title {
-  margin: 0;
-  color: #21313f;
-  font-size: 30px;
-  font-weight: 700;
+.card-brand {
+  margin-bottom: 18px;
 }
 
-.panel-subtitle {
-  margin: 10px 0 0;
-  color: #6b7888;
+.card-brand .logo {
+  width: 52px;
+  height: 52px;
+}
+
+.card-brand-copy {
+  margin-left: 12px;
+}
+
+.card-logo-image {
+  width: 100%;
+  height: 100%;
+  object-fit: contain;
+}
+
+.card-brand .logo {
+  width: 68px;
+  height: 68px;
+}
+
+.login-card h2 {
+  margin: 8px 0;
+  font-size: 31px;
+  line-height: 1.15;
+  color: #0d2c5e;
+  font-weight: 900;
+  letter-spacing: 0;
+}
+
+.sub {
+  margin: 0 0 24px;
+  color: var(--muted);
   font-size: 14px;
 }
 
-.login-options {
-  margin: -4px 0 22px;
-  display: flex;
-  align-items: center;
-  justify-content: space-between;
-  color: #5f6d7e;
+.form-row {
+  margin-bottom: 14px;
+  animation: enter 0.6s ease both;
 }
 
-.register-link {
-  color: var(--el-color-primary);
-  font-weight: 600;
+.form-row:nth-of-type(1) {
+  animation-delay: 0.32s;
 }
 
-.login-submit {
+.form-row:nth-of-type(2) {
+  animation-delay: 0.4s;
+}
+
+.form-row:nth-of-type(3) {
+  animation-delay: 0.48s;
+}
+
+label {
+  display: block;
+  margin-bottom: 8px;
+  color: #24436b;
+  font-size: 13px;
+  font-weight: 800;
+}
+
+.input {
+  position: relative;
+}
+
+.input svg {
+  position: absolute;
+  left: 15px;
+  top: 50%;
+  width: 19px;
+  height: 19px;
+  transform: translateY(-50%);
+  color: #8197b6;
+  pointer-events: none;
+}
+
+input[type="text"],
+input[type="password"] {
   width: 100%;
-  height: 48px;
+  height: 52px;
+  padding: 0 15px 0 46px;
+  border: 1px solid rgba(108, 143, 190, 0.34);
+  border-radius: 16px;
+  outline: none;
+  background: linear-gradient(180deg, #fff, #f8fbff);
+  color: var(--text);
+  font-size: 15px;
+  transition: 0.2s ease;
 }
 
-.input-icon {
-  width: 14px;
+input[type="text"]:hover,
+input[type="password"]:hover {
+  border-color: rgba(31, 120, 255, 0.48);
+  box-shadow: 0 10px 24px rgba(31, 120, 255, 0.08);
 }
 
-:deep(.el-form-item) {
-  margin-bottom: 22px;
+input[type="text"]:focus,
+input[type="password"]:focus {
+  border-color: rgba(31, 120, 255, 0.72);
+  box-shadow: 0 0 0 4px rgba(31, 120, 255, 0.1);
 }
 
-:deep(.el-input__wrapper) {
-  min-height: 42px;
-  height: 42px;
-  padding-top: 0;
-  padding-bottom: 0;
+.options {
+  display: flex;
+  justify-content: flex-start;
+  align-items: center;
+  margin: 12px 0 22px;
+  font-size: 13px;
+  color: var(--muted);
 }
 
-:deep(.el-input__inner) {
-  height: 42px;
-  line-height: 42px;
+.check {
+  display: inline-flex;
+  gap: 8px;
+  align-items: center;
+  cursor: pointer;
 }
 
-:deep(.el-checkbox) {
-  color: #5f6d7e;
+.check input {
+  width: 16px;
+  height: 16px;
+  padding: 0;
+  accent-color: var(--blue);
 }
 
-@media (max-width: 960px) {
+.login-btn {
+  width: 100%;
+  height: 54px;
+  border: none;
+  border-radius: 17px;
+  cursor: pointer;
+  color: #fff;
+  font-size: 16px;
+  font-weight: 900;
+  background: linear-gradient(135deg, var(--blue), var(--cyan));
+  box-shadow: 0 18px 38px rgba(31, 120, 255, 0.25);
+  position: relative;
+  overflow: hidden;
+  transition: 0.18s ease;
+}
+
+.login-btn:hover:not(:disabled) {
+  transform: translateY(-2px);
+  box-shadow: 0 22px 48px rgba(31, 120, 255, 0.32);
+}
+
+.login-btn:disabled {
+  opacity: 0.8;
+  cursor: not-allowed;
+}
+
+@keyframes enter {
+  from {
+    opacity: 0;
+    transform: translateY(26px);
+  }
+  to {
+    opacity: 1;
+    transform: translateY(0);
+  }
+}
+
+@keyframes rotate {
+  to {
+    transform: rotate(360deg);
+  }
+}
+
+@keyframes flow {
+  to {
+    stroke-dashoffset: -44;
+  }
+}
+
+@keyframes boxMove {
+  0% {
+    transform: translateX(-150px);
+    opacity: 0;
+  }
+  12% {
+    opacity: 1;
+  }
+  78% {
+    opacity: 1;
+  }
+  100% {
+    transform: translateX(650px);
+    opacity: 0;
+  }
+}
+
+@keyframes armMove {
+  0%,
+  100% {
+    transform: rotate(-4deg);
+  }
+  50% {
+    transform: rotate(9deg);
+  }
+}
+
+@keyframes pulse {
+  0%,
+  100% {
+    opacity: 0.45;
+    transform: scale(1);
+  }
+  50% {
+    opacity: 1;
+    transform: scale(1.18);
+  }
+}
+
+@keyframes glow {
+  0%,
+  100% {
+    box-shadow: 0 0 18px rgba(32, 224, 210, 0.3);
+  }
+  50% {
+    box-shadow: 0 0 34px rgba(32, 224, 210, 0.68);
+  }
+}
+
+@media (max-width: 1320px) {
+  .hero h1 {
+    font-size: clamp(52px, 5.2vw, 78px);
+  }
+}
+
+@media (max-width: 980px) {
   .login-page {
-    padding: 18px;
+    overflow: auto;
   }
 
-  .login-shell {
-    min-height: auto;
+  .page {
     grid-template-columns: 1fr;
+    padding: 18px;
+    min-height: auto;
   }
 
-  .login-brand {
-    padding: 40px 28px 22px;
+  .factory,
+  .login-wrap {
+    min-height: auto;
   }
 
-  .login-brand::after {
-    inset: 16px;
+  .factory {
+    min-height: 760px;
   }
 
-  .brand-title {
-    font-size: 32px;
+  .time {
+    display: none;
   }
 
-  .brand-copy {
-    font-size: 14px;
+  .login-wrap {
+    padding: 22px;
   }
 
-  .brand-points {
-    margin-top: 24px;
-  }
-
-  .login-panel {
-    padding: 12px 18px 24px;
-  }
-
-  .login-form {
+  .login-card {
     width: 100%;
-    padding: 28px 22px 24px;
+    padding: 26px;
   }
+
+  .login-btn {
+    font-size: 16px;
+  }
+
 }
 </style>
diff --git a/src/views/officeProcessAutomation/ApproveManage/approve-list/approveListConstants.js b/src/views/officeProcessAutomation/ApproveManage/approve-list/approveListConstants.js
new file mode 100644
index 0000000..3251f0c
--- /dev/null
+++ b/src/views/officeProcessAutomation/ApproveManage/approve-list/approveListConstants.js
@@ -0,0 +1,609 @@
+import { createEmptyNode, formatDisplayTime, mapNodesFromApi, mapSignModeFromApi, mapSignModeToApi, normalizeFlowNodes, nodeSignModeLabel } from "../approve-template/approveTemplateConstants.js";
+import { buildFormPayloadFromFields, parseFormConfigToData } from "../approve-template/formConfigUtils.js";
+import { isDynamicOptionSource, resolveSelectDisplayLabel } from "../approve-template/selectOptionSource.js";
+import { appendDotNotationQuery, buildApprovalInstanceSearchDto } from "../approve-shared/approvalInstanceListSearch.js";
+
+/** 瀹℃壒绫诲瀷锛堜笌鍚庣瀛楁 approvalType 瀵归綈锛屽悗鏈熷彲鍚屾锛� */
+export const APPROVAL_TYPE_OPTIONS = [
+  { value: "cost_reimburse", label: "璐圭敤鎶ラ攢鐢宠", cellBg: "#e8f8ef", cellColor: "#1a7f4b" },
+  { value: "travel_reimburse", label: "宸梾鎶ラ攢鐢宠", cellBg: "#f0f2f5", cellColor: "#606266" },
+  { value: "overtime", label: "鍔犵彮鐢宠", cellBg: "#fdf3e8", cellColor: "#c45c26" },
+  { value: "leave", label: "璇峰亣鐢宠", cellBg: "#fce8f0", cellColor: "#b84d7a" },
+  { value: "work_handover", label: "宸ヤ綔浜ゆ帴鐢宠", cellBg: "#f0e8fc", cellColor: "#6b4d9e" },
+  { value: "regular", label: "杞鐢宠", cellBg: "#e8f4fc", cellColor: "#2b6cb0" },
+  { value: "resign", label: "绂昏亴鐢宠", cellBg: "#ffffff", cellColor: "#303133", border: "1px solid #e4e7ed" },
+  { value: "transfer", label: "璋冨矖鐢宠", cellBg: "#ffffff", cellColor: "#303133", border: "1px solid #e4e7ed" },
+  { value: "out_office", label: "鍏嚭鐢宠", cellBg: "#e8f4ff", cellColor: "#409eff" },
+  { value: "business_trip", label: "鍑哄樊鐢宠", cellBg: "#fdf6ec", cellColor: "#e6a23c" },
+  { value: "procurement", label: "閲囪喘瀹℃壒", cellBg: "#f4f4f5", cellColor: "#909399" },
+  { value: "quotation", label: "鎶ヤ环瀹℃壒", cellBg: "#f4ecfc", cellColor: "#9b59b6" },
+  { value: "shipment", label: "鍙戣揣瀹℃壒", cellBg: "#e8faf6", cellColor: "#1abc9c" },
+  { value: "enterprise_news", label: "浼佷笟鏂伴椈", cellBg: "#ecf5ff", cellColor: "#409eff" },
+];
+
+/** 鍒楄〃鏌ヨ锛氬鎵圭姸鎬侊紙涓庡悗绔� status 鏋氫妇涓�鑷达級 */
+export const APPROVAL_STATUS_SEARCH_OPTIONS = [
+  { value: "DRAFT", label: "鑽夌" },
+  { value: "PENDING", label: "寰呭鎵�" },
+  { value: "APPROVED", label: "宸查�氳繃" },
+  { value: "REJECTED", label: "宸查┏鍥�" },
+];
+
+/**
+ * 瀹℃壒鐘舵�佸睍绀猴紙涓庡悗绔� status 鏋氫妇涓�鑷达級
+ * DRAFT鈫掕崏绋� PENDING鈫掑緟瀹℃壒/杩涜涓� APPROVED鈫掑凡閫氳繃/宸插畬鎴� REJECTED鈫掑凡椹冲洖
+ */
+export const APPROVAL_STATUS_OPTIONS = [
+  { value: "draft", api: "DRAFT", label: "鑽夌" },
+  { value: "pending", api: "PENDING", label: "寰呭鎵�" },
+  { value: "approved", api: "APPROVED", label: "宸查�氳繃" },
+  { value: "rejected", api: "REJECTED", label: "宸查┏鍥�" },
+  { value: "cancelled", api: "CANCELLED", label: "宸叉挙閿�" },
+];
+
+/** 鏁板瓧鐘舵�佺爜锛堥儴鍒嗗悗绔敤 0/1/2锛� */
+const STATUS_NUMERIC_MAP = {
+  0: "pending",
+  1: "approved",
+  2: "rejected",
+  3: "cancelled",
+  4: "cancelled",
+};
+
+/** 鍚庣 status / 椤甸潰 approvalStatus 鈫� 缁熶竴椤甸潰 key锛坧ending | approved | rejected | cancelled锛� */
+export function normalizeApprovalStatusKey(v) {
+  if (v == null || v === "") return "pending";
+  if (typeof v === "number" || (typeof v === "string" && /^\d+$/.test(v.trim()))) {
+    const numKey = STATUS_NUMERIC_MAP[Number(v)];
+    if (numKey) return numKey;
+  }
+  const s = String(v).trim();
+  if (!s) return "pending";
+  const upper = s.toUpperCase();
+  if (upper === "DRAFT") return "draft";
+  if (upper === "PUBLISHED") return "approved";
+  if (upper === "OFFLINE") return "cancelled";
+  if (upper === "APPROVED" || upper === "APPROVE" || upper === "PASS" || upper === "AGREE") {
+    return "approved";
+  }
+  if (upper === "REJECTED" || upper === "REJECT" || upper === "REFUSE" || upper === "REFUSED" || upper === "DENIED") {
+    return "rejected";
+  }
+  if (upper === "CANCELLED" || upper === "CANCEL" || upper === "REVOKED") return "cancelled";
+  if (upper === "PENDING" || upper === "IN_PROGRESS" || upper === "PROCESSING" || upper === "RUNNING" || upper === "WAIT" || upper === "WAITING") {
+    return "pending";
+  }
+  if (s.includes("鑽夌")) return "draft";
+  if (s.includes("椹冲洖") || s.includes("鎷掔粷")) return "rejected";
+  if (s.includes("涓嬬嚎")) return "cancelled";
+  if (s.includes("鎾ら攢")) return "cancelled";
+  if (s.includes("鍙戝竷") || s.includes("閫氳繃") || s.includes("瀹屾垚")) return "approved";
+  if (s.includes("寰呭") || s.includes("杩涜涓�") || s.includes("瀹℃壒涓�")) return "pending";
+  const lower = s.toLowerCase();
+  if (["draft", "pending", "approved", "rejected", "cancelled"].includes(lower)) return lower;
+  return "pending";
+}
+
+/** 浠庡垪琛�/璇︽儏琛岃В鏋愬悗绔師濮嬬姸鎬侊紙鍏煎澶氬瓧娈靛懡鍚嶏級 */
+export function resolveInstanceStatusRaw(row) {
+  if (!row || typeof row !== "object") return "";
+  const candidates = [
+    row.status,
+    row.statusRaw,
+    row.approvalStatus,
+    row.statusName,
+    row.statusLabel,
+    row.approvalStatusName,
+    row.statusDesc,
+    row.instanceStatus,
+    row.approvalInstanceStatus,
+    row.approveStatus,
+    row.auditStatus,
+    row.approvalInstance?.status,
+    row.approvalInstanceVo?.status,
+  ];
+  for (const c of candidates) {
+    if (c != null && c !== "") return c;
+  }
+  const tasks = row.tasks;
+  if (Array.isArray(tasks) && tasks.length) {
+    const rejected = tasks.some(t => normalizeApprovalStatusKey(t?.status ?? t?.taskStatus) === "rejected");
+    if (rejected) return "REJECTED";
+    const allApproved = tasks.every(t => normalizeApprovalStatusKey(t?.status ?? t?.taskStatus) === "approved");
+    if (allApproved) return "APPROVED";
+  }
+  return "";
+}
+
+/** 鎻愪氦寮圭獥锛氭ā鏉垮崱鐗囷紙鏉ヨ嚜鍚庣鍒楄〃锛� */
+export function mapSubmitTemplateCard(row) {
+  const cfg = parseFormConfigToData(row?.formConfig);
+  return {
+    id: row?.id,
+    key: String(row?.id ?? ""),
+    businessType: row?.businessType ?? cfg.approvalType ?? row?.approvalType ?? "",
+    approvalType: cfg.approvalType || row?.approvalType || "",
+    label: row?.templateName || "鈥�",
+    summaryPlaceholder: (row?.description || "").trim() || cfg.summaryPlaceholder || "鐐瑰嚮濉啓骞舵彁浜�",
+  };
+}
+
+export function matchBusinessTypeValue(a, b) {
+  if (a == null || a === "" || b == null || b === "") return false;
+  return a === b || a === Number(b) || Number(a) === b || String(a) === String(b);
+}
+
+/** 瀹℃壒璁板綍 approveAction 鈫� 椤甸潰 result */
+export function mapRecordResultFromApi(action) {
+  const s = String(action || "").toUpperCase();
+  if (s === "APPROVED" || s === "APPROVE" || s === "PASS") return "approved";
+  if (s === "REJECTED" || s === "REJECT" || s === "REFUSE") return "rejected";
+  return "pending";
+}
+
+/** 鍚庣 records 鈫� 鏃堕棿绾垮睍绀虹粨鏋� */
+export function mapRecordsFromApi(records) {
+  const list = Array.isArray(records) ? records : [];
+  return list.map(r => ({
+    id: r.id,
+    operatorName: r.approverName || r.operatorName || r.createUserName || "",
+    result: mapRecordResultFromApi(r.approveAction ?? r.action ?? r.status),
+    opinion: r.approveComment || r.comment || r.opinion || "",
+    time: formatDisplayTime(r.approveTime || r.createTime || r.time || ""),
+    raw: r,
+  }));
+}
+
+export function mapTaskStatusLabel(status) {
+  return approvalStatusLabel(status);
+}
+
+export function mapTaskStatusTagType(status) {
+  return approvalStatusTagType(status);
+}
+
+/** 鍚庣 tasks 鈫� 椤甸潰 flowNodes锛堟寜 levelNo 鍒嗙粍锛屼緵娴佺▼缂栬緫/灞曠ず锛� */
+export function mapTasksToFlowNodes(tasks) {
+  const list = Array.isArray(tasks) ? tasks : [];
+  if (!list.length) return [];
+  const byLevel = new Map();
+  list.forEach(t => {
+    const level = Number(t.levelNo ?? t.taskLevel ?? t.nodeOrder ?? 1);
+    if (!byLevel.has(level)) {
+      byLevel.set(level, {
+        id: t.nodeId,
+        templateId: t.templateId,
+        nodeOrder: level,
+        signMode: mapSignModeFromApi(t.approveType),
+        approvers: [],
+        tasks: [],
+      });
+    }
+    const node = byLevel.get(level);
+    node.approvers.push({
+      id: t.id,
+      nodeId: t.nodeId,
+      templateId: t.templateId,
+      approverId: t.approverId,
+      approverName: t.approverName || "",
+      status: t.status,
+      approveComment: t.approveComment,
+      approveTime: t.approveTime,
+    });
+    node.tasks.push(t);
+    if (t.approveType != null) {
+      node.signMode = mapSignModeFromApi(t.approveType);
+    }
+  });
+  return [...byLevel.entries()].sort(([a], [b]) => a - b).map(([, node]) => node);
+}
+
+/** 椤甸潰 flowNodes 鈫� 鍚庣 tasks */
+export function mapFlowNodesToTasks(flowNodes, { instanceId, templateId } = {}) {
+  const nodes = normalizeFlowNodes(flowNodes);
+  const tasks = [];
+  nodes.forEach(n => {
+    const levelNo = n.nodeOrder ?? 1;
+    const approveType = mapSignModeToApi(n.signMode);
+    n.approvers.forEach((a, idx) => {
+      const task = {
+        levelNo,
+        approveType,
+        approverId: a.approverId,
+        approverName: a.approverName || "",
+        sortNo: a.sortNo ?? idx + 1,
+      };
+      if (a.id != null) task.id = a.id;
+      if (a.nodeId != null) task.nodeId = a.nodeId;
+      if (a.templateId != null) task.templateId = a.templateId;
+      else if (templateId) task.templateId = templateId;
+      if (instanceId) task.instanceId = instanceId;
+      if (a.status != null) task.status = a.status;
+      tasks.push(task);
+    });
+  });
+  return tasks;
+}
+
+function guessFieldTypeFromValue(val) {
+  if (Array.isArray(val) && val.length === 2) return "datetimerange";
+  if (typeof val === "number") return "number";
+  if (typeof val === "string" && /^\d{4}-\d{2}-\d{2}$/.test(val)) return "date";
+  if (typeof val === "string" && val.length > 100) return "textarea";
+  return "text";
+}
+
+/**
+ * 鍗曞瓧娈靛睍绀哄�硷紙璇︽儏鍙銆佸垪琛ㄤ富琛級
+ * @param {object} [caches] 浜哄憳/閮ㄩ棬涓嬫媺缂撳瓨锛岀敤浜庤В鏋愩�屼汉鍛樺垪琛ㄣ�嶇被瀛楁涓哄鍚�
+ */
+export function formatFieldDisplayValue(field, val, caches) {
+  if (val == null || val === "" || (Array.isArray(val) && !val.length)) return "鈥�";
+  if (field?.type === "select" && isDynamicOptionSource(field.optionSource)) {
+    const label = resolveSelectDisplayLabel(field, val, caches || {});
+    if (label && label !== "鈥�") return label;
+    return String(val);
+  }
+  if (field?.type === "select" && field.options?.length) {
+    const hit = field.options.find(o => String(o.value) === String(val));
+    return hit?.label || String(val);
+  }
+  if (Array.isArray(val)) return val.join(" 鑷� ");
+  return String(val);
+}
+
+/**
+ * 浠庤鏁版嵁 / formConfig 瑙f瀽濉姤瀛楁瀹氫箟涓� formPayload锛堜笌鏂板鎻愪氦缁撴瀯涓�鑷达級
+ */
+export function resolveInstanceFormFields(row) {
+  const cfg = parseInstanceFormConfig(row?.formConfig);
+  let fields = (row?.formFieldDefs?.length ? row.formFieldDefs : cfg.fields) || [];
+  const formPayload = {
+    ...(fields.length ? buildFormPayloadFromFields(fields) : {}),
+    ...cfg.formPayload,
+    ...(row?.formPayload || {}),
+  };
+  if (!fields.length && Object.keys(formPayload).length) {
+    fields = Object.keys(formPayload)
+      .filter(k => k && k !== "summary")
+      .map(k => ({
+        key: k,
+        label: k,
+        type: guessFieldTypeFromValue(formPayload[k]),
+        required: false,
+        rows: 3,
+        min: 0,
+        precision: 0,
+        options: [],
+      }));
+  }
+  const templateSnapshot = {
+    label: row?.templateName || row?.title || "瀹℃壒",
+    approvalType: cfg.approvalType || row?.approvalType || "",
+    summaryPlaceholder: cfg.summaryPlaceholder || "",
+    templateId: row?.templateId,
+    fields,
+  };
+  return { fields, formPayload, templateSnapshot, formConfigData: cfg };
+}
+
+/** 瑙f瀽瀹炰緥 formConfig */
+export function parseInstanceFormConfig(formConfig) {
+  let raw = {};
+  if (formConfig) {
+    if (typeof formConfig === "object") raw = formConfig;
+    else {
+      try {
+        raw = JSON.parse(formConfig);
+      } catch {
+        raw = {};
+      }
+    }
+  }
+  const data = parseFormConfigToData(formConfig);
+  const payload = raw.formPayload;
+  return {
+    summaryPlaceholder: raw.summaryPlaceholder || data.summaryPlaceholder || "",
+    approvalType: raw.approvalType || "",
+    fields: data.fields || [],
+    formPayload: payload && typeof payload === "object" ? payload : {},
+  };
+}
+
+export function unwrapInstanceDetail(res) {
+  const data = res?.data ?? res;
+  if (!data || typeof data !== "object") return {};
+  if (data.id != null || data.instanceNo) return data;
+  if (data.approvalInstanceVo) return data.approvalInstanceVo;
+  return data;
+}
+
+/** 濉姤鍐呭 + 妯℃澘瀛楁瀹氫箟 鈫� formConfig JSON */
+export function buildInstanceFormConfigJson(templateSnapshot, formPayload) {
+  const payload = formPayload || {};
+  return JSON.stringify({
+    summaryPlaceholder: templateSnapshot?.summaryPlaceholder || "",
+    approvalType: templateSnapshot?.approvalType || "",
+    fields: templateSnapshot?.fields || [],
+    formPayload: payload,
+  });
+}
+
+/** 缁勮淇濆瓨/鏇存柊瀹℃壒 DTO */
+export function buildInstanceDto({ submitForm, activeTemplate, userStore, flowNodes, existingRow }) {
+  const payload = submitForm?.formPayload || {};
+  const tpl = activeTemplate || {};
+  const title = String(payload.summary || payload.title || "").trim() || tpl.label || submitForm?.templateName || "瀹℃壒鐢宠";
+  const templateId = submitForm?.templateId || tpl.templateId;
+  const instanceId = existingRow?.id ?? submitForm?.instanceId;
+  const taskList = mapFlowNodesToTasks(flowNodes || submitForm?.flowNodes, {
+    instanceId,
+    templateId,
+  });
+  const isUpdate = Boolean(instanceId);
+
+  const dto = {
+    templateId,
+    templateName: submitForm?.templateName || tpl.label || "",
+    businessType: tpl.businessType ?? submitForm?.businessType ?? "",
+    title,
+    formConfig: buildInstanceFormConfigJson({ ...tpl, fields: tpl.fields || submitForm?.formFieldDefs }, payload),
+    tasks: taskList,
+  };
+
+  const attachments = (Array.isArray(submitForm?.storageBlobDTOs) && submitForm.storageBlobDTOs.length ? submitForm.storageBlobDTOs : null) || tpl.storageBlobDTOs;
+  if (attachments?.length) dto.storageBlobDTOs = attachments;
+
+  if (isUpdate) {
+    dto.id = existingRow?.id ?? submitForm?.instanceId;
+    dto.instanceNo = existingRow?.instanceNo ?? submitForm?.instanceNo ?? "";
+    dto.status = submitForm?.saveStatusApi || existingRow?.statusRaw || mapInstanceStatusToApi(existingRow?.approvalStatus) || "PENDING";
+    dto.currentLevel = existingRow?.currentLevel ?? submitForm?.currentLevel ?? 1;
+    dto.applicantId = existingRow?.applicantId ?? existingRow?.applicantNo;
+    dto.applicantName = existingRow?.applicantName || "";
+  } else {
+    dto.status = submitForm?.saveStatusApi || "PENDING";
+    dto.currentLevel = 1;
+    dto.applicantId = userStore?.id;
+    dto.applicantName = userStore?.nickName || userStore?.name || "";
+  }
+  return dto;
+}
+
+/** 鏍¢獙鎻愪氦瀹℃壒娴佺▼锛堜笌妯℃澘椤佃鍒欎竴鑷达級 */
+export function validateSubmitFlowNodes(flowNodes) {
+  const nodes = normalizeFlowNodes(flowNodes);
+  if (!nodes.length) return { ok: false, message: "璇疯嚦灏戦厤缃竴涓鎵硅妭鐐�" };
+  for (let i = 0; i < nodes.length; i++) {
+    if (!nodes[i].approvers.length) {
+      return { ok: false, message: `璇蜂负绗� ${i + 1} 涓妭鐐归�夋嫨鑷冲皯涓�鍚嶅鎵逛汉` };
+    }
+  }
+  return { ok: true, nodes };
+}
+
+/** 鍚庣 status 鈫� 椤甸潰 approvalStatus */
+export function mapInstanceStatusFromApi(status) {
+  return normalizeApprovalStatusKey(status);
+}
+
+/** 鍒楄〃/璇︽儏琛� 鈫� 椤甸潰 approvalStatus key */
+export function mapInstanceApprovalStatusFromRow(row) {
+  const raw = resolveInstanceStatusRaw(row);
+  return normalizeApprovalStatusKey(raw);
+}
+
+/** 椤甸潰 approvalStatus 鈫� 鍚庣 status */
+export function mapInstanceStatusToApi(approvalStatus) {
+  const key = normalizeApprovalStatusKey(approvalStatus);
+  const hit = APPROVAL_STATUS_OPTIONS.find(x => x.value === key);
+  return hit?.api || "PENDING";
+}
+
+export function unwrapInstancePage(res) {
+  const data = res?.data ?? res;
+  return {
+    records: Array.isArray(data?.records) ? data.records : [],
+    total: Number(data?.total ?? 0),
+  };
+}
+
+/** 鍒嗛〉鍒楄〃椤� 鈫� 琛ㄦ牸琛� */
+export function mapInstanceFromApi(row) {
+  if (!row) return {};
+  const statusRaw = resolveInstanceStatusRaw(row);
+  const approvalStatus = normalizeApprovalStatusKey(statusRaw);
+  const createTime = formatDisplayTime(row.createTime ?? row.applyTime ?? "");
+  const applyTime = formatDisplayTime(row.applyTime ?? "");
+  const finishTime = formatDisplayTime(row.finishTime ?? "");
+  const resolved = resolveInstanceFormFields(row);
+  const { fields, formPayload, templateSnapshot } = resolved;
+  const tasks = Array.isArray(row.tasks) ? row.tasks : [];
+  const flowNodes = tasks.length ? mapTasksToFlowNodes(tasks) : mapNodesFromApi(row.nodes || row.flowNodes);
+  const approvalRecords = mapRecordsFromApi(row.records);
+  return {
+    id: row.id,
+    bizId: row.instanceNo || String(row.id ?? ""),
+    instanceNo: row.instanceNo || "",
+    templateId: row.templateId,
+    templateName: row.templateName || "",
+    businessId: row.businessId,
+    businessType: row.businessType,
+    businessName: row.businessName || "",
+    applicantId: row.applicantId,
+    applicantNo: row.applicantId != null ? String(row.applicantId) : "",
+    applicantName: row.applicantName || "",
+    approvalType: row.approvalType || row.templateName || "",
+    unread: Boolean(row.isApprove) && approvalStatus === "pending",
+    isApprove: Boolean(row.isApprove),
+    approvalStatus,
+    statusRaw: statusRaw || row.status,
+    createTime,
+    applyTime: applyTime === "鈥�" ? "" : applyTime,
+    finishTime: finishTime === "鈥�" ? "" : finishTime,
+    title: row.title || "",
+    summary: row.title || row.templateName || "",
+    currentLevel: row.currentLevel,
+    formConfig: row.formConfig,
+    formPayload,
+    formFieldDefs: fields,
+    templateSnapshot,
+    tasks,
+    records: Array.isArray(row.records) ? row.records : [],
+    storageBlobVOList: row.storageBlobVOList || [],
+    storageBlobDTOs: row.storageBlobVOList || row.storageBlobDTOs || [],
+    flowNodes,
+    approvalFlowNodes: [],
+    currentNodeIndex: 0,
+    approvalRecords,
+    rejectReason: approvalRecords.find(r => r.result === "rejected")?.opinion || "",
+  };
+}
+
+/** 瀹℃壒鎿嶄綔锛氫笌鍚庣 status 鏋氫妇涓�鑷� */
+export const APPROVE_ACTION_APPROVED = "APPROVED";
+export const APPROVE_ACTION_REJECTED = "REJECTED";
+
+/** 椤甸潰鎿嶄綔 鈫� approveAction */
+export function mapApproveActionToApi(uiResult) {
+  return uiResult === "rejected" ? APPROVE_ACTION_REJECTED : APPROVE_ACTION_APPROVED;
+}
+
+/** 缁勮瀹℃壒鎻愪氦 DTO */
+export function buildApproveInstanceDto(row, uiResult, comment) {
+  const opinion = (comment || "").trim();
+  return {
+    id: row?.id,
+    approveAction: mapApproveActionToApi(uiResult),
+    approveComment: opinion || (uiResult === "approved" ? "鍚屾剰" : ""),
+  };
+}
+
+export function buildApprovalInstanceListParams({ page, searchForm, businessType, extraParams }) {
+  const dto = buildApprovalInstanceSearchDto(searchForm, extraParams);
+  const bizType = businessType ?? searchForm?.businessType;
+  if (bizType != null && bizType !== "") {
+    dto.businessType = bizType;
+  }
+
+  const params = {
+    current: page.current,
+    size: page.size,
+    "page.current": page.current,
+    "page.size": page.size,
+    ...dto,
+  };
+  appendDotNotationQuery(params, "approvalInstanceDto", dto);
+  return params;
+}
+
+export function approvalTypeLabel(v) {
+  return APPROVAL_TYPE_OPTIONS.find(x => x.value === v)?.label || v || "鈥�";
+}
+
+export function approvalTypeStyle(v) {
+  const hit = APPROVAL_TYPE_OPTIONS.find(x => x.value === v);
+  if (!hit) return {};
+  return {
+    backgroundColor: hit.cellBg,
+    color: hit.cellColor,
+    border: hit.border || "none",
+  };
+}
+
+export function approvalStatusLabel(v) {
+  const key = normalizeApprovalStatusKey(v);
+  return APPROVAL_STATUS_OPTIONS.find(x => x.value === key)?.label || "鈥�";
+}
+
+/** 涓氬姟鐢宠椤电姸鎬佹枃妗堬細PENDING鈫掕繘琛屼腑 APPROVED鈫掑凡瀹屾垚 REJECTED鈫掑凡椹冲洖 */
+export function businessApprovalStatusLabel(v) {
+  const key = normalizeApprovalStatusKey(v);
+  if (key === "draft") return "鑽夌";
+  if (key === "pending") return "杩涜涓�";
+  if (key === "approved") return "宸插畬鎴�";
+  if (key === "rejected") return "宸查┏鍥�";
+  if (key === "cancelled") return "宸叉挙閿�";
+  return "鈥�";
+}
+
+/**
+ * 涓氬姟鐢宠椤垫槸鍚﹀厑璁镐慨鏀癸紙浜斾釜鐢宠椤碉級
+ * 杩涜涓�(PENDING)銆佸凡瀹屾垚(APPROVED) 涓嶅彲淇敼锛涘凡椹冲洖銆佸凡鎾ら攢绛夊彲淇敼
+ */
+export function canEditBusinessInstanceRow(row) {
+  const key = normalizeApprovalStatusKey(row?.approvalStatus ?? row?.statusRaw ?? row?.status);
+  return key !== "pending" && key !== "approved";
+}
+
+export function businessApprovalStatusTagType(v) {
+  const key = normalizeApprovalStatusKey(v);
+  if (key === "draft") return "info";
+  if (key === "approved") return "success";
+  if (key === "rejected") return "danger";
+  if (key === "cancelled") return "info";
+  return "warning";
+}
+
+export function approvalStatusTagType(v) {
+  const key = normalizeApprovalStatusKey(v);
+  if (key === "draft") return "info";
+  if (key === "approved") return "success";
+  if (key === "rejected") return "danger";
+  if (key === "cancelled") return "info";
+  return "warning";
+}
+
+/** 鍒楄〃琛� 鈫� 缂栬緫琛ㄥ崟锛堜粎鐢ㄨ鏁版嵁鍥炴樉锛� */
+export function buildEditFormFromInstanceRow(row) {
+  const { fields, formPayload, templateSnapshot } = resolveInstanceFormFields(row);
+  const normalized = normalizeFlowNodes(row?.flowNodes?.length ? row.flowNodes : mapTasksToFlowNodes(row?.tasks));
+  const flowNodes = normalized.length ? JSON.parse(JSON.stringify(normalized)) : [createEmptyNode(1)];
+
+  return {
+    templateKey: String(row?.templateId || ""),
+    templateId: row?.templateId,
+    templateName: row?.templateName || templateSnapshot.label,
+    instanceId: row?.id,
+    instanceNo: row?.instanceNo || "",
+    statusRaw: row?.statusRaw || row?.status || "PENDING",
+    currentLevel: row?.currentLevel ?? 1,
+    applicantId: row?.applicantId,
+    applicantName: row?.applicantName || "",
+    templateSnapshot,
+    formFieldDefs: fields,
+    formPayload,
+    flowNodes,
+    templateAttachments: initTemplateAttachmentsFromSnapshot(templateSnapshot),
+    storageBlobDTOs: (row?.storageBlobDTOs?.length ? row.storageBlobDTOs : row?.storageBlobVOList || []).map(f => JSON.parse(JSON.stringify(f))),
+  };
+}
+
+export function createEmptySubmitForm(templateKey, templateOverride, flowNodesOverride) {
+  const tpl = templateOverride || null;
+  const payload = tpl?.fields?.length ? buildFormPayloadFromFields(tpl.fields) : { summary: "" };
+  const normalized = normalizeFlowNodes(flowNodesOverride);
+  const flowNodes = normalized.length ? JSON.parse(JSON.stringify(normalized)) : [createEmptyNode(1)];
+  return {
+    templateKey: templateKey || "",
+    templateId: tpl?.templateId || "",
+    templateName: tpl?.label || "",
+    instanceId: "",
+    instanceNo: "",
+    statusRaw: "",
+    currentLevel: 1,
+    applicantId: null,
+    applicantName: "",
+    templateSnapshot: templateOverride || null,
+    formFieldDefs: tpl?.fields || [],
+    formPayload: payload,
+    flowNodes,
+    templateAttachments: tpl?.storageBlobDTOs ? JSON.parse(JSON.stringify(tpl.storageBlobDTOs)) : [],
+    storageBlobDTOs: [],
+  };
+}
+
+export function initTemplateAttachmentsFromSnapshot(templateSnapshot) {
+  const list = templateSnapshot?.storageBlobDTOs;
+  return list?.length ? JSON.parse(JSON.stringify(list)) : [];
+}
diff --git a/src/views/officeProcessAutomation/ApproveManage/approve-list/components/ApproveDetailPanel.vue b/src/views/officeProcessAutomation/ApproveManage/approve-list/components/ApproveDetailPanel.vue
new file mode 100644
index 0000000..721a5c2
--- /dev/null
+++ b/src/views/officeProcessAutomation/ApproveManage/approve-list/components/ApproveDetailPanel.vue
@@ -0,0 +1,167 @@
+<!-- 瀹℃壒璇︽儏锛氬熀纭�淇℃伅 + 濉姤鍐呭 -->
+<template>
+  <div class="approve-detail-panel">
+    <div class="detail-block">
+      <div class="detail-block-title">鍩烘湰淇℃伅</div>
+      <el-descriptions :column="2"
+                       border>
+        <el-descriptions-item label="涓氬姟鍗曞彿">{{ row.bizId || row.id || "鈥�" }}</el-descriptions-item>
+        <el-descriptions-item label="瀹℃壒鐘舵��">
+          <el-tag :type="approvalStatusTagType(row.approvalStatus)"
+                  size="small"
+                  effect="plain">
+            {{ approvalStatusLabel(row.approvalStatus) }}
+          </el-tag>
+        </el-descriptions-item>
+        <el-descriptions-item label="瀹℃壒绫诲瀷">
+          <span class="approve-type-cell"
+                :style="approvalTypeStyle(row.approvalType)">
+            {{ approvalTypeLabel(row.approvalType) }}
+          </span>
+        </el-descriptions-item>
+        <el-descriptions-item label="鐢宠浜虹紪鍙�">{{ row.applicantNo || "鈥�" }}</el-descriptions-item>
+        <el-descriptions-item label="鐢宠浜哄悕绉�">{{ row.applicantName || "鈥�" }}</el-descriptions-item>
+        <el-descriptions-item label="鐢宠鎽樿">{{ row.summary || "鈥�" }}</el-descriptions-item>
+        <el-descriptions-item v-if="row.rejectReason"
+                              label="椹冲洖鍘熷洜"
+                              :span="2">
+          <span class="reject-text">{{ row.rejectReason }}</span>
+        </el-descriptions-item>
+        <el-descriptions-item label="鍒涘缓鏃堕棿"
+                              :span="2">
+          {{ formatDisplayTime(row.createTime) }}
+        </el-descriptions-item>
+      </el-descriptions>
+    </div>
+    <div class="detail-block">
+      <div class="detail-block-title">濉姤鍐呭</div>
+      <FormPayloadFields :fields="formResolved.fields"
+                         :form-payload="formResolved.formPayload"
+                         readonly />
+    </div>
+    <div v-if="attachmentList.length"
+         class="detail-block">
+      <div class="detail-block-title">闄勪欢鍒楄〃</div>
+      <div class="attachment-list">
+        <div v-for="file in attachmentList"
+             :key="file.id"
+             class="attachment-item">
+          <el-icon class="file-icon">
+            <Paperclip />
+          </el-icon>
+          <span class="file-name"
+                :title="file.name || file.originalFilename">
+            {{ file.name || file.originalFilename }}
+          </span>
+          <div class="file-actions">
+            <el-link v-if="file.previewURL || file.url"
+                     type="primary"
+                     :underline="false"
+                     @click="openFile(file.previewURL || file.url)">棰勮</el-link>
+            <el-divider v-if="(file.previewURL || file.url) && file.downloadURL"
+                        direction="vertical" />
+            <el-link v-if="file.downloadURL"
+                     type="primary"
+                     :underline="false"
+                     @click="openFile(file.downloadURL)">涓嬭浇</el-link>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script setup>
+  import { computed } from "vue";
+  import { Paperclip } from "@element-plus/icons-vue";
+  import { formatDisplayTime } from "../../approve-template/approveTemplateConstants.js";
+  import {
+    approvalTypeLabel,
+    approvalTypeStyle,
+    approvalStatusLabel,
+    approvalStatusTagType,
+    resolveInstanceFormFields,
+  } from "../approveListConstants.js";
+  import FormPayloadFields from "./FormPayloadFields.vue";
+
+  const props = defineProps({
+    row: { type: Object, default: () => ({}) },
+  });
+
+  const formResolved = computed(() => resolveInstanceFormFields(props.row));
+
+  const attachmentList = computed(() => {
+    const list = props.row.storageBlobVOList || props.row.storageBlobDTOs || [];
+    return Array.isArray(list) ? list : [];
+  });
+
+  function openFile(url) {
+    if (!url) return;
+    window.open(url, "_blank");
+  }
+</script>
+
+<style scoped>
+  .approve-detail-panel {
+    display: flex;
+    flex-direction: column;
+    gap: 20px;
+  }
+  .detail-block-title {
+    font-size: 14px;
+    font-weight: 600;
+    color: var(--el-text-color-primary);
+    margin: 0 0 12px;
+    padding-left: 10px;
+    border-left: 3px solid var(--el-color-primary);
+    line-height: 1.4;
+  }
+  .approve-type-cell {
+    display: inline-block;
+    padding: 2px 10px;
+    border-radius: 4px;
+    font-size: 13px;
+    line-height: 1.5;
+  }
+  .reject-text {
+    color: var(--el-color-danger);
+  }
+
+  .attachment-list {
+    display: grid;
+    grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
+    gap: 12px;
+  }
+  .attachment-item {
+    display: flex;
+    align-items: center;
+    padding: 10px 12px;
+    background-color: var(--el-fill-color-light);
+    border-radius: 6px;
+    border: 1px solid var(--el-border-color-lighter);
+    transition: all 0.3s;
+  }
+  .attachment-item:hover {
+    border-color: var(--el-color-primary-light-5);
+    background-color: var(--el-color-primary-light-9);
+  }
+  .file-icon {
+    font-size: 18px;
+    color: var(--el-text-color-secondary);
+    margin-right: 10px;
+  }
+  .file-name {
+    flex: 1;
+    font-size: 13px;
+    color: var(--el-text-color-primary);
+    white-space: nowrap;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    margin-right: 12px;
+  }
+  .file-actions {
+    display: flex;
+    align-items: center;
+    flex-shrink: 0;
+  }
+</style>
diff --git a/src/views/officeProcessAutomation/ApproveManage/approve-list/components/FormPayloadFields.vue b/src/views/officeProcessAutomation/ApproveManage/approve-list/components/FormPayloadFields.vue
new file mode 100644
index 0000000..7933db5
--- /dev/null
+++ b/src/views/officeProcessAutomation/ApproveManage/approve-list/components/FormPayloadFields.vue
@@ -0,0 +1,152 @@
+<!-- 濉姤椤癸細缂栬緫涓鸿〃鍗曟帶浠讹紝璇︽儏涓� descriptions 琛ㄦ牸锛堜笌涓婃柟鍩虹淇℃伅涓�鑷达級 -->
+<template>
+  <template v-if="fields?.length">
+    <el-descriptions
+      v-if="readonly"
+      :column="2"
+      border
+      class="form-payload-desc"
+    >
+      <el-descriptions-item
+        v-for="field in fields"
+        :key="field.key"
+        :label="field.label"
+        :span="field.type === 'textarea' || field.type === 'datetimerange' ? 2 : 1"
+      >
+        <span class="field-value">{{ displayValue(field) }}</span>
+      </el-descriptions-item>
+    </el-descriptions>
+
+    <div
+      v-else
+      class="form-payload-edit"
+      v-loading="optionSourceLoading"
+    >
+      <el-form-item
+        v-for="field in fields"
+        :key="field.key"
+        :label="field.label"
+        :prop="`formPayload.${field.key}`"
+        :required="Boolean(field.required)"
+      >
+        <el-input
+          v-if="field.type === 'text'"
+          v-model="formPayload[field.key]"
+          :placeholder="`璇疯緭鍏�${field.label}`"
+          maxlength="200"
+        />
+        <el-input
+          v-else-if="field.type === 'textarea'"
+          v-model="formPayload[field.key]"
+          type="textarea"
+          :rows="field.rows || 3"
+          :placeholder="`璇峰~鍐�${field.label}`"
+          maxlength="2000"
+          show-word-limit
+        />
+        <el-input-number
+          v-else-if="field.type === 'number'"
+          v-model="formPayload[field.key]"
+          :min="field.min ?? 0"
+          :precision="field.precision ?? 0"
+          controls-position="right"
+          style="width: 100%"
+        />
+        <el-date-picker
+          v-else-if="field.type === 'date'"
+          v-model="formPayload[field.key]"
+          type="date"
+          :placeholder="`璇烽�夋嫨${field.label}`"
+          format="YYYY-MM-DD"
+          value-format="YYYY-MM-DD"
+          style="width: 100%"
+        />
+        <el-date-picker
+          v-else-if="field.type === 'datetimerange'"
+          v-model="formPayload[field.key]"
+          type="datetimerange"
+          range-separator="鑷�"
+          start-placeholder="寮�濮嬫椂闂�"
+          end-placeholder="缁撴潫鏃堕棿"
+          format="YYYY-MM-DD HH:mm:ss"
+          value-format="YYYY-MM-DD HH:mm:ss"
+          style="width: 100%"
+        />
+        <el-select
+          v-else-if="field.type === 'select'"
+          v-model="formPayload[field.key]"
+          :placeholder="`璇烽�夋嫨${field.label}`"
+          style="width: 100%"
+          clearable
+          filterable
+        >
+          <el-option
+            v-for="o in getOptions(field)"
+            :key="String(o.value)"
+            :label="o.label"
+            :value="o.value"
+          />
+        </el-select>
+        <span v-else class="field-value">{{ displayValue(field) }}</span>
+      </el-form-item>
+    </div>
+  </template>
+  <el-empty v-else description="鏆傛棤濉姤椤�" :image-size="48" />
+</template>
+
+<script setup>
+import { onMounted, watch } from "vue";
+import { useSelectOptionSources } from "../../approve-template/useSelectOptionSources.js";
+import { formatFieldDisplayValue } from "../approveListConstants.js";
+
+const props = defineProps({
+  fields: { type: Array, default: () => [] },
+  formPayload: { type: Object, default: () => ({}) },
+  readonly: { type: Boolean, default: false },
+});
+
+const { loading: optionSourceLoading, ensureForFields, getOptions, getDisplayLabel } =
+  useSelectOptionSources();
+
+async function loadOptionCaches() {
+  await ensureForFields(props.fields);
+}
+
+onMounted(() => {
+  loadOptionCaches();
+});
+
+watch(
+  () => props.fields,
+  () => {
+    loadOptionCaches();
+  },
+  { deep: true }
+);
+
+function displayValue(field) {
+  const val = props.formPayload?.[field.key];
+  if (field.type === "select" && field.optionSource && field.optionSource !== "static") {
+    return getDisplayLabel(field, val);
+  }
+  return formatFieldDisplayValue(field, val);
+}
+</script>
+
+<style scoped>
+.form-payload-desc {
+  width: 100%;
+}
+.form-payload-desc :deep(.el-descriptions__label) {
+  width: 120px;
+  font-weight: 500;
+}
+.field-value {
+  color: var(--el-text-color-primary);
+  line-height: 1.6;
+  word-break: break-word;
+}
+.form-payload-edit {
+  width: 100%;
+}
+</style>
diff --git a/src/views/officeProcessAutomation/ApproveManage/approve-list/components/InstanceFlowDisplay.vue b/src/views/officeProcessAutomation/ApproveManage/approve-list/components/InstanceFlowDisplay.vue
new file mode 100644
index 0000000..e5f2eef
--- /dev/null
+++ b/src/views/officeProcessAutomation/ApproveManage/approve-list/components/InstanceFlowDisplay.vue
@@ -0,0 +1,147 @@
+<!-- 瀹℃壒瀹炰緥锛歵asks 瀹℃壒娴佺▼灞曠ず锛堟í鍚戞楠ゆ潯锛� -->
+<template>
+  <div v-if="displayNodes.length" class="flow-track">
+    <div
+      v-for="(node, index) in displayNodes"
+      :key="index"
+      class="flow-step"
+      :class="{ 'is-last': index === displayNodes.length - 1 }"
+    >
+      <div class="flow-step-card">
+        <div class="flow-step-badge">{{ index + 1 }}</div>
+        <div class="flow-step-main">
+          <div class="flow-step-head">
+            <span class="flow-step-name">鑺傜偣 {{ index + 1 }}</span>
+            <el-tag size="small" :type="node.signMode === 'or_sign' ? 'warning' : 'primary'" effect="plain">
+              {{ nodeSignModeLabel(node.signMode) }}
+            </el-tag>
+          </div>
+          <div class="flow-approvers">
+            <div
+              v-for="a in node.approvers"
+              :key="String(a.approverId ?? a.id)"
+              class="flow-approver"
+            >
+              <span class="flow-approver-name">{{ a.approverName || "鈥�" }}</span>
+              <el-tag
+                v-if="a.status"
+                size="small"
+                :type="mapTaskStatusTagType(a.status)"
+                effect="plain"
+              >
+                {{ mapTaskStatusLabel(a.status) }}
+              </el-tag>
+            </div>
+            <span v-if="!node.approvers?.length" class="flow-empty">鏈厤缃鎵逛汉</span>
+          </div>
+        </div>
+      </div>
+      <div v-if="index < displayNodes.length - 1" class="flow-connector" aria-hidden="true">
+        <el-icon><ArrowRight /></el-icon>
+      </div>
+    </div>
+  </div>
+  <el-empty v-else description="鏆傛棤娴佺▼鑺傜偣" :image-size="48" />
+</template>
+
+<script setup>
+import { computed } from "vue";
+import { ArrowRight } from "@element-plus/icons-vue";
+import { nodeSignModeLabel } from "../../approve-template/approveTemplateConstants.js";
+import {
+  mapTaskStatusLabel,
+  mapTaskStatusTagType,
+  mapTasksToFlowNodes,
+} from "../approveListConstants.js";
+
+const props = defineProps({
+  tasks: { type: Array, default: () => [] },
+  nodes: { type: Array, default: () => [] },
+});
+
+const displayNodes = computed(() => {
+  if (props.tasks?.length) return mapTasksToFlowNodes(props.tasks);
+  return props.nodes || [];
+});
+</script>
+
+<style scoped>
+.flow-track {
+  display: flex;
+  align-items: stretch;
+  gap: 0;
+  overflow-x: auto;
+  padding: 4px 2px 8px;
+}
+.flow-step {
+  display: flex;
+  align-items: center;
+  flex: 0 0 auto;
+}
+.flow-step-card {
+  display: flex;
+  gap: 12px;
+  min-width: 200px;
+  max-width: 260px;
+  padding: 14px;
+  border: 1px solid var(--el-border-color-lighter);
+  border-radius: 8px;
+  background: var(--el-bg-color);
+  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04);
+}
+.flow-step-badge {
+  flex-shrink: 0;
+  width: 28px;
+  height: 28px;
+  border-radius: 50%;
+  background: var(--el-color-primary-light-9);
+  color: var(--el-color-primary);
+  font-size: 13px;
+  font-weight: 600;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+.flow-step-main {
+  flex: 1;
+  min-width: 0;
+}
+.flow-step-head {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  gap: 8px;
+  margin-bottom: 10px;
+}
+.flow-step-name {
+  font-weight: 600;
+  font-size: 13px;
+  color: var(--el-text-color-primary);
+}
+.flow-approvers {
+  display: flex;
+  flex-direction: column;
+  gap: 6px;
+}
+.flow-approver {
+  display: flex;
+  flex-wrap: wrap;
+  align-items: center;
+  gap: 6px;
+}
+.flow-approver-name {
+  font-size: 13px;
+  color: var(--el-text-color-regular);
+}
+.flow-empty {
+  font-size: 12px;
+  color: var(--el-text-color-placeholder);
+}
+.flow-connector {
+  display: flex;
+  align-items: center;
+  padding: 0 6px;
+  color: var(--el-text-color-placeholder);
+  font-size: 16px;
+}
+</style>
diff --git a/src/views/officeProcessAutomation/ApproveManage/approve-list/index.vue b/src/views/officeProcessAutomation/ApproveManage/approve-list/index.vue
new file mode 100644
index 0000000..bbfa56a
--- /dev/null
+++ b/src/views/officeProcessAutomation/ApproveManage/approve-list/index.vue
@@ -0,0 +1,613 @@
+<!--OA妯″潡锛氬鎵瑰垪琛�-->
+<template>
+  <div class="app-container">
+    <div class="search_form mb20">
+      <div class="search_fields">
+        <span class="search_title">妯℃澘绫诲瀷锛�</span>
+        <el-select
+          v-model="searchForm.businessType"
+          placeholder="璇烽�夋嫨妯℃澘绫诲瀷"
+          clearable
+          filterable
+          style="width: 200px"
+        >
+          <el-option
+            v-for="opt in searchBusinessTypeOptions"
+            :key="`search-biz-type-${opt.value}`"
+            :label="opt.label"
+            :value="opt.value"
+          />
+        </el-select>
+        <span class="search_title" style="margin-left: 12px">瀹℃壒鐘舵�侊細</span>
+        <el-select
+          v-model="searchForm.status"
+          placeholder="璇烽�夋嫨瀹℃壒鐘舵��"
+          clearable
+          style="width: 140px"
+        >
+          <el-option
+            v-for="opt in APPROVAL_STATUS_SEARCH_OPTIONS"
+            :key="opt.value"
+            :label="opt.label"
+            :value="opt.value"
+          />
+        </el-select>
+        <span class="search_title" style="margin-left: 12px">鍒涘缓鏃堕棿锛�</span>
+        <el-date-picker
+          v-model="searchForm.createTimeRange"
+          type="daterange"
+          range-separator="-"
+          start-placeholder="寮�濮嬫棩鏈�"
+          end-placeholder="缁撴潫鏃ユ湡"
+          format="YYYY-MM-DD"
+          value-format="YYYY-MM-DD"
+          style="width: 260px"
+          clearable
+        />
+        <el-button type="primary" :icon="Search" style="margin-left: 10px" @click="handleQuery">鎼滅储</el-button>
+        <el-button :icon="RefreshRight" @click="resetSearch">閲嶇疆</el-button>
+      </div>
+      <div class="search_actions">
+        <el-button type="primary" :icon="Plus" @click="openSubmitDialog">鎻愪氦瀹℃壒</el-button>
+      </div>
+    </div>
+
+    <div class="table_list">
+      <PIMTable
+        rowKey="id"
+        :column="tableColumn"
+        :tableData="tableData"
+        :page="page"
+        :isSelection="false"
+        :tableLoading="tableLoading"
+        :total="page.total"
+        @pagination="pagination"
+      >
+        <template #approveType="{ row }">
+          <span class="approve-type-cell" :style="approvalTypeStyle(row.approvalType)">
+            {{ approvalTypeLabel(row.approvalType) }}
+          </span>
+        </template>
+      </PIMTable>
+    </div>
+
+    <!-- 鎻愪氦瀹℃壒锛堟寜妯℃澘锛� -->
+    <el-dialog
+      v-model="submitDialog.visible"
+      :title="submitDialogTitle"
+      width="720px"
+      append-to-body
+      destroy-on-close
+      class="approve-submit-dialog"
+      @closed="resetSubmitDialogState"
+    >
+      <template v-if="submitDialog.step === 1 && !isSubmitEdit">
+        <p class="template-hint">璇峰厛閫夋嫨妯℃澘绫诲瀷锛屽啀閫夋嫨璇ョ被鍨嬩笅宸插惎鐢ㄧ殑瀹℃壒妯℃澘銆�</p>
+        <div v-loading="submitTemplatesLoading" class="template-grid">
+          <div
+            v-for="opt in submitBusinessTypeOptions"
+            :key="`biz-type-${opt.value}`"
+            class="template-card"
+            :class="{ 'is-disabled': !countTemplatesByBusinessType(opt.value) }"
+            @click="onBusinessTypePick(opt.value)"
+          >
+            <span class="template-card-type">{{ opt.label }}</span>
+            <span class="template-card-desc">
+              {{ countTemplatesByBusinessType(opt.value) }} 涓彲鐢ㄦā鏉�
+            </span>
+          </div>
+          <el-empty
+            v-if="!submitTemplatesLoading && !submitBusinessTypeOptions.length"
+            description="鏆傛棤妯℃澘绫诲瀷"
+            :image-size="80"
+            class="template-empty"
+          />
+        </div>
+      </template>
+
+      <template v-else-if="submitDialog.step === 2 && !isSubmitEdit">
+        <p class="template-hint">
+          褰撳墠绫诲瀷锛歿{ selectedBusinessTypeLabel || "鈥�" }}锛岃閫夋嫨鍏蜂綋瀹℃壒妯℃澘銆�
+          <el-button type="primary" link class="ml8" @click="backToBusinessTypePick">鏇存崲绫诲瀷</el-button>
+        </p>
+        <ApprovalTemplatePicker
+          :cards="submitTemplateCards"
+          :loading="submitTemplatesLoading"
+          @pick="onTemplatePick"
+        />
+      </template>
+
+      <template v-else>
+        <div v-loading="submitTemplatesLoading && !isSubmitEdit">
+        <el-form ref="submitFormRef" :model="submitForm" :rules="submitFormRules" label-width="120px">
+          <el-form-item v-if="isSubmitEdit" label="瀹℃壒绫诲瀷">
+            <span class="approve-type-cell" :style="approvalTypeStyle(activeTemplate.approvalType)">
+              {{ activeTemplate.label }}
+            </span>
+          </el-form-item>
+          <ApprovalTemplateFormSection
+            :active-template="activeTemplate"
+            :fields="submitFormFields"
+            :form-payload="submitForm.formPayload"
+            v-model:flow-nodes="submitForm.flowNodes"
+            v-model:attachments="submitForm.storageBlobDTOs"
+            :template-attachments="submitForm.templateAttachments"
+            :user-options="flowUserOptions"
+            :show-template-name="!isSubmitEdit"
+            :allow-change-template="!isSubmitEdit"
+            @change-template="backToTemplatePick"
+          />
+        </el-form>
+        </div>
+      </template>
+
+      <template #footer>
+        <el-button
+          v-if="submitDialog.step === 3 || isSubmitEdit"
+          type="primary"
+          :loading="submitSaving"
+          @click="onSubmitInstance"
+        >
+          {{ isSubmitEdit ? "淇� 瀛�" : "鎻� 浜�" }}
+        </el-button>
+        <el-button
+          v-if="submitDialog.step === 2 && !isSubmitEdit"
+          @click="backToBusinessTypePick"
+        >
+          涓婁竴姝�
+        </el-button>
+        <el-button @click="submitDialog.visible = false">
+          {{ submitDialog.step === 1 && !isSubmitEdit ? "鍙� 娑�" : "鍏� 闂�" }}
+        </el-button>
+      </template>
+    </el-dialog>
+
+    <!-- 璇︽儏 -->
+    <el-dialog
+      v-model="detailDialog.visible"
+      title="瀹℃壒璇︽儏"
+      width="920px"
+      append-to-body
+      destroy-on-close
+      class="approve-detail-dialog"
+    >
+      <div class="approve-detail-body">
+        <ApproveDetailPanel :row="detailRow" />
+        <div class="detail-block">
+          <div class="detail-block-title">
+            瀹℃壒娴佺▼锛坽{ detailRow.tasks?.length || detailRow.flowNodes?.length || 0 }} 椤癸級
+          </div>
+          <InstanceFlowDisplay :tasks="detailRow.tasks" :nodes="detailRow.flowNodes" />
+        </div>
+        <div class="detail-block">
+          <div class="detail-block-title">瀹℃壒璁板綍</div>
+          <el-timeline v-if="detailRow.approvalRecords?.length" class="approve-record-timeline">
+            <el-timeline-item
+              v-for="(rec, i) in detailRow.approvalRecords"
+              :key="rec.id ?? i"
+              :type="rec.result === 'approved' ? 'success' : rec.result === 'rejected' ? 'danger' : 'primary'"
+              :timestamp="formatRecordTime(rec.time)"
+              placement="top"
+            >
+              <div class="record-item">
+                <span class="record-operator">{{ rec.operatorName || "鈥�" }}</span>
+                <el-tag
+                  size="small"
+                  :type="rec.result === 'approved' ? 'success' : rec.result === 'rejected' ? 'danger' : 'info'"
+                  effect="plain"
+                >
+                  {{ approvalActionLabel(rec.result) }}
+                </el-tag>
+                <p class="record-opinion">{{ rec.opinion || "鏃犳剰瑙�" }}</p>
+              </div>
+            </el-timeline-item>
+          </el-timeline>
+          <el-empty v-else description="鏆傛棤瀹℃壒璁板綍" :image-size="48" />
+        </div>
+      </div>
+      <template #footer>
+        <el-button
+          v-if="detailRow.approvalStatus === 'pending'"
+          @click="openEditFromDetail"
+        >
+          淇� 鏀�
+        </el-button>
+        <el-button
+          v-if="detailRow.approvalStatus === 'pending' && detailRow.isApprove"
+          type="primary"
+          @click="openApproveFromDetail"
+        >
+          鍘诲鎵�
+        </el-button>
+        <el-button @click="detailDialog.visible = false">鍏� 闂�</el-button>
+      </template>
+    </el-dialog>
+
+    <!-- 宸梾/璐圭敤鎶ラ攢璇︽儏锛堝鎵瑰垪琛級 -->
+    <el-dialog
+      v-model="reimburseDialog.visible"
+      :title="reimburseDialog.mode === 'approve' ? reimburseApproveTitle : reimburseDetailTitle"
+      width="1000px"
+      append-to-body
+      destroy-on-close
+      @closed="approveOpinion = ''"
+    >
+      <FinReimburseApprovePanel
+        :mode="reimburseDialog.mode"
+        :module-key="reimburseDialog.moduleKey"
+        :reimburse-row="reimburseDialog.reimburseRow"
+        :loading="reimburseDialog.loading"
+        v-model:approve-opinion="approveOpinion"
+      />
+      <template #footer>
+        <template v-if="reimburseDialog.mode === 'approve'">
+          <el-button
+            type="success"
+            :loading="approveSubmitting"
+            @click="onReimburseApprove('approved')"
+          >
+            閫� 杩�
+          </el-button>
+          <el-button
+            type="danger"
+            :loading="approveSubmitting"
+            @click="onReimburseApprove('rejected')"
+          >
+            椹� 鍥�
+          </el-button>
+          <el-button :disabled="approveSubmitting" @click="reimburseDialog.visible = false">
+            鍙� 娑�
+          </el-button>
+        </template>
+        <template v-else>
+          <el-button
+            v-if="reimburseDialog.instanceRow?.approvalStatus === 'pending'"
+            @click="openEditFromReimburseDetail"
+          >
+            淇� 鏀�
+          </el-button>
+          <el-button
+            v-if="
+              reimburseDialog.instanceRow?.approvalStatus === 'pending' &&
+              reimburseDialog.instanceRow?.isApprove
+            "
+            type="primary"
+            @click="openReimburseApproveFromDetail"
+          >
+            鍘诲鎵�
+          </el-button>
+          <el-button type="primary" @click="reimburseDialog.visible = false">鍏� 闂�</el-button>
+        </template>
+      </template>
+    </el-dialog>
+
+    <!-- 瀹℃壒鎿嶄綔 -->
+    <el-dialog
+      v-model="approveDialog.visible"
+      title="瀹℃壒澶勭悊"
+      width="960px"
+      append-to-body
+      destroy-on-close
+      @closed="approveOpinion = ''"
+    >
+      <ApproveDetailPanel :row="approveDialog.row" />
+      <div class="detail-block mt16">
+        <div class="detail-block-title">
+          瀹℃壒娴佺▼锛坽{ approveDialog.row?.tasks?.length || approveDialog.row?.flowNodes?.length || 0 }} 椤癸級
+        </div>
+        <InstanceFlowDisplay :tasks="approveDialog.row?.tasks" :nodes="approveDialog.row?.flowNodes" />
+      </div>
+      <el-form label-width="100px" class="mt16">
+        <el-form-item label="瀹℃壒鎰忚" required>
+          <el-input
+            v-model="approveOpinion"
+            type="textarea"
+            :rows="3"
+            maxlength="500"
+            show-word-limit
+            placeholder="閫氳繃鍙暀绌猴紱椹冲洖璇峰~鍐欏叿浣撳師鍥�"
+          />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <el-button
+          type="success"
+          :loading="approveSubmitting"
+          @click="onApprove('approved')"
+        >
+          閫� 杩�
+        </el-button>
+        <el-button
+          type="danger"
+          :loading="approveSubmitting"
+          @click="onApprove('rejected')"
+        >
+          椹� 鍥�
+        </el-button>
+        <el-button :disabled="approveSubmitting" @click="approveDialog.visible = false">
+          鍙� 娑�
+        </el-button>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup>
+import { Plus, RefreshRight } from "@element-plus/icons-vue";
+import { ElMessage } from "element-plus";
+import { computed, onMounted, ref } from "vue";
+import { APPROVAL_MODULE_KEYS } from "../approve-shared/approvalModuleRegistry.js";
+import FinReimburseApprovePanel from "../../ReimburseManage/shared/components/FinReimburseApprovePanel.vue";
+import ApprovalTemplateFormSection from "../approve-shared/components/ApprovalTemplateFormSection.vue";
+import ApprovalTemplatePicker from "../approve-shared/components/ApprovalTemplatePicker.vue";
+import { useFlowUserOptions } from "../approve-shared/useFlowUserOptions.js";
+import { formatDisplayTime } from "../approve-template/approveTemplateConstants.js";
+import { approvalTypeStyle } from "./approveListConstants.js";
+import ApproveDetailPanel from "./components/ApproveDetailPanel.vue";
+import InstanceFlowDisplay from "./components/InstanceFlowDisplay.vue";
+import { useApproveList } from "./useApproveList.js";
+
+const al = useApproveList();
+const {
+  Search,
+  APPROVAL_STATUS_SEARCH_OPTIONS,
+  searchBusinessTypeOptions,
+  loadSearchBusinessTypeOptions,
+  submitBusinessTypeOptions,
+  submitTemplateCards,
+  selectedBusinessTypeLabel,
+  countTemplatesByBusinessType,
+  submitTemplatesLoading,
+  onBusinessTypePick,
+  backToBusinessTypePick,
+  approvalTypeLabel,
+  approvalActionLabel,
+  searchForm,
+  tableLoading,
+  page,
+  tableData,
+  tableColumn,
+  detailDialog,
+  detailRow,
+  reimburseDialog,
+  approveDialog,
+  approveOpinion,
+  approveSubmitting,
+  submitReimburseApprove,
+  submitDialog,
+  isSubmitEdit,
+  submitDialogTitle,
+  submitForm,
+  submitFormRef,
+  submitSaving,
+  activeTemplate,
+  submitFormFields,
+  submitFormRules,
+  handleQuery,
+  resetSearch,
+  pagination,
+  resetSubmitDialogState,
+  openSubmitDialog,
+  openEditDialog,
+  onTemplatePick,
+  backToTemplatePick,
+  submitInstanceForm,
+  submitApprove,
+  openDetail,
+  openApprove,
+} = al;
+
+const { flowUserOptions, loadFlowUsers } = useFlowUserOptions();
+
+async function onSubmitInstance() {
+  const ok = await submitInstanceForm();
+  if (ok) ElMessage.success(isSubmitEdit.value ? "淇敼鎴愬姛" : "瀹℃壒宸叉彁浜�");
+}
+
+const reimburseDetailTitle = computed(() =>
+  reimburseDialog.moduleKey === APPROVAL_MODULE_KEYS.COST_REIMBURSE
+    ? "璐圭敤鎶ラ攢璇︽儏"
+    : "宸梾鎶ラ攢璇︽儏"
+);
+const reimburseApproveTitle = computed(() =>
+  reimburseDialog.moduleKey === APPROVAL_MODULE_KEYS.COST_REIMBURSE
+    ? "璐圭敤鎶ラ攢瀹℃壒"
+    : "宸梾鎶ラ攢瀹℃壒"
+);
+
+async function onApprove(result) {
+  const ret = await submitApprove(result);
+  if (ret?.needOpinion) {
+    ElMessage.warning("椹冲洖鏃惰濉啓瀹℃壒鎰忚");
+    return;
+  }
+  if (ret?.ok) {
+    ElMessage.success(result === "approved" ? "宸查�氳繃" : "宸查┏鍥�");
+  }
+}
+
+async function onReimburseApprove(result) {
+  const ret = await submitReimburseApprove(result);
+  if (ret?.needOpinion) {
+    ElMessage.warning("椹冲洖鏃惰濉啓瀹℃壒鎰忚");
+    return;
+  }
+  if (ret?.ok) {
+    ElMessage.success(result === "approved" ? "宸查�氳繃" : "宸查┏鍥�");
+  }
+}
+
+function formatRecordTime(time) {
+  return formatDisplayTime(time) || "鈥�";
+}
+
+async function openApproveFromDetail() {
+  const row = detailRow.value;
+  detailDialog.visible = false;
+  await openApprove(row);
+}
+
+function openEditFromDetail() {
+  const row = detailRow.value;
+  detailDialog.visible = false;
+  openEditDialog(row);
+}
+
+function openEditFromReimburseDetail() {
+  const row = reimburseDialog.instanceRow;
+  reimburseDialog.visible = false;
+  if (row) openEditDialog(row);
+}
+
+async function openReimburseApproveFromDetail() {
+  const row = reimburseDialog.instanceRow;
+  if (!row) return;
+  reimburseDialog.mode = "approve";
+  approveOpinion.value = "";
+}
+
+onMounted(() => {
+  loadFlowUsers();
+  loadSearchBusinessTypeOptions();
+  handleQuery();
+});
+</script>
+
+<style scoped>
+.mb20 {
+  margin-bottom: 20px;
+}
+.ml12 {
+  margin-left: 12px;
+}
+.mt16 {
+  margin-top: 16px;
+}
+.search_form {
+  display: flex;
+  flex-wrap: wrap;
+  align-items: center;
+  justify-content: space-between;
+  gap: 12px;
+}
+.search_fields {
+  display: flex;
+  flex-wrap: wrap;
+  align-items: center;
+  gap: 4px;
+}
+.search_actions {
+  display: flex;
+  flex-wrap: wrap;
+  gap: 8px;
+}
+.approve-type-cell {
+  display: inline-block;
+  padding: 2px 10px;
+  border-radius: 4px;
+  font-size: 13px;
+  line-height: 1.5;
+}
+.template-hint {
+  font-size: 13px;
+  color: var(--el-text-color-secondary);
+  margin: 0 0 16px;
+}
+.template-grid {
+  display: grid;
+  grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
+  gap: 12px;
+  min-height: 120px;
+}
+.template-empty {
+  grid-column: 1 / -1;
+}
+.template-card {
+  padding: 14px 16px;
+  border: 1px solid var(--el-border-color-lighter);
+  border-radius: var(--radius-md, 8px);
+  cursor: pointer;
+  transition: border-color 0.2s, box-shadow 0.2s;
+  background: var(--el-fill-color-blank);
+}
+.template-card:hover {
+  border-color: var(--el-color-primary);
+  box-shadow: var(--shadow-sm, 0 2px 8px rgba(0, 0, 0, 0.06));
+}
+.template-card.is-disabled {
+  opacity: 0.5;
+  cursor: not-allowed;
+}
+.template-card.is-disabled:hover {
+  border-color: var(--el-border-color-lighter);
+  box-shadow: none;
+}
+.ml8 {
+  margin-left: 8px;
+}
+.template-card-type {
+  display: inline-block;
+  padding: 2px 8px;
+  border-radius: 4px;
+  font-size: 13px;
+  font-weight: 600;
+  margin-bottom: 8px;
+}
+.template-card-desc {
+  display: block;
+  font-size: 12px;
+  color: var(--el-text-color-secondary);
+  line-height: 1.5;
+}
+.flow-tip {
+  font-size: 12px;
+  color: var(--el-text-color-secondary);
+  margin-top: 8px;
+}
+.approve-submit-dialog :deep(.el-dialog__body) {
+  padding-top: 12px;
+}
+.approve-detail-dialog :deep(.el-dialog__body) {
+  padding-top: 16px;
+  max-height: 70vh;
+  overflow-y: auto;
+}
+.approve-detail-body .detail-block {
+  margin-top: 20px;
+}
+.approve-detail-body .detail-block-title {
+  font-size: 14px;
+  font-weight: 600;
+  color: var(--el-text-color-primary);
+  margin: 0 0 12px;
+  padding-left: 10px;
+  border-left: 3px solid var(--el-color-primary);
+  line-height: 1.4;
+}
+.approve-record-timeline {
+  padding-left: 4px;
+}
+.record-item {
+  padding: 4px 0 2px;
+}
+.record-operator {
+  font-weight: 600;
+  margin-right: 8px;
+  color: var(--el-text-color-primary);
+}
+.record-opinion {
+  margin: 8px 0 0;
+  font-size: 13px;
+  color: var(--el-text-color-regular);
+  line-height: 1.5;
+}
+.detail-block-title {
+  font-size: 14px;
+  font-weight: 600;
+  color: var(--el-text-color-primary);
+  margin: 0 0 12px;
+  padding-left: 10px;
+  border-left: 3px solid var(--el-color-primary);
+  line-height: 1.4;
+}
+</style>
diff --git a/src/views/officeProcessAutomation/ApproveManage/approve-list/useApproveList.js b/src/views/officeProcessAutomation/ApproveManage/approve-list/useApproveList.js
new file mode 100644
index 0000000..67b9213
--- /dev/null
+++ b/src/views/officeProcessAutomation/ApproveManage/approve-list/useApproveList.js
@@ -0,0 +1,628 @@
+import {
+  getApprovalTemplateDetail,
+  listApprovalTemplate,
+  TEMPLATE_TYPE_CUSTOM,
+} from "@/api/officeProcessAutomation/approvalTemplate.js";
+import {
+  approveApprovalInstance,
+  deleteApprovalInstance,
+  listApprovalInstancePage,
+  saveApprovalInstance,
+  updateApprovalInstance,
+} from "@/api/officeProcessAutomation/approvalInstance.js";
+import useUserStore from "@/store/modules/user";
+import { Search } from "@element-plus/icons-vue";
+import { ElMessage, ElMessageBox } from "element-plus";
+import { computed, getCurrentInstance, reactive, ref } from "vue";
+import {
+  inferReimburseModuleKeyFromInstance,
+  loadReimburseDetailForInstance,
+  navigateToReimburseManageForEdit,
+  resolveFinReimbursementIdFromInstance,
+} from "../../ReimburseManage/shared/reimburseApproveBridge.js";
+import {
+  fetchBusinessTypeOptions,
+  formatDisplayTime,
+  mapEnabledFromApi,
+  unwrapTemplateList,
+} from "../approve-template/approveTemplateConstants.js";
+import {
+  buildFormPayloadRules,
+  buildTemplateBindingFromDetail,
+  validateTemplateBinding,
+} from "../approve-shared/approvalTemplateBindingUtils.js";
+import {
+  APPROVAL_STATUS_SEARCH_OPTIONS,
+  APPROVAL_TYPE_OPTIONS,
+  approvalStatusLabel,
+  approvalStatusTagType,
+  approvalTypeLabel,
+  buildApprovalInstanceListParams,
+  buildApproveInstanceDto,
+  buildEditFormFromInstanceRow,
+  buildInstanceDto,
+  createEmptySubmitForm,
+  mapInstanceFromApi,
+  mapSubmitTemplateCard,
+  matchBusinessTypeValue,
+  unwrapInstancePage,
+} from "./approveListConstants.js";
+
+export function useApproveList() {
+  const { proxy } = getCurrentInstance() || {};
+  const userStore = useUserStore();
+
+  const tableData = ref([]);
+  const searchBusinessTypeOptions = ref([]);
+  const submitBusinessTypeOptions = ref([]);
+  const allSubmitTemplates = ref([]);
+  const selectedBusinessType = ref("");
+  const submitTemplatesLoading = ref(false);
+
+  const submitTemplateCards = computed(() => {
+    if (selectedBusinessType.value == null || selectedBusinessType.value === "") return [];
+    return allSubmitTemplates.value.filter((card) =>
+      matchBusinessTypeValue(card.businessType, selectedBusinessType.value)
+    );
+  });
+
+  const searchForm = reactive({
+    businessType: "",
+    status: "",
+    createTimeRange: [],
+  });
+
+  const tableLoading = ref(false);
+  const page = reactive({ current: 1, size: 10, total: 0 });
+
+  const detailDialog = reactive({ visible: false });
+  const detailRow = ref({});
+
+  const approveDialog = reactive({ visible: false, row: null });
+  const approveOpinion = ref("");
+  const approveSubmitting = ref(false);
+
+  /** 宸梾/璐圭敤鎶ラ攢涓撶敤璇︽儏銆佸鎵瑰脊绐� */
+  const reimburseDialog = reactive({
+    visible: false,
+    mode: "detail",
+    moduleKey: "",
+    loading: false,
+    reimburseRow: {},
+    instanceRow: null,
+  });
+
+  const submitDialog = reactive({ visible: false, step: 1, mode: "add" });
+  const submitEditRow = ref(null);
+  const submitForm = reactive(createEmptySubmitForm(""));
+  const submitFormRef = ref();
+  const submitSaving = ref(false);
+
+  const isSubmitEdit = computed(() => submitDialog.mode === "edit");
+  const submitDialogTitle = computed(() => {
+    if (submitDialog.mode === "edit") {
+      return `淇敼${activeTemplate.value?.label || submitForm.templateName || "瀹℃壒"}`;
+    }
+    if (submitDialog.step === 1) return "閫夋嫨妯℃澘绫诲瀷";
+    if (submitDialog.step === 2) return `閫夋嫨瀹℃壒妯℃澘${businessTypeLabel(selectedBusinessType.value) ? `锛�${businessTypeLabel(selectedBusinessType.value)}锛塦 : ""}`;
+    return `鎻愪氦${activeTemplate.value?.label || "瀹℃壒"}`;
+  });
+
+  const selectedBusinessTypeLabel = computed(() => businessTypeLabel(selectedBusinessType.value));
+
+  function businessTypeLabel(type) {
+    if (type == null || type === "") return "";
+    const hit = submitBusinessTypeOptions.value.find((x) => matchBusinessTypeValue(x.value, type));
+    return hit?.label || "";
+  }
+
+  function countTemplatesByBusinessType(type) {
+    return allSubmitTemplates.value.filter((card) => matchBusinessTypeValue(card.businessType, type)).length;
+  }
+
+  const activeTemplate = computed(() => submitForm.templateSnapshot || null);
+
+  /** 濉姤椤瑰畾涔夛紙鏂板/淇敼涓� formConfig 涓�鑷达級 */
+  const submitFormFields = computed(() => {
+    const tplFields = activeTemplate.value?.fields;
+    if (tplFields?.length) return tplFields;
+    return submitForm.formFieldDefs || [];
+  });
+
+  const submitFormRules = computed(() => ({
+    templateKey: [{ required: true, message: "璇烽�夋嫨瀹℃壒绫诲瀷", trigger: "change" }],
+    ...buildFormPayloadRules(submitFormFields.value),
+  }));
+
+  const tableColumn = ref([
+    { label: "鐢宠浜虹紪鍙�", prop: "applicantNo", width: 110 },
+    { label: "鐢宠浜哄悕绉�", prop: "applicantName", minWidth: 100 },
+    { label: "妯℃澘绫诲瀷", prop: "businessName", minWidth: 120 },
+    {
+      label: "瀹℃壒绫诲瀷",
+      prop: "approvalType",
+      minWidth: 140,
+      dataType: "slot",
+      slot: "approveType",
+    },
+    {
+      label: "寰呮垜瀹℃壒",
+      prop: "unread",
+      width: 90,
+      align: "center",
+      formatData: (v) => (v ? "鏄�" : "鍚�"),
+    },
+    {
+      label: "瀹℃壒鐘舵��",
+      prop: "approvalStatus",
+      width: 100,
+      dataType: "tag",
+      formatData: (v) => approvalStatusLabel(v),
+      formatType: (v) => approvalStatusTagType(v),
+    },
+    {
+      label: "鍒涘缓鏃堕棿",
+      prop: "createTime",
+      width: 170,
+      formatData: (v) => formatDisplayTime(v),
+    },
+    {
+      dataType: "action",
+      label: "鎿嶄綔",
+      align: "center",
+      fixed: "right",
+      width: 240,
+      operation: [
+        { name: "璇︽儏", type: "text", clickFun: (row) => openDetail(row) },
+        {
+          name: "淇敼",
+          type: "text",
+          disabled: (row) => row.approvalStatus !== "pending",
+          clickFun: (row) => openEditDialog(row),
+        },
+        {
+          name: "瀹℃壒",
+          type: "text",
+          disabled: (row) => row.approvalStatus !== "pending" || !row.isApprove,
+          clickFun: (row) => openApprove(row),
+        },
+        {
+          name: "鍒犻櫎",
+          type: "danger",
+          clickFun: (row) => removeInstance(row),
+        },
+      ],
+    },
+  ]);
+
+  async function fetchApprovalList() {
+    tableLoading.value = true;
+    try {
+      const res = await listApprovalInstancePage(
+        buildApprovalInstanceListParams({ page, searchForm })
+      );
+      const { records, total } = unwrapInstancePage(res);
+      tableData.value = records.map(mapInstanceFromApi);
+      page.total = total;
+    } catch {
+      tableData.value = [];
+      page.total = 0;
+      ElMessage.error("瀹℃壒鍒楄〃鍔犺浇澶辫触");
+    } finally {
+      tableLoading.value = false;
+    }
+  }
+
+  async function loadSubmitTemplates() {
+    submitTemplatesLoading.value = true;
+    try {
+      const [typeOptions, customRes] = await Promise.all([
+        fetchBusinessTypeOptions(),
+        listApprovalTemplate(TEMPLATE_TYPE_CUSTOM),
+      ]);
+      submitBusinessTypeOptions.value = typeOptions;
+      allSubmitTemplates.value = unwrapTemplateList(customRes)
+        .filter((row) => mapEnabledFromApi(row.enabled))
+        .map(mapSubmitTemplateCard);
+    } catch {
+      submitBusinessTypeOptions.value = [];
+      allSubmitTemplates.value = [];
+      ElMessage.error("鍔犺浇瀹℃壒妯℃澘澶辫触");
+    } finally {
+      submitTemplatesLoading.value = false;
+    }
+  }
+
+  function handleQuery() {
+    page.current = 1;
+    fetchApprovalList();
+  }
+
+  function resetSearch() {
+    searchForm.businessType = "";
+    searchForm.status = "";
+    searchForm.createTimeRange = [];
+    handleQuery();
+  }
+
+  async function loadSearchBusinessTypeOptions() {
+    try {
+      searchBusinessTypeOptions.value = await fetchBusinessTypeOptions();
+    } catch {
+      searchBusinessTypeOptions.value = [];
+    }
+  }
+
+  function pagination({ page: p, limit }) {
+    page.current = p;
+    page.size = limit;
+    fetchApprovalList();
+  }
+
+  async function openReimburseDetail(row, mode) {
+    const moduleKey = inferReimburseModuleKeyFromInstance(row);
+    if (!moduleKey) return false;
+    reimburseDialog.mode = mode;
+    reimburseDialog.moduleKey = moduleKey;
+    reimburseDialog.instanceRow = row;
+    reimburseDialog.visible = true;
+    reimburseDialog.loading = true;
+    reimburseDialog.reimburseRow = {};
+    try {
+      const { reimburseRow, moduleKey: resolvedMk } =
+        await loadReimburseDetailForInstance(row, moduleKey);
+      reimburseDialog.moduleKey = resolvedMk || moduleKey;
+      reimburseDialog.reimburseRow = reimburseRow;
+      return true;
+    } catch {
+      ElMessage.error("鍔犺浇鎶ラ攢璇︽儏澶辫触");
+      reimburseDialog.visible = false;
+      return false;
+    } finally {
+      reimburseDialog.loading = false;
+    }
+  }
+
+  async function openDetail(row) {
+    if (isReimburseApprovalInstance(row)) {
+      await openReimburseDetail(row, "detail");
+      return;
+    }
+    detailRow.value = { ...row };
+    detailDialog.visible = true;
+  }
+
+  async function openApprove(row) {
+    if (inferReimburseModuleKeyFromInstance(row)) {
+      approveOpinion.value = "";
+      await openReimburseDetail(row, "approve");
+      return;
+    }
+    approveDialog.row = { ...row };
+    approveOpinion.value = "";
+    approveDialog.visible = true;
+  }
+
+  function isReimburseApprovalInstance(row) {
+    return Boolean(inferReimburseModuleKeyFromInstance(row));
+  }
+
+  function resetSubmitDialogState() {
+    submitDialog.mode = "add";
+    submitDialog.step = 1;
+    selectedBusinessType.value = "";
+    submitEditRow.value = null;
+    Object.assign(submitForm, createEmptySubmitForm(""));
+  }
+
+  function openSubmitDialog() {
+    resetSubmitDialogState();
+    submitDialog.visible = true;
+    loadSubmitTemplates();
+  }
+
+  async function openEditDialog(row) {
+    if (row?.approvalStatus !== "pending") {
+      ElMessage.warning("浠呭鏍镐腑鐨勫鎵瑰彲淇敼");
+      return;
+    }
+    const moduleKey = inferReimburseModuleKeyFromInstance(row);
+    if (moduleKey) {
+      const rid = resolveFinReimbursementIdFromInstance(row);
+      if (rid == null) {
+        ElMessage.warning("鏃犳硶淇敼锛氱己灏戞姤閿�鍗� ID");
+        return;
+      }
+      try {
+        await navigateToReimburseManageForEdit(proxy?.$router, moduleKey, rid);
+      } catch {
+        ElMessage.warning("鏈壘鍒板樊鏃�/璐圭敤鎶ラ攢鑿滃崟璺敱锛岃浠庡乏渚ц彍鍗曡繘鍏ュ悗鍐嶇紪杈�");
+      }
+      return;
+    }
+    if (!row?.id) {
+      ElMessage.warning("鏃犳硶淇敼锛氱己灏戝鎵瑰疄渚� ID");
+      return;
+    }
+    submitDialog.mode = "edit";
+    submitDialog.step = 3;
+    submitEditRow.value = { ...row };
+    Object.assign(submitForm, buildEditFormFromInstanceRow(row));
+    submitDialog.visible = true;
+  }
+
+  async function onTemplatePick(card) {
+    if (!card?.id) return;
+    submitTemplatesLoading.value = true;
+    try {
+      const res = await getApprovalTemplateDetail(card.id);
+      const applied = buildTemplateBindingFromDetail(res);
+      Object.assign(submitForm, {
+        templateKey: String(card.id),
+        ...applied,
+        businessType:
+          applied.businessType ?? card.businessType ?? selectedBusinessType.value,
+      });
+      submitDialog.step = 3;
+    } catch {
+      ElMessage.error("鍔犺浇妯℃澘璇︽儏澶辫触");
+    } finally {
+      submitTemplatesLoading.value = false;
+    }
+  }
+
+  function onBusinessTypePick(type) {
+    if (!countTemplatesByBusinessType(type)) {
+      ElMessage.warning("璇ョ被鍨嬩笅鏆傛棤鍙敤瀹℃壒妯℃澘");
+      return;
+    }
+    selectedBusinessType.value = type;
+    submitDialog.step = 2;
+  }
+
+  function backToBusinessTypePick() {
+    selectedBusinessType.value = "";
+    submitDialog.step = 1;
+  }
+
+  function backToTemplatePick() {
+    submitDialog.step = 2;
+  }
+
+  async function submitInstanceForm() {
+    if (submitDialog.mode === "edit") return submitEditApproval();
+    return submitNewApproval();
+  }
+
+  async function submitNewApproval() {
+    if (!submitFormRef.value) return false;
+    try {
+      await submitFormRef.value.validate();
+    } catch {
+      return false;
+    }
+    if (!activeTemplate.value) return false;
+    const bindingCheck = validateTemplateBinding({ flowNodes: submitForm.flowNodes });
+    if (!bindingCheck.ok) {
+      ElMessage.warning(bindingCheck.message);
+      return false;
+    }
+    if (!submitForm.templateId) {
+      ElMessage.warning("缂哄皯妯℃澘 ID锛屾棤娉曟彁浜�");
+      return false;
+    }
+    if (submitSaving.value) return false;
+    submitSaving.value = true;
+    try {
+      await saveApprovalInstance(
+        buildInstanceDto({
+          submitForm,
+          activeTemplate: activeTemplate.value,
+          userStore,
+          flowNodes: bindingCheck.nodes,
+        })
+      );
+      submitDialog.visible = false;
+      page.current = 1;
+      await fetchApprovalList();
+      return true;
+    } catch {
+      return false;
+    } finally {
+      submitSaving.value = false;
+    }
+  }
+
+  async function submitEditApproval() {
+    if (!submitFormRef.value) return false;
+    try {
+      await submitFormRef.value.validate();
+    } catch {
+      return false;
+    }
+    if (!activeTemplate.value) return false;
+    const bindingCheck = validateTemplateBinding({ flowNodes: submitForm.flowNodes });
+    if (!bindingCheck.ok) {
+      ElMessage.warning(bindingCheck.message);
+      return false;
+    }
+    if (!submitForm.instanceId) {
+      ElMessage.warning("缂哄皯瀹℃壒瀹炰緥 ID锛屾棤娉曚繚瀛�");
+      return false;
+    }
+    if (submitSaving.value) return false;
+    submitSaving.value = true;
+    try {
+      await updateApprovalInstance(
+        buildInstanceDto({
+          submitForm,
+          activeTemplate: activeTemplate.value,
+          flowNodes: bindingCheck.nodes,
+          existingRow: submitEditRow.value,
+        })
+      );
+      submitDialog.visible = false;
+      await fetchApprovalList();
+      if (detailDialog.visible && detailRow.value?.id === submitForm.instanceId) {
+        const hit = tableData.value.find((r) => r.id === submitForm.instanceId);
+        if (hit) detailRow.value = { ...hit };
+        else detailDialog.visible = false;
+      }
+      return true;
+    } catch {
+      return false;
+    } finally {
+      submitSaving.value = false;
+    }
+  }
+
+  async function removeInstance(row) {
+    if (row?.id == null || row.id === "") {
+      ElMessage.warning("鏃犳硶鍒犻櫎锛氱己灏戝鎵瑰疄渚� ID");
+      return;
+    }
+    const title = row.title || row.templateName || row.instanceNo || "璇ュ鎵�";
+    try {
+      await ElMessageBox.confirm(
+        `纭畾瑕佸垹闄ゅ鎵广��${title}銆嶅悧锛熷垹闄ゅ悗涓嶅彲鎭㈠銆俙,
+        "鍒犻櫎纭",
+        {
+          type: "warning",
+          confirmButtonText: "纭畾鍒犻櫎",
+          cancelButtonText: "鍙栨秷",
+          distinguishCancelAndClose: true,
+          autofocus: false,
+        }
+      );
+    } catch {
+      return;
+    }
+    try {
+      await deleteApprovalInstance([row.id]);
+      ElMessage.success("鍒犻櫎鎴愬姛");
+      if (detailDialog.visible && detailRow.value?.id === row.id) {
+        detailDialog.visible = false;
+      }
+      if (approveDialog.visible && approveDialog.row?.id === row.id) {
+        approveDialog.visible = false;
+      }
+      await fetchApprovalList();
+    } catch {
+      /* 閿欒鐢辨嫤鎴櫒鎻愮ず */
+    }
+  }
+
+  async function submitReimburseApprove(result) {
+    const row = reimburseDialog.instanceRow;
+    if (!row?.id) return { ok: false };
+    if (result === "rejected" && !(approveOpinion.value || "").trim()) {
+      return { needOpinion: true };
+    }
+    if (approveSubmitting.value) return { ok: false };
+    approveSubmitting.value = true;
+    try {
+      await approveApprovalInstance(
+        buildApproveInstanceDto(row, result, approveOpinion.value)
+      );
+      reimburseDialog.visible = false;
+      await fetchApprovalList();
+      return { ok: true, result };
+    } catch {
+      ElMessage.error("瀹℃壒鎿嶄綔澶辫触");
+      return { ok: false };
+    } finally {
+      approveSubmitting.value = false;
+    }
+  }
+
+  async function submitApprove(result) {
+    const row = approveDialog.row;
+    if (!row?.id) return { ok: false };
+    if (result === "rejected" && !(approveOpinion.value || "").trim()) {
+      return { needOpinion: true };
+    }
+    if (approveSubmitting.value) return { ok: false };
+    approveSubmitting.value = true;
+    try {
+      await approveApprovalInstance(
+        buildApproveInstanceDto(row, result, approveOpinion.value)
+      );
+      approveDialog.visible = false;
+      await fetchApprovalList();
+      if (detailDialog.visible && detailRow.value?.id === row.id) {
+        const hit = tableData.value.find((r) => r.id === row.id);
+        if (hit) detailRow.value = { ...hit };
+        else detailDialog.visible = false;
+      }
+      return { ok: true, result };
+    } catch {
+      ElMessage.error("瀹℃壒鎿嶄綔澶辫触");
+      return { ok: false };
+    } finally {
+      approveSubmitting.value = false;
+    }
+  }
+
+  function approvalActionLabel(result) {
+    if (result === "approved") return "閫氳繃";
+    if (result === "rejected") return "椹冲洖";
+    return "寰呭鐞�";
+  }
+
+  return {
+    Search,
+    APPROVAL_TYPE_OPTIONS,
+    APPROVAL_STATUS_SEARCH_OPTIONS,
+    searchBusinessTypeOptions,
+    loadSearchBusinessTypeOptions,
+    approvalTypeLabel,
+    approvalStatusLabel,
+    approvalStatusTagType,
+    approvalActionLabel,
+    searchForm,
+    tableLoading,
+    page,
+    tableData,
+    tableColumn,
+    detailDialog,
+    detailRow,
+    reimburseDialog,
+    approveDialog,
+    approveOpinion,
+    approveSubmitting,
+    submitReimburseApprove,
+    isReimburseApprovalInstance,
+    submitDialog,
+    isSubmitEdit,
+    submitDialogTitle,
+    submitForm,
+    submitFormRef,
+    submitSaving,
+    activeTemplate,
+    submitFormFields,
+    submitFormRules,
+    submitBusinessTypeOptions,
+    submitTemplateCards,
+    selectedBusinessType,
+    selectedBusinessTypeLabel,
+    businessTypeLabel,
+    countTemplatesByBusinessType,
+    submitTemplatesLoading,
+    handleQuery,
+    resetSearch,
+    pagination,
+    resetSubmitDialogState,
+    openSubmitDialog,
+    openEditDialog,
+    onBusinessTypePick,
+    onTemplatePick,
+    backToBusinessTypePick,
+    backToTemplatePick,
+    submitInstanceForm,
+    submitNewApproval,
+    submitApprove,
+    openDetail,
+    openApprove,
+    fetchApprovalList,
+  };
+}
diff --git a/src/views/officeProcessAutomation/ApproveManage/approve-shared/approvalInstanceFormConfigTable.js b/src/views/officeProcessAutomation/ApproveManage/approve-shared/approvalInstanceFormConfigTable.js
new file mode 100644
index 0000000..d6bec18
--- /dev/null
+++ b/src/views/officeProcessAutomation/ApproveManage/approve-shared/approvalInstanceFormConfigTable.js
@@ -0,0 +1,116 @@
+import { computed } from "vue";
+import { businessApprovalStatusLabel, businessApprovalStatusTagType, formatFieldDisplayValue, resolveInstanceFormFields } from "../approve-list/approveListConstants.js";
+import { INSTANCE_NO_SEARCH_MODULE_KEYS, INSTANCE_NO_TABLE_COLUMN } from "./approvalInstanceListSearch.js";
+
+/** 鍒楄〃/璇︽儏涓嶅洖鏄句负鐙珛鍒楃殑濉姤椤� key锛堥伩鍏嶈鐩栧疄渚嬬郴缁熷瓧娈碉級 */
+const DEFAULT_EXCLUDE_KEYS = new Set(["summary", "status", "approvalStatus", "approvalstatus", "instanceStatus", "publishStatus", "newsStatus"]);
+
+/** enrich 鍚庡繀椤讳繚鐣欑殑瀹炰緥瀛楁锛堜笉琚� formConfig 閾哄钩瑕嗙洊锛� */
+const PRESERVE_INSTANCE_FIELDS = [
+  "id",
+  "approvalStatus",
+  "statusRaw",
+  "status",
+  "instanceNo",
+  "templateId",
+  "templateName",
+  "businessType",
+  "businessId",
+  "businessName",
+  "applicantId",
+  "applicantNo",
+  "applicantName",
+  "createTime",
+  "applyTime",
+  "finishTime",
+  "title",
+  "isApprove",
+  "unread",
+  "currentLevel",
+  "newsStatus",
+  "storageBlobVOList",
+  "storageBlobDTOs",
+];
+
+/**
+ * 浠庤鏁版嵁 formConfig 瑙f瀽瀛楁瀹氫箟涓庡~鎶ュ�硷紝骞堕摵骞冲埌琛屼笂渚涗富琛� prop 缁戝畾锛堝睍绀虹敤鏍煎紡鍖栧�硷級
+ */
+export function enrichInstanceRowFromFormConfig(row, caches) {
+  const { fields, formPayload, templateSnapshot } = resolveInstanceFormFields(row);
+  const formDisplay = {};
+  const displayRow = {
+    ...row,
+    formFieldDefs: fields,
+    formPayload,
+    templateSnapshot: row.templateSnapshot || templateSnapshot,
+    formDisplay,
+  };
+
+  for (const f of fields) {
+    if (!f?.key || DEFAULT_EXCLUDE_KEYS.has(f.key)) continue;
+    const val = formPayload[f.key];
+    let text = formatFieldDisplayValue(f, val, caches);
+    if (text === String(val) && row?.applicantName && (f.label === "鐢宠浜�" || f.key === "applicant" || f.key === "applicantName")) {
+      const idMatch = String(val) === String(row.applicantId) || String(val) === String(row.applicantNo);
+      if (idMatch) text = row.applicantName;
+    }
+    formDisplay[f.key] = text;
+    displayRow[f.key] = text;
+  }
+
+  for (const key of PRESERVE_INSTANCE_FIELDS) {
+    if (row[key] !== undefined) displayRow[key] = row[key];
+  }
+
+  return displayRow;
+}
+
+/**
+ * 浠庡垪琛ㄩ琛� formConfig 鐢熸垚涓昏〃鍔ㄦ�佸垪锛坙abel 鍙栬嚜妯℃澘瀛楁 label锛�
+ */
+export function getFormConfigFieldColumns(firstRow, { excludeKeys = DEFAULT_EXCLUDE_KEYS } = {}) {
+  const fields = (firstRow?.formFieldDefs || []).filter(f => f?.key && !excludeKeys.has(f.key));
+  return fields.map(f => ({
+    label: f.label || f.key,
+    prop: f.key,
+    minWidth: f.type === "textarea" ? 200 : f.type === "datetimerange" ? 160 : 120,
+    showOverflowTooltip: true,
+  }));
+}
+
+/**
+ * 涓氬姟鐢宠涓昏〃鍒楋細鍥哄畾鍒� + formConfig 鍔ㄦ�佸垪 + 瀹℃壒鐘舵�� + 鎿嶄綔
+ */
+export function buildInstanceTableColumns(tableDataRef, buildTableActions, options = {}) {
+  const { moduleKey, excludeKeys = DEFAULT_EXCLUDE_KEYS, beforeFormColumns = [], extraColumns = [], afterFormColumns = [], actionWidth = 260 } = options;
+
+  const leadingCols = moduleKey && INSTANCE_NO_SEARCH_MODULE_KEYS.has(moduleKey) ? [INSTANCE_NO_TABLE_COLUMN] : [];
+
+  return computed(() => {
+    const formCols = getFormConfigFieldColumns(tableDataRef.value?.[0], { excludeKeys });
+    return [
+      ...leadingCols,
+      ...beforeFormColumns,
+      ...formCols,
+      ...extraColumns,
+      ...afterFormColumns,
+      { label: "鍒涘缓鏃堕棿", prop: "createTime", width: 170 },
+      {
+        label: "瀹℃壒鐘舵��",
+        prop: "approvalStatus",
+        width: 110,
+        dataType: "tag",
+        formatData: v => businessApprovalStatusLabel(v),
+        formatType: v => businessApprovalStatusTagType(v),
+      },
+      {
+        dataType: "action",
+        label: "鎿嶄綔",
+        align: "center",
+        fixed: "right",
+        width: actionWidth,
+        operation: buildTableActions(),
+      },
+    ];
+  });
+}
diff --git a/src/views/officeProcessAutomation/ApproveManage/approve-shared/approvalInstanceListSearch.js b/src/views/officeProcessAutomation/ApproveManage/approve-shared/approvalInstanceListSearch.js
new file mode 100644
index 0000000..80dda5c
--- /dev/null
+++ b/src/views/officeProcessAutomation/ApproveManage/approve-shared/approvalInstanceListSearch.js
@@ -0,0 +1,158 @@
+import dayjs from "dayjs";
+import { APPROVAL_MODULE_KEYS } from "./approvalModuleRegistry.js";
+
+/** 鏀寔瀹℃壒鍗曞彿鏌ヨ/涓昏〃灞曠ず鐨勫鎵圭敵璇锋ā鍧� */
+export const INSTANCE_NO_SEARCH_MODULE_KEYS = new Set([
+  APPROVAL_MODULE_KEYS.REGULAR,
+  APPROVAL_MODULE_KEYS.TRANSFER,
+  APPROVAL_MODULE_KEYS.WORK_HANDOVER,
+  APPROVAL_MODULE_KEYS.LEAVE,
+  APPROVAL_MODULE_KEYS.OVERTIME,
+]);
+
+export const INSTANCE_NO_TABLE_COLUMN = {
+  label: "瀹℃壒鍗曞彿",
+  prop: "instanceNo",
+  width: 170,
+  showOverflowTooltip: true,
+};
+
+/** 鎵佸钩鍖栦负 Spring GET 鍙粦瀹氱殑 query锛坅pprovalInstanceDto.xxx锛屽嬁鐢ㄦ柟鎷彿锛� */
+export function appendDotNotationQuery(target, prefix, fields) {
+  if (!fields || typeof fields !== "object") return;
+  for (const [key, value] of Object.entries(fields)) {
+    if (value == null || value === "") continue;
+    target[`${prefix}.${key}`] = value;
+  }
+}
+
+function pickApplicantFromSearchForm(searchForm = {}) {
+  const out = {};
+  const sf = searchForm || {};
+  const name = (sf.applicantName || "").trim();
+  const kw = (sf.applicantKeyword || "").trim();
+  const id = sf.applicantId;
+
+  if (name) out.applicantName = name;
+  if (kw) {
+    out.applicantName = kw;
+    if (/^\d+$/.test(kw)) out.applicantId = Number(kw);
+  }
+  if (id != null && id !== "") {
+    out.applicantId = typeof id === "number" ? id : Number(id) || id;
+  }
+  return out;
+}
+
+function pickInstanceNoFromSearchForm(searchForm = {}) {
+  const no = (searchForm?.instanceNo || "").trim();
+  return no ? { instanceNo: no } : {};
+}
+
+/** 缁勮 approvalInstanceDto 鏌ヨ鐗囨锛堢敵璇蜂汉 + 瀹℃壒鍗曞彿 + 鐘舵�� + 鏃堕棿鑼冨洿锛� */
+export function buildApprovalInstanceSearchDto(searchForm = {}, extraParams = {}) {
+  const dto = {
+    ...(extraParams && typeof extraParams === "object" ? extraParams : {}),
+  };
+  Object.assign(dto, pickApplicantFromSearchForm(searchForm));
+  Object.assign(dto, pickInstanceNoFromSearchForm(searchForm));
+
+  // 瀹℃壒鐘舵��
+  if (searchForm?.status) {
+    dto.status = searchForm.status;
+  }
+
+  // 鍒涘缓鏃堕棿鑼冨洿
+  const range = searchForm?.createTimeRange;
+  if (Array.isArray(range) && range[0]) {
+    dto.createTimeStart = range[0] + (range[0].includes(":") ? "" : " 00:00:00");
+  }
+  if (Array.isArray(range) && range[1]) {
+    dto.createTimeEnd = range[1] + (range[1].includes(":") ? "" : " 23:59:59");
+  }
+
+  delete dto.createTime;
+  return dto;
+}
+
+function getRowPayloadValue(row, keys) {
+  const keyList = Array.isArray(keys) ? keys : [keys];
+  const payload = row?.formPayload || {};
+  for (const k of keyList) {
+    if (row?.[k] != null && row[k] !== "") return row[k];
+    if (payload[k] != null && payload[k] !== "") return payload[k];
+  }
+  return "";
+}
+
+function matchApplicantKeyword(row, keyword) {
+  const kw = (keyword || "").trim().toLowerCase();
+  if (!kw) return true;
+  const parts = [row?.applicantName, row?.applicantNo, row?.applicantId, getRowPayloadValue(row, ["applicant", "applicantName", "applicantId"])]
+    .filter(v => v != null && v !== "")
+    .map(v => String(v).toLowerCase());
+  return parts.some(p => p.includes(kw));
+}
+
+function matchApplicantId(row, applicantId) {
+  if (applicantId == null || applicantId === "") return true;
+  const id = String(applicantId);
+  if (row?.applicantId != null && String(row.applicantId) === id) return true;
+  const payloadApplicant = getRowPayloadValue(row, ["applicant", "applicantId", "applicantUserId"]);
+  return String(payloadApplicant) === id;
+}
+
+function matchSelectValue(row, keys, expected) {
+  if (!expected) return true;
+  const raw = getRowPayloadValue(row, keys);
+  return String(raw) === String(expected);
+}
+
+function matchInstanceNo(row, instanceNo) {
+  const kw = (instanceNo || "").trim().toLowerCase();
+  if (!kw) return true;
+  const parts = [row?.instanceNo, row?.bizId].filter(v => v != null && v !== "").map(v => String(v).toLowerCase());
+  return parts.some(p => p.includes(kw));
+}
+
+/** 鏄惁瀛樺湪鍒楄〃绛涢�夋潯浠讹紙鐢宠浜� / 瀹℃壒鍗曞彿 / 鐘舵�� / 鏃堕棿鑼冨洿锛� */
+export function hasActiveModuleSearch(moduleKey, searchForm = {}) {
+  const sf = searchForm || {};
+  if ((sf.instanceNo || "").trim()) return true;
+  if ((sf.applicantKeyword || "").trim()) return true;
+  if ((sf.applicantName || "").trim()) return true;
+  if (sf.applicantId != null && sf.applicantId !== "") return true;
+  if (sf.status) return true;
+  if (Array.isArray(sf.createTimeRange) && sf.createTimeRange.length === 2) return true;
+  return false;
+}
+
+/** 鎸夌敵璇蜂汉銆佸鎵瑰崟鍙枫�佺姸鎬併�佹椂闂磋寖鍥村仛鍓嶇鍏滃簳绛涢�� */
+export function filterInstanceRowsByModuleSearch(moduleKey, rows, searchForm = {}) {
+  const sf = searchForm || {};
+  const list = Array.isArray(rows) ? rows : [];
+  if (!hasActiveModuleSearch(moduleKey, sf)) return list;
+
+  return list.filter(row => {
+    // 瀹℃壒鍗曞彿
+    if (!matchInstanceNo(row, sf.instanceNo)) return false;
+    // 鐢宠浜�
+    if (!matchApplicantId(row, sf.applicantId)) return false;
+    if (!matchApplicantKeyword(row, sf.applicantKeyword || sf.applicantName)) return false;
+    // 鐘舵��
+    if (sf.status && String(row.statusRaw || row.status).toUpperCase() !== String(sf.status).toUpperCase()) {
+      return false;
+    }
+    // 鏃堕棿鑼冨洿
+    if (Array.isArray(sf.createTimeRange) && sf.createTimeRange.length === 2) {
+      const rowTime = row.createTime || row.applyTime;
+      if (rowTime) {
+        const t = dayjs(rowTime);
+        const start = dayjs(sf.createTimeRange[0] + " 00:00:00");
+        const end = dayjs(sf.createTimeRange[1] + " 23:59:59");
+        if (t.isBefore(start) || t.isAfter(end)) return false;
+      }
+    }
+    return true;
+  });
+}
diff --git a/src/views/officeProcessAutomation/ApproveManage/approve-shared/approvalModuleRegistry.js b/src/views/officeProcessAutomation/ApproveManage/approve-shared/approvalModuleRegistry.js
new file mode 100644
index 0000000..fd56eca
--- /dev/null
+++ b/src/views/officeProcessAutomation/ApproveManage/approve-shared/approvalModuleRegistry.js
@@ -0,0 +1,152 @@
+/**
+ * 鍚勪笟鍔℃ā鍧椾笌瀹℃壒妯℃澘绫诲瀷鐨勬槧灏勶紙閰嶇疆鍖栧叆鍙o級
+ * businessType 涓庡悗绔� TypeEnums / listPage 绾﹀畾涓�鑷达紙鍐欐鏋氫妇鍊硷級
+ */
+export const APPROVAL_MODULE_KEYS = {
+  REGULAR: "regular",
+  TRANSFER: "transfer",
+  RESIGN: "resign",
+  WORK_HANDOVER: "work_handover",
+  LEAVE: "leave",
+  OVERTIME: "overtime",
+  TRAVEL_REIMBURSE: "travel_reimburse",
+  COST_REIMBURSE: "cost_reimburse",
+  ENTERPRISE_NEWS: "enterprise_news",
+};
+
+/** 瀹℃壒瀹炰緥 listPage / 淇濆瓨 浣跨敤鐨� businessType 鏋氫妇 */
+export const APPROVAL_BUSINESS_TYPE = {
+  [APPROVAL_MODULE_KEYS.REGULAR]: 10,
+  [APPROVAL_MODULE_KEYS.TRANSFER]: 11,
+  [APPROVAL_MODULE_KEYS.WORK_HANDOVER]: 13,
+  [APPROVAL_MODULE_KEYS.LEAVE]: 14,
+  [APPROVAL_MODULE_KEYS.OVERTIME]: 15,
+  [APPROVAL_MODULE_KEYS.TRAVEL_REIMBURSE]: 16,
+  [APPROVAL_MODULE_KEYS.COST_REIMBURSE]: 17,
+  [APPROVAL_MODULE_KEYS.ENTERPRISE_NEWS]: 18,
+};
+
+/** @type {Record<string, import('./approvalModuleRegistry.js').ApprovalModuleConfig>} */
+export const APPROVAL_MODULE_REGISTRY = {
+  [APPROVAL_MODULE_KEYS.REGULAR]: {
+    label: "杞鐢宠",
+    approvalType: "regular",
+    businessType: APPROVAL_BUSINESS_TYPE[APPROVAL_MODULE_KEYS.REGULAR],
+    typeLabels: ["杞", "杞鐢宠"],
+  },
+  [APPROVAL_MODULE_KEYS.TRANSFER]: {
+    label: "璋冨矖鐢宠",
+    approvalType: "transfer",
+    businessType: APPROVAL_BUSINESS_TYPE[APPROVAL_MODULE_KEYS.TRANSFER],
+    typeLabels: ["璋冨矖", "璋冨姩", "璋冨矖鐢宠", "璋冨姩鐢宠"],
+  },
+  [APPROVAL_MODULE_KEYS.RESIGN]: {
+    label: "绂昏亴鐢宠",
+    approvalType: "resign",
+    typeLabels: ["绂昏亴", "绂昏亴鐢宠", "绂昏亴瀹℃壒"],
+  },
+  [APPROVAL_MODULE_KEYS.WORK_HANDOVER]: {
+    label: "宸ヤ綔浜ゆ帴",
+    approvalType: "work_handover",
+    businessType: APPROVAL_BUSINESS_TYPE[APPROVAL_MODULE_KEYS.WORK_HANDOVER],
+    typeLabels: ["宸ヤ綔浜ゆ帴", "浜ゆ帴", "宸ヤ綔浜ゆ帴瀹℃壒"],
+  },
+  [APPROVAL_MODULE_KEYS.LEAVE]: {
+    label: "璇峰亣鐢宠",
+    approvalType: "leave",
+    businessType: APPROVAL_BUSINESS_TYPE[APPROVAL_MODULE_KEYS.LEAVE],
+    typeLabels: ["璇峰亣", "璇峰亣鐢宠", "璇峰亣瀹℃壒"],
+  },
+  [APPROVAL_MODULE_KEYS.OVERTIME]: {
+    label: "鍔犵彮鐢宠",
+    approvalType: "overtime",
+    businessType: APPROVAL_BUSINESS_TYPE[APPROVAL_MODULE_KEYS.OVERTIME],
+    typeLabels: ["鍔犵彮", "鍔犵彮鐢宠", "鍔犵彮瀹℃壒"],
+  },
+  [APPROVAL_MODULE_KEYS.TRAVEL_REIMBURSE]: {
+    label: "宸梾鎶ラ攢",
+    approvalType: "travel_reimburse",
+    businessType: APPROVAL_BUSINESS_TYPE[APPROVAL_MODULE_KEYS.TRAVEL_REIMBURSE],
+    typeLabels: ["宸梾", "宸梾鎶ラ攢", "鍑哄樊鎶ラ攢"],
+  },
+  [APPROVAL_MODULE_KEYS.COST_REIMBURSE]: {
+    label: "璐圭敤鎶ラ攢",
+    approvalType: "cost_reimburse",
+    businessType: APPROVAL_BUSINESS_TYPE[APPROVAL_MODULE_KEYS.COST_REIMBURSE],
+    typeLabels: ["璐圭敤", "璐圭敤鎶ラ攢"],
+  },
+  [APPROVAL_MODULE_KEYS.ENTERPRISE_NEWS]: {
+    label: "浼佷笟鏂伴椈",
+    approvalType: "enterprise_news",
+    businessType: APPROVAL_BUSINESS_TYPE[APPROVAL_MODULE_KEYS.ENTERPRISE_NEWS],
+    typeLabels: ["浼佷笟鏂伴椈", "鏂伴椈", "鏂伴椈鍙戝竷"],
+  },
+};
+
+/**
+ * @typedef {object} ApprovalModuleConfig
+ * @property {string} label
+ * @property {string} [approvalType]
+ * @property {string|number} [businessType]
+ * @property {string[]} [typeLabels]
+ */
+
+export function getApprovalModuleConfig(moduleKey) {
+  if (!moduleKey) return null;
+  return APPROVAL_MODULE_REGISTRY[moduleKey] || null;
+}
+
+/** 鍒楄〃鏌ヨ businessType锛堜紭鍏堥厤缃灇涓撅紝涓嶅啀鍥為�� approvalType 瀛楃涓诧級 */
+export function getModuleListBusinessType(moduleKey) {
+  const cfg = getApprovalModuleConfig(moduleKey);
+  if (!cfg) return "";
+  if (cfg.businessType != null && cfg.businessType !== "") return cfg.businessType;
+  return APPROVAL_BUSINESS_TYPE[moduleKey] ?? "";
+}
+
+/** 浠� TypeEnums 瑙f瀽鏈ā鍧� businessType锛涘凡閰嶇疆鏋氫妇鏃剁洿鎺ヨ繑鍥� */
+export function resolveModuleBusinessType(moduleKey, typeOptions = []) {
+  const cfg = getApprovalModuleConfig(moduleKey);
+  if (!cfg) return null;
+
+  const fixed = getModuleListBusinessType(moduleKey);
+  if (fixed != null && fixed !== "") return fixed;
+
+  const labels = [cfg.label, ...(cfg.typeLabels || [])].filter(Boolean);
+  const hitByLabel = (typeOptions || []).find((opt) => {
+    const optLabel = String(opt?.label || opt?.name || "").trim();
+    if (!optLabel) return false;
+    return labels.some(
+      (l) => optLabel === l || optLabel.includes(l) || l.includes(optLabel)
+    );
+  });
+  if (hitByLabel?.value != null && hitByLabel.value !== "") return hitByLabel.value;
+
+  return cfg.approvalType || null;
+}
+
+/** 鍒楄〃/妯℃澘杩囨护鐢ㄧ殑 businessType 闆嗗悎 */
+export function getModuleMatchingBusinessTypes(moduleKey, typeOptions = []) {
+  const cfg = getApprovalModuleConfig(moduleKey);
+  if (!cfg) return [];
+
+  const fixed = getModuleListBusinessType(moduleKey);
+  if (fixed != null && fixed !== "") return [fixed];
+
+  const values = new Set();
+  const primary = resolveModuleBusinessType(moduleKey, typeOptions);
+  if (primary != null && primary !== "") values.add(primary);
+
+  const labels = [cfg.label, ...(cfg.typeLabels || [])].filter(Boolean);
+  for (const opt of typeOptions || []) {
+    const optLabel = String(opt?.label || opt?.name || "").trim();
+    if (!optLabel) continue;
+    const matched = labels.some(
+      (l) => optLabel === l || optLabel.includes(l) || l.includes(optLabel)
+    );
+    if (matched && opt.value != null && opt.value !== "") {
+      values.add(opt.value);
+    }
+  }
+  return [...values];
+}
diff --git a/src/views/officeProcessAutomation/ApproveManage/approve-shared/approvalTemplateBindingUtils.js b/src/views/officeProcessAutomation/ApproveManage/approve-shared/approvalTemplateBindingUtils.js
new file mode 100644
index 0000000..d68016f
--- /dev/null
+++ b/src/views/officeProcessAutomation/ApproveManage/approve-shared/approvalTemplateBindingUtils.js
@@ -0,0 +1,91 @@
+import {
+  mapAttachmentsFromApi,
+  mapTemplateFromApi,
+  unwrapTemplateDetail,
+} from "../approve-template/approveTemplateConstants.js";
+import { buildSubmitTemplateFromRow } from "../approve-template/formConfigUtils.js";
+import {
+  createEmptySubmitForm,
+  validateSubmitFlowNodes,
+} from "../approve-list/approveListConstants.js";
+
+export function attachmentDisplayName(file) {
+  return (
+    file?.fileName ||
+    file?.originalFilename ||
+    file?.name ||
+    file?.blobName ||
+    "闄勪欢"
+  );
+}
+
+/** 鎺ュ彛璇︽儏 鈫� 鎻愪氦缁戝畾蹇収锛堝惈娴佺▼銆侀檮浠躲�佸~鎶ラ」锛� */
+export function buildTemplateBindingFromDetail(detailRow) {
+  const mapped = mapTemplateFromApi(unwrapTemplateDetail(detailRow));
+  const templateAttachments = mapAttachmentsFromApi(mapped);
+  const tpl = {
+    ...buildSubmitTemplateFromRow(mapped),
+    templateId: mapped.id,
+    businessType: mapped.businessType,
+    storageBlobDTOs: templateAttachments,
+  };
+  const base = createEmptySubmitForm(String(mapped.id ?? ""), tpl, mapped.flowNodes);
+  return {
+    templateId: mapped.id,
+    templateName: mapped.templateName || tpl.label || "",
+    businessType: mapped.businessType ?? "",
+    templateSnapshot: tpl,
+    formFieldDefs: tpl.fields || [],
+    formPayload: base.formPayload,
+    flowNodes: base.flowNodes,
+    templateAttachments: JSON.parse(JSON.stringify(templateAttachments)),
+    storageBlobDTOs: [],
+  };
+}
+
+/** 鏍规嵁妯℃澘 fields 鐢熸垚 el-form rules锛坧rop 涓� formPayload.xxx锛� */
+export function buildFormPayloadRules(fields = []) {
+  const rules = {};
+  (fields || []).forEach((f) => {
+    if (!f.required || !f.key) return;
+    const prop = `formPayload.${f.key}`;
+    if (f.type === "number") {
+      rules[prop] = [{ required: true, message: `璇峰~鍐�${f.label}`, trigger: "blur" }];
+    } else if (f.type === "datetimerange" || f.type === "date" || f.type === "select") {
+      rules[prop] = [{ required: true, message: `璇烽�夋嫨${f.label}`, trigger: "change" }];
+    } else {
+      rules[prop] = [{ required: true, message: `璇峰~鍐�${f.label}`, trigger: "blur" }];
+    }
+  });
+  return rules;
+}
+
+/** 鏍¢獙妯℃澘缁戝畾锛氬鎵规祦绋嬶紙闄勪欢閫夊~锛岀敱鐢ㄦ埛鑷涓婁紶锛� */
+export function validateTemplateBinding({ flowNodes }) {
+  const flowCheck = validateSubmitFlowNodes(flowNodes);
+  if (!flowCheck.ok) return flowCheck;
+  return { ok: true, nodes: flowCheck.nodes };
+}
+
+/** 鍚堝苟缁戝畾缁撴灉鍒颁笟鍔¤〃鍗曞璞★紙瀛楁鍚嶅彲鎸変笟鍔¤鐩栵級 */
+export function applyBindingToForm(target, binding, fieldMap = {}) {
+  if (!target || !binding) return target;
+  const map = {
+    templateId: "templateId",
+    templateName: "templateName",
+    businessType: "businessType",
+    templateSnapshot: "templateSnapshot",
+    formFieldDefs: "formFieldDefs",
+    formPayload: "formPayload",
+    flowNodes: "flowNodes",
+    templateAttachments: "templateAttachments",
+    storageBlobDTOs: "storageBlobDTOs",
+    ...fieldMap,
+  };
+  Object.entries(map).forEach(([srcKey, destKey]) => {
+    if (binding[srcKey] !== undefined) {
+      target[destKey] = binding[srcKey];
+    }
+  });
+  return target;
+}
diff --git a/src/views/officeProcessAutomation/ApproveManage/approve-shared/components/ApprovalInstanceDetailDialog.vue b/src/views/officeProcessAutomation/ApproveManage/approve-shared/components/ApprovalInstanceDetailDialog.vue
new file mode 100644
index 0000000..2488216
--- /dev/null
+++ b/src/views/officeProcessAutomation/ApproveManage/approve-shared/components/ApprovalInstanceDetailDialog.vue
@@ -0,0 +1,123 @@
+<!-- 涓庡鎵瑰垪琛ㄨ鎯呭脊绐椾竴鑷� -->
+<template>
+  <el-dialog
+    v-model="visible"
+    :title="title"
+    width="920px"
+    append-to-body
+    destroy-on-close
+    class="approve-detail-dialog"
+    @closed="emit('closed')"
+  >
+    <div class="approve-detail-body">
+      <ApproveDetailPanel :row="row" />
+      <div class="detail-block">
+        <div class="detail-block-title">
+          瀹℃壒娴佺▼锛坽{ row?.tasks?.length || row?.flowNodes?.length || 0 }} 椤癸級
+        </div>
+        <InstanceFlowDisplay :tasks="row?.tasks" :nodes="row?.flowNodes" />
+      </div>
+      <div class="detail-block">
+        <div class="detail-block-title">瀹℃壒璁板綍</div>
+        <el-timeline v-if="row?.approvalRecords?.length" class="approve-record-timeline">
+          <el-timeline-item
+            v-for="(rec, i) in row.approvalRecords"
+            :key="rec.id ?? i"
+            :type="rec.result === 'approved' ? 'success' : rec.result === 'rejected' ? 'danger' : 'primary'"
+            :timestamp="formatRecordTime(rec.time)"
+            placement="top"
+          >
+            <div class="record-item">
+              <span class="record-operator">{{ rec.operatorName || "鈥�" }}</span>
+              <el-tag
+                size="small"
+                :type="rec.result === 'approved' ? 'success' : rec.result === 'rejected' ? 'danger' : 'info'"
+                effect="plain"
+              >
+                {{ approvalActionLabel(rec.result) }}
+              </el-tag>
+              <p class="record-opinion">{{ rec.opinion || "鏃犳剰瑙�" }}</p>
+            </div>
+          </el-timeline-item>
+        </el-timeline>
+        <el-empty v-else description="鏆傛棤瀹℃壒璁板綍" :image-size="48" />
+      </div>
+    </div>
+    <template #footer>
+      <el-button v-if="canEditRow(row)" @click="emit('edit', row)">淇� 鏀�</el-button>
+      <el-button @click="visible = false">鍏� 闂�</el-button>
+    </template>
+  </el-dialog>
+</template>
+
+<script setup>
+import { computed } from "vue";
+import { canEditBusinessInstanceRow } from "../../approve-list/approveListConstants.js";
+import { formatDisplayTime } from "../../approve-template/approveTemplateConstants.js";
+import ApproveDetailPanel from "../../approve-list/components/ApproveDetailPanel.vue";
+import InstanceFlowDisplay from "../../approve-list/components/InstanceFlowDisplay.vue";
+
+function canEditRow(row) {
+  return canEditBusinessInstanceRow(row);
+}
+
+const props = defineProps({
+  modelValue: { type: Boolean, default: false },
+  row: { type: Object, default: () => ({}) },
+  title: { type: String, default: "瀹℃壒璇︽儏" },
+});
+
+const emit = defineEmits(["update:modelValue", "edit", "closed"]);
+
+const visible = computed({
+  get: () => props.modelValue,
+  set: (v) => emit("update:modelValue", v),
+});
+
+function approvalActionLabel(result) {
+  if (result === "approved") return "閫氳繃";
+  if (result === "rejected") return "椹冲洖";
+  return "寰呭鐞�";
+}
+
+function formatRecordTime(time) {
+  return formatDisplayTime(time) || "鈥�";
+}
+</script>
+
+<style scoped>
+.approve-detail-dialog :deep(.el-dialog__body) {
+  padding-top: 16px;
+  max-height: 70vh;
+  overflow-y: auto;
+}
+.approve-detail-body .detail-block {
+  margin-top: 20px;
+}
+.detail-block-title {
+  font-size: 14px;
+  font-weight: 600;
+  color: var(--el-text-color-primary);
+  margin: 0 0 12px;
+  padding-left: 10px;
+  border-left: 3px solid var(--el-color-primary);
+  line-height: 1.4;
+}
+.approve-record-timeline {
+  padding-left: 4px;
+}
+.record-item {
+  padding: 4px 0 2px;
+}
+.record-operator {
+  font-weight: 600;
+  margin-right: 8px;
+  color: var(--el-text-color-primary);
+}
+.record-opinion {
+  margin: 8px 0 0;
+  font-size: 13px;
+  color: var(--el-text-color-regular);
+  line-height: 1.5;
+}
+</style>
diff --git a/src/views/officeProcessAutomation/ApproveManage/approve-shared/components/ApprovalInstanceSubmitDialog.vue b/src/views/officeProcessAutomation/ApproveManage/approve-shared/components/ApprovalInstanceSubmitDialog.vue
new file mode 100644
index 0000000..53de9e1
--- /dev/null
+++ b/src/views/officeProcessAutomation/ApproveManage/approve-shared/components/ApprovalInstanceSubmitDialog.vue
@@ -0,0 +1,112 @@
+<!-- 涓庡鎵瑰垪琛ㄦ彁浜�/淇敼寮圭獥锛堢涓夋锛変竴鑷� -->
+<template>
+  <el-dialog
+    v-model="visible"
+    :title="title"
+    width="720px"
+    append-to-body
+    destroy-on-close
+    class="approve-submit-dialog"
+    @closed="emit('closed')"
+  >
+    <el-form ref="innerFormRef" :model="form" :rules="rules" label-width="120px">
+      <el-form-item v-if="isEdit" label="瀹℃壒绫诲瀷">
+        <span class="approve-type-cell" :style="approvalTypeStyle(activeTemplate?.approvalType)">
+          {{ activeTemplate?.label || form.templateName || "鈥�" }}
+        </span>
+      </el-form-item>
+      <slot name="before" :form="form" :fields="fields" />
+      <ApprovalTemplateFormSection
+        :active-template="activeTemplate"
+        :fields="fields"
+        :form-payload="form.formPayload"
+        v-model:flow-nodes="form.flowNodes"
+        v-model:attachments="form.storageBlobDTOs"
+        :template-attachments="form.templateAttachments"
+        :user-options="userOptions"
+        :show-template-name="!isEdit"
+        :allow-change-template="false"
+        :flow-attachments-only="flowAttachmentsOnly"
+        :flow-only="flowOnly"
+      />
+      <slot name="after" :form="form" :fields="fields" />
+    </el-form>
+    <template #footer>
+      <el-button type="primary" :loading="saving" @click="handleSubmitClick">
+        {{ isEdit ? "淇� 瀛�" : "鎻� 浜�" }}
+      </el-button>
+      <el-button @click="visible = false">鍙� 娑�</el-button>
+    </template>
+  </el-dialog>
+</template>
+
+<script setup>
+import { computed, ref, watch } from "vue";
+import { ElMessage } from "element-plus";
+import { approvalTypeStyle } from "../../approve-list/approveListConstants.js";
+import ApprovalTemplateFormSection from "./ApprovalTemplateFormSection.vue";
+
+const innerFormRef = ref(null);
+
+const props = defineProps({
+  modelValue: { type: Boolean, default: false },
+  title: { type: String, default: "" },
+  form: { type: Object, required: true },
+  rules: { type: Object, default: () => ({}) },
+  fields: { type: Array, default: () => [] },
+  activeTemplate: { type: Object, default: null },
+  userOptions: { type: Array, default: () => [] },
+  isEdit: { type: Boolean, default: false },
+  saving: { type: Boolean, default: false },
+  formRef: { type: Object, default: null },
+  /** 濉姤椤圭敱 before 鎻掓Ы鍗曠嫭娓叉煋鏃惰涓� true */
+  flowAttachmentsOnly: { type: Boolean, default: false },
+  flowOnly: { type: Boolean, default: false },
+});
+
+const emit = defineEmits(["update:modelValue", "submit", "closed"]);
+
+const visible = computed({
+  get: () => props.modelValue,
+  set: (v) => emit("update:modelValue", v),
+});
+
+watch(
+  innerFormRef,
+  (el) => {
+    if (props.formRef) props.formRef.value = el;
+  },
+  { flush: "post" }
+);
+
+watch(visible, (v) => {
+  if (!v && props.formRef) props.formRef.value = null;
+});
+
+async function handleSubmitClick() {
+  if (!innerFormRef.value) {
+    ElMessage.warning("琛ㄥ崟鏈氨缁紝璇风◢鍚庡啀璇�");
+    return;
+  }
+  try {
+    await innerFormRef.value.validate();
+  } catch {
+    ElMessage.warning("璇峰畬鍠勮〃鍗曞繀濉」鍚庡啀淇濆瓨");
+    return;
+  }
+  emit("submit");
+}
+</script>
+
+<style scoped>
+.approve-type-cell {
+  display: inline-block;
+  padding: 2px 10px;
+  border-radius: 4px;
+  font-size: 13px;
+  line-height: 1.5;
+}
+.approve-submit-dialog :deep(.el-dialog__body) {
+  padding-top: 12px;
+}
+</style>
diff --git a/src/views/officeProcessAutomation/ApproveManage/approve-shared/components/ApprovalTemplateBindDialog.vue b/src/views/officeProcessAutomation/ApproveManage/approve-shared/components/ApprovalTemplateBindDialog.vue
new file mode 100644
index 0000000..409dd41
--- /dev/null
+++ b/src/views/officeProcessAutomation/ApproveManage/approve-shared/components/ApprovalTemplateBindDialog.vue
@@ -0,0 +1,176 @@
+<!--
+  涓氬姟妯″潡銆屾柊澧炪�嶆椂瀵煎叆瀹℃壒妯℃澘锛堝浐瀹� moduleKey锛屼粎灞曠ず璇ョ被鍨嬩笅妯℃澘锛�
+
+  鐢ㄦ硶锛�
+  <ApprovalTemplateBindDialog
+    v-model:visible="visible"
+    module-key="regular"
+    @confirm="onTemplateBound"
+  />
+-->
+<template>
+  <el-dialog
+    v-model="dialogVisible"
+    :title="dialogTitle"
+    :width="step === formStep ? 720 : 640"
+    append-to-body
+    class="approval-template-bind-dialog"
+    @closed="onClosed"
+  >
+    <template v-if="step === 1">
+      <div v-loading="templatesLoading || confirming">
+        <ApprovalTemplatePicker
+          :cards="templateCards"
+          :loading="false"
+          :hint="pickerHint"
+          @pick="onPickTemplate"
+        />
+      </div>
+    </template>
+
+    <template v-else>
+      <div v-loading="templatesLoading">
+        <el-form
+          ref="formRef"
+          :model="bindingForm"
+          :rules="mergedRules"
+          label-width="120px"
+        >
+          <ApprovalTemplateFormSection
+            :active-template="activeTemplate"
+            :fields="formFields"
+            :form-payload="bindingForm.formPayload"
+            v-model:flow-nodes="bindingForm.flowNodes"
+            v-model:attachments="bindingForm.storageBlobDTOs"
+            :template-attachments="bindingForm.templateAttachments"
+            :user-options="flowUserOptions"
+            allow-change-template
+            @change-template="step = 1"
+          />
+        </el-form>
+      </div>
+    </template>
+
+    <template #footer>
+      <el-button v-if="step === formStep" type="primary" :loading="confirming" @click="onConfirm">
+        纭� 瀹�
+      </el-button>
+      <el-button v-if="step === formStep" @click="step = 1">閲嶉�夋ā鏉�</el-button>
+      <el-button @click="dialogVisible = false">{{ step === 1 ? "鍙� 娑�" : "鍏� 闂�" }}</el-button>
+    </template>
+  </el-dialog>
+</template>
+
+<script setup>
+import { computed, ref, watch } from "vue";
+import { ElMessage } from "element-plus";
+import ApprovalTemplatePicker from "./ApprovalTemplatePicker.vue";
+import ApprovalTemplateFormSection from "./ApprovalTemplateFormSection.vue";
+import { useApprovalTemplateBinding } from "../useApprovalTemplateBinding.js";
+import { useFlowUserOptions } from "../useFlowUserOptions.js";
+import { getApprovalModuleConfig } from "../approvalModuleRegistry.js";
+
+const props = defineProps({
+  visible: { type: Boolean, default: false },
+  /** approvalModuleRegistry 涓殑 moduleKey */
+  moduleKey: { type: String, required: true },
+  /** 涓� true 鏃堕�夋ā鏉垮悗鐩存帴纭锛岃烦杩囥�岀‘璁ゅ鎵逛俊鎭�嶅~鎶ユ楠� */
+  skipFormConfirm: { type: Boolean, default: false },
+});
+
+const emit = defineEmits(["update:visible", "confirm", "closed"]);
+
+const dialogVisible = computed({
+  get: () => props.visible,
+  set: (v) => emit("update:visible", v),
+});
+
+const {
+  step,
+  bindingForm,
+  templateCards,
+  activeTemplate,
+  formFields,
+  formRules,
+  templatesLoading,
+  loadTemplates,
+  resetBinding,
+  pickTemplate,
+  validateBinding,
+  getBindingPayload,
+  moduleConfig,
+} = useApprovalTemplateBinding({ moduleKey: props.moduleKey, mode: "module" });
+
+const formStep = 2;
+const formRef = ref();
+const confirming = ref(false);
+const { flowUserOptions, loadFlowUsers } = useFlowUserOptions();
+
+const mergedRules = computed(() => ({ ...formRules.value }));
+
+const dialogTitle = computed(() => {
+  const label = moduleConfig.value?.label || "瀹℃壒";
+  return step.value === 1 ? `閫夋嫨${label}妯℃澘` : `纭${label}瀹℃壒淇℃伅`;
+});
+
+const pickerHint = computed(
+  () => `璇烽�夋嫨銆�${moduleConfig.value?.label || "鈥�"}銆嶇被鍨嬩笅宸插惎鐢ㄧ殑瀹℃壒妯℃澘锛屽鎵规祦绋嬪皢鑷姩甯﹀叆銆俙
+);
+
+watch(
+  () => props.visible,
+  async (v) => {
+    if (!v) return;
+    resetBinding();
+    step.value = 1;
+    await Promise.all([loadTemplates(), loadFlowUsers()]);
+    const cfg = getApprovalModuleConfig(props.moduleKey);
+    if (!cfg) {
+      ElMessage.warning(`鏈厤缃ā鍧椼��${props.moduleKey}銆嶏紝璇锋鏌� approvalModuleRegistry`);
+      return;
+    }
+    if (!templateCards.value.length) {
+      ElMessage.warning(
+        `銆�${cfg.label}銆嶄笅鏆傛棤宸插惎鐢ㄧ殑瀹℃壒妯℃澘锛岃鍏堝湪瀹℃壒妯℃澘绠$悊涓垱寤哄苟鍚敤瀵瑰簲绫诲瀷鐨勬ā鏉縛
+      );
+    }
+  }
+);
+
+async function onPickTemplate(card) {
+  const ok = await pickTemplate(card);
+  if (!ok) return;
+  if (props.skipFormConfirm) {
+    step.value = 1;
+    await onConfirm();
+    return;
+  }
+  step.value = formStep;
+}
+
+async function onConfirm() {
+  confirming.value = true;
+  try {
+    const check = await validateBinding(props.skipFormConfirm ? null : formRef.value);
+    if (!check.ok) {
+      if (check.message) ElMessage.warning(check.message);
+      return;
+    }
+    emit("confirm", { ...getBindingPayload(), flowNodes: check.nodes });
+    dialogVisible.value = false;
+  } finally {
+    confirming.value = false;
+  }
+}
+
+function onClosed() {
+  resetBinding();
+  emit("closed");
+}
+</script>
+
+<style scoped>
+.approval-template-bind-dialog :deep(.el-dialog__body) {
+  padding-top: 12px;
+}
+</style>
diff --git a/src/views/officeProcessAutomation/ApproveManage/approve-shared/components/ApprovalTemplateFormSection.vue b/src/views/officeProcessAutomation/ApproveManage/approve-shared/components/ApprovalTemplateFormSection.vue
new file mode 100644
index 0000000..d6e7073
--- /dev/null
+++ b/src/views/officeProcessAutomation/ApproveManage/approve-shared/components/ApprovalTemplateFormSection.vue
@@ -0,0 +1,122 @@
+<!-- 妯℃澘缁戝畾琛ㄥ崟鍖猴細濉姤椤� + 瀹℃壒娴佺▼ + 闄勪欢锛堥』鎸傚湪澶栧眰 el-form 涓嬶級 -->
+<template>
+  <template v-if="activeTemplate">
+    <el-form-item
+      v-if="showTemplateName && !hideTemplateName && !flowAttachmentsOnly && !flowOnly"
+      label="瀹℃壒妯℃澘"
+    >
+      <span class="template-name">{{ activeTemplate.label }}</span>
+      <el-button v-if="allowChangeTemplate" type="primary" link class="ml12" @click="emit('change-template')">
+        鏇存崲妯℃澘
+      </el-button>
+    </el-form-item>
+
+    <FormPayloadFields
+      v-if="!hideFormFields && !flowAttachmentsOnly && !flowOnly"
+      :fields="fields"
+      :form-payload="formPayload"
+    />
+
+    <el-form-item label="瀹℃壒娴佺▼" required>
+      <TemplateFlowEditor
+        v-model="flowNodesModel"
+        :user-options="userOptions"
+        :readonly="!flowEditable"
+      />
+      <p class="section-tip">
+        {{
+          flowEditable
+            ? "娴佺▼涓庡鎵逛汉鐢辨ā鏉块缃紝鍙寜闇�寰皟鑺傜偣瀹℃壒浜恒��"
+            : "娴佺▼涓庡鎵逛汉鐢辨墍閫夋ā鏉垮浐瀹氾紝涓嶅彲淇敼銆�"
+        }}
+      </p>
+    </el-form-item>
+
+    <el-form-item v-if="!flowOnly && templateAttachments.length" label="妯℃澘鍙傝��">
+      <el-tag
+        v-for="(f, i) in templateAttachments"
+        :key="`tpl-${i}`"
+        class="attachment-tag"
+        type="info"
+        effect="plain"
+      >
+        {{ attachmentDisplayName(f) }}
+      </el-tag>
+      <p class="section-tip">浠ヤ笂涓烘ā鏉块檮甯︽枃浠讹紝浠呬緵鍙傝�冿紱鎻愪氦闄勪欢璇峰湪涓嬫柟涓婁紶銆�</p>
+    </el-form-item>
+
+    <el-form-item v-if="!flowOnly" label="闄勪欢">
+      <FileUpload
+        v-model:file-list="attachmentsModel"
+        :limit="uploadLimit"
+        button-text="鐐瑰嚮閫夋嫨鏂囦欢"
+      />
+      <p class="section-tip">閫夊~锛屽彲涓婁紶涓庣敵璇风浉鍏崇殑璇存槑鏉愭枡銆�</p>
+    </el-form-item>
+  </template>
+  <el-empty v-else description="璇峰厛閫夋嫨瀹℃壒妯℃澘" :image-size="64" />
+</template>
+
+<script setup>
+import { computed } from "vue";
+import FileUpload from "@/components/AttachmentUpload/file/index.vue";
+import TemplateFlowEditor from "../../approve-template/components/TemplateFlowEditor.vue";
+import FormPayloadFields from "../../approve-list/components/FormPayloadFields.vue";
+import { attachmentDisplayName } from "../approvalTemplateBindingUtils.js";
+
+const props = defineProps({
+  activeTemplate: { type: Object, default: null },
+  fields: { type: Array, default: () => [] },
+  formPayload: { type: Object, required: true },
+  flowNodes: { type: Array, default: () => [] },
+  /** 鐢ㄦ埛鑷涓婁紶鐨勯檮浠� */
+  attachments: { type: Array, default: () => [] },
+  /** 妯℃澘棰勭疆闄勪欢锛堝彧璇诲睍绀猴級 */
+  templateAttachments: { type: Array, default: () => [] },
+  userOptions: { type: Array, default: () => [] },
+  showTemplateName: { type: Boolean, default: true },
+  allowChangeTemplate: { type: Boolean, default: true },
+  /** 涓� true 鏃朵笉灞曠ず妯℃澘鑷畾涔夊~鎶ラ」锛堜粎淇濈暀瀹℃壒娴佺▼涓庨檮浠讹級 */
+  hideFormFields: { type: Boolean, default: false },
+  /** 涓� true 鏃朵笉灞曠ず瀹℃壒妯℃澘鍚嶇О琛岋紙鐢辩埗绾х疆椤跺睍绀猴級 */
+  hideTemplateName: { type: Boolean, default: false },
+  /** 涓� true 鏃朵粎灞曠ず瀹℃壒娴佺▼涓庨檮浠讹紙濉姤椤圭敱鐖剁骇鍗曠嫭娓叉煋锛� */
+  flowAttachmentsOnly: { type: Boolean, default: false },
+  /** 涓� true 鏃朵粎灞曠ず瀹℃壒娴佺▼锛堜笉灞曠ず妯℃澘濉姤椤广�侀檮浠剁瓑锛� */
+  flowOnly: { type: Boolean, default: false },
+  uploadLimit: { type: Number, default: 10 },
+  /** 涓� true 鏃跺彲缂栬緫妯℃澘棰勭疆鐨勫鎵逛汉锛堜粎瀹℃壒妯℃澘绠$悊椤典娇鐢級 */
+  flowEditable: { type: Boolean, default: false },
+});
+
+const emit = defineEmits(["update:flowNodes", "update:attachments", "change-template"]);
+
+const flowNodesModel = computed({
+  get: () => props.flowNodes,
+  set: (v) => emit("update:flowNodes", v),
+});
+
+const attachmentsModel = computed({
+  get: () => props.attachments,
+  set: (v) => emit("update:attachments", v),
+});
+</script>
+
+<style scoped>
+.template-name {
+  font-weight: 600;
+  color: var(--el-text-color-primary);
+}
+.ml12 {
+  margin-left: 12px;
+}
+.section-tip {
+  font-size: 12px;
+  color: var(--el-text-color-secondary);
+  margin: 8px 0 0;
+  line-height: 1.5;
+}
+.attachment-tag {
+  margin: 0 8px 8px 0;
+}
+</style>
diff --git a/src/views/officeProcessAutomation/ApproveManage/approve-shared/components/ApprovalTemplatePicker.vue b/src/views/officeProcessAutomation/ApproveManage/approve-shared/components/ApprovalTemplatePicker.vue
new file mode 100644
index 0000000..8adfebc
--- /dev/null
+++ b/src/views/officeProcessAutomation/ApproveManage/approve-shared/components/ApprovalTemplatePicker.vue
@@ -0,0 +1,85 @@
+<!-- 瀹℃壒妯℃澘鍗$墖閫夋嫨锛堟寜 businessType 杩囨护锛� -->
+<template>
+  <div class="approval-template-picker">
+    <p v-if="hint" class="picker-hint">{{ hint }}</p>
+    <div v-loading="loading" class="template-grid">
+      <div
+        v-for="card in cards"
+        :key="card.key || card.id"
+        class="template-card"
+        @click="emit('pick', card)"
+      >
+        <span class="template-card-type" :style="typeStyle(card.approvalType)">
+          {{ card.label }}
+        </span>
+        <span class="template-card-desc">{{ card.summaryPlaceholder }}</span>
+      </div>
+      <el-empty
+        v-if="!loading && !cards.length"
+        :description="emptyText"
+        :image-size="80"
+        class="template-empty"
+      />
+    </div>
+  </div>
+</template>
+
+<script setup>
+import { approvalTypeStyle } from "../../approve-list/approveListConstants.js";
+
+defineProps({
+  cards: { type: Array, default: () => [] },
+  loading: { type: Boolean, default: false },
+  hint: { type: String, default: "" },
+  emptyText: { type: String, default: "璇ョ被鍨嬩笅鏆傛棤鍙敤瀹℃壒妯℃澘" },
+});
+
+const emit = defineEmits(["pick"]);
+
+function typeStyle(approvalType) {
+  return approvalTypeStyle(approvalType);
+}
+</script>
+
+<style scoped>
+.picker-hint {
+  font-size: 13px;
+  color: var(--el-text-color-secondary);
+  margin: 0 0 16px;
+}
+.template-grid {
+  display: grid;
+  grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
+  gap: 12px;
+  min-height: 120px;
+}
+.template-empty {
+  grid-column: 1 / -1;
+}
+.template-card {
+  padding: 14px 16px;
+  border: 1px solid var(--el-border-color-lighter);
+  border-radius: var(--radius-md, 8px);
+  cursor: pointer;
+  transition: border-color 0.2s, box-shadow 0.2s;
+  background: var(--el-fill-color-blank);
+}
+.template-card:hover {
+  border-color: var(--el-color-primary);
+  box-shadow: var(--shadow-sm, 0 2px 8px rgba(0, 0, 0, 0.06));
+}
+.template-card-type {
+  display: inline-block;
+  padding: 2px 8px;
+  border-radius: 4px;
+  font-size: 13px;
+  font-weight: 600;
+  margin-bottom: 8px;
+}
+.template-card-desc {
+  display: block;
+  font-size: 12px;
+  color: var(--el-text-color-secondary);
+  line-height: 1.5;
+}
+</style>
diff --git a/src/views/officeProcessAutomation/ApproveManage/approve-shared/useApprovalInstanceModule.js b/src/views/officeProcessAutomation/ApproveManage/approve-shared/useApprovalInstanceModule.js
new file mode 100644
index 0000000..b474bb2
--- /dev/null
+++ b/src/views/officeProcessAutomation/ApproveManage/approve-shared/useApprovalInstanceModule.js
@@ -0,0 +1,408 @@
+import {
+  deleteApprovalInstance,
+  listApprovalInstancePage,
+  saveApprovalInstance,
+  updateApprovalInstance,
+} from "@/api/officeProcessAutomation/approvalInstance.js";
+import useUserStore from "@/store/modules/user";
+import { ElMessage, ElMessageBox } from "element-plus";
+import { computed, reactive, ref } from "vue";
+import {
+  applyBindingToForm,
+  buildFormPayloadRules,
+  validateTemplateBinding,
+} from "./approvalTemplateBindingUtils.js";
+import {
+  buildApprovalInstanceListParams,
+  buildEditFormFromInstanceRow,
+  buildInstanceDto,
+  canEditBusinessInstanceRow,
+  createEmptySubmitForm,
+  mapInstanceFromApi,
+  resolveInstanceFormFields,
+  unwrapInstancePage,
+} from "../approve-list/approveListConstants.js";
+import { fetchBusinessTypeOptions } from "../approve-template/approveTemplateConstants.js";
+import {
+  collectOptionSourcesFromFields,
+  fetchSelectOptionCaches,
+} from "../approve-template/selectOptionSource.js";
+import { enrichInstanceRowFromFormConfig } from "./approvalInstanceFormConfigTable.js";
+import {
+  filterInstanceRowsByModuleSearch,
+  hasActiveModuleSearch,
+} from "./approvalInstanceListSearch.js";
+import {
+  getApprovalModuleConfig,
+  getModuleListBusinessType,
+  resolveModuleBusinessType,
+} from "./approvalModuleRegistry.js";
+
+/**
+ * 涓氬姟鐢宠椤靛叡鐢細瀹℃壒瀹炰緥鍒楄〃鏌ヨ銆佹柊澧�/淇敼淇濆瓨銆佽鎯�/缂栬緫寮圭獥锛堜笌瀹℃壒鍒楄〃涓�鑷达級
+ *
+ * @param {object} options
+ * @param {string} options.moduleKey approvalModuleRegistry 涓殑 key
+ * @param {(row: object) => object} [options.enrichListRow] 鍒楄〃琛屽寮猴紙浠� formPayload 瑙f瀽灞曠ず瀛楁锛�
+ * @param {(base: object) => object} [options.buildExtraListParams] 杩藉姞鏌ヨ鍙傛暟
+ * @param {() => void} [options.beforeSave] 淇濆瓨鍓嶉挬瀛愶紙濡傚悓姝ヤ笟鍔″瓧娈靛埌 formPayload锛�
+ * @param {import('vue').ComputedRef|object} [options.extraFormRules] 棰濆琛ㄥ崟鏍¢獙
+ */
+export function useApprovalInstanceModule(options = {}) {
+  const {
+    moduleKey,
+    enrichListRow,
+    buildExtraListParams,
+    beforeSave,
+    extraFormRules,
+  } = options;
+
+  const userStore = useUserStore();
+  const moduleConfig = computed(() => getApprovalModuleConfig(moduleKey));
+  const businessTypeOptions = ref([]);
+
+  /** 鍒楄〃鏌ヨ businessType锛氫紭鍏� registry 鍐欐鏋氫妇锛屽啀鍥為�� TypeEnums */
+  const defaultListBusinessType = computed(() => {
+    const fixed = getModuleListBusinessType(moduleKey);
+    if (fixed != null && fixed !== "") return fixed;
+    const resolved = resolveModuleBusinessType(moduleKey, businessTypeOptions.value);
+    if (resolved != null && resolved !== "") return resolved;
+    return "";
+  });
+
+  async function loadBusinessTypeOptions() {
+    if (businessTypeOptions.value.length) return;
+    try {
+      businessTypeOptions.value = await fetchBusinessTypeOptions();
+    } catch {
+      businessTypeOptions.value = [];
+    }
+  }
+
+  const tableData = ref([]);
+  const tableLoading = ref(false);
+  const page = reactive({ current: 1, size: 10, total: 0 });
+
+  const detailDialog = reactive({ visible: false });
+  const detailRow = ref({});
+
+  const submitDialog = reactive({ visible: false, mode: "add" });
+  const submitEditRow = ref(null);
+  const submitForm = reactive(createEmptySubmitForm(""));
+  const submitFormRef = ref();
+  const submitSaving = ref(false);
+
+  const templateBindVisible = ref(false);
+  const pendingTemplateBinding = ref(null);
+  /** 鏈�杩戜竴娆″垪琛ㄦ煡璇㈡潯浠讹紙淇濆瓨鍚庡埛鏂板垪琛ㄦ椂娌跨敤锛� */
+  let lastListSearchForm = null;
+
+  const isSubmitEdit = computed(() => submitDialog.mode === "edit");
+  const activeTemplate = computed(() => submitForm.templateSnapshot || null);
+  const submitFormFields = computed(() => {
+    const tplFields = activeTemplate.value?.fields;
+    if (tplFields?.length) return tplFields;
+    return submitForm.formFieldDefs || [];
+  });
+
+  const submitFormRules = computed(() => ({
+    ...buildFormPayloadRules(submitFormFields.value),
+    ...(extraFormRules?.value ?? extraFormRules ?? {}),
+  }));
+
+  const submitDialogTitle = computed(() => {
+    const label = moduleConfig.value?.label || "鐢宠";
+    if (submitDialog.mode === "edit") {
+      return `淇敼${activeTemplate.value?.label || submitForm.templateName || label}`;
+    }
+    return `鏂板${label}`;
+  });
+
+  function mapListRow(row, caches) {
+    const mapped = mapInstanceFromApi(row);
+    const fromFormConfig = enrichInstanceRowFromFormConfig(mapped, caches);
+    return enrichListRow ? enrichListRow(fromFormConfig) : fromFormConfig;
+  }
+
+  async function fetchList(searchForm = {}) {
+    await loadBusinessTypeOptions();
+    tableLoading.value = true;
+    try {
+      let extraParams = {};
+      if (buildExtraListParams) {
+        extraParams = buildExtraListParams(searchForm) || {};
+      }
+      const res = await listApprovalInstancePage(
+        buildApprovalInstanceListParams({
+          page,
+          searchForm,
+          businessType: defaultListBusinessType.value,
+          extraParams,
+        })
+      );
+      const { records, total } = unwrapInstancePage(res);
+      const mapped = records.map(mapInstanceFromApi);
+      const allFields = [];
+      for (const row of mapped) {
+        const { fields } = resolveInstanceFormFields(row);
+        allFields.push(...fields);
+      }
+      const caches = await fetchSelectOptionCaches(
+        collectOptionSourcesFromFields(allFields)
+      );
+      let rows = mapped.map((row) => mapListRow(row, caches));
+      if (hasActiveModuleSearch(moduleKey, searchForm)) {
+        rows = filterInstanceRowsByModuleSearch(moduleKey, rows, searchForm);
+      }
+      tableData.value = rows;
+      page.total = hasActiveModuleSearch(moduleKey, searchForm)
+        ? rows.length
+        : total;
+    } catch {
+      tableData.value = [];
+      page.total = 0;
+      ElMessage.error(`${moduleConfig.value?.label || "鐢宠"}鍒楄〃鍔犺浇澶辫触`);
+    } finally {
+      tableLoading.value = false;
+    }
+  }
+
+  function handleQuery(searchForm) {
+    lastListSearchForm = searchForm;
+    page.current = 1;
+    return fetchList(searchForm);
+  }
+
+  /** 杩涘叆椤甸潰锛氬厛鎷� TypeEnums 瑙f瀽 businessType锛屽啀鏌ュ垪琛� */
+  async function initModuleList(searchForm) {
+    await loadBusinessTypeOptions();
+    return handleQuery(searchForm);
+  }
+
+  function pagination({ page: p, limit }, searchForm) {
+    page.current = p;
+    page.size = limit;
+    return fetchList(searchForm);
+  }
+
+  function openDetail(row) {
+    detailRow.value = { ...row };
+    detailDialog.visible = true;
+  }
+
+  function openEdit(row) {
+    if (!canEditBusinessInstanceRow(row)) {
+      ElMessage.warning("杩涜涓垨宸插畬鎴愮殑瀹℃壒涓嶅彲淇敼");
+      return;
+    }
+    if (!row?.id) {
+      ElMessage.warning("鏃犳硶淇敼锛氱己灏戝鎵瑰疄渚� ID");
+      return;
+    }
+    submitDialog.mode = "edit";
+    submitEditRow.value = { ...row };
+    Object.assign(submitForm, buildEditFormFromInstanceRow(row));
+    submitDialog.visible = true;
+  }
+
+  function openEditFromDetail() {
+    const row = detailRow.value;
+    detailDialog.visible = false;
+    openEdit(row);
+  }
+
+  function resetSubmitForm() {
+    Object.assign(submitForm, createEmptySubmitForm(""));
+    submitEditRow.value = null;
+  }
+
+  function openAddWithTemplate() {
+    submitDialog.visible = false;
+    pendingTemplateBinding.value = null;
+    templateBindVisible.value = true;
+  }
+
+  function onTemplateBound(binding) {
+    pendingTemplateBinding.value = binding;
+  }
+
+  function onTemplateBindClosed() {
+    const binding = pendingTemplateBinding.value;
+    if (!binding) return;
+    pendingTemplateBinding.value = null;
+    openAddFromBinding(binding);
+  }
+
+  function openAddFromBinding(binding) {
+    resetSubmitForm();
+    applyBindingToForm(submitForm, binding);
+    submitDialog.mode = "add";
+    submitEditRow.value = null;
+    submitDialog.visible = true;
+  }
+
+  function closeSubmitDialog() {
+    submitDialog.visible = false;
+  }
+
+  async function submitInstanceForm(options = {}) {
+    const { skipValidate = false } = options;
+    if (!skipValidate) {
+      if (!submitFormRef.value?.validate) {
+        ElMessage.warning("琛ㄥ崟鏈氨缁紝璇峰叧闂脊绐楀悗閲嶈瘯");
+        return false;
+      }
+      try {
+        await submitFormRef.value.validate();
+      } catch {
+        ElMessage.warning("璇峰畬鍠勮〃鍗曞繀濉」鍚庡啀淇濆瓨");
+        return false;
+      }
+    }
+    if (!activeTemplate.value) {
+      ElMessage.warning("鏈姞杞藉鎵规ā鏉匡紝鏃犳硶淇濆瓨");
+      return false;
+    }
+    const bindingCheck = validateTemplateBinding({ flowNodes: submitForm.flowNodes });
+    if (!bindingCheck.ok) {
+      ElMessage.warning(bindingCheck.message);
+      return false;
+    }
+    if (!submitForm.templateId) {
+      ElMessage.warning("缂哄皯妯℃澘 ID锛屾棤娉曟彁浜�");
+      return false;
+    }
+    if (beforeSave) {
+      try {
+        await beforeSave(submitForm, { isEdit: isSubmitEdit.value, editRow: submitEditRow.value });
+      } catch {
+        return false;
+      }
+    }
+    if (submitSaving.value) return false;
+    submitSaving.value = true;
+    try {
+      const dto = buildInstanceDto({
+        submitForm,
+        activeTemplate: activeTemplate.value,
+        userStore,
+        flowNodes: bindingCheck.nodes,
+        existingRow: isSubmitEdit.value ? submitEditRow.value : null,
+      });
+      if (isSubmitEdit.value) {
+        await updateApprovalInstance(dto);
+      } else {
+        await saveApprovalInstance(dto);
+      }
+      submitDialog.visible = false;
+      if (!isSubmitEdit.value) page.current = 1;
+      await fetchList(lastListSearchForm ?? {});
+      if (detailDialog.visible && detailRow.value?.id === submitForm.instanceId) {
+        const hit = tableData.value.find((r) => r.id === submitForm.instanceId);
+        if (hit) detailRow.value = { ...hit };
+        else detailDialog.visible = false;
+      }
+      return true;
+    } catch {
+      ElMessage.error(isSubmitEdit.value ? "淇濆瓨澶辫触" : "鎻愪氦澶辫触");
+      return false;
+    } finally {
+      submitSaving.value = false;
+    }
+  }
+
+  async function removeInstance(row) {
+    if (row?.id == null || row.id === "") {
+      ElMessage.warning("鏃犳硶鍒犻櫎锛氱己灏戝鎵瑰疄渚� ID");
+      return;
+    }
+    const title = row.title || row.templateName || row.instanceNo || "璇ュ鎵�";
+    try {
+      await ElMessageBox.confirm(
+        `纭畾瑕佸垹闄ゅ鎵广��${title}銆嶅悧锛熷垹闄ゅ悗涓嶅彲鎭㈠銆俙,
+        "鍒犻櫎纭",
+        {
+          type: "warning",
+          confirmButtonText: "纭畾鍒犻櫎",
+          cancelButtonText: "鍙栨秷",
+          distinguishCancelAndClose: true,
+          autofocus: false,
+        }
+      );
+    } catch {
+      return;
+    }
+    try {
+      await deleteApprovalInstance([row.id]);
+      ElMessage.success("鍒犻櫎鎴愬姛");
+      if (detailDialog.visible && detailRow.value?.id === row.id) {
+        detailDialog.visible = false;
+      }
+      if (submitDialog.visible && submitEditRow.value?.id === row.id) {
+        submitDialog.visible = false;
+      }
+      await fetchList(lastListSearchForm ?? {});
+    } catch {
+      /* 閿欒鐢辨嫤鎴櫒鎻愮ず */
+    }
+  }
+
+  /** 鏋勫缓鏍囧噯鎿嶄綔鍒楋細璇︽儏銆佷慨鏀广�佸垹闄わ紙涓庡鎵瑰垪琛ㄤ竴鑷达級 */
+  function buildTableActions(extraOperations = []) {
+    return [
+      { name: "璇︽儏", type: "text", clickFun: (row) => openDetail(row) },
+      {
+        name: "淇敼",
+        type: "text",
+        disabled: (row) => !canEditBusinessInstanceRow(row),
+        clickFun: (row) => openEdit(row),
+      },
+      {
+        name: "鍒犻櫎",
+        type: "danger",
+        clickFun: (row) => removeInstance(row),
+      },
+      ...extraOperations,
+    ];
+  }
+
+  return {
+    moduleConfig,
+    defaultListBusinessType,
+    tableData,
+    tableLoading,
+    page,
+    detailDialog,
+    detailRow,
+    submitDialog,
+    submitEditRow,
+    submitForm,
+    submitFormRef,
+    submitSaving,
+    isSubmitEdit,
+    activeTemplate,
+    submitFormFields,
+    submitFormRules,
+    submitDialogTitle,
+    templateBindVisible,
+    pendingTemplateBinding,
+    fetchList,
+    handleQuery,
+    initModuleList,
+    pagination,
+    openDetail,
+    openEdit,
+    openEditFromDetail,
+    openAddWithTemplate,
+    onTemplateBound,
+    onTemplateBindClosed,
+    openAddFromBinding,
+    closeSubmitDialog,
+    resetSubmitForm,
+    submitInstanceForm,
+    removeInstance,
+    buildTableActions,
+    loadBusinessTypeOptions,
+    canEditBusinessInstanceRow,
+  };
+}
diff --git a/src/views/officeProcessAutomation/ApproveManage/approve-shared/useApprovalTemplateBinding.js b/src/views/officeProcessAutomation/ApproveManage/approve-shared/useApprovalTemplateBinding.js
new file mode 100644
index 0000000..d49ec53
--- /dev/null
+++ b/src/views/officeProcessAutomation/ApproveManage/approve-shared/useApprovalTemplateBinding.js
@@ -0,0 +1,259 @@
+import {
+  getApprovalTemplateDetail,
+  listApprovalTemplate,
+  TEMPLATE_TYPE_CUSTOM,
+} from "@/api/officeProcessAutomation/approvalTemplate.js";
+import { computed, reactive, ref } from "vue";
+import { ElMessage } from "element-plus";
+import {
+  fetchBusinessTypeOptions,
+  mapEnabledFromApi,
+  unwrapTemplateList,
+} from "../approve-template/approveTemplateConstants.js";
+import {
+  createEmptySubmitForm,
+  mapSubmitTemplateCard,
+  matchBusinessTypeValue,
+} from "../approve-list/approveListConstants.js";
+import {
+  getApprovalModuleConfig,
+  getModuleMatchingBusinessTypes,
+  resolveModuleBusinessType,
+} from "./approvalModuleRegistry.js";
+import {
+  buildFormPayloadRules,
+  buildTemplateBindingFromDetail,
+  validateTemplateBinding,
+} from "./approvalTemplateBindingUtils.js";
+
+/**
+ * 瀹℃壒妯℃澘缁戝畾锛堜笟鍔℃ā鍧楀浐瀹氱被鍨� / 瀹℃壒鍒楄〃閫氱敤锛�
+ *
+ * @param {object} options
+ * @param {string} [options.moduleKey] 涓氬姟妯″潡 key锛岃 approvalModuleRegistry
+ * @param {string|number} [options.businessType] 鐩存帴鎸囧畾绫诲瀷锛堜紭鍏堢骇楂樹簬 moduleKey锛�
+ * @param {'module'|'universal'} [options.mode] module=浠呮湰绫诲瀷妯℃澘锛泆niversal=闇�鍏堥�夌被鍨�
+ */
+export function useApprovalTemplateBinding(options = {}) {
+  const { moduleKey = null, businessType: fixedBusinessType = null, mode = moduleKey ? "module" : "universal" } =
+    options;
+
+  const isUniversal = mode === "universal" && !moduleKey && fixedBusinessType == null;
+
+  const allTemplates = ref([]);
+  const businessTypeOptions = ref([]);
+  const selectedBusinessType = ref(fixedBusinessType ?? "");
+  const templatesLoading = ref(false);
+  const step = ref(isUniversal ? 1 : 1);
+
+  const bindingForm = reactive(createEmptySubmitForm(""));
+
+  const moduleConfig = computed(() => getApprovalModuleConfig(moduleKey));
+
+  const resolvedBusinessType = computed(() => {
+    if (fixedBusinessType != null && fixedBusinessType !== "") return fixedBusinessType;
+    if (selectedBusinessType.value != null && selectedBusinessType.value !== "") {
+      return selectedBusinessType.value;
+    }
+    if (moduleKey) {
+      return resolveModuleBusinessType(moduleKey, businessTypeOptions.value);
+    }
+    return "";
+  });
+
+  const matchingBusinessTypes = computed(() => {
+    if (fixedBusinessType != null && fixedBusinessType !== "") return [fixedBusinessType];
+    if (isUniversal) {
+      const t = selectedBusinessType.value;
+      return t != null && t !== "" ? [t] : [];
+    }
+    if (moduleKey) {
+      return getModuleMatchingBusinessTypes(moduleKey, businessTypeOptions.value);
+    }
+    const t = resolvedBusinessType.value;
+    return t != null && t !== "" ? [t] : [];
+  });
+
+  const templateCards = computed(() => {
+    const types = matchingBusinessTypes.value;
+    if (!types.length) return [];
+    return allTemplates.value.filter((card) =>
+      types.some(
+        (t) =>
+          matchBusinessTypeValue(card.businessType, t) ||
+          matchBusinessTypeValue(card.approvalType, t)
+      )
+    );
+  });
+
+  const activeTemplate = computed(() => bindingForm.templateSnapshot || null);
+
+  const formFields = computed(() => {
+    const tplFields = activeTemplate.value?.fields;
+    if (tplFields?.length) return tplFields;
+    return bindingForm.formFieldDefs || [];
+  });
+
+  const formRules = computed(() => buildFormPayloadRules(formFields.value));
+
+  const hasTemplateBound = computed(() => Boolean(activeTemplate.value?.templateId || bindingForm.templateId));
+
+  function businessTypeLabel(type) {
+    if (type == null || type === "") return "";
+    const hit = businessTypeOptions.value.find((x) => matchBusinessTypeValue(x.value, type));
+    return hit?.label || moduleConfig.value?.label || "";
+  }
+
+  const selectedBusinessTypeLabel = computed(() => businessTypeLabel(resolvedBusinessType.value));
+
+  function countTemplatesByBusinessType(type) {
+    const types =
+      moduleKey && !fixedBusinessType
+        ? getModuleMatchingBusinessTypes(moduleKey, businessTypeOptions.value)
+        : [type];
+    return allTemplates.value.filter((card) =>
+      types.some(
+        (t) =>
+          matchBusinessTypeValue(card.businessType, t) ||
+          matchBusinessTypeValue(card.approvalType, t)
+      )
+    ).length;
+  }
+
+  async function loadTemplates() {
+    templatesLoading.value = true;
+    try {
+      const [typeOptions, customRes] = await Promise.all([
+        fetchBusinessTypeOptions(),
+        listApprovalTemplate(TEMPLATE_TYPE_CUSTOM),
+      ]);
+      businessTypeOptions.value = typeOptions;
+      allTemplates.value = unwrapTemplateList(customRes)
+        .filter((row) => mapEnabledFromApi(row.enabled))
+        .map(mapSubmitTemplateCard);
+
+      if (moduleKey && !fixedBusinessType) {
+        const resolved = resolveModuleBusinessType(moduleKey, typeOptions);
+        if (resolved != null && resolved !== "") selectedBusinessType.value = resolved;
+      }
+    } catch {
+      businessTypeOptions.value = [];
+      allTemplates.value = [];
+      ElMessage.error("鍔犺浇瀹℃壒妯℃澘澶辫触");
+    } finally {
+      templatesLoading.value = false;
+    }
+  }
+
+  function resetBinding() {
+    step.value = isUniversal ? 1 : 1;
+    if (!fixedBusinessType && !moduleKey) selectedBusinessType.value = "";
+    else if (moduleKey) {
+      selectedBusinessType.value =
+        fixedBusinessType ?? resolveModuleBusinessType(moduleKey, businessTypeOptions.value) ?? "";
+    }
+    Object.assign(bindingForm, createEmptySubmitForm(""));
+  }
+
+  function pickBusinessType(type) {
+    if (!countTemplatesByBusinessType(type)) {
+      ElMessage.warning("璇ョ被鍨嬩笅鏆傛棤鍙敤瀹℃壒妯℃澘");
+      return;
+    }
+    selectedBusinessType.value = type;
+    step.value = 2;
+  }
+
+  function backToBusinessTypePick() {
+    selectedBusinessType.value = "";
+    step.value = 1;
+  }
+
+  function backToTemplatePick() {
+    step.value = isUniversal ? 2 : 1;
+  }
+
+  async function pickTemplate(card) {
+    if (!card?.id) return false;
+    templatesLoading.value = true;
+    try {
+      const res = await getApprovalTemplateDetail(card.id);
+      const applied = buildTemplateBindingFromDetail(res);
+      Object.assign(bindingForm, {
+        templateKey: String(card.id),
+        ...applied,
+      });
+      step.value = isUniversal ? 3 : 2;
+      return true;
+    } catch {
+      ElMessage.error("鍔犺浇妯℃澘璇︽儏澶辫触");
+      return false;
+    } finally {
+      templatesLoading.value = false;
+    }
+  }
+
+  /** 鐩存帴浠ヨ鎯呰缁戝畾锛堢紪杈戝洖鏄撅級 */
+  function applyBindingState(state) {
+    if (!state) return;
+    Object.assign(bindingForm, createEmptySubmitForm(""), state);
+    step.value = isUniversal ? 3 : 2;
+  }
+
+  async function validateBinding(formRef) {
+    if (formRef?.validate) {
+      try {
+        await formRef.validate();
+      } catch {
+        return { ok: false };
+      }
+    }
+    if (!hasTemplateBound.value) {
+      return { ok: false, message: "璇烽�夋嫨瀹℃壒妯℃澘" };
+    }
+    return validateTemplateBinding({ flowNodes: bindingForm.flowNodes });
+  }
+
+  function getBindingPayload() {
+    return {
+      templateId: bindingForm.templateId,
+      templateName: bindingForm.templateName,
+      businessType: bindingForm.businessType ?? resolvedBusinessType.value,
+      templateSnapshot: bindingForm.templateSnapshot,
+      formFieldDefs: bindingForm.formFieldDefs,
+      formPayload: bindingForm.formPayload,
+      flowNodes: bindingForm.flowNodes,
+      templateAttachments: bindingForm.templateAttachments,
+      storageBlobDTOs: bindingForm.storageBlobDTOs,
+    };
+  }
+
+  return {
+    isUniversal,
+    moduleConfig,
+    step,
+    bindingForm,
+    allTemplates,
+    businessTypeOptions,
+    selectedBusinessType,
+    resolvedBusinessType,
+    selectedBusinessTypeLabel,
+    templateCards,
+    activeTemplate,
+    formFields,
+    formRules,
+    hasTemplateBound,
+    templatesLoading,
+    loadTemplates,
+    resetBinding,
+    pickBusinessType,
+    backToBusinessTypePick,
+    backToTemplatePick,
+    pickTemplate,
+    applyBindingState,
+    validateBinding,
+    getBindingPayload,
+    countTemplatesByBusinessType,
+    businessTypeLabel,
+  };
+}
diff --git a/src/views/officeProcessAutomation/ApproveManage/approve-shared/useFlowUserOptions.js b/src/views/officeProcessAutomation/ApproveManage/approve-shared/useFlowUserOptions.js
new file mode 100644
index 0000000..2788ac7
--- /dev/null
+++ b/src/views/officeProcessAutomation/ApproveManage/approve-shared/useFlowUserOptions.js
@@ -0,0 +1,35 @@
+import { ref } from "vue";
+import { userListNoPageByTenantId } from "@/api/system/user.js";
+
+function unwrapArray(payload) {
+  if (Array.isArray(payload)) return payload;
+  if (payload?.data && Array.isArray(payload.data)) return payload.data;
+  if (payload?.rows && Array.isArray(payload.rows)) return payload.rows;
+  return [];
+}
+
+function isActiveUser(u) {
+  if (u.delFlag === "2" || u.delFlag === 2) return false;
+  if (u.status == null) return true;
+  return String(u.status) === "0";
+}
+
+/** 瀹℃壒娴佺▼閫変汉涓嬫媺锛堟ā鏉�/瀹炰緥鍏辩敤锛� */
+export function useFlowUserOptions() {
+  const flowUserOptions = ref([]);
+  const loading = ref(false);
+
+  async function loadFlowUsers() {
+    loading.value = true;
+    try {
+      const res = await userListNoPageByTenantId();
+      flowUserOptions.value = unwrapArray(res).filter(isActiveUser);
+    } catch {
+      flowUserOptions.value = [];
+    } finally {
+      loading.value = false;
+    }
+  }
+
+  return { flowUserOptions, loading, loadFlowUsers };
+}
diff --git a/src/views/officeProcessAutomation/ApproveManage/approve-template/approveTemplateConstants.js b/src/views/officeProcessAutomation/ApproveManage/approve-template/approveTemplateConstants.js
new file mode 100644
index 0000000..727f896
--- /dev/null
+++ b/src/views/officeProcessAutomation/ApproveManage/approve-template/approveTemplateConstants.js
@@ -0,0 +1,355 @@
+import dayjs from "dayjs";
+import { getTypeEnums } from "@/api/basicData/enum.js";
+import {
+  TEMPLATE_TYPE_BUILTIN,
+  TEMPLATE_TYPE_CUSTOM,
+} from "@/api/officeProcessAutomation/approvalTemplate.js";
+import { APPROVAL_TYPE_OPTIONS } from "../approve-list/approveListConstants.js";
+import {
+  buildFormConfigJson,
+  createEmptyFormConfigData,
+  parseFormConfigToData,
+  validateFormConfigData,
+} from "./formConfigUtils.js";
+
+export function unwrapEnumList(data) {
+  if (Array.isArray(data)) return data;
+  if (!data || typeof data !== "object") return [];
+  if (Array.isArray(data.TypeEnums)) return data.TypeEnums;
+  if (Array.isArray(data.typeEnums)) return data.typeEnums;
+  const nested = Object.values(data).find((v) => Array.isArray(v));
+  return nested || [];
+}
+
+export function normalizeBusinessTypeOptions(data) {
+  return unwrapEnumList(data)
+    .map((item) => {
+      const rawValue = item?.value ?? item?.code ?? item?.businessType ?? item?.dictValue ?? item?.key;
+      if (rawValue == null || rawValue === "") return null;
+      const num = Number(rawValue);
+      const value =
+        typeof rawValue === "number" || (Number.isFinite(num) && String(rawValue).trim() !== "")
+          ? num
+          : rawValue;
+      const label =
+        item?.label ?? item?.name ?? item?.desc ?? item?.dictLabel ?? item?.text ?? String(value);
+      return { label, value };
+    })
+    .filter(Boolean);
+}
+
+export async function fetchBusinessTypeOptions() {
+  try {
+    const res = await getTypeEnums();
+    return normalizeBusinessTypeOptions(res?.data);
+  } catch {
+    return [];
+  }
+}
+
+/** 鏄惁涓虹郴缁熷唴缃ā鏉匡紙templateType === 0锛� */
+export function isBuiltinTemplate(row) {
+  return Number(row?.templateType) === TEMPLATE_TYPE_BUILTIN;
+}
+
+/** 鑺傜偣鍐呭鎵规柟寮忥細浼氱 / 鎴栫 */
+export const NODE_SIGN_MODE_OPTIONS = [
+  { value: "countersign", label: "浼氱", desc: "鏈妭鐐规墍鏈夊鎵逛汉鍧囬渶閫氳繃" },
+  { value: "or_sign", label: "鎴栫", desc: "鏈妭鐐逛换涓�瀹℃壒浜洪�氳繃鍗冲彲" },
+];
+
+function parseFormConfig(formConfig) {
+  if (!formConfig) return {};
+  if (typeof formConfig === "object") return formConfig;
+  try {
+    return JSON.parse(formConfig);
+  } catch {
+    return {};
+  }
+}
+
+function resolveDefaultMode(row, cfg, nodes) {
+  let mode = cfg.approvalMode || cfg.defaultMode;
+  if (!mode && nodes.length) {
+    const t = String(nodes[0]?.approveType || "").toUpperCase();
+    mode = t === "OR" ? "or_sign" : "parallel";
+  }
+  const m = String(mode || "").toLowerCase();
+  if (m === "or" || m === "or_sign") return "or_sign";
+  return "parallel";
+}
+
+/** 灏嗘帴鍙h繑鍥炵殑妯℃澘杞负銆岀郴缁熷父鐢ㄥ鎵广�嶅崱鐗囨暟鎹� */
+export function mapBuiltinCardFromApi(row) {
+  const cfg = parseFormConfig(row?.formConfig);
+  const fields = cfg.fields || cfg.formFields || [];
+  const nodes = row?.nodes || row?.flowNodes || [];
+  return {
+    key: String(row?.id ?? row?.templateName ?? ""),
+    id: row?.id,
+    approvalType: cfg.approvalType || row?.approvalType || "",
+    label: row?.templateName || row?.name || "鈥�",
+    summary: (row?.description || "").trim() || cfg.summaryPlaceholder || "绯荤粺棰勭疆濉姤瀛楁",
+    fieldCount: fields.length,
+    defaultMode: resolveDefaultMode(row, cfg, nodes),
+  };
+}
+
+export function unwrapTemplateList(payload) {
+  const data = payload?.data ?? payload;
+  if (Array.isArray(data)) return data;
+  if (Array.isArray(data?.records)) return data.records;
+  if (Array.isArray(data?.list)) return data.list;
+  return [];
+}
+
+/** 鍚庣 approveType 鈫� 椤甸潰 signMode */
+export function mapSignModeFromApi(approveType) {
+  const t = String(approveType || "").toUpperCase();
+  return t === "OR" ? "or_sign" : "countersign";
+}
+
+/** 椤甸潰 signMode 鈫� 鍚庣 approveType */
+export function mapSignModeToApi(signMode) {
+  return signMode === "or_sign" ? "OR" : "AND";
+}
+
+/** 椤甸潰 enabled 鈫� 鍚庣 enabled锛�1 鍚敤锛�0 鍋滅敤锛� */
+export function mapEnabledToApi(enabled) {
+  return enabled !== false ? "1" : "0";
+}
+
+/** 鍚庣 nodes 鈫� 椤甸潰 flowNodes锛堜繚鐣� id 渚涗慨鏀规彁浜わ級 */
+export function mapNodesFromApi(nodes) {
+  const list = Array.isArray(nodes) ? nodes : [];
+  return list.map((n, i) => ({
+    id: n.id,
+    templateId: n.templateId,
+    nodeOrder: n.levelNo ?? i + 1,
+    signMode: mapSignModeFromApi(n.approveType ?? n.signMode),
+    approvers: (n.approvers || [])
+      .filter((a) => a?.approverId != null && a.approverId !== "")
+      .map((a) => ({
+        id: a.id,
+        nodeId: a.nodeId,
+        templateId: a.templateId,
+        approverId: a.approverId,
+        approverName: a.approverName || "",
+      })),
+  }));
+}
+
+/** enabled锛�1 鍚敤锛�0 鍋滅敤 */
+export function mapEnabledFromApi(enabled) {
+  return enabled === "1" || enabled === 1 || enabled === true;
+}
+
+/** 鍏煎澶氱鍚庣鏃堕棿瀛楁鍚嶅苟鏍煎紡鍖栧睍绀� */
+export function pickTemplateTimes(row) {
+  const rawCreated =
+    row?.createdTime ?? row?.createTime ?? row?.gmtCreate ?? row?.created_at ?? "";
+  const rawUpdated =
+    row?.updatedTime ?? row?.updateTime ?? row?.gmtModified ?? row?.modifyTime ?? row?.updated_at ?? "";
+  const createdTime = normalizeTimeValue(rawCreated);
+  const updatedTime = normalizeTimeValue(rawUpdated);
+  return { createdTime, updatedTime, createTime: createdTime, updateTime: updatedTime };
+}
+
+function normalizeTimeValue(val) {
+  if (val == null || val === "") return "";
+  if (Array.isArray(val) && val.length >= 3) {
+    const [y, m, d, h = 0, min = 0, s = 0] = val;
+    return dayjs(new Date(y, m - 1, d, h, min, s)).format("YYYY-MM-DD HH:mm:ss");
+  }
+  if (typeof val === "number") {
+    const d = val > 1e12 ? dayjs(val) : dayjs.unix(val);
+    return d.isValid() ? d.format("YYYY-MM-DD HH:mm:ss") : "";
+  }
+  const s = String(val).trim();
+  if (!s) return "";
+  const parsed = dayjs(s.includes("T") ? s : s.replace(/-/g, "/"));
+  return parsed.isValid() ? parsed.format("YYYY-MM-DD HH:mm:ss") : s;
+}
+
+export function formatDisplayTime(val) {
+  const t = normalizeTimeValue(val);
+  return t || "鈥�";
+}
+
+/** 璇︽儏鎺ュ彛 data 瑙e寘 */
+export function unwrapTemplateDetail(res) {
+  const data = res?.data ?? res;
+  if (!data || typeof data !== "object") return {};
+  if (data.templateName != null || data.id != null) return data;
+  if (data.approvalTemplateVo) return data.approvalTemplateVo;
+  if (data.records && data.records[0]) return data.records[0];
+  return data;
+}
+
+/** 鍚庣闄勪欢瀛楁 鈫� 椤甸潰 storageBlobDTOs */
+export function mapAttachmentsFromApi(row) {
+  const list =
+    row?.storageBlobDTOs ||
+    row?.storageBlobDTOS ||
+    row?.storageBlobVOS ||
+    row?.storageBlobVOList ||
+    row?.attachmentList ||
+    [];
+  return Array.isArray(list) ? list : [];
+}
+
+/** 鍒嗛〉鍒楄〃椤� 鈫� 椤甸潰琛屾暟鎹紙涓昏〃 + 鑺傜偣锛� */
+export function mapTemplateFromApi(row) {
+  if (!row) return {};
+  const flowNodes = mapNodesFromApi(row.nodes || row.flowNodes);
+  const times = pickTemplateTimes(row);
+  return {
+    id: row.id,
+    templateName: row.templateName || "",
+    description: row.description || "",
+    enabled: mapEnabledFromApi(row.enabled),
+    enabledRaw: row.enabled,
+    templateType: row.templateType != null ? Number(row.templateType) : undefined,
+    businessType: row.businessType ?? "",
+    formConfig: row.formConfig,
+    formConfigData: parseFormConfigToData(row.formConfig),
+    storageBlobDTOs: mapAttachmentsFromApi(row),
+    createdUser: row.createdUser,
+    createdUserName: row.createdUserName,
+    ...times,
+    flowNodes,
+    nodes: row.nodes || row.flowNodes,
+  };
+}
+
+/** 琛ㄥ崟鏁版嵁 鈫� 鎻愪氦 DTO锛圓pprovalTemplateDto锛� */
+export function mapTemplateToApi(form) {
+  const nodes = normalizeFlowNodes(form.flowNodes);
+  const templateId = form.id || null;
+  const dto = {
+    templateName: (form.templateName || "").trim(),
+    description: (form.description || "").trim(),
+    enabled: mapEnabledToApi(form.enabled),
+    templateType:
+      form.templateType != null ? Number(form.templateType) : TEMPLATE_TYPE_CUSTOM,
+    businessType: form.businessType ?? "",
+    formConfig: buildFormConfigJson(form.formConfigData),
+    nodes: nodes.map((n, i) => {
+      const node = {
+        levelNo: n.nodeOrder ?? i + 1,
+        approveType: mapSignModeToApi(n.signMode),
+        approvers: n.approvers.map((a, idx) => {
+          const approver = {
+            approverId: a.approverId,
+            approverName: a.approverName || "",
+            sortNo: idx + 1,
+          };
+          if (a.id != null) approver.id = a.id;
+          if (a.nodeId != null) approver.nodeId = a.nodeId;
+          if (a.templateId != null) approver.templateId = a.templateId;
+          else if (templateId) approver.templateId = templateId;
+          return approver;
+        }),
+      };
+      if (n.id != null) node.id = n.id;
+      if (n.templateId != null) node.templateId = n.templateId;
+      else if (templateId) node.templateId = templateId;
+      return node;
+    }),
+  };
+  if (templateId) dto.id = templateId;
+  const attachments = Array.isArray(form.storageBlobDTOs) ? form.storageBlobDTOs : [];
+  if (attachments.length) dto.storageBlobDTOs = attachments;
+  return dto;
+}
+
+export function buildApprovalTemplateListParams({ page, searchForm }) {
+  const params = {
+    current: page.current,
+    size: page.size,
+  };
+  const kw = (searchForm?.keyword || "").trim();
+  if (kw) params.templateName = kw;
+  if (searchForm?.enabledOnly) params.enabled = "1";
+  return params;
+}
+
+export function nodeSignModeLabel(mode) {
+  return NODE_SIGN_MODE_OPTIONS.find((x) => x.value === mode)?.label || "鈥�";
+}
+
+export function approvalTypeLabel(type) {
+  return APPROVAL_TYPE_OPTIONS.find((x) => x.value === type)?.label || type || "鈥�";
+}
+
+export function createEmptyNode(order = 1) {
+  return {
+    nodeOrder: order,
+    signMode: "countersign",
+    approvers: [],
+  };
+}
+
+export function createEmptyTemplateForm() {
+  return {
+    id: "",
+    templateName: "",
+    description: "",
+    templateType: TEMPLATE_TYPE_CUSTOM,
+    lockedFormFieldUids: [],
+    businessType: "",
+    formConfig: "",
+    formConfigData: createEmptyFormConfigData(),
+    enabled: true,
+    flowNodes: [createEmptyNode(1)],
+    storageBlobDTOs: [],
+  };
+}
+
+export function normalizeFlowNodes(nodes) {
+  const list = Array.isArray(nodes) ? nodes : [];
+  return list.map((n, i) => ({
+    id: n.id,
+    templateId: n.templateId,
+    nodeOrder: i + 1,
+    signMode: n.signMode === "or_sign" ? "or_sign" : "countersign",
+    approvers: (n.approvers || [])
+      .filter((a) => a?.approverId != null && a.approverId !== "")
+      .map((a) => ({
+        id: a.id,
+        nodeId: a.nodeId,
+        templateId: a.templateId,
+        approverId: a.approverId,
+        approverName: a.approverName || "",
+      })),
+  }));
+}
+
+export function validateTemplateForm(form) {
+  const name = (form.templateName || "").trim();
+  if (!name) return { ok: false, message: "璇峰~鍐欐ā鏉垮悕绉�" };
+  if (form.businessType == null || form.businessType === "") {
+    return { ok: false, message: "璇烽�夋嫨妯℃澘绫诲瀷" };
+  }
+  const nodes = normalizeFlowNodes(form.flowNodes);
+  if (!nodes.length) return { ok: false, message: "璇疯嚦灏戦厤缃竴涓鎵硅妭鐐�" };
+  for (let i = 0; i < nodes.length; i++) {
+    if (!nodes[i].approvers.length) {
+      return { ok: false, message: `璇蜂负绗� ${i + 1} 涓妭鐐归�夋嫨鑷冲皯涓�鍚嶅鎵逛汉` };
+    }
+  }
+  const cfgCheck = validateFormConfigData(form.formConfigData);
+  if (!cfgCheck.ok) return cfgCheck;
+  return { ok: true, nodes, name };
+}
+
+export function flowNodesSummary(nodes) {
+  const list = normalizeFlowNodes(nodes);
+  if (!list.length) return "鈥�";
+  return list
+    .map((n, i) => {
+      const names = n.approvers.map((a) => a.approverName || "鏈懡鍚�").join("銆�") || "鏈厤缃�";
+      return `鑺傜偣${i + 1}(${nodeSignModeLabel(n.signMode)}:${names})`;
+    })
+    .join(" 鈫� ");
+}
diff --git a/src/views/officeProcessAutomation/ApproveManage/approve-template/components/FormConfigEditor.vue b/src/views/officeProcessAutomation/ApproveManage/approve-template/components/FormConfigEditor.vue
new file mode 100644
index 0000000..6880f3f
--- /dev/null
+++ b/src/views/officeProcessAutomation/ApproveManage/approve-template/components/FormConfigEditor.vue
@@ -0,0 +1,857 @@
+<!-- 瀹℃壒妯℃澘锛氬彲閰嶇疆濉姤椤癸紝搴忓垪鍖栧埌 formConfig -->
+<template>
+  <div class="fce">
+    <div class="fce-hint">
+      <span class="fce-hint-label">濉姤鎻愮ず</span>
+      <el-input
+        v-model="inner.summaryPlaceholder"
+        placeholder="濡傦細璇峰~鍐欐姤閿�浜嬬敱銆侀噾棰濈瓑"
+        maxlength="200"
+        show-word-limit
+        @input="emitOut"
+      />
+    </div>
+
+    <div class="fce-panel">
+      <div class="fce-toolbar">
+        <div class="fce-toolbar-left">
+          <span class="fce-title">濉姤椤归厤缃�</span>
+          <el-tag v-if="inner.fields.length" size="small" type="info" effect="plain">
+            鍏� {{ inner.fields.length }} 椤�
+          </el-tag>
+        </div>
+        <div class="fce-toolbar-actions">
+          <el-dropdown
+            trigger="click"
+            :disabled="disableImport"
+            @visible-change="onImportDropdownVisible"
+            @command="importFromTemplate"
+          >
+            <el-button size="small" :loading="templateImportLoading" :disabled="disableImport">
+              浠庡凡鏈夋ā鏉垮鍏�
+            </el-button>
+            <template #dropdown>
+              <el-dropdown-menu>
+                <el-dropdown-item v-if="!templateImportOptions.length" disabled>
+                  鏆傛棤鍏朵粬瀹℃壒妯℃澘
+                </el-dropdown-item>
+                <el-dropdown-item
+                  v-for="t in templateImportOptions"
+                  :key="t.id"
+                  :command="t.id"
+                >
+                  <span>{{ t.label }}</span>
+                  <el-tag v-if="!t.enabled" size="small" type="info" class="import-tag">宸插仠鐢�</el-tag>
+                </el-dropdown-item>
+              </el-dropdown-menu>
+            </template>
+          </el-dropdown>
+          <el-button type="primary" size="small" :icon="Plus" @click="addField">娣诲姞濉姤椤�</el-button>
+        </div>
+      </div>
+
+      <el-empty
+        v-if="!inner.fields.length"
+        class="fce-empty"
+        description="鏆傛棤濉姤椤癸紝鍙坊鍔犳垨浠庡凡鏈夊鎵规ā鏉垮鍏�"
+        :image-size="72"
+      />
+
+      <div v-else class="fce-list">
+        <div
+          v-for="(field, index) in inner.fields"
+          :key="field._uid"
+          class="fce-card"
+          :class="{
+            'fce-card--required': field.required,
+            'fce-card--locked': isFieldLocked(field),
+          }"
+        >
+          <div class="fce-card-badge">{{ index + 1 }}</div>
+
+          <div class="fce-card-head">
+            <div class="fce-card-title">
+              <span class="fce-card-name">{{ field.label || `濉姤椤� ${index + 1}` }}</span>
+              <el-tag size="small" effect="light" type="primary">{{ typeLabel(field.type) }}</el-tag>
+              <el-tag v-if="field.required" size="small" type="danger" effect="plain">蹇呭~</el-tag>
+              <el-tag v-if="isFieldLocked(field)" size="small" type="info" effect="plain">鍐呯疆椤�</el-tag>
+            </div>
+            <div v-if="!isFieldLocked(field)" class="fce-card-btns">
+              <el-tooltip content="涓婄Щ" placement="top">
+                <el-button circle size="small" :disabled="index === 0" @click="moveField(index, -1)">
+                  <el-icon><Top /></el-icon>
+                </el-button>
+              </el-tooltip>
+              <el-tooltip content="涓嬬Щ" placement="top">
+                <el-button
+                  circle
+                  size="small"
+                  :disabled="index >= inner.fields.length - 1"
+                  @click="moveField(index, 1)"
+                >
+                  <el-icon><Bottom /></el-icon>
+                </el-button>
+              </el-tooltip>
+              <el-tooltip content="鍒犻櫎" placement="top">
+                <el-button circle size="small" type="danger" plain @click="removeField(index)">
+                  <el-icon><Delete /></el-icon>
+                </el-button>
+              </el-tooltip>
+            </div>
+          </div>
+
+          <div class="fce-section">
+            <span class="fce-section-title">鍩虹淇℃伅</span>
+            <el-row :gutter="16">
+              <el-col :span="8">
+                <el-form-item label="鏄剧ず鍚嶇О" required class="fce-field-item">
+                  <el-input
+                    v-model="field.label"
+                    placeholder="濡傦細鎶ラ攢璇存槑"
+                    maxlength="50"
+                    :disabled="isFieldLocked(field)"
+                    @input="emitOut"
+                  />
+                </el-form-item>
+              </el-col>
+              <el-col :span="8">
+                <el-form-item label="瀛楁鏍囪瘑" required class="fce-field-item">
+                  <el-input
+                    v-model="field.key"
+                    placeholder="濡傦細summary"
+                    maxlength="50"
+                    :disabled="isFieldLocked(field)"
+                    @input="emitOut"
+                  />
+                </el-form-item>
+              </el-col>
+              <el-col :span="8">
+                <el-form-item label="鎺т欢绫诲瀷" class="fce-field-item">
+                  <el-select
+                    v-model="field.type"
+                    style="width: 100%"
+                    :disabled="isFieldLocked(field)"
+                    @change="onTypeChange(field)"
+                  >
+                    <el-option
+                      v-for="t in FORM_FIELD_TYPE_OPTIONS"
+                      :key="t.value"
+                      :label="t.label"
+                      :value="t.value"
+                    />
+                  </el-select>
+                </el-form-item>
+              </el-col>
+            </el-row>
+          </div>
+
+          <div class="fce-section">
+            <span class="fce-section-title">鏍¢獙涓庢牸寮�</span>
+            <el-row :gutter="16" align="middle">
+              <el-col :span="8">
+                <el-form-item label="鏄惁蹇呭~" class="fce-field-item fce-field-item--switch">
+                  <el-switch
+                    v-model="field.required"
+                    inline-prompt
+                    active-text="蹇呭~"
+                    inactive-text="閫夊~"
+                    :disabled="isFieldLocked(field)"
+                    @change="emitOut"
+                  />
+                </el-form-item>
+              </el-col>
+              <el-col v-if="field.type === 'textarea'" :span="8">
+                <el-form-item label="琛屾暟" class="fce-field-item">
+                  <el-input-number
+                    v-model="field.rows"
+                    :min="1"
+                    :max="10"
+                    controls-position="right"
+                    style="width: 100%"
+                    :disabled="isFieldLocked(field)"
+                    @change="emitOut"
+                  />
+                </el-form-item>
+              </el-col>
+              <template v-if="field.type === 'number'">
+                <el-col :span="8">
+                  <el-form-item label="鏈�灏忓��" class="fce-field-item">
+                    <el-input-number
+                      v-model="field.min"
+                      controls-position="right"
+                      style="width: 100%"
+                      :disabled="isFieldLocked(field)"
+                      @change="emitOut"
+                    />
+                  </el-form-item>
+                </el-col>
+                <el-col :span="8">
+                  <el-form-item label="灏忔暟浣�" class="fce-field-item">
+                    <el-input-number
+                      v-model="field.precision"
+                      :min="0"
+                      :max="4"
+                      controls-position="right"
+                      style="width: 100%"
+                      :disabled="isFieldLocked(field)"
+                      @change="emitOut"
+                    />
+                  </el-form-item>
+                </el-col>
+              </template>
+            </el-row>
+          </div>
+
+          <div class="fce-section fce-section--default">
+            <span class="fce-section-title">榛樿鍊�</span>
+            <p class="fce-section-desc">閫夋嫨璇ユā鏉挎彁浜ゅ鎵规椂锛屽皢鑷姩棰勫~浠ヤ笅鍐呭锛堢敤鎴蜂粛鍙慨鏀癸級</p>
+            <el-input
+              v-if="field.type === 'text' || field.type === 'textarea'"
+              v-model="field.defaultValue"
+              :type="field.type === 'textarea' ? 'textarea' : 'text'"
+              :rows="field.type === 'textarea' ? 2 : undefined"
+              :placeholder="defaultPlaceholder(field)"
+              :disabled="isFieldLocked(field)"
+              clearable
+              @input="emitOut"
+            />
+            <el-input-number
+              v-else-if="field.type === 'number'"
+              v-model="field.defaultValue"
+              :min="field.min"
+              :precision="field.precision ?? 0"
+              controls-position="right"
+              placeholder="閫夊~"
+              style="width: 100%"
+              :disabled="isFieldLocked(field)"
+              @change="emitOut"
+            />
+            <el-date-picker
+              v-else-if="field.type === 'date'"
+              v-model="field.defaultValue"
+              type="date"
+              placeholder="閫夊~"
+              format="YYYY-MM-DD"
+              value-format="YYYY-MM-DD"
+              style="width: 100%"
+              :disabled="isFieldLocked(field)"
+              clearable
+              @change="emitOut"
+            />
+            <el-date-picker
+              v-else-if="field.type === 'datetimerange'"
+              v-model="field.defaultValue"
+              type="datetimerange"
+              range-separator="鑷�"
+              start-placeholder="寮�濮嬫椂闂�"
+              end-placeholder="缁撴潫鏃堕棿"
+              format="YYYY-MM-DD HH:mm:ss"
+              value-format="YYYY-MM-DD HH:mm:ss"
+              style="width: 100%"
+              :disabled="isFieldLocked(field)"
+              clearable
+              @change="emitOut"
+            />
+            <el-select
+              v-else-if="field.type === 'select'"
+              v-model="field.defaultValue"
+              placeholder="閫夊~"
+              style="width: 100%"
+              clearable
+              filterable
+              :loading="optionSourceLoading"
+              :disabled="isFieldLocked(field)"
+              @change="emitOut"
+            >
+              <el-option
+                v-for="o in resolvedSelectOptions(field)"
+                :key="String(o.value)"
+                :label="o.label || o.value"
+                :value="o.value"
+              />
+            </el-select>
+          </div>
+
+          <div v-if="field.type === 'select'" class="fce-section fce-section--options">
+            <span class="fce-section-title">涓嬫媺閫夐」</span>
+            <el-row :gutter="16" class="fce-source-row">
+              <el-col :span="12">
+                <el-form-item label="閫夐」鏉ユ簮" class="fce-field-item">
+                  <el-select
+                    v-model="field.optionSource"
+                    style="width: 100%"
+                    :disabled="isFieldLocked(field)"
+                    @change="onOptionSourceChange(field)"
+                  >
+                    <el-option
+                      v-for="s in SELECT_OPTION_SOURCE_OPTIONS"
+                      :key="s.value"
+                      :label="s.label"
+                      :value="s.value"
+                    />
+                  </el-select>
+                </el-form-item>
+              </el-col>
+            </el-row>
+            <p v-if="isDynamicOptionSource(field.optionSource)" class="fce-source-tip">
+              {{ optionSourceDesc(field.optionSource) }}銆傛彁浜ゅ鎵规椂灏嗚嚜鍔ㄥ姞杞芥渶鏂版暟鎹紝鏃犻渶鎵嬪姩缁存姢閫夐」銆�
+            </p>
+            <template v-if="!isDynamicOptionSource(field.optionSource)">
+              <div class="fce-options-head">
+                <span class="fce-section-subtitle">鎵嬪姩閫夐」</span>
+                <el-button
+                  type="primary"
+                  link
+                  size="small"
+                  :icon="Plus"
+                  :disabled="isFieldLocked(field)"
+                  @click="addOption(field)"
+                >
+                  娣诲姞閫夐」
+                </el-button>
+              </div>
+              <div
+                v-for="(opt, oi) in field.options"
+                :key="oi"
+                class="fce-option-row"
+              >
+                <span class="fce-option-index">{{ oi + 1 }}</span>
+                <el-input
+                  v-model="opt.label"
+                  placeholder="鏄剧ず鏂囨湰"
+                  :disabled="isFieldLocked(field)"
+                  @input="emitOut"
+                />
+                <el-input
+                  v-model="opt.value"
+                  placeholder="閫夐」鍊�"
+                  class="fce-option-value"
+                  :disabled="isFieldLocked(field)"
+                  @input="emitOut"
+                />
+                <el-button
+                  type="danger"
+                  link
+                  :icon="Delete"
+                  :disabled="isFieldLocked(field) || field.options.length <= 1"
+                  @click="removeOption(field, oi)"
+                />
+              </div>
+            </template>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script setup>
+import { Bottom, Delete, Plus, Top } from "@element-plus/icons-vue";
+import {
+  getApprovalTemplateDetail,
+  listApprovalTemplate,
+  TEMPLATE_TYPE_BUILTIN,
+  TEMPLATE_TYPE_CUSTOM,
+} from "@/api/officeProcessAutomation/approvalTemplate.js";
+import { ElMessage, ElMessageBox } from "element-plus";
+import { computed, reactive, ref, watch } from "vue";
+import {
+  mapEnabledFromApi,
+  unwrapTemplateDetail,
+  unwrapTemplateList,
+} from "../approveTemplateConstants.js";
+import {
+  FORM_FIELD_TYPE_OPTIONS,
+  createEmptyFormConfigData,
+  createEmptyFormField,
+  formFieldTypeLabel,
+  parseFormConfigToData,
+} from "../formConfigUtils.js";
+import {
+  SELECT_OPTION_SOURCE,
+  SELECT_OPTION_SOURCE_OPTIONS,
+  isDynamicOptionSource,
+} from "../selectOptionSource.js";
+import { useSelectOptionSources } from "../useSelectOptionSources.js";
+
+const props = defineProps({
+  modelValue: { type: Object, default: () => createEmptyFormConfigData() },
+  /** 缂栬緫褰撳墠妯℃澘鏃舵帓闄よ嚜韬紝閬垮厤浠庤嚜宸卞鍏� */
+  excludeTemplateId: { type: [String, Number], default: null },
+  /** 绂佺敤銆屼粠宸叉湁妯℃澘瀵煎叆銆� */
+  disableImport: { type: Boolean, default: false },
+  /** 绯荤粺鍐呯疆妯℃澘缂栬緫鏃讹紝鎵撳紑寮圭獥鍗冲瓨鍦ㄧ殑濉姤椤� _uid锛屼笉鍙敼鍒� */
+  lockedFieldUids: { type: Array, default: () => [] },
+});
+
+const emit = defineEmits(["update:modelValue"]);
+
+const inner = reactive(createEmptyFormConfigData());
+
+const { loading: optionSourceLoading, ensureForFields, getOptions } = useSelectOptionSources();
+
+const templateImportOptions = ref([]);
+const templateImportLoading = ref(false);
+
+const lockedUidSet = computed(
+  () => new Set((props.lockedFieldUids || []).filter(Boolean))
+);
+
+function isFieldLocked(field) {
+  return field?._uid != null && lockedUidSet.value.has(field._uid);
+}
+
+function typeLabel(type) {
+  return formFieldTypeLabel(type);
+}
+
+function defaultPlaceholder(field) {
+  const name = field.label || "璇ュ瓧娈�";
+  return `閫夊~锛岄�夋嫨妯℃澘鏃跺皢棰勫~${name}`;
+}
+
+function optionSourceDesc(source) {
+  return SELECT_OPTION_SOURCE_OPTIONS.find((x) => x.value === source)?.desc || "";
+}
+
+function resolvedSelectOptions(field) {
+  if (field.type !== "select") return [];
+  return getOptions(field);
+}
+
+function syncFromProps(v) {
+  const src = v || createEmptyFormConfigData();
+  inner.summaryPlaceholder = src.summaryPlaceholder || "";
+  inner.fields = (src.fields || []).map((f) => ({
+    ...createEmptyFormField(),
+    ...f,
+    _uid: f._uid || createEmptyFormField()._uid,
+    optionSource: f.optionSource || SELECT_OPTION_SOURCE.STATIC,
+    options: (f.options || [{ label: "", value: "" }]).map((o) => ({ ...o })),
+  }));
+  ensureForFields(inner.fields);
+}
+
+function emitOut() {
+  emit("update:modelValue", {
+    summaryPlaceholder: inner.summaryPlaceholder,
+    fields: inner.fields.map((f) => ({
+      _uid: f._uid,
+      key: f.key,
+      label: f.label,
+      type: f.type,
+      required: f.required,
+      rows: f.rows,
+      min: f.min,
+      precision: f.precision,
+      defaultValue: cloneDefaultValue(f),
+      optionSource: f.optionSource || SELECT_OPTION_SOURCE.STATIC,
+      options: (f.options || []).map((o) => ({ label: o.label, value: o.value })),
+    })),
+  });
+}
+
+function cloneDefaultValue(f) {
+  if (f.type === "datetimerange" && Array.isArray(f.defaultValue)) {
+    return [...f.defaultValue];
+  }
+  return f.defaultValue;
+}
+
+watch(
+  () => props.modelValue,
+  (v) => syncFromProps(v),
+  { deep: true, immediate: true }
+);
+
+function addField() {
+  inner.fields.push(createEmptyFormField());
+  ensureForFields(inner.fields);
+  emitOut();
+}
+
+function removeField(index) {
+  if (isFieldLocked(inner.fields[index])) return;
+  inner.fields.splice(index, 1);
+  emitOut();
+}
+
+function moveField(index, delta) {
+  if (isFieldLocked(inner.fields[index])) return;
+  const next = index + delta;
+  if (next < 0 || next >= inner.fields.length) return;
+  if (isFieldLocked(inner.fields[next])) return;
+  const t = inner.fields[index];
+  inner.fields[index] = inner.fields[next];
+  inner.fields[next] = t;
+  emitOut();
+}
+
+function resetDefaultValueForType(field) {
+  if (field.type === "number") field.defaultValue = undefined;
+  else if (field.type === "datetimerange") field.defaultValue = [];
+  else field.defaultValue = "";
+}
+
+function onTypeChange(field) {
+  if (field.type === "select") {
+    if (!field.optionSource) field.optionSource = SELECT_OPTION_SOURCE.STATIC;
+    if (!field.options || !field.options.length) {
+      field.options = [{ label: "", value: "" }];
+    }
+    ensureForFields(inner.fields);
+  }
+  resetDefaultValueForType(field);
+  emitOut();
+}
+
+function onOptionSourceChange(field) {
+  field.defaultValue = "";
+  if (!isDynamicOptionSource(field.optionSource) && (!field.options || !field.options.length)) {
+    field.options = [{ label: "", value: "" }];
+  }
+  ensureForFields(inner.fields);
+  emitOut();
+}
+
+function addOption(field) {
+  field.options.push({ label: "", value: "" });
+  emitOut();
+}
+
+function removeOption(field, oi) {
+  if (field.options.length <= 1) return;
+  field.options.splice(oi, 1);
+  emitOut();
+}
+
+async function loadTemplateImportOptions() {
+  templateImportLoading.value = true;
+  try {
+    const [customRes, builtinRes] = await Promise.all([
+      listApprovalTemplate(TEMPLATE_TYPE_CUSTOM),
+      listApprovalTemplate(TEMPLATE_TYPE_BUILTIN),
+    ]);
+    const excludeId =
+      props.excludeTemplateId != null && props.excludeTemplateId !== ""
+        ? String(props.excludeTemplateId)
+        : "";
+    templateImportOptions.value = [...unwrapTemplateList(customRes), ...unwrapTemplateList(builtinRes)]
+      .filter((row) => row?.id != null && String(row.id) !== excludeId)
+      .map((row) => ({
+        id: row.id,
+        label: row.templateName || `妯℃澘 #${row.id}`,
+        enabled: mapEnabledFromApi(row.enabled),
+      }));
+  } catch {
+    templateImportOptions.value = [];
+    ElMessage.error("鍔犺浇瀹℃壒妯℃澘鍒楄〃澶辫触");
+  } finally {
+    templateImportLoading.value = false;
+  }
+}
+
+function onImportDropdownVisible(visible) {
+  if (props.disableImport) return;
+  if (visible) loadTemplateImportOptions();
+}
+
+async function importFromTemplate(templateId) {
+  if (!templateId) return;
+  if (inner.fields.length) {
+    try {
+      await ElMessageBox.confirm("灏嗚鐩栧綋鍓嶅~鎶ラ」閰嶇疆锛屾槸鍚︾户缁紵", "浠庢ā鏉垮鍏�", {
+        type: "warning",
+        confirmButtonText: "缁х画瀵煎叆",
+        cancelButtonText: "鍙栨秷",
+      });
+    } catch {
+      return;
+    }
+  }
+  templateImportLoading.value = true;
+  try {
+    const res = await getApprovalTemplateDetail(templateId);
+    const row = unwrapTemplateDetail(res);
+    const data = parseFormConfigToData(row?.formConfig);
+    if (!data.fields?.length) {
+      ElMessage.warning("璇ユā鏉挎湭閰嶇疆濉姤椤�");
+      return;
+    }
+    syncFromProps(data);
+    emitOut();
+    ElMessage.success(`宸插鍏ャ��${row.templateName || "妯℃澘"}銆嶇殑濉姤椤筦);
+  } catch {
+    ElMessage.error("鍔犺浇妯℃澘璇︽儏澶辫触");
+  } finally {
+    templateImportLoading.value = false;
+  }
+}
+</script>
+
+<style scoped>
+.fce {
+  width: 100%;
+}
+
+.fce-hint {
+  padding: 14px 16px;
+  margin-bottom: 14px;
+  border-radius: 10px;
+  background: linear-gradient(135deg, var(--el-color-primary-light-9) 0%, var(--el-fill-color-blank) 100%);
+  border: 1px solid var(--el-color-primary-light-7);
+}
+
+.fce-hint-label {
+  display: block;
+  font-size: 13px;
+  font-weight: 600;
+  color: var(--el-text-color-primary);
+  margin-bottom: 8px;
+}
+
+.fce-panel {
+  padding: 16px;
+  border-radius: 12px;
+  background: var(--el-fill-color-lighter);
+  border: 1px solid var(--el-border-color-lighter);
+}
+
+.fce-toolbar {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  flex-wrap: wrap;
+  gap: 12px;
+  margin-bottom: 16px;
+}
+
+.fce-toolbar-left {
+  display: flex;
+  align-items: center;
+  gap: 10px;
+}
+
+.fce-title {
+  font-size: 15px;
+  font-weight: 600;
+  color: var(--el-text-color-primary);
+}
+
+.fce-toolbar-actions {
+  display: flex;
+  align-items: center;
+  gap: 8px;
+}
+.import-tag {
+  margin-left: 8px;
+  vertical-align: middle;
+}
+
+.fce-empty {
+  padding: 24px 0;
+}
+
+.fce-list {
+  display: flex;
+  flex-direction: column;
+  gap: 14px;
+}
+
+.fce-card {
+  position: relative;
+  padding: 16px 16px 12px;
+  border-radius: 12px;
+  background: var(--el-bg-color);
+  border: 1px solid var(--el-border-color-lighter);
+  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.04);
+  transition: border-color 0.2s, box-shadow 0.2s;
+}
+
+.fce-card:hover {
+  border-color: var(--el-color-primary-light-5);
+  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.06);
+}
+
+.fce-card--required {
+  border-left: 3px solid var(--el-color-danger-light-3);
+}
+
+.fce-card--locked {
+  background: var(--el-fill-color-light);
+}
+
+.fce-card-badge {
+  position: absolute;
+  top: -10px;
+  left: 16px;
+  min-width: 22px;
+  height: 22px;
+  padding: 0 6px;
+  border-radius: 11px;
+  background: var(--el-color-primary);
+  color: #fff;
+  font-size: 12px;
+  font-weight: 700;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  box-shadow: 0 2px 6px rgba(var(--el-color-primary-rgb), 0.35);
+}
+
+.fce-card-head {
+  display: flex;
+  align-items: flex-start;
+  justify-content: space-between;
+  gap: 12px;
+  margin-bottom: 14px;
+  padding-top: 4px;
+}
+
+.fce-card-title {
+  display: flex;
+  flex-wrap: wrap;
+  align-items: center;
+  gap: 8px;
+  min-width: 0;
+}
+
+.fce-card-name {
+  font-size: 14px;
+  font-weight: 600;
+  color: var(--el-text-color-primary);
+}
+
+.fce-card-btns {
+  display: flex;
+  align-items: center;
+  gap: 4px;
+  flex-shrink: 0;
+}
+
+.fce-section {
+  margin-bottom: 12px;
+  padding-bottom: 12px;
+  border-bottom: 1px dashed var(--el-border-color-extra-light);
+}
+
+.fce-section:last-child {
+  margin-bottom: 0;
+  padding-bottom: 0;
+  border-bottom: none;
+}
+
+.fce-section-title {
+  display: block;
+  font-size: 12px;
+  font-weight: 600;
+  color: var(--el-text-color-secondary);
+  text-transform: uppercase;
+  letter-spacing: 0.5px;
+  margin-bottom: 10px;
+}
+
+.fce-section-desc {
+  margin: -6px 0 10px;
+  font-size: 12px;
+  color: var(--el-text-color-placeholder);
+  line-height: 1.5;
+}
+
+.fce-section--default {
+  padding: 12px 14px;
+  border-radius: 8px;
+  background: var(--el-fill-color-lighter);
+  border-bottom: none;
+  margin-bottom: 0;
+}
+
+.fce-section--default .fce-section-title {
+  margin-bottom: 4px;
+  color: var(--el-color-primary);
+  text-transform: none;
+  letter-spacing: 0;
+  font-size: 13px;
+}
+
+.fce-section--options {
+  padding-top: 4px;
+  border-bottom: none;
+  margin-bottom: 0;
+}
+
+.fce-field-item {
+  margin-bottom: 0;
+}
+
+.fce-field-item :deep(.el-form-item__label) {
+  font-size: 13px;
+  color: var(--el-text-color-regular);
+}
+
+.fce-field-item--switch :deep(.el-form-item__content) {
+  line-height: 32px;
+}
+
+.fce-options-head {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  margin-bottom: 10px;
+}
+
+.fce-options-head .fce-section-title,
+.fce-options-head .fce-section-subtitle {
+  margin-bottom: 0;
+}
+
+.fce-section-subtitle {
+  font-size: 12px;
+  font-weight: 600;
+  color: var(--el-text-color-secondary);
+}
+
+.fce-source-row {
+  margin-bottom: 4px;
+}
+
+.fce-source-tip {
+  margin: 0 0 10px;
+  font-size: 12px;
+  color: var(--el-text-color-secondary);
+  line-height: 1.5;
+}
+
+.fce-option-row {
+  display: flex;
+  align-items: center;
+  gap: 10px;
+  margin-bottom: 8px;
+  padding: 8px 10px;
+  border-radius: 8px;
+  background: var(--el-fill-color-lighter);
+}
+
+.fce-option-row:last-child {
+  margin-bottom: 0;
+}
+
+.fce-option-index {
+  flex-shrink: 0;
+  width: 20px;
+  height: 20px;
+  border-radius: 50%;
+  background: var(--el-color-info-light-8);
+  color: var(--el-text-color-secondary);
+  font-size: 11px;
+  font-weight: 600;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+
+.fce-option-value {
+  width: 140px;
+  flex-shrink: 0;
+}
+</style>
diff --git a/src/views/officeProcessAutomation/ApproveManage/approve-template/components/TemplateFlowEditor.vue b/src/views/officeProcessAutomation/ApproveManage/approve-template/components/TemplateFlowEditor.vue
new file mode 100644
index 0000000..78304ea
--- /dev/null
+++ b/src/views/officeProcessAutomation/ApproveManage/approve-template/components/TemplateFlowEditor.vue
@@ -0,0 +1,399 @@
+<!-- 瀹℃壒妯℃澘锛氬彲閰嶇疆鑺傜偣鏁帮紝姣忚妭鐐瑰浜� + 浼氱/鎴栫 -->
+<template>
+  <div class="tfe">
+    <div v-if="innerList.length" class="tfe-flow">
+      <div v-for="(item, index) in innerList" :key="item._uid" class="tfe-flow-item">
+        <div class="tfe-card" :class="{ 'tfe-card--empty': !item.approvers?.length }">
+          <div class="tfe-badge">{{ index + 1 }}</div>
+          <div class="tfe-head">
+            <span class="tfe-level">{{ levelText(index) }}</span>
+            <el-radio-group
+              v-if="!readonly"
+              v-model="item.signMode"
+              size="small"
+              @change="emitOut"
+            >
+              <el-radio-button value="countersign">浼氱</el-radio-button>
+              <el-radio-button value="or_sign">鎴栫</el-radio-button>
+            </el-radio-group>
+            <el-tag v-else size="small" type="info" effect="plain">
+              {{ signModeLabel(item.signMode) }}
+            </el-tag>
+          </div>
+          <p class="tfe-mode-tip">{{ signModeTip(item.signMode) }}</p>
+          <div v-if="!readonly" class="tfe-select">
+            <el-select
+              v-model="item.approverIds"
+              multiple
+              collapse-tags
+              collapse-tags-tooltip
+              :max-collapse-tags="2"
+              filterable
+              placeholder="璇烽�夋嫨瀹℃壒浜猴紙鍙閫夛級"
+              style="width: 100%"
+              @change="(ids) => onApproversChange(ids, item)"
+            >
+              <el-option
+                v-for="u in userOptions"
+                :key="String(u.userId ?? u.id)"
+                :label="optionLabel(u)"
+                :value="u.userId ?? u.id"
+              />
+            </el-select>
+          </div>
+          <div v-if="item.approvers?.length" class="tfe-chips" :class="{ 'tfe-chips--readonly': readonly }">
+            <el-tag
+              v-for="a in item.approvers"
+              :key="String(a.approverId)"
+              size="small"
+              type="info"
+              effect="plain"
+            >
+              {{ a.approverName || "鈥�" }}
+            </el-tag>
+          </div>
+          <div v-if="!readonly" class="tfe-actions">
+            <el-button type="primary" circle size="small" :disabled="index === 0" title="鍓嶇Щ" @click="moveLeft(index)">
+              <el-icon><ArrowLeft /></el-icon>
+            </el-button>
+            <el-button
+              type="primary"
+              circle
+              size="small"
+              :disabled="index === innerList.length - 1"
+              title="鍚庣Щ"
+              @click="moveRight(index)"
+            >
+              <el-icon><ArrowRight /></el-icon>
+            </el-button>
+            <el-button type="danger" circle size="small" title="鍒犻櫎鑺傜偣" @click="remove(index)">
+              <el-icon><Delete /></el-icon>
+            </el-button>
+          </div>
+          <p v-else-if="!item.approvers?.length" class="tfe-empty-approver">鏆傛棤瀹℃壒浜�</p>
+        </div>
+        <div v-if="index < innerList.length - 1" class="tfe-conn">
+          <div class="tfe-conn-line"></div>
+          <el-icon class="tfe-conn-icon"><ArrowRight /></el-icon>
+        </div>
+      </div>
+
+      <div v-if="!readonly" class="tfe-add-wrap">
+        <div v-if="innerList.length" class="tfe-conn">
+          <div class="tfe-conn-line"></div>
+          <el-icon class="tfe-conn-icon"><ArrowRight /></el-icon>
+        </div>
+        <div class="tfe-add-card" @click="addNode">
+          <div class="tfe-add-icon"><el-icon :size="26"><Plus /></el-icon></div>
+          <span>鏂板鑺傜偣</span>
+        </div>
+      </div>
+    </div>
+
+    <div v-else class="tfe-empty">
+      <el-icon :size="44" color="#c0c4cc"><User /></el-icon>
+      <p>鏆傛棤瀹℃壒鑺傜偣</p>
+      <el-button v-if="!readonly" type="primary" @click="addNode">娣诲姞绗竴涓妭鐐�</el-button>
+    </div>
+  </div>
+</template>
+
+<script setup>
+import { ArrowLeft, ArrowRight, Delete, Plus, User } from "@element-plus/icons-vue";
+import { ref, watch } from "vue";
+import { NODE_SIGN_MODE_OPTIONS, normalizeFlowNodes } from "../approveTemplateConstants.js";
+
+const props = defineProps({
+  modelValue: { type: Array, default: () => [] },
+  userOptions: { type: Array, default: () => [] },
+  /** 閫夋嫨妯℃澘鍚庣敵璇峰満鏅細浠呭睍绀猴紝涓嶅彲鏀瑰鎵逛汉/鑺傜偣 */
+  readonly: { type: Boolean, default: false },
+});
+
+const emit = defineEmits(["update:modelValue"]);
+
+const innerList = ref([]);
+
+function signModeTip(mode) {
+  return NODE_SIGN_MODE_OPTIONS.find((x) => x.value === mode)?.desc || "";
+}
+
+function signModeLabel(mode) {
+  return (
+    NODE_SIGN_MODE_OPTIONS.find((x) => x.value === mode)?.label ||
+    (mode === "or_sign" ? "鎴栫" : "浼氱")
+  );
+}
+
+function levelText(i) {
+  const t = ["绗竴绾�", "绗簩绾�", "绗笁绾�", "绗洓绾�", "绗簲绾�", "绗叚绾�", "绗竷绾�", "绗叓绾�"];
+  return t[i] || `绗�${i + 1}绾;
+}
+
+function optionLabel(u) {
+  const nick = u.nickName || "";
+  const un = u.userName || "";
+  if (nick && un && nick !== un) return `${nick}锛�${un}锛塦;
+  return nick || un || `鐢ㄦ埛${u.userId ?? u.id ?? ""}`;
+}
+
+function newUid() {
+  return `n_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;
+}
+
+function mapIn(rows) {
+  const normalized = normalizeFlowNodes(rows);
+  return normalized.map((n) => ({
+    _uid: newUid(),
+    id: n.id,
+    templateId: n.templateId,
+    nodeOrder: n.nodeOrder,
+    signMode: n.signMode,
+    approverIds: n.approvers.map((a) => a.approverId),
+    approvers: [...n.approvers],
+  }));
+}
+
+function publicShape(rows) {
+  return normalizeFlowNodes(
+    (rows || []).map((r) => ({
+      id: r.id,
+      templateId: r.templateId,
+      nodeOrder: r.nodeOrder,
+      signMode: r.signMode,
+      approvers: r.approvers || [],
+    }))
+  );
+}
+
+function emitOut() {
+  emit("update:modelValue", publicShape(innerList.value));
+}
+
+watch(
+  () => props.modelValue,
+  (v) => {
+    const next = publicShape(v || []);
+    if (JSON.stringify(next) === JSON.stringify(publicShape(innerList.value))) return;
+    innerList.value = mapIn(v || []);
+  },
+  { deep: true, immediate: true }
+);
+
+function findUser(id) {
+  if (id == null || id === "") return null;
+  return props.userOptions.find((u) => String(u.userId ?? u.id) === String(id)) ?? null;
+}
+
+function onApproversChange(ids, row) {
+  const idList = Array.isArray(ids) ? ids : [];
+  const prevById = new Map((row.approvers || []).map((a) => [String(a.approverId), a]));
+  row.approverIds = idList;
+  row.approvers = idList.map((id) => {
+    const prev = prevById.get(String(id));
+    const u = findUser(id);
+    const item = {
+      approverId: id,
+      approverName: u ? u.nickName || u.userName || "" : prev?.approverName || "",
+    };
+    if (prev?.id != null) item.id = prev.id;
+    if (prev?.nodeId != null) item.nodeId = prev.nodeId;
+    else if (row.id != null) item.nodeId = row.id;
+    if (prev?.templateId != null) item.templateId = prev.templateId;
+    else if (row.templateId != null) item.templateId = row.templateId;
+    return item;
+  });
+  emitOut();
+}
+
+function addNode() {
+  if (props.readonly) return;
+  innerList.value.push({
+    _uid: newUid(),
+    nodeOrder: innerList.value.length + 1,
+    signMode: "countersign",
+    approverIds: [],
+    approvers: [],
+  });
+  emitOut();
+}
+
+function remove(index) {
+  if (props.readonly) return;
+  innerList.value.splice(index, 1);
+  emitOut();
+}
+
+function moveLeft(index) {
+  if (props.readonly) return;
+  if (index < 1) return;
+  const t = innerList.value[index];
+  innerList.value[index] = innerList.value[index - 1];
+  innerList.value[index - 1] = t;
+  emitOut();
+}
+
+function moveRight(index) {
+  if (props.readonly) return;
+  if (index >= innerList.value.length - 1) return;
+  const t = innerList.value[index];
+  innerList.value[index] = innerList.value[index + 1];
+  innerList.value[index + 1] = t;
+  emitOut();
+}
+</script>
+
+<style scoped>
+.tfe {
+  width: 100%;
+}
+.tfe-flow {
+  display: flex;
+  align-items: flex-start;
+  flex-wrap: nowrap;
+  overflow-x: auto;
+  padding: 6px 0 10px;
+}
+.tfe-flow-item {
+  display: flex;
+  align-items: center;
+}
+.tfe-card {
+  width: 248px;
+  flex-shrink: 0;
+  border: 2px solid var(--el-border-color);
+  border-radius: 12px;
+  padding: 14px 12px 12px;
+  position: relative;
+  background: var(--el-bg-color);
+}
+.tfe-card--empty {
+  border-style: dashed;
+  background: var(--el-fill-color-lighter);
+}
+.tfe-badge {
+  position: absolute;
+  top: -8px;
+  left: 12px;
+  width: 22px;
+  height: 22px;
+  border-radius: 50%;
+  background: var(--el-color-primary);
+  color: #fff;
+  font-size: 12px;
+  font-weight: 700;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+.tfe-head {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  gap: 8px;
+  margin: 8px 0 4px;
+}
+.tfe-level {
+  font-size: 13px;
+  font-weight: 600;
+  color: var(--el-text-color-primary);
+}
+.tfe-mode-tip {
+  font-size: 11px;
+  color: var(--el-text-color-secondary);
+  margin: 0 0 10px;
+  line-height: 1.4;
+  min-height: 30px;
+}
+.tfe-select {
+  margin-bottom: 8px;
+}
+.tfe-chips {
+  display: flex;
+  flex-wrap: wrap;
+  gap: 4px;
+  margin-bottom: 8px;
+  min-height: 24px;
+}
+.tfe-chips--readonly {
+  margin-top: 4px;
+  margin-bottom: 0;
+}
+.tfe-empty-approver {
+  font-size: 12px;
+  color: var(--el-text-color-placeholder);
+  margin: 4px 0 0;
+}
+.tfe-actions {
+  display: flex;
+  justify-content: center;
+  gap: 8px;
+  padding-top: 10px;
+  border-top: 1px solid var(--el-border-color-lighter);
+}
+.tfe-conn {
+  display: flex;
+  align-items: center;
+  width: 40px;
+  flex-shrink: 0;
+  align-self: center;
+}
+.tfe-conn-line {
+  flex: 1;
+  height: 2px;
+  background: var(--el-border-color);
+}
+.tfe-conn-icon {
+  font-size: 14px;
+  color: var(--el-text-color-placeholder);
+  margin-left: -2px;
+}
+.tfe-add-wrap {
+  display: flex;
+  align-items: center;
+}
+.tfe-add-card {
+  width: 120px;
+  min-height: 200px;
+  flex-shrink: 0;
+  border: 2px dashed var(--el-border-color);
+  border-radius: 12px;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+  gap: 10px;
+  cursor: pointer;
+  color: var(--el-text-color-regular);
+  font-size: 13px;
+  background: var(--el-fill-color-lighter);
+  transition: border-color 0.2s, background 0.2s;
+}
+.tfe-add-card:hover {
+  border-color: var(--el-color-primary);
+  background: var(--el-color-primary-light-9);
+  color: var(--el-color-primary);
+}
+.tfe-add-icon {
+  width: 44px;
+  height: 44px;
+  border-radius: 50%;
+  background: var(--el-color-primary);
+  color: #fff;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+.tfe-empty {
+  text-align: center;
+  padding: 28px 16px;
+  border: 1px dashed var(--el-border-color);
+  border-radius: 12px;
+  background: var(--el-fill-color-lighter);
+}
+.tfe-empty p {
+  margin: 10px 0 14px;
+  color: var(--el-text-color-secondary);
+  font-size: 14px;
+}
+</style>
diff --git a/src/views/officeProcessAutomation/ApproveManage/approve-template/formConfigUtils.js b/src/views/officeProcessAutomation/ApproveManage/approve-template/formConfigUtils.js
new file mode 100644
index 0000000..c1f66bd
--- /dev/null
+++ b/src/views/officeProcessAutomation/ApproveManage/approve-template/formConfigUtils.js
@@ -0,0 +1,301 @@
+import { mapAttachmentsFromApi } from "./approveTemplateConstants.js";
+import {
+  isDynamicOptionSource,
+  SELECT_OPTION_SOURCE,
+  selectOptionSourceLabel,
+} from "./selectOptionSource.js";
+
+export { selectOptionSourceLabel };
+
+/** 濉姤椤圭被鍨嬶紙涓庡鎵规彁浜ら〉 field.type 涓�鑷达級 */
+export const FORM_FIELD_TYPE_OPTIONS = [
+  { value: "text", label: "鍗曡鏂囨湰" },
+  { value: "textarea", label: "澶氳鏂囨湰" },
+  { value: "number", label: "鏁板瓧" },
+  { value: "date", label: "鏃ユ湡" },
+  { value: "datetimerange", label: "鏃ユ湡鏃堕棿鑼冨洿" },
+  { value: "select", label: "涓嬫媺閫夋嫨" },
+];
+
+/** 甯哥敤棰勮锛堝璐圭敤鎶ラ攢锛� */
+export const FORM_CONFIG_PRESETS = [
+  {
+    key: "cost_reimburse",
+    label: "璐圭敤鎶ラ攢",
+    summaryPlaceholder: "璇峰~鍐欐姤閿�浜嬬敱銆侀噾棰濈瓑",
+    fields: [
+      { key: "summary", label: "鎶ラ攢璇存槑", type: "textarea", required: true, rows: 3 },
+      { key: "amount", label: "鎶ラ攢閲戦(鍏�)", type: "number", required: true, min: 0, precision: 2 },
+    ],
+  },
+  {
+    key: "travel_reimburse",
+    label: "宸梾鎶ラ攢",
+    summaryPlaceholder: "鍑哄樊琛岀▼涓庤垂鐢ㄨ鏄�",
+    fields: [
+      { key: "summary", label: "宸梾璇存槑", type: "textarea", required: true, rows: 3 },
+      { key: "amount", label: "鎶ラ攢閲戦(鍏�)", type: "number", required: true, min: 0, precision: 2 },
+      { key: "tripDays", label: "鍑哄樊澶╂暟", type: "number", required: false, min: 0, precision: 0 },
+    ],
+  },
+  {
+    key: "leave",
+    label: "璇峰亣鐢宠",
+    summaryPlaceholder: "璇峰~鍐欒鍋囩被鍨嬩笌鏃堕棿",
+    fields: [
+      {
+        key: "leaveType",
+        label: "璇峰亣绫诲瀷",
+        type: "select",
+        required: true,
+        options: [
+          { label: "骞村亣", value: "annual" },
+          { label: "鐥呭亣", value: "sick" },
+          { label: "浜嬪亣", value: "personal" },
+          { label: "璋冧紤", value: "compensatory" },
+        ],
+      },
+      { key: "summary", label: "璇峰亣浜嬬敱", type: "textarea", required: true, rows: 2 },
+      { key: "dateRange", label: "璇峰亣鏃堕棿", type: "datetimerange", required: true },
+    ],
+  },
+];
+
+function newFieldUid() {
+  return `f_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
+}
+
+export function createEmptyFormField() {
+  return {
+    _uid: newFieldUid(),
+    key: "",
+    label: "",
+    type: "text",
+    required: true,
+    rows: 3,
+    min: 0,
+    precision: 0,
+    defaultValue: "",
+    optionSource: SELECT_OPTION_SOURCE.STATIC,
+    options: [{ label: "", value: "" }],
+  };
+}
+
+/** 瑙f瀽鍗曢」榛樿鍊硷紙渚涙彁浜ら〉 formPayload 鍒濆鍖栵級 */
+export function resolveFieldDefaultValue(field) {
+  const type = field?.type || "text";
+  const dv = field?.defaultValue;
+  if (dv === undefined || dv === null || dv === "") {
+    if (type === "number") return undefined;
+    if (type === "datetimerange") return [];
+    return "";
+  }
+  if (type === "number") {
+    const n = Number(dv);
+    return Number.isNaN(n) ? undefined : n;
+  }
+  if (type === "datetimerange") {
+    return Array.isArray(dv) ? [...dv] : [];
+  }
+  return dv;
+}
+
+function hasDefaultValue(field) {
+  const type = field?.type || "text";
+  const dv = field?.defaultValue;
+  if (dv === undefined || dv === null) return false;
+  if (type === "number") return dv !== "" && !Number.isNaN(Number(dv));
+  if (type === "datetimerange") return Array.isArray(dv) && dv.length === 2;
+  if (type === "select") return dv !== "";
+  return String(dv).trim() !== "";
+}
+
+/** 鏍规嵁瀛楁瀹氫箟鐢熸垚 formPayload 鍒濆鍊硷紙鍚粯璁ゅ�硷級 */
+export function buildFormPayloadFromFields(fields) {
+  const payload = {};
+  (fields || []).forEach((f) => {
+    const key = (f.key || "").trim();
+    if (!key) return;
+    payload[key] = resolveFieldDefaultValue(f);
+  });
+  return payload;
+}
+
+export function createEmptyFormConfigData() {
+  return {
+    summaryPlaceholder: "",
+    fields: [],
+  };
+}
+
+function parseFormConfigRaw(formConfig) {
+  if (!formConfig) return {};
+  if (typeof formConfig === "object") return formConfig;
+  try {
+    return JSON.parse(formConfig);
+  } catch {
+    return {};
+  }
+}
+
+function normalizeDefaultValueFromApi(f) {
+  const type = f.type || "text";
+  if (f.defaultValue === undefined || f.defaultValue === null) {
+    if (type === "number") return undefined;
+    if (type === "datetimerange") return [];
+    return "";
+  }
+  if (type === "datetimerange" && Array.isArray(f.defaultValue)) {
+    return [...f.defaultValue];
+  }
+  return f.defaultValue;
+}
+
+/** 鎺ュ彛 formConfig 鈫� 缂栬緫鍣ㄦ暟鎹� */
+export function parseFormConfigToData(formConfig) {
+  const raw = parseFormConfigRaw(formConfig);
+  const fields = (raw.fields || raw.formFields || []).map((f) => ({
+    _uid: newFieldUid(),
+    key: f.key || "",
+    label: f.label || "",
+    type: f.type || "text",
+    required: f.required !== false,
+    rows: f.rows ?? 3,
+    min: f.min ?? 0,
+    precision: f.precision ?? 0,
+    defaultValue: normalizeDefaultValueFromApi(f),
+    optionSource: f.optionSource || SELECT_OPTION_SOURCE.STATIC,
+    options: (f.options || []).length
+      ? f.options.map((o) => ({ label: o.label || "", value: o.value ?? "" }))
+      : [{ label: "", value: "" }],
+  }));
+  return {
+    summaryPlaceholder: raw.summaryPlaceholder || "",
+    fields,
+  };
+}
+
+/** 缂栬緫鍣ㄦ暟鎹� 鈫� 鎻愪氦鐢� JSON 瀛楃涓� */
+export function buildFormConfigJson(formConfigData) {
+  const data = formConfigData || createEmptyFormConfigData();
+  const fields = (data.fields || []).map((f) => {
+    const item = {
+      key: (f.key || "").trim(),
+      label: (f.label || "").trim(),
+      type: f.type || "text",
+      required: f.required !== false,
+    };
+    if (item.type === "textarea") item.rows = Number(f.rows) || 3;
+    if (item.type === "number") {
+      item.min = f.min ?? 0;
+      item.precision = f.precision ?? 0;
+    }
+    if (item.type === "select") {
+      const source = f.optionSource || SELECT_OPTION_SOURCE.STATIC;
+      item.optionSource = source;
+      if (!isDynamicOptionSource(source)) {
+        item.options = (f.options || [])
+          .filter((o) => (o.label || "").trim() || (o.value !== "" && o.value != null))
+          .map((o) => ({ label: (o.label || "").trim(), value: o.value }));
+      }
+    }
+    if (hasDefaultValue(f)) {
+      item.defaultValue =
+        f.type === "datetimerange" && Array.isArray(f.defaultValue)
+          ? f.defaultValue
+          : f.defaultValue;
+    }
+    return item;
+  });
+  const payload = {
+    summaryPlaceholder: (data.summaryPlaceholder || "").trim(),
+    fields,
+  };
+  return JSON.stringify(payload);
+}
+
+export function applyFormConfigPreset(presetKey) {
+  const preset = FORM_CONFIG_PRESETS.find((p) => p.key === presetKey);
+  if (!preset) return createEmptyFormConfigData();
+  return parseFormConfigToData({
+    summaryPlaceholder: preset.summaryPlaceholder,
+    fields: preset.fields,
+  });
+}
+
+export function validateFormConfigData(formConfigData) {
+  const fields = formConfigData?.fields || [];
+  if (!fields.length) {
+    return { ok: true };
+  }
+  const keys = new Set();
+  for (let i = 0; i < fields.length; i++) {
+    const f = fields[i];
+    const key = (f.key || "").trim();
+    const label = (f.label || "").trim();
+    if (!key) return { ok: false, message: `璇峰~鍐欑 ${i + 1} 涓~鎶ラ」鐨勫瓧娈垫爣璇哷 };
+    if (!label) return { ok: false, message: `璇峰~鍐欑 ${i + 1} 涓~鎶ラ」鐨勬樉绀哄悕绉癭 };
+    if (keys.has(key)) return { ok: false, message: `瀛楁鏍囪瘑銆�${key}銆嶉噸澶嶏紝璇蜂慨鏀筦 };
+    keys.add(key);
+    if (f.type === "select") {
+      const source = f.optionSource || SELECT_OPTION_SOURCE.STATIC;
+      if (isDynamicOptionSource(source)) continue;
+      const opts = (f.options || []).filter((o) => (o.label || "").trim() && o.value !== "" && o.value != null);
+      if (!opts.length) return { ok: false, message: `璇蜂负銆�${label}銆嶉厤缃嚦灏戜竴涓笅鎷夐�夐」` };
+    }
+  }
+  return { ok: true };
+}
+
+export function formFieldTypeLabel(type) {
+  return FORM_FIELD_TYPE_OPTIONS.find((x) => x.value === type)?.label || type || "鈥�";
+}
+
+export function formatDefaultValueDisplay(field) {
+  const dv = field?.defaultValue;
+  if (dv === undefined || dv === null || dv === "") return "鈥�";
+  if (field?.type === "datetimerange" && Array.isArray(dv)) {
+    return dv.length === 2 ? `${dv[0]} ~ ${dv[1]}` : "鈥�";
+  }
+  if (field?.type === "select") {
+    if (isDynamicOptionSource(field.optionSource)) {
+      return `${selectOptionSourceLabel(field.optionSource)}锛�${String(dv)}`;
+    }
+    const opt = (field.options || []).find((o) => String(o.value) === String(dv));
+    return opt?.label || String(dv);
+  }
+  return String(dv);
+}
+
+/** 灏嗗悗绔ā鏉胯杞负鎻愪氦椤垫ā鏉跨粨鏋勶紙鍚� fields 榛樿鍊笺�侀檮浠讹級 */
+export function buildSubmitTemplateFromRow(row) {
+  const cfg = parseFormConfigToData(row?.formConfig);
+  const fields = (cfg.fields || []).map(({ _uid, ...rest }) => ({
+    ...rest,
+    key: rest.key,
+    label: rest.label,
+    type: rest.type,
+    required: rest.required,
+    rows: rest.rows,
+    min: rest.min,
+    precision: rest.precision,
+    defaultValue: rest.defaultValue,
+    optionSource: rest.optionSource,
+    options: rest.options,
+  }));
+  return {
+    label: row?.templateName || "瀹℃壒",
+    businessType: row?.businessType ?? cfg.approvalType ?? "",
+    approvalType: cfg.approvalType || "",
+    summaryPlaceholder: cfg.summaryPlaceholder || "",
+    approvalMode: cfg.approvalMode || "parallel",
+    fields,
+    storageBlobDTOs: mapAttachmentsFromApi(row),
+  };
+}
+
+export function formConfigFieldsSummary(formConfigData) {
+  const fields = formConfigData?.fields || [];
+  if (!fields.length) return "鈥�";
+  return fields.map((f) => f.label || f.key || "鏈懡鍚�").join("銆�");
+}
diff --git a/src/views/officeProcessAutomation/ApproveManage/approve-template/index.vue b/src/views/officeProcessAutomation/ApproveManage/approve-template/index.vue
new file mode 100644
index 0000000..d094c13
--- /dev/null
+++ b/src/views/officeProcessAutomation/ApproveManage/approve-template/index.vue
@@ -0,0 +1,819 @@
+<!--OA妯″潡锛氬鎵规ā鏉�-->
+
+<template>
+
+  <div class="app-container approve-template-page">
+
+    <div class="search_form mb20">
+
+      <div class="search_fields">
+
+        <span class="search_title">妯℃澘鍚嶇О锛�</span>
+
+        <el-input
+
+          v-model="searchForm.keyword"
+
+          style="width: 220px"
+
+          placeholder="鎼滅储鍚嶇О鎴栬鏄�"
+
+          clearable
+
+          :prefix-icon="Search"
+
+          @keyup.enter="handleQuery"
+
+        />
+
+        <el-checkbox v-model="searchForm.enabledOnly" class="ml12" @change="handleQuery">
+
+          浠呮樉绀哄惎鐢�
+
+        </el-checkbox>
+
+        <el-button type="primary" :icon="Search" class="ml10" @click="handleQuery">鎼滅储</el-button>
+
+        <el-button :icon="RefreshRight" @click="resetSearch">閲嶇疆</el-button>
+
+      </div>
+
+      <div class="search_actions">
+
+        <el-button type="primary" :icon="Plus" @click="openFormDialog('add')">鏂板缓妯℃澘</el-button>
+
+      </div>
+
+    </div>
+
+
+
+    <div class="table_list">
+
+      <PIMTable
+
+        rowKey="id"
+
+        :column="tableColumn"
+
+        :tableData="tableData"
+
+        :page="page"
+
+        :isSelection="false"
+
+        :tableLoading="tableLoading"
+
+        :total="page.total"
+
+        @pagination="pagination"
+
+      />
+
+    </div>
+
+
+
+    <!-- 鏂板缓 / 缂栬緫 -->
+
+    <el-dialog
+
+      v-model="formDialog.visible"
+
+      :title="formDialog.title"
+
+      width="1020px"
+
+      append-to-body
+
+      destroy-on-close
+
+      class="template-form-dialog"
+
+      @closed="onFormDialogClosed"
+
+    >
+
+      <el-form
+
+        v-if="formDialog.visible"
+
+        ref="formRef"
+
+        :model="form"
+
+        :rules="formRules"
+
+        label-width="100px"
+
+      >
+
+        <el-row :gutter="20">
+
+          <el-col :span="8">
+
+            <el-form-item label="妯℃澘鍚嶇О" prop="templateName">
+
+              <el-input
+                v-model="form.templateName"
+                placeholder="濡傦細椤圭洰绔嬮」瀹℃壒"
+                maxlength="50"
+                show-word-limit
+                :disabled="isEditingBuiltin"
+              />
+
+            </el-form-item>
+
+          </el-col>
+
+          <el-col :span="8">
+
+            <el-form-item label="妯℃澘绫诲瀷" prop="businessType">
+
+              <el-select
+                v-model="form.businessType"
+                placeholder="璇烽�夋嫨"
+                style="width: 100%"
+                :disabled="isEditingBuiltin"
+              >
+
+                <el-option
+
+                  v-for="opt in templateTypeOptions"
+
+                  :key="`tpl-type-${opt.value}`"
+
+                  :label="opt.label"
+
+                  :value="opt.value"
+
+                />
+
+              </el-select>
+
+            </el-form-item>
+
+          </el-col>
+
+          <el-col :span="8">
+
+            <el-form-item label="鍚敤鐘舵��">
+
+              <el-switch v-model="form.enabled" active-text="鍚敤" inactive-text="鍋滅敤" />
+
+            </el-form-item>
+
+          </el-col>
+
+        </el-row>
+
+        <el-form-item label="妯℃澘璇存槑">
+
+          <el-input
+
+            v-model="form.description"
+
+            type="textarea"
+
+            :rows="2"
+
+            placeholder="绠�瑕佽鏄庤妯℃澘鐨勯�傜敤鍦烘櫙"
+
+            maxlength="200"
+
+            show-word-limit
+
+          />
+
+        </el-form-item>
+
+        <el-form-item label="濉姤閰嶇疆">
+
+          <FormConfigEditor
+            v-model="form.formConfigData"
+            :exclude-template-id="form.id"
+            :disable-import="isEditingBuiltin"
+            :locked-field-uids="isEditingBuiltin ? form.lockedFormFieldUids : []"
+          />
+
+          <p class="flow-tip">閰嶇疆鎻愪氦瀹℃壒鏃堕渶濉啓鐨勮〃鍗曢」锛屼繚瀛樺悗鍐欏叆 formConfig锛圝SON锛夈��</p>
+
+        </el-form-item>
+
+        <el-form-item label="瀹℃壒娴佺▼" required>
+
+          <TemplateFlowEditor v-model="form.flowNodes" :user-options="flowUserOptions" />
+
+          <p class="flow-tip">
+
+            鎸夐『搴忔祦杞細鍙负姣忎釜鑺傜偣娣诲姞澶氬悕瀹℃壒浜猴紱浼氱闇�鍏ㄩ儴閫氳繃锛屾垨绛句换涓�浜洪�氳繃鍗冲彲杩涘叆涓嬩竴鑺傜偣銆�
+
+          </p>
+
+        </el-form-item>
+
+        <el-form-item label="闄勪欢">
+
+          <div class="upload-block">
+
+            <FileUpload v-model:file-list="form.storageBlobDTOs" :limit="10" button-text="鐐瑰嚮閫夋嫨鏂囦欢" />
+
+          </div>
+
+          <p class="flow-tip">鍙笂浼犳ā鏉胯鏄庢枃妗c�佸埗搴︽枃浠剁瓑锛堥�夊~锛夈��</p>
+
+        </el-form-item>
+
+      </el-form>
+
+      <template #footer>
+
+        <el-button type="primary" @click="onSubmitForm">淇� 瀛�</el-button>
+
+        <el-button @click="formDialog.visible = false">鍙� 娑�</el-button>
+
+      </template>
+
+    </el-dialog>
+
+
+
+    <!-- 璇︽儏 -->
+
+    <el-dialog v-model="detailDialog.visible" title="妯℃澘璇︽儏" width="880px" append-to-body destroy-on-close>
+
+      <div v-loading="detailLoading" class="detail-dialog-body">
+
+      <el-descriptions :column="2" border>
+
+        <el-descriptions-item label="妯℃澘鍚嶇О">{{ detailRow.templateName }}</el-descriptions-item>
+
+        <el-descriptions-item label="妯℃澘绫诲瀷">{{ templateTypeLabel(detailRow.businessType) }}</el-descriptions-item>
+
+        <el-descriptions-item label="鐘舵��">
+
+          <el-tag :type="detailRow.enabled !== false ? 'success' : 'info'" size="small">
+
+            {{ detailRow.enabled !== false ? "鍚敤" : "鍋滅敤" }}
+
+          </el-tag>
+
+        </el-descriptions-item>
+
+        <el-descriptions-item label="璇存槑" :span="2">{{ detailRow.description || "鈥�" }}</el-descriptions-item>
+
+        <el-descriptions-item label="濉姤鎻愮ず" :span="2">
+
+          {{ detailFormConfig.summaryPlaceholder || "鈥�" }}
+
+        </el-descriptions-item>
+
+        <el-descriptions-item label="鍒涘缓浜�">{{ detailRow.createdUserName || "鈥�" }}</el-descriptions-item>
+
+        <el-descriptions-item label="鍒涘缓鏃堕棿">{{ formatDisplayTime(detailRow.createdTime) }}</el-descriptions-item>
+
+        <el-descriptions-item label="鏇存柊鏃堕棿">{{ formatDisplayTime(detailRow.updatedTime) }}</el-descriptions-item>
+
+      </el-descriptions>
+
+      <el-divider content-position="left">濉姤椤癸紙{{ detailFormConfig.fields?.length || 0 }} 椤癸級</el-divider>
+
+      <el-table
+
+        v-if="detailFormConfig.fields?.length"
+
+        :data="detailFormConfig.fields"
+
+        border
+
+        size="small"
+
+        class="mb16"
+
+      >
+
+        <el-table-column prop="label" label="鏄剧ず鍚嶇О" min-width="120" />
+
+        <el-table-column prop="key" label="瀛楁鏍囪瘑" min-width="100" />
+
+        <el-table-column label="绫诲瀷" width="100">
+
+          <template #default="{ row }">{{ formFieldTypeLabel(row.type) }}</template>
+
+        </el-table-column>
+
+        <el-table-column label="閫夐」鏉ユ簮" width="100">
+
+          <template #default="{ row }">
+
+            {{ row.type === 'select' ? selectOptionSourceLabel(row.optionSource) : '鈥�' }}
+
+          </template>
+
+        </el-table-column>
+
+        <el-table-column label="蹇呭~" width="70" align="center">
+
+          <template #default="{ row }">{{ row.required !== false ? "鏄�" : "鍚�" }}</template>
+
+        </el-table-column>
+
+        <el-table-column label="榛樿鍊�" min-width="120" show-overflow-tooltip>
+
+          <template #default="{ row }">{{ formatDefaultValueDisplay(row) }}</template>
+
+        </el-table-column>
+
+      </el-table>
+
+      <el-empty v-else description="鏈厤缃~鎶ラ」" :image-size="48" class="mb16" />
+
+      <el-divider content-position="left">瀹℃壒娴佺▼锛坽{ detailRow.flowNodes?.length || 0 }} 涓妭鐐癸級</el-divider>
+
+      <div v-if="detailRow.flowNodes?.length" class="detail-flow">
+
+        <div v-for="(node, index) in detailRow.flowNodes" :key="index" class="detail-node">
+
+          <div class="detail-node-head">
+
+            <span class="detail-node-order">鑺傜偣 {{ index + 1 }}</span>
+
+            <el-tag size="small" :type="node.signMode === 'or_sign' ? 'warning' : 'primary'">
+
+              {{ nodeSignModeLabel(node.signMode) }}
+
+            </el-tag>
+
+          </div>
+
+          <div class="detail-approvers">
+
+            <el-tag
+
+              v-for="a in node.approvers"
+
+              :key="String(a.approverId)"
+
+              class="detail-approver-tag"
+
+              effect="plain"
+
+            >
+
+              {{ a.approverName || "鈥�" }}
+
+            </el-tag>
+
+            <span v-if="!node.approvers?.length" class="text-muted">鏈厤缃鎵逛汉</span>
+
+          </div>
+
+          <el-icon v-if="index < detailRow.flowNodes.length - 1" class="detail-arrow"><ArrowRight /></el-icon>
+
+        </div>
+
+      </div>
+
+      <el-empty v-else description="鏆傛棤娴佺▼鑺傜偣" :image-size="60" />
+
+      <el-divider content-position="left">闄勪欢锛坽{ detailAttachments.length }} 涓級</el-divider>
+
+      <template v-if="detailAttachments.length">
+
+        <el-tag
+
+          v-for="(f, i) in detailAttachments"
+
+          :key="i"
+
+          class="detail-attachment-tag"
+
+          type="info"
+
+          effect="plain"
+
+        >
+
+          {{ attachmentDisplayName(f) }}
+
+        </el-tag>
+
+      </template>
+
+      <el-empty v-else description="鏆傛棤闄勪欢" :image-size="48" />
+
+      </div>
+
+      <template #footer>
+
+        <el-button @click="detailDialog.visible = false">鍏� 闂�</el-button>
+
+        <el-button type="primary" @click="editFromDetail">缂� 杈�</el-button>
+
+      </template>
+
+    </el-dialog>
+
+  </div>
+
+</template>
+
+
+
+<script setup>
+
+import { ArrowRight, Plus, RefreshRight } from "@element-plus/icons-vue";
+
+import { ElMessage } from "element-plus";
+
+import { computed, nextTick, onMounted, ref } from "vue";
+
+import { userListNoPageByTenantId } from "@/api/system/user.js";
+
+import FileUpload from "@/components/AttachmentUpload/file/index.vue";
+
+import FormConfigEditor from "./components/FormConfigEditor.vue";
+
+import TemplateFlowEditor from "./components/TemplateFlowEditor.vue";
+
+import { formatDisplayTime, mapAttachmentsFromApi } from "./approveTemplateConstants.js";
+
+import { formatDefaultValueDisplay, formFieldTypeLabel, parseFormConfigToData } from "./formConfigUtils.js";
+import { selectOptionSourceLabel } from "./selectOptionSource.js";
+
+import { useApproveTemplate } from "./useApproveTemplate.js";
+
+
+
+const {
+
+  Search,
+
+  templateTypeOptions,
+
+  loadTemplateTypeOptions,
+
+  templateTypeLabel,
+
+  nodeSignModeLabel,
+
+  searchForm,
+
+  tableLoading,
+
+  page,
+
+  tableData,
+
+  tableColumn,
+
+  formDialog,
+
+  form,
+
+  formRef,
+
+  formRules,
+
+  isEditingBuiltin,
+
+  detailDialog,
+
+  detailRow,
+
+  detailLoading,
+
+  fetchTemplateList,
+
+  handleQuery,
+
+  resetSearch,
+
+  pagination,
+
+  openFormDialog,
+
+  openDetail,
+
+  submitForm,
+
+} = useApproveTemplate();
+
+
+
+const flowUserOptions = ref([]);
+
+
+
+const detailFormConfig = computed(() =>
+
+  parseFormConfigToData(detailRow.value?.formConfigData ?? detailRow.value?.formConfig)
+
+);
+
+
+
+const detailAttachments = computed(() => mapAttachmentsFromApi(detailRow.value));
+
+
+
+function attachmentDisplayName(file) {
+
+  if (!file) return "鏈懡鍚�";
+
+  return file.name || file.originalFilename || file.fileName || "鏈懡鍚�";
+
+}
+
+
+
+function unwrapArray(payload) {
+
+  if (Array.isArray(payload)) return payload;
+
+  if (payload?.data && Array.isArray(payload.data)) return payload.data;
+
+  if (payload?.rows && Array.isArray(payload.rows)) return payload.rows;
+
+  return [];
+
+}
+
+
+
+function isActiveUser(u) {
+
+  if (u.delFlag === "2" || u.delFlag === 2) return false;
+
+  if (u.status == null) return true;
+
+  return String(u.status) === "0";
+
+}
+
+
+
+async function loadUsers() {
+
+  try {
+
+    const res = await userListNoPageByTenantId();
+
+    flowUserOptions.value = unwrapArray(res).filter(isActiveUser);
+
+  } catch {
+
+    flowUserOptions.value = [];
+
+  }
+
+}
+
+
+
+async function onSubmitForm() {
+
+  const ret = await submitForm();
+
+  if (ret?.message) {
+
+    ElMessage.warning(ret.message);
+
+    return;
+
+  }
+
+  if (ret?.ok) ElMessage.success("淇濆瓨鎴愬姛");
+
+}
+
+
+
+function onFormDialogClosed() {
+
+  formRef.value?.resetFields?.();
+
+}
+
+
+
+async function editFromDetail() {
+
+  const row = detailRow.value;
+
+  detailDialog.visible = false;
+
+  await nextTick();
+
+  openFormDialog("edit", row);
+
+}
+
+
+
+onMounted(() => {
+
+  loadUsers();
+
+  loadTemplateTypeOptions();
+
+  fetchTemplateList();
+
+});
+
+</script>
+
+
+
+<style scoped>
+
+.mb20 {
+
+  margin-bottom: 20px;
+
+}
+
+.mb16 {
+
+  margin-bottom: 16px;
+
+}
+
+.mb16.el-empty {
+
+  padding: 8px 0;
+
+}
+
+.ml10 {
+
+  margin-left: 10px;
+
+}
+
+.ml12 {
+
+  margin-left: 12px;
+
+}
+
+.search_form {
+
+  display: flex;
+
+  flex-wrap: wrap;
+
+  align-items: center;
+
+  justify-content: space-between;
+
+  gap: 12px;
+
+}
+
+.search_fields {
+
+  display: flex;
+
+  flex-wrap: wrap;
+
+  align-items: center;
+
+  gap: 4px;
+
+}
+
+.search_actions {
+
+  display: flex;
+
+  gap: 8px;
+
+}
+
+.flow-tip {
+
+  font-size: 12px;
+
+  color: var(--el-text-color-secondary);
+
+  margin: 8px 0 0;
+
+  line-height: 1.5;
+
+}
+
+.detail-flow {
+
+  display: flex;
+
+  flex-wrap: wrap;
+
+  align-items: flex-start;
+
+  gap: 8px;
+
+}
+
+.detail-node {
+
+  position: relative;
+
+  min-width: 180px;
+
+  max-width: 240px;
+
+  padding: 12px;
+
+  border: 1px solid var(--el-border-color-lighter);
+
+  border-radius: 8px;
+
+  background: var(--el-fill-color-lighter);
+
+}
+
+.detail-node-head {
+
+  display: flex;
+
+  align-items: center;
+
+  justify-content: space-between;
+
+  margin-bottom: 8px;
+
+}
+
+.detail-node-order {
+
+  font-weight: 600;
+
+  font-size: 13px;
+
+}
+
+.detail-approvers {
+
+  display: flex;
+
+  flex-wrap: wrap;
+
+  gap: 4px;
+
+}
+
+.detail-approver-tag {
+
+  margin: 0;
+
+}
+
+.detail-arrow {
+
+  position: absolute;
+
+  right: -20px;
+
+  top: 50%;
+
+  transform: translateY(-50%);
+
+  color: var(--el-text-color-placeholder);
+
+}
+
+.detail-dialog-body {
+
+  min-height: 120px;
+
+}
+
+.upload-block {
+
+  width: 100%;
+
+}
+
+.detail-attachment-tag {
+
+  margin: 0 8px 8px 0;
+
+}
+
+.text-muted {
+
+  font-size: 12px;
+
+  color: var(--el-text-color-placeholder);
+
+}
+
+.template-form-dialog :deep(.el-dialog__body) {
+
+  padding-top: 8px;
+
+}
+
+</style>
+
diff --git a/src/views/officeProcessAutomation/ApproveManage/approve-template/selectOptionSource.js b/src/views/officeProcessAutomation/ApproveManage/approve-template/selectOptionSource.js
new file mode 100644
index 0000000..99706b4
--- /dev/null
+++ b/src/views/officeProcessAutomation/ApproveManage/approve-template/selectOptionSource.js
@@ -0,0 +1,140 @@
+import { deptTreeSelect, userListNoPageByTenantId } from "@/api/system/user.js";
+
+/** 涓嬫媺閫夐」鏉ユ簮锛堝啓鍏� formConfig锛屾彁浜ら〉鎸夋潵婧愭媺鍙栨暟鎹級 */
+export const SELECT_OPTION_SOURCE = {
+  STATIC: "static",
+  USER: "user",
+  DEPT: "dept",
+};
+
+export const SELECT_OPTION_SOURCE_OPTIONS = [
+  { value: SELECT_OPTION_SOURCE.STATIC, label: "鎵嬪姩閰嶇疆", desc: "鍦ㄦā鏉夸腑鑷畾涔夐�夐」鏂囨湰涓庡��" },
+  { value: SELECT_OPTION_SOURCE.USER, label: "浜哄憳鍒楄〃", desc: "浠庣郴缁熺敤鎴蜂腑閫夋嫨锛屽�间负鐢ㄦ埛 ID" },
+  { value: SELECT_OPTION_SOURCE.DEPT, label: "閮ㄩ棬鍒楄〃", desc: "浠庣粍缁囨灦鏋勪腑閫夋嫨锛屽�间负閮ㄩ棬 ID" },
+];
+
+export function selectOptionSourceLabel(source) {
+  return SELECT_OPTION_SOURCE_OPTIONS.find((x) => x.value === source)?.label || "鈥�";
+}
+
+export function isDynamicOptionSource(source) {
+  return source === SELECT_OPTION_SOURCE.USER || source === SELECT_OPTION_SOURCE.DEPT;
+}
+
+function unwrapArray(payload) {
+  if (Array.isArray(payload)) return payload;
+  if (payload?.data && Array.isArray(payload.data)) return payload.data;
+  if (payload?.rows && Array.isArray(payload.rows)) return payload.rows;
+  return [];
+}
+
+function isActiveUser(u) {
+  if (u.delFlag === "2" || u.delFlag === 2) return false;
+  if (u.status == null) return true;
+  return String(u.status) === "0";
+}
+
+/** 鐢ㄦ埛 鈫� 涓嬫媺 option */
+export function mapUserToSelectOption(u) {
+  const value = u.userId ?? u.id;
+  return {
+    label: u.nickName || u.userName || `鐢ㄦ埛${value}`,
+    value,
+  };
+}
+
+/** 閮ㄩ棬鏍戞媿骞充负涓嬫媺 option */
+export function flattenDeptToSelectOptions(nodes, result = []) {
+  (nodes || []).forEach((node) => {
+    const value = node.id ?? node.deptId ?? node.value;
+    if (value != null && value !== "") {
+      result.push({
+        label: node.label ?? node.deptName ?? node.name ?? String(value),
+        value,
+      });
+    }
+    if (node.children?.length) flattenDeptToSelectOptions(node.children, result);
+  });
+  return result;
+}
+
+function filterDisabledDept(deptList) {
+  if (!Array.isArray(deptList)) return [];
+  return deptList.filter((dept) => {
+    if (dept.disabled) return false;
+    if (dept.children?.length) {
+      dept.children = filterDisabledDept(dept.children);
+    }
+    return true;
+  });
+}
+
+/** 鎸夊瓧娈甸厤缃В鏋愪笅鎷� options锛堥渶浼犲叆宸插姞杞界殑缂撳瓨锛� */
+export function resolveFieldSelectOptions(field, caches = {}) {
+  const source = field?.optionSource || SELECT_OPTION_SOURCE.STATIC;
+  if (source === SELECT_OPTION_SOURCE.USER) {
+    return (caches.users || []).map(mapUserToSelectOption);
+  }
+  if (source === SELECT_OPTION_SOURCE.DEPT) {
+    return caches.deptOptions || [];
+  }
+  return (field?.options || []).filter((o) => o.value !== "" && o.value != null);
+}
+
+/** 鏍规嵁宸茶В鏋愮殑 options 鍙嶆煡灞曠ず鏂囨湰 */
+export function resolveSelectDisplayLabel(field, val, caches = {}) {
+  if (val == null || val === "") return "鈥�";
+  const options = resolveFieldSelectOptions(field, caches);
+  const hit = options.find((o) => String(o.value) === String(val));
+  return hit?.label || String(val);
+}
+
+/** 鍔犺浇浜哄憳 / 閮ㄩ棬缂撳瓨锛堝澶勫鐢級 */
+export async function fetchSelectOptionCaches(sources = []) {
+  const needUser = sources.includes(SELECT_OPTION_SOURCE.USER);
+  const needDept = sources.includes(SELECT_OPTION_SOURCE.DEPT);
+  const caches = { users: [], deptOptions: [] };
+
+  if (!needUser && !needDept) return caches;
+
+  const tasks = [];
+  if (needUser) {
+    tasks.push(
+      userListNoPageByTenantId()
+        .then((res) => {
+          caches.users = unwrapArray(res).filter(isActiveUser);
+        })
+        .catch(() => {
+          caches.users = [];
+        })
+    );
+  }
+  if (needDept) {
+    tasks.push(
+      deptTreeSelect()
+        .then((res) => {
+          let tree = unwrapArray(res);
+          tree = tree.length ? filterDisabledDept(JSON.parse(JSON.stringify(tree))) : [];
+          if (!tree.length) tree = unwrapArray(res);
+          caches.deptOptions = flattenDeptToSelectOptions(tree);
+        })
+        .catch(() => {
+          caches.deptOptions = [];
+        })
+    );
+  }
+
+  await Promise.all(tasks);
+  return caches;
+}
+
+/** 浠庡瓧娈靛垪琛ㄦ敹闆嗛渶瑕侀鍔犺浇鐨勫姩鎬佹潵婧� */
+export function collectOptionSourcesFromFields(fields) {
+  const set = new Set();
+  (fields || []).forEach((f) => {
+    if (f?.type === "select" && isDynamicOptionSource(f.optionSource)) {
+      set.add(f.optionSource);
+    }
+  });
+  return [...set];
+}
diff --git a/src/views/officeProcessAutomation/ApproveManage/approve-template/useApproveTemplate.js b/src/views/officeProcessAutomation/ApproveManage/approve-template/useApproveTemplate.js
new file mode 100644
index 0000000..61aa6c0
--- /dev/null
+++ b/src/views/officeProcessAutomation/ApproveManage/approve-template/useApproveTemplate.js
@@ -0,0 +1,334 @@
+import {
+  addApprovalTemplate,
+  deleteApprovalTemplate,
+  getApprovalTemplateDetail,
+  listApprovalTemplatePage,
+  TEMPLATE_TYPE_BUILTIN,
+  updateApprovalTemplate,
+} from "@/api/officeProcessAutomation/approvalTemplate.js";
+import { Search } from "@element-plus/icons-vue";
+import { ElMessage, ElMessageBox } from "element-plus";
+import { computed, reactive, ref } from "vue";
+import {
+  buildApprovalTemplateListParams,
+  createEmptyTemplateForm,
+  fetchBusinessTypeOptions,
+  flowNodesSummary,
+  isBuiltinTemplate,
+  mapTemplateFromApi,
+  mapTemplateToApi,
+  nodeSignModeLabel,
+  formatDisplayTime,
+  unwrapTemplateDetail,
+  validateTemplateForm,
+} from "./approveTemplateConstants.js";
+import { parseFormConfigToData } from "./formConfigUtils.js";
+
+const FALLBACK_TEMPLATE_TYPE_OPTIONS = [
+  { value: 0, label: "绯荤粺鍐呯疆" },
+  { value: 1, label: "鑷畾涔�" },
+];
+
+function matchTemplateTypeValue(options, type) {
+  if (type == null || type === "") return false;
+  return options.some(
+    (x) => x.value === type || x.value === Number(type) || String(x.value) === String(type)
+  );
+}
+
+export function useApproveTemplate() {
+  const templateTypeOptions = ref([...FALLBACK_TEMPLATE_TYPE_OPTIONS]);
+
+  function templateTypeLabel(type) {
+    if (type == null || type === "") return "鈥�";
+    const hit = templateTypeOptions.value.find(
+      (x) => x.value === type || x.value === Number(type) || String(x.value) === String(type)
+    );
+    return hit?.label || "鈥�";
+  }
+
+  const searchForm = reactive({
+    keyword: "",
+    enabledOnly: false,
+  });
+
+  const tableLoading = ref(false);
+  const page = reactive({ current: 1, size: 10, total: 0 });
+  const tableData = ref([]);
+
+  const formDialog = reactive({ visible: false, title: "", mode: "add" });
+  const form = reactive(createEmptyTemplateForm());
+  const formRef = ref();
+
+  const isEditingBuiltin = computed(
+    () => formDialog.mode === "edit" && Number(form.templateType) === TEMPLATE_TYPE_BUILTIN
+  );
+
+  async function loadTemplateTypeOptions() {
+    try {
+      const list = await fetchBusinessTypeOptions();
+      templateTypeOptions.value = list.length ? list : [...FALLBACK_TEMPLATE_TYPE_OPTIONS];
+    } catch {
+      templateTypeOptions.value = [...FALLBACK_TEMPLATE_TYPE_OPTIONS];
+    }
+    if (!matchTemplateTypeValue(templateTypeOptions.value, form.businessType)) {
+      form.businessType = templateTypeOptions.value[0]?.value ?? "";
+    }
+  }
+
+  const detailDialog = reactive({ visible: false });
+  const detailRow = ref({});
+  const detailLoading = ref(false);
+
+  const formRules = {
+    templateName: [{ required: true, message: "璇疯緭鍏ユā鏉垮悕绉�", trigger: "blur" }],
+    businessType: [{ required: true, message: "璇烽�夋嫨妯℃澘绫诲瀷", trigger: "change" }],
+  };
+
+  const tableColumn = ref([
+    { label: "妯℃澘鍚嶇О", prop: "templateName", minWidth: 140 },
+    {
+      label: "妯℃澘绫诲瀷",
+      prop: "businessType",
+      width: 100,
+      align: "center",
+      formatData: (v) => templateTypeLabel(v),
+    },
+    { label: "璇存槑", prop: "description", minWidth: 160, showOverflowTooltip: true },
+    {
+      label: "鑺傜偣鏁�",
+      prop: "flowNodes",
+      width: 80,
+      align: "center",
+      formatData: (v) => (Array.isArray(v) ? v.length : 0),
+    },
+    {
+      label: "娴佺▼姒傝",
+      prop: "flowNodes",
+      minWidth: 220,
+      showOverflowTooltip: true,
+      formatData: (v) => flowNodesSummary(v),
+    },
+    {
+      label: "鐘舵��",
+      prop: "enabled",
+      width: 90,
+      align: "center",
+      dataType: "tag",
+      formatData: (v) => (v !== false ? "鍚敤" : "鍋滅敤"),
+      formatType: (v) => (v !== false ? "success" : "info"),
+    },
+    {
+      label: "鍒涘缓鏃堕棿",
+      prop: "createdTime",
+      width: 170,
+      showOverflowTooltip: true,
+      formatData: (v) => formatDisplayTime(v),
+    },
+    {
+      label: "鏇存柊鏃堕棿",
+      prop: "updatedTime",
+      width: 170,
+      showOverflowTooltip: true,
+      formatData: (v) => formatDisplayTime(v),
+    },
+    {
+      dataType: "action",
+      label: "鎿嶄綔",
+      align: "center",
+      fixed: "right",
+      width: 220,
+      operation: [
+        { name: "璇︽儏", type: "text", clickFun: (row) => openDetail(row) },
+        { name: "缂栬緫", type: "text", clickFun: (row) => openFormDialog("edit", row) },
+        {
+          name: "鍒犻櫎",
+          type: "danger",
+          link: true,
+          disabled: (row) => isBuiltinTemplate(row),
+          clickFun: (row) => removeTemplate(row),
+        },
+      ],
+    },
+  ]);
+
+  async function fetchTemplateList() {
+    tableLoading.value = true;
+    try {
+      const res = await listApprovalTemplatePage(
+        buildApprovalTemplateListParams({ page, searchForm })
+      );
+      const data = res?.data || {};
+      tableData.value = (data.records || []).map(mapTemplateFromApi);
+      page.total = Number(data.total || 0);
+    } catch {
+      tableData.value = [];
+      page.total = 0;
+    } finally {
+      tableLoading.value = false;
+    }
+  }
+
+  function handleQuery() {
+    page.current = 1;
+    fetchTemplateList();
+  }
+
+  function resetSearch() {
+    searchForm.keyword = "";
+    searchForm.enabledOnly = false;
+    handleQuery();
+  }
+
+  function pagination({ page: p, limit }) {
+    page.current = p;
+    page.size = limit;
+    fetchTemplateList();
+  }
+
+  function resetForm(row) {
+    const base = createEmptyTemplateForm();
+    if (!row) {
+      Object.assign(form, base);
+      return;
+    }
+    const formConfigData = JSON.parse(
+      JSON.stringify(row.formConfigData || parseFormConfigToData(row.formConfig))
+    );
+    const builtin = isBuiltinTemplate(row);
+    Object.assign(form, {
+      ...base,
+      id: row.id,
+      templateName: row.templateName || "",
+      description: row.description || "",
+      templateType: row.templateType != null ? Number(row.templateType) : base.templateType,
+      businessType: row.businessType ?? "",
+      formConfig: row.formConfig || "",
+      formConfigData,
+      lockedFormFieldUids: builtin
+        ? (formConfigData.fields || []).map((f) => f._uid).filter(Boolean)
+        : [],
+      enabled: row.enabled !== false,
+      flowNodes: JSON.parse(JSON.stringify(row.flowNodes || [base.flowNodes[0]])),
+      storageBlobDTOs: JSON.parse(JSON.stringify(row.storageBlobDTOs || [])),
+    });
+  }
+
+  function openFormDialog(mode, row) {
+    formDialog.mode = mode;
+    formDialog.title = mode === "add" ? "鏂板缓瀹℃壒妯℃澘" : "缂栬緫瀹℃壒妯℃澘";
+    resetForm(mode === "edit" ? row : null);
+    formDialog.visible = true;
+  }
+
+  async function openDetail(row) {
+    if (row?.id == null || row.id === "") {
+      ElMessage.warning("鏃犳硶鏌ョ湅璇︽儏锛氱己灏戞ā鏉� ID");
+      return;
+    }
+    detailDialog.visible = true;
+    detailLoading.value = true;
+    detailRow.value = {};
+    try {
+      const res = await getApprovalTemplateDetail(row.id);
+      detailRow.value = mapTemplateFromApi(unwrapTemplateDetail(res));
+    } catch {
+      detailDialog.visible = false;
+    } finally {
+      detailLoading.value = false;
+    }
+  }
+
+  async function submitForm() {
+    if (!formRef.value) return false;
+    try {
+      await formRef.value.validate();
+    } catch {
+      return false;
+    }
+    const validated = validateTemplateForm(form);
+    if (!validated.ok) {
+      return { message: validated.message };
+    }
+    if (formDialog.mode === "edit" && !form.id) {
+      return { message: "缂哄皯妯℃澘 ID锛屾棤娉曚繚瀛樹慨鏀�" };
+    }
+    const dto = mapTemplateToApi(form);
+    try {
+      if (formDialog.mode === "add") {
+        await addApprovalTemplate(dto);
+      } else {
+        await updateApprovalTemplate(dto);
+      }
+    } catch {
+      return false;
+    }
+    formDialog.visible = false;
+    page.current = 1;
+    await fetchTemplateList();
+    return { ok: true };
+  }
+
+  async function removeTemplate(row) {
+    if (isBuiltinTemplate(row)) {
+      ElMessage.warning("绯荤粺鍐呯疆妯℃澘涓嶅厑璁稿垹闄�");
+      return;
+    }
+    if (row?.id == null || row.id === "") {
+      ElMessage.warning("鏃犳硶鍒犻櫎锛氱己灏戞ā鏉� ID");
+      return;
+    }
+    const name = row.templateName || "鏈懡鍚嶆ā鏉�";
+    try {
+      await ElMessageBox.confirm(
+        `纭畾瑕佸垹闄ゅ鎵规ā鏉裤��${name}銆嶅悧锛熷垹闄ゅ悗涓嶅彲鎭㈠銆俙,
+        "鍒犻櫎纭",
+        {
+          type: "warning",
+          confirmButtonText: "纭畾鍒犻櫎",
+          cancelButtonText: "鍙栨秷",
+          distinguishCancelAndClose: true,
+          autofocus: false,
+        }
+      );
+    } catch {
+      return;
+    }
+    try {
+      await deleteApprovalTemplate([row.id]);
+      ElMessage.success("鍒犻櫎鎴愬姛");
+      await fetchTemplateList();
+    } catch {
+      /* 閿欒鐢辨嫤鎴櫒鎻愮ず */
+    }
+  }
+
+  return {
+    Search,
+    templateTypeOptions,
+    loadTemplateTypeOptions,
+    templateTypeLabel,
+    fetchTemplateList,
+    nodeSignModeLabel,
+    flowNodesSummary,
+    searchForm,
+    tableLoading,
+    page,
+    tableData,
+    tableColumn,
+    formDialog,
+    form,
+    formRef,
+    formRules,
+    isEditingBuiltin,
+    detailDialog,
+    detailRow,
+    detailLoading,
+    handleQuery,
+    resetSearch,
+    pagination,
+    openFormDialog,
+    openDetail,
+    submitForm,
+  };
+}
diff --git a/src/views/officeProcessAutomation/ApproveManage/approve-template/useSelectOptionSources.js b/src/views/officeProcessAutomation/ApproveManage/approve-template/useSelectOptionSources.js
new file mode 100644
index 0000000..8397288
--- /dev/null
+++ b/src/views/officeProcessAutomation/ApproveManage/approve-template/useSelectOptionSources.js
@@ -0,0 +1,45 @@
+import { reactive, ref } from "vue";
+import {
+  collectOptionSourcesFromFields,
+  fetchSelectOptionCaches,
+  resolveFieldSelectOptions,
+  resolveSelectDisplayLabel,
+} from "./selectOptionSource.js";
+
+/** 涓嬫媺鍔ㄦ�侀�夐」锛氫汉鍛� / 閮ㄩ棬缂撳瓨涓庤В鏋� */
+export function useSelectOptionSources() {
+  const loading = ref(false);
+  const caches = reactive({
+    users: [],
+    deptOptions: [],
+  });
+
+  async function ensureForFields(fields) {
+    const sources = collectOptionSourcesFromFields(fields);
+    if (!sources.length) return;
+    loading.value = true;
+    try {
+      const next = await fetchSelectOptionCaches(sources);
+      caches.users = next.users;
+      caches.deptOptions = next.deptOptions;
+    } finally {
+      loading.value = false;
+    }
+  }
+
+  function getOptions(field) {
+    return resolveFieldSelectOptions(field, caches);
+  }
+
+  function getDisplayLabel(field, val) {
+    return resolveSelectDisplayLabel(field, val, caches);
+  }
+
+  return {
+    loading,
+    caches,
+    ensureForFields,
+    getOptions,
+    getDisplayLabel,
+  };
+}
diff --git a/src/views/officeProcessAutomation/AttendManage/leave-apply/index.vue b/src/views/officeProcessAutomation/AttendManage/leave-apply/index.vue
new file mode 100644
index 0000000..4d800df
--- /dev/null
+++ b/src/views/officeProcessAutomation/AttendManage/leave-apply/index.vue
@@ -0,0 +1,325 @@
+<!--OA妯″潡锛氳鍋囩敵璇�-->
+<template>
+  <div class="app-container">
+    <div class="search_form mb20">
+      <div>
+        <span class="search_title">瀹℃壒鍗曞彿锛�</span>
+        <el-input
+          v-model="searchForm.instanceNo"
+          style="width: 220px"
+          placeholder="璇疯緭鍏ュ鎵瑰崟鍙�"
+          clearable
+          @keyup.enter="onSearch"
+        />
+        <span class="search_title" style="margin-left: 12px">鐢宠浜猴細</span>
+        <el-input
+          v-model="searchForm.applicantKeyword"
+          style="width: 220px"
+          placeholder="濮撳悕鎴栫紪鍙�"
+          clearable
+          :prefix-icon="Search"
+          @keyup.enter="onSearch"
+        />
+        <el-button type="primary" style="margin-left: 10px" @click="onSearch">鎼滅储</el-button>
+        <el-button @click="resetSearch">閲嶇疆</el-button>
+      </div>
+      <div>
+        <el-button type="primary" @click="openAddWithTemplate">鏂板璇峰亣鐢宠</el-button>
+      </div>
+    </div>
+    <div class="table_list">
+      <PIMTable
+        rowKey="id"
+        :column="tableColumn"
+        :tableData="tableData"
+        :page="page"
+        :isSelection="false"
+        :tableLoading="tableLoading"
+        @pagination="onPagination"
+        :total="page.total"
+      />
+    </div>
+
+    <ApprovalInstanceSubmitDialog
+      v-model="submitDialog.visible"
+      :title="submitDialogTitle"
+      :form="submitForm"
+      :rules="submitFormRules"
+      :fields="submitFormFields"
+      :active-template="activeTemplate"
+      :user-options="flowUserOptions"
+      :is-edit="isSubmitEdit"
+      :saving="submitSaving"
+      :form-ref="submitFormRef"
+      flow-attachments-only
+      @submit="onSubmit"
+    >
+      <template #before="{ form, fields }">
+        <FormPayloadFields :fields="displayTemplateFields(fields)" :form-payload="form.formPayload" />
+        <el-row :gutter="24">
+          <el-col :span="12">
+            <el-form-item label="鍋囨湡浣欓" prop="leaveBalanceDays">
+              <el-input-number
+                v-model="form.leaveBalanceDays"
+                :min="0"
+                :max="999"
+                :precision="2"
+                :step="0.5"
+                controls-position="right"
+                placeholder="澶�"
+                style="width: 100%"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="璇峰亣鏃堕暱">
+              <el-input :model-value="leaveDurationDisplay(form)" readonly placeholder="鏍规嵁妯℃澘涓鍋囨椂闂磋嚜鍔ㄨ绠�">
+                <template #append>澶�</template>
+              </el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </template>
+    </ApprovalInstanceSubmitDialog>
+
+    <ApprovalTemplateBindDialog
+      v-model:visible="templateBindVisible"
+      :module-key="APPROVAL_MODULE_KEYS.LEAVE"
+      skip-form-confirm
+      @confirm="onTemplateBound"
+      @closed="onTemplateBindClosed"
+    />
+
+    <ApprovalInstanceDetailDialog
+      v-model="detailDialog.visible"
+      title="璇峰亣鐢宠璇︽儏"
+      :row="detailRow"
+      @edit="openEditFromDetail"
+    />
+  </div>
+</template>
+
+<script setup>
+import { Search } from "@element-plus/icons-vue";
+import dayjs from "dayjs";
+import { userListNoPageByTenantId } from "@/api/system/user.js";
+import { ElMessage } from "element-plus";
+import { computed, onMounted, reactive, ref, watch } from "vue";
+import FormPayloadFields from "../../ApproveManage/approve-list/components/FormPayloadFields.vue";
+import ApprovalInstanceDetailDialog from "../../ApproveManage/approve-shared/components/ApprovalInstanceDetailDialog.vue";
+import ApprovalInstanceSubmitDialog from "../../ApproveManage/approve-shared/components/ApprovalInstanceSubmitDialog.vue";
+import ApprovalTemplateBindDialog from "../../ApproveManage/approve-shared/components/ApprovalTemplateBindDialog.vue";
+import { buildInstanceTableColumns } from "../../ApproveManage/approve-shared/approvalInstanceFormConfigTable.js";
+import { APPROVAL_MODULE_KEYS } from "../../ApproveManage/approve-shared/approvalModuleRegistry.js";
+import { useApprovalInstanceModule } from "../../ApproveManage/approve-shared/useApprovalInstanceModule.js";
+import { useFlowUserOptions } from "../../ApproveManage/approve-shared/useFlowUserOptions.js";
+import { SELECT_OPTION_SOURCE } from "../../ApproveManage/approve-template/selectOptionSource.js";
+
+const LEAVE_TYPE_OPTIONS = [
+  { label: "骞村亣", value: "annual" },
+  { label: "鐥呭亣", value: "sick" },
+  { label: "浜嬪亣", value: "personal" },
+  { label: "濠氬亣", value: "marriage" },
+  { label: "浜у亣", value: "maternity" },
+  { label: "鍝轰钩鍋�", value: "nursing" },
+  { label: "鎱板攣鍋�", value: "condolence" },
+  { label: "璋冧紤", value: "compensatory" },
+];
+
+function isLeaveBalanceField(field) {
+  const label = String(field?.label || "");
+  return label.includes("鍋囨湡浣欓") || field?.key === "leaveBalanceDays";
+}
+
+function isLeaveDurationField(field) {
+  const label = String(field?.label || "");
+  return label.includes("璇峰亣鏃堕暱") || field?.key === "leaveDurationDays";
+}
+
+function displayTemplateFields(fields = []) {
+  return (fields || []).filter((f) => !isLeaveBalanceField(f) && !isLeaveDurationField(f));
+}
+
+function findLeaveTimeTemplateField(fields = []) {
+  return (
+    fields.find((f) => f?.type === "datetimerange" && String(f?.label || "").includes("璇峰亣鏃堕棿")) ||
+    fields.find((f) => f?.type === "datetimerange" && f?.key === "dateRange") ||
+    fields.find((f) => f?.type === "datetimerange") ||
+    null
+  );
+}
+
+function findApplicantTemplateField(fields = []) {
+  return (
+    fields.find((f) => String(f?.label || "").includes("鐢宠浜�")) ||
+    fields.find((f) => f?.type === "select" && f?.optionSource === SELECT_OPTION_SOURCE.USER) ||
+    null
+  );
+}
+
+function resolveLeaveTimeRange(payload, leaveTimeField) {
+  if (!leaveTimeField?.key) return { start: "", end: "" };
+  const val = payload?.[leaveTimeField.key];
+  if (!Array.isArray(val) || val.length < 2) return { start: "", end: "" };
+  return { start: val[0] || "", end: val[1] || "" };
+}
+
+function computeLeaveDays(startStr, endStr) {
+  if (!startStr || !endStr) return null;
+  const t0 = dayjs(startStr);
+  const t1 = dayjs(endStr);
+  if (!t0.isValid() || !t1.isValid() || !t1.isAfter(t0)) return null;
+  const days = t1.diff(t0, "millisecond") / (24 * 60 * 60 * 1000);
+  return Math.round(days * 100) / 100;
+}
+
+function leaveDurationDisplay(form) {
+  const leaveTimeField = findLeaveTimeTemplateField(form.formFieldDefs);
+  const { start, end } = resolveLeaveTimeRange(form.formPayload, leaveTimeField);
+  const d = computeLeaveDays(start, end);
+  return d == null ? "" : String(d);
+}
+
+const searchForm = reactive({
+  instanceNo: "",
+  applicantKeyword: "",
+});
+
+function validateLeaveBeforeSave() {
+  const leaveTimeField = findLeaveTimeTemplateField(submitForm.formFieldDefs);
+  const { start, end } = resolveLeaveTimeRange(submitForm.formPayload, leaveTimeField);
+  if (computeLeaveDays(start, end) == null) {
+    ElMessage.warning("璇锋鏌ユā鏉夸腑鐨勮鍋囨椂闂达紝缁撴潫鏃堕棿椤绘櫄浜庡紑濮嬫椂闂�");
+    throw new Error("invalid leave time");
+  }
+}
+
+const mod = useApprovalInstanceModule({
+  moduleKey: APPROVAL_MODULE_KEYS.LEAVE,
+  beforeSave: validateLeaveBeforeSave,
+  extraFormRules: {
+    leaveBalanceDays: [{ required: true, message: "璇峰~鍐欏亣鏈熶綑棰�", trigger: "blur" }],
+  },
+});
+
+const {
+  tableData,
+  tableLoading,
+  page,
+  detailDialog,
+  detailRow,
+  submitDialog,
+  submitEditRow,
+  submitForm,
+  submitFormRef,
+  submitSaving,
+  isSubmitEdit,
+  activeTemplate,
+  submitFormFields,
+  submitFormRules,
+  submitDialogTitle,
+  templateBindVisible,
+  handleQuery,
+  initModuleList,
+  pagination,
+  openAddWithTemplate,
+  onTemplateBound,
+  onTemplateBindClosed,
+  openEditFromDetail,
+  submitInstanceForm,
+  buildTableActions,
+} = mod;
+
+const { flowUserOptions, loadFlowUsers } = useFlowUserOptions();
+const allUsersCache = ref([]);
+
+const applicantTemplateField = computed(() =>
+  findApplicantTemplateField(submitForm.formFieldDefs)
+);
+
+function unwrapArray(payload) {
+  if (Array.isArray(payload)) return payload;
+  if (payload && Array.isArray(payload.data)) return payload.data;
+  return [];
+}
+
+async function loadUserPool() {
+  try {
+    const res = await userListNoPageByTenantId();
+    allUsersCache.value = unwrapArray(res);
+  } catch {
+    allUsersCache.value = [];
+  }
+}
+
+watch(
+  () => submitDialog.visible,
+  (v) => {
+    if (!v) return;
+    if (submitForm.leaveBalanceDays == null && isSubmitEdit.value) {
+      submitForm.leaveBalanceDays =
+        submitEditRow.value?.formPayload?.leaveBalanceDays ??
+        submitEditRow.value?.leaveBalanceDays;
+    }
+    if (submitForm.leaveBalanceDays == null && !isSubmitEdit.value) {
+      submitForm.leaveBalanceDays = undefined;
+    }
+  }
+);
+
+watch(
+  () => {
+    const key = applicantTemplateField.value?.key;
+    return key ? submitForm.formPayload[key] : undefined;
+  },
+  async (uid) => {
+    if (!applicantTemplateField.value || !uid) return;
+    if (!allUsersCache.value.length) await loadUserPool();
+  }
+);
+
+const tableColumn = buildInstanceTableColumns(tableData, buildTableActions, {
+  moduleKey: APPROVAL_MODULE_KEYS.LEAVE,
+});
+
+function onSearch() {
+  handleQuery(searchForm);
+}
+
+function resetSearch() {
+  searchForm.instanceNo = "";
+  searchForm.applicantKeyword = "";
+  onSearch();
+}
+
+function onPagination(obj) {
+  pagination(obj, searchForm);
+}
+
+async function onSubmit() {
+  const ok = await submitInstanceForm({ skipValidate: true });
+  if (ok) ElMessage.success(isSubmitEdit.value ? "淇敼鎴愬姛" : "鎻愪氦鎴愬姛");
+}
+
+onMounted(async () => {
+  loadFlowUsers();
+  await initModuleList(searchForm);
+});
+</script>
+
+<style scoped>
+.mb20 {
+  margin-bottom: 20px;
+}
+.search_form {
+  display: flex;
+  flex-wrap: wrap;
+  align-items: center;
+  justify-content: space-between;
+  gap: 12px;
+}
+.search_title {
+  font-size: 14px;
+  color: var(--el-text-color-regular);
+}
+</style>
diff --git a/src/views/officeProcessAutomation/AttendManage/overtime-apply/components/ApprovalFlowEditor.vue b/src/views/officeProcessAutomation/AttendManage/overtime-apply/components/ApprovalFlowEditor.vue
new file mode 100644
index 0000000..9e3ada5
--- /dev/null
+++ b/src/views/officeProcessAutomation/AttendManage/overtime-apply/components/ApprovalFlowEditor.vue
@@ -0,0 +1,360 @@
+<!-- 鍔犵彮鐢宠妯″潡鍐咃細鍙鍒犲鎵硅妭鐐癸紝姣忚妭鐐瑰繀閫� 1 浜� -->
+<template>
+  <div class="afe">
+    <div v-if="innerList.length" class="afe-flow">
+      <div v-for="(item, index) in innerList" :key="item._uid" class="afe-flow-item">
+        <div class="afe-card" :class="{ 'afe-card--empty': !item.approverId }">
+          <div class="afe-badge">{{ index + 1 }}</div>
+          <div class="afe-avatar-wrap">
+            <div
+              class="afe-avatar"
+              :class="{ 'afe-avatar--on': item.approverId }"
+              :style="item.approverId ? { backgroundColor: avatarColor(item.approverName) } : {}"
+            >
+              <span v-if="item.approverId">{{ (item.approverName || '?').charAt(0) }}</span>
+              <el-icon v-else :size="22"><User /></el-icon>
+            </div>
+            <div class="afe-level">{{ levelText(index) }}</div>
+          </div>
+          <div class="afe-select">
+            <el-select
+              v-model="item.approverId"
+              placeholder="璇烽�夋嫨瀹℃壒浜�"
+              filterable
+              clearable
+              style="width: 100%"
+              @change="(v) => onPick(v, item)"
+            >
+              <el-option
+                v-for="u in userOptions"
+                :key="String(u.userId ?? u.id)"
+                :label="optionLabel(u)"
+                :value="u.userId ?? u.id"
+              />
+            </el-select>
+          </div>
+          <div class="afe-actions">
+            <el-button type="primary" circle size="small" :disabled="index === 0" title="鍓嶇Щ" @click="moveLeft(index)">
+              <el-icon><ArrowLeft /></el-icon>
+            </el-button>
+            <el-button
+              type="primary"
+              circle
+              size="small"
+              :disabled="index === innerList.length - 1"
+              title="鍚庣Щ"
+              @click="moveRight(index)"
+            >
+              <el-icon><ArrowRight /></el-icon>
+            </el-button>
+            <el-button type="danger" circle size="small" title="鍒犻櫎鑺傜偣" @click="remove(index)">
+              <el-icon><Delete /></el-icon>
+            </el-button>
+          </div>
+        </div>
+        <div v-if="index < innerList.length - 1" class="afe-conn">
+          <div class="afe-conn-line"></div>
+          <el-icon class="afe-conn-icon"><ArrowRight /></el-icon>
+        </div>
+      </div>
+
+      <div class="afe-add-wrap">
+        <div class="afe-conn" v-if="innerList.length">
+          <div class="afe-conn-line"></div>
+          <el-icon class="afe-conn-icon"><ArrowRight /></el-icon>
+        </div>
+        <div class="afe-add-card" @click="addNode">
+          <div class="afe-add-icon"><el-icon :size="26"><Plus /></el-icon></div>
+          <span>鏂板鑺傜偣</span>
+        </div>
+      </div>
+    </div>
+
+    <div v-else class="afe-empty">
+      <el-icon :size="44" color="#c0c4cc"><User /></el-icon>
+      <p>鏆傛棤瀹℃壒鑺傜偣</p>
+      <el-button type="primary" @click="addNode">娣诲姞绗竴涓妭鐐�</el-button>
+    </div>
+  </div>
+</template>
+
+<script setup>
+import { ArrowLeft, ArrowRight, Delete, Plus, User } from "@element-plus/icons-vue";
+import { ref, watch } from "vue";
+
+const props = defineProps({
+  modelValue: { type: Array, default: () => [] },
+  /** 涓庣埗椤� userList 缁撴瀯涓�鑷达細userId / id銆乶ickName銆乽serName */
+  userOptions: { type: Array, default: () => [] },
+});
+
+const emit = defineEmits(["update:modelValue"]);
+
+const innerList = ref([]);
+
+const palette = ["#409EFF", "#67C23A", "#E6A23C", "#F56C6C", "#9B59B6", "#1ABC9C"];
+
+function avatarColor(name) {
+  if (!name) return "#c0c4cc";
+  let h = 0;
+  for (let i = 0; i < name.length; i++) h = name.charCodeAt(i) + ((h << 5) - h);
+  return palette[Math.abs(h) % palette.length];
+}
+
+function levelText(i) {
+  const t = ["绗竴绾�", "绗簩绾�", "绗笁绾�", "绗洓绾�", "绗簲绾�", "绗叚绾�", "绗竷绾�", "绗叓绾�"];
+  return t[i] || `绗�${i + 1}绾;
+}
+
+function optionLabel(u) {
+  const nick = u.nickName || "";
+  const un = u.userName || "";
+  if (nick && un && nick !== un) return `${nick}锛�${un}锛塦;
+  return nick || un || `鐢ㄦ埛${u.userId ?? u.id ?? ""}`;
+}
+
+function newUid() {
+  return `n_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;
+}
+
+function mapIn(rows) {
+  if (!Array.isArray(rows)) return [];
+  return rows.map((r, i) => ({
+    _uid: newUid(),
+    approverId: r.approverId ?? r.approver_id ?? null,
+    approverName: r.approverName ?? r.approver_name ?? "",
+    sortOrder: r.sortOrder ?? r.nodeOrder ?? i + 1,
+    nodeOrder: r.nodeOrder ?? r.sortOrder ?? i + 1,
+    roleName: r.roleName ?? "",
+    roleCode: r.roleCode ?? "",
+  }));
+}
+
+function publicShape(rows) {
+  const arr = Array.isArray(rows) ? rows : [];
+  return arr.map((r, i) => ({
+    approverId: r.approverId ?? null,
+    approverName: r.approverName ?? "",
+    roleName: r.roleName ?? "",
+    roleCode: r.roleCode ?? "",
+    sortOrder: i + 1,
+  }));
+}
+
+function emitOut() {
+  const out = innerList.value.map((r, i) => ({
+    approverId: r.approverId ?? null,
+    approverName: r.approverName ?? "",
+    sortOrder: i + 1,
+    nodeOrder: i + 1,
+    roleName: r.roleName ?? "",
+    roleCode: r.roleCode ?? "",
+  }));
+  emit("update:modelValue", out);
+}
+
+watch(
+  () => props.modelValue,
+  (v) => {
+    const next = publicShape(v || []);
+    if (JSON.stringify(next) === JSON.stringify(publicShape(innerList.value))) return;
+    innerList.value = mapIn(v || []);
+  },
+  { deep: true, immediate: true }
+);
+
+function findUser(id) {
+  if (id == null || id === "") return null;
+  return props.userOptions.find((u) => String(u.userId ?? u.id) === String(id)) ?? null;
+}
+
+function onPick(userId, row) {
+  if (!userId) {
+    row.approverName = "";
+    emitOut();
+    return;
+  }
+  const u = findUser(userId);
+  row.approverName = u ? u.nickName || u.userName || "" : "";
+  emitOut();
+}
+
+function addNode() {
+  innerList.value.push({
+    _uid: newUid(),
+    approverId: null,
+    approverName: "",
+    roleName: "",
+    roleCode: "",
+  });
+  emitOut();
+}
+
+function remove(index) {
+  innerList.value.splice(index, 1);
+  emitOut();
+}
+
+function moveLeft(index) {
+  if (index < 1) return;
+  const t = innerList.value[index];
+  innerList.value[index] = innerList.value[index - 1];
+  innerList.value[index - 1] = t;
+  emitOut();
+}
+
+function moveRight(index) {
+  if (index >= innerList.value.length - 1) return;
+  const t = innerList.value[index];
+  innerList.value[index] = innerList.value[index + 1];
+  innerList.value[index + 1] = t;
+  emitOut();
+}
+</script>
+
+<style scoped>
+.afe {
+  width: 100%;
+}
+.afe-flow {
+  display: flex;
+  align-items: flex-start;
+  flex-wrap: nowrap;
+  overflow-x: auto;
+  padding: 6px 0 10px;
+  gap: 0;
+}
+.afe-flow-item {
+  display: flex;
+  align-items: center;
+}
+.afe-card {
+  width: 200px;
+  flex-shrink: 0;
+  border: 2px solid var(--el-border-color);
+  border-radius: 12px;
+  padding: 14px 12px 12px;
+  position: relative;
+  background: var(--el-bg-color);
+}
+.afe-card--empty {
+  border-style: dashed;
+  background: var(--el-fill-color-lighter);
+}
+.afe-badge {
+  position: absolute;
+  top: -8px;
+  left: 12px;
+  width: 22px;
+  height: 22px;
+  border-radius: 50%;
+  background: var(--el-color-primary);
+  color: #fff;
+  font-size: 12px;
+  font-weight: 700;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+.afe-avatar-wrap {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  margin: 6px 0 10px;
+}
+.afe-avatar {
+  width: 48px;
+  height: 48px;
+  border-radius: 50%;
+  background: var(--el-fill-color);
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  color: var(--el-text-color-placeholder);
+  margin-bottom: 6px;
+  font-size: 18px;
+  font-weight: 600;
+}
+.afe-avatar--on {
+  color: #fff;
+}
+.afe-level {
+  font-size: 12px;
+  color: var(--el-text-color-secondary);
+}
+.afe-select {
+  margin-bottom: 10px;
+}
+.afe-actions {
+  display: flex;
+  justify-content: center;
+  gap: 8px;
+  padding-top: 10px;
+  border-top: 1px solid var(--el-border-color-lighter);
+}
+.afe-conn {
+  display: flex;
+  align-items: center;
+  width: 40px;
+  flex-shrink: 0;
+  align-self: center;
+}
+.afe-conn-line {
+  flex: 1;
+  height: 2px;
+  background: var(--el-border-color);
+}
+.afe-conn-icon {
+  font-size: 14px;
+  color: var(--el-text-color-placeholder);
+  margin-left: -2px;
+}
+.afe-add-wrap {
+  display: flex;
+  align-items: center;
+}
+.afe-add-card {
+  width: 120px;
+  min-height: 168px;
+  flex-shrink: 0;
+  border: 2px dashed var(--el-border-color);
+  border-radius: 12px;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+  gap: 10px;
+  cursor: pointer;
+  color: var(--el-text-color-regular);
+  font-size: 13px;
+  background: var(--el-fill-color-lighter);
+  transition: border-color 0.2s, background 0.2s;
+}
+.afe-add-card:hover {
+  border-color: var(--el-color-primary);
+  background: var(--el-color-primary-light-9);
+  color: var(--el-color-primary);
+}
+.afe-add-icon {
+  width: 44px;
+  height: 44px;
+  border-radius: 50%;
+  background: var(--el-color-primary);
+  color: #fff;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+.afe-empty {
+  text-align: center;
+  padding: 28px 16px;
+  border: 1px dashed var(--el-border-color);
+  border-radius: 12px;
+  background: var(--el-fill-color-lighter);
+}
+.afe-empty p {
+  margin: 10px 0 14px;
+  color: var(--el-text-color-secondary);
+  font-size: 14px;
+}
+</style>
diff --git a/src/views/officeProcessAutomation/AttendManage/overtime-apply/index.vue b/src/views/officeProcessAutomation/AttendManage/overtime-apply/index.vue
new file mode 100644
index 0000000..9b3d91e
--- /dev/null
+++ b/src/views/officeProcessAutomation/AttendManage/overtime-apply/index.vue
@@ -0,0 +1,260 @@
+<!--OA妯″潡锛氬姞鐝敵璇�-->
+<template>
+  <div class="app-container">
+    <div class="search_form mb20">
+      <div>
+        <span class="search_title">瀹℃壒鍗曞彿锛�</span>
+        <el-input
+          v-model="searchForm.instanceNo"
+          style="width: 220px"
+          placeholder="璇疯緭鍏ュ鎵瑰崟鍙�"
+          clearable
+          @keyup.enter="onSearch"
+        />
+        <span class="search_title" style="margin-left: 12px">鐢宠浜猴細</span>
+        <el-input
+          v-model="searchForm.applicantKeyword"
+          style="width: 220px"
+          placeholder="濮撳悕鎴栫紪鍙�"
+          clearable
+          :prefix-icon="Search"
+          @keyup.enter="onSearch"
+        />
+        <el-button type="primary" style="margin-left: 10px" @click="onSearch">鎼滅储</el-button>
+        <el-button @click="resetSearch">閲嶇疆</el-button>
+      </div>
+      <div class="search_actions">
+        <el-button type="warning" plain @click="handleExport">瀵煎嚭</el-button>
+        <el-button type="primary" @click="openAddWithTemplate">鏂板鍔犵彮鐢宠</el-button>
+      </div>
+    </div>
+
+    <div class="table_list">
+      <PIMTable
+        rowKey="id"
+        :column="tableColumn"
+        :tableData="tableData"
+        :page="page"
+        :isSelection="false"
+        :tableLoading="tableLoading"
+        @pagination="onPagination"
+        :total="page.total"
+      />
+    </div>
+
+    <ApprovalInstanceSubmitDialog
+      v-model="submitDialog.visible"
+      :title="submitDialogTitle"
+      :form="submitForm"
+      :rules="submitFormRules"
+      :fields="submitFormFields"
+      :active-template="activeTemplate"
+      :user-options="flowUserOptions"
+      :is-edit="isSubmitEdit"
+      :saving="submitSaving"
+      :form-ref="submitFormRef"
+      flow-attachments-only
+      @submit="onSubmit"
+    >
+      <template #before="{ form, fields }">
+        <FormPayloadFields :fields="displayTemplateFields(fields)" :form-payload="form.formPayload" />
+        <el-row :gutter="24">
+          <el-col :span="12">
+            <el-form-item label="鍔犵彮鏃堕暱">
+              <el-input :model-value="overtimeHoursDisplay(form)" readonly placeholder="鏍规嵁妯℃澘涓姞鐝椂闂磋嚜鍔ㄨ绠�">
+                <template #append>灏忔椂</template>
+              </el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </template>
+    </ApprovalInstanceSubmitDialog>
+
+    <ApprovalTemplateBindDialog
+      v-model:visible="templateBindVisible"
+      :module-key="APPROVAL_MODULE_KEYS.OVERTIME"
+      skip-form-confirm
+      @confirm="onTemplateBound"
+      @closed="onTemplateBindClosed"
+    />
+
+    <ApprovalInstanceDetailDialog
+      v-model="detailDialog.visible"
+      title="鍔犵彮鐢宠璇︽儏"
+      :row="detailRow"
+      @edit="openEditFromDetail"
+    />
+  </div>
+</template>
+
+<script setup>
+import { Search } from "@element-plus/icons-vue";
+import dayjs from "dayjs";
+import { ElMessage } from "element-plus";
+import { getCurrentInstance, onMounted, reactive, ref } from "vue";
+import FormPayloadFields from "../../ApproveManage/approve-list/components/FormPayloadFields.vue";
+import ApprovalInstanceDetailDialog from "../../ApproveManage/approve-shared/components/ApprovalInstanceDetailDialog.vue";
+import ApprovalInstanceSubmitDialog from "../../ApproveManage/approve-shared/components/ApprovalInstanceSubmitDialog.vue";
+import ApprovalTemplateBindDialog from "../../ApproveManage/approve-shared/components/ApprovalTemplateBindDialog.vue";
+import { buildInstanceTableColumns } from "../../ApproveManage/approve-shared/approvalInstanceFormConfigTable.js";
+import { APPROVAL_MODULE_KEYS } from "../../ApproveManage/approve-shared/approvalModuleRegistry.js";
+import { useApprovalInstanceModule } from "../../ApproveManage/approve-shared/useApprovalInstanceModule.js";
+import { useFlowUserOptions } from "../../ApproveManage/approve-shared/useFlowUserOptions.js";
+
+const OVERTIME_TYPE_OPTIONS = [
+  { label: "宸ヤ綔鏃ュ姞鐝�", value: "weekday" },
+  { label: "浼戞伅鏃ュ姞鐝�", value: "weekend" },
+  { label: "娉曞畾鑺傚亣鏃ュ姞鐝�", value: "holiday" },
+];
+
+function isOvertimeDurationField(field) {
+  const label = String(field?.label || "");
+  return label.includes("鍔犵彮鏃堕暱") || field?.key === "overtimeHours";
+}
+
+function displayTemplateFields(fields = []) {
+  return (fields || []).filter((f) => !isOvertimeDurationField(f));
+}
+
+function findOvertimeTimeTemplateField(fields = []) {
+  return (
+    fields.find((f) => f?.type === "datetimerange" && String(f?.label || "").includes("鍔犵彮鏃堕棿")) ||
+    fields.find((f) => f?.type === "datetimerange") ||
+    null
+  );
+}
+
+function resolveOvertimeTimeRange(payload, overtimeTimeField) {
+  if (!overtimeTimeField?.key) return { start: "", end: "" };
+  const val = payload?.[overtimeTimeField.key];
+  if (!Array.isArray(val) || val.length < 2) return { start: "", end: "" };
+  return { start: val[0] || "", end: val[1] || "" };
+}
+
+function computeOvertimeHours(startStr, endStr) {
+  if (!startStr || !endStr) return null;
+  const t0 = dayjs(startStr);
+  const t1 = dayjs(endStr);
+  if (!t0.isValid() || !t1.isValid() || !t1.isAfter(t0)) return null;
+  return Math.round((t1.diff(t0, "millisecond") / 3600000) * 100) / 100;
+}
+
+function overtimeHoursDisplay(form) {
+  const field = findOvertimeTimeTemplateField(form.formFieldDefs);
+  const { start, end } = resolveOvertimeTimeRange(form.formPayload, field);
+  const h = computeOvertimeHours(start, end);
+  return h == null ? "" : String(h);
+}
+
+const { proxy } = getCurrentInstance();
+
+const searchForm = reactive({
+  instanceNo: "",
+  applicantKeyword: "",
+});
+
+const mod = useApprovalInstanceModule({
+  moduleKey: APPROVAL_MODULE_KEYS.OVERTIME,
+  beforeSave: validateOvertimeBeforeSave,
+});
+
+const {
+  tableData,
+  tableLoading,
+  page,
+  detailDialog,
+  detailRow,
+  submitDialog,
+  submitForm,
+  submitFormRef,
+  submitSaving,
+  isSubmitEdit,
+  activeTemplate,
+  submitFormFields,
+  submitFormRules,
+  submitDialogTitle,
+  templateBindVisible,
+  handleQuery,
+  initModuleList,
+  pagination,
+  openAddWithTemplate,
+  onTemplateBound,
+  onTemplateBindClosed,
+  openEditFromDetail,
+  submitInstanceForm,
+  buildTableActions,
+} = mod;
+
+const { flowUserOptions, loadFlowUsers } = useFlowUserOptions();
+
+function validateOvertimeBeforeSave() {
+  const field = findOvertimeTimeTemplateField(submitForm.formFieldDefs);
+  const { start, end } = resolveOvertimeTimeRange(submitForm.formPayload, field);
+  if (computeOvertimeHours(start, end) == null) {
+    ElMessage.warning("璇锋鏌ユā鏉夸腑鐨勫姞鐝椂闂达紝缁撴潫鏃堕棿椤绘櫄浜庡紑濮嬫椂闂�");
+    throw new Error("invalid overtime time");
+  }
+}
+
+const tableColumn = buildInstanceTableColumns(tableData, buildTableActions, {
+  moduleKey: APPROVAL_MODULE_KEYS.OVERTIME,
+});
+
+function onSearch() {
+  handleQuery(searchForm);
+}
+
+function resetSearch() {
+  searchForm.instanceNo = "";
+  searchForm.applicantKeyword = "";
+  onSearch();
+}
+
+function onPagination(obj) {
+  pagination(obj, searchForm);
+}
+
+async function onSubmit() {
+  const ok = await submitInstanceForm({ skipValidate: true });
+  if (ok) ElMessage.success(isSubmitEdit.value ? "淇敼鎴愬姛" : "鎻愪氦鎴愬姛");
+}
+
+function handleExport() {
+  const data = tableData.value;
+  const blob = new Blob([JSON.stringify(data, null, 2)], { type: "application/json;charset=utf-8" });
+  const url = URL.createObjectURL(blob);
+  const a = document.createElement("a");
+  a.href = url;
+  a.download = `鍔犵彮鐢宠瀵煎嚭_${dayjs().format("YYYYMMDDHHmmss")}.json`;
+  a.click();
+  URL.revokeObjectURL(url);
+  proxy?.$modal?.msgSuccess?.(`宸插鍑� ${data.length} 鏉★紙褰撳墠椤靛垪琛ㄦ暟鎹級`);
+}
+
+onMounted(async () => {
+  loadFlowUsers();
+  await initModuleList(searchForm);
+});
+</script>
+
+<style scoped>
+.mb20 {
+  margin-bottom: 20px;
+}
+.search_form {
+  display: flex;
+  flex-wrap: wrap;
+  align-items: center;
+  justify-content: space-between;
+  gap: 12px;
+}
+.search_actions {
+  display: flex;
+  flex-wrap: wrap;
+  gap: 8px;
+}
+.search_title {
+  font-size: 14px;
+  color: var(--el-text-color-regular);
+}
+</style>
diff --git a/src/views/officeProcessAutomation/ContractManage/purchase-contract/index.vue b/src/views/officeProcessAutomation/ContractManage/purchase-contract/index.vue
new file mode 100644
index 0000000..d6d9ef4
--- /dev/null
+++ b/src/views/officeProcessAutomation/ContractManage/purchase-contract/index.vue
@@ -0,0 +1,12 @@
+<!--
+  妯″潡涓枃鍚嶏細閲囪喘鍚堝悓
+  鐩綍鏍囪瘑锛欳ontractManage/purchase-contract锛坧urchase-contract 鈫� 涓枃锛氶噰璐悎鍚岋級
+  澶嶇敤椤甸潰锛欯/views/procurementManagement/procurementLedger/index.vue锛堥噰璐彴璐︼紱鏂囦欢鍚� index.vue 鈫� 鍏ュ彛椤碉級
+-->
+<template>
+  <ProcurementLedger />
+</template>
+
+<script setup>
+import ProcurementLedger from '@/views/procurementManagement/procurementLedger/index.vue'
+</script>
diff --git a/src/views/officeProcessAutomation/ContractManage/sale-contract/index.vue b/src/views/officeProcessAutomation/ContractManage/sale-contract/index.vue
new file mode 100644
index 0000000..6be106a
--- /dev/null
+++ b/src/views/officeProcessAutomation/ContractManage/sale-contract/index.vue
@@ -0,0 +1,12 @@
+<!--
+  妯″潡涓枃鍚嶏細閿�鍞悎鍚�
+  鐩綍鏍囪瘑锛欳ontractManage/sale-contract锛坰ale-contract 鈫� 涓枃锛氶攢鍞悎鍚岋級
+  澶嶇敤椤甸潰锛欯/views/procurementManagement/procurementLedger/index.vue锛堥噰璐彴璐︼紱鏂囦欢鍚� index.vue 鈫� 鍏ュ彛椤碉級
+-->
+<template>
+  <ProcurementLedger />
+</template>
+
+<script setup>
+import ProcurementLedger from '@/views/procurementManagement/procurementLedger/index.vue'
+</script>
diff --git a/src/views/officeProcessAutomation/EnterpriseNews/news-manage/components/NewsDetailPanel.vue b/src/views/officeProcessAutomation/EnterpriseNews/news-manage/components/NewsDetailPanel.vue
new file mode 100644
index 0000000..1124472
--- /dev/null
+++ b/src/views/officeProcessAutomation/EnterpriseNews/news-manage/components/NewsDetailPanel.vue
@@ -0,0 +1,169 @@
+<!-- EnterpriseNews锛氳鎯呭彧璇婚潰鏉匡紙鍚簰鍔級 -->
+<template>
+  <el-descriptions :column="2" border>
+    <el-descriptions-item label="鏂伴椈缂栧彿">{{ row.newsNo || "鈥�" }}</el-descriptions-item>
+    <el-descriptions-item label="鐘舵��">
+      <el-tag :type="publishStatusTag(row.newsStatus ?? row.publishStatus)" size="small">
+        {{ publishStatusLabel(row.newsStatus ?? row.publishStatus) }}
+      </el-tag>
+    </el-descriptions-item>
+    <el-descriptions-item label="鏂伴椈鍒嗙被">
+      <span class="type-badge" :style="{ color: newsTypeColor(row.newsType) }">
+        {{ newsTypeLabel(row.newsType) }}
+      </span>
+    </el-descriptions-item>
+    <el-descriptions-item label="鎺掔増妯℃澘">{{ layoutTemplateLabel(row.layoutTemplate) }}</el-descriptions-item>
+    <el-descriptions-item label="鏍囬" :span="2">{{ row.title || "鈥�" }}</el-descriptions-item>
+    <el-descriptions-item label="鎽樿" :span="2">{{ row.summary || "鈥�" }}</el-descriptions-item>
+    <el-descriptions-item label="闃呰鑼冨洿">{{ readScopeLabel(row.readScope) }}</el-descriptions-item>
+    <el-descriptions-item label="闃呰鐜�">
+      {{ readRate(row) }}%锛堟湭璇� {{ unreadCount }} 浜猴級
+    </el-descriptions-item>
+    <el-descriptions-item label="缂栬緫鏉冮檺">{{ publishRoleLabel(row.editorRole) }}</el-descriptions-item>
+    <el-descriptions-item label="瀹℃牳瑙掕壊">{{ publishRoleLabel(row.reviewerRole) }}</el-descriptions-item>
+    <el-descriptions-item label="鍙戝竷浜�">{{ row.publisherName || "鈥�" }}</el-descriptions-item>
+    <el-descriptions-item label="鍙戝竷鏃堕棿">{{ row.publishTime || "鈥�" }}</el-descriptions-item>
+    <el-descriptions-item label="褰撳墠鐗堟湰">v{{ row.versionNo || 1 }}</el-descriptions-item>
+    <el-descriptions-item label="闇�闃呰纭">
+      {{ row.requireReadConfirm ? "鏄�" : "鍚�" }}
+    </el-descriptions-item>
+  </el-descriptions>
+
+  <el-divider content-position="left">姝f枃鍐呭</el-divider>
+  <div v-if="row.contentHtml" class="news-html-body" v-html="row.contentHtml" />
+  <el-empty v-else description="鏆傛棤姝f枃" :image-size="48" />
+
+  <template v-if="row.mediaList?.length">
+    <el-divider content-position="left">鍥鹃泦 / 瑙嗛</el-divider>
+    <div class="media-grid">
+      <div v-for="(m, i) in row.mediaList" :key="i" class="media-item">
+        <el-tag size="small" type="info">{{ m.type === "video" ? "瑙嗛" : "鍥剧墖" }}</el-tag>
+        <span class="media-name">{{ m.name }}</span>
+      </div>
+    </div>
+  </template>
+
+  <el-divider content-position="left">闄勪欢</el-divider>
+  <template v-if="row.attachmentList?.length">
+    <el-tag
+      v-for="(f, i) in row.attachmentList"
+      :key="i"
+      class="file-tag"
+      type="info"
+      @click="openFile(f)"
+    >
+      {{ f.name }}
+    </el-tag>
+  </template>
+  <el-empty v-else description="鏆傛棤闄勪欢" :image-size="48" />
+
+  <template v-if="row.newsType === 'culture' && (row.publishStatus === 'PUBLISHED' || row.publishStatus === 'published')">
+    <el-divider content-position="left">浜掑姩锛堢偣璧� {{ likeCount }} 路 璇勮 {{ commentCount }}锛�</el-divider>
+    <div class="interaction-bar">
+      <el-button type="primary" plain size="small" @click="$emit('like')">
+        {{ likedByMe ? "鍙栨秷鐐硅禐" : "鐐硅禐" }}
+      </el-button>
+    </div>
+    <el-input
+      v-model="commentDraft"
+      type="textarea"
+      :rows="2"
+      maxlength="300"
+      show-word-limit
+      placeholder="鍐欎笅浣犵殑璇勮鈥�"
+      class="mb8"
+    />
+    <el-button type="primary" size="small" @click="submitComment">鍙戣〃璇勮</el-button>
+    <el-timeline v-if="row.comments?.length" class="comment-timeline mt12">
+      <el-timeline-item v-for="c in row.comments" :key="c.id" :timestamp="c.time">
+        <strong>{{ c.name }}</strong>锛歿{ c.content }}
+      </el-timeline-item>
+    </el-timeline>
+    <el-empty v-else description="鏆傛棤璇勮" :image-size="40" />
+  </template>
+</template>
+
+<script setup>
+import { computed, ref } from "vue";
+import {
+  newsTypeLabel,
+  newsTypeColor,
+  publishStatusLabel,
+  publishStatusTag,
+  layoutTemplateLabel,
+  readScopeLabel,
+  publishRoleLabel,
+  readRate,
+  getUnreadEmployees,
+} from "../enterpriseNewsUtils.js";
+
+const props = defineProps({
+  row: { type: Object, default: () => ({}) },
+});
+
+const emit = defineEmits(["like", "comment"]);
+
+const commentDraft = ref("");
+
+const unreadCount = computed(() => getUnreadEmployees(props.row).length);
+const likeCount = computed(() => props.row?.likes?.length || 0);
+const commentCount = computed(() => props.row?.comments?.length || 0);
+const likedByMe = computed(() => (props.row?.likes || []).some((l) => l.userId === "u1"));
+
+function openFile(f) {
+  const url = f?.url || f?.downloadURL;
+  if (url) window.open(url, "_blank");
+}
+
+function submitComment() {
+  emit("comment", commentDraft.value);
+  commentDraft.value = "";
+}
+</script>
+
+<style scoped>
+.type-badge {
+  font-weight: 600;
+}
+.news-html-body {
+  padding: 12px 16px;
+  background: var(--el-fill-color-light);
+  border-radius: 6px;
+  line-height: 1.7;
+  max-height: 320px;
+  overflow-y: auto;
+}
+.media-grid {
+  display: flex;
+  flex-wrap: wrap;
+  gap: 12px;
+}
+.media-item {
+  display: flex;
+  align-items: center;
+  gap: 8px;
+  padding: 8px 12px;
+  background: var(--el-fill-color-lighter);
+  border-radius: 4px;
+}
+.media-name {
+  font-size: 13px;
+}
+.file-tag {
+  margin: 0 8px 8px 0;
+  cursor: pointer;
+}
+.interaction-bar {
+  margin-bottom: 8px;
+}
+.comment-timeline {
+  max-height: 200px;
+  overflow-y: auto;
+}
+.mb8 {
+  margin-bottom: 8px;
+}
+.mt12 {
+  margin-top: 12px;
+}
+</style>
diff --git a/src/views/officeProcessAutomation/EnterpriseNews/news-manage/enterpriseNewsApprovalBridge.js b/src/views/officeProcessAutomation/EnterpriseNews/news-manage/enterpriseNewsApprovalBridge.js
new file mode 100644
index 0000000..b870ab7
--- /dev/null
+++ b/src/views/officeProcessAutomation/EnterpriseNews/news-manage/enterpriseNewsApprovalBridge.js
@@ -0,0 +1,11 @@
+/** @deprecated 璇蜂娇鐢� enterpriseNewsMappers.js */
+export {
+  ENTERPRISE_NEWS_PAYLOAD_KEY,
+  buildEnterpriseNewsSaveDto,
+  buildEnterpriseNewsTableColumns,
+  canEditEnterpriseNewsRow,
+  extractEnterpriseNewsFromRow,
+  mapApiRowToNewsForm,
+  mapEnterpriseNewsFromApi,
+  syncNewsFormToSubmitPayload,
+} from "./enterpriseNewsMappers.js";
diff --git a/src/views/officeProcessAutomation/EnterpriseNews/news-manage/enterpriseNewsMappers.js b/src/views/officeProcessAutomation/EnterpriseNews/news-manage/enterpriseNewsMappers.js
new file mode 100644
index 0000000..27cb9bc
--- /dev/null
+++ b/src/views/officeProcessAutomation/EnterpriseNews/news-manage/enterpriseNewsMappers.js
@@ -0,0 +1,221 @@
+import {
+  createEmptyForm,
+  normalizeEnterpriseNewsStatus,
+  publishStatusLabel,
+  publishStatusTag,
+} from "./enterpriseNewsUtils.js";
+
+/** formPayload 涓瓨鏀惧畬鏁翠紒涓氭柊闂讳笟鍔℃暟鎹殑閿紙瀹℃壒瀹炰緥淇濆瓨鐢級 */
+export const ENTERPRISE_NEWS_PAYLOAD_KEY = "enterpriseNews";
+
+const READ_SCOPE_FROM_API = {
+  all: "all",
+  dept: "department",
+  department: "department",
+  custom: "custom",
+  management: "management",
+};
+
+const READ_SCOPE_TO_API = {
+  all: "all",
+  department: "dept",
+  dept: "dept",
+  custom: "custom",
+  management: "all",
+};
+
+export function mapReadScopeFromApi(scope) {
+  const key = String(scope ?? "").trim().toLowerCase();
+  return READ_SCOPE_FROM_API[key] || key || "all";
+}
+
+export function mapReadScopeToApi(scope) {
+  return READ_SCOPE_TO_API[scope] || scope || "all";
+}
+
+export function unwrapEnterpriseNewsPage(res) {
+  const data = res?.data ?? res;
+  if (!data || typeof data !== "object") {
+    return { records: [], total: 0 };
+  }
+  if (Array.isArray(data.records)) {
+    return { records: data.records, total: Number(data.total ?? 0) };
+  }
+  const nested = data.data;
+  if (nested && typeof nested === "object" && Array.isArray(nested.records)) {
+    return { records: nested.records, total: Number(nested.total ?? 0) };
+  }
+  return { records: [], total: 0 };
+}
+
+/** 缁勮 listPage 鏌ヨ鍙傛暟 */
+export function buildEnterpriseNewsListParams({ page, searchForm }) {
+  const params = {
+    current: page.current,
+    size: page.size,
+  };
+  const kw = (searchForm?.keyword || "").trim();
+  if (kw) params.title = kw;
+  if (searchForm?.newsType) params.category = searchForm.newsType;
+  if (searchForm?.status) params.status = searchForm.status;
+  const range = searchForm?.createTimeRange;
+  if (Array.isArray(range) && range[0]) {
+    params.createTimeStart = range[0];
+  }
+  if (Array.isArray(range) && range[1]) {
+    params.createTimeEnd = range[1];
+  }
+  return params;
+}
+
+/** 鎺ュ彛 EnterpriseNewsVo 鈫� 鍒楄〃琛� */
+export function mapEnterpriseNewsFromApi(row) {
+  if (!row) return {};
+  const newsStatus = normalizeEnterpriseNewsStatus(row.status);
+  return {
+    ...row,
+    newsNo: row.id != null ? String(row.id) : "鈥�",
+    newsType: row.category || "",
+    contentHtml: row.content || "",
+    publisherName: row.createUserName || "鈥�",
+    publishTime: row.createTime || "",
+    updateTime: row.updateTime || "",
+    newsStatus,
+    requireReadConfirm: row.isRequired === "1" || row.isRequired === 1,
+    readScope: mapReadScopeFromApi(row.readScope),
+    readCount: row.readCount ?? 0,
+    requiredReadCount: row.requiredReadCount ?? 0,
+  };
+}
+
+/** 鏄惁鍏佽淇敼锛堣崏绋裤�侀┏鍥炲彲鏀癸級 */
+export function canEditEnterpriseNewsRow(row) {
+  const status = normalizeEnterpriseNewsStatus(row?.newsStatus ?? row?.status);
+  return status === "DRAFT" || status === "REJECTED";
+}
+
+/** 鎺ュ彛琛� / 璇︽儏 鈫� 琛ㄥ崟 */
+export function mapApiRowToNewsForm(row) {
+  if (!row) return createEmptyForm();
+  return {
+    ...createEmptyForm(),
+    id: row.id != null ? String(row.id) : "",
+    newsNo: row.id != null ? String(row.id) : "",
+    title: row.title || "",
+    summary: row.summary || "",
+    contentHtml: row.content || row.contentHtml || "",
+    newsType: row.newsType || row.category || "announcement",
+    readScope: mapReadScopeFromApi(row.readScope),
+    requireReadConfirm: Boolean(row.requireReadConfirm ?? row.isRequired === "1"),
+    publisherName: row.createUserName || row.publisherName || "",
+    publishStatus: normalizeEnterpriseNewsStatus(row.newsStatus ?? row.status),
+    templateId: row.templateId,
+    templateName: row.templateName || "",
+    targetDeptIds: [...(row.deptIds || row.targetDeptIds || [])],
+    targetUserIds: [...(row.userIds || row.targetUserIds || [])],
+  };
+}
+
+/** 瀹℃壒瀹炰緥琛� formPayload 鈫� 琛ㄥ崟锛堝吋瀹规棫鏁版嵁锛� */
+export function extractEnterpriseNewsFromRow(row) {
+  if (!row?.formPayload && !row?.formFieldDefs && !row?.instanceNo) {
+    return mapApiRowToNewsForm(row);
+  }
+  const payload = row?.formPayload || {};
+  const raw = payload[ENTERPRISE_NEWS_PAYLOAD_KEY];
+  if (raw && typeof raw === "object") {
+    return { ...createEmptyForm(), ...raw };
+  }
+  return {
+    ...createEmptyForm(),
+    title: payload.title || row?.title || "",
+    summary: payload.summary || "",
+    newsType: payload.newsType || row?.category || "announcement",
+    contentHtml: payload.contentHtml || row?.content || "",
+  };
+}
+
+export function syncNewsFormToSubmitPayload(newsForm, submitForm) {
+  const snapshot = JSON.parse(JSON.stringify(newsForm));
+  submitForm.formPayload = {
+    ...(submitForm.formPayload || {}),
+    [ENTERPRISE_NEWS_PAYLOAD_KEY]: snapshot,
+    title: snapshot.title,
+    summary: snapshot.summary,
+  };
+}
+
+function toIdList(ids) {
+  if (!Array.isArray(ids) || !ids.length) return undefined;
+  const list = ids
+    .map((id) => (typeof id === "number" ? id : Number(id)))
+    .filter((n) => !Number.isNaN(n));
+  return list.length ? list : undefined;
+}
+
+/** 琛ㄥ崟 鈫� POST /enterpriseNews/save 璇锋眰浣� */
+export function buildEnterpriseNewsSaveDto(newsForm, { status } = {}) {
+  const dto = {
+    title: (newsForm.title || "").trim(),
+    summary: newsForm.summary || "",
+    content: newsForm.contentHtml || "",
+    category: newsForm.newsType || "",
+    readScope: mapReadScopeToApi(newsForm.readScope),
+    isRequired: newsForm.requireReadConfirm ? "1" : "0",
+    status: normalizeEnterpriseNewsStatus(status ?? newsForm.publishStatus),
+  };
+
+  const rawId = newsForm.id;
+  if (rawId != null && rawId !== "") {
+    const id = Number(rawId);
+    if (!Number.isNaN(id)) dto.id = id;
+  }
+
+  const deptIds = toIdList(newsForm.targetDeptIds);
+  if (deptIds) dto.deptIds = deptIds;
+
+  const userIds = toIdList(newsForm.targetUserIds);
+  if (userIds) dto.userIds = userIds;
+
+  const templateId = newsForm.templateId;
+  if (templateId != null && templateId !== "") {
+    const tid = Number(templateId);
+    if (!Number.isNaN(tid)) dto.templateId = tid;
+  }
+  if (newsForm.templateName) dto.templateName = newsForm.templateName;
+
+  return dto;
+}
+
+export function buildEnterpriseNewsTableColumns(buildTableActions) {
+  return [
+    { label: "缂栧彿", prop: "newsNo", width: 120 },
+    { label: "鏍囬", prop: "title", minWidth: 180, showOverflowTooltip: true },
+    {
+      label: "鍒嗙被",
+      prop: "newsType",
+      width: 100,
+      dataType: "slot",
+      slot: "newsType",
+    },
+    {
+      label: "鐘舵��",
+      prop: "newsStatus",
+      width: 100,
+      dataType: "tag",
+      formatData: (v) => publishStatusLabel(v),
+      formatType: (v) => publishStatusTag(v),
+    },
+    { label: "鍒涘缓浜�", prop: "publisherName", width: 110 },
+    { label: "鍒涘缓鏃堕棿", prop: "createTime", width: 170 },
+    { label: "鏇存柊鏃堕棿", prop: "updateTime", width: 170 },
+    {
+      dataType: "action",
+      label: "鎿嶄綔",
+      align: "center",
+      fixed: "right",
+      width: 220,
+      operation: buildTableActions(),
+    },
+  ];
+}
diff --git a/src/views/officeProcessAutomation/EnterpriseNews/news-manage/enterpriseNewsUtils.js b/src/views/officeProcessAutomation/EnterpriseNews/news-manage/enterpriseNewsUtils.js
new file mode 100644
index 0000000..9bc29c3
--- /dev/null
+++ b/src/views/officeProcessAutomation/EnterpriseNews/news-manage/enterpriseNewsUtils.js
@@ -0,0 +1,207 @@
+import dayjs from "dayjs";
+
+/** 鏂伴椈鍒嗙被锛氱粺涓�淇℃伅鍑哄彛 */
+export const NEWS_TYPE_OPTIONS = [
+  { value: "announcement", label: "浼佷笟鍏憡", color: "#409eff" },
+  { value: "policy", label: "鏀跨瓥瑙h", color: "#e6a23c" },
+  { value: "industry", label: "琛屼笟鍔ㄦ��", color: "#909399" },
+  { value: "culture", label: "鏂囧寲娲诲姩", color: "#67c23a" },
+];
+
+/** 浼佷笟鏂伴椈鐘舵�侊紙涓庡悗绔灇涓句竴鑷达級 */
+export const PUBLISH_STATUS_OPTIONS = [
+  { value: "DRAFT", label: "鑽夌", tag: "info" },
+  { value: "PENDING", label: "寰呭鎵�", tag: "warning" },
+  { value: "PUBLISHED", label: "宸插彂甯�", tag: "success" },
+  { value: "REJECTED", label: "椹冲洖", tag: "danger" },
+  { value: "OFFLINE", label: "宸蹭笅绾�", tag: "info" },
+];
+
+/** 浼佷笟鏂伴椈鍒楄〃绛涢�� */
+export const ENTERPRISE_NEWS_STATUS_SEARCH_OPTIONS = [...PUBLISH_STATUS_OPTIONS];
+
+const LEGACY_PUBLISH_STATUS_MAP = {
+  draft: "DRAFT",
+  pending_review: "PENDING",
+  published: "PUBLISHED",
+  archived: "OFFLINE",
+};
+
+/** 鍚庣鏁板瓧鐘舵�佺爜 鈫� 鏋氫妇锛�0 鑽夌 1 寰呭鎵� 2 宸插彂甯� 3 椹冲洖 4 宸蹭笅绾匡級 */
+const ENTERPRISE_NEWS_STATUS_NUMERIC_MAP = {
+  0: "DRAFT",
+  1: "PENDING",
+  2: "PUBLISHED",
+  3: "REJECTED",
+  4: "OFFLINE",
+};
+
+const ENTERPRISE_NEWS_STATUS_LABEL_MAP = {
+  鑽夌: "DRAFT",
+  寰呭鎵�: "PENDING",
+  宸插彂甯�: "PUBLISHED",
+  椹冲洖: "REJECTED",
+  宸查┏鍥�: "REJECTED",
+  宸蹭笅绾�: "OFFLINE",
+};
+
+/** 缁熶竴涓哄悗绔姸鎬佹灇涓惧�� */
+export function normalizeEnterpriseNewsStatus(v) {
+  if (v == null || v === "") return "DRAFT";
+  if (typeof v === "number" || (typeof v === "string" && /^\d+$/.test(v.trim()))) {
+    const numKey = ENTERPRISE_NEWS_STATUS_NUMERIC_MAP[Number(v)];
+    if (numKey) return numKey;
+  }
+  const raw = String(v).trim();
+  if (ENTERPRISE_NEWS_STATUS_LABEL_MAP[raw]) {
+    return ENTERPRISE_NEWS_STATUS_LABEL_MAP[raw];
+  }
+  const upper = raw.toUpperCase();
+  if (upper === "APPROVED") return "PUBLISHED";
+  const hit = PUBLISH_STATUS_OPTIONS.find((x) => x.value === upper);
+  if (hit) return hit.value;
+  const legacy = LEGACY_PUBLISH_STATUS_MAP[raw.toLowerCase()];
+  if (legacy) return legacy;
+  return upper;
+}
+
+/** 鎺掔増妯℃澘 */
+export const LAYOUT_TEMPLATE_OPTIONS = [
+  { value: "standard", label: "鏍囧噯鍥炬枃" },
+  { value: "policy", label: "鏀跨瓥鏉℃枃" },
+  { value: "gallery", label: "鍥鹃泦鐩稿唽" },
+  { value: "briefing", label: "绠�鎶ユ憳瑕�" },
+];
+
+/** 闃呰鍙鑼冨洿 */
+export const READ_SCOPE_OPTIONS = [
+  { value: "all", label: "鍏ㄥ憳鍙" },
+  { value: "management", label: "绠$悊灞�" },
+  { value: "department", label: "鎸囧畾閮ㄩ棬" },
+  { value: "custom", label: "鑷畾涔夊悕鍗�" },
+];
+
+/** 缂栬緫/瀹℃牳瑙掕壊锛堝彂甯冩潈闄愶級 */
+export const PUBLISH_ROLE_OPTIONS = [
+  { value: "hr", label: "HR锛堜汉浜嬫斂绛栵級" },
+  { value: "admin", label: "绠$悊鍛橈紙澶栭儴鏂伴椈瀹℃牳锛�" },
+  { value: "dept_manager", label: "閮ㄩ棬璐熻矗浜�" },
+  { value: "editor", label: "鍐呭缂栬緫" },
+];
+
+/** 鐩爣鍙椾紬锛堝鎺ョ粍缁囨灦鏋� API 鍓嶄负绌猴級 */
+export const MOCK_AUDIENCE = [];
+
+const DEPT_OPTIONS = [
+  { value: "101", label: "鐮斿彂閮�" },
+  { value: "102", label: "閿�鍞儴" },
+  { value: "103", label: "琛屾斂閮�" },
+  { value: "104", label: "璐㈠姟閮�" },
+  { value: "105", label: "鎬荤粡鍔�" },
+  { value: "106", label: "浜哄姏璧勬簮閮�" },
+];
+
+export { DEPT_OPTIONS };
+
+export function newsTypeLabel(v) {
+  return NEWS_TYPE_OPTIONS.find((x) => x.value === v)?.label || v || "鈥�";
+}
+
+export function newsTypeColor(v) {
+  return NEWS_TYPE_OPTIONS.find((x) => x.value === v)?.color || "#909399";
+}
+
+export function publishStatusLabel(v) {
+  const key = normalizeEnterpriseNewsStatus(v);
+  return PUBLISH_STATUS_OPTIONS.find((x) => x.value === key)?.label || v || "鈥�";
+}
+
+export function publishStatusTag(v) {
+  const key = normalizeEnterpriseNewsStatus(v);
+  return PUBLISH_STATUS_OPTIONS.find((x) => x.value === key)?.tag || "info";
+}
+
+export function layoutTemplateLabel(v) {
+  return LAYOUT_TEMPLATE_OPTIONS.find((x) => x.value === v)?.label || v || "鈥�";
+}
+
+export function readScopeLabel(v) {
+  return READ_SCOPE_OPTIONS.find((x) => x.value === v)?.label || v || "鈥�";
+}
+
+export function publishRoleLabel(v) {
+  return PUBLISH_ROLE_OPTIONS.find((x) => x.value === v)?.label || v || "鈥�";
+}
+
+export function createEmptyForm() {
+  return {
+    id: "",
+    newsNo: "",
+    title: "",
+    summary: "",
+    newsType: "announcement",
+    layoutTemplate: "standard",
+    contentHtml: "",
+    coverImage: "",
+    mediaList: [],
+    attachmentList: [],
+    editorRole: "hr",
+    reviewerRole: "admin",
+    readScope: "all",
+    targetDeptIds: [],
+    targetUserIds: [],
+    publishStatus: "DRAFT",
+    publisherName: "",
+    publishTime: "",
+    readRecords: [],
+    remindLogs: [],
+    likes: [],
+    comments: [],
+    versions: [],
+    versionNo: 1,
+    requireReadConfirm: false,
+    templateId: null,
+    templateName: "",
+  };
+}
+
+/** 鎸夐槄璇昏寖鍥磋В鏋愮洰鏍囧彈浼� */
+export function resolveTargetAudience(row) {
+  const scope = row.readScope || "all";
+  if (scope === "management") {
+    return MOCK_AUDIENCE.filter((u) => u.isManagement);
+  }
+  if (scope === "department" && row.targetDeptIds?.length) {
+    const names = DEPT_OPTIONS.filter((d) => row.targetDeptIds.includes(d.value)).map((d) => d.label);
+    return MOCK_AUDIENCE.filter((u) => names.includes(u.deptName));
+  }
+  if (scope === "custom" && row.targetUserIds?.length) {
+    return MOCK_AUDIENCE.filter((u) => row.targetUserIds.includes(u.userId));
+  }
+  return [...MOCK_AUDIENCE];
+}
+
+export function getUnreadEmployees(row) {
+  const audience = resolveTargetAudience(row);
+  const readSet = new Set(
+    (row.readRecords || []).filter((r) => r.readAt).map((r) => r.userId)
+  );
+  return audience.filter((u) => !readSet.has(u.userId));
+}
+
+export function readRate(row) {
+  const audience = resolveTargetAudience(row);
+  if (!audience.length) return 0;
+  const readCount = (row.readRecords || []).filter((r) => r.readAt).length;
+  return Math.round((readCount / audience.length) * 100);
+}
+
+export function validateNewsForm(form) {
+  const title = (form.title || "").trim();
+  if (!title) return { ok: false, message: "璇峰~鍐欐柊闂绘爣棰�" };
+  if (!form.newsType) return { ok: false, message: "璇烽�夋嫨鏂伴椈鍒嗙被" };
+  if (form.readScope === "department" && !(form.targetDeptIds || []).length) {
+    return { ok: false, message: "璇烽�夋嫨鍙閮ㄩ棬" };
+  }
+  return { ok: true, title };
+}
diff --git a/src/views/officeProcessAutomation/EnterpriseNews/news-manage/index.vue b/src/views/officeProcessAutomation/EnterpriseNews/news-manage/index.vue
new file mode 100644
index 0000000..f263a41
--- /dev/null
+++ b/src/views/officeProcessAutomation/EnterpriseNews/news-manage/index.vue
@@ -0,0 +1,566 @@
+<!--OA妯″潡锛欵nterpriseNews 浼佷笟鏂伴椈锛坙istPage|save|update|delete锛屾柊寤轰繚鐣欏鎵规ā鏉匡級-->
+<template>
+  <div class="app-container enterprise-news-page">
+    <div class="search_form mb20">
+      <div class="search_fields">
+        <span class="search_title">鍏抽敭璇嶏細</span>
+        <el-input
+          v-model="searchForm.keyword"
+          style="width: 200px"
+          placeholder="鏍囬"
+          clearable
+          :prefix-icon="Search"
+          @keyup.enter="onSearch"
+        />
+        <span class="search_title" style="margin-left: 12px">鍒嗙被锛�</span>
+        <el-select v-model="searchForm.newsType" placeholder="鍏ㄩ儴" clearable style="width: 140px">
+          <el-option v-for="opt in NEWS_TYPE_OPTIONS" :key="opt.value" :label="opt.label" :value="opt.value" />
+        </el-select>
+        <span class="search_title" style="margin-left: 12px">鐘舵�侊細</span>
+        <el-select v-model="searchForm.status" placeholder="鍏ㄩ儴" clearable style="width: 120px">
+          <el-option
+            v-for="opt in ENTERPRISE_NEWS_STATUS_SEARCH_OPTIONS"
+            :key="opt.value"
+            :label="opt.label"
+            :value="opt.value"
+          />
+        </el-select>
+        <span class="search_title" style="margin-left: 12px">鍒涘缓鏃堕棿锛�</span>
+        <el-date-picker
+          v-model="searchForm.createTimeRange"
+          type="daterange"
+          range-separator="-"
+          start-placeholder="寮�濮�"
+          end-placeholder="缁撴潫"
+          format="YYYY-MM-DD"
+          value-format="YYYY-MM-DD"
+          style="width: 260px"
+          clearable
+        />
+        <el-button type="primary" :icon="Search" class="ml10" @click="onSearch">鎼滅储</el-button>
+        <el-button :icon="RefreshRight" @click="resetSearch">閲嶇疆</el-button>
+      </div>
+      <div class="search_actions">
+        <el-button type="primary" :icon="Plus" @click="openAddWithTemplate">鏂板缓鏂伴椈</el-button>
+      </div>
+    </div>
+
+    <div class="table_list">
+      <PIMTable
+        rowKey="id"
+        :column="tableColumn"
+        :tableData="tableData"
+        :page="page"
+        :isSelection="false"
+        :tableLoading="tableLoading"
+        :total="page.total"
+        @pagination="onPagination"
+      >
+        <template #newsType="{ row }">
+          <span class="news-type-tag" :style="{ color: newsTypeColor(row.newsType) }">
+            {{ newsTypeLabel(row.newsType) }}
+          </span>
+        </template>
+      </PIMTable>
+    </div>
+
+    <ApprovalTemplateBindDialog
+      v-model:visible="templateBindVisible"
+      :module-key="APPROVAL_MODULE_KEYS.ENTERPRISE_NEWS"
+      skip-form-confirm
+      @confirm="onTemplateBound"
+      @closed="onTemplateBindClosed"
+    />
+
+    <el-dialog
+      v-model="newsFormDialog.visible"
+      :title="newsFormDialog.title"
+      width="960px"
+      append-to-body
+      destroy-on-close
+      class="news-form-dialog"
+      @closed="onNewsFormClosed"
+    >
+      <el-form
+        ref="newsFormRef"
+        :model="newsForm"
+        :rules="newsFormRules"
+        label-width="110px"
+        :disabled="newsFormDialog.readonly"
+      >
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="鏂伴椈鍒嗙被" prop="newsType">
+              <el-select v-model="newsForm.newsType" placeholder="璇烽�夋嫨" style="width: 100%">
+                <el-option v-for="opt in NEWS_TYPE_OPTIONS" :key="opt.value" :label="opt.label" :value="opt.value" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鎺掔増妯℃澘">
+              <el-select v-model="newsForm.layoutTemplate" style="width: 100%">
+                <el-option
+                  v-for="opt in LAYOUT_TEMPLATE_OPTIONS"
+                  :key="opt.value"
+                  :label="opt.label"
+                  :value="opt.value"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-form-item label="鏍囬" prop="title">
+          <el-input v-model="newsForm.title" placeholder="鏂伴椈鏍囬" maxlength="100" show-word-limit />
+        </el-form-item>
+        <el-form-item label="鎽樿">
+          <el-input v-model="newsForm.summary" type="textarea" :rows="2" maxlength="300" show-word-limit />
+        </el-form-item>
+        <el-form-item label="姝f枃" prop="contentHtml">
+          <Editor v-model="newsForm.contentHtml" :min-height="280" />
+        </el-form-item>
+        <el-form-item label="闄勪欢">
+          <FileUpload v-model:file-list="newsForm.attachmentList" :limit="10" button-text="涓婁紶 PDF / 鏂囨。" />
+        </el-form-item>
+        <el-form-item v-if="newsForm.layoutTemplate === 'gallery'" label="鍥鹃泦/瑙嗛">
+          <el-input
+            v-model="galleryInput"
+            placeholder="杈撳叆璧勬簮鍚嶇О鍚庡洖杞︽坊鍔狅紙婕旂ず锛�"
+            @keyup.enter="addGalleryItem"
+          />
+          <el-tag
+            v-for="(m, i) in newsForm.mediaList"
+            :key="i"
+            closable
+            class="media-tag"
+            @close="newsForm.mediaList.splice(i, 1)"
+          >
+            {{ m.name }}
+          </el-tag>
+        </el-form-item>
+
+        <el-divider content-position="left">鏉冮檺绠℃帶</el-divider>
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="缂栬緫瑙掕壊">
+              <el-select v-model="newsForm.editorRole" style="width: 100%">
+                <el-option v-for="opt in PUBLISH_ROLE_OPTIONS" :key="opt.value" :label="opt.label" :value="opt.value" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="瀹℃牳瑙掕壊">
+              <el-select v-model="newsForm.reviewerRole" style="width: 100%">
+                <el-option v-for="opt in PUBLISH_ROLE_OPTIONS" :key="opt.value" :label="opt.label" :value="opt.value" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-form-item label="闃呰鑼冨洿" prop="readScope">
+          <el-radio-group v-model="newsForm.readScope">
+            <el-radio v-for="opt in READ_SCOPE_OPTIONS" :key="opt.value" :value="opt.value">
+              {{ opt.label }}
+            </el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item v-if="newsForm.readScope === 'department'" label="鍙閮ㄩ棬">
+          <el-select v-model="newsForm.targetDeptIds" multiple placeholder="閫夋嫨閮ㄩ棬" style="width: 100%">
+            <el-option v-for="d in DEPT_OPTIONS" :key="d.value" :label="d.label" :value="d.value" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="鏀跨瓥绫诲繀璇�">
+          <el-switch v-model="newsForm.requireReadConfirm" active-text="闇�闃呰纭锛堜究浜庣粺璁℃湭璇伙級" />
+        </el-form-item>
+
+        <template v-if="hasApprovalTemplate">
+          <el-divider content-position="left">瀹℃壒娴佺▼</el-divider>
+          <el-form-item label="瀹℃壒妯℃澘">
+            <span class="template-name">{{ approvalTemplateLabel }}</span>
+          </el-form-item>
+          <el-form-item v-if="activeTemplate" label="瀹℃壒娴佺▼" required>
+            <TemplateFlowEditor v-model="submitForm.flowNodes" :user-options="flowUserOptions" />
+            <p class="section-tip">娴佺▼涓庡鎵逛汉鐢辨ā鏉块缃紝鍙寜闇�寰皟鑺傜偣瀹℃壒浜恒��</p>
+          </el-form-item>
+        </template>
+        <el-alert
+          v-else-if="!isNewsEdit"
+          type="warning"
+          show-icon
+          :closable="false"
+          title="璇峰厛閫氳繃銆屾柊寤烘柊闂汇�嶉�夋嫨瀹℃壒妯℃澘"
+        />
+      </el-form>
+      <template v-if="!newsFormDialog.readonly" #footer>
+        <el-button @click="newsFormDialog.visible = false">鍙� 娑�</el-button>
+        <el-button :loading="newsSaving" @click="onNewsSave('draft')">瀛樿崏绋�</el-button>
+        <el-button type="warning" :loading="newsSaving" @click="onNewsSave('submit_review')">
+          鎻愪氦瀹℃牳
+        </el-button>
+        <el-button type="primary" :loading="newsSaving" @click="onNewsSave('submit_review')">
+          淇� 瀛�
+        </el-button>
+      </template>
+    </el-dialog>
+
+    <el-dialog v-model="detailDialog.visible" title="鏂伴椈璇︽儏" width="880px" append-to-body destroy-on-close>
+      <NewsDetailPanel :row="detailNewsRow" />
+      <template #footer>
+        <el-button v-if="canEditEnterpriseNewsRow(detailRow)" type="primary" @click="openNewsEditFromDetail">
+          淇敼
+        </el-button>
+        <el-button @click="detailDialog.visible = false">鍏� 闂�</el-button>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup>
+import { Plus, RefreshRight, Search } from "@element-plus/icons-vue";
+import { ElMessage, ElMessageBox } from "element-plus";
+import {
+  deleteEnterpriseNews,
+  saveEnterpriseNews,
+  updateEnterpriseNews,
+} from "@/api/officeProcessAutomation/enterpriseNews.js";
+import { computed, onMounted, reactive, ref } from "vue";
+import Editor from "@/components/Editor/index.vue";
+import FileUpload from "@/components/AttachmentUpload/file/index.vue";
+import ApprovalTemplateBindDialog from "../../ApproveManage/approve-shared/components/ApprovalTemplateBindDialog.vue";
+import TemplateFlowEditor from "../../ApproveManage/approve-template/components/TemplateFlowEditor.vue";
+import {
+  applyBindingToForm,
+  validateTemplateBinding,
+} from "../../ApproveManage/approve-shared/approvalTemplateBindingUtils.js";
+import { createEmptySubmitForm } from "../../ApproveManage/approve-list/approveListConstants.js";
+import { APPROVAL_MODULE_KEYS } from "../../ApproveManage/approve-shared/approvalModuleRegistry.js";
+import { useFlowUserOptions } from "../../ApproveManage/approve-shared/useFlowUserOptions.js";
+import NewsDetailPanel from "./components/NewsDetailPanel.vue";
+import {
+  NEWS_TYPE_OPTIONS,
+  LAYOUT_TEMPLATE_OPTIONS,
+  READ_SCOPE_OPTIONS,
+  PUBLISH_ROLE_OPTIONS,
+  DEPT_OPTIONS,
+  createEmptyForm,
+  ENTERPRISE_NEWS_STATUS_SEARCH_OPTIONS,
+  newsTypeColor,
+  newsTypeLabel,
+  validateNewsForm,
+} from "./enterpriseNewsUtils.js";
+import {
+  buildEnterpriseNewsSaveDto,
+  buildEnterpriseNewsTableColumns,
+  canEditEnterpriseNewsRow,
+  mapApiRowToNewsForm,
+} from "./enterpriseNewsMappers.js";
+import { useEnterpriseNewsList } from "./useEnterpriseNewsList.js";
+
+const searchForm = reactive({
+  keyword: "",
+  newsType: "",
+  status: "",
+  createTimeRange: null,
+});
+
+const newsFormDialog = reactive({ visible: false, title: "", mode: "add", readonly: false });
+const detailDialog = reactive({ visible: false });
+const detailRow = ref({});
+const newsForm = reactive(createEmptyForm());
+const newsFormRef = ref();
+const galleryInput = ref("");
+
+const newsFormRules = {
+  title: [{ required: true, message: "璇疯緭鍏ユ柊闂绘爣棰�", trigger: "blur" }],
+  newsType: [{ required: true, message: "璇烽�夋嫨鏂伴椈鍒嗙被", trigger: "change" }],
+  readScope: [{ required: true, message: "璇烽�夋嫨闃呰鑼冨洿", trigger: "change" }],
+};
+
+const newsList = useEnterpriseNewsList();
+const { tableData, tableLoading, page, handleQuery: fetchNewsList, pagination: paginateNewsList } =
+  newsList;
+
+const submitForm = reactive(createEmptySubmitForm(""));
+const templateBindVisible = ref(false);
+const pendingTemplateBinding = ref(null);
+const newsSaving = ref(false);
+
+const isNewsEdit = computed(() => newsFormDialog.mode === "edit");
+const activeTemplate = computed(() => submitForm.templateSnapshot || null);
+const hasApprovalTemplate = computed(
+  () => Boolean(activeTemplate.value || newsForm.templateId)
+);
+const approvalTemplateLabel = computed(
+  () =>
+    activeTemplate.value?.label ||
+    newsForm.templateName ||
+    submitForm.templateName ||
+    "鈥�"
+);
+
+const { flowUserOptions, loadFlowUsers } = useFlowUserOptions();
+
+function openAddWithTemplate() {
+  pendingTemplateBinding.value = null;
+  templateBindVisible.value = true;
+}
+
+function onTemplateBound(binding) {
+  pendingTemplateBinding.value = binding;
+}
+
+function resetSubmitForm() {
+  Object.assign(submitForm, createEmptySubmitForm(""));
+}
+
+const detailNewsRow = computed(() => mapApiRowToNewsForm(detailRow.value));
+
+const tableColumn = ref(
+  buildEnterpriseNewsTableColumns(() => [
+    { name: "璇︽儏", type: "text", clickFun: (row) => openNewsDetail(row) },
+    {
+      name: "淇敼",
+      type: "text",
+      disabled: (row) => !canEditEnterpriseNewsRow(row),
+      clickFun: (row) => openNewsEdit(row),
+    },
+    {
+      name: "鍒犻櫎",
+      type: "danger",
+      disabled: (row) => !canEditEnterpriseNewsRow(row),
+      clickFun: (row) => handleNewsDelete(row),
+    },
+  ])
+);
+
+function resetNewsForm(target = createEmptyForm()) {
+  Object.assign(newsForm, createEmptyForm(), target);
+}
+
+function openNewsFormDialog(mode, row) {
+  newsFormDialog.mode = mode;
+  newsFormDialog.readonly = mode === "view";
+  newsFormDialog.title =
+    mode === "add" ? "鏂板缓浼佷笟鏂伴椈" : mode === "edit" ? "缂栬緫浼佷笟鏂伴椈" : "鏌ョ湅浼佷笟鏂伴椈";
+  if (mode === "add") {
+    resetNewsForm();
+  } else if (row) {
+    resetNewsForm(mapApiRowToNewsForm(row));
+  }
+  newsFormDialog.visible = true;
+}
+
+function onTemplateBindClosed() {
+  const binding = pendingTemplateBinding.value;
+  if (!binding) return;
+  pendingTemplateBinding.value = null;
+  resetSubmitForm();
+  applyBindingToForm(submitForm, binding);
+  if (binding.templateId) {
+    newsForm.templateId = binding.templateId;
+    newsForm.templateName = binding.templateName || "";
+  }
+  openNewsFormDialog("add");
+}
+
+function openNewsEdit(row) {
+  if (!canEditEnterpriseNewsRow(row)) {
+    ElMessage.warning("褰撳墠鐘舵�佷笉鍙慨鏀�");
+    return;
+  }
+  resetSubmitForm();
+  if (row?.templateId != null) {
+    submitForm.templateId = row.templateId;
+    submitForm.templateName = row.templateName || "";
+  }
+  openNewsFormDialog("edit", row);
+}
+
+function openNewsDetail(row) {
+  detailRow.value = { ...row };
+  detailDialog.visible = true;
+}
+
+function openNewsEditFromDetail() {
+  const row = detailRow.value;
+  detailDialog.visible = false;
+  openNewsEdit(row);
+}
+
+async function handleNewsDelete(row) {
+  if (!canEditEnterpriseNewsRow(row)) {
+    ElMessage.warning("褰撳墠鐘舵�佷笉鍙垹闄�");
+    return;
+  }
+  if (row?.id == null || row.id === "") {
+    ElMessage.warning("鏃犳硶鍒犻櫎锛氱己灏戞柊闂� ID");
+    return;
+  }
+  const title = (row.title || "").trim() || "璇ユ潯鏂伴椈";
+  try {
+    await ElMessageBox.confirm(
+      `纭畾瑕佸垹闄ゃ��${title}銆嶅悧锛熷垹闄ゅ悗涓嶅彲鎭㈠銆俙,
+      "鍒犻櫎纭",
+      {
+        type: "warning",
+        confirmButtonText: "纭畾鍒犻櫎",
+        cancelButtonText: "鍙栨秷",
+        distinguishCancelAndClose: true,
+        autofocus: false,
+      }
+    );
+  } catch {
+    return;
+  }
+  try {
+    await deleteEnterpriseNews([row.id]);
+    ElMessage.success("鍒犻櫎鎴愬姛");
+    await fetchNewsList(searchForm);
+  } catch {
+    /* 閿欒鐢辫姹傛嫤鎴櫒鎻愮ず */
+  }
+}
+
+function onNewsFormClosed() {
+  newsFormRef.value?.resetFields?.();
+}
+
+function addGalleryItem() {
+  const name = (galleryInput.value || "").trim();
+  if (!name) return;
+  newsForm.mediaList = newsForm.mediaList || [];
+  newsForm.mediaList.push({ type: "image", name, url: "" });
+  galleryInput.value = "";
+}
+
+async function onNewsSave(action = "submit_review") {
+  try {
+    await newsFormRef.value?.validate();
+  } catch {
+    ElMessage.warning("璇峰畬鍠勮〃鍗曞繀濉」鍚庡啀淇濆瓨");
+    return;
+  }
+  const v = validateNewsForm(newsForm);
+  if (!v.ok) {
+    ElMessage.warning(v.message);
+    return;
+  }
+  const status = action === "draft" ? "DRAFT" : "PENDING";
+  newsForm.publishStatus = status;
+
+  if (!isNewsEdit.value) {
+    const templateId = newsForm.templateId || submitForm.templateId;
+    if (!templateId) {
+      ElMessage.warning("璇峰厛閫夋嫨瀹℃壒妯℃澘");
+      return;
+    }
+    if (!newsForm.templateId) newsForm.templateId = templateId;
+    if (!newsForm.templateName && submitForm.templateName) {
+      newsForm.templateName = submitForm.templateName;
+    }
+    if (action !== "draft") {
+      const bindingCheck = validateTemplateBinding({ flowNodes: submitForm.flowNodes });
+      if (!bindingCheck.ok) {
+        ElMessage.warning(bindingCheck.message);
+        return;
+      }
+    }
+  } else if (!newsForm.templateId && submitForm.templateId) {
+    newsForm.templateId = submitForm.templateId;
+    newsForm.templateName = submitForm.templateName || newsForm.templateName;
+  }
+
+  const dto = buildEnterpriseNewsSaveDto(newsForm, { status });
+  if (isNewsEdit.value) {
+    if (dto.id == null) {
+      ElMessage.warning("鏃犳硶淇敼锛氱己灏戞柊闂� ID");
+      return;
+    }
+  }
+
+  if (newsSaving.value) return;
+  newsSaving.value = true;
+  try {
+    if (isNewsEdit.value) {
+      await updateEnterpriseNews(dto);
+    } else {
+      await saveEnterpriseNews(dto);
+    }
+    newsFormDialog.visible = false;
+    const msg =
+      action === "draft" ? "宸蹭繚瀛樿崏绋�" : isNewsEdit.value ? "淇敼鎴愬姛" : "宸叉彁浜ゅ鏍�";
+    ElMessage.success(msg);
+    if (!isNewsEdit.value) page.current = 1;
+    await fetchNewsList(searchForm);
+  } catch {
+    /* 閿欒鐢辫姹傛嫤鎴櫒鎻愮ず */
+  } finally {
+    newsSaving.value = false;
+  }
+}
+
+function onSearch() {
+  fetchNewsList(searchForm);
+}
+
+function resetSearch() {
+  searchForm.keyword = "";
+  searchForm.newsType = "";
+  searchForm.status = "";
+  searchForm.createTimeRange = null;
+  onSearch();
+}
+
+function onPagination(obj) {
+  paginateNewsList(obj, searchForm);
+}
+
+onMounted(() => {
+  loadFlowUsers();
+  fetchNewsList(searchForm);
+});
+</script>
+
+<style scoped>
+.enterprise-news-page .search_form {
+  display: flex;
+  flex-wrap: wrap;
+  justify-content: space-between;
+  align-items: flex-start;
+  gap: 12px;
+}
+.search_fields {
+  display: flex;
+  flex-wrap: wrap;
+  align-items: center;
+  gap: 4px;
+}
+.search_actions {
+  flex-shrink: 0;
+}
+.search_title {
+  font-size: 14px;
+  color: var(--el-text-color-regular);
+}
+.news-type-tag {
+  font-weight: 600;
+  font-size: 13px;
+}
+.media-tag {
+  margin: 6px 8px 0 0;
+}
+.template-name {
+  font-weight: 600;
+  color: var(--el-text-color-primary);
+}
+.section-tip {
+  font-size: 12px;
+  color: var(--el-text-color-secondary);
+  margin: 8px 0 0;
+  line-height: 1.5;
+}
+.mb20 {
+  margin-bottom: 20px;
+}
+.ml10 {
+  margin-left: 10px;
+}
+</style>
diff --git a/src/views/officeProcessAutomation/EnterpriseNews/news-manage/useEnterpriseNewsList.js b/src/views/officeProcessAutomation/EnterpriseNews/news-manage/useEnterpriseNewsList.js
new file mode 100644
index 0000000..66aef1e
--- /dev/null
+++ b/src/views/officeProcessAutomation/EnterpriseNews/news-manage/useEnterpriseNewsList.js
@@ -0,0 +1,55 @@
+import { listEnterpriseNewsPage } from "@/api/officeProcessAutomation/enterpriseNews.js";
+import { ElMessage } from "element-plus";
+import { reactive, ref } from "vue";
+import {
+  buildEnterpriseNewsListParams,
+  mapEnterpriseNewsFromApi,
+  unwrapEnterpriseNewsPage,
+} from "./enterpriseNewsMappers.js";
+
+/** 浼佷笟鏂伴椈鍒楄〃锛氬垎椤垫煡璇� /enterpriseNews/listPage */
+export function useEnterpriseNewsList() {
+  const tableData = ref([]);
+  const tableLoading = ref(false);
+  const page = reactive({ current: 1, size: 10, total: 0 });
+  let lastSearchForm = null;
+
+  async function fetchList(searchForm = {}) {
+    tableLoading.value = true;
+    try {
+      const res = await listEnterpriseNewsPage(
+        buildEnterpriseNewsListParams({ page, searchForm })
+      );
+      const { records, total } = unwrapEnterpriseNewsPage(res);
+      tableData.value = records.map(mapEnterpriseNewsFromApi);
+      page.total = total;
+    } catch {
+      tableData.value = [];
+      page.total = 0;
+      ElMessage.error("浼佷笟鏂伴椈鍒楄〃鍔犺浇澶辫触");
+    } finally {
+      tableLoading.value = false;
+    }
+  }
+
+  function handleQuery(searchForm) {
+    lastSearchForm = searchForm;
+    page.current = 1;
+    return fetchList(searchForm);
+  }
+
+  function pagination({ page: p, limit }, searchForm) {
+    page.current = p;
+    page.size = limit;
+    return fetchList(searchForm ?? lastSearchForm ?? {});
+  }
+
+  return {
+    tableData,
+    tableLoading,
+    page,
+    fetchList,
+    handleQuery,
+    pagination,
+  };
+}
diff --git a/src/views/officeProcessAutomation/HrManage/post-manage/index.vue b/src/views/officeProcessAutomation/HrManage/post-manage/index.vue
new file mode 100644
index 0000000..a57137c
--- /dev/null
+++ b/src/views/officeProcessAutomation/HrManage/post-manage/index.vue
@@ -0,0 +1,292 @@
+<!--OA妯″潡锛氬矖浣嶇鐞�-->
+<template>
+  <div class="app-container">
+     <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch">
+        <el-form-item label="宀椾綅缂栫爜" prop="postCode">
+           <el-input
+              v-model="queryParams.postCode"
+              placeholder="璇疯緭鍏ュ矖浣嶇紪鐮�"
+              clearable
+              style="width: 200px"
+              @keyup.enter="handleQuery"
+           />
+        </el-form-item>
+        <el-form-item label="宀椾綅鍚嶇О" prop="postName">
+           <el-input
+              v-model="queryParams.postName"
+              placeholder="璇疯緭鍏ュ矖浣嶅悕绉�"
+              clearable
+              style="width: 200px"
+              @keyup.enter="handleQuery"
+           />
+        </el-form-item>
+        <el-form-item label="鐘舵��" prop="status">
+           <el-select v-model="queryParams.status" placeholder="宀椾綅鐘舵��" clearable style="width: 200px">
+              <el-option
+                 v-for="dict in sys_normal_disable"
+                 :key="dict.value"
+                 :label="dict.label"
+                 :value="dict.value"
+              />
+           </el-select>
+        </el-form-item>
+        <el-form-item>
+           <el-button type="primary" icon="Search" @click="handleQuery">鎼滅储</el-button>
+           <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button>
+        </el-form-item>
+     </el-form>
+
+     <el-row :gutter="10" class="mb8">
+        <el-col :span="1.5">
+           <el-button
+              type="primary"
+              plain
+              icon="Plus"
+              @click="handleAdd"
+              v-hasPermi="['system:post:add']"
+           >鏂板</el-button>
+        </el-col>
+        <el-col :span="1.5">
+           <el-button
+              type="success"
+              plain
+              icon="Edit"
+              :disabled="single"
+              @click="handleUpdate"
+              v-hasPermi="['system:post:edit']"
+           >淇敼</el-button>
+        </el-col>
+        <el-col :span="1.5">
+           <el-button
+              type="danger"
+              plain
+              icon="Delete"
+              :disabled="multiple"
+              @click="handleDelete"
+              v-hasPermi="['system:post:remove']"
+           >鍒犻櫎</el-button>
+        </el-col>
+        <el-col :span="1.5">
+           <el-button
+              type="warning"
+              plain
+              icon="Download"
+              @click="handleExport"
+              v-hasPermi="['system:post:export']"
+           >瀵煎嚭</el-button>
+        </el-col>
+        <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
+     </el-row>
+
+     <el-table v-loading="loading" :data="postList" @selection-change="handleSelectionChange">
+        <el-table-column type="selection" width="55" align="center" />
+        <el-table-column label="宀椾綅缂栧彿" align="center" prop="postId" />
+        <el-table-column label="宀椾綅缂栫爜" align="center" prop="postCode" />
+        <el-table-column label="宀椾綅鍚嶇О" align="center" prop="postName" />
+        <el-table-column label="宀椾綅鎺掑簭" align="center" prop="postSort" />
+        <el-table-column label="鐘舵��" align="center" prop="status">
+           <template #default="scope">
+              <dict-tag :options="sys_normal_disable" :value="scope.row.status" />
+           </template>
+        </el-table-column>
+        <el-table-column label="鍒涘缓鏃堕棿" align="center" prop="createTime" width="180">
+           <template #default="scope">
+              <span>{{ parseTime(scope.row.createTime) }}</span>
+           </template>
+        </el-table-column>
+        <el-table-column label="鎿嶄綔" width="180" align="center" class-name="small-padding fixed-width">
+           <template #default="scope">
+              <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:post:edit']">淇敼</el-button>
+              <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:post:remove']">鍒犻櫎</el-button>
+           </template>
+        </el-table-column>
+     </el-table>
+
+     <pagination
+        v-show="total > 0"
+        :total="total"
+        v-model:page="queryParams.pageNum"
+        v-model:limit="queryParams.pageSize"
+        @pagination="getList"
+     />
+
+     <!-- 娣诲姞鎴栦慨鏀瑰矖浣嶅璇濇 -->
+     <el-dialog :title="title" v-model="open" width="500px" append-to-body>
+        <el-form ref="postRef" :model="form" :rules="rules" label-width="80px">
+           <el-form-item label="宀椾綅鍚嶇О" prop="postName">
+              <el-input v-model="form.postName" placeholder="璇疯緭鍏ュ矖浣嶅悕绉�" />
+           </el-form-item>
+           <el-form-item label="宀椾綅缂栫爜" prop="postCode">
+              <el-input v-model="form.postCode" placeholder="璇疯緭鍏ョ紪鐮佸悕绉�" />
+           </el-form-item>
+           <el-form-item label="宀椾綅椤哄簭" prop="postSort">
+              <el-input-number v-model="form.postSort" controls-position="right" :min="0" />
+           </el-form-item>
+           <el-form-item label="宀椾綅鐘舵��" prop="status">
+              <el-radio-group v-model="form.status">
+                 <el-radio
+                    v-for="dict in sys_normal_disable"
+                    :key="dict.value"
+                    :value="dict.value"
+                 >{{ dict.label }}</el-radio>
+              </el-radio-group>
+           </el-form-item>
+           <el-form-item label="澶囨敞" prop="remark">
+              <el-input v-model="form.remark" type="textarea" placeholder="璇疯緭鍏ュ唴瀹�" />
+           </el-form-item>
+        </el-form>
+        <template #footer>
+           <div class="dialog-footer">
+              <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+              <el-button @click="cancel">鍙� 娑�</el-button>
+           </div>
+        </template>
+     </el-dialog>
+  </div>
+</template>
+
+<script setup name="Post">
+import { listPost, addPost, delPost, getPost, updatePost } from "@/api/system/post"
+import {onMounted} from "vue";
+
+const { proxy } = getCurrentInstance()
+const { sys_normal_disable } = proxy.useDict("sys_normal_disable")
+
+const postList = ref([])
+const open = ref(false)
+const loading = ref(true)
+const showSearch = ref(true)
+const ids = ref([])
+const single = ref(true)
+const multiple = ref(true)
+const total = ref(0)
+const title = ref("")
+
+const data = reactive({
+ form: {},
+ queryParams: {
+   pageNum: 1,
+   pageSize: 10,
+   postCode: undefined,
+   postName: undefined,
+   status: undefined
+ },
+ rules: {
+   postName: [{ required: true, message: "宀椾綅鍚嶇О涓嶈兘涓虹┖", trigger: "blur" }],
+   postCode: [{ required: true, message: "宀椾綅缂栫爜涓嶈兘涓虹┖", trigger: "blur" }],
+   postSort: [{ required: true, message: "宀椾綅椤哄簭涓嶈兘涓虹┖", trigger: "blur" }],
+ }
+})
+
+const { queryParams, form, rules } = toRefs(data)
+
+/** 鏌ヨ宀椾綅鍒楄〃 */
+function getList() {
+ loading.value = true
+ listPost(queryParams.value).then(response => {
+   postList.value = response.rows
+   total.value = response.total
+   loading.value = false
+ })
+}
+
+/** 鍙栨秷鎸夐挳 */
+function cancel() {
+ open.value = false
+ reset()
+}
+
+/** 琛ㄥ崟閲嶇疆 */
+function reset() {
+ form.value = {
+   postId: undefined,
+   postCode: undefined,
+   postName: undefined,
+   postSort: 0,
+   status: "0",
+   remark: undefined
+ }
+ proxy.resetForm("postRef")
+}
+
+/** 鎼滅储鎸夐挳鎿嶄綔 */
+function handleQuery() {
+ queryParams.value.pageNum = 1
+ getList()
+}
+
+/** 閲嶇疆鎸夐挳鎿嶄綔 */
+function resetQuery() {
+ proxy.resetForm("queryRef")
+ handleQuery()
+}
+
+/** 澶氶�夋閫変腑鏁版嵁 */
+function handleSelectionChange(selection) {
+ ids.value = selection.map(item => item.postId)
+ single.value = selection.length != 1
+ multiple.value = !selection.length
+}
+
+/** 鏂板鎸夐挳鎿嶄綔 */
+function handleAdd() {
+ reset()
+ open.value = true
+ title.value = "娣诲姞宀椾綅"
+}
+
+/** 淇敼鎸夐挳鎿嶄綔 */
+function handleUpdate(row) {
+ reset()
+ const postId = row.postId || ids.value
+ getPost(postId).then(response => {
+   form.value = response.data
+   open.value = true
+   title.value = "淇敼宀椾綅"
+ })
+}
+
+/** 鎻愪氦鎸夐挳 */
+function submitForm() {
+ proxy.$refs["postRef"].validate(valid => {
+   if (valid) {
+     if (form.value.postId != undefined) {
+       updatePost(form.value).then(response => {
+         proxy.$modal.msgSuccess("淇敼鎴愬姛")
+         open.value = false
+         getList()
+       })
+     } else {
+       addPost(form.value).then(response => {
+         proxy.$modal.msgSuccess("鏂板鎴愬姛")
+         open.value = false
+         getList()
+       })
+     }
+   }
+ })
+}
+
+/** 鍒犻櫎鎸夐挳鎿嶄綔 */
+function handleDelete(row) {
+ const postIds = row.postId || ids.value
+ proxy.$modal.confirm('鏄惁纭鍒犻櫎宀椾綅缂栧彿涓�"' + postIds + '"鐨勬暟鎹」锛�').then(function() {
+   return delPost(postIds)
+ }).then(() => {
+   getList()
+   proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛")
+ }).catch(() => {})
+}
+
+/** 瀵煎嚭鎸夐挳鎿嶄綔 */
+function handleExport() {
+ proxy.download("system/post/export", {
+   ...queryParams.value
+ }, `post_${new Date().getTime()}.xlsx`)
+}
+
+onMounted(() => {
+ getList();
+});
+</script>
+
diff --git a/src/views/officeProcessAutomation/HrManage/regular-apply/index.vue b/src/views/officeProcessAutomation/HrManage/regular-apply/index.vue
new file mode 100644
index 0000000..291d57d
--- /dev/null
+++ b/src/views/officeProcessAutomation/HrManage/regular-apply/index.vue
@@ -0,0 +1,174 @@
+<!--OA妯″潡锛氳浆姝g敵璇�-->
+<template>
+  <div class="app-container">
+    <div class="search_form mb20">
+      <div>
+        <span class="search_title">瀹℃壒鍗曞彿锛�</span>
+        <el-input
+          v-model="searchForm.instanceNo"
+          style="width: 220px"
+          placeholder="璇疯緭鍏ュ鎵瑰崟鍙�"
+          clearable
+          @keyup.enter="onSearch"
+        />
+        <span class="search_title" style="margin-left: 12px">鐢宠浜猴細</span>
+        <el-input
+          v-model="searchForm.applicantName"
+          style="width: 220px"
+          placeholder="璇疯緭鍏ョ敵璇蜂汉"
+          clearable
+          :prefix-icon="Search"
+          @keyup.enter="onSearch"
+        />
+        <el-button type="primary" style="margin-left: 10px" @click="onSearch">鎼滅储</el-button>
+        <el-button @click="resetSearch">閲嶇疆</el-button>
+      </div>
+      <div>
+        <el-button type="primary" @click="openAddWithTemplate">鏂板杞鐢宠</el-button>
+      </div>
+    </div>
+    <div class="table_list">
+      <PIMTable
+        rowKey="id"
+        :column="tableColumn"
+        :tableData="tableData"
+        :page="page"
+        :isSelection="false"
+        :tableLoading="tableLoading"
+        @pagination="onPagination"
+        :total="page.total"
+      />
+    </div>
+
+    <ApprovalInstanceSubmitDialog
+      v-model="submitDialog.visible"
+      :title="submitDialogTitle"
+      :form="submitForm"
+      :rules="submitFormRules"
+      :fields="submitFormFields"
+      :active-template="activeTemplate"
+      :user-options="flowUserOptions"
+      :is-edit="isSubmitEdit"
+      :saving="submitSaving"
+      :form-ref="submitFormRef"
+      @submit="onSubmit"
+    />
+
+    <ApprovalTemplateBindDialog
+      v-model:visible="templateBindVisible"
+      :module-key="APPROVAL_MODULE_KEYS.REGULAR"
+      skip-form-confirm
+      @confirm="onTemplateBound"
+      @closed="onTemplateBindClosed"
+    />
+
+    <ApprovalInstanceDetailDialog
+      v-model="detailDialog.visible"
+      title="杞鐢宠璇︽儏"
+      :row="detailRow"
+      @edit="openEditFromDetail"
+    />
+  </div>
+</template>
+
+<script setup>
+import { Search } from "@element-plus/icons-vue";
+import { ElMessage } from "element-plus";
+import { onMounted, reactive } from "vue";
+import ApprovalInstanceDetailDialog from "../../ApproveManage/approve-shared/components/ApprovalInstanceDetailDialog.vue";
+import ApprovalInstanceSubmitDialog from "../../ApproveManage/approve-shared/components/ApprovalInstanceSubmitDialog.vue";
+import ApprovalTemplateBindDialog from "../../ApproveManage/approve-shared/components/ApprovalTemplateBindDialog.vue";
+import { buildInstanceTableColumns } from "../../ApproveManage/approve-shared/approvalInstanceFormConfigTable.js";
+import { APPROVAL_MODULE_KEYS } from "../../ApproveManage/approve-shared/approvalModuleRegistry.js";
+import { useApprovalInstanceModule } from "../../ApproveManage/approve-shared/useApprovalInstanceModule.js";
+import { useFlowUserOptions } from "../../ApproveManage/approve-shared/useFlowUserOptions.js";
+
+const searchForm = reactive({
+  instanceNo: "",
+  applicantName: "",
+});
+
+const mod = useApprovalInstanceModule({
+  moduleKey: APPROVAL_MODULE_KEYS.REGULAR,
+  buildExtraListParams(sf) {
+    const extra = {};
+    const name = (sf?.applicantName || "").trim();
+    if (name) extra.applicantName = name;
+    return extra;
+  },
+});
+
+const {
+  tableData,
+  tableLoading,
+  page,
+  detailDialog,
+  detailRow,
+  submitDialog,
+  submitForm,
+  submitFormRef,
+  submitSaving,
+  isSubmitEdit,
+  activeTemplate,
+  submitFormFields,
+  submitFormRules,
+  submitDialogTitle,
+  templateBindVisible,
+  handleQuery,
+  initModuleList,
+  pagination,
+  openAddWithTemplate,
+  onTemplateBound,
+  onTemplateBindClosed,
+  openEditFromDetail,
+  submitInstanceForm,
+  buildTableActions,
+} = mod;
+
+const { flowUserOptions, loadFlowUsers } = useFlowUserOptions();
+
+const tableColumn = buildInstanceTableColumns(tableData, buildTableActions, {
+  moduleKey: APPROVAL_MODULE_KEYS.REGULAR,
+});
+
+function onSearch() {
+  handleQuery(searchForm);
+}
+
+function resetSearch() {
+  searchForm.instanceNo = "";
+  searchForm.applicantName = "";
+  onSearch();
+}
+
+function onPagination(obj) {
+  pagination(obj, searchForm);
+}
+
+async function onSubmit() {
+  const ok = await submitInstanceForm({ skipValidate: true });
+  if (ok) ElMessage.success(isSubmitEdit.value ? "淇敼鎴愬姛" : "鎻愪氦鎴愬姛");
+}
+
+onMounted(async () => {
+  loadFlowUsers();
+  await initModuleList(searchForm);
+});
+</script>
+
+<style scoped>
+.mb20 {
+  margin-bottom: 20px;
+}
+.search_form {
+  display: flex;
+  flex-wrap: wrap;
+  align-items: center;
+  justify-content: space-between;
+  gap: 12px;
+}
+.search_title {
+  font-size: 14px;
+  color: var(--el-text-color-regular);
+}
+</style>
diff --git a/src/views/officeProcessAutomation/HrManage/resign-apply/components/formDia.vue b/src/views/officeProcessAutomation/HrManage/resign-apply/components/formDia.vue
new file mode 100644
index 0000000..86c59ce
--- /dev/null
+++ b/src/views/officeProcessAutomation/HrManage/resign-apply/components/formDia.vue
@@ -0,0 +1,347 @@
+<template>
+  <div>
+    <el-dialog
+        v-model="dialogFormVisible"
+        :title="operationType === 'add' ? '鏂板绂昏亴' : '缂栬緫绂昏亴'"
+        width="70%"
+        @close="closeDia"
+    >
+      <!-- 鍛樺伐淇℃伅灞曠ず鍖哄煙 -->
+      <div class="info-section">
+        <div class="info-title">鍛樺伐淇℃伅</div>
+        <el-form :model="form" label-width="200px" label-position="left" :rules="rules" ref="formRef" style="margin-top: 20px">
+          <el-row :gutter="30">
+            <el-col :span="12">
+              <el-form-item label="濮撳悕锛�" prop="staffOnJobId">
+                <el-select v-model="form.staffOnJobId"
+                           placeholder="璇烽�夋嫨浜哄憳"
+                           style="width: 100%"
+                           :disabled="operationType === 'edit'"
+                           @change="handleSelect">
+                  <el-option
+                      v-for="item in personList"
+                      :key="item.id"
+                      :label="item.staffName"
+                      :value="item.id"
+                  />
+                </el-select>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="鍛樺伐缂栧彿锛�">
+                {{ currentStaffRecord.staffNo || '-' }}
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row :gutter="30">
+            <el-col :span="12">
+              <el-form-item label="鎬у埆锛�">
+                {{ currentStaffRecord.sex || '-' }}
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="鎴风睄浣忓潃锛�">
+                {{ currentStaffRecord.nativePlace || '-' }}
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row :gutter="30">
+            <el-col :span="12">
+              <el-form-item label="宀椾綅锛�">
+                {{ currentStaffRecord.postName || '-' }}
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="鐜颁綇鍧�锛�">
+                {{ currentStaffRecord.adress || '-' }}
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row :gutter="30">
+            <el-col :span="12">
+              <el-form-item label="绗竴瀛﹀巻锛�">
+                {{ currentStaffRecord.firstStudy || '-' }}
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="涓撲笟锛�">
+                {{ currentStaffRecord.profession || '-' }}
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row :gutter="30">
+            <el-col :span="12">
+              <el-form-item label="骞撮緞锛�">
+                {{ currentStaffRecord.age || '-' }}
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row :gutter="30">
+            <el-col :span="12">
+              <el-form-item label="鑱旂郴鐢佃瘽锛�">
+                {{ currentStaffRecord.phone || '-' }}
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="绱ф�ヨ仈绯讳汉锛�">
+                {{ currentStaffRecord.emergencyContact || '-' }}
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row :gutter="30">
+            <el-col :span="12">
+              <el-form-item label="绱ф�ヨ仈绯讳汉鑱旂郴鐢佃瘽锛�">
+                {{ currentStaffRecord.emergencyContactPhone || '-' }}
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row :gutter="30">
+            <el-col :span="12">
+              <el-form-item label="绂昏亴鏃ユ湡锛�" prop="leaveDate">
+                <el-date-picker
+                    v-model="form.leaveDate"
+                    type="date"
+                    :disabled="operationType === 'edit'"
+                    :disabled-date="disabledFutureDate"
+                    placeholder="璇烽�夋嫨绂昏亴鏃ユ湡"
+                    value-format="YYYY-MM-DD"
+                    format="YYYY-MM-DD"
+                    style="width: 100%"
+                />
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="绂昏亴鍘熷洜锛�" prop="reason">
+                <el-select v-model="form.reason" placeholder="璇烽�夋嫨绂昏亴鍘熷洜" style="width: 100%" @change="handleSelectDimissionReason">
+                  <el-option
+                      v-for="(item, index) in dimissionReasonOptions"
+                      :key="index"
+                      :label="item.label"
+                      :value="item.value"
+                  />
+                </el-select>
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row :gutter="30">
+            <el-col :span="12">
+              <el-form-item label="澶囨敞锛�" prop="remark" v-if="form.reason === 'other'">
+                <el-input
+                    v-model="form.remark"
+                    type="textarea"
+                    :rows="3"
+                    placeholder="澶囨敞"
+                    maxlength="500"
+                    show-word-limit
+                />
+              </el-form-item>
+            </el-col>
+          </el-row>
+        </el-form>
+
+<!--        <el-row :gutter="30">-->
+<!--          <el-col :span="12">-->
+<!--            <div class="info-item">-->
+<!--              <span class="info-label">绂昏亴鍘熷洜锛�</span>-->
+<!--              <el-select v-model="form.reason" placeholder="璇烽�夋嫨浜哄憳" style="width: 100%" @change="handleSelect">-->
+<!--                <el-option-->
+<!--                    v-for="(item, index) in dimissionReasonOptions"-->
+<!--                    :key="index"-->
+<!--                    :label="item.label"-->
+<!--                    :value="item.value"-->
+<!--                />-->
+<!--              </el-select>-->
+<!--            </div>-->
+<!--          </el-col>-->
+<!--          <el-col :span="12">-->
+<!--            <div class="info-item">-->
+<!--              <span class="info-label">鍛樺伐缂栧彿锛�</span>-->
+<!--              <span class="info-value">{{ form.staffNo || '-' }}</span>-->
+<!--            </div>-->
+<!--          </el-col>-->
+<!--        </el-row>-->
+      </div>
+
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="submitForm">纭</el-button>
+          <el-button @click="closeDia">鍙栨秷</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup>
+import {ref, reactive, toRefs, getCurrentInstance} from "vue";
+import {staffOnJobListPage} from "@/api/personnelManagement/staffOnJob.js";
+import {createStaffLeave, updateStaffLeave} from "@/api/personnelManagement/staffLeave.js";
+const { proxy } = getCurrentInstance()
+const emit = defineEmits(['close'])
+
+const dialogFormVisible = ref(false);
+const operationType = ref('')
+const getTodayDate = () => {
+  const now = new Date();
+  const year = now.getFullYear();
+  const month = `${now.getMonth() + 1}`.padStart(2, '0');
+  const day = `${now.getDate()}`.padStart(2, '0');
+  return `${year}-${month}-${day}`;
+};
+
+const disabledFutureDate = (time) => {
+  const todayEnd = new Date();
+  todayEnd.setHours(23, 59, 59, 999);
+  return time.getTime() > todayEnd.getTime();
+};
+const data = reactive({
+  form: {
+    staffOnJobId: undefined,
+    leaveDate: "",
+    reason: "",
+    remark: "",
+  },
+  rules: {
+    staffName: [{ required: true, message: "璇烽�夋嫨浜哄憳" }],
+    leaveDate: [{ required: true, message: "璇烽�夋嫨绂昏亴鏃ユ湡", trigger: "change" }],
+    reason: [{ required: true, message: "璇烽�夋嫨绂昏亴鍘熷洜"}],
+  },
+  dimissionReasonOptions: [
+      {label: '钖祫寰呴亣', value: 'salary'},
+      {label: '鑱屼笟鍙戝睍', value: 'career_development'},
+      {label: '宸ヤ綔鐜', value: 'work_environment'},
+      {label: '涓汉鍘熷洜', value: 'personal_reason'},
+      {label: '鍏朵粬', value: 'other'},
+  ],
+  currentStaffRecord: {},
+});
+const { form, rules, dimissionReasonOptions, currentStaffRecord } = toRefs(data);
+
+// 鎵撳紑寮规
+const openDialog = (type, row) => {
+  operationType.value = type;
+  dialogFormVisible.value = true;
+  if (operationType.value === 'edit') {
+    currentStaffRecord.value = row
+    form.value.staffOnJobId = row.staffOnJobId
+    form.value.leaveDate = row.leaveDate
+    form.value.reason = row.reason
+    form.value.remark = row.remark
+    personList.value = [
+      {
+        staffName: row.staffName,
+        id: row.staffOnJobId,
+      }
+    ]
+  } else {
+    form.value.leaveDate = getTodayDate()
+    getList()
+  }
+}
+
+const handleSelectDimissionReason = (val) => {
+  if (val === 'other') {
+    form.value.remark = ''
+  }
+}
+// 鎻愪氦浜у搧琛ㄥ崟
+const submitForm = () => {
+  form.value.staffState = 0
+  if (form.value.reason !== 'other') {
+    form.value.remark = ''
+  }
+  proxy.$refs["formRef"].validate(valid => {
+    if (valid) {
+      if (operationType.value === "add") {
+        createStaffLeave(form.value).then(res => {
+          proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
+          closeDia();
+        })
+      } else {
+        updateStaffLeave(currentStaffRecord.value.id, form.value).then(res => {
+          proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
+          closeDia();
+        })
+      }
+    }
+  })
+
+}
+// 鍏抽棴寮规
+const closeDia = () => {
+  // 琛ㄥ崟宸叉敞閲婏紝鎵嬪姩閲嶇疆琛ㄥ崟鏁版嵁
+  form.value = {
+    staffOnJobId: undefined,
+    leaveDate: "",
+    reason: "",
+    remark: "",
+  };
+  dialogFormVisible.value = false;
+  emit('close')
+};
+
+const personList = ref([]);
+
+/**
+ * 鑾峰彇褰撳墠鍦ㄨ亴浜哄憳鍒楄〃
+ */
+const getList = () => {
+  staffOnJobListPage({
+    current: -1,
+    size: -1,
+		staffState: 1
+  }).then(res => {
+    personList.value = res.data.records || []
+  })
+};
+
+const handleSelect = (val) => {
+  let obj = personList.value.find(item => item.id === val)
+  currentStaffRecord.value = {}
+  if (obj) {
+    // 淇濈暀绂昏亴鏃ユ湡鍜岀鑱屽師鍥狅紝鍙洿鏂板憳宸ヤ俊鎭�
+    currentStaffRecord.value = obj
+  }
+}
+defineExpose({
+  openDialog,
+});
+</script>
+
+<style scoped>
+.info-section {
+  background: #f5f7fa;
+  padding: 20px;
+  border-radius: 8px;
+  margin-bottom: 20px;
+}
+
+.info-title {
+  font-size: 16px;
+  font-weight: 600;
+  color: #303133;
+  margin-bottom: 20px;
+  padding-bottom: 10px;
+  border-bottom: 1px solid #e4e7ed;
+}
+
+.info-item {
+  display: flex;
+  align-items: center;
+  margin-bottom: 16px;
+  min-height: 32px;
+}
+
+.info-label {
+  min-width: 140px;
+  color: #606266;
+  font-size: 14px;
+  font-weight: 500;
+}
+
+.info-value {
+  flex: 1;
+  color: #303133;
+  font-size: 14px;
+}
+</style>
diff --git a/src/views/officeProcessAutomation/HrManage/resign-apply/index.vue b/src/views/officeProcessAutomation/HrManage/resign-apply/index.vue
new file mode 100644
index 0000000..2b20970
--- /dev/null
+++ b/src/views/officeProcessAutomation/HrManage/resign-apply/index.vue
@@ -0,0 +1,220 @@
+<!--OA妯″潡锛氱鑱岀敵璇�-->
+<template>
+  <div class="app-container">
+    <div class="search_form mb20">
+      <div>
+        <span class="search_title">濮撳悕锛�</span>
+        <el-input
+            v-model="searchForm.staffName"
+            style="width: 240px"
+            placeholder="璇疯緭鍏ュ鍚嶆悳绱�"
+            @change="handleQuery"
+            clearable
+            :prefix-icon="Search"
+        />
+        <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
+        >鎼滅储</el-button
+        >
+      </div>
+      <div>
+        <el-button type="primary" @click="openForm('add')">鏂板绂昏亴</el-button>
+        <el-button @click="handleOut">瀵煎嚭</el-button>
+      </div>
+    </div>
+    <div class="table_list">
+      <PIMTable
+          rowKey="id"
+          :column="tableColumn"
+          :tableData="tableData"
+          :page="page"
+          :isSelection="true"
+          @selection-change="handleSelectionChange"
+          :tableLoading="tableLoading"
+          @pagination="pagination"
+          :total="page.total"
+      ></PIMTable>
+    </div>
+    <form-dia ref="formDia" @close="handleQuery"></form-dia>
+  </div>
+</template>
+
+<script setup>
+import { Search } from "@element-plus/icons-vue";
+import {onMounted, ref} from "vue";
+import FormDia from "@/views/personnelManagement/dimission/components/formDia.vue";
+import { findStaffLeaveListPage } from "@/api/personnelManagement/staffLeave.js";
+import {ElMessageBox} from "element-plus";
+
+const data = reactive({
+  searchForm: {
+    staffName: "",
+  },
+});
+const { searchForm } = toRefs(data);
+const tableColumn = ref([
+  {
+    label: "鐘舵��",
+    prop: "staffState",
+    dataType: "tag",
+    formatData: (params) => {
+      if (params == 0) {
+        return "绂昏亴";
+      } else if (params == 1) {
+        return "鍦ㄨ亴";
+      } else {
+        return null;
+      }
+    },
+    formatType: (params) => {
+      if (params == 0) {
+        return "danger";
+      } else if (params == 1) {
+        return "primary";
+      } else {
+        return null;
+      }
+    },
+  },
+  {
+    label: "绂昏亴鏃ユ湡",
+    prop: "leaveDate",
+  },
+  {
+    label: "鍛樺伐缂栧彿",
+    prop: "staffNo",
+  },
+  {
+    label: "濮撳悕",
+    prop: "staffName",
+  },
+  {
+    label: "鎬у埆",
+    prop: "sex",
+  },
+  {
+    label: "鎴风睄浣忓潃",
+    prop: "nativePlace",
+  },
+  {
+    label: "閮ㄩ棬",
+    prop: "deptName",
+  },
+  {
+    label: "宀椾綅",
+    prop: "postName",
+  },
+  {
+    label: "鐜颁綇鍧�",
+    prop: "adress",
+    width:200
+  },
+  {
+    label: "绗竴瀛﹀巻",
+    prop: "firstStudy",
+  },
+  {
+    label: "涓撲笟",
+    prop: "profession",
+    width:100
+  },
+  {
+    label: "骞撮緞",
+    prop: "age",
+  },
+  {
+    label: "鑱旂郴鐢佃瘽",
+    prop: "phone",
+    width:150
+  },
+  {
+    label: "绱ф�ヨ仈绯讳汉",
+    prop: "emergencyContact",
+    width: 120
+  },
+  {
+    label: "绱ф�ヨ仈绯讳汉鐢佃瘽",
+    prop: "emergencyContactPhone",
+    width:150
+  },
+  {
+    dataType: "action",
+    label: "鎿嶄綔",
+    align: "center",
+    fixed: 'right',
+    operation: [
+      {
+        name: "缂栬緫",
+        type: "text",
+        clickFun: (row) => {
+          openForm("edit", row);
+        },
+      },
+    ],
+  },
+]);
+const tableData = ref([]);
+const selectedRows = ref([]);
+const tableLoading = ref(false);
+const page = reactive({
+  current: 1,
+  size: 100,
+  total: 0,
+});
+const formDia = ref()
+const { proxy } = getCurrentInstance()
+
+
+// 鏌ヨ鍒楄〃
+/** 鎼滅储鎸夐挳鎿嶄綔 */
+const handleQuery = () => {
+  page.current = 1;
+  getList();
+};
+const pagination = (obj) => {
+  page.current = obj.page;
+  page.size = obj.limit;
+  getList();
+};
+const getList = () => {
+  tableLoading.value = true;
+  findStaffLeaveListPage({...page, ...searchForm.value}).then(res => {
+    tableLoading.value = false;
+    tableData.value = res.data.records
+    page.total = res.data.total;
+  }).catch(err => {
+    tableLoading.value = false;
+  })
+};
+// 琛ㄦ牸閫夋嫨鏁版嵁
+const handleSelectionChange = (selection) => {
+  selectedRows.value = selection;
+};
+
+// 鎵撳紑寮规
+const openForm = (type, row) => {
+  nextTick(() => {
+    formDia.value?.openDialog(type, row)
+  })
+};
+
+// 瀵煎嚭
+const handleOut = () => {
+  ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
+    confirmButtonText: "纭",
+    cancelButtonText: "鍙栨秷",
+    type: "warning",
+  })
+      .then(() => {
+        proxy.download("/staff/staffLeave/export", {}, "浜哄憳绂昏亴.xlsx");
+      })
+      .catch(() => {
+        proxy.$modal.msg("宸插彇娑�");
+      });
+};
+onMounted(() => {
+  getList();
+});
+</script>
+
+<style scoped></style>
+
diff --git a/src/views/officeProcessAutomation/HrManage/staff-archive/components/BasicInfoSection.vue b/src/views/officeProcessAutomation/HrManage/staff-archive/components/BasicInfoSection.vue
new file mode 100644
index 0000000..0aa4f06
--- /dev/null
+++ b/src/views/officeProcessAutomation/HrManage/staff-archive/components/BasicInfoSection.vue
@@ -0,0 +1,181 @@
+<template>
+  <el-card class="form-card" shadow="never">
+    <template #header>
+      <span class="card-title">
+        <span class="card-title-line">|</span>
+        鍩烘湰淇℃伅
+      </span>
+    </template>
+
+    <el-row :gutter="24">
+      <el-col :span="5">
+        <el-form-item label="鍛樺伐缂栧彿" prop="staffNo">
+          <el-input
+            v-model="form.staffNo"
+            placeholder="璇疯緭鍏�"
+            clearable
+            maxlength="20"
+            show-word-limit
+            :disabled="operationType !== 'add'"
+          />
+        </el-form-item>
+      </el-col>
+      <el-col :span="5">
+        <el-form-item label="濮撳悕" prop="staffName">
+          <el-input
+            v-model="form.staffName"
+            placeholder="璇疯緭鍏�"
+            clearable
+            maxlength="50"
+            show-word-limit
+          />
+        </el-form-item>
+      </el-col>
+      <el-col :span="5">
+        <el-form-item label="鍒悕" prop="alias">
+          <el-input
+            v-model="form.alias"
+            placeholder="璇疯緭鍏�"
+            clearable
+            maxlength="50"
+            show-word-limit
+          />
+        </el-form-item>
+      </el-col>
+      <el-col :span="5">
+        <el-form-item label="鎵嬫満" prop="phone">
+          <el-input
+            v-model="form.phone"
+            placeholder="璇疯緭鍏�"
+            clearable
+            maxlength="11"
+            show-word-limit
+          />
+        </el-form-item>
+      </el-col>
+      <el-col :span="4">
+        <el-form-item label="鎬у埆" prop="sex">
+          <el-select
+            v-model="form.sex"
+            placeholder="璇烽�夋嫨"
+            clearable
+            style="width: 100%"
+          >
+            <el-option label="鐢�" value="鐢�" />
+            <el-option label="濂�" value="濂�" />
+          </el-select>
+        </el-form-item>
+      </el-col>
+    </el-row>
+
+    <el-row :gutter="24">
+      <el-col :span="5">
+        <el-form-item label="鍑虹敓鏃ユ湡" prop="birthDate">
+          <el-date-picker
+            v-model="form.birthDate"
+            type="date"
+            value-format="YYYY-MM-DD"
+            format="YYYY-MM-DD"
+            placeholder="璇烽�夋嫨"
+            style="width: 100%"
+            clearable
+          />
+        </el-form-item>
+      </el-col>
+      <el-col :span="5">
+        <el-form-item label="骞撮緞" prop="age">
+          <el-input-number
+            v-model="form.age"
+            :min="0"
+            :max="150"
+            :precision="0"
+            :step="1"
+            style="width: 100%"
+          />
+        </el-form-item>
+      </el-col>
+      <el-col :span="5">
+        <el-form-item label="绫嶈疮" prop="nativePlace">
+          <el-input
+            v-model="form.nativePlace"
+            placeholder="璇疯緭鍏�"
+            clearable
+            maxlength="50"
+            show-word-limit
+          />
+        </el-form-item>
+      </el-col>
+      <el-col :span="5">
+        <el-form-item label="姘戞棌" prop="nation">
+          <el-input
+            v-model="form.nation"
+            placeholder="璇疯緭鍏�"
+            clearable
+            maxlength="20"
+            show-word-limit
+          />
+        </el-form-item>
+      </el-col>
+      <el-col :span="4">
+        <el-form-item label="濠氬Щ鐘跺喌" prop="maritalStatus">
+          <el-select
+            v-model="form.maritalStatus"
+            placeholder="璇烽�夋嫨"
+            clearable
+            style="width: 100%"
+          >
+            <el-option label="鏈" value="鏈" />
+            <el-option label="宸插" value="宸插" />
+            <el-option label="绂诲紓" value="绂诲紓" />
+            <el-option label="涓у伓" value="涓у伓" />
+          </el-select>
+        </el-form-item>
+      </el-col>
+    </el-row>
+
+    <el-row :gutter="24">
+      <el-col :span="10">
+        <el-form-item label="瑙掕壊" prop="roleId">
+          <el-select
+            v-model="form.roleId"
+            placeholder="璇烽�夋嫨"
+            clearable
+            style="width: 100%"
+          >
+            <el-option
+              v-for="item in roleOptions"
+              :key="item.roleId"
+              :label="item.roleName"
+              :value="item.roleId"
+              :disabled="item.status == 1"
+            />
+          </el-select>
+        </el-form-item>
+      </el-col>
+    </el-row>
+  </el-card>
+</template>
+
+<script setup>
+import { toRefs } from "vue";
+
+const props = defineProps({
+  form: { type: Object, required: true },
+  operationType: { type: String, default: "add" },
+  roleOptions: { type: Array, default: () => [] },
+});
+
+const { form, operationType, roleOptions } = toRefs(props);
+</script>
+
+<style scoped>
+.form-card {
+  margin-bottom: 16px;
+}
+
+.card-title-line {
+  color: #f56c6c;
+  margin-right: 4px;
+}
+</style>
+
diff --git a/src/views/officeProcessAutomation/HrManage/staff-archive/components/EducationWorkSection.vue b/src/views/officeProcessAutomation/HrManage/staff-archive/components/EducationWorkSection.vue
new file mode 100644
index 0000000..c1470e7
--- /dev/null
+++ b/src/views/officeProcessAutomation/HrManage/staff-archive/components/EducationWorkSection.vue
@@ -0,0 +1,263 @@
+<template>
+  <div>
+    <!-- 鏁欒偛缁忓巻 -->
+    <el-card class="form-card" shadow="never">
+      <template #header>
+        <span class="card-title">
+          <span class="card-title-line">|</span>
+          鏁欒偛缁忓巻
+        </span>
+      </template>
+      <el-table :data="form.staffEducationList" border>
+        <el-table-column label="瀛﹀巻" prop="education" width="120">
+          <template #default="{ row }">
+            <el-select
+              v-model="row.education"
+              placeholder="璇烽�夋嫨"
+              clearable
+              style="width: 100%"
+            >
+              <el-option label="涓笓鍙婁互涓�" value="secondary" />
+              <el-option label="澶т笓" value="junior_college" />
+              <el-option label="鏈" value="bachelor" />
+              <el-option label="纭曞+" value="master" />
+              <el-option label="鍗氬+鍙婁互涓�" value="doctor" />
+            </el-select>
+          </template>
+        </el-table-column>
+        <el-table-column label="姣曚笟闄㈡牎" prop="schoolName" min-width="160">
+          <template #default="{ row }">
+            <el-input
+              v-model="row.schoolName"
+              placeholder="璇疯緭鍏�"
+              clearable
+              maxlength="30"
+              show-word-limit
+            />
+          </template>
+        </el-table-column>
+        <el-table-column label="鍏ュ鏃堕棿" prop="enrollTime" width="150">
+          <template #default="{ row }">
+            <el-date-picker
+              v-model="row.enrollTime"
+              type="date"
+              value-format="YYYY-MM-DD"
+              format="YYYY-MM-DD"
+              placeholder="璇烽�夋嫨"
+              style="width: 100%"
+              clearable
+            />
+          </template>
+        </el-table-column>
+        <el-table-column label="姣曚笟鏃堕棿" prop="graduateTime" width="150">
+          <template #default="{ row }">
+            <el-date-picker
+              v-model="row.graduateTime"
+              type="date"
+              value-format="YYYY-MM-DD"
+              format="YYYY-MM-DD"
+              placeholder="璇烽�夋嫨"
+              style="width: 100%"
+              clearable
+            />
+          </template>
+        </el-table-column>
+        <el-table-column label="涓撲笟" prop="major" min-width="140">
+          <template #default="{ row }">
+            <el-input
+              v-model="row.major"
+              placeholder="璇疯緭鍏�"
+              clearable
+              maxlength="20"
+              show-word-limit
+            />
+          </template>
+        </el-table-column>
+        <el-table-column label="瀛︿綅" prop="degree" width="140">
+          <template #default="{ row }">
+            <el-input
+              v-model="row.degree"
+              placeholder="璇疯緭鍏�"
+              clearable
+              maxlength="20"
+              show-word-limit
+            />
+          </template>
+        </el-table-column>
+        <el-table-column label="鎿嶄綔" width="80" align="center">
+          <template #default="scope">
+            <el-button
+              v-if="form.staffEducationList.length > 1"
+              type="primary"
+              link
+              @click="removeEducationRow(scope.$index)"
+            >
+              鍒犻櫎
+            </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <div class="table-add-row" @click="addEducationRow">鏂板缓涓�琛�</div>
+    </el-card>
+
+    <!-- 宸ヤ綔缁忓巻 -->
+    <el-card class="form-card" shadow="never">
+      <template #header>
+        <span class="card-title">
+          <span class="card-title-line">|</span>
+          宸ヤ綔缁忓巻
+        </span>
+      </template>
+      <el-table :data="form.staffWorkExperienceList" border>
+        <el-table-column label="鍓嶅叕鍙�" prop="formerCompany" min-width="180">
+          <template #default="{ row }">
+            <el-input
+              v-model="row.formerCompany"
+              placeholder="璇疯緭鍏�"
+              clearable
+              maxlength="30"
+              show-word-limit
+            />
+          </template>
+        </el-table-column>
+        <el-table-column label="鍓嶅叕鍙搁儴闂�" prop="formerDept" min-width="140">
+          <template #default="{ row }">
+            <el-input
+              v-model="row.formerDept"
+              placeholder="璇疯緭鍏�"
+              clearable
+              maxlength="20"
+              show-word-limit
+            />
+          </template>
+        </el-table-column>
+        <el-table-column label="鍓嶅叕鍙歌亴浣�" prop="formerPosition" min-width="140">
+          <template #default="{ row }">
+            <el-input
+              v-model="row.formerPosition"
+              placeholder="璇疯緭鍏�"
+              clearable
+              maxlength="20"
+              show-word-limit
+            />
+          </template>
+        </el-table-column>
+        <el-table-column label="寮�濮嬫棩鏈�" prop="startDate" width="150">
+          <template #default="{ row }">
+            <el-date-picker
+              v-model="row.startDate"
+              type="date"
+              value-format="YYYY-MM-DD"
+              format="YYYY-MM-DD"
+              placeholder="璇烽�夋嫨"
+              style="width: 100%"
+              clearable
+            />
+          </template>
+        </el-table-column>
+        <el-table-column label="缁撴潫鏃ユ湡" prop="endDate" width="150">
+          <template #default="{ row }">
+            <el-date-picker
+              v-model="row.endDate"
+              type="date"
+              value-format="YYYY-MM-DD"
+              format="YYYY-MM-DD"
+              placeholder="璇烽�夋嫨"
+              style="width: 100%"
+              clearable
+            />
+          </template>
+        </el-table-column>
+        <el-table-column label="宸ヤ綔鎻忚堪" prop="workDesc" min-width="220">
+          <template #default="{ row }">
+            <el-input
+              v-model="row.workDesc"
+              type="textarea"
+              :rows="2"
+              placeholder="璇疯緭鍏�"
+              clearable
+              maxlength="500"
+              show-word-limit
+            />
+          </template>
+        </el-table-column>
+        <el-table-column label="鎿嶄綔" width="80" align="center">
+          <template #default="scope">
+            <el-button
+              v-if="form.staffWorkExperienceList.length > 1"
+              type="primary"
+              link
+              @click="removeWorkRow(scope.$index)"
+            >
+              鍒犻櫎
+            </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <div class="table-add-row" @click="addWorkRow">鏂板缓涓�琛�</div>
+    </el-card>
+  </div>
+</template>
+
+<script setup>
+import { toRefs } from "vue";
+
+const props = defineProps({
+  form: { type: Object, required: true },
+});
+
+const emit = defineEmits(["update:form"]);
+
+const { form } = toRefs(props);
+
+const addEducationRow = () => {
+  form.value.staffEducationList.push({
+    education: "",
+    schoolName: "",
+    enrollTime: "",
+    graduateTime: "",
+    major: "",
+    degree: "",
+  });
+};
+
+const removeEducationRow = (index) => {
+  if (form.value.staffEducationList.length <= 1) return;
+  form.value.staffEducationList.splice(index, 1);
+};
+
+const addWorkRow = () => {
+  form.value.staffWorkExperienceList.push({
+    formerCompany: "",
+    formerDept: "",
+    formerPosition: "",
+    startDate: "",
+    endDate: "",
+    workDesc: "",
+  });
+};
+
+const removeWorkRow = (index) => {
+  if (form.value.staffWorkExperienceList.length <= 1) return;
+  form.value.staffWorkExperienceList.splice(index, 1);
+};
+</script>
+
+<style scoped>
+.form-card {
+  margin-bottom: 16px;
+}
+
+.card-title-line {
+  color: #f56c6c;
+  margin-right: 4px;
+}
+
+.table-add-row {
+  margin-top: 8px;
+  color: #409eff;
+  cursor: pointer;
+  font-size: 14px;
+}
+</style>
+
diff --git a/src/views/officeProcessAutomation/HrManage/staff-archive/components/EmergencyAndAttachmentSection.vue b/src/views/officeProcessAutomation/HrManage/staff-archive/components/EmergencyAndAttachmentSection.vue
new file mode 100644
index 0000000..bd63608
--- /dev/null
+++ b/src/views/officeProcessAutomation/HrManage/staff-archive/components/EmergencyAndAttachmentSection.vue
@@ -0,0 +1,115 @@
+<template>
+  <div>
+    <!-- 绱ф�ヨ仈绯讳汉 -->
+    <el-card class="form-card" shadow="never">
+      <template #header>
+        <span class="card-title">
+          <span class="card-title-line">|</span>
+          绱ф�ヨ仈绯讳汉
+        </span>
+      </template>
+      <el-table :data="form.staffEmergencyContactList" border>
+        <el-table-column label="绱ф�ヨ仈绯讳汉濮撳悕" prop="contactName" min-width="160">
+          <template #default="{ row }">
+            <el-input
+              v-model="row.contactName"
+              placeholder="璇疯緭鍏�"
+              clearable
+              maxlength="50"
+              show-word-limit
+            />
+          </template>
+        </el-table-column>
+        <el-table-column label="绱ф�ヨ仈绯讳汉鍏崇郴" prop="contactRelation" min-width="140">
+          <template #default="{ row }">
+            <el-input
+              v-model="row.contactRelation"
+              placeholder="璇疯緭鍏�"
+              clearable
+              maxlength="20"
+              show-word-limit
+            />
+          </template>
+        </el-table-column>
+        <el-table-column label="绱ф�ヨ仈绯讳汉鎵嬫満" prop="contactPhone" width="160">
+          <template #default="{ row }">
+            <el-input
+              v-model="row.contactPhone"
+              placeholder="璇疯緭鍏�"
+              clearable
+              maxlength="11"
+              show-word-limit
+            />
+          </template>
+        </el-table-column>
+        <el-table-column label="绱ф�ヨ仈绯讳汉浣忓潃" prop="contactAddress" min-width="220">
+          <template #default="{ row }">
+            <el-input
+              v-model="row.contactAddress"
+              placeholder="璇疯緭鍏�"
+              clearable
+              maxlength="50"
+              show-word-limit
+            />
+          </template>
+        </el-table-column>
+        <el-table-column label="鎿嶄綔" width="80" align="center">
+          <template #default="scope">
+            <el-button
+              v-if="form.staffEmergencyContactList.length > 1"
+              type="primary"
+              link
+              @click="removeEmergencyRow(scope.$index)"
+            >
+              鍒犻櫎
+            </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <div class="table-add-row" @click="addEmergencyRow">鏂板缓涓�琛�</div>
+    </el-card>
+  </div>
+</template>
+
+<script setup>
+import { toRefs } from "vue";
+
+const props = defineProps({
+  form: { type: Object, required: true }
+});
+
+const { form } = toRefs(props);
+
+const addEmergencyRow = () => {
+  form.value.staffEmergencyContactList.push({
+    contactName: "",
+    contactRelation: "",
+    contactPhone: "",
+    contactAddress: "",
+  });
+};
+
+const removeEmergencyRow = (index) => {
+  if (form.value.staffEmergencyContactList.length <= 1) return;
+  form.value.staffEmergencyContactList.splice(index, 1);
+};
+</script>
+
+<style scoped>
+.form-card {
+  margin-bottom: 16px;
+}
+
+.card-title-line {
+  color: #f56c6c;
+  margin-right: 4px;
+}
+
+.table-add-row {
+  margin-top: 8px;
+  color: #409eff;
+  cursor: pointer;
+  font-size: 14px;
+}
+</style>
+
diff --git a/src/views/officeProcessAutomation/HrManage/staff-archive/components/JobInfoSection.vue b/src/views/officeProcessAutomation/HrManage/staff-archive/components/JobInfoSection.vue
new file mode 100644
index 0000000..be33436
--- /dev/null
+++ b/src/views/officeProcessAutomation/HrManage/staff-archive/components/JobInfoSection.vue
@@ -0,0 +1,176 @@
+<template>
+  <el-card class="form-card" shadow="never">
+    <template #header>
+      <span class="card-title">
+        <span class="card-title-line">|</span>
+        鍦ㄨ亴淇℃伅
+      </span>
+    </template>
+
+    <!-- 绗竴琛岋細鍚堝悓寮�濮� / 鍚堝悓缁撴潫 / 璇曠敤鏈� / 杞 -->
+    <el-row :gutter="24">
+      <el-col :span="6">
+        <el-form-item label="鍏ヨ亴鏃ユ湡" prop="contractStartTime">
+          <el-date-picker
+            v-model="form.contractStartTime"
+            type="date"
+            value-format="YYYY-MM-DD"
+            format="YYYY-MM-DD"
+            placeholder="璇烽�夋嫨"
+            style="width: 100%"
+            clearable
+            @change="calculateContractTerm"
+          />
+        </el-form-item>
+      </el-col>
+      <el-col :span="6">
+        <el-form-item
+          label="鍚堝悓缁撴潫鏃ユ湡"
+          prop="contractEndTime"
+          required
+          :rules="[
+            {
+              required: true,
+              message: '璇烽�夋嫨鍚堝悓缁撴潫鏃ユ湡',
+              trigger: 'change',
+            },
+          ]"
+        >
+          <el-date-picker
+            v-model="form.contractEndTime"
+            type="date"
+            value-format="YYYY-MM-DD"
+            format="YYYY-MM-DD"
+            placeholder="璇烽�夋嫨"
+            style="width: 100%"
+            clearable
+            @change="calculateContractTerm"
+          />
+        </el-form-item>
+      </el-col>
+      <el-col :span="6">
+        <el-form-item label="璇曠敤鏈燂紙鏈堬級" prop="probationPeriod">
+          <el-input-number
+            v-model="form.proTerm"
+            :min="0"
+            :max="24"
+            :precision="0"
+            :step="1"
+            style="width: 100%"
+          />
+        </el-form-item>
+      </el-col>
+      <el-col :span="6">
+        <el-form-item label="杞鏃ユ湡" prop="positiveDate">
+          <el-date-picker
+            v-model="form.positiveDate"
+            type="date"
+            value-format="YYYY-MM-DD"
+            format="YYYY-MM-DD"
+            placeholder="璇烽�夋嫨"
+            style="width: 100%"
+            clearable
+          />
+        </el-form-item>
+      </el-col>
+    </el-row>
+
+    <!-- 绗簩琛岋細閮ㄩ棬 / 宀椾綅 / 鍩烘湰宸ヨ祫 -->
+    <el-row :gutter="24">
+      <el-col :span="8">
+        <el-form-item label="閮ㄩ棬" prop="sysDeptId">
+          <el-tree-select
+            v-model="form.sysDeptId"
+            :data="deptOptions"
+            check-strictly
+            :render-after-expand="false"
+            placeholder="璇烽�夋嫨"
+            style="width: 100%"
+          />
+        </el-form-item>
+      </el-col>
+      <el-col :span="8">
+        <el-form-item label="宀椾綅" prop="sysPostId">
+          <el-select
+            v-model="form.sysPostId"
+            placeholder="璇烽�夋嫨"
+            clearable
+            style="width: 100%"
+          >
+            <el-option
+              v-for="item in postOptions"
+              :key="item.postId"
+              :label="item.postName"
+              :value="item.postId"
+              :disabled="item.status === '1'"
+            />
+          </el-select>
+        </el-form-item>
+      </el-col>
+      <el-col :span="8">
+        <el-form-item label="鍩烘湰宸ヨ祫" prop="basicSalary">
+          <el-input-number
+            v-model="form.basicSalary"
+            :min="0"
+            :max="999999"
+            :precision="2"
+            :step="100"
+            style="width: 100%"
+          />
+        </el-form-item>
+      </el-col>
+    </el-row>
+  </el-card>
+</template>
+
+<script setup>
+import { toRefs } from "vue";
+
+const props = defineProps({
+  form: { type: Object, required: true },
+  postOptions: { type: Array, default: () => [] },
+  deptOptions: { type: Array, default: () => [] },
+});
+
+const { form, postOptions, deptOptions } = toRefs(props);
+
+// 璁$畻鍚堝悓骞撮檺
+const calculateContractTerm = () => {
+  if (form.value.contractStartTime && form.value.contractEndTime) {
+    const startDate = new Date(form.value.contractStartTime);
+    const endDate = new Date(form.value.contractEndTime);
+
+    if (endDate > startDate) {
+      // 璁$畻骞翠唤宸�
+      const yearDiff = endDate.getFullYear() - startDate.getFullYear();
+      const monthDiff = endDate.getMonth() - startDate.getMonth();
+      const dayDiff = endDate.getDate() - startDate.getDate();
+
+      let years = yearDiff;
+
+      // 濡傛灉缁撴潫鏃ユ湡鐨勬湀鏃ュ皬浜庡紑濮嬫棩鏈熺殑鏈堟棩锛屽垯鍑忓幓1骞�
+      if (monthDiff < 0 || (monthDiff === 0 && dayDiff < 0)) {
+        years = yearDiff - 1;
+      }
+
+      form.value.contractTerm = Math.max(0, years);
+    } else {
+      form.value.contractTerm = 0;
+    }
+  } else {
+    form.value.contractTerm = 0;
+  }
+};
+</script>
+
+<style scoped>
+.form-card {
+  margin-bottom: 16px;
+}
+
+.card-title-line {
+  color: #f56c6c;
+  margin-right: 4px;
+}
+</style>
+
diff --git a/src/views/officeProcessAutomation/HrManage/staff-archive/components/NewOrEditFormDia.vue b/src/views/officeProcessAutomation/HrManage/staff-archive/components/NewOrEditFormDia.vue
new file mode 100644
index 0000000..2ad06fb
--- /dev/null
+++ b/src/views/officeProcessAutomation/HrManage/staff-archive/components/NewOrEditFormDia.vue
@@ -0,0 +1,304 @@
+<template>
+  <FormDialog
+    v-model="dialogFormVisible"
+    :operation-type="operationType"
+    :title="dialogTitle"
+    width="90%"
+    @close="closeDia"
+    @confirm="submitForm"
+    @cancel="closeDia"
+  >
+    <div class="form-dia-body">
+      <el-form
+        ref="formRef"
+        :model="form"
+        :rules="rules"
+        label-position="top"
+      >
+        <BasicInfoSection
+          :form="form"
+          :operation-type="operationType"
+          :role-options="roleOptions"
+        />
+        <JobInfoSection
+          :form="form"
+          :post-options="postOptions"
+          :dept-options="deptOptions"
+        />
+        <EducationWorkSection :form="form" />
+        <EmergencyAndAttachmentSection :form="form" />
+      </el-form>
+    </div>
+  </FormDialog>
+</template>
+
+<script setup>
+import {
+  ref,
+  reactive,
+  toRefs,
+  onMounted,
+  getCurrentInstance,
+  nextTick,
+} from "vue";
+import FormDialog from "@/components/Dialog/FormDialog.vue";
+import { findPostOptions } from "@/api/system/post.js";
+import { deptTreeSelect, getUser } from "@/api/system/user.js";
+import {
+  staffOnJobInfo,
+  createStaffOnJob,
+  updateStaffOnJob,
+} from "@/api/personnelManagement/staffOnJob.js";
+
+import BasicInfoSection from "./BasicInfoSection.vue";
+import JobInfoSection from "./JobInfoSection.vue";
+import EducationWorkSection from "./EducationWorkSection.vue";
+import EmergencyAndAttachmentSection from "./EmergencyAndAttachmentSection.vue";
+
+const { proxy } = getCurrentInstance();
+const emit = defineEmits(["close"]);
+
+const dialogFormVisible = ref(false);
+const operationType = ref("add");
+const id = ref(0);
+const formRef = ref(null);
+
+const dialogTitle = () =>
+  operationType.value === "add" ? "鏂板鍏ヨ亴" : "缂栬緫浜哄憳";
+
+const createEmptyEducation = () => ({
+  education: "",
+  schoolName: "",
+  enrollTime: "",
+  graduateTime: "",
+  major: "",
+  degree: "",
+});
+
+const createEmptyWork = () => ({
+  formerCompany: "",
+  formerDept: "",
+  formerPosition: "",
+  startDate: "",
+  endDate: "",
+  workDesc: "",
+});
+
+const createEmptyEmergency = () => ({
+  contactName: "",
+  contactRelation: "",
+  contactPhone: "",
+  contactAddress: "",
+});
+
+const createDefaultForm = () => ({
+  id: undefined,
+  // 鍩烘湰淇℃伅
+  staffNo: "",
+  staffName: "",
+  alias: "",
+  phone: "",
+  sex: "",
+  birthDate: "",
+  age: undefined,
+  nativePlace: "",
+  nation: "",
+  maritalStatus: "",
+  politicalStatus: "",
+  firstWorkDate: "",
+  workingYears: undefined,
+  idCardNo: "",
+  hukouType: "",
+  email: "",
+  currentAddress: "",
+  // 鍦ㄨ亴淇℃伅
+  contractStartTime: "",
+  contractEndTime: "",
+  proTerm: undefined,
+  positiveDate: "",
+  sysDeptId: undefined,
+  sysPostId: undefined,
+  basicSalary: undefined,
+  // 閾惰鍗′俊鎭�
+  bankName: "",
+  bankCardNo: "",
+  // 鏁欒偛缁忓巻
+  staffEducationList: [createEmptyEducation()],
+  // 宸ヤ綔缁忓巻
+  staffWorkExperienceList: [createEmptyWork()],
+  // 绱ф�ヨ仈绯讳汉
+  staffEmergencyContactList: [createEmptyEmergency()],
+  // 瑙掕壊锛堝崟閫夛級
+  roleId: undefined,
+});
+
+const state = reactive({
+  form: createDefaultForm(),
+  rules: {
+    staffNo: [{ required: true, message: "璇疯緭鍏ュ憳宸ョ紪鍙�", trigger: "blur" }],
+    staffName: [{ required: true, message: "璇疯緭鍏ュ鍚�", trigger: "blur" }],
+    phone: [{ required: true, message: "璇疯緭鍏ユ墜鏈�", trigger: "blur" }],
+    sex: [{ required: true, message: "璇烽�夋嫨鎬у埆", trigger: "change" }],
+    birthDate: [
+      { required: true, message: "璇烽�夋嫨鍑虹敓鏃ユ湡", trigger: "change" },
+    ],
+    contractStartTime: [
+      { required: true, message: "璇烽�夋嫨鍏ヨ亴鏃ユ湡", trigger: "change" },
+    ],
+    contractEndTime: [
+      { required: true, message: "璇烽�夋嫨鍚堝悓缁撴潫鏃ユ湡", trigger: "change" },
+    ],
+    sysDeptId: [
+      { required: true, message: "璇烽�夋嫨閮ㄩ棬", trigger: "change" },
+    ],
+    roleId: [{ required: true, message: "璇烽�夋嫨瑙掕壊", trigger: "change" }],
+  },
+  postOptions: [],
+  deptOptions: [],
+});
+
+const { form, rules, postOptions, deptOptions } = toRefs(state);
+const roleOptions = ref([]);
+
+const resetForm = () => {
+  Object.assign(form.value, createDefaultForm());
+  nextTick(() => {
+    formRef.value?.clearValidate();
+  });
+};
+
+const fetchPostOptions = () => {
+  findPostOptions().then((res) => {
+    postOptions.value = res.data || [];
+  });
+};
+
+const fetchDeptOptions = () => {
+  deptTreeSelect().then((response) => {
+    deptOptions.value = filterDisabledDept(
+      JSON.parse(JSON.stringify(response.data || []))
+    );
+  });
+};
+
+const fetchRoleOptions = () => {
+  getUser().then((res) => {
+    roleOptions.value = res.roles || [];
+  });
+};
+
+function filterDisabledDept(deptList) {
+  return deptList.filter((dept) => {
+    if (dept.disabled) {
+      return false;
+    }
+    if (dept.children && dept.children.length) {
+      dept.children = filterDisabledDept(dept.children);
+    }
+    return true;
+  });
+}
+
+const openDialog = (type, row) => {
+  operationType.value = type;
+  dialogFormVisible.value = true;
+  fetchPostOptions();
+  fetchDeptOptions();
+  fetchRoleOptions();
+  resetForm();
+  if (type === "edit" && row?.id) {
+    id.value = row.id;
+    staffOnJobInfo(id.value, {}).then((res) => {
+      const d = res.data || {};
+      Object.assign(form.value, {
+        ...form.value,
+        ...d,
+      });
+      if (
+        !Array.isArray(form.value.staffEducationList) ||
+        !form.value.staffEducationList.length
+      ) {
+        form.value.staffEducationList = [createEmptyEducation()];
+      }
+      if (
+        !Array.isArray(form.value.staffWorkExperienceList) ||
+        !form.value.staffWorkExperienceList.length
+      ) {
+        form.value.staffWorkExperienceList = [createEmptyWork()];
+      }
+      if (
+        !Array.isArray(form.value.staffEmergencyContactList) ||
+        !form.value.staffEmergencyContactList.length
+      ) {
+        form.value.staffEmergencyContactList = [createEmptyEmergency()];
+      }
+      if (form.value.sysPostId === 0) {
+        form.value.sysPostId = undefined;
+      }
+      if (form.value.sysDeptId === 0) {
+        form.value.sysDeptId = undefined;
+      }
+    });
+  }
+};
+
+onMounted(() => {
+  fetchPostOptions();
+  fetchDeptOptions();
+});
+
+const submitForm = () => {
+  if (!form.value.sysPostId) {
+    form.value.sysPostId = undefined;
+  }
+  if (!form.value.sysDeptId) {
+    form.value.sysDeptId = undefined;
+  }
+  // 鍏煎鍚庣鍙兘浠嶄娇鐢� roleIds 鏁扮粍
+  form.value.roleIds = form.value.roleId ? [form.value.roleId] : [];
+  formRef.value?.validate((valid) => {
+    if (valid) {
+      if (operationType.value === "add") {
+        createStaffOnJob(form.value).then(() => {
+          proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
+          closeDia();
+        });
+      } else {
+        updateStaffOnJob(id.value, form.value).then(() => {
+          proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
+          closeDia();
+        });
+      }
+    }
+  });
+};
+
+const closeDia = () => {
+  formRef.value?.resetFields();
+  dialogFormVisible.value = false;
+  emit("close");
+};
+
+defineExpose({
+  openDialog,
+});
+</script>
+
+<style scoped>
+.form-dia-body {
+  padding: 0;
+}
+
+.card-title-line {
+  color: #f56c6c;
+  margin-right: 4px;
+}
+
+.form-card {
+  margin-bottom: 16px;
+}
+
+.dialog-footer {
+  text-align: right;
+}
+</style>
\ No newline at end of file
diff --git a/src/views/officeProcessAutomation/HrManage/staff-archive/components/RenewContract.vue b/src/views/officeProcessAutomation/HrManage/staff-archive/components/RenewContract.vue
new file mode 100644
index 0000000..9c2acfc
--- /dev/null
+++ b/src/views/officeProcessAutomation/HrManage/staff-archive/components/RenewContract.vue
@@ -0,0 +1,141 @@
+<template>
+  <el-dialog
+      v-model="isShow"
+      title="缁鍚堝悓"
+      width="800px"
+      @close="closeModal"
+  >
+    <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
+      <el-form-item label="鍚堝悓寮�濮嬫棩鏈燂細" prop="contractStartTime">
+        <el-date-picker
+            v-model="form.contractStartTime"
+            type="date"
+            placeholder="璇烽�夋嫨鏃ユ湡"
+            value-format="YYYY-MM-DD"
+            format="YYYY-MM-DD"
+            clearable
+            style="width: 100%"
+            @change="calculateContractTerm"
+        />
+      </el-form-item>
+      <el-form-item label="鍚堝悓缁撴潫鏃ユ湡锛�" prop="contractEndTime">
+        <el-date-picker
+            v-model="form.contractEndTime"
+            type="date"
+            placeholder="璇烽�夋嫨鏃ユ湡"
+            value-format="YYYY-MM-DD"
+            format="YYYY-MM-DD"
+            clearable
+            style="width: 100%"
+            @change="calculateContractTerm"
+        />
+      </el-form-item>
+      <el-form-item label="鍚堝悓骞撮檺锛�" prop="contractTerm">
+        <el-input-number v-model="form.contractTerm" :precision="0" :step="1" style="width: 100%" :disabled="true"/>
+      </el-form-item>
+    </el-form>
+    <template #footer>
+      <div class="dialog-footer">
+        <el-button type="primary" @click="submitForm">纭</el-button>
+        <el-button @click="closeModal">鍙栨秷</el-button>
+      </div>
+    </template>
+  </el-dialog>
+</template>
+
+<script setup>
+// 缁鍚堝悓
+import { renewContract } from "@/api/personnelManagement/staffOnJob.js";
+import {computed, getCurrentInstance,} from "vue";
+
+const emit = defineEmits(['update:visible', 'completed']);
+
+const data = reactive({
+  form: {
+    contractTerm: 0,
+    contractStartTime: "",
+    contractEndTime: "",
+  },
+  rules: {
+    contractTerm: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    contractStartTime: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    contractEndTime: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+  }
+});
+const { form, rules } = toRefs(data);
+let { proxy } = getCurrentInstance()
+
+const props = defineProps({
+  id: {
+    type: Number,
+    default: 0,
+  },
+
+  visible: {
+    type: Boolean,
+    required: true,
+  },
+})
+
+const isShow = computed({
+  get() {
+    return props.visible;
+  },
+  set(val) {
+    emit('update:visible', val);
+  },
+});
+
+// 璁$畻鍚堝悓骞撮檺
+const calculateContractTerm = () => {
+  if (form.value.contractStartTime && form.value.contractEndTime) {
+    const startDate = new Date(form.value.contractStartTime);
+    const endDate = new Date(form.value.contractEndTime);
+
+    if (endDate > startDate) {
+      // 璁$畻骞翠唤宸�
+      const yearDiff = endDate.getFullYear() - startDate.getFullYear();
+      const monthDiff = endDate.getMonth() - startDate.getMonth();
+      const dayDiff = endDate.getDate() - startDate.getDate();
+
+      let years = yearDiff;
+
+      // 濡傛灉缁撴潫鏃ユ湡鐨勬湀鏃ュ皬浜庡紑濮嬫棩鏈熺殑鏈堟棩锛屽垯鍑忓幓1骞�
+      if (monthDiff < 0 || (monthDiff === 0 && dayDiff < 0)) {
+        years = yearDiff - 1;
+      }
+
+      form.value.contractTerm = Math.max(0, years);
+    } else {
+      form.value.contractTerm = 0;
+    }
+  } else {
+    form.value.contractTerm = 0;
+  }
+};
+
+const submitForm = () => {
+  proxy.$refs["formRef"].validate(valid => {
+    if (valid) {
+      renewContract(props.id, form.value).then(res => {
+        if (res.code === 200) {
+          proxy.$modal.msgSuccess("缁鍚堝悓鎴愬姛");
+          emit('completed');
+          closeModal();
+        }
+      })
+    }
+  })
+}
+
+// 鍏抽棴寮规
+const closeModal = () => {
+  // 閲嶇疆琛ㄥ崟鏁版嵁
+  form.value = {
+    contractTerm: 0,
+    contractStartTime: "",
+    contractEndTime: "",
+  };
+  isShow.value = false;
+};
+</script>
diff --git a/src/views/officeProcessAutomation/HrManage/staff-archive/components/Show.vue b/src/views/officeProcessAutomation/HrManage/staff-archive/components/Show.vue
new file mode 100644
index 0000000..5d0b261
--- /dev/null
+++ b/src/views/officeProcessAutomation/HrManage/staff-archive/components/Show.vue
@@ -0,0 +1,69 @@
+<template>
+  <div>
+    <el-dialog
+        v-model="dialogFormVisible"
+        title="璇︽儏"
+        width="70%"
+        @close="closeDia"
+    >
+      <PIMTable
+          rowKey="id"
+          :column="tableColumn"
+          :tableData="tableData"
+          :tableLoading="tableLoading"
+          height="600"
+      ></PIMTable>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button @click="closeDia">鍙栨秷</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup>
+import {ref} from "vue";
+import {staffOnJobInfo} from "@/api/personnelManagement/staffOnJob.js";
+const { proxy } = getCurrentInstance()
+const emit = defineEmits(['close'])
+
+const dialogFormVisible = ref(false);
+const operationType = ref('')
+const tableColumn = ref([
+  {
+    label: "鍚堝悓寮�濮嬫棩鏈�",
+    prop: "contractStartTime",
+  },
+  {
+    label: "鍚堝悓缁撴潫鏃ユ湡",
+    prop: "contractEndTime",
+  },
+]);
+const tableData = ref([]);
+const tableLoading = ref(false);
+
+// 鎵撳紑寮规
+const openDialog = (type, row) => {
+  operationType.value = type;
+  dialogFormVisible.value = true;
+  if (operationType.value === 'edit') {
+    staffOnJobInfo({staffNo: row.staffNo}).then(res => {
+      tableData.value = res.data
+    })
+  }
+}
+
+// 鍏抽棴寮规
+const closeDia = () => {
+  dialogFormVisible.value = false;
+  emit('close')
+};
+defineExpose({
+  openDialog,
+});
+</script>
+
+<style scoped>
+
+</style>
\ No newline at end of file
diff --git a/src/views/officeProcessAutomation/HrManage/staff-archive/index.vue b/src/views/officeProcessAutomation/HrManage/staff-archive/index.vue
new file mode 100644
index 0000000..66cec7a
--- /dev/null
+++ b/src/views/officeProcessAutomation/HrManage/staff-archive/index.vue
@@ -0,0 +1,360 @@
+<!--OA妯″潡锛氬憳宸ユ。妗�-->
+<template>
+  <div class="app-container">
+    <div class="search_form mb20">
+      <div>
+        <span class="search_title">濮撳悕锛�</span>
+        <el-input
+            v-model="searchForm.staffName"
+            style="width: 240px"
+            placeholder="璇疯緭鍏ュ鍚嶆悳绱�"
+            @change="handleQuery"
+            clearable
+            :prefix-icon="Search"
+        />
+        <span class="search_title search_title2">閮ㄩ棬锛�</span>
+          <el-tree-select
+            v-model="searchForm.sysDeptId"
+            :data="deptOptions"
+            check-strictly
+            :render-after-expand="false"
+            style="width: 240px"
+            placeholder="璇烽�夋嫨"
+          />
+          <span class="search_title search_title2">鍏ヨ亴鏃ユ湡锛�</span>
+          <el-date-picker
+            v-model="searchForm.contractStartTime"
+            value-format="YYYY-MM-DD"
+            format="YYYY-MM-DD"
+            placeholder="璇烽�夋嫨"
+          />
+        <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
+        >鎼滅储</el-button
+        >
+      </div>
+      <div>
+        <el-button type="primary" @click="openFormNewOrEditFormDia('add')">鏂板鍏ヨ亴</el-button>
+        <el-button type="info" @click="handleImport">瀵煎叆</el-button>
+        <el-button @click="handleOut">瀵煎嚭</el-button>
+      </div>
+    </div>
+    <div class="table_list">
+      <PIMTable
+          rowKey="id"
+          :column="tableColumn"
+          :tableData="tableData"
+          :page="page"
+          :isSelection="true"
+          @selection-change="handleSelectionChange"
+          :tableLoading="tableLoading"
+          @pagination="pagination"
+          :total="page.total"
+      ></PIMTable>
+    </div>
+    <show-form-dia ref="formDia" @close="handleQuery"></show-form-dia>
+    <new-or-edit-form-dia ref="formDiaNewOrEditFormDia" @close="handleQuery"></new-or-edit-form-dia>
+    <renew-contract
+        v-if="isShowRenewContractModal"
+        v-model:visible="isShowRenewContractModal"
+        :id="id"
+        @completed="handleQuery"
+    />
+    
+    <!-- 瀵煎叆瀵硅瘽妗� -->
+    <el-dialog :title="upload.title" v-model="upload.open" width="400px" append-to-body>
+      <el-upload
+        ref="uploadRef"
+        :limit="1"
+        accept=".xlsx, .xls"
+        :headers="upload.headers"
+        :action="upload.url"
+        :disabled="upload.isUploading"
+        :on-progress="handleFileUploadProgress"
+        :on-success="handleFileSuccess"
+        :auto-upload="false"
+        drag
+      >
+        <el-icon class="el-icon--upload"><upload-filled /></el-icon>
+        <div class="el-upload__text">灏嗘枃浠舵嫋鍒版澶勶紝鎴�<em>鐐瑰嚮涓婁紶</em></div>
+        <template #tip>
+          <div class="el-upload__tip text-center">
+            <span>浠呭厑璁稿鍏ls銆亁lsx鏍煎紡鏂囦欢銆�</span>
+            <el-link type="primary" :underline="false" style="font-size: 12px; vertical-align: baseline; margin-left: 5px;" @click="importTemplate">涓嬭浇妯℃澘</el-link>
+          </div>
+        </template>
+      </el-upload>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="submitFileForm">纭� 瀹�</el-button>
+          <el-button @click="upload.open = false">鍙� 娑�</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup>
+import { Search, UploadFilled } from "@element-plus/icons-vue";
+import {onMounted, ref} from "vue";
+import {ElMessageBox} from "element-plus";
+import { deptTreeSelect } from "@/api/system/user.js";
+import { staffOnJobListPage } from "@/api/personnelManagement/staffOnJob.js";
+import { getToken } from "@/utils/auth";
+import dayjs from "dayjs";
+
+const NewOrEditFormDia = defineAsyncComponent(() => import("@/views/personnelManagement/employeeRecord/components/NewOrEditFormDia.vue"));
+const ShowFormDia = defineAsyncComponent(() => import( "@/views/personnelManagement/employeeRecord/components/Show.vue"));
+const RenewContract = defineAsyncComponent(() => import( "@/views/personnelManagement/employeeRecord/components/RenewContract.vue"));
+
+const data = reactive({
+  searchForm: {
+    staffName: "",
+    entryDate: undefined, // 褰曞叆鏃ユ湡
+    entryDateStart: undefined,
+    entryDateEnd: undefined,
+  },
+  deptOptions: [],
+});
+const { searchForm, deptOptions } = toRefs(data);
+const isShowRenewContractModal = ref(false);
+const id = ref(0);
+const tableColumn = ref([
+  {
+    label: "鐘舵��",
+    prop: "staffState",
+    dataType: "tag",
+    formatData: (params) => {
+      if (params == 0) {
+        return "绂昏亴";
+      } else if (params == 1) {
+        return "鍦ㄨ亴";
+      } else {
+        return null;
+      }
+    },
+    formatType: (params) => {
+      if (params == 0) {
+        return "danger";
+      } else if (params == 1) {
+        return "primary";
+      } else {
+        return null;
+      }
+    },
+  },
+  {
+    label: "鍛樺伐缂栧彿",
+    prop: "staffNo",
+  },
+  {
+    label: "濮撳悕",
+    prop: "staffName",
+  },
+  {
+    label: "鍒悕",
+    prop: "alias",
+  },
+  {
+    label: "鎵嬫満",
+    prop: "phone",
+    width: 150,
+  },
+  {
+    label: "鎬у埆",
+    prop: "sex",
+  },
+  {
+    label: "鍑虹敓鏃ユ湡",
+    prop: "birthDate",
+    width: 120,
+  },
+  {
+    label: "鍏ヨ亴鏃ユ湡",
+    prop: "contractStartTime",
+    width: 120,
+  },
+  {
+    label: "骞撮緞",
+    prop: "age",
+  },
+  {
+    label: "绫嶈疮",
+    prop: "nativePlace",
+  },
+  {
+    label: "姘戞棌",
+    prop: "nation",
+    width: 100,
+  },
+  {
+    label: "濠氬Щ鐘跺喌",
+    prop: "maritalStatus",
+    width: 100,
+  },
+  {
+    dataType: "action",
+    label: "鎿嶄綔",
+    align: "center",
+    fixed: 'right',
+    width: 180,
+    operation: [
+      {
+        name: "缂栬緫",
+        type: "text",
+        clickFun: (row) => {
+          openFormNewOrEditFormDia("edit", row);
+        },
+      },
+      {
+        name: "缁鍚堝悓",
+        type: "text",
+        showHide: row => row.staffState === 1,
+        clickFun: (row) => {
+          isShowRenewContractModal.value = true;
+          id.value = row.id;
+        },
+      },
+    ],
+  },
+]);
+const tableData = ref([]);
+const selectedRows = ref([]);
+const tableLoading = ref(false);
+const page = reactive({
+  current: 1,
+  size: 100,
+  total: 0
+});
+const formDia = ref()
+const formDiaNewOrEditFormDia = ref()
+const { proxy } = getCurrentInstance()
+
+// 瀵煎叆鐩稿叧
+const uploadRef = ref(null)
+const upload = reactive({
+  // 鏄惁鏄剧ず寮瑰嚭灞�
+  open: false,
+  // 寮瑰嚭灞傛爣棰�
+  title: "",
+  // 鏄惁绂佺敤涓婁紶
+  isUploading: false,
+  // 璁剧疆涓婁紶鐨勮姹傚ご閮�
+  headers: { Authorization: "Bearer " + getToken() },
+  // 涓婁紶鐨勫湴鍧�
+  url: import.meta.env.VITE_APP_BASE_API + "/staff/staffOnJob/import"
+})
+
+const fetchDeptOptions = () => {
+    deptTreeSelect().then(response => {
+      deptOptions.value = filterDisabledDept(
+        JSON.parse(JSON.stringify(response.data))
+      );
+    });
+  };
+const filterDisabledDept = deptList => {
+    return deptList.filter(dept => {
+      if (dept.disabled) {
+        return false;
+      }
+      if (dept.children && dept.children.length) {
+        dept.children = filterDisabledDept(dept.children);
+      }
+      return true;
+    });
+  };
+/** 鎼滅储鎸夐挳鎿嶄綔 */
+const handleQuery = () => {
+  page.current = 1;
+  getList();
+};
+const pagination = (obj) => {
+  page.current = obj.page;
+  page.size = obj.limit;
+  getList();
+};
+const getList = () => {
+  fetchDeptOptions();
+  tableLoading.value = true;
+  const params = { ...searchForm.value, ...page };
+  params.entryDate = undefined
+  staffOnJobListPage({...params}).then(res => {
+    tableLoading.value = false;
+    tableData.value = res.data.records
+    page.total = res.data.total;
+  }).catch(err => {
+    tableLoading.value = false;
+  })
+};
+// 琛ㄦ牸閫夋嫨鏁版嵁
+const handleSelectionChange = (selection) => {
+  selectedRows.value = selection;
+};
+
+// 鎵撳紑寮规
+const openForm = (type, row) => {
+  nextTick(() => {
+    formDia.value?.openDialog(type, row)
+  })
+};
+const openFormNewOrEditFormDia = (type, row) => {
+  nextTick(() => {
+    formDiaNewOrEditFormDia.value?.openDialog(type, row)
+  })
+};
+
+// 瀵煎嚭
+const handleOut = () => {
+  ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
+    confirmButtonText: "纭",
+    cancelButtonText: "鍙栨秷",
+    type: "warning",
+  })
+      .then(() => {
+        proxy.download("/staff/staffOnJob/export", {staffState: 1}, "鍛樺伐鍙拌处.xlsx");
+      })
+      .catch(() => {
+        proxy.$modal.msg("宸插彇娑�");
+      });
+};
+
+// 瀵煎叆鎸夐挳鎿嶄綔
+const handleImport = () => {
+  upload.title = "鍛樺伐瀵煎叆"
+  upload.open = true
+}
+
+// 涓嬭浇妯℃澘鎿嶄綔
+const importTemplate = () => {
+  proxy.download("/staff/staffOnJob/downloadTemplate", {}, `鍛樺伐瀵煎叆妯℃澘_${new Date().getTime()}.xlsx`)
+}
+
+// 鏂囦欢涓婁紶涓鐞�
+const handleFileUploadProgress = (event, file, fileList) => {
+  upload.isUploading = true
+}
+
+// 鏂囦欢涓婁紶鎴愬姛澶勭悊
+const handleFileSuccess = (response, file, fileList) => {
+  upload.open = false
+  upload.isUploading = false
+  proxy.$refs["uploadRef"].handleRemove(file)
+  proxy.$alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.msg + "</div>", "瀵煎叆缁撴灉", { dangerouslyUseHTMLString: true })
+  getList()
+}
+
+// 鎻愪氦涓婁紶鏂囦欢
+const submitFileForm = () => {
+  proxy.$refs["uploadRef"].submit()
+}
+
+onMounted(() => {
+  getList();
+});
+</script>
+
+<style scoped>
+.search_title2 {
+  margin-left: 10px;
+}
+</style>
+
diff --git a/src/views/officeProcessAutomation/HrManage/staff-contract/components/formDia.vue b/src/views/officeProcessAutomation/HrManage/staff-contract/components/formDia.vue
new file mode 100644
index 0000000..3db1bee
--- /dev/null
+++ b/src/views/officeProcessAutomation/HrManage/staff-contract/components/formDia.vue
@@ -0,0 +1,93 @@
+<template>
+  <div>
+    <el-dialog v-model="dialogFormVisible"
+               title="璇︽儏"
+               width="70%"
+               @close="closeDia">
+      <PIMTable rowKey="id"
+                :column="tableColumn"
+                :tableData="tableData"
+                :tableLoading="tableLoading"
+                height="600"></PIMTable>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button @click="closeDia">鍙栨秷</el-button>
+        </div>
+      </template>
+    </el-dialog>
+    <FileList v-if="fileDialogVisible"
+              v-model:visible="fileDialogVisible"
+              :record-type="'staff_contract'"
+              :record-id="recordId" />
+  </div>
+</template>
+
+<script setup>
+  import { ref, defineAsyncComponent, getCurrentInstance } from "vue";
+  import { findStaffContractListPage } from "@/api/personnelManagement/staffContract.js";
+  const FileList = defineAsyncComponent(() =>
+    import("@/components/Dialog/FileList.vue")
+  );
+  const { proxy } = getCurrentInstance();
+  const emit = defineEmits(["close"]);
+  const fileDialogVisible = ref(false);
+  const recordId = ref(0);
+  const dialogFormVisible = ref(false);
+  const operationType = ref("");
+  const tableColumn = ref([
+    {
+      label: "鍚堝悓骞撮檺",
+      prop: "contractTerm",
+    },
+    {
+      label: "鍚堝悓寮�濮嬫棩鏈�",
+      prop: "contractStartTime",
+    },
+    {
+      label: "鍚堝悓缁撴潫鏃ユ湡",
+      prop: "contractEndTime",
+    },
+    {
+      dataType: "action",
+      label: "鎿嶄綔",
+      align: "center",
+      fixed: "right",
+      width: 120,
+      operation: [
+        {
+          name: "闄勪欢",
+          type: "text",
+          clickFun: row => {
+            recordId.value = row.id;
+            fileDialogVisible.value = true;
+          },
+        },
+      ],
+    },
+  ]);
+  const tableData = ref([]);
+  const tableLoading = ref(false);
+
+  // 鎵撳紑寮规
+  const openDialog = (type, row) => {
+    operationType.value = type;
+    dialogFormVisible.value = true;
+    if (operationType.value === "edit") {
+      findStaffContractListPage({ staffOnJobId: row.id }).then(res => {
+        tableData.value = res.data.records;
+      });
+    }
+  };
+
+  // 鍏抽棴寮规
+  const closeDia = () => {
+    dialogFormVisible.value = false;
+    emit("close");
+  };
+  defineExpose({
+    openDialog,
+  });
+</script>
+
+<style scoped>
+</style>
\ No newline at end of file
diff --git a/src/views/officeProcessAutomation/HrManage/staff-contract/filesDia.vue b/src/views/officeProcessAutomation/HrManage/staff-contract/filesDia.vue
new file mode 100644
index 0000000..02f9cef
--- /dev/null
+++ b/src/views/officeProcessAutomation/HrManage/staff-contract/filesDia.vue
@@ -0,0 +1,197 @@
+<template>
+  <div>
+    <el-dialog
+        v-model="dialogFormVisible"
+        title="涓婁紶闄勪欢"
+        width="50%"
+        @close="closeDia"
+    >
+      <div style="margin-bottom: 10px;text-align: right">
+        <el-upload
+            v-model:file-list="fileList"
+            class="upload-demo"
+            :action="uploadUrl"
+            :on-success="handleUploadSuccess"
+            :on-error="handleUploadError"
+            name="file"
+            :show-file-list="false"
+            :headers="headers"
+            style="display: inline;margin-right: 10px"
+        >
+          <el-button type="primary">涓婁紶闄勪欢</el-button>
+        </el-upload>
+        <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
+      </div>
+      <PIMTable
+          rowKey="id"
+          :column="tableColumn"
+          :tableData="tableData"
+          :tableLoading="tableLoading"
+          :isSelection="true"
+          :page="page"
+          @selection-change="handleSelectionChange"
+          height="500"
+          @pagination="paginationSearch"
+          :total="page.total"
+      >
+      </PIMTable>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button @click="closeDia">鍙栨秷</el-button>
+        </div>
+      </template>
+    </el-dialog>
+    <filePreview ref="filePreviewRef" />
+  </div>
+</template>
+
+<script setup>
+import {ref} from "vue";
+import {ElMessageBox} from "element-plus";
+import {getToken} from "@/utils/auth.js";
+import filePreview from '@/components/filePreview/index.vue'
+import {
+  fileAdd,
+  fileDel,
+  fileListPage
+} from "@/api/financialManagement/revenueManagement.js";
+import Pagination from "@/components/PIMTable/Pagination.vue";
+const { proxy } = getCurrentInstance()
+const emit = defineEmits(['close'])
+
+const dialogFormVisible = ref(false);
+const currentId = ref('')
+const selectedRows = ref([]);
+const filePreviewRef = ref()
+const tableColumn = ref([
+  {
+    label: "鏂囦欢鍚嶇О",
+    prop: "name",
+  },
+  {
+    dataType: "action",
+    label: "鎿嶄綔",
+    align: "center",
+    operation: [
+      {
+        name: "涓嬭浇",
+        type: "text",
+        clickFun: (row) => {
+          downLoadFile(row);
+        },
+      },
+      {
+        name: "棰勮",
+        type: "text",
+        clickFun: (row) => {
+          lookFile(row);
+        },
+      }
+    ],
+  },
+]);
+const page = reactive({
+	current: 1,
+	size: 100,
+});
+const total = ref(0);
+const tableData = ref([]);
+const fileList = ref([]);
+const tableLoading = ref(false);
+const accountType = ref('')
+const headers = ref({
+  Authorization: "Bearer " + getToken(),
+});
+const uploadUrl = ref(import.meta.env.VITE_APP_BASE_API + "/file/upload"); // 涓婁紶鐨勫浘鐗囨湇鍔″櫒鍦板潃
+
+// 鎵撳紑寮规
+const openDialog = (row,type) => {
+  accountType.value = type;
+  dialogFormVisible.value = true;
+  currentId.value = row.id;
+  getList()
+}
+const paginationSearch = (obj) => {
+	page.current = obj.page;
+	page.size = obj.limit;
+	getList();
+};
+const getList = () => {
+  fileListPage({accountId: currentId.value,accountType:accountType.value, ...page}).then(res => {
+    tableData.value = res.data.records;
+    page.total = res.data.total;
+  })
+}
+// 琛ㄦ牸閫夋嫨鏁版嵁
+const handleSelectionChange = (selection) => {
+  selectedRows.value = selection;
+};
+
+// 鍏抽棴寮规
+const closeDia = () => {
+  dialogFormVisible.value = false;
+  emit('close')
+};
+// 涓婁紶鎴愬姛澶勭悊
+function handleUploadSuccess(res, file) {
+  // 濡傛灉涓婁紶鎴愬姛
+  if (res.code == 200) {
+    const fileRow = {}
+    fileRow.name = res.data.originalName
+    fileRow.url = res.data.tempPath
+    uploadFile(fileRow)
+  } else {
+    proxy.$modal.msgError("鏂囦欢涓婁紶澶辫触");
+  }
+}
+function uploadFile(file) {
+  file.accountId = currentId.value;
+  file.accountType = accountType.value;
+  fileAdd(file).then(res => {
+    proxy.$modal.msgSuccess("鏂囦欢涓婁紶鎴愬姛");
+    getList()
+  })
+}
+// 涓婁紶澶辫触澶勭悊
+function handleUploadError() {
+  proxy.$modal.msgError("鏂囦欢涓婁紶澶辫触");
+}
+// 涓嬭浇闄勪欢
+const downLoadFile = (row) => {
+	proxy.$download.byUrl(row.url, row.originalFilename);
+}
+// 鍒犻櫎
+const handleDelete = () => {
+  let ids = [];
+  if (selectedRows.value.length > 0) {
+    ids = selectedRows.value.map((item) => item.id);
+  } else {
+    proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
+    return;
+  }
+  ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
+    confirmButtonText: "纭",
+    cancelButtonText: "鍙栨秷",
+    type: "warning",
+  }).then(() => {
+    fileDel(ids).then((res) => {
+      proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+      getList();
+    });
+  }).catch(() => {
+    proxy.$modal.msg("宸插彇娑�");
+  });
+};
+// 棰勮闄勪欢
+const lookFile = (row) => {
+  filePreviewRef.value.open(row.url)
+}
+
+defineExpose({
+  openDialog,
+});
+</script>
+
+<style scoped>
+
+</style>
\ No newline at end of file
diff --git a/src/views/officeProcessAutomation/HrManage/staff-contract/index.vue b/src/views/officeProcessAutomation/HrManage/staff-contract/index.vue
new file mode 100644
index 0000000..8186bdd
--- /dev/null
+++ b/src/views/officeProcessAutomation/HrManage/staff-contract/index.vue
@@ -0,0 +1,296 @@
+<!--OA妯″潡锛氬憳宸ュ悎鍚�-->
+<template>
+  <div class="app-container">
+    <div class="search_form mb20">
+      <div>
+        <span class="search_title">濮撳悕锛�</span>
+        <el-input v-model="searchForm.staffName" style="width: 240px" placeholder="璇疯緭鍏ュ鍚嶆悳绱�" @change="handleQuery"
+          clearable :prefix-icon="Search" />
+        <span style="margin-left: 10px" class="search_title">鍚堝悓缁撴潫鏃ユ湡锛�</span>
+        <el-date-picker v-model="searchForm.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="daterange"
+          placeholder="璇烽�夋嫨" clearable @change="changeDaterange" />
+        <el-button type="primary" @click="handleQuery" style="margin-left: 10px">鎼滅储</el-button>
+      </div>
+      <div>
+        <el-button @click="handleOut">瀵煎嚭</el-button>
+      </div>
+    </div>
+    <div class="table_list">
+      <PIMTable rowKey="id" :column="tableColumn" :tableData="tableData" :page="page" :isSelection="true"
+        @selection-change="handleSelectionChange" :tableLoading="tableLoading" @pagination="pagination"
+        :total="page.total"></PIMTable>
+    </div>
+    <form-dia ref="formDia" @close="handleQuery"></form-dia>
+
+    <!-- 鍚堝悓瀵煎叆瀵硅瘽妗� -->
+    <el-dialog
+      :title="upload.title"
+      v-model="upload.open"
+      width="400px"
+      append-to-body
+    >
+      <el-upload
+        ref="uploadRef"
+        :limit="1"
+        accept=".xlsx, .xls"
+        :headers="upload.headers"
+        :action="upload.url + '?updateSupport=' + upload.updateSupport"
+        :disabled="upload.isUploading"
+        :on-progress="handleFileUploadProgress"
+        :on-success="handleFileSuccess"
+        :auto-upload="false"
+        drag
+      >
+        <el-icon class="el-icon--upload"><upload-filled /></el-icon>
+        <div class="el-upload__text">灏嗘枃浠舵嫋鍒版澶勶紝鎴�<em>鐐瑰嚮涓婁紶</em></div>
+        <template #tip>
+          <div class="el-upload__tip text-center">
+            <span>浠呭厑璁稿鍏ls銆亁lsx鏍煎紡鏂囦欢銆�</span>
+          </div>
+        </template>
+      </el-upload>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="submitFileForm">纭� 瀹�</el-button>
+          <el-button @click="upload.open = false">鍙� 娑�</el-button>
+        </div>
+      </template>
+    </el-dialog>
+    <files-dia ref="filesDia"></files-dia>
+  </div>
+</template>
+
+<script setup>
+import { Search } from "@element-plus/icons-vue";
+import { onMounted, ref } from "vue";
+import FormDia from "@/views/personnelManagement/contractManagement/components/formDia.vue";
+import { ElMessageBox } from "element-plus";
+import { staffOnJobListPage } from "@/api/personnelManagement/staffOnJob.js";
+import dayjs from "dayjs";
+import { getToken } from "@/utils/auth.js";
+import FilesDia from "./filesDia.vue";
+const data = reactive({
+  searchForm: {
+    staffName: "",
+    entryDate: null, // 褰曞叆鏃ユ湡
+    entryDateStart: undefined,
+    entryDateEnd: undefined,
+  },
+});
+const { searchForm } = toRefs(data);
+const tableColumn = ref([
+  {
+    label: "鐘舵��",
+    prop: "staffState",
+    dataType: "tag",
+    formatData: (params) => {
+      if (params == 0) {
+        return "绂昏亴";
+      } else if (params == 1) {
+        return "鍦ㄨ亴";
+      } else {
+        return null;
+      }
+    },
+    formatType: (params) => {
+      if (params == 0) {
+        return "danger";
+      } else if (params == 1) {
+        return "primary";
+      } else {
+        return null;
+      }
+    },
+  },
+  {
+    label: "鍛樺伐缂栧彿",
+    prop: "staffNo",
+  },
+  {
+    label: "濮撳悕",
+    prop: "staffName",
+  },
+  {
+    label: "鎬у埆",
+    prop: "sex",
+  },
+  {
+    label: "鎴风睄浣忓潃",
+    prop: "nativePlace",
+  },
+  {
+    label: "宀椾綅",
+    prop: "postName",
+  },
+  {
+    label: "鐜颁綇鍧�",
+    prop: "adress",
+    width: 200
+  },
+  {
+    label: "绗竴瀛﹀巻",
+    prop: "firstStudy",
+  },
+  {
+    label: "涓撲笟",
+    prop: "profession",
+    width: 100
+  },
+  {
+    label: "骞撮緞",
+    prop: "age",
+  },
+  {
+    label: "鑱旂郴鐢佃瘽",
+    prop: "phone",
+    width: 150
+  },
+  {
+    label: "绱ф�ヨ仈绯讳汉",
+    prop: "emergencyContact",
+    width: 120
+  },
+  {
+    label: "绱ф�ヨ仈绯讳汉鐢佃瘽",
+    prop: "emergencyContactPhone",
+    width: 150
+  },
+  {
+    label: "鍚堝悓缁撴潫鏃ユ湡",
+    prop: "contractExpireTime",
+    width: 120
+  },
+  {
+    dataType: "action",
+    label: "鎿嶄綔",
+    align: "center",
+    fixed: 'right',
+    width: 120,
+    operation: [
+      {
+        name: "璇︽儏",
+        type: "text",
+        clickFun: (row) => {
+          openForm("edit", row);
+        },
+      }
+    ],
+  },
+]);
+const filesDia = ref()
+const tableData = ref([]);
+const selectedRows = ref([]);
+const tableLoading = ref(false);
+const page = reactive({
+  current: 1,
+  size: 100,
+  total: 0,
+});
+const formDia = ref()
+const { proxy } = getCurrentInstance()
+
+const changeDaterange = (value) => {
+  searchForm.value.entryDateStart = undefined;
+  searchForm.value.entryDateEnd = undefined;
+  if (value) {
+    searchForm.value.entryDateStart = dayjs(value[0]).format("YYYY-MM-DD");
+    searchForm.value.entryDateEnd = dayjs(value[1]).format("YYYY-MM-DD");
+  }
+  getList();
+};
+// 鎵撳紑闄勪欢寮规
+const openFilesFormDia = (row) => {
+  nextTick(() => {
+    filesDia.value?.openDialog( row,'鍚堝悓')
+  })
+};
+// 鏌ヨ鍒楄〃
+/** 鎼滅储鎸夐挳鎿嶄綔 */
+const handleQuery = () => {
+  page.current = 1;
+  getList();
+};
+const pagination = (obj) => {
+  page.current = obj.page;
+  page.size = obj.limit;
+  getList();
+};
+const getList = () => {
+  tableLoading.value = true;
+  const params = { ...searchForm.value, ...page };
+  params.entryDate = undefined
+  params.staffState = 1
+  staffOnJobListPage(params).then(res => {
+    tableLoading.value = false;
+    tableData.value = res.data.records
+    page.total = res.data.total;
+  }).catch(err => {
+    tableLoading.value = false;
+  })
+};
+// 琛ㄦ牸閫夋嫨鏁版嵁
+const handleSelectionChange = (selection) => {
+  selectedRows.value = selection;
+};
+
+// 鎵撳紑寮规
+const openForm = (type, row) => {
+  nextTick(() => {
+    formDia.value?.openDialog(type, row)
+  })
+};
+// 瀵煎嚭
+const handleOut = () => {
+  ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
+    confirmButtonText: "纭",
+    cancelButtonText: "鍙栨秷",
+    type: "warning",
+  })
+    .then(() => {
+      proxy.download("/staff/staffOnJob/export", {staffState: 1}, "鍚堝悓绠$悊.xlsx");
+    })
+    .catch(() => {
+      proxy.$modal.msg("宸插彇娑�");
+    });
+};
+const upload = reactive({
+  // 鏄惁鏄剧ず寮瑰嚭灞傦紙鍚堝悓瀵煎叆锛�
+  open: false,
+  // 寮瑰嚭灞傛爣棰橈紙鍚堝悓瀵煎叆锛�
+  title: "",
+  // 鏄惁绂佺敤涓婁紶
+  isUploading: false,
+  // 鏄惁鏇存柊宸茬粡瀛樺湪鐨勭敤鎴锋暟鎹�
+  updateSupport: 1,
+  // 璁剧疆涓婁紶鐨勮姹傚ご閮�
+  headers: { Authorization: "Bearer " + getToken() },
+  // 涓婁紶鐨勫湴鍧�
+  url: import.meta.env.VITE_APP_BASE_API + "/staff/staffOnJob/import",
+});
+/** 瀵煎叆鎸夐挳鎿嶄綔 */
+function handleImport() {
+  upload.title = "鍚堝悓瀵煎叆";
+  upload.open = true;
+}
+/** 鎻愪氦涓婁紶鏂囦欢 */
+function submitFileForm() {
+  proxy.$refs["uploadRef"].submit();
+}
+/**鏂囦欢涓婁紶涓鐞� */
+const handleFileUploadProgress = (event, file, fileList) => {
+  upload.isUploading = true;
+};
+/** 鏂囦欢涓婁紶鎴愬姛澶勭悊 */
+const handleFileSuccess = (response, file, fileList) => {
+  upload.open = false;
+  upload.isUploading = false;
+  proxy.$refs["uploadRef"].handleRemove(file);
+  getList();
+};
+onMounted(() => {
+  getList();
+});
+</script>
+
+<style scoped></style>
+
diff --git a/src/views/officeProcessAutomation/HrManage/transfer-apply/index.vue b/src/views/officeProcessAutomation/HrManage/transfer-apply/index.vue
new file mode 100644
index 0000000..f731d57
--- /dev/null
+++ b/src/views/officeProcessAutomation/HrManage/transfer-apply/index.vue
@@ -0,0 +1,347 @@
+<!--OA妯″潡锛氳皟宀楃敵璇�-->
+<template>
+  <div class="app-container">
+    <div class="search_form mb20">
+      <div>
+        <span class="search_title">瀹℃壒鍗曞彿锛�</span>
+        <el-input
+          v-model="searchForm.instanceNo"
+          style="width: 220px"
+          placeholder="璇疯緭鍏ュ鎵瑰崟鍙�"
+          clearable
+          @keyup.enter="onSearch"
+        />
+        <span class="search_title" style="margin-left: 12px">鐢宠浜猴細</span>
+        <el-select
+          v-model="searchForm.applicantId"
+          filterable
+          remote
+          clearable
+          reserve-keyword
+          placeholder="璇烽�夋嫨鎴栨悳绱㈢敵璇蜂汉"
+          style="width: 220px"
+          :remote-method="remoteSearchApplicant"
+          :loading="applicantSearchLoading"
+        >
+          <el-option
+            v-for="u in applicantSearchOptions"
+            :key="u.userId"
+            :label="userSelectLabel(u)"
+            :value="u.userId"
+          />
+        </el-select>
+        <el-button type="primary" style="margin-left: 10px" @click="onSearch">鎼滅储</el-button>
+        <el-button @click="resetSearch">閲嶇疆</el-button>
+      </div>
+      <div>
+        <el-button type="primary" @click="openAddWithTemplate">鏂板璋冨矖鐢宠</el-button>
+      </div>
+    </div>
+    <div class="table_list">
+      <PIMTable
+        rowKey="id"
+        :column="tableColumn"
+        :tableData="tableData"
+        :page="page"
+        :isSelection="false"
+        :tableLoading="tableLoading"
+        @pagination="onPagination"
+        :total="page.total"
+      />
+    </div>
+
+    <ApprovalInstanceSubmitDialog
+      v-model="submitDialog.visible"
+      :title="submitDialogTitle"
+      :form="submitForm"
+      :rules="submitFormRules"
+      :fields="submitFormFields"
+      :active-template="activeTemplate"
+      :user-options="flowUserOptions"
+      :is-edit="isSubmitEdit"
+      :saving="submitSaving"
+      :form-ref="submitFormRef"
+      flow-attachments-only
+      @submit="onSubmit"
+    >
+      <template #before="{ form, fields }">
+        <FormPayloadFields :fields="displayTemplateFields(fields)" :form-payload="form.formPayload" />
+        <el-form-item label="鍘熷矖浣�">
+          <el-input :model-value="originalPostName" placeholder="閫夋嫨鐢宠浜哄悗鑷姩甯﹀嚭" disabled />
+        </el-form-item>
+      </template>
+    </ApprovalInstanceSubmitDialog>
+
+    <ApprovalTemplateBindDialog
+      v-model:visible="templateBindVisible"
+      :module-key="APPROVAL_MODULE_KEYS.TRANSFER"
+      skip-form-confirm
+      @confirm="onTemplateBound"
+      @closed="onTemplateBindClosed"
+    />
+
+    <ApprovalInstanceDetailDialog
+      v-model="detailDialog.visible"
+      title="璋冨矖鐢宠璇︽儏"
+      :row="detailRow"
+      @edit="openEditFromDetail"
+    />
+  </div>
+</template>
+
+<script setup>
+import { findPostOptions } from "@/api/system/post.js";
+import { userListNoPageByTenantId } from "@/api/system/user.js";
+import { ElMessage } from "element-plus";
+import { computed, onMounted, reactive, ref, watch } from "vue";
+import FormPayloadFields from "../../ApproveManage/approve-list/components/FormPayloadFields.vue";
+import ApprovalInstanceDetailDialog from "../../ApproveManage/approve-shared/components/ApprovalInstanceDetailDialog.vue";
+import ApprovalInstanceSubmitDialog from "../../ApproveManage/approve-shared/components/ApprovalInstanceSubmitDialog.vue";
+import ApprovalTemplateBindDialog from "../../ApproveManage/approve-shared/components/ApprovalTemplateBindDialog.vue";
+import { buildInstanceTableColumns } from "../../ApproveManage/approve-shared/approvalInstanceFormConfigTable.js";
+import { APPROVAL_MODULE_KEYS } from "../../ApproveManage/approve-shared/approvalModuleRegistry.js";
+import { useApprovalInstanceModule } from "../../ApproveManage/approve-shared/useApprovalInstanceModule.js";
+import { useFlowUserOptions } from "../../ApproveManage/approve-shared/useFlowUserOptions.js";
+import { SELECT_OPTION_SOURCE } from "../../ApproveManage/approve-template/selectOptionSource.js";
+
+function isOriginalPostField(field) {
+  const label = String(field?.label || "");
+  return (
+    label.includes("鍘熷矖浣�") ||
+    field?.key === "originalPost" ||
+    field?.key === "originalPostName" ||
+    field?.key === "originalPostId"
+  );
+}
+
+function displayTemplateFields(fields = []) {
+  return (fields || []).filter((f) => !isOriginalPostField(f));
+}
+
+function findApplicantTemplateField(fields = []) {
+  return (
+    fields.find((f) => String(f?.label || "").includes("鐢宠浜�")) ||
+    fields.find((f) => f?.type === "select" && f?.optionSource === SELECT_OPTION_SOURCE.USER) ||
+    null
+  );
+}
+
+const searchForm = reactive({
+  instanceNo: "",
+  applicantId: "",
+});
+
+const mod = useApprovalInstanceModule({
+  moduleKey: APPROVAL_MODULE_KEYS.TRANSFER,
+});
+
+const {
+  tableData,
+  tableLoading,
+  page,
+  detailDialog,
+  detailRow,
+  submitDialog,
+  submitForm,
+  submitFormRef,
+  submitSaving,
+  isSubmitEdit,
+  activeTemplate,
+  submitFormFields,
+  submitFormRules,
+  submitDialogTitle,
+  templateBindVisible,
+  handleQuery,
+  initModuleList,
+  pagination,
+  openAddWithTemplate,
+  onTemplateBound,
+  onTemplateBindClosed,
+  openEditFromDetail,
+  submitInstanceForm,
+  buildTableActions,
+} = mod;
+
+const { flowUserOptions, loadFlowUsers } = useFlowUserOptions();
+
+const allUsersCache = ref([]);
+const postIdToName = ref({});
+const targetPostOptions = ref([]);
+const applicantSearchLoading = ref(false);
+const applicantSearchOptions = ref([]);
+const originalPostName = ref("");
+
+const applicantTemplateField = computed(() =>
+  findApplicantTemplateField(submitForm.formFieldDefs)
+);
+
+function unwrapArray(payload) {
+  if (Array.isArray(payload)) return payload;
+  if (payload && Array.isArray(payload.data)) return payload.data;
+  if (payload && Array.isArray(payload.rows)) return payload.rows;
+  return [];
+}
+
+function isActiveUser(u) {
+  if (u.delFlag === "2" || u.delFlag === 2) return false;
+  if (u.status == null) return true;
+  return String(u.status) === "0";
+}
+
+function userSelectLabel(u) {
+  const nick = u.nickName || "";
+  const name = u.userName || "";
+  if (nick && name && nick !== name) return `${nick}锛�${name}锛塦;
+  return nick || name || `鐢ㄦ埛${u.userId ?? u.id ?? ""}`;
+}
+
+function firstPostId(user) {
+  if (!user) return undefined;
+  if (Array.isArray(user.postIds) && user.postIds.length) return user.postIds[0];
+  if (user.postId != null && user.postId !== "") return user.postId;
+  return undefined;
+}
+
+function resolveOriginalPost(user) {
+  if (!user) return { originalPostName: "" };
+  const nameStr = (user.postName ?? user.postname ?? "").toString().trim();
+  if (nameStr) return { originalPostName: nameStr };
+  if (Array.isArray(user.posts) && user.posts.length) {
+    return { originalPostName: (user.posts[0].postName ?? "").toString() || "鏈懡鍚嶅矖浣�" };
+  }
+  const pid = firstPostId(user);
+  if (pid != null && pid !== "") {
+    const n = postIdToName.value[String(pid)] || "";
+    return { originalPostName: n || "褰撳墠宀椾綅锛堟湭鍦ㄥ矖浣嶅瓧鍏镐腑锛�" };
+  }
+  return { originalPostName: "鏈垎閰嶅矖浣�" };
+}
+
+function userById(id) {
+  if (id == null || id === "") return undefined;
+  return allUsersCache.value.find((u) => String(u.userId ?? u.id) === String(id));
+}
+
+function filterUsersByQuery(query) {
+  const list = allUsersCache.value.filter((u) => isActiveUser(u));
+  const q = (query || "").trim().toLowerCase();
+  if (!q) return [...list];
+  return list.filter((u) => {
+    const nick = (u.nickName || "").toLowerCase();
+    const uname = (u.userName || "").toLowerCase();
+    const phone = (u.phonenumber || u.phone || "").toString();
+    return nick.includes(q) || uname.includes(q) || phone.includes(q);
+  });
+}
+
+async function loadUserPool() {
+  try {
+    const res = await userListNoPageByTenantId();
+    allUsersCache.value = unwrapArray(res);
+  } catch {
+    allUsersCache.value = [];
+  }
+}
+
+async function loadPostOptions() {
+  try {
+    const res = await findPostOptions();
+    const rows = res.data ?? res.rows ?? [];
+    targetPostOptions.value = Array.isArray(rows) ? rows : [];
+  } catch {
+    targetPostOptions.value = [];
+  }
+  const m = {};
+  for (const p of targetPostOptions.value) {
+    const id = p.postId ?? p.value ?? p.id;
+    if (id != null && id !== "") m[String(id)] = p.postName ?? p.label ?? "";
+  }
+  postIdToName.value = m;
+}
+
+async function remoteSearchApplicant(query) {
+  applicantSearchLoading.value = true;
+  try {
+    if (!allUsersCache.value.length) await loadUserPool();
+    applicantSearchOptions.value = filterUsersByQuery(query);
+  } finally {
+    applicantSearchLoading.value = false;
+  }
+}
+
+function syncOriginalPostFromApplicant(uid) {
+  const u = userById(uid);
+  originalPostName.value = resolveOriginalPost(u).originalPostName;
+}
+
+watch(
+  () => {
+    const key = applicantTemplateField.value?.key;
+    return key ? submitForm.formPayload[key] : undefined;
+  },
+  async (uid) => {
+    if (!applicantTemplateField.value) return;
+    if (!allUsersCache.value.length) await loadUserPool();
+    syncOriginalPostFromApplicant(uid);
+  }
+);
+
+watch(
+  () => submitDialog.visible,
+  async (v) => {
+    if (!v) return;
+    const key = applicantTemplateField.value?.key;
+    if (key && submitForm.formPayload[key]) {
+      syncOriginalPostFromApplicant(submitForm.formPayload[key]);
+    }
+  }
+);
+
+const tableColumn = buildInstanceTableColumns(tableData, buildTableActions, {
+  moduleKey: APPROVAL_MODULE_KEYS.TRANSFER,
+});
+
+function onSearch() {
+  handleQuery(searchForm);
+}
+
+async function resetSearch() {
+  searchForm.instanceNo = "";
+  searchForm.applicantId = "";
+  onSearch();
+  await remoteSearchApplicant("");
+}
+
+function onPagination(obj) {
+  pagination(obj, searchForm);
+}
+
+async function onSubmit() {
+  const ok = await submitInstanceForm({ skipValidate: true });
+  if (ok) ElMessage.success(isSubmitEdit.value ? "淇敼鎴愬姛" : "鎻愪氦鎴愬姛");
+}
+
+onMounted(async () => {
+  await Promise.all([loadUserPool(), loadPostOptions()]);
+  loadFlowUsers();
+  await remoteSearchApplicant("");
+  await initModuleList(searchForm);
+});
+</script>
+
+<style scoped>
+.mb20 {
+  margin-bottom: 20px;
+}
+.search_form {
+  display: flex;
+  flex-wrap: wrap;
+  align-items: center;
+  justify-content: space-between;
+  gap: 12px;
+}
+.search_title {
+  font-size: 14px;
+  color: var(--el-text-color-regular);
+}
+</style>
diff --git a/src/views/officeProcessAutomation/HrManage/work-handover/index.vue b/src/views/officeProcessAutomation/HrManage/work-handover/index.vue
new file mode 100644
index 0000000..a9b96ae
--- /dev/null
+++ b/src/views/officeProcessAutomation/HrManage/work-handover/index.vue
@@ -0,0 +1,249 @@
+<!--OA妯″潡锛氬伐浣滀氦鎺�-->
+<template>
+  <div class="app-container">
+    <div class="search_form mb20">
+      <div>
+        <span class="search_title">瀹℃壒鍗曞彿锛�</span>
+        <el-input
+          v-model="searchForm.instanceNo"
+          style="width: 220px"
+          placeholder="璇疯緭鍏ュ鎵瑰崟鍙�"
+          clearable
+          @keyup.enter="onSearch"
+        />
+        <span class="search_title" style="margin-left: 12px">鐢宠浜猴細</span>
+        <el-select
+          v-model="searchForm.applicantId"
+          filterable
+          remote
+          clearable
+          reserve-keyword
+          placeholder="璇烽�夋嫨鎴栨悳绱㈢敵璇蜂汉"
+          style="width: 220px"
+          :remote-method="remoteSearchApplicant"
+          :loading="applicantSearchLoading"
+        >
+          <el-option
+            v-for="u in applicantSearchOptions"
+            :key="u.userId"
+            :label="userSelectLabel(u)"
+            :value="u.userId"
+          />
+        </el-select>
+        <el-button type="primary" style="margin-left: 10px" @click="onSearch">鎼滅储</el-button>
+        <el-button @click="resetSearch">閲嶇疆</el-button>
+      </div>
+      <div>
+        <el-button type="primary" @click="openAddWithTemplate">鏂板宸ヤ綔浜ゆ帴</el-button>
+      </div>
+    </div>
+    <div class="table_list">
+      <PIMTable
+        rowKey="id"
+        :column="tableColumn"
+        :tableData="tableData"
+        :page="page"
+        :isSelection="false"
+        :tableLoading="tableLoading"
+        @pagination="onPagination"
+        :total="page.total"
+      />
+    </div>
+
+    <ApprovalInstanceSubmitDialog
+      v-model="submitDialog.visible"
+      :title="submitDialogTitle"
+      :form="submitForm"
+      :rules="submitFormRules"
+      :fields="submitFormFields"
+      :active-template="activeTemplate"
+      :user-options="flowUserOptions"
+      :is-edit="isSubmitEdit"
+      :saving="submitSaving"
+      :form-ref="submitFormRef"
+      @submit="onSubmit"
+    />
+
+    <ApprovalTemplateBindDialog
+      v-model:visible="templateBindVisible"
+      :module-key="APPROVAL_MODULE_KEYS.WORK_HANDOVER"
+      skip-form-confirm
+      @confirm="onTemplateBound"
+      @closed="onTemplateBindClosed"
+    />
+
+    <ApprovalInstanceDetailDialog
+      v-model="detailDialog.visible"
+      title="宸ヤ綔浜ゆ帴璇︽儏"
+      :row="detailRow"
+      @edit="openEditFromDetail"
+    />
+  </div>
+</template>
+
+<script setup>
+import { userListNoPageByTenantId } from "@/api/system/user.js";
+import { ElMessage } from "element-plus";
+import { onMounted, reactive, ref } from "vue";
+import ApprovalInstanceDetailDialog from "../../ApproveManage/approve-shared/components/ApprovalInstanceDetailDialog.vue";
+import ApprovalInstanceSubmitDialog from "../../ApproveManage/approve-shared/components/ApprovalInstanceSubmitDialog.vue";
+import ApprovalTemplateBindDialog from "../../ApproveManage/approve-shared/components/ApprovalTemplateBindDialog.vue";
+import { buildInstanceTableColumns } from "../../ApproveManage/approve-shared/approvalInstanceFormConfigTable.js";
+import { APPROVAL_MODULE_KEYS } from "../../ApproveManage/approve-shared/approvalModuleRegistry.js";
+import { useApprovalInstanceModule } from "../../ApproveManage/approve-shared/useApprovalInstanceModule.js";
+import { useFlowUserOptions } from "../../ApproveManage/approve-shared/useFlowUserOptions.js";
+
+const handoverStatusOptions = [
+  { value: "in_progress", label: "杩涜涓�" },
+  { value: "completed", label: "宸插畬鎴�" },
+  { value: "returned", label: "宸查��鍥�" },
+];
+
+const handoverTypeOptions = [
+  { value: "resignation", label: "绂昏亴浜ゆ帴" },
+  { value: "transfer", label: "璋冨矖浜ゆ帴" },
+];
+
+const searchForm = reactive({
+  instanceNo: "",
+  applicantId: "",
+});
+
+const mod = useApprovalInstanceModule({
+  moduleKey: APPROVAL_MODULE_KEYS.WORK_HANDOVER,
+});
+
+const {
+  tableData,
+  tableLoading,
+  page,
+  detailDialog,
+  detailRow,
+  submitDialog,
+  submitForm,
+  submitFormRef,
+  submitSaving,
+  isSubmitEdit,
+  activeTemplate,
+  submitFormFields,
+  submitFormRules,
+  submitDialogTitle,
+  templateBindVisible,
+  handleQuery,
+  initModuleList,
+  pagination,
+  openAddWithTemplate,
+  onTemplateBound,
+  onTemplateBindClosed,
+  openEditFromDetail,
+  submitInstanceForm,
+  buildTableActions,
+} = mod;
+
+const { flowUserOptions, loadFlowUsers } = useFlowUserOptions();
+
+const allUsersCache = ref([]);
+const applicantSearchOptions = ref([]);
+const applicantSearchLoading = ref(false);
+
+function unwrapArray(payload) {
+  if (Array.isArray(payload)) return payload;
+  if (payload && Array.isArray(payload.data)) return payload.data;
+  if (payload && Array.isArray(payload.rows)) return payload.rows;
+  return [];
+}
+
+function isActiveUser(u) {
+  if (u.delFlag === "2" || u.delFlag === 2) return false;
+  if (u.status == null) return true;
+  return String(u.status) === "0";
+}
+
+function userSelectLabel(u) {
+  const nick = u.nickName || "";
+  const name = u.userName || "";
+  if (nick && name && nick !== name) return `${nick}锛�${name}锛塦;
+  return nick || name || `鐢ㄦ埛${u.userId ?? u.id ?? ""}`;
+}
+
+function filterUsersByQuery(query) {
+  const list = allUsersCache.value.filter((u) => isActiveUser(u));
+  const q = (query || "").trim().toLowerCase();
+  if (!q) return list.slice(0, 50);
+  return list
+    .filter((u) => {
+      const nick = (u.nickName || "").toLowerCase();
+      const name = (u.userName || "").toLowerCase();
+      const id = String(u.userId ?? u.id ?? "");
+      return nick.includes(q) || name.includes(q) || id.includes(q);
+    })
+    .slice(0, 50);
+}
+
+async function loadUserPool() {
+  try {
+    const res = await userListNoPageByTenantId();
+    allUsersCache.value = unwrapArray(res);
+  } catch {
+    allUsersCache.value = [];
+  }
+}
+
+async function remoteSearchApplicant(query) {
+  applicantSearchLoading.value = true;
+  try {
+    if (!allUsersCache.value.length) await loadUserPool();
+    applicantSearchOptions.value = filterUsersByQuery(query);
+  } finally {
+    applicantSearchLoading.value = false;
+  }
+}
+
+const tableColumn = buildInstanceTableColumns(tableData, buildTableActions, {
+  moduleKey: APPROVAL_MODULE_KEYS.WORK_HANDOVER,
+});
+
+function onSearch() {
+  handleQuery(searchForm);
+}
+
+async function resetSearch() {
+  searchForm.instanceNo = "";
+  searchForm.applicantId = "";
+  onSearch();
+  await remoteSearchApplicant("");
+}
+
+function onPagination(obj) {
+  pagination(obj, searchForm);
+}
+
+async function onSubmit() {
+  const ok = await submitInstanceForm({ skipValidate: true });
+  if (ok) ElMessage.success(isSubmitEdit.value ? "淇敼鎴愬姛" : "鎻愪氦鎴愬姛");
+}
+
+onMounted(async () => {
+  await loadUserPool();
+  loadFlowUsers();
+  await remoteSearchApplicant("");
+  await initModuleList(searchForm);
+});
+</script>
+
+<style scoped>
+.mb20 {
+  margin-bottom: 20px;
+}
+.search_form {
+  display: flex;
+  flex-wrap: wrap;
+  align-items: center;
+  justify-content: space-between;
+  gap: 12px;
+}
+.search_title {
+  font-size: 14px;
+  color: var(--el-text-color-regular);
+}
+</style>
diff --git a/src/views/officeProcessAutomation/NoticeAnnouncement/notice-manage/index.vue b/src/views/officeProcessAutomation/NoticeAnnouncement/notice-manage/index.vue
new file mode 100644
index 0000000..3f65cb7
--- /dev/null
+++ b/src/views/officeProcessAutomation/NoticeAnnouncement/notice-manage/index.vue
@@ -0,0 +1,12 @@
+<!--
+  妯″潡涓枃鍚嶏細閫氱煡鍏憡
+  鐩綍鏍囪瘑锛歂oticeAnnouncement/notice-manage
+  澶嶇敤椤甸潰锛欯/views/collaborativeApproval/noticeManagement/index.vue锛堝崗鍚屽鎵�-閫氱煡鍏憡锛�
+-->
+<template>
+  <NoticeManagement />
+</template>
+
+<script setup>
+import NoticeManagement from "@/views/collaborativeApproval/noticeManagement/index.vue";
+</script>
diff --git a/src/views/officeProcessAutomation/ReimburseManage/cost-reimburse/components/DetailPanel.vue b/src/views/officeProcessAutomation/ReimburseManage/cost-reimburse/components/DetailPanel.vue
new file mode 100644
index 0000000..4db16a7
--- /dev/null
+++ b/src/views/officeProcessAutomation/ReimburseManage/cost-reimburse/components/DetailPanel.vue
@@ -0,0 +1,74 @@
+<!-- 璐圭敤鎶ラ攢锛氳鎯呭彧璇婚潰鏉� -->
+<template>
+  <el-descriptions :column="2" border>
+    <el-descriptions-item label="鎶ラ攢鍗曞彿">{{ row.reimburseNo || "鈥�" }}</el-descriptions-item>
+    <el-descriptions-item label="鎶ラ攢鐘舵��">
+      <el-tag :type="statusTagType(row.approvalResult)" size="small">{{ statusLabel(row.approvalResult) }}</el-tag>
+    </el-descriptions-item>
+    <el-descriptions-item label="璐圭敤绫诲瀷">{{ expenseCategoryLabel(row.expenseCategory) }}</el-descriptions-item>
+    <el-descriptions-item label="鐢宠鏃堕棿">{{ row.applyTime || row.createTime || "鈥�" }}</el-descriptions-item>
+    <el-descriptions-item label="鍛樺伐缂栧彿">{{ row.employeeNo || row.applicantNo || "鈥�" }}</el-descriptions-item>
+    <el-descriptions-item label="鍛樺伐濮撳悕">{{ row.employeeName || row.applicantName || "鈥�" }}</el-descriptions-item>
+    <el-descriptions-item label="鎶ラ攢鍘熷洜" :span="2">{{ row.reimburseReason || "鈥�" }}</el-descriptions-item>
+    <el-descriptions-item label="鎶ラ攢閲戦">{{ row.applyAmount != null ? `${row.applyAmount} 鍏僠 : "鈥�" }}</el-descriptions-item>
+    <el-descriptions-item label="鏀舵浜�">{{ row.payee || "鈥�" }}</el-descriptions-item>
+    <el-descriptions-item label="鏀舵璐﹀彿">{{ row.payeeAccount || "鈥�" }}</el-descriptions-item>
+    <el-descriptions-item label="寮�鎴锋敮琛�">{{ row.bankBranch || "鈥�" }}</el-descriptions-item>
+    <el-descriptions-item v-if="row.rejectReason" label="椹冲洖鍘熷洜" :span="2">
+      <span class="reject-text">{{ row.rejectReason }}</span>
+    </el-descriptions-item>
+    <el-descriptions-item label="鍒涘缓鏃堕棿" :span="2">{{ row.createTime || "鈥�" }}</el-descriptions-item>
+  </el-descriptions>
+
+  <el-divider content-position="left">鎶ラ攢鏄庣粏</el-divider>
+  <el-table v-if="row.expenseDetails?.length" :data="row.expenseDetails" border size="small">
+    <el-table-column type="index" label="搴忓彿" width="55" align="center" />
+    <el-table-column prop="invoiceDate" label="鍙戠エ鏃ユ湡" width="120" />
+    <el-table-column label="璐圭敤绉戠洰" width="100">
+      <template #default="{ row: d }">{{ expenseSubjectLabel(d.expenseSubject) }}</template>
+    </el-table-column>
+    <el-table-column prop="amount" label="閲戦" width="100" />
+    <el-table-column prop="description" label="鎻忚堪" min-width="140" show-overflow-tooltip />
+  </el-table>
+  <el-empty v-else description="鏆傛棤鏄庣粏" :image-size="48" />
+
+  <el-divider content-position="left">鍙戠エ闄勪欢</el-divider>
+  <template v-if="attachmentFiles.length">
+    <el-tag v-for="(f, i) in attachmentFiles" :key="i" class="file-tag" type="info" @click="openFile(f)">
+      {{ f.name }}
+    </el-tag>
+  </template>
+  <el-empty v-else description="鏆傛棤闄勪欢" :image-size="48" />
+</template>
+
+<script setup>
+import { computed } from "vue";
+import { expenseCategoryLabel, expenseSubjectLabel, statusLabel, statusTagType } from "../costReimburseUtils.js";
+
+const props = defineProps({
+  row: { type: Object, default: () => ({}) },
+});
+
+const attachmentFiles = computed(() => {
+  const list =
+    props.row?.attachmentList ||
+    props.row?.storageBlobVOList ||
+    props.row?.invoiceAttachments;
+  return Array.isArray(list) ? list : [];
+});
+
+function openFile(f) {
+  const url = f?.url || f?.downloadURL || f?.previewURL;
+  if (url) window.open(url, "_blank");
+}
+</script>
+
+<style scoped>
+.reject-text {
+  color: var(--el-color-danger);
+}
+.file-tag {
+  margin: 0 8px 8px 0;
+  cursor: pointer;
+}
+</style>
diff --git a/src/views/officeProcessAutomation/ReimburseManage/cost-reimburse/costReimburseUtils.js b/src/views/officeProcessAutomation/ReimburseManage/cost-reimburse/costReimburseUtils.js
new file mode 100644
index 0000000..1736b3e
--- /dev/null
+++ b/src/views/officeProcessAutomation/ReimburseManage/cost-reimburse/costReimburseUtils.js
@@ -0,0 +1,313 @@
+import dayjs from "dayjs";
+
+/** 璐圭敤鎶ラ攢澶х被 */
+export const EXPENSE_CATEGORY_OPTIONS = [
+  { label: "宸梾", value: "travel" },
+  { label: "鍔炲叕閲囪喘", value: "office_procurement" },
+  { label: "涓氬姟鎷涘緟", value: "business_entertainment" },
+  { label: "浜ら�氳垂", value: "transport" },
+  { label: "閫氳璐�", value: "communication" },
+  { label: "鍏朵粬", value: "other" },
+];
+
+/** 鏄庣粏璐圭敤绉戠洰 */
+export const EXPENSE_SUBJECT_OPTIONS = [
+  { label: "浜ら�氳垂", value: "transport" },
+  { label: "浣忓璐�", value: "hotel" },
+  { label: "椁愰ギ璐�", value: "meal" },
+  { label: "鍔炲叕鐢ㄥ搧", value: "office_supply" },
+  { label: "鎷涘緟璐�", value: "entertainment" },
+  { label: "閫氳璐�", value: "phone" },
+  { label: "鍏朵粬", value: "other" },
+];
+
+/** 鍒嗙被濉姤妯℃澘锛堜竴閿皟鐢級 */
+export const CATEGORY_TEMPLATES = {
+  travel: {
+    label: "宸梾璐圭敤",
+    reason: "鍥犲叕鍑哄樊浜х敓鐨勪氦閫氥�佷綇瀹裤�侀楗瓑璐圭敤鎶ラ攢銆�",
+    details: [
+      { expenseSubject: "transport", description: "寰�杩斾氦閫氳垂" },
+      { expenseSubject: "hotel", description: "浣忓璐�" },
+      { expenseSubject: "meal", description: "鍑哄樊椁愰ギ" },
+    ],
+  },
+  office_procurement: {
+    label: "鍔炲叕閲囪喘",
+    reason: "閮ㄩ棬鏃ュ父鍔炲叕鐢ㄥ搧銆佽�楁潗閲囪喘鎶ラ攢銆�",
+    details: [
+      { expenseSubject: "office_supply", description: "鍔炲叕鐢ㄥ搧閲囪喘" },
+      { expenseSubject: "office_supply", description: "鎵撳嵃鑰楁潗" },
+    ],
+  },
+  business_entertainment: {
+    label: "涓氬姟鎷涘緟",
+    reason: "瀹㈡埛鎺ュ緟銆佸晢鍔″璇风瓑璐圭敤鎶ラ攢銆�",
+    details: [
+      { expenseSubject: "entertainment", description: "瀹㈡埛鎺ュ緟椁愯垂" },
+      { expenseSubject: "entertainment", description: "鍟嗗姟绀煎搧" },
+    ],
+  },
+  transport: {
+    label: "浜ら�氳垂",
+    reason: "甯傚唴閫氬嫟銆佹墦杞︺�佸仠杞︾瓑浜ら�氳垂鐢ㄦ姤閿�銆�",
+    details: [{ expenseSubject: "transport", description: "甯傚唴浜ら��" }],
+  },
+  communication: {
+    label: "閫氳璐�",
+    reason: "鍥犲叕閫氳銆佹祦閲忋�佽瘽璐硅ˉ璐存姤閿�銆�",
+    details: [{ expenseSubject: "phone", description: "璇濊垂/娴侀噺" }],
+  },
+  other: {
+    label: "鍏朵粬璐圭敤",
+    reason: "鍏朵粬鍥犲叕鏀嚭璐圭敤鎶ラ攢銆�",
+    details: [{ expenseSubject: "other", description: "鍏朵粬璐圭敤" }],
+  },
+};
+
+/** 瀹℃壒瑙掕壊灞曠ず鍚嶏紙鑺傜偣瀹℃壒浜洪』鍦ㄥ墠绔�夋嫨锛� */
+export const APPROVAL_ROLE_LABELS = {
+  direct_supervisor: "鐩村睘涓婄骇",
+  dept_manager: "閮ㄩ棬缁忕悊",
+  cfo: "璐㈠姟鎬荤洃",
+  compliance: "鍚堣瀹℃牳",
+};
+
+/** 鎸夐噾棰濋璁惧鎵归摼 */
+export const APPROVAL_AMOUNT_RULES = [
+  {
+    maxAmount: 500,
+    description: "500鍏冧互鍐咃細鐩村睘涓婄骇瀹℃壒",
+    roles: ["direct_supervisor"],
+  },
+  {
+    maxAmount: 5000,
+    description: "500锝�5000鍏冿細鐩村睘涓婄骇 + 閮ㄩ棬缁忕悊",
+    roles: ["direct_supervisor", "dept_manager"],
+  },
+  {
+    maxAmount: Infinity,
+    description: "瓒�5000鍏冿細鐩村睘涓婄骇 + 閮ㄩ棬缁忕悊 + 璐㈠姟鎬荤洃澶嶆牳",
+    roles: ["direct_supervisor", "dept_manager", "cfo"],
+  },
+];
+
+/** 閮ㄥ垎鍝佺被棰濆瀹℃壒鑺傜偣 */
+export const CATEGORY_EXTRA_APPROVAL = {
+  business_entertainment: ["compliance"],
+  office_procurement: [],
+};
+
+export function expenseCategoryLabel(v) {
+  return EXPENSE_CATEGORY_OPTIONS.find((x) => x.value === v)?.label || "鈥�";
+}
+
+export function expenseSubjectLabel(v) {
+  return EXPENSE_SUBJECT_OPTIONS.find((x) => x.value === v)?.label || "鈥�";
+}
+
+export function statusLabel(v) {
+  if (v === "draft") return "鑽夌";
+  if (v === "approved") return "宸查�氳繃";
+  if (v === "paid") return "宸蹭粯娆�";
+  if (v === "rejected") return "宸查┏鍥�";
+  if (v === "cancelled") return "宸叉挙鍥�";
+  return "瀹℃牳涓�";
+}
+
+export function statusTagType(v) {
+  if (v === "draft") return "info";
+  if (v === "approved" || v === "paid") return "success";
+  if (v === "rejected") return "danger";
+  if (v === "cancelled") return "info";
+  return "warning";
+}
+
+export { formatApprovalFlowSummary } from "../shared/finReimbursementMappers.js";
+
+export function resolveApprovalRoles(amount, expenseCategory) {
+  const amt = Number(amount) || 0;
+  let roles = [];
+  for (const rule of APPROVAL_AMOUNT_RULES) {
+    if (amt <= rule.maxAmount) {
+      roles = [...rule.roles];
+      break;
+    }
+  }
+  if (!roles.length) roles = ["direct_supervisor"];
+  const extra = CATEGORY_EXTRA_APPROVAL[expenseCategory] || [];
+  extra.forEach((r) => {
+    if (!roles.includes(r)) roles.push(r);
+  });
+  return roles;
+}
+
+export function buildAutoApprovalFlow(amount, expenseCategory, previousNodes = []) {
+  const roles = resolveApprovalRoles(amount, expenseCategory);
+  const prevByRole = new Map();
+  (previousNodes || []).forEach((n, idx) => {
+    if (n?.roleKey) prevByRole.set(n.roleKey, n);
+    else if (n?.approverId != null && n.approverId !== "") {
+      prevByRole.set(`__idx_${idx}`, n);
+    }
+  });
+  return roles.map((role, i) => {
+    const prev = prevByRole.get(role) || prevByRole.get(`__idx_${i}`);
+    const hasApprover = prev?.approverId != null && prev.approverId !== "";
+    return {
+      approverId: hasApprover ? prev.approverId : null,
+      approverName: hasApprover
+        ? prev.approverName || ""
+        : APPROVAL_ROLE_LABELS[role] || role,
+      roleKey: role,
+      signMode: prev?.signMode || "countersign",
+      sortOrder: i + 1,
+      nodeOrder: i + 1,
+      nodeStatus: i === 0 ? "process" : "wait",
+      approveOpinion: "",
+      approveTime: "",
+    };
+  });
+}
+
+export function getApprovalRuleHint(amount, expenseCategory) {
+  const amt = Number(amount) || 0;
+  const rule = APPROVAL_AMOUNT_RULES.find((r) => amt <= r.maxAmount) || APPROVAL_AMOUNT_RULES[APPROVAL_AMOUNT_RULES.length - 1];
+  const extra = CATEGORY_EXTRA_APPROVAL[expenseCategory] || [];
+  const extraText = extra.length
+    ? `锛�${expenseCategoryLabel(expenseCategory)}绫诲彟闇�锛�${extra.map((r) => APPROVAL_ROLE_LABELS[r] || r).join("銆�")}`
+    : "";
+  return `${rule.description}${extraText}`;
+}
+
+export function createEmptyExpenseDetail() {
+  return {
+    id: `ed_${Date.now()}_${Math.random().toString(36).slice(2, 7)}`,
+    invoiceDate: "",
+    expenseSubject: "",
+    amount: undefined,
+    description: "",
+  };
+}
+
+export function createEmptyForm() {
+  return {
+    id: undefined,
+    reimburseNo: "",
+    applicantId: "",
+    employeeNo: "",
+    employeeName: "",
+    expenseCategory: "",
+    reimburseReason: "",
+    applyAmount: undefined,
+    payee: "",
+    payeeAccount: "",
+    bankBranch: "",
+    expenseDetails: [],
+    attachmentList: [],
+    approvalFlowNodes: [],
+    currentNodeIndex: 0,
+    approvalResult: "pending",
+    rejectReason: "",
+    deptId: "",
+    deptName: "",
+  };
+}
+
+export function applyCategoryTemplate(form, category) {
+  const tpl = CATEGORY_TEMPLATES[category];
+  if (!tpl) return;
+  form.expenseCategory = category;
+  if (!form.reimburseReason?.trim()) form.reimburseReason = tpl.reason;
+  form.expenseDetails = (tpl.details || []).map((d) => ({
+    ...createEmptyExpenseDetail(),
+    expenseSubject: d.expenseSubject,
+    description: d.description,
+    invoiceDate: dayjs().format("YYYY-MM-DD"),
+  }));
+}
+
+export function initApprovalFlowNodes(nodes) {
+  return (nodes || []).map((n, i) => ({
+    ...n,
+    sortOrder: i + 1,
+    nodeOrder: i + 1,
+    nodeStatus: i === 0 ? "process" : "wait",
+    approveOpinion: n.approveOpinion || "",
+    approveTime: n.approveTime || "",
+  }));
+}
+
+export function advanceApprovalFlow(row, opinion) {
+  const nodes = [...(row.approvalFlowNodes || [])];
+  const idx = row.currentNodeIndex ?? 0;
+  if (!nodes.length) return { nodes, currentNodeIndex: idx, approvalResult: row.approvalResult };
+  const now = dayjs().format("YYYY-MM-DD HH:mm:ss");
+  nodes[idx] = {
+    ...nodes[idx],
+    nodeStatus: "finish",
+    approveOpinion: opinion || "鍚屾剰",
+    approveTime: now,
+  };
+  const next = idx + 1;
+  if (next >= nodes.length) {
+    return { nodes, currentNodeIndex: idx, approvalResult: "approved", rejectReason: "" };
+  }
+  nodes[next] = { ...nodes[next], nodeStatus: "process" };
+  return { nodes, currentNodeIndex: next, approvalResult: "pending", rejectReason: "" };
+}
+
+export function rejectApprovalFlow(row, opinion) {
+  const nodes = [...(row.approvalFlowNodes || [])];
+  const idx = row.currentNodeIndex ?? 0;
+  const now = dayjs().format("YYYY-MM-DD HH:mm:ss");
+  const reason = (opinion || "").trim() || "椹冲洖";
+  if (nodes[idx]) {
+    nodes[idx] = {
+      ...nodes[idx],
+      nodeStatus: "error",
+      approveOpinion: reason,
+      approveTime: now,
+    };
+  }
+  return { nodes, currentNodeIndex: idx, approvalResult: "rejected", rejectReason: reason };
+}
+
+export function normalizeImportedRow(raw, idx) {
+  const id = raw.id != null && String(raw.id).length ? `imp_${String(raw.id)}_${idx}` : `imp_${Date.now()}_${idx}`;
+  const expenseDetails = Array.isArray(raw.expenseDetails) ? raw.expenseDetails : [];
+  const applyAmount = raw.applyAmount ?? expenseDetails.reduce((s, d) => s + (Number(d.amount) || 0), 0);
+  const expenseCategory = raw.expenseCategory || "other";
+  const approvalFlowNodes =
+    Array.isArray(raw.approvalFlowNodes) && raw.approvalFlowNodes.length
+      ? raw.approvalFlowNodes
+      : buildAutoApprovalFlow(applyAmount, expenseCategory);
+
+  return {
+    id,
+    reimburseNo: raw.reimburseNo || `CR${dayjs().format("YYYYMMDD")}${String(idx).padStart(4, "0")}`,
+    applicantId: raw.applicantId != null ? String(raw.applicantId) : `imp_user_${idx}`,
+    employeeNo: raw.employeeNo ?? raw.applicantNo ?? "",
+    employeeName: raw.employeeName ?? raw.applicantName ?? "鏈煡",
+    applicantNo: raw.employeeNo ?? raw.applicantNo ?? "",
+    applicantName: raw.employeeName ?? raw.applicantName ?? "鏈煡",
+    expenseCategory,
+    reimburseReason: raw.reimburseReason ?? "",
+    applyAmount,
+    payee: raw.payee ?? "",
+    payeeAccount: raw.payeeAccount ?? "",
+    bankBranch: raw.bankBranch ?? "",
+    expenseDetails,
+    attachmentList: Array.isArray(raw.attachmentList) ? raw.attachmentList : [],
+    invoiceAttachments: Array.isArray(raw.invoiceAttachments) ? raw.invoiceAttachments : [],
+    approvalFlowNodes,
+    currentNodeIndex: raw.currentNodeIndex ?? 0,
+    approvalResult: ["pending", "approved", "rejected"].includes(raw.approvalResult) ? raw.approvalResult : "pending",
+    rejectReason: raw.rejectReason ?? "",
+    approvalRecords: Array.isArray(raw.approvalRecords) ? raw.approvalRecords : [],
+    applyTime: raw.applyTime || raw.createTime || dayjs().format("YYYY-MM-DD HH:mm:ss"),
+    createTime: raw.createTime || dayjs().format("YYYY-MM-DD HH:mm:ss"),
+    deptId: raw.deptId ?? "",
+    deptName: raw.deptName ?? "",
+  };
+}
diff --git a/src/views/officeProcessAutomation/ReimburseManage/cost-reimburse/index.vue b/src/views/officeProcessAutomation/ReimburseManage/cost-reimburse/index.vue
new file mode 100644
index 0000000..c9da4fc
--- /dev/null
+++ b/src/views/officeProcessAutomation/ReimburseManage/cost-reimburse/index.vue
@@ -0,0 +1,550 @@
+<!--OA妯″潡锛氳垂鐢ㄦ姤閿�锛堝垪琛� /finReimbursement/listPage锛宺eimbursementType=2锛�-->
+<template>
+  <div class="app-container">
+    <div class="search_form mb20">
+      <div class="search_fields">
+        <span class="search_title">鐢宠浜猴細</span>
+        <el-input
+          v-model="searchForm.applicantKeyword"
+          style="width: 220px"
+          placeholder="濮撳悕鎴栫紪鍙�"
+          clearable
+          :prefix-icon="Search"
+          @keyup.enter="handleQuery"
+        />
+        <el-button type="primary" style="margin-left: 10px" @click="handleQuery">鎼滅储</el-button>
+        <el-button @click="resetSearch">閲嶇疆</el-button>
+      </div>
+      <div class="search_actions">
+        <el-button type="success" plain @click="handleImportClick">瀵煎叆</el-button>
+        <el-button type="warning" plain @click="handleExport">瀵煎嚭</el-button>
+        <el-button type="primary" @click="openFormDialog('add')">鏂板璐圭敤鎶ラ攢</el-button>
+      </div>
+    </div>
+
+    <input ref="importInputRef" type="file" accept="application/json,.json" class="sr-only-input" @change="onImportFile" />
+
+    <div class="table_list">
+      <PIMTable
+        rowKey="id"
+        :column="tableColumn"
+        :tableData="tableData"
+        :page="page"
+        :isSelection="false"
+        :tableLoading="tableLoading"
+        :total="page.total"
+        @pagination="pagination"
+      />
+    </div>
+
+    <!-- 鏂板 / 缂栬緫 -->
+    <el-dialog
+      v-model="formDialog.visible"
+      :title="formDialog.title"
+      width="1120px"
+      append-to-body
+      destroy-on-close
+      class="cost-reimburse-form-dialog"
+      @closed="onFormClosed"
+    >
+      <el-alert type="info" show-icon :closable="false" class="mb16">
+        <template #title>鍏ㄥ搧绫昏垂鐢ㄦ姤閿� 路 鍒嗙被妯℃澘涓�閿~鎶�</template>
+        <template #default>
+          鏀寔宸梾銆佸姙鍏噰璐�佷笟鍔℃嫑寰呫�佷氦閫氳垂銆侀�氳璐圭瓑锛涙寜閲戦鑷姩鍖归厤瀹℃壒閾撅紙500鍏冨唴鐩村睘涓婄骇锛岃秴5000鍏冭储鍔℃�荤洃澶嶆牳锛夈��
+        </template>
+      </el-alert>
+
+      <div v-if="!formDialog.readonly" class="template-bar mb16">
+        <span class="template-label">鍒嗙被妯℃澘锛�</span>
+        <el-button
+          v-for="(tpl, key) in CATEGORY_TEMPLATES"
+          :key="key"
+          size="small"
+          :type="form.expenseCategory === key ? 'primary' : 'default'"
+          plain
+          @click="applyTemplate(key)"
+        >
+          {{ tpl.label }}
+        </el-button>
+      </div>
+
+      <el-form
+        ref="formRef"
+        :model="form"
+        :rules="formRules"
+        label-width="120px"
+        class="cost-reimburse-form"
+        :disabled="formDialog.readonly"
+      >
+        <el-card class="form-section" shadow="never">
+          <template #header><span class="card-header-title">鍩烘湰淇℃伅</span></template>
+          <el-row :gutter="20">
+            <el-col :span="12">
+              <el-form-item label="鍛樺伐缂栧彿">
+                <el-input v-model="form.employeeNo" readonly placeholder="閫夋嫨鍛樺伐鍚庤嚜鍔ㄥ甫鍑�" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="鍛樺伐濮撳悕" prop="applicantId">
+                <el-select
+                  v-model="form.applicantId"
+                  filterable
+                  remote
+                  clearable
+                  reserve-keyword
+                  placeholder="璇烽�夋嫨鎴栨悳绱㈠憳宸�"
+                  style="width: 100%"
+                  :remote-method="remoteSearchApplicantForm"
+                  :loading="applicantFormSearchLoading"
+                  @change="onApplicantChange"
+                >
+                  <el-option
+                    v-for="u in applicantFormOptions"
+                    :key="u.userId"
+                    :label="userSelectLabel(u)"
+                    :value="u.userId"
+                  />
+                </el-select>
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row :gutter="20">
+            <el-col :span="12">
+              <el-form-item label="璐圭敤绫诲瀷" prop="expenseCategory">
+                <el-select
+                  v-model="form.expenseCategory"
+                  placeholder="璇烽�夋嫨璐圭敤绫诲瀷"
+                  style="width: 100%"
+                  @change="onExpenseCategoryChange"
+                >
+                  <el-option
+                    v-for="opt in EXPENSE_CATEGORY_OPTIONS"
+                    :key="opt.value"
+                    :label="opt.label"
+                    :value="opt.value"
+                  />
+                </el-select>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="鎶ラ攢鐘舵��">
+                <el-tag
+                  :type="form.approvalResult === 'approved' ? 'success' : form.approvalResult === 'rejected' ? 'danger' : 'warning'"
+                  effect="plain"
+                >
+                  {{
+                    form.approvalResult === "approved"
+                      ? "宸查�氳繃"
+                      : form.approvalResult === "rejected"
+                        ? "宸查┏鍥�"
+                        : "瀹℃牳涓�"
+                  }}
+                </el-tag>
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row :gutter="20">
+            <el-col :span="24">
+              <el-form-item label="鎶ラ攢鍘熷洜" prop="reimburseReason">
+                <el-input
+                  v-model="form.reimburseReason"
+                  type="textarea"
+                  :rows="3"
+                  placeholder="璇峰~鍐欐姤閿�鍘熷洜"
+                  maxlength="2000"
+                  show-word-limit
+                />
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row :gutter="20">
+            <el-col :span="12">
+              <el-form-item label="鎶ラ攢閲戦" prop="applyAmount">
+                <div class="amount-row">
+                  <el-input-number
+                    v-model="form.applyAmount"
+                    :min="0"
+                    :precision="2"
+                    controls-position="right"
+                    class="amount-input"
+                    @change="autoAssignApprovalFlow"
+                  />
+                  <el-button v-if="!formDialog.readonly" type="primary" link @click="syncApplyAmountFromDetails">
+                    鎸夋槑缁嗘眹鎬� {{ detailTotalAmount }} 鍏�
+                  </el-button>
+                </div>
+              </el-form-item>
+            </el-col>
+          </el-row>
+        </el-card>
+
+        <el-card class="form-section" shadow="never">
+          <template #header>
+            <div class="card-header-row">
+              <span class="card-header-title">鎶ラ攢鏄庣粏</span>
+              <el-button v-if="!formDialog.readonly" type="primary" plain size="small" @click="addExpenseDetail">
+                鏂板鏄庣粏
+              </el-button>
+            </div>
+          </template>
+
+          <el-table :data="form.expenseDetails" border size="small" class="detail-table">
+            <el-table-column type="index" label="搴忓彿" width="55" align="center" />
+            <el-table-column label="鍙戠エ鏃ユ湡" width="150">
+              <template #default="{ row }">
+                <el-date-picker
+                  v-if="!formDialog.readonly"
+                  v-model="row.invoiceDate"
+                  type="date"
+                  value-format="YYYY-MM-DD"
+                  size="small"
+                  style="width: 100%"
+                />
+                <span v-else>{{ row.invoiceDate || "鈥�" }}</span>
+              </template>
+            </el-table-column>
+            <el-table-column label="璐圭敤绉戠洰" width="130">
+              <template #default="{ row }">
+                <el-select v-if="!formDialog.readonly" v-model="row.expenseSubject" size="small" style="width: 100%">
+                  <el-option
+                    v-for="opt in EXPENSE_SUBJECT_OPTIONS"
+                    :key="opt.value"
+                    :label="opt.label"
+                    :value="opt.value"
+                  />
+                </el-select>
+                <span v-else>{{ expenseSubjectLabel(row.expenseSubject) }}</span>
+              </template>
+            </el-table-column>
+            <el-table-column label="閲戦" width="120">
+              <template #default="{ row }">
+                <el-input-number
+                  v-if="!formDialog.readonly"
+                  v-model="row.amount"
+                  :min="0"
+                  :precision="2"
+                  size="small"
+                  controls-position="right"
+                  style="width: 100%"
+                  @change="onDetailAmountChange"
+                />
+                <span v-else>{{ row.amount ?? "鈥�" }}</span>
+              </template>
+            </el-table-column>
+            <el-table-column label="鎻忚堪" min-width="140">
+              <template #default="{ row }">
+                <el-input v-if="!formDialog.readonly" v-model="row.description" size="small" placeholder="璇存槑" />
+                <span v-else>{{ row.description || "鈥�" }}</span>
+              </template>
+            </el-table-column>
+            <el-table-column v-if="!formDialog.readonly" label="鎿嶄綔" width="70" align="center">
+              <template #default="{ $index }">
+                <el-button type="danger" link size="small" @click="removeExpenseDetail($index)">鍒犻櫎</el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+        </el-card>
+
+        <el-card class="form-section" shadow="never">
+          <template #header><span class="card-header-title">鏀舵淇℃伅</span></template>
+          <el-row :gutter="20">
+            <el-col :span="8">
+              <el-form-item label="鏀舵浜�" prop="payee">
+                <el-input v-model="form.payee" placeholder="璇疯緭鍏ユ敹娆句汉" maxlength="50" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="鏀舵璐﹀彿" prop="payeeAccount">
+                <el-input v-model="form.payeeAccount" placeholder="閾惰鍗″彿" maxlength="30" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="寮�鎴锋敮琛�" prop="bankBranch">
+                <el-input v-model="form.bankBranch" placeholder="寮�鎴锋敮琛屽叏绉�" maxlength="100" />
+              </el-form-item>
+            </el-col>
+          </el-row>
+        </el-card>
+
+        <el-card class="form-section" shadow="never">
+          <template #header><span class="card-header-title">闄勪欢锛堝彂绁級</span></template>
+          <el-form-item label-width="0" class="attachment-form-item">
+            <div class="upload-block">
+              <FileUpload v-model:file-list="form.attachmentList" :limit="20" button-text="鐐瑰嚮閫夋嫨鏂囦欢" />
+            </div>
+          </el-form-item>
+        </el-card>
+
+        <el-card class="form-section" shadow="never">
+          <template #header>
+            <div class="card-header-row">
+              <span class="card-header-title">瀹℃壒娴佺▼</span>
+              <el-button v-if="!formDialog.readonly" type="primary" link size="small" @click="autoAssignApprovalFlow">
+                鎸夎鍒欓噸鏂板垎閰�
+              </el-button>
+            </div>
+          </template>
+          <el-alert type="success" :title="approvalRuleHint" show-icon :closable="false" class="mb12" />
+          <el-form-item prop="approvalFlowNodes" label-width="0">
+            <ApprovalFlowEditor
+              v-if="!formDialog.readonly"
+              v-model="form.approvalFlowNodes"
+              :user-options="flowUserOptions"
+              @update:model-value="onApprovalFlowChange"
+            />
+            <ApprovalFlowProgress v-else :nodes="form.approvalFlowNodes" :current-index="form.currentNodeIndex" />
+            <p v-if="!formDialog.readonly" class="flow-tip">绯荤粺宸叉寜閲戦涓庤垂鐢ㄧ被鍨嬭嚜鍔ㄥ垎閰嶅鎵逛汉锛屽彲鎵嬪姩璋冩暣銆�</p>
+          </el-form-item>
+        </el-card>
+      </el-form>
+      <template #footer>
+        <el-button
+          v-if="!formDialog.readonly"
+          type="primary"
+          :loading="submitSaving"
+          @click="submitForm"
+        >
+          鎻� 浜�
+        </el-button>
+        <el-button @click="formDialog.visible = false">{{ formDialog.readonly ? "鍏� 闂�" : "鍙� 娑�" }}</el-button>
+      </template>
+    </el-dialog>
+
+    <!-- 璇︽儏 -->
+    <el-dialog v-model="detailDialog.visible" title="璐圭敤鎶ラ攢璇︽儏" width="900px" append-to-body destroy-on-close>
+      <div v-loading="detailLoading">
+      <DetailPanel :row="detailRow" />
+      <el-divider content-position="left">瀹℃壒娴佺▼</el-divider>
+      <ApprovalFlowProgress
+        :nodes="detailRow.approvalFlowProgressNodes ?? detailRow.approvalFlowNodes"
+        :current-index="detailRow.currentNodeIndex ?? 0"
+      />
+      <el-divider content-position="left">瀹℃壒璁板綍</el-divider>
+      <el-timeline v-if="detailRow.approvalRecords?.length">
+        <el-timeline-item
+          v-for="(rec, i) in detailRow.approvalRecords"
+          :key="i"
+          :type="rec.result === 'approved' ? 'success' : rec.result === 'rejected' ? 'danger' : 'primary'"
+          :timestamp="rec.time"
+        >
+          {{ rec.operatorName }} 鈥� {{ approvalActionLabel(rec.result) }}锛歿{ rec.opinion || "鏃犳剰瑙�" }}
+        </el-timeline-item>
+      </el-timeline>
+      <el-empty v-else description="鏆傛棤瀹℃壒璁板綍" :image-size="60" />
+      </div>
+      <template #footer>
+        <el-button type="primary" @click="detailDialog.visible = false">鍏� 闂�</el-button>
+      </template>
+    </el-dialog>
+
+    <!-- 瀹℃壒 -->
+    <el-dialog
+      v-model="approveDialog.visible"
+      title="璐圭敤鎶ラ攢瀹℃壒"
+      width="1000px"
+      append-to-body
+      destroy-on-close
+      @closed="approveOpinion = ''"
+    >
+      <DetailPanel :row="approveDialog.row" />
+      <el-divider content-position="left">娴佺▼杩涘害</el-divider>
+      <ApprovalFlowProgress
+        :nodes="approveDialog.row?.approvalFlowProgressNodes ?? approveDialog.row?.approvalFlowNodes"
+        :current-index="approveDialog.row?.currentNodeIndex ?? 0"
+      />
+      <el-form label-width="100px" class="mt16">
+        <el-form-item label="瀹℃壒鎰忚" required>
+          <el-input
+            v-model="approveOpinion"
+            type="textarea"
+            :rows="3"
+            maxlength="500"
+            show-word-limit
+            placeholder="閫氳繃鍙暀绌猴紱椹冲洖璇峰~鍐欏叿浣撳師鍥狅紙濡傦細鍙戠エ妯$硦闇�閲嶄紶锛�"
+          />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <el-button type="success" @click="submitApprove('approved')">閫� 杩�</el-button>
+        <el-button type="danger" @click="submitApprove('rejected')">椹� 鍥�</el-button>
+        <el-button @click="approveDialog.visible = false">鍙� 娑�</el-button>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup>
+import FileUpload from "@/components/AttachmentUpload/file/index.vue";
+import ApprovalFlowEditor from "@/views/officeProcessAutomation/AttendManage/overtime-apply/components/ApprovalFlowEditor.vue";
+import ApprovalFlowProgress from "../travel-reimburse/components/ApprovalFlowProgress.vue";
+import DetailPanel from "./components/DetailPanel.vue";
+import { useCostReimburse } from "./useCostReimburse.js";
+
+const cr = useCostReimburse();
+const {
+  Search,
+  EXPENSE_CATEGORY_OPTIONS,
+  CATEGORY_TEMPLATES,
+  EXPENSE_SUBJECT_OPTIONS,
+  expenseSubjectLabel,
+  searchForm,
+  tableLoading,
+  page,
+  tableData,
+  tableColumn,
+  importInputRef,
+  formRef,
+  form,
+  formDialog,
+  formRules,
+  detailDialog,
+  detailLoading,
+  detailRow,
+  approveDialog,
+  approveOpinion,
+  applicantFormSearchLoading,
+  applicantFormOptions,
+  flowUserOptions,
+  detailTotalAmount,
+  approvalRuleHint,
+  handleQuery,
+  resetSearch,
+  pagination,
+  remoteSearchApplicantForm,
+  userSelectLabel,
+  onApplicantChange,
+  onExpenseCategoryChange,
+  applyTemplate,
+  onDetailAmountChange,
+  onApprovalFlowChange,
+  addExpenseDetail,
+  removeExpenseDetail,
+  syncApplyAmountFromDetails,
+  autoAssignApprovalFlow,
+  openFormDialog,
+  onFormClosed,
+  submitForm,
+  submitSaving,
+  approvalActionLabel,
+  submitApprove,
+  handleExport,
+  handleImportClick,
+  onImportFile,
+} = cr;
+</script>
+
+<style scoped>
+.mb20 {
+  margin-bottom: 20px;
+}
+.mb16 {
+  margin-bottom: 16px;
+}
+.mb12 {
+  margin-bottom: 12px;
+}
+.mt16 {
+  margin-top: 16px;
+}
+.search_form {
+  display: flex;
+  flex-wrap: wrap;
+  align-items: center;
+  justify-content: space-between;
+  gap: 12px;
+}
+.search_fields {
+  display: flex;
+  flex-wrap: wrap;
+  align-items: center;
+  gap: 4px;
+}
+.search_actions {
+  display: flex;
+  flex-wrap: wrap;
+  gap: 8px;
+}
+.search_title {
+  font-size: 14px;
+  color: var(--el-text-color-regular);
+}
+.sr-only-input {
+  position: absolute;
+  width: 1px;
+  height: 1px;
+  padding: 0;
+  margin: -1px;
+  overflow: hidden;
+  clip: rect(0, 0, 0, 0);
+  white-space: nowrap;
+  border: 0;
+}
+.template-bar {
+  display: flex;
+  flex-wrap: wrap;
+  align-items: center;
+  gap: 8px;
+}
+.template-label {
+  font-size: 14px;
+  color: var(--el-text-color-secondary);
+  flex-shrink: 0;
+}
+.form-section {
+  margin-bottom: 16px;
+  border: 1px solid var(--el-border-color-lighter);
+}
+.form-section :deep(.el-card__header) {
+  padding: 12px 16px;
+  background: var(--el-fill-color-lighter);
+}
+.form-section :deep(.el-card__body) {
+  padding: 16px 16px 4px;
+}
+.card-header-title {
+  font-size: 15px;
+  font-weight: 600;
+}
+.card-header-row {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  gap: 12px;
+}
+.amount-row {
+  display: flex;
+  align-items: center;
+  gap: 12px;
+  width: 100%;
+}
+.amount-input {
+  flex: 1;
+  min-width: 160px;
+}
+.attachment-form-item {
+  margin-bottom: 0;
+}
+.detail-table {
+  margin-bottom: 0;
+}
+.upload-block {
+  width: 100%;
+}
+.flow-tip {
+  font-size: 12px;
+  color: var(--el-text-color-secondary);
+  margin-top: 8px;
+}
+.cost-reimburse-form-dialog :deep(.el-dialog__body) {
+  padding-top: 12px;
+}
+.cost-reimburse-form :deep(.el-form-item) {
+  margin-bottom: 18px;
+}
+.cost-reimburse-form :deep(.el-input-number) {
+  width: 100%;
+}
+.cost-reimburse-form :deep(.el-row) {
+  margin-bottom: 0;
+}
+</style>
diff --git a/src/views/officeProcessAutomation/ReimburseManage/cost-reimburse/useCostReimburse.js b/src/views/officeProcessAutomation/ReimburseManage/cost-reimburse/useCostReimburse.js
new file mode 100644
index 0000000..3b90a3b
--- /dev/null
+++ b/src/views/officeProcessAutomation/ReimburseManage/cost-reimburse/useCostReimburse.js
@@ -0,0 +1,634 @@
+import { Search } from "@element-plus/icons-vue";
+import dayjs from "dayjs";
+import {
+  deleteFinReimbursement,
+  getFinReimbursementDetail,
+  listFinReimbursementPage,
+  persistFinReimbursement,
+} from "@/api/officeProcessAutomation/finReimbursement.js";
+import { ElMessageBox } from "element-plus";
+import { userListNoPageByTenantId } from "@/api/system/user.js";
+import { computed, getCurrentInstance, nextTick, onMounted, reactive, ref } from "vue";
+import {
+  buildCostReimbursementSaveDto,
+  buildFinReimbursementListParams,
+  filterReimbursementRowsBySearch,
+  hasActiveReimbursementSearch,
+  canDeleteReimbursementRow,
+  canEditReimbursementRow,
+  enrichReimbursementListRowsWithApprovalFlow,
+  filterRowsByReimbursementType,
+  FIN_REIMBURSEMENT_TYPE,
+  mapCostReimbursementRow,
+  mapFinReimbursementDetailRow,
+  resolveReimbursementDeleteId,
+  unwrapFinReimbursementDetail,
+  unwrapFinReimbursementPage,
+  validateReimbursementApprovalNodes,
+  validateReimbursementPersistDto,
+} from "../shared/finReimbursementMappers.js";
+import { consumeReimburseEditFromApprove } from "../shared/reimburseApproveBridge.js";
+import {
+  EXPENSE_CATEGORY_OPTIONS,
+  CATEGORY_TEMPLATES,
+  EXPENSE_SUBJECT_OPTIONS,
+  expenseCategoryLabel,
+  expenseSubjectLabel,
+  statusLabel,
+  statusTagType,
+  formatApprovalFlowSummary,
+  buildAutoApprovalFlow,
+  getApprovalRuleHint,
+  createEmptyExpenseDetail,
+  createEmptyForm,
+  applyCategoryTemplate,
+  initApprovalFlowNodes,
+  advanceApprovalFlow,
+  rejectApprovalFlow,
+  normalizeImportedRow,
+} from "./costReimburseUtils.js";
+
+function unwrapArray(payload) {
+  if (Array.isArray(payload)) return payload;
+  if (payload?.data && Array.isArray(payload.data)) return payload.data;
+  if (payload?.rows && Array.isArray(payload.rows)) return payload.rows;
+  return [];
+}
+
+function isActiveUser(u) {
+  if (u.delFlag === "2" || u.delFlag === 2) return false;
+  if (u.status == null) return true;
+  return String(u.status) === "0";
+}
+
+function demoFlowNodes(amount = 1200, category = "transport") {
+  return buildAutoApprovalFlow(amount, category);
+}
+
+export function useCostReimburse() {
+  const { proxy } = getCurrentInstance();
+
+  const allRows = ref([]);
+
+  const searchForm = reactive({
+    applicantKeyword: "",
+  });
+  const tableLoading = ref(false);
+  const page = reactive({ current: 1, size: 10, total: 0 });
+  const importInputRef = ref(null);
+  const allUsersCache = ref([]);
+  const applicantFormSearchLoading = ref(false);
+  const applicantFormOptions = ref([]);
+  const formRef = ref();
+  const form = reactive(createEmptyForm());
+  const formDialog = reactive({ visible: false, title: "", mode: "add", readonly: false });
+  const detailDialog = reactive({ visible: false });
+  const detailLoading = ref(false);
+  const detailRow = ref({});
+  const approveDialog = reactive({ visible: false, row: null });
+  const approveOpinion = ref("");
+  const submitSaving = ref(false);
+
+  const tableData = computed(() =>
+    allRows.value.map((r) => ({
+      ...r,
+      approvalFlowSummary: formatApprovalFlowSummary(r),
+    }))
+  );
+
+  async function fetchList() {
+    tableLoading.value = true;
+    try {
+      const res = await listFinReimbursementPage(
+        buildFinReimbursementListParams({
+          page,
+          searchForm,
+          reimbursementType: FIN_REIMBURSEMENT_TYPE.COST,
+        })
+      );
+      const { records, total } = unwrapFinReimbursementPage(res);
+      const filtered = filterRowsByReimbursementType(
+        records,
+        FIN_REIMBURSEMENT_TYPE.COST
+      );
+      let mapped = filtered.map(mapCostReimbursementRow);
+      mapped = await enrichReimbursementListRowsWithApprovalFlow(
+        mapped,
+        FIN_REIMBURSEMENT_TYPE.COST
+      );
+      if (hasActiveReimbursementSearch(searchForm)) {
+        mapped = filterReimbursementRowsBySearch(mapped, searchForm);
+      }
+      allRows.value = mapped;
+      const dropped = records.length - filtered.length;
+      let nextTotal =
+        dropped > 0 ? Math.max(0, Number(total) - dropped) : Number(total);
+      if (hasActiveReimbursementSearch(searchForm)) {
+        nextTotal = mapped.length;
+      }
+      page.total = nextTotal;
+    } catch {
+      allRows.value = [];
+      page.total = 0;
+      proxy?.$modal?.msgError?.("璐圭敤鎶ラ攢鍒楄〃鍔犺浇澶辫触");
+    } finally {
+      tableLoading.value = false;
+    }
+  }
+
+  const flowUserOptions = computed(() => allUsersCache.value.filter(isActiveUser));
+
+  const detailTotalAmount = computed(() => {
+    const sum = (form.expenseDetails || []).reduce((s, d) => s + (Number(d.amount) || 0), 0);
+    return Math.round(sum * 100) / 100;
+  });
+
+  const approvalRuleHint = computed(() =>
+    getApprovalRuleHint(form.applyAmount ?? detailTotalAmount.value, form.expenseCategory)
+  );
+
+  const tableColumn = ref([
+    { label: "鎶ラ攢鍗曞彿", prop: "reimburseNo", width: 150 },
+    { label: "鐢宠浜虹紪鍙�", prop: "applicantNo", width: 110 },
+    { label: "鐢宠浜�", prop: "applicantName", minWidth: 90 },
+    { label: "鎶ラ攢閲戦(鍏�)", prop: "applyAmount", width: 110 },
+    { label: "鎶ラ攢鍘熷洜", prop: "reimburseReason", minWidth: 160, showOverflowTooltip: true },
+    { label: "鐢宠鏃堕棿", prop: "applyTime", width: 165 },
+    { label: "鍒涘缓鏃堕棿", prop: "createTime", width: 165 },
+    {
+      label: "鎶ラ攢鐘舵��",
+      prop: "approvalResult",
+      width: 100,
+      dataType: "tag",
+      formatData: (v) => statusLabel(v),
+      formatType: (v) => statusTagType(v),
+    },
+    {
+      label: "瀹℃壒娴佺▼",
+      prop: "approvalFlowSummary",
+      minWidth: 200,
+      showOverflowTooltip: true,
+    },
+    {
+      dataType: "action",
+      label: "鎿嶄綔",
+      align: "center",
+      fixed: "right",
+      width: 220,
+      operation: [
+        {
+          name: "缂栬緫",
+          type: "text",
+          disabled: (row) => !canEditReimbursementRow(row),
+          clickFun: (row) => openFormDialog("edit", row),
+        },
+        { name: "璇︽儏", type: "text", clickFun: (row) => openDetail(row) },
+        {
+          name: "鍒犻櫎",
+          type: "danger",
+          disabled: (row) => !canDeleteReimbursementRow(row),
+          clickFun: (row) => confirmRemoveRow(row),
+        },
+      ],
+    },
+  ]);
+
+  const formRules = {
+    applicantId: [{ required: true, message: "璇烽�夋嫨鍛樺伐", trigger: "change" }],
+    expenseCategory: [{ required: true, message: "璇烽�夋嫨璐圭敤绫诲瀷", trigger: "change" }],
+    reimburseReason: [{ required: true, message: "璇峰~鍐欐姤閿�鍘熷洜", trigger: "blur" }],
+    applyAmount: [{ required: true, message: "璇峰~鍐欐姤閿�閲戦", trigger: "blur" }],
+    payee: [{ required: true, message: "璇峰~鍐欐敹娆句汉", trigger: "blur" }],
+    payeeAccount: [{ required: true, message: "璇峰~鍐欐敹娆捐处鍙�", trigger: "blur" }],
+    bankBranch: [{ required: true, message: "璇峰~鍐欏紑鎴锋敮琛�", trigger: "blur" }],
+    approvalFlowNodes: [
+      {
+        validator: (_r, _v, cb) => {
+          const nodes = form.approvalFlowNodes || [];
+          if (!nodes.length) {
+            cb(new Error("璇疯嚦灏戦厤缃竴涓鎵硅妭鐐�"));
+            return;
+          }
+          if (nodes.some((n) => n.approverId == null || n.approverId === "")) {
+            cb(new Error("姣忎釜鑺傜偣椤婚�夋嫨瀹℃壒浜�"));
+            return;
+          }
+          cb();
+        },
+        trigger: "change",
+      },
+    ],
+  };
+
+  async function loadUserPool() {
+    try {
+      allUsersCache.value = unwrapArray(await userListNoPageByTenantId());
+    } catch {
+      allUsersCache.value = [];
+    }
+  }
+
+  function userSelectLabel(u) {
+    const nick = u.nickName || "";
+    const name = u.userName || "";
+    if (nick && name && nick !== name) return `${nick}锛�${name}锛塦;
+    return nick || name || `鐢ㄦ埛${u.userId ?? u.id ?? ""}`;
+  }
+
+  function userById(id) {
+    return allUsersCache.value.find((u) => String(u.userId ?? u.id) === String(id));
+  }
+
+  function employeeNoFromUser(u) {
+    if (!u) return "";
+    return u.userName ?? u.userCode ?? u.jobNumber ?? u.workNo ?? (u.userId != null ? String(u.userId) : "");
+  }
+
+  function filterUsersByQuery(query) {
+    const list = allUsersCache.value.filter(isActiveUser);
+    const q = (query || "").trim().toLowerCase();
+    if (!q) return [...list];
+    return list.filter((u) => {
+      const nick = (u.nickName || "").toLowerCase();
+      const uname = (u.userName || "").toLowerCase();
+      return nick.includes(q) || uname.includes(q);
+    });
+  }
+
+  async function remoteSearchApplicantForm(query) {
+    applicantFormSearchLoading.value = true;
+    try {
+      if (!allUsersCache.value.length) await loadUserPool();
+      applicantFormOptions.value = filterUsersByQuery(query);
+    } finally {
+      applicantFormSearchLoading.value = false;
+    }
+  }
+
+  function onApplicantChange(uid) {
+    const u = userById(uid);
+    if (u) {
+      form.employeeName = u.nickName || u.userName || "";
+      form.employeeNo = employeeNoFromUser(u);
+      form.payee = form.payee || form.employeeName;
+      form.deptId = String(u.deptId ?? u.sysDeptId ?? "");
+      form.deptName = u.dept?.deptName ?? u.deptName ?? "";
+    } else {
+      form.employeeName = "";
+      form.employeeNo = "";
+    }
+  }
+
+  function autoAssignApprovalFlow() {
+    const amount = Number(form.applyAmount) || detailTotalAmount.value || 0;
+    form.approvalFlowNodes = buildAutoApprovalFlow(
+      amount,
+      form.expenseCategory || "other",
+      form.approvalFlowNodes
+    );
+    nextTick(() => formRef.value?.validateField?.("approvalFlowNodes"));
+  }
+
+  function onExpenseCategoryChange(val) {
+    if (val && !(form.expenseDetails || []).length) {
+      applyCategoryTemplate(form, val);
+      syncApplyAmountFromDetails();
+    }
+    autoAssignApprovalFlow();
+  }
+
+  function applyTemplate(category) {
+    applyCategoryTemplate(form, category);
+    syncApplyAmountFromDetails();
+    autoAssignApprovalFlow();
+    proxy?.$modal?.msgSuccess?.(`宸插簲鐢ㄣ��${CATEGORY_TEMPLATES[category]?.label || category}銆嶅~鎶ユā鏉縛);
+  }
+
+  function onDetailAmountChange() {
+    syncApplyAmountFromDetails();
+    autoAssignApprovalFlow();
+  }
+
+  function onApprovalFlowChange() {
+    nextTick(() => formRef.value?.validateField?.("approvalFlowNodes"));
+  }
+
+  function addExpenseDetail() {
+    form.expenseDetails.push(createEmptyExpenseDetail());
+  }
+
+  function removeExpenseDetail(index) {
+    form.expenseDetails.splice(index, 1);
+    syncApplyAmountFromDetails();
+    autoAssignApprovalFlow();
+  }
+
+  function syncApplyAmountFromDetails() {
+    form.applyAmount = detailTotalAmount.value;
+  }
+
+  function handleQuery() {
+    page.current = 1;
+    return fetchList();
+  }
+
+  function resetSearch() {
+    searchForm.applicantKeyword = "";
+    handleQuery();
+  }
+
+  function pagination(obj) {
+    page.current = obj.page;
+    page.size = obj.limit;
+    return fetchList();
+  }
+
+  async function loadCostDetailRow(row) {
+    const id = resolveReimbursementDeleteId(row);
+    if (id == null) {
+      throw new Error("missing id");
+    }
+    const res = await getFinReimbursementDetail(id);
+    const raw = unwrapFinReimbursementDetail(res);
+    return mapFinReimbursementDetailRow(raw, FIN_REIMBURSEMENT_TYPE.COST);
+  }
+
+  async function openDetail(row) {
+    const id = resolveReimbursementDeleteId(row);
+    if (id == null) {
+      proxy?.$modal?.msgWarning?.("鏃犳硶鏌ョ湅璇︽儏锛氱己灏戞姤閿�鍗� ID");
+      return;
+    }
+    detailDialog.visible = true;
+    detailLoading.value = true;
+    detailRow.value = { ...row };
+    try {
+      detailRow.value = await loadCostDetailRow(row);
+    } catch {
+      proxy?.$modal?.msgError?.("鍔犺浇璇︽儏澶辫触");
+      detailDialog.visible = false;
+    } finally {
+      detailLoading.value = false;
+    }
+  }
+
+  async function confirmRemoveRow(row) {
+    const id = resolveReimbursementDeleteId(row);
+    if (id == null) {
+      proxy?.$modal?.msgWarning?.("鏃犳硶鍒犻櫎锛氱己灏戞姤閿�鍗� ID");
+      return;
+    }
+    const title = row.reimburseNo || row.billNo || row.reimburseReason || "璇ユ姤閿�鍗�";
+    try {
+      await ElMessageBox.confirm(
+        `纭畾瑕佸垹闄ゃ��${title}銆嶅悧锛熷垹闄ゅ悗涓嶅彲鎭㈠銆俙,
+        "鍒犻櫎纭",
+        {
+          type: "warning",
+          confirmButtonText: "纭畾鍒犻櫎",
+          cancelButtonText: "鍙栨秷",
+          distinguishCancelAndClose: true,
+          autofocus: false,
+        }
+      );
+    } catch {
+      return;
+    }
+    try {
+      await deleteFinReimbursement([id]);
+      proxy?.$modal?.msgSuccess?.("鍒犻櫎鎴愬姛");
+      if (detailDialog.visible && resolveReimbursementDeleteId(detailRow.value) === id) {
+        detailDialog.visible = false;
+      }
+      await handleQuery();
+    } catch {
+      proxy?.$modal?.msgError?.("鍒犻櫎澶辫触");
+    }
+  }
+
+  function openApprove(row) {
+    approveDialog.row = { ...row };
+    approveDialog.visible = true;
+  }
+
+  function approvalActionLabel(v) {
+    if (v === "approved") return "閫氳繃";
+    if (v === "rejected") return "椹冲洖";
+    return "鎻愪氦";
+  }
+
+  async function openFormDialog(mode, row) {
+    formDialog.mode = mode;
+    formDialog.readonly = false;
+    formDialog.title = mode === "add" ? "鏂板璐圭敤鎶ラ攢" : "缂栬緫璐圭敤鎶ラ攢";
+    if (!allUsersCache.value.length) await loadUserPool();
+    Object.assign(form, createEmptyForm());
+    if (mode === "edit" && row) {
+      let editRow = row;
+      try {
+        editRow = await loadCostDetailRow(row);
+      } catch {
+        proxy?.$modal?.msgError?.("鍔犺浇鎶ラ攢璇︽儏澶辫触");
+        return;
+      }
+      Object.assign(form, {
+        ...JSON.parse(JSON.stringify(editRow)),
+        reimbursementId: editRow.reimbursementId ?? editRow.id,
+        attachmentList: JSON.parse(JSON.stringify(editRow.attachmentList || editRow.invoiceAttachments || [])),
+        approvalFlowNodes: JSON.parse(JSON.stringify(editRow.approvalFlowNodes || [])),
+        expenseDetails: JSON.parse(JSON.stringify(editRow.expenseDetails || [])),
+      });
+      const u = userById(editRow.applicantId);
+      applicantFormOptions.value = u
+        ? [u]
+        : [{ userId: editRow.applicantId, nickName: editRow.employeeName, userName: editRow.employeeNo }];
+    } else {
+      form.approvalFlowNodes = buildAutoApprovalFlow(0, "other");
+      remoteSearchApplicantForm("");
+    }
+    formDialog.visible = true;
+    nextTick(() => {
+      formRef.value?.clearValidate?.();
+    });
+  }
+
+  function onFormClosed() {
+    formRef.value?.resetFields?.();
+  }
+
+  async function submitForm() {
+    try {
+      await formRef.value?.validate?.();
+    } catch {
+      return;
+    }
+    if (!(form.expenseDetails || []).length) {
+      proxy?.$modal?.msgWarning?.("璇疯嚦灏戞坊鍔犱竴鏉℃姤閿�鏄庣粏");
+      return;
+    }
+    syncApplyAmountFromDetails();
+
+    if (submitSaving.value) return;
+    const isEdit = formDialog.mode === "edit";
+    const dto = buildCostReimbursementSaveDto(form);
+    const check = validateReimbursementPersistDto(dto, isEdit);
+    if (!check.ok) {
+      proxy?.$modal?.msgWarning?.(check.message);
+      return;
+    }
+    const nodeCheck = validateReimbursementApprovalNodes(dto);
+    if (!nodeCheck.ok) {
+      proxy?.$modal?.msgWarning?.(nodeCheck.message);
+      return;
+    }
+    submitSaving.value = true;
+    try {
+      await persistFinReimbursement(dto, isEdit);
+      proxy?.$modal?.msgSuccess?.(isEdit ? "淇濆瓨鎴愬姛" : "鎻愪氦鎴愬姛");
+      formDialog.visible = false;
+      await handleQuery();
+    } catch {
+      proxy?.$modal?.msgError?.(isEdit ? "淇濆瓨澶辫触" : "鎻愪氦澶辫触");
+    } finally {
+      submitSaving.value = false;
+    }
+  }
+
+  async function submitApprove(result) {
+    const row = approveDialog.row;
+    if (!row) return;
+    if (result === "rejected" && !(approveOpinion.value || "").trim()) {
+      proxy?.$modal?.msgWarning?.("椹冲洖椤诲~鍐欏鎵规剰瑙侊紙濡傦細鍙戠エ妯$硦闇�閲嶄紶锛�");
+      return;
+    }
+    const idx = allRows.value.findIndex((r) => r.id === row.id);
+    if (idx === -1) return;
+    const cur = allRows.value[idx];
+    const operatorName = "褰撳墠瀹℃壒浜�";
+    const record = {
+      operatorName,
+      result,
+      opinion: approveOpinion.value || (result === "approved" ? "鍚屾剰" : "椹冲洖"),
+      time: dayjs().format("YYYY-MM-DD HH:mm:ss"),
+    };
+    const records = [...(cur.approvalRecords || []), record];
+    let flowUpdate;
+    if (result === "approved") {
+      flowUpdate = advanceApprovalFlow(cur, approveOpinion.value);
+    } else {
+      flowUpdate = rejectApprovalFlow(cur, approveOpinion.value);
+    }
+    allRows.value[idx] = {
+      ...cur,
+      approvalFlowNodes: flowUpdate.nodes,
+      currentNodeIndex: flowUpdate.currentNodeIndex,
+      approvalResult: flowUpdate.approvalResult,
+      rejectReason: flowUpdate.rejectReason ?? cur.rejectReason,
+      approvalRecords: records,
+    };
+    proxy?.$modal?.msgSuccess?.(result === "approved" ? "宸查�氳繃" : "宸查┏鍥�");
+    approveDialog.visible = false;
+    handleQuery();
+  }
+
+  function handleExport() {
+    const data = allRows.value;
+    const blob = new Blob([JSON.stringify(data, null, 2)], { type: "application/json;charset=utf-8" });
+    const url = URL.createObjectURL(blob);
+    const a = document.createElement("a");
+    a.href = url;
+    a.download = `璐圭敤鎶ラ攢瀵煎嚭_${dayjs().format("YYYYMMDDHHmmss")}.json`;
+    a.click();
+    URL.revokeObjectURL(url);
+    proxy?.$modal?.msgSuccess?.(`宸插鍑� ${data.length} 鏉);
+  }
+
+  function handleImportClick() {
+    importInputRef.value?.click?.();
+  }
+
+  function onImportFile(e) {
+    const file = e.target.files?.[0];
+    e.target.value = "";
+    if (!file) return;
+    const reader = new FileReader();
+    reader.onload = () => {
+      try {
+        const parsed = JSON.parse(String(reader.result || ""));
+        const arr = Array.isArray(parsed) ? parsed : parsed?.rows || parsed?.data;
+        if (!Array.isArray(arr) || !arr.length) {
+          proxy?.$modal?.msgWarning?.("瀵煎叆鏍煎紡椤讳负璐圭敤鎶ラ攢 JSON 鏁扮粍");
+          return;
+        }
+        arr.forEach((raw, i) => allRows.value.unshift(normalizeImportedRow(raw, i)));
+        proxy?.$modal?.msgSuccess?.(`鎴愬姛瀵煎叆 ${arr.length} 鏉);
+        handleQuery();
+      } catch {
+        proxy?.$modal?.msgError?.("瑙f瀽澶辫触");
+      }
+    };
+    reader.readAsText(file, "utf-8");
+  }
+
+  onMounted(async () => {
+    loadUserPool();
+    await fetchList();
+    const editPayload = consumeReimburseEditFromApprove();
+    if (editPayload?.reimbursementId != null) {
+      await openFormDialog("edit", { reimbursementId: editPayload.reimbursementId });
+    }
+  });
+
+  return {
+    Search,
+    EXPENSE_CATEGORY_OPTIONS,
+    CATEGORY_TEMPLATES,
+    EXPENSE_SUBJECT_OPTIONS,
+    expenseCategoryLabel,
+    expenseSubjectLabel,
+    searchForm,
+    tableLoading,
+    page,
+    tableData,
+    tableColumn,
+    importInputRef,
+    formRef,
+    form,
+    formDialog,
+    formRules,
+    detailDialog,
+    detailLoading,
+    detailRow,
+    approveDialog,
+    approveOpinion,
+    applicantFormSearchLoading,
+    applicantFormOptions,
+    flowUserOptions,
+    detailTotalAmount,
+    approvalRuleHint,
+    handleQuery,
+    resetSearch,
+    pagination,
+    remoteSearchApplicantForm,
+    userSelectLabel,
+    onApplicantChange,
+    onExpenseCategoryChange,
+    applyTemplate,
+    onDetailAmountChange,
+    onApprovalFlowChange,
+    addExpenseDetail,
+    removeExpenseDetail,
+    syncApplyAmountFromDetails,
+    autoAssignApprovalFlow,
+    openFormDialog,
+    onFormClosed,
+    submitForm,
+    submitSaving,
+    openDetail,
+    approvalActionLabel,
+    submitApprove,
+    handleExport,
+    handleImportClick,
+    onImportFile,
+  };
+}
diff --git a/src/views/officeProcessAutomation/ReimburseManage/shared/components/FinReimburseApprovePanel.vue b/src/views/officeProcessAutomation/ReimburseManage/shared/components/FinReimburseApprovePanel.vue
new file mode 100644
index 0000000..724376d
--- /dev/null
+++ b/src/views/officeProcessAutomation/ReimburseManage/shared/components/FinReimburseApprovePanel.vue
@@ -0,0 +1,70 @@
+<!-- 宸梾/璐圭敤鎶ラ攢锛氬鎵瑰垪琛ㄥ唴璇︽儏/瀹℃壒寮圭獥鍐呭锛堜笌鎶ラ攢椤靛脊绐椾竴鑷达級 -->
+<template>
+  <div v-loading="loading">
+    <TravelDetailPanel v-if="isTravel" :row="reimburseRow" />
+    <CostDetailPanel v-else :row="reimburseRow" />
+
+    <el-divider content-position="left">娴佺▼杩涘害</el-divider>
+    <ApprovalFlowProgress
+      :nodes="reimburseRow.approvalFlowProgressNodes ?? reimburseRow.approvalFlowNodes"
+      :current-index="reimburseRow.currentNodeIndex ?? 0"
+    />
+
+    <template v-if="mode === 'detail'">
+      <el-divider content-position="left">瀹℃壒璁板綍锛堝叏娴佺▼鐣欑棔锛�</el-divider>
+      <el-timeline v-if="reimburseRow.approvalRecords?.length">
+        <el-timeline-item
+          v-for="(rec, i) in reimburseRow.approvalRecords"
+          :key="i"
+          :type="rec.result === 'approved' ? 'success' : rec.result === 'rejected' ? 'danger' : 'primary'"
+          :timestamp="rec.time"
+        >
+          {{ rec.operatorName }} 鈥� {{ actionLabel(rec.result) }}锛歿{ rec.opinion || "鏃犳剰瑙�" }}
+        </el-timeline-item>
+      </el-timeline>
+      <el-empty v-else description="鏆傛棤瀹℃壒璁板綍" :image-size="60" />
+    </template>
+
+    <el-form v-else label-width="100px" class="mt16">
+      <el-form-item label="瀹℃壒鎰忚">
+        <el-input
+          :model-value="approveOpinion"
+          type="textarea"
+          :rows="3"
+          maxlength="500"
+          show-word-limit
+          :placeholder="isTravel ? '閫氳繃鍙暀绌猴紱椹冲洖璇峰~鍐欏師鍥�' : '閫氳繃鍙暀绌猴紱椹冲洖璇峰~鍐欏叿浣撳師鍥狅紙濡傦細鍙戠エ妯$硦闇�閲嶄紶锛�'"
+          @update:model-value="$emit('update:approveOpinion', $event)"
+        />
+      </el-form-item>
+    </el-form>
+  </div>
+</template>
+
+<script setup>
+import { computed } from "vue";
+import { isTravelReimbursementType } from "../finReimbursementMappers.js";
+import ApprovalFlowProgress from "../../travel-reimburse/components/ApprovalFlowProgress.vue";
+import CostDetailPanel from "../../cost-reimburse/components/DetailPanel.vue";
+import TravelDetailPanel from "../../travel-reimburse/components/DetailPanel.vue";
+
+const props = defineProps({
+  mode: { type: String, default: "detail" },
+  moduleKey: { type: String, default: "" },
+  reimburseRow: { type: Object, default: () => ({}) },
+  loading: { type: Boolean, default: false },
+  approveOpinion: { type: String, default: "" },
+});
+
+defineEmits(["update:approveOpinion"]);
+
+const isTravel = computed(() =>
+  isTravelReimbursementType(props.reimburseRow?.reimbursementType ?? props.moduleKey)
+);
+
+function actionLabel(v) {
+  if (v === "approved") return "閫氳繃";
+  if (v === "rejected") return "椹冲洖";
+  return "鎻愪氦";
+}
+</script>
diff --git a/src/views/officeProcessAutomation/ReimburseManage/shared/finReimbursementDetailExtras.js b/src/views/officeProcessAutomation/ReimburseManage/shared/finReimbursementDetailExtras.js
new file mode 100644
index 0000000..c72633b
--- /dev/null
+++ b/src/views/officeProcessAutomation/ReimburseManage/shared/finReimbursementDetailExtras.js
@@ -0,0 +1,160 @@
+import { formatDisplayTime } from "../../ApproveManage/approve-template/approveTemplateConstants.js";
+import {
+  mapRecordResultFromApi,
+  mapRecordsFromApi,
+  mapTasksToFlowNodes,
+} from "../../ApproveManage/approve-list/approveListConstants.js";
+
+function taskStatusToNodeStatus(taskStatus) {
+  const s = String(taskStatus ?? "").toUpperCase();
+  if (["APPROVED", "COMPLETED", "FINISHED", "PASSED", "AGREE"].includes(s)) {
+    return "finish";
+  }
+  if (["REJECTED", "REJECT", "REFUSE", "REFUSED"].includes(s)) {
+    return "error";
+  }
+  if (["PENDING", "IN_APPROVAL", "PROCESS", "PROCESSING"].includes(s)) {
+    return "process";
+  }
+  return "wait";
+}
+
+/** storageBlobVOList 鈫� 椤甸潰闄勪欢鍒楄〃 */
+export function mapReimbursementAttachments(source = {}) {
+  const list =
+    source.storageBlobVOList ||
+    source.storageBlobDTOs ||
+    source.storageBlobDTOS ||
+    source.storageBlobVOS ||
+    source.attachmentList ||
+    source.invoiceAttachments ||
+    [];
+  if (!Array.isArray(list)) return [];
+  return list.map((b, i) => ({
+    ...b,
+    id: b.id ?? b.blobId ?? `att_${i}`,
+    name:
+      b.fileName ||
+      b.originalFilename ||
+      b.originalFileName ||
+      b.blobName ||
+      b.name ||
+      "闄勪欢",
+    url:
+      b.url ||
+      b.fileUrl ||
+      b.downloadUrl ||
+      b.downloadURL ||
+      b.previewUrl ||
+      b.previewURL ||
+      b.link ||
+      "",
+  }));
+}
+
+/** 瀹℃壒璁板綍鏉ヨ嚜 tasks锛堟瘡鏉′换鍔′竴鏉$暀鐥曪級 */
+export function mapTasksToApprovalRecords(tasks) {
+  const list = Array.isArray(tasks) ? tasks : [];
+  return list
+    .map((t, index) => ({
+      id: t.id ?? index,
+      operatorName: t.approverName || t.operatorName || t.createUserName || "鈥�",
+      result: mapRecordResultFromApi(
+        t.approveAction ?? t.taskStatus ?? t.status
+      ),
+      opinion: t.approveComment || t.comment || t.opinion || "",
+      time: formatDisplayTime(
+        t.approveTime || t.finishTime || t.updateTime || t.createTime || ""
+      ),
+      levelNo: t.levelNo ?? t.taskLevel,
+      raw: t,
+    }))
+    .sort((a, b) => {
+      const la = Number(a.levelNo ?? 0);
+      const lb = Number(b.levelNo ?? 0);
+      if (la !== lb) return la - lb;
+      return String(a.time).localeCompare(String(b.time));
+    });
+}
+
+/** tasks 鈫� ApprovalFlowProgress 鑺傜偣 */
+export function mapTasksToApprovalFlowNodes(tasks) {
+  const grouped = mapTasksToFlowNodes(tasks);
+  return grouped.map((node, i) => {
+    const approvers = node.approvers || [];
+    const statuses = approvers.map(a =>
+      taskStatusToNodeStatus(a.taskStatus ?? a.status)
+    );
+    let nodeStatus = "wait";
+    if (statuses.includes("error")) nodeStatus = "error";
+    else if (statuses.length && statuses.every(s => s === "finish")) {
+      nodeStatus = "finish";
+    } else if (statuses.includes("process")) nodeStatus = "process";
+
+    const names = approvers.map(a => a.approverName).filter(Boolean).join("銆�");
+    const opinions = approvers
+      .map(a => a.approveComment)
+      .filter(Boolean)
+      .join("锛�");
+
+    return {
+      nodeOrder: node.nodeOrder ?? node.levelNo ?? i + 1,
+      sortOrder: node.nodeOrder ?? node.levelNo ?? i + 1,
+      approverName: names || "鈥�",
+      approveOpinion: opinions,
+      approveTime: approvers.find(a => a.approveTime)?.approveTime || "",
+      nodeStatus,
+      signMode: node.signMode,
+    };
+  });
+}
+
+export function computeApprovalFlowCurrentIndex(approvalFlowNodes = []) {
+  const list = approvalFlowNodes || [];
+  const processing = list.findIndex(n => n.nodeStatus === "process");
+  if (processing >= 0) return processing;
+  const errorIdx = list.findIndex(n => n.nodeStatus === "error");
+  if (errorIdx >= 0) return errorIdx;
+  return list.filter(n => n.nodeStatus === "finish").length;
+}
+
+/** 璇︽儏 DTO 琛ュ厖 tasks / 闄勪欢 / 瀹℃壒璁板綍 */
+export function applyFinReimbursementDetailEnrichment(mapped, raw = {}) {
+  if (!mapped || typeof mapped !== "object") return mapped;
+  const source = { ...raw, ...mapped };
+  const tasks = Array.isArray(source.tasks) ? source.tasks : [];
+  const attachments = mapReimbursementAttachments(source);
+  const approvalRecords = tasks.length
+    ? mapTasksToApprovalRecords(tasks)
+    : mapRecordsFromApi(source.records || source.approvalRecords);
+  /** 琛ㄥ崟缂栬緫鍥炴樉锛氫繚鐣� nodes 鏄犲皠锛堝惈 approverId锛夛紝鍕跨敤 tasks 瑕嗙洊 */
+  const approvalFlowNodes = Array.isArray(mapped.approvalFlowNodes)
+    ? mapped.approvalFlowNodes
+    : [];
+  /** 璇︽儏/杩涘害鏉″睍绀猴細鏈� tasks 鏃剁敤浠诲姟鐘舵�佽妭鐐� */
+  const approvalFlowProgressNodes = tasks.length
+    ? mapTasksToApprovalFlowNodes(tasks)
+    : approvalFlowNodes;
+  const currentNodeIndex = computeApprovalFlowCurrentIndex(
+    approvalFlowProgressNodes.length ? approvalFlowProgressNodes : approvalFlowNodes
+  );
+  const rejectReason =
+    approvalRecords.find(r => r.result === "rejected")?.opinion ||
+    source.rejectReason ||
+    "";
+
+  return {
+    ...mapped,
+    tasks,
+    storageBlobVOList: attachments,
+    attachmentList: attachments,
+    invoiceAttachments: attachments,
+    approvalRecords,
+    records: tasks.length ? tasks : source.records,
+    approvalFlowNodes,
+    approvalFlowProgressNodes,
+    currentNodeIndex,
+    rejectReason,
+    flowNodes: tasks.length ? mapTasksToFlowNodes(tasks) : mapped.flowNodes,
+  };
+}
diff --git a/src/views/officeProcessAutomation/ReimburseManage/shared/finReimbursementMappers.js b/src/views/officeProcessAutomation/ReimburseManage/shared/finReimbursementMappers.js
new file mode 100644
index 0000000..2525f70
--- /dev/null
+++ b/src/views/officeProcessAutomation/ReimburseManage/shared/finReimbursementMappers.js
@@ -0,0 +1,904 @@
+import dayjs from "dayjs";
+import { getFinReimbursementDetail } from "@/api/officeProcessAutomation/finReimbursement.js";
+import { APPROVAL_MODULE_KEYS } from "../../ApproveManage/approve-shared/approvalModuleRegistry.js";
+import { mapSignModeToApi } from "../../ApproveManage/approve-template/approveTemplateConstants.js";
+import { EXPENSE_CATEGORY_OPTIONS } from "../cost-reimburse/costReimburseUtils.js";
+import { EXPENSE_SUBJECT_OPTIONS } from "../travel-reimburse/travelReimburseUtils.js";
+import { mapTasksToFlowNodes } from "../../ApproveManage/approve-list/approveListConstants.js";
+import { applyFinReimbursementDetailEnrichment } from "./finReimbursementDetailExtras.js";
+
+/** 鎶ラ攢绫诲瀷锛�1-宸梾鎶ラ攢锛�2-璐圭敤鎶ラ攢 */
+export const FIN_REIMBURSEMENT_TYPE = {
+  TRAVEL: "1",
+  COST: "2",
+};
+
+const REIMBURSEMENT_TYPE_LABEL = {
+  [FIN_REIMBURSEMENT_TYPE.TRAVEL]: "宸梾鎶ラ攢",
+  [FIN_REIMBURSEMENT_TYPE.COST]: "璐圭敤鎶ラ攢",
+};
+
+/** 褰掍竴鍖栨姤閿�绫诲瀷锛�1-宸梾锛�2-璐圭敤 */
+export function normalizeReimbursementType(val) {
+  const s = String(val ?? "").trim();
+  if (s === "1" || s === FIN_REIMBURSEMENT_TYPE.TRAVEL) {
+    return FIN_REIMBURSEMENT_TYPE.TRAVEL;
+  }
+  if (s === "2" || s === FIN_REIMBURSEMENT_TYPE.COST) {
+    return FIN_REIMBURSEMENT_TYPE.COST;
+  }
+  return "";
+}
+
+export function reimbursementTypeLabel(type) {
+  return REIMBURSEMENT_TYPE_LABEL[normalizeReimbursementType(type)] || "鈥�";
+}
+
+export function getModuleKeyByReimbursementType(type) {
+  const t = normalizeReimbursementType(type);
+  if (t === FIN_REIMBURSEMENT_TYPE.TRAVEL) {
+    return APPROVAL_MODULE_KEYS.TRAVEL_REIMBURSE;
+  }
+  if (t === FIN_REIMBURSEMENT_TYPE.COST) {
+    return APPROVAL_MODULE_KEYS.COST_REIMBURSE;
+  }
+  return "";
+}
+
+/** 浼樺厛鎺ュ彛 reimbursementType锛屽叾娆¢〉闈� moduleKey / 鍏ュ弬 */
+export function resolveReimbursementType(raw, fallback) {
+  const fromApi = normalizeReimbursementType(raw?.reimbursementType);
+  if (fromApi) return fromApi;
+  return (
+    normalizeReimbursementType(fallback) ||
+    getReimbursementTypeByModuleKey(fallback) ||
+    ""
+  );
+}
+
+export function isTravelReimbursementType(type) {
+  return (
+    resolveReimbursementType({ reimbursementType: type }, type) ===
+    FIN_REIMBURSEMENT_TYPE.TRAVEL
+  );
+}
+
+export function filterRowsByReimbursementType(rows, expectedType) {
+  const expected = normalizeReimbursementType(expectedType);
+  if (!expected) return rows || [];
+  return (rows || []).filter((row) => {
+    const t = resolveReimbursementType(row, expected);
+    return t === expected;
+  });
+}
+
+export function getReimbursementTypeByModuleKey(moduleKey) {
+  if (moduleKey === APPROVAL_MODULE_KEYS.TRAVEL_REIMBURSE) {
+    return FIN_REIMBURSEMENT_TYPE.TRAVEL;
+  }
+  if (moduleKey === APPROVAL_MODULE_KEYS.COST_REIMBURSE) {
+    return FIN_REIMBURSEMENT_TYPE.COST;
+  }
+  return "";
+}
+
+export function unwrapFinReimbursementPage(res) {
+  const data = res?.data ?? res;
+  if (!data || typeof data !== "object") {
+    return { records: [], total: 0 };
+  }
+  if (Array.isArray(data.records)) {
+    return { records: data.records, total: Number(data.total ?? 0) };
+  }
+  const nested = data.data;
+  if (nested && typeof nested === "object" && Array.isArray(nested.records)) {
+    return { records: nested.records, total: Number(nested.total ?? 0) };
+  }
+  return { records: [], total: 0 };
+}
+
+/** 璇︽儏鎺ュ彛 data 瑙e寘 */
+export function unwrapFinReimbursementDetail(res) {
+  const data = res?.data ?? res;
+  if (!data || typeof data !== "object") return {};
+  if (data.billNo != null || data.id != null || data.reimbursementType != null) {
+    return data;
+  }
+  const nested = data.data;
+  if (nested && typeof nested === "object" && !Array.isArray(nested)) {
+    return nested;
+  }
+  if (data.finReimbursementDto && typeof data.finReimbursementDto === "object") {
+    return data.finReimbursementDto;
+  }
+  return data;
+}
+
+/** 璇︽儏鏌ヨ鍙傛暟锛坬uery finReimbursementDto锛� */
+export function buildFinReimbursementDetailParams(id) {
+  const raw = id?.id != null ? id.id : id;
+  const n = toNumber(raw);
+  return { finReimbursementDto: { id: n != null ? n : raw } };
+}
+
+/** 璇︽儏 DTO 鈫� 椤甸潰琛岋紙鎸� reimbursementType 鏄犲皠锛屽惈 tasks / storageBlobVOList锛� */
+export function mapFinReimbursementDetailRow(raw, reimbursementTypeOrModuleKey) {
+  const type = resolveReimbursementType(raw, reimbursementTypeOrModuleKey);
+  let mapped = {};
+  if (type === FIN_REIMBURSEMENT_TYPE.TRAVEL) {
+    mapped = mapTravelReimbursementRow(raw);
+  } else if (type === FIN_REIMBURSEMENT_TYPE.COST) {
+    mapped = mapCostReimbursementRow(raw);
+  } else {
+    mapped = raw || {};
+  }
+
+  let formApprovalFlowNodes = mapNodesToFormFlow(resolveRowApiNodes(raw));
+  if (!formApprovalFlowNodes.length && Array.isArray(raw?.tasks) && raw.tasks.length) {
+    formApprovalFlowNodes = mapNodesToFormFlow(mapTasksToFlowNodes(raw.tasks));
+  }
+
+  const enriched = applyFinReimbursementDetailEnrichment(mapped, raw);
+  return {
+    ...enriched,
+    approvalFlowNodes: formApprovalFlowNodes.length
+      ? formApprovalFlowNodes
+      : enriched.approvalFlowNodes,
+    reimbursementType: type,
+    reimbursementTypeLabel: reimbursementTypeLabel(type),
+    moduleKey: getModuleKeyByReimbursementType(type),
+  };
+}
+
+/** 鍗曟嵁鐘舵�� 鈫� 椤甸潰 approvalResult锛堝吋瀹� statusLabel锛� */
+export function mapBillStatusToApprovalResult(billStatus) {
+  const upper = String(billStatus ?? "").trim().toUpperCase();
+  if (upper === "DRAFT") return "draft";
+  if (upper === "IN_APPROVAL") return "pending";
+  if (upper === "APPROVED") return "approved";
+  if (upper === "REJECTED") return "rejected";
+  if (upper === "WITHDRAWN") return "cancelled";
+  if (upper === "PAID") return "paid";
+  return "pending";
+}
+
+function pickApplicantQuery(searchForm = {}) {
+  const kw = (searchForm.applicantKeyword || "").trim();
+  if (!kw) return {};
+  // 鍗犱綅銆屽鍚嶆垨缂栧彿銆嶏細濮撳悕璧� applicantName锛涚紪鍙峰彟浼� applicantCode
+  const out = { applicantName: kw };
+  if (!/[\u4e00-\u9fa5]/.test(kw)) {
+    out.applicantCode = kw;
+  }
+  return out;
+}
+
+/** 鏄惁瀛樺湪鍒楄〃绛涢�夋潯浠讹紙浠呯敵璇蜂汉锛� */
+export function hasActiveReimbursementSearch(searchForm = {}) {
+  return Boolean((searchForm?.applicantKeyword || "").trim());
+}
+
+/** 鏈嶅姟绔湭鐢熸晥鏃讹紝鎸夌敵璇蜂汉鍋氬墠绔厹搴曠瓫閫� */
+export function filterReimbursementRowsBySearch(rows, searchForm = {}) {
+  const list = Array.isArray(rows) ? rows : [];
+  const kw = (searchForm?.applicantKeyword || "").trim().toLowerCase();
+  if (!kw) return list;
+
+  return list.filter((row) => {
+    const parts = [
+      row.applicantName,
+      row.employeeName,
+      row.applicantNo,
+      row.applicantCode,
+      row.employeeNo,
+    ]
+      .filter((v) => v != null && v !== "")
+      .map((v) => String(v).toLowerCase());
+    return parts.some((p) => p.includes(kw));
+  });
+}
+
+/** 鎵佸钩鍖栦负 Spring GET 鍙粦瀹氱殑 query锛坒inReimbursementDto.xxx锛屽嬁鐢ㄦ柟鎷彿锛� */
+function appendDotNotationQuery(target, prefix, fields) {
+  if (!fields || typeof fields !== "object") return;
+  for (const [key, value] of Object.entries(fields)) {
+    if (value == null || value === "") continue;
+    target[`${prefix}.${key}`] = value;
+  }
+}
+
+/** 缁勮 listPage 鏌ヨ鍙傛暟锛堟墎骞� page.* / finReimbursementDto.*锛屼笌 detail 鎺ュ彛涓�鑷达級 */
+export function buildFinReimbursementListParams({
+  page,
+  searchForm,
+  reimbursementType,
+  extraDto = {},
+}) {
+  const dto = {
+    reimbursementType,
+    ...pickApplicantQuery(searchForm),
+    ...(extraDto && typeof extraDto === "object" ? extraDto : {}),
+  };
+
+  const params = {
+    current: page.current,
+    size: page.size,
+    "page.current": page.current,
+    "page.size": page.size,
+    ...dto,
+  };
+  appendDotNotationQuery(params, "finReimbursementDto", dto);
+  return params;
+}
+
+function pickTravelField(obj, keys) {
+  if (!obj || typeof obj !== "object") return "";
+  for (const key of keys) {
+    const v = obj[key];
+    if (v != null && v !== "") return v;
+  }
+  return "";
+}
+
+/** 鍏煎 list/detail 澶氱宸梾瀛愬璞$粨鏋� */
+export function pickTravelFromRow(row) {
+  if (!row || typeof row !== "object") return {};
+  const nested =
+    (row.travel && typeof row.travel === "object" ? row.travel : null) ||
+    row.finReimbursementTravel ||
+    row.finReimbursementTravelDto ||
+    row.travelDto ||
+    row.travelVO ||
+    {};
+  const src =
+    nested && typeof nested === "object" && Object.keys(nested).length
+      ? nested
+      : row;
+  return {
+    startTime: pickTravelField(src, [
+      "startTime",
+      "travelStartTime",
+      "startDate",
+      "travelStartDate",
+      "departureTime",
+    ]),
+    endTime: pickTravelField(src, [
+      "endTime",
+      "travelEndTime",
+      "endDate",
+      "travelEndDate",
+      "returnTime",
+    ]),
+    travelDays: src.travelDays,
+    departureCity: pickTravelField(src, [
+      "departureCity",
+      "departurePlace",
+      "departure",
+    ]),
+    destinationCity: pickTravelField(src, [
+      "destinationCity",
+      "destination",
+      "destinationPlace",
+    ]),
+    hotelStandard: src.hotelStandard,
+    lodgingDays: src.lodgingDays ?? src.hotelDays,
+    mealAllowance: src.mealAllowance ?? src.livingSubsidy,
+    transportAllowance: src.transportAllowance ?? src.transportSubsidy,
+    lodgingLimit: src.lodgingLimit,
+    withinStandard: src.withinStandard,
+    standardTag: src.standardTag || "",
+    id: src.id,
+    reimbursementId: src.reimbursementId,
+  };
+}
+
+/** 鍒楄〃/璇︽儏鏃堕棿灞曠ず锛圛SO 鈫� YYYY-MM-DD HH:mm:ss锛� */
+export function formatReimbursementDateTime(val) {
+  if (val == null || val === "") return "";
+  const d = dayjs(val);
+  if (!d.isValid()) return String(val);
+  const raw = String(val);
+  const hasTime = raw.includes("T") || /:\d{2}/.test(raw);
+  return hasTime ? d.format("YYYY-MM-DD HH:mm:ss") : d.format("YYYY-MM-DD");
+}
+
+/** 鎺ュ彛琛� 鈫� 宸梾鎶ラ攢鍒楄〃琛岋紙鍏煎 useTravelReimburse 瀛楁锛� */
+export function mapTravelReimbursementRow(row) {
+  if (!row) return {};
+  const travel = pickTravelFromRow(row);
+  const details = Array.isArray(row.details) ? row.details : [];
+
+  const base = {
+    ...row,
+    id: row.id,
+    reimbursementId: row.id,
+    approvalInstanceId: row.approvalInstanceId,
+    reimburseNo: row.billNo || "",
+    applicantId: row.applicantId,
+    applicantNo: row.applicantCode || "",
+    applicantName: row.applicantName || "",
+    employeeNo: row.applicantCode || "",
+    employeeName: row.applicantName || "",
+    applicantDeptName: row.applicantDeptName || "",
+    reimburseReason: row.reason || "",
+    travelStartTime: formatReimbursementDateTime(travel.startTime),
+    travelEndTime: formatReimbursementDateTime(travel.endTime),
+    travelDays: travel.travelDays,
+    departurePlace: travel.departureCity || "",
+    destination: travel.destinationCity || "",
+    hotelStandard: travel.hotelStandard,
+    hotelDays: travel.lodgingDays,
+    livingSubsidy: travel.mealAllowance,
+    transportSubsidy: travel.transportAllowance,
+    lodgingLimit: travel.lodgingLimit,
+    needSpecialApproval: travel.withinStandard === "0" || travel.withinStandard === 0,
+    standardTag: travel.standardTag || "",
+    applyAmount: row.applyAmount,
+    payee: row.payeeName || "",
+    payeeAccount: row.payeeAccount || "",
+    payeeBank: row.payeeBank || "",
+    billStatus: row.billStatus,
+    approvalResult: mapBillStatusToApprovalResult(row.billStatus),
+    createTime: formatReimbursementDateTime(row.createTime),
+    expenseDetails: details.map((d) => ({
+      ...d,
+      expenseSubject: d.expenseCategory,
+    })),
+    travel:
+      row.travel && typeof row.travel === "object" && Object.keys(row.travel).length
+        ? row.travel
+        : travel,
+    details,
+    nodes: resolveRowApiNodes(row),
+    approvalFlowNodes: mapNodesToFormFlow(resolveRowApiNodes(row)),
+    tasks: row.tasks || [],
+    approvalFlowSummary: buildApprovalFlowSummaryForRow(row),
+  };
+  return base;
+}
+
+/** 鎺ュ彛琛� 鈫� 璐圭敤鎶ラ攢鍒楄〃琛岋紙鍏煎 useCostReimburse 瀛楁锛� */
+export function mapCostReimbursementRow(row) {
+  if (!row) return {};
+  const details = Array.isArray(row.details) ? row.details : [];
+  const apiNodes = resolveRowApiNodes(row);
+  const approvalFlowNodes = mapNodesToFormFlow(apiNodes);
+
+  return {
+    ...row,
+    id: row.id,
+    reimbursementId: row.id,
+    approvalInstanceId: row.approvalInstanceId,
+    reimburseNo: row.billNo || "",
+    applicantId: row.applicantId,
+    applicantNo: row.applicantCode || "",
+    applicantName: row.applicantName || "",
+    employeeNo: row.applicantCode || "",
+    employeeName: row.applicantName || "",
+    applicantDeptName: row.applicantDeptName || "",
+    reimburseReason: row.reason || "",
+    expenseCategory: row.expenseType || "",
+    applyAmount: row.applyAmount,
+    applyTime: formatReimbursementDateTime(row.createTime),
+    payee: row.payeeName || "",
+    payeeAccount: row.payeeAccount || "",
+    bankBranch: row.payeeBank || "",
+    billStatus: row.billStatus,
+    approvalResult: mapBillStatusToApprovalResult(row.billStatus),
+    createTime: formatReimbursementDateTime(row.createTime),
+    expenseDetails: details.map((d) => ({
+      ...d,
+      expenseSubject: d.expenseCategory,
+    })),
+    details,
+    nodes: apiNodes,
+    approvalFlowNodes,
+    tasks: row.tasks || [],
+    approvalFlowSummary: buildApprovalFlowSummaryForRow({
+      ...row,
+      nodes: apiNodes,
+      approvalFlowNodes,
+    }),
+  };
+}
+
+function toNumber(val) {
+  if (val == null || val === "") return undefined;
+  const n = Number(val);
+  return Number.isNaN(n) ? undefined : n;
+}
+
+function expenseSubjectToCategory(subject) {
+  const hit = EXPENSE_SUBJECT_OPTIONS.find((x) => x.value === subject);
+  return hit?.label || subject || "";
+}
+
+function expenseCategoryToType(category) {
+  const hit = EXPENSE_CATEGORY_OPTIONS.find((x) => x.value === category);
+  return hit?.label || category || "";
+}
+
+/** 鍒楄〃/璇︽儏琛屼笂鐨勫鎵硅妭鐐癸紙listPage 甯镐笉杩斿洖锛岄渶璇︽儏琛ュ叏锛� */
+export function resolveRowApiNodes(row) {
+  if (!row || typeof row !== "object") return [];
+  const list =
+    row.nodes ||
+    row.flowNodes ||
+    row.approveNodes ||
+    row.finReimbursementNodes ||
+    row.nodeList ||
+    row.reimbursementNodeList ||
+    [];
+  return Array.isArray(list) ? list : [];
+}
+
+function sortFlowNodesByLevel(nodes = []) {
+  return [...(Array.isArray(nodes) ? nodes : [])].sort((a, b) => {
+    const la = Number(a?.levelNo ?? a?.nodeOrder ?? a?.sortOrder ?? 0);
+    const lb = Number(b?.levelNo ?? b?.nodeOrder ?? b?.sortOrder ?? 0);
+    return la - lb;
+  });
+}
+
+function formatApiNodeApproverLabel(node, index) {
+  if (!node || typeof node !== "object") return "";
+  const approvers = Array.isArray(node.approvers) ? node.approvers : [];
+  const names = approvers
+    .map((a) => (a?.approverName || "").trim())
+    .filter(Boolean);
+  if (names.length) return names.join("/");
+  return (node.approverName || "").trim() || `鑺傜偣${index + 1}`;
+}
+
+/** 鎺ュ彛 nodes 鈫� 椤甸潰瀹℃壒娴侊紙鍗曞鎵逛汉鑺傜偣锛� */
+export function mapNodesToFormFlow(nodes = []) {
+  return sortFlowNodesByLevel(nodes).map((n, i) => {
+    const approvers = Array.isArray(n.approvers) ? n.approvers : [];
+    const first = approvers[0] || null;
+    const names = approvers
+      .map((a) => (a?.approverName || "").trim())
+      .filter(Boolean);
+    return {
+      ...n,
+      nodeOrder: n.levelNo ?? n.nodeOrder ?? i + 1,
+      signMode: String(n.approveType || "").toUpperCase() === "OR" ? "or_sign" : "countersign",
+      approverId:
+        toNumber(first?.approverId ?? n.approverId) ??
+        first?.approverId ??
+        n.approverId ??
+        null,
+      approverName:
+        names.join("銆�") || first?.approverName || n.approverName || "",
+      nodeStatus: n.nodeStatus,
+    };
+  });
+}
+
+function formatTasksToFlowSummary(tasks = []) {
+  const list = sortFlowNodesByLevel(
+    (Array.isArray(tasks) ? tasks : []).map((t, i) => ({
+      levelNo: t.levelNo ?? t.taskLevel ?? i + 1,
+      approverName:
+        (t.approverName || t.operatorName || t.createUserName || "").trim() ||
+        "",
+    }))
+  );
+  const parts = list.map((t) => t.approverName).filter(Boolean);
+  return parts.length ? parts.join(" 鈫� ") : "";
+}
+
+function buildApprovalFlowSummaryForRow(row) {
+  const apiNodes = sortFlowNodesByLevel(resolveRowApiNodes(row));
+  let flowNodes =
+    row?.approvalFlowNodes?.length > 0
+      ? sortFlowNodesByLevel(row.approvalFlowNodes)
+      : mapNodesToFormFlow(apiNodes);
+
+  if (!flowNodes.length && apiNodes.length) {
+    const line = apiNodes
+      .map((n, i) => formatApiNodeApproverLabel(n, i))
+      .filter(Boolean)
+      .join(" 鈫� ");
+    if (line) return line;
+  }
+
+  if (!flowNodes.length) {
+    const fromTasks = formatTasksToFlowSummary(row?.tasks);
+    if (fromTasks) return fromTasks;
+    return "鈥�";
+  }
+
+  return flowNodes
+    .map((n, i) => {
+      const name = (n.approverName || "").trim() || `鑺傜偣${i + 1}`;
+      if (n.nodeStatus === "finish") return `${name}鉁揱;
+      if (n.nodeStatus === "error") return `${name}鉁梎;
+      if (n.nodeStatus === "process") return `${name}鈥;
+      return name;
+    })
+    .join(" 鈫� ");
+}
+
+/** 鍒楄〃銆屽鎵规祦绋嬨�嶅垪鏂囨 */
+export function formatApprovalFlowSummary(row) {
+  return buildApprovalFlowSummaryForRow(row);
+}
+
+/** listPage 甯镐笉甯﹀畬鏁� nodes锛屽垪琛ㄥ姞杞藉悗缁熶竴鎷夎鎯呰ˉ鍏ㄥ绾у鎵规祦绋� */
+export async function enrichReimbursementListRowsWithApprovalFlow(
+  rows,
+  reimbursementType
+) {
+  const list = Array.isArray(rows) ? rows : [];
+  if (!list.length) return list;
+
+  const needIds = list
+    .map((r) => resolveReimbursementDeleteId(r))
+    .filter((id) => id != null);
+
+  if (!needIds.length) return list;
+
+  const detailById = new Map();
+  await Promise.all(
+    needIds.map(async (id) => {
+      try {
+        const res = await getFinReimbursementDetail(id);
+        detailById.set(String(id), unwrapFinReimbursementDetail(res));
+      } catch {
+        /* 鍗曡澶辫触涓嶅奖鍝嶅垪琛� */
+      }
+    })
+  );
+
+  const mapRow =
+    reimbursementType === FIN_REIMBURSEMENT_TYPE.TRAVEL
+      ? mapTravelReimbursementRow
+      : mapCostReimbursementRow;
+
+  return list.map((row) => {
+    const id = resolveReimbursementDeleteId(row);
+    const detail = id != null ? detailById.get(String(id)) : null;
+    if (!detail) return row;
+    const merged = {
+      ...row,
+      ...detail,
+      id: row.id ?? detail.id,
+      reimbursementId: row.reimbursementId ?? row.id ?? detail.id,
+      reimbursementType: detail.reimbursementType ?? row.reimbursementType,
+    };
+    return mapRow(merged);
+  });
+}
+
+/** 琛ㄥ崟涓婄殑瀹℃壒娴侊紙鍏煎 approvalFlowNodes / nodes / flowNodes锛� */
+export function resolveFormApprovalFlowNodes(form) {
+  const list =
+    form?.approvalFlowNodes ?? form?.nodes ?? form?.flowNodes ?? [];
+  return Array.isArray(list) ? list : [];
+}
+
+/** 椤甸潰瀹℃壒鑺傜偣 鈫� 鎺ュ彛 nodes */
+export function mapApprovalFlowNodesToApi(nodes = [], templateId) {
+  const list = Array.isArray(nodes) ? nodes : [];
+  return list
+    .map((n, i) => {
+      let approvers = [];
+      if (Array.isArray(n.approvers) && n.approvers.length) {
+        approvers = n.approvers
+          .filter((a) => a?.approverId != null && a.approverId !== "")
+          .map((a, idx) => {
+            const item = {
+              approverId: toNumber(a.approverId) ?? a.approverId,
+              approverName: a.approverName || "",
+              sortNo: a.sortNo ?? idx + 1,
+            };
+            if (a.id != null) item.id = a.id;
+            if (a.nodeId != null) item.nodeId = a.nodeId;
+            if (a.templateId != null) item.templateId = a.templateId;
+            else if (templateId != null) item.templateId = templateId;
+            if (a.roleKey) item.roleKey = a.roleKey;
+            return item;
+          });
+      } else if (n.approverId != null && n.approverId !== "") {
+        const item = {
+          approverId: toNumber(n.approverId) ?? n.approverId,
+          approverName: n.approverName || "",
+          sortNo: 1,
+        };
+        if (n.roleKey) item.roleKey = n.roleKey;
+        approvers = [item];
+      }
+      if (!approvers.length) return null;
+
+      const node = {
+        levelNo: n.levelNo ?? n.nodeOrder ?? n.sortOrder ?? i + 1,
+        approveType: n.approveType || mapSignModeToApi(n.signMode),
+        approvers,
+      };
+      if (n.id != null) node.id = n.id;
+      if (n.templateId != null) node.templateId = n.templateId;
+      else if (templateId != null) node.templateId = templateId;
+      if (n.roleKey) node.roleKey = n.roleKey;
+      return node;
+    })
+    .filter(Boolean);
+}
+
+/** 淇濆瓨鍓嶆牎楠� nodes 宸查厤缃� */
+export function validateReimbursementApprovalNodes(dto) {
+  if (Array.isArray(dto?.nodes) && dto.nodes.length > 0) {
+    return { ok: true };
+  }
+  return { ok: false, message: "璇烽厤缃鎵规祦绋嬪苟閫夋嫨瀹℃壒浜�" };
+}
+
+function mapDetailsToApi(details = []) {
+  return (details || []).map((d, i) => {
+    const item = {
+      rowNo: d.rowNo ?? i + 1,
+      invoiceDate: d.invoiceDate || undefined,
+      expenseCategory: expenseSubjectToCategory(d.expenseSubject ?? d.expenseCategory),
+      amount: toNumber(d.amount),
+      description: d.description || "",
+      invoiceNo: d.invoiceNo || undefined,
+      invoiceType: d.invoiceType || undefined,
+      invoiceAmount: toNumber(d.invoiceAmount),
+      taxRate: toNumber(d.taxRate),
+      taxAmount: toNumber(d.taxAmount),
+      remark: d.remark || undefined,
+    };
+    if (d.id != null && !String(d.id).startsWith("ed_")) {
+      item.id = toNumber(d.id) ?? d.id;
+    }
+    if (d.reimbursementId != null) item.reimbursementId = toNumber(d.reimbursementId);
+    return item;
+  });
+}
+
+function sumDetailAmount(details = []) {
+  const sum = (details || []).reduce((s, d) => s + (Number(d.amount) || 0), 0);
+  return Math.round(sum * 100) / 100;
+}
+
+/** 琛ㄥ崟闄勪欢鍒楄〃锛堝吋瀹瑰绉嶅瓧娈靛悕锛� */
+export function resolveFormAttachmentList(form) {
+  const list =
+    form?.attachmentList ??
+    form?.storageBlobDTOs ??
+    form?.storageBlobVOList ??
+    form?.invoiceAttachments ??
+    [];
+  return Array.isArray(list) ? list : [];
+}
+
+/** 椤甸潰闄勪欢 鈫� 淇濆瓨 DTO锛坰torageBlobVOList / storageBlobDTOs锛� */
+export function mapFormAttachmentsToApi(list = [], reimbursementId) {
+  const rid =
+    reimbursementId != null
+      ? toNumber(reimbursementId) ?? reimbursementId
+      : undefined;
+
+  return (list || [])
+    .map((item, i) => {
+      if (!item) return null;
+      const url =
+        item.url ||
+        item.fileUrl ||
+        item.downloadUrl ||
+        item.downloadURL ||
+        item.previewUrl ||
+        item.previewURL ||
+        item.link ||
+        "";
+      const name =
+        item.fileName ||
+        item.originalFilename ||
+        item.originalFileName ||
+        item.blobName ||
+        item.name ||
+        `闄勪欢${i + 1}`;
+
+      const idRaw = item.id ?? item.blobId;
+      const isTempId =
+        idRaw != null &&
+        /^(inv_|att_|ed_|local_)/.test(String(idRaw));
+
+      if (!url && (idRaw == null || isTempId)) return null;
+
+      const blob = {
+        fileName: name,
+        originalFilename: name,
+        fileUrl: url || undefined,
+        url: url || undefined,
+      };
+
+      if (idRaw != null && !isTempId) {
+        const n = toNumber(idRaw);
+        blob.id = n != null ? n : idRaw;
+        blob.blobId = blob.id;
+      }
+      if (rid != null) blob.reimbursementId = rid;
+      return blob;
+    })
+    .filter(Boolean);
+}
+
+function applyStorageBlobsToSaveDto(dto, form) {
+  const blobs = mapFormAttachmentsToApi(
+    resolveFormAttachmentList(form),
+    dto?.id ?? form?.reimbursementId ?? form?.id
+  );
+  if (blobs.length) {
+    dto.storageBlobVOList = blobs;
+    dto.storageBlobDTOs = blobs;
+  }
+  return dto;
+}
+
+/** 淇敼鏃惰ˉ榻愪富琛ㄤ笌瀛愯〃鍏宠仈 ID */
+function applyReimbursementRelations(dto) {
+  const rid = dto?.id;
+  if (rid == null) return dto;
+  if (dto.travel && typeof dto.travel === "object") {
+    dto.travel.reimbursementId = rid;
+  }
+  if (Array.isArray(dto.details)) {
+    dto.details.forEach((d) => {
+      d.reimbursementId = rid;
+    });
+  }
+  const blobLists = [dto.storageBlobVOList, dto.storageBlobDTOs].filter(Array.isArray);
+  blobLists.forEach((list) => {
+    list.forEach((b) => {
+      b.reimbursementId = rid;
+    });
+  });
+  return dto;
+}
+
+function resolveReimbursementId(form) {
+  const rawId = form?.reimbursementId ?? form?.id;
+  if (rawId == null || rawId === "" || String(rawId).startsWith("local_")) {
+    return undefined;
+  }
+  return toNumber(rawId) ?? rawId;
+}
+
+/** 宸梾琛ㄥ崟 鈫� FinReimbursementDto */
+export function buildTravelReimbursementSaveDto(form, { computeTravelDays } = {}) {
+  const details = mapDetailsToApi(form.expenseDetails);
+  const detailTotal = sumDetailAmount(form.expenseDetails);
+  const applyAmount = toNumber(form.applyAmount) ?? detailTotal;
+  const travelDays =
+    form.travelDays != null
+      ? toNumber(form.travelDays)
+      : computeTravelDays?.(form.travelStartTime, form.travelEndTime);
+
+  const dto = {
+    reimbursementType: FIN_REIMBURSEMENT_TYPE.TRAVEL,
+    expenseType: "宸梾璐�",
+    applicantId: toNumber(form.applicantId),
+    applicantCode: form.employeeNo || form.applicantNo || "",
+    applicantName: form.employeeName || form.applicantName || "",
+    applicantDeptId: toNumber(form.applicantDeptId),
+    applicantDeptName: form.applicantDeptName || form.deptName || "",
+    reason: (form.reimburseReason || "").trim(),
+    applyAmount,
+    detailTotalAmount: detailTotal,
+    payeeName: form.payee || "",
+    payeeAccount: form.payeeAccount || undefined,
+    payeeBank: form.payeeBank || undefined,
+    billStatus: "IN_APPROVAL",
+    deptId: toNumber(form.deptId),
+    travel: {
+      startTime: form.travelStartTime || undefined,
+      endTime: form.travelEndTime || undefined,
+      travelDays,
+      departureCity: form.departurePlace || "",
+      destinationCity: form.destination || "",
+      hotelStandard: toNumber(form.hotelStandard),
+      lodgingDays: toNumber(form.hotelDays),
+      mealAllowance: toNumber(form.livingSubsidy),
+      transportAllowance: toNumber(form.transportSubsidy),
+      lodgingLimit: toNumber(form.lodgingLimit),
+      standardTag: form.standardTag || (form.needSpecialApproval ? "瓒呮爣鐗规壒" : "鍦ㄦ爣鍑嗚寖鍥村唴"),
+      withinStandard: form.needSpecialApproval ? "0" : "1",
+    },
+    details,
+    nodes: mapApprovalFlowNodesToApi(
+      resolveFormApprovalFlowNodes(form),
+      form.templateId
+    ),
+  };
+
+  const id = resolveReimbursementId(form);
+  if (id != null) dto.id = id;
+  if (form.billNo || form.reimburseNo) {
+    dto.billNo = form.billNo || form.reimburseNo;
+  }
+  if (form.approvalInstanceId != null) {
+    dto.approvalInstanceId = toNumber(form.approvalInstanceId);
+  }
+  if (form.approveProcessId != null) {
+    dto.approveProcessId = toNumber(form.approveProcessId);
+  }
+  if (form.travel?.id != null) dto.travel.id = toNumber(form.travel.id);
+
+  applyStorageBlobsToSaveDto(dto, form);
+  return applyReimbursementRelations(dto);
+}
+
+/** 璐圭敤琛ㄥ崟 鈫� FinReimbursementDto */
+export function buildCostReimbursementSaveDto(form) {
+  const details = mapDetailsToApi(form.expenseDetails);
+  const detailTotal = sumDetailAmount(form.expenseDetails);
+  const applyAmount = toNumber(form.applyAmount) ?? detailTotal;
+
+  const dto = {
+    reimbursementType: FIN_REIMBURSEMENT_TYPE.COST,
+    expenseType: expenseCategoryToType(form.expenseCategory),
+    applicantId: toNumber(form.applicantId),
+    applicantCode: form.employeeNo || form.applicantNo || "",
+    applicantName: form.employeeName || form.applicantName || "",
+    applicantDeptId: toNumber(form.applicantDeptId),
+    applicantDeptName: form.applicantDeptName || form.deptName || "",
+    reason: (form.reimburseReason || "").trim(),
+    applyAmount,
+    detailTotalAmount: detailTotal,
+    payeeName: form.payee || "",
+    payeeAccount: form.payeeAccount || "",
+    payeeBank: form.bankBranch || form.payeeBank || "",
+    billStatus: "IN_APPROVAL",
+    deptId: toNumber(form.deptId),
+    details,
+    nodes: mapApprovalFlowNodesToApi(
+      resolveFormApprovalFlowNodes(form),
+      form.templateId
+    ),
+  };
+
+  const id = resolveReimbursementId(form);
+  if (id != null) dto.id = id;
+  if (form.billNo || form.reimburseNo) {
+    dto.billNo = form.billNo || form.reimburseNo;
+  }
+  if (form.approvalInstanceId != null) {
+    dto.approvalInstanceId = toNumber(form.approvalInstanceId);
+  }
+  if (form.approveProcessId != null) {
+    dto.approveProcessId = toNumber(form.approveProcessId);
+  }
+
+  applyStorageBlobsToSaveDto(dto, form);
+  return applyReimbursementRelations(dto);
+}
+
+/** 鍒楄〃琛屼富閿紙鍒犻櫎/淇敼鐢� fin_reimbursement.id锛� */
+export function resolveReimbursementDeleteId(row) {
+  const raw = row?.reimbursementId ?? row?.id;
+  if (raw == null || raw === "" || String(raw).startsWith("local_")) {
+    return undefined;
+  }
+  const n = toNumber(raw);
+  return n != null ? n : raw;
+}
+
+/** 鏄惁鍏佽鍒犻櫎锛堝鎵逛腑銆佸凡閫氳繃銆佸凡浠樻涓嶅彲鍒狅級 */
+export function canDeleteReimbursementRow(row) {
+  const key = mapBillStatusToApprovalResult(
+    row?.billStatus ?? row?.approvalResult ?? row?.status
+  );
+  return key !== "pending" && key !== "approved" && key !== "paid";
+}
+
+/** 鏄惁鍏佽缂栬緫锛堜笌鍒犻櫎瑙勫垯涓�鑷达級 */
+export function canEditReimbursementRow(row) {
+  return canDeleteReimbursementRow(row);
+}
+
+/** 淇敼鍦烘櫙蹇呴』甯︿富閿� ID */
+export function validateReimbursementPersistDto(dto, isEdit) {
+  if (!isEdit) return { ok: true };
+  if (dto?.id != null && dto.id !== "") return { ok: true };
+  return { ok: false, message: "鏃犳硶淇敼锛氱己灏戞姤閿�鍗� ID" };
+}
diff --git a/src/views/officeProcessAutomation/ReimburseManage/shared/reimburseApproveBridge.js b/src/views/officeProcessAutomation/ReimburseManage/shared/reimburseApproveBridge.js
new file mode 100644
index 0000000..664d646
--- /dev/null
+++ b/src/views/officeProcessAutomation/ReimburseManage/shared/reimburseApproveBridge.js
@@ -0,0 +1,124 @@
+import { getFinReimbursementDetail } from "@/api/officeProcessAutomation/finReimbursement.js";
+import { matchBusinessTypeValue } from "../../ApproveManage/approve-list/approveListConstants.js";
+import {
+  APPROVAL_MODULE_KEYS,
+  getApprovalModuleConfig,
+} from "../../ApproveManage/approve-shared/approvalModuleRegistry.js";
+import {
+  getModuleKeyByReimbursementType,
+  mapFinReimbursementDetailRow,
+  resolveReimbursementType,
+  unwrapFinReimbursementDetail,
+} from "./finReimbursementMappers.js";
+
+export const REIMBURSE_EDIT_FROM_APPROVE_KEY = "oa_reimburse_edit_from_approve";
+
+const REIMBURSE_MODULE_KEYS = [
+  APPROVAL_MODULE_KEYS.TRAVEL_REIMBURSE,
+  APPROVAL_MODULE_KEYS.COST_REIMBURSE,
+];
+
+/** 瀹℃壒瀹炰緥鏄惁宸梾/璐圭敤鎶ラ攢 */
+export function inferReimburseModuleKeyFromInstance(row) {
+  if (!row) return "";
+  for (const moduleKey of REIMBURSE_MODULE_KEYS) {
+    const cfg = getApprovalModuleConfig(moduleKey);
+    if (!cfg) continue;
+    if (
+      cfg.businessType != null &&
+      cfg.businessType !== "" &&
+      matchBusinessTypeValue(row.businessType, cfg.businessType)
+    ) {
+      return moduleKey;
+    }
+    if (matchBusinessTypeValue(row.businessType, cfg.approvalType)) {
+      return moduleKey;
+    }
+    const text = `${row.templateName || ""}${row.title || ""}${row.businessName || ""}`;
+    if ((cfg.typeLabels || []).some((l) => l && text.includes(l))) {
+      return moduleKey;
+    }
+  }
+  return "";
+}
+
+export function isReimburseApprovalInstance(row) {
+  return Boolean(inferReimburseModuleKeyFromInstance(row));
+}
+
+/** 瀹℃壒瀹炰緥鍏宠仈鐨� fin_reimbursement.id */
+export function resolveFinReimbursementIdFromInstance(row) {
+  const raw = row?.businessId ?? row?.formPayload?.reimbursementId;
+  if (raw == null || raw === "") return undefined;
+  const n = Number(raw);
+  return Number.isNaN(n) ? raw : n;
+}
+
+/** 鎷夊彇鎶ラ攢璇︽儏骞舵槧灏勪负宸梾/璐圭敤椤甸潰琛岋紙浠ユ帴鍙� reimbursementType 涓哄噯锛� */
+export async function loadReimburseDetailForInstance(instanceRow, moduleKey) {
+  const mk = moduleKey || inferReimburseModuleKeyFromInstance(instanceRow);
+  const id = resolveFinReimbursementIdFromInstance(instanceRow);
+  if (id == null) {
+    throw new Error("missing reimbursement id");
+  }
+  const res = await getFinReimbursementDetail(id);
+  const raw = unwrapFinReimbursementDetail(res);
+  const reimburseRow = mapFinReimbursementDetailRow(raw, mk);
+  const reimbursementType = resolveReimbursementType(raw, mk);
+  const resolvedMk =
+    getModuleKeyByReimbursementType(reimbursementType) || mk;
+  return {
+    reimburseRow,
+    instanceRow,
+    moduleKey: resolvedMk,
+    reimbursementType,
+  };
+}
+
+export function stashReimburseEditFromApprove(moduleKey, reimbursementId) {
+  sessionStorage.setItem(
+    REIMBURSE_EDIT_FROM_APPROVE_KEY,
+    JSON.stringify({ moduleKey, reimbursementId })
+  );
+}
+
+export function consumeReimburseEditFromApprove() {
+  const raw = sessionStorage.getItem(REIMBURSE_EDIT_FROM_APPROVE_KEY);
+  if (!raw) return null;
+  sessionStorage.removeItem(REIMBURSE_EDIT_FROM_APPROVE_KEY);
+  try {
+    return JSON.parse(raw);
+  } catch {
+    return null;
+  }
+}
+
+/** 浠庡凡娉ㄥ唽璺敱瑙f瀽宸梾/璐圭敤鎶ラ攢鑿滃崟 path锛堥伩鍏嶅啓姝� path 瀵艰嚧 404锛� */
+export function resolveReimburseManageRoutePath(router, moduleKey) {
+  if (!router?.getRoutes) return "";
+  const needle =
+    moduleKey === APPROVAL_MODULE_KEYS.TRAVEL_REIMBURSE
+      ? "travel-reimburse"
+      : moduleKey === APPROVAL_MODULE_KEYS.COST_REIMBURSE
+        ? "cost-reimburse"
+        : "";
+  if (!needle) return "";
+  const labelHint =
+    moduleKey === APPROVAL_MODULE_KEYS.TRAVEL_REIMBURSE ? "宸梾" : "璐圭敤";
+  const hit = router.getRoutes().find((r) => {
+    const path = r.path || "";
+    if (path.includes(needle)) return true;
+    const title = r.meta?.title || "";
+    return title.includes(labelHint) && title.includes("鎶ラ攢");
+  });
+  return hit?.path || "";
+}
+
+export async function navigateToReimburseManageForEdit(router, moduleKey, reimbursementId) {
+  stashReimburseEditFromApprove(moduleKey, reimbursementId);
+  const path = resolveReimburseManageRoutePath(router, moduleKey);
+  if (!path) {
+    throw new Error("route not found");
+  }
+  await router.push(path);
+}
diff --git a/src/views/officeProcessAutomation/ReimburseManage/travel-reimburse/components/ApprovalFlowProgress.vue b/src/views/officeProcessAutomation/ReimburseManage/travel-reimburse/components/ApprovalFlowProgress.vue
new file mode 100644
index 0000000..03a5fa3
--- /dev/null
+++ b/src/views/officeProcessAutomation/ReimburseManage/travel-reimburse/components/ApprovalFlowProgress.vue
@@ -0,0 +1,49 @@
+<!-- 宸梾鎶ラ攢锛氬鎵规祦绋嬭繘搴﹀睍绀� -->
+<template>
+  <el-steps :active="activeStep" finish-status="success" align-center>
+    <el-step
+      v-for="(node, index) in sortedNodes"
+      :key="index"
+      :title="`鑺傜偣 ${index + 1}`"
+      :description="stepDescription(node)"
+      :status="stepStatus(node, index)"
+    />
+  </el-steps>
+</template>
+
+<script setup>
+import { computed } from "vue";
+
+const props = defineProps({
+  nodes: { type: Array, default: () => [] },
+  currentIndex: { type: Number, default: 0 },
+});
+
+const sortedNodes = computed(() => {
+  const list = props.nodes || [];
+  return [...list].sort((a, b) => (a.sortOrder ?? a.nodeOrder ?? 0) - (b.sortOrder ?? b.nodeOrder ?? 0));
+});
+
+const activeStep = computed(() => {
+  const list = sortedNodes.value;
+  if (!list.length) return 0;
+  const finished = list.filter((n) => n.nodeStatus === "finish").length;
+  const hasError = list.some((n) => n.nodeStatus === "error");
+  if (hasError) return Math.max(0, props.currentIndex);
+  return finished;
+});
+
+function stepDescription(node) {
+  const name = (node.approverName || "").trim() || "鏈寚瀹�";
+  const opinion = (node.approveOpinion || "").trim();
+  if (opinion) return `${name}锛�${opinion}`;
+  return name;
+}
+
+function stepStatus(node, index) {
+  if (node.nodeStatus === "error") return "error";
+  if (node.nodeStatus === "finish") return "success";
+  if (node.nodeStatus === "process" || index === props.currentIndex) return "process";
+  return "wait";
+}
+</script>
diff --git a/src/views/officeProcessAutomation/ReimburseManage/travel-reimburse/components/DetailPanel.vue b/src/views/officeProcessAutomation/ReimburseManage/travel-reimburse/components/DetailPanel.vue
new file mode 100644
index 0000000..2c1d8a4
--- /dev/null
+++ b/src/views/officeProcessAutomation/ReimburseManage/travel-reimburse/components/DetailPanel.vue
@@ -0,0 +1,82 @@
+<!-- 宸梾鎶ラ攢锛氳鎯呭彧璇婚潰鏉� -->
+<template>
+  <el-descriptions :column="2" border>
+    <el-descriptions-item label="鎶ラ攢鍗曞彿">{{ row.reimburseNo || "鈥�" }}</el-descriptions-item>
+    <el-descriptions-item label="鐘舵��">
+      <el-tag :type="statusTagType(row.approvalResult)" size="small">{{ statusLabel(row.approvalResult) }}</el-tag>
+    </el-descriptions-item>
+    <el-descriptions-item label="鍛樺伐缂栧彿">{{ row.employeeNo || row.applicantNo || "鈥�" }}</el-descriptions-item>
+    <el-descriptions-item label="鍛樺伐濮撳悕">{{ row.employeeName || row.applicantName || "鈥�" }}</el-descriptions-item>
+    <el-descriptions-item label="鎶ラ攢鍘熷洜" :span="2">{{ row.reimburseReason || "鈥�" }}</el-descriptions-item>
+    <el-descriptions-item label="鍑哄樊寮�濮�">{{ row.travelStartTime || "鈥�" }}</el-descriptions-item>
+    <el-descriptions-item label="鍑哄樊缁撴潫">{{ row.travelEndTime || "鈥�" }}</el-descriptions-item>
+    <el-descriptions-item label="鍑哄樊鍦�">{{ row.departurePlace || "鈥�" }}</el-descriptions-item>
+    <el-descriptions-item label="鐩殑鍦�">{{ row.destination || "鈥�" }}</el-descriptions-item>
+    <el-descriptions-item label="閰掑簵鏍囧噯">{{ row.hotelStandard != null ? `${row.hotelStandard} 鍏�/鏅歚 : "鈥�" }}</el-descriptions-item>
+    <el-descriptions-item label="浣忓澶╂暟">{{ row.hotelDays ?? "鈥�" }}</el-descriptions-item>
+    <el-descriptions-item label="鐢熸椿琛ヨ创">{{ row.livingSubsidy != null ? `${row.livingSubsidy} 鍏僠 : "鈥�" }}</el-descriptions-item>
+    <el-descriptions-item label="鐢宠閲戦">{{ row.applyAmount != null ? `${row.applyAmount} 鍏僠 : "鈥�" }}</el-descriptions-item>
+    <el-descriptions-item label="鏀舵浜�">{{ row.payee || "鈥�" }}</el-descriptions-item>
+    <el-descriptions-item label="鐗规壒">
+      <el-tag :type="row.needSpecialApproval ? 'danger' : 'info'" size="small">
+        {{ row.needSpecialApproval ? "瓒呮敮闇�鐗规壒" : "鏍囧噯鍐�" }}
+      </el-tag>
+    </el-descriptions-item>
+    <el-descriptions-item v-if="row.rejectReason" label="椹冲洖鍘熷洜" :span="2">
+      <span class="reject-text">{{ row.rejectReason }}</span>
+    </el-descriptions-item>
+    <el-descriptions-item label="鍒涘缓鏃堕棿" :span="2">{{ row.createTime || "鈥�" }}</el-descriptions-item>
+  </el-descriptions>
+
+  <el-divider content-position="left">鎶ラ攢鏄庣粏</el-divider>
+  <el-table v-if="row.expenseDetails?.length" :data="row.expenseDetails" border size="small">
+    <el-table-column type="index" label="搴忓彿" width="55" align="center" />
+    <el-table-column prop="invoiceDate" label="鍙戠エ鏃ユ湡" width="120" />
+    <el-table-column label="璐圭敤绉戠洰" width="100">
+      <template #default="{ row: d }">{{ expenseSubjectLabel(d.expenseSubject) }}</template>
+    </el-table-column>
+    <el-table-column prop="amount" label="閲戦" width="100" />
+    <el-table-column prop="description" label="鎻忚堪" min-width="140" show-overflow-tooltip />
+  </el-table>
+  <el-empty v-else description="鏆傛棤鏄庣粏" :image-size="48" />
+
+  <el-divider content-position="left">鍙戠エ闄勪欢</el-divider>
+  <template v-if="attachmentFiles.length">
+    <el-tag v-for="(f, i) in attachmentFiles" :key="i" class="file-tag" type="info" @click="openFile(f)">
+      {{ f.name }}
+    </el-tag>
+  </template>
+  <el-empty v-else description="鏆傛棤闄勪欢" :image-size="48" />
+</template>
+
+<script setup>
+import { computed } from "vue";
+import { expenseSubjectLabel, statusLabel, statusTagType } from "../travelReimburseUtils.js";
+
+const props = defineProps({
+  row: { type: Object, default: () => ({}) },
+});
+
+const attachmentFiles = computed(() => {
+  const list =
+    props.row?.attachmentList ||
+    props.row?.storageBlobVOList ||
+    props.row?.invoiceAttachments;
+  return Array.isArray(list) ? list : [];
+});
+
+function openFile(f) {
+  const url = f?.url || f?.downloadURL || f?.previewURL;
+  if (url) window.open(url, "_blank");
+}
+</script>
+
+<style scoped>
+.reject-text {
+  color: var(--el-color-danger);
+}
+.file-tag {
+  margin: 0 8px 8px 0;
+  cursor: pointer;
+}
+</style>
diff --git a/src/views/officeProcessAutomation/ReimburseManage/travel-reimburse/index.vue b/src/views/officeProcessAutomation/ReimburseManage/travel-reimburse/index.vue
new file mode 100644
index 0000000..17737e3
--- /dev/null
+++ b/src/views/officeProcessAutomation/ReimburseManage/travel-reimburse/index.vue
@@ -0,0 +1,614 @@
+<!--OA妯″潡锛氬樊鏃呮姤閿�锛堝垪琛� /finReimbursement/listPage锛宺eimbursementType=1锛�-->
+<template>
+  <div class="app-container">
+    <div class="search_form mb20">
+      <div>
+        <span class="search_title">鐢宠浜猴細</span>
+        <el-input
+          v-model="searchForm.applicantKeyword"
+          style="width: 220px"
+          placeholder="濮撳悕鎴栫紪鍙�"
+          clearable
+          :prefix-icon="Search"
+          @keyup.enter="handleQuery"
+        />
+        <el-button type="primary" style="margin-left: 10px" @click="handleQuery">鎼滅储</el-button>
+        <el-button @click="resetSearch">閲嶇疆</el-button>
+      </div>
+      <div class="search_actions">
+        <el-button type="success" plain @click="handleImportClick">瀵煎叆</el-button>
+        <el-button type="warning" plain @click="handleExport">瀵煎嚭</el-button>
+        <el-button type="primary" @click="openFormDialog('add')">鏂板宸梾鎶ラ攢</el-button>
+      </div>
+    </div>
+
+    <input ref="importInputRef" type="file" accept="application/json,.json" class="sr-only-input" @change="onImportFile" />
+
+    <div class="table_list">
+      <PIMTable
+        rowKey="id"
+        :column="tableColumn"
+        :tableData="tableData"
+        :page="page"
+        :isSelection="false"
+        :tableLoading="tableLoading"
+        :total="page.total"
+        @pagination="pagination"
+      />
+    </div>
+
+    <!-- 鏂板 / 缂栬緫 -->
+    <el-dialog
+      v-model="formDialog.visible"
+      :title="formDialog.title"
+      width="1120px"
+      append-to-body
+      destroy-on-close
+      class="travel-reimburse-form-dialog"
+      @closed="onFormClosed"
+    >
+      <el-alert
+        v-if="budgetHint.visible"
+        :title="budgetHint.title"
+        :type="budgetHint.type"
+        :description="budgetHint.description"
+        show-icon
+        :closable="false"
+        class="mb16"
+      />
+      <el-alert v-if="overBudgetWarnings.length" type="warning" show-icon :closable="false" class="mb16">
+        <template #title>宸梾鏍囧噯瓒呮敮鎻愰啋锛堥渶鐗规壒锛�</template>
+        <ul class="warn-list">
+          <li v-for="(w, i) in overBudgetWarnings" :key="i">{{ w }}</li>
+        </ul>
+      </el-alert>
+
+      <el-form
+        ref="formRef"
+        :model="form"
+        :rules="formRules"
+        label-width="120px"
+        class="travel-reimburse-form"
+        :disabled="formDialog.readonly"
+      >
+        <el-card class="form-section" shadow="never">
+          <template #header><span class="card-header-title">鍩烘湰淇℃伅</span></template>
+          <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="鍛樺伐缂栧彿">
+              <el-input v-model="form.employeeNo" readonly placeholder="閫夋嫨鍛樺伐鍚庤嚜鍔ㄥ甫鍑�" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鍛樺伐濮撳悕" prop="applicantId">
+              <el-select
+                v-model="form.applicantId"
+                filterable
+                remote
+                clearable
+                reserve-keyword
+                placeholder="璇烽�夋嫨鎴栨悳绱㈠憳宸�"
+                style="width: 100%"
+                :remote-method="remoteSearchApplicantForm"
+                :loading="applicantFormSearchLoading"
+                @change="onApplicantChange"
+              >
+                <el-option
+                  v-for="u in applicantFormOptions"
+                  :key="u.userId"
+                  :label="userSelectLabel(u)"
+                  :value="u.userId"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="24">
+            <el-form-item label="鎶ラ攢鍘熷洜" prop="reimburseReason">
+              <el-input
+                v-model="form.reimburseReason"
+                type="textarea"
+                :rows="3"
+                placeholder="璇峰~鍐欏嚭宸強鎶ラ攢鍘熷洜"
+                maxlength="2000"
+                show-word-limit
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="鍑哄樊寮�濮�" prop="travelStartTime">
+              <el-date-picker
+                v-model="form.travelStartTime"
+                type="datetime"
+                placeholder="寮�濮嬫椂闂�"
+                format="YYYY-MM-DD HH:mm:ss"
+                value-format="YYYY-MM-DD HH:mm:ss"
+                style="width: 100%"
+                @change="onTravelRangeChange"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鍑哄樊缁撴潫" prop="travelEndTime">
+              <el-date-picker
+                v-model="form.travelEndTime"
+                type="datetime"
+                placeholder="缁撴潫鏃堕棿"
+                format="YYYY-MM-DD HH:mm:ss"
+                value-format="YYYY-MM-DD HH:mm:ss"
+                style="width: 100%"
+                @change="onTravelRangeChange"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="8">
+            <el-form-item label="鍑哄樊澶╂暟">
+              <el-input :model-value="travelDaysDisplay" readonly>
+                <template #append>澶�</template>
+              </el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="鍑哄樊鍦�" prop="departurePlace">
+              <el-input v-model="form.departurePlace" placeholder="鍑哄彂鍩庡競" @blur="recalcTravelStandards" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="鐩殑鍦�" prop="destination">
+              <el-input v-model="form.destination" placeholder="鐩殑鍩庡競" @blur="recalcTravelStandards" />
+            </el-form-item>
+          </el-col>
+          </el-row>
+        </el-card>
+
+        <el-card class="form-section" shadow="never">
+          <template #header>
+            <div class="card-header-row">
+              <span class="card-header-title">宸梾鏍囧噯</span>
+              <el-text type="info" size="small">{{ travelTierLabel }} 路 鐢熸椿琛ヨ创寤鸿 {{ suggestedLivingSubsidy }} 鍏�</el-text>
+            </div>
+          </template>
+          <el-row :gutter="20">
+            <el-col :span="8">
+              <el-form-item label="閰掑簵鏍囧噯">
+              <el-input-number
+                v-model="form.hotelStandard"
+                :min="0"
+                :precision="2"
+                controls-position="right"
+                style="width: 100%"
+                @change="recalcTravelStandards"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="浣忓澶╂暟">
+              <el-input-number
+                v-model="form.hotelDays"
+                :min="0"
+                :max="365"
+                :precision="0"
+                controls-position="right"
+                style="width: 100%"
+                @change="recalcTravelStandards"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="鐢熸椿琛ヨ创">
+              <el-input-number
+                v-model="form.livingSubsidy"
+                :min="0"
+                :precision="2"
+                controls-position="right"
+                style="width: 100%"
+                @change="recalcTravelStandards"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+          <el-row :gutter="20">
+            <el-col :span="8">
+              <el-form-item label="浜ら�氳ˉ璐�">
+                <el-input :model-value="String(suggestedTransportSubsidy)" readonly><template #append>鍏�</template></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="浣忓闄愰">
+                <el-input :model-value="String(suggestedHotelLimit)" readonly><template #append>鍏�</template></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="鐗规壒鏍囪">
+                <el-tag :type="form.needSpecialApproval ? 'danger' : 'success'" effect="plain">
+                  {{ form.needSpecialApproval ? "瓒呮敮闇�鐗规壒" : "鍦ㄦ爣鍑嗚寖鍥村唴" }}
+                </el-tag>
+              </el-form-item>
+            </el-col>
+          </el-row>
+        </el-card>
+
+        <el-card class="form-section" shadow="never">
+          <template #header><span class="card-header-title">閲戦涓庢敹娆�</span></template>
+          <el-row :gutter="20">
+            <el-col :span="12">
+              <el-form-item label="鐢宠閲戦" prop="applyAmount">
+                <div class="amount-row">
+                  <el-input-number v-model="form.applyAmount" :min="0" :precision="2" controls-position="right" class="amount-input" />
+                  <el-button v-if="!formDialog.readonly" type="primary" link @click="syncApplyAmountFromDetails">
+                    鎸夋槑缁嗘眹鎬� {{ detailTotalAmount }} 鍏�
+                  </el-button>
+                </div>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="鏀舵浜�" prop="payee">
+                <el-input v-model="form.payee" placeholder="璇疯緭鍏ユ敹娆句汉" maxlength="50" />
+              </el-form-item>
+            </el-col>
+          </el-row>
+        </el-card>
+
+        <el-card class="form-section" shadow="never">
+          <template #header>
+            <div class="card-header-row">
+              <span class="card-header-title">鎶ラ攢鏄庣粏</span>
+              <el-button v-if="!formDialog.readonly" type="primary" plain size="small" @click="addExpenseDetail">鏂板鏄庣粏</el-button>
+            </div>
+          </template>
+
+        <el-table :data="form.expenseDetails" border size="small" class="detail-table">
+          <el-table-column type="index" label="搴忓彿" width="55" align="center" />
+          <el-table-column label="鍙戠エ鏃ユ湡" width="150">
+            <template #default="{ row }">
+              <el-date-picker
+                v-if="!formDialog.readonly"
+                v-model="row.invoiceDate"
+                type="date"
+                value-format="YYYY-MM-DD"
+                size="small"
+                style="width: 100%"
+              />
+              <span v-else>{{ row.invoiceDate || "鈥�" }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="璐圭敤绉戠洰" width="130">
+            <template #default="{ row }">
+              <el-select
+                v-if="!formDialog.readonly"
+                v-model="row.expenseSubject"
+                size="small"
+                style="width: 100%"
+                @change="recalcTravelStandards"
+              >
+                <el-option
+                  v-for="opt in EXPENSE_SUBJECT_OPTIONS"
+                  :key="opt.value"
+                  :label="opt.label"
+                  :value="opt.value"
+                />
+              </el-select>
+              <span v-else>{{ expenseSubjectLabel(row.expenseSubject) }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="閲戦" width="120">
+            <template #default="{ row }">
+              <el-input-number
+                v-if="!formDialog.readonly"
+                v-model="row.amount"
+                :min="0"
+                :precision="2"
+                size="small"
+                controls-position="right"
+                style="width: 100%"
+                @change="onDetailAmountChange"
+              />
+              <span v-else>{{ row.amount ?? "鈥�" }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="鎻忚堪" min-width="140">
+            <template #default="{ row }">
+              <el-input v-if="!formDialog.readonly" v-model="row.description" size="small" placeholder="璇存槑" />
+              <span v-else>{{ row.description || "鈥�" }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column v-if="!formDialog.readonly" label="鎿嶄綔" width="70" align="center">
+            <template #default="{ $index }">
+              <el-button type="danger" link size="small" @click="removeExpenseDetail($index)">鍒犻櫎</el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+        </el-card>
+
+        <el-card class="form-section" shadow="never">
+          <template #header><span class="card-header-title">闄勪欢锛堝彂绁級</span></template>
+          <el-form-item label-width="0" class="attachment-form-item">
+            <div class="upload-block">
+              <FileUpload v-model:file-list="form.attachmentList" :limit="20" button-text="鐐瑰嚮閫夋嫨鏂囦欢" />
+            </div>
+          </el-form-item>
+        </el-card>
+
+        <el-card class="form-section" shadow="never">
+          <template #header><span class="card-header-title">瀹℃壒娴佺▼</span></template>
+          <el-form-item prop="approvalFlowNodes" label-width="0">
+          <ApprovalFlowEditor
+            v-if="!formDialog.readonly"
+            v-model="form.approvalFlowNodes"
+            :user-options="flowUserOptions"
+            @update:model-value="onApprovalFlowChange"
+          />
+          <ApprovalFlowProgress v-else :nodes="form.approvalFlowNodes" :current-index="form.currentNodeIndex" />
+          <p v-if="!formDialog.readonly" class="flow-tip">鑷冲皯淇濈暀涓�涓妭鐐癸紱瀹℃牳涓�佸凡閫氳繃鐨勫崟鎹笉鍙紪杈戙��</p>
+        </el-form-item>
+        </el-card>
+      </el-form>
+      <template #footer>
+        <el-button
+          v-if="!formDialog.readonly"
+          type="primary"
+          :loading="submitSaving"
+          @click="submitForm"
+        >
+          鎻� 浜�
+        </el-button>
+        <el-button @click="formDialog.visible = false">{{ formDialog.readonly ? "鍏� 闂�" : "鍙� 娑�" }}</el-button>
+      </template>
+    </el-dialog>
+
+    <!-- 璇︽儏 -->
+    <el-dialog v-model="detailDialog.visible" title="宸梾鎶ラ攢璇︽儏" width="900px" append-to-body destroy-on-close>
+      <div v-loading="detailLoading">
+      <DetailPanel :row="detailRow" />
+      <ApprovalFlowProgress
+        class="mt16"
+        :nodes="detailRow.approvalFlowProgressNodes ?? detailRow.approvalFlowNodes"
+        :current-index="detailRow.currentNodeIndex ?? 0"
+      />
+      <el-divider content-position="left">瀹℃壒璁板綍锛堝叏娴佺▼鐣欑棔锛�</el-divider>
+      <el-timeline v-if="detailRow.approvalRecords?.length">
+        <el-timeline-item
+          v-for="(rec, i) in detailRow.approvalRecords"
+          :key="i"
+          :type="rec.result === 'approved' ? 'success' : rec.result === 'rejected' ? 'danger' : 'primary'"
+          :timestamp="rec.time"
+        >
+          {{ rec.operatorName }} 鈥� {{ approvalActionLabel(rec.result) }}锛歿{ rec.opinion || "鏃犳剰瑙�" }}
+        </el-timeline-item>
+      </el-timeline>
+      <el-empty v-else description="鏆傛棤瀹℃壒璁板綍" :image-size="60" />
+      </div>
+      <template #footer>
+        <el-button type="primary" @click="detailDialog.visible = false">鍏� 闂�</el-button>
+      </template>
+    </el-dialog>
+
+    <!-- 瀹℃壒 -->
+    <el-dialog
+      v-model="approveDialog.visible"
+      title="宸梾鎶ラ攢瀹℃壒"
+      width="1000px"
+      append-to-body
+      destroy-on-close
+      @closed="approveOpinion = ''"
+    >
+      <DetailPanel :row="approveDialog.row" />
+      <el-divider content-position="left">娴佺▼杩涘害</el-divider>
+      <ApprovalFlowProgress
+        :nodes="approveDialog.row?.approvalFlowProgressNodes ?? approveDialog.row?.approvalFlowNodes"
+        :current-index="approveDialog.row?.currentNodeIndex ?? 0"
+      />
+      <el-form label-width="100px" class="mt16">
+        <el-form-item label="瀹℃壒鎰忚">
+          <el-input
+            v-model="approveOpinion"
+            type="textarea"
+            :rows="3"
+            maxlength="500"
+            show-word-limit
+            placeholder="閫氳繃鍙暀绌猴紱椹冲洖璇峰~鍐欏師鍥�"
+          />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <el-button type="success" @click="submitApprove('approved')">閫� 杩�</el-button>
+        <el-button type="danger" @click="submitApprove('rejected')">椹� 鍥�</el-button>
+        <el-button @click="approveDialog.visible = false">鍙� 娑�</el-button>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup>
+import FileUpload from "@/components/AttachmentUpload/file/index.vue";
+import ApprovalFlowEditor from "@/views/officeProcessAutomation/AttendManage/overtime-apply/components/ApprovalFlowEditor.vue";
+import ApprovalFlowProgress from "./components/ApprovalFlowProgress.vue";
+import DetailPanel from "./components/DetailPanel.vue";
+import { useTravelReimburse } from "./useTravelReimburse.js";
+
+const tr = useTravelReimburse();
+const {
+  Search,
+  EXPENSE_SUBJECT_OPTIONS,
+  expenseSubjectLabel,
+  searchForm,
+  tableLoading,
+  page,
+  tableData,
+  tableColumn,
+  importInputRef,
+  formRef,
+  form,
+  formDialog,
+  formRules,
+  detailDialog,
+  detailLoading,
+  detailRow,
+  approveDialog,
+  approveOpinion,
+  applicantFormSearchLoading,
+  applicantFormOptions,
+  flowUserOptions,
+  travelDaysDisplay,
+  travelTierLabel,
+  suggestedLivingSubsidy,
+  suggestedTransportSubsidy,
+  suggestedHotelLimit,
+  detailTotalAmount,
+  overBudgetWarnings,
+  budgetHint,
+  handleQuery,
+  resetSearch,
+  pagination,
+  remoteSearchApplicantForm,
+  userSelectLabel,
+  onApplicantChange,
+  recalcTravelStandards,
+  onTravelRangeChange,
+  onDetailAmountChange,
+  onApprovalFlowChange,
+  addExpenseDetail,
+  removeExpenseDetail,
+  syncApplyAmountFromDetails,
+  openFormDialog,
+  onFormClosed,
+  submitForm,
+  submitSaving,
+  openDetail,
+  approvalActionLabel,
+  submitApprove,
+  handleExport,
+  handleImportClick,
+  onImportFile,
+} = tr;
+</script>
+
+<style scoped>
+.mb20 {
+  margin-bottom: 20px;
+}
+.mb16 {
+  margin-bottom: 16px;
+}
+.mb8 {
+  margin-bottom: 8px;
+}
+.mt16 {
+  margin-top: 16px;
+}
+.search_form {
+  display: flex;
+  flex-wrap: wrap;
+  align-items: center;
+  justify-content: space-between;
+  gap: 12px;
+}
+.search_actions {
+  display: flex;
+  flex-wrap: wrap;
+  gap: 8px;
+}
+.search_title {
+  font-size: 14px;
+  color: var(--el-text-color-regular);
+}
+.sr-only-input {
+  position: absolute;
+  width: 1px;
+  height: 1px;
+  padding: 0;
+  margin: -1px;
+  overflow: hidden;
+  clip: rect(0, 0, 0, 0);
+  white-space: nowrap;
+  border: 0;
+}
+.form-section {
+  margin-bottom: 16px;
+  border: 1px solid var(--el-border-color-lighter);
+}
+.form-section :deep(.el-card__header) {
+  padding: 12px 16px;
+  background: var(--el-fill-color-lighter);
+}
+.form-section :deep(.el-card__body) {
+  padding: 16px 16px 4px;
+}
+.card-header-title {
+  font-size: 15px;
+  font-weight: 600;
+}
+.card-header-row {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  gap: 12px;
+}
+.amount-row {
+  display: flex;
+  align-items: center;
+  gap: 12px;
+  width: 100%;
+}
+.amount-input {
+  flex: 1;
+  min-width: 160px;
+}
+.w-full {
+  width: 100%;
+}
+.attachment-form-item {
+  margin-bottom: 0;
+}
+.detail-table {
+  margin-bottom: 0;
+}
+.section-title {
+  font-size: 15px;
+  font-weight: 600;
+  margin: 8px 0 12px;
+  color: var(--el-text-color-primary);
+  border-left: 3px solid var(--el-color-primary);
+  padding-left: 8px;
+}
+.field-tip {
+  font-size: 12px;
+  color: var(--el-text-color-secondary);
+  margin-top: 4px;
+}
+.warn-list {
+  margin: 0;
+  padding-left: 18px;
+}
+.detail-toolbar {
+  margin-bottom: 8px;
+}
+.upload-block {
+  width: 100%;
+}
+.flow-tip {
+  font-size: 12px;
+  color: var(--el-text-color-secondary);
+  margin-top: 8px;
+}
+.sync-btn {
+  margin-top: 4px;
+}
+.travel-reimburse-form-dialog :deep(.el-dialog__body) {
+  padding-top: 12px;
+}
+.travel-reimburse-form :deep(.el-form-item) {
+  margin-bottom: 18px;
+}
+.travel-reimburse-form :deep(.el-input-number) {
+  width: 100%;
+}
+.travel-reimburse-form :deep(.el-row) {
+  margin-bottom: 0;
+}
+</style>
diff --git a/src/views/officeProcessAutomation/ReimburseManage/travel-reimburse/travelReimburseUtils.js b/src/views/officeProcessAutomation/ReimburseManage/travel-reimburse/travelReimburseUtils.js
new file mode 100644
index 0000000..6c94c61
--- /dev/null
+++ b/src/views/officeProcessAutomation/ReimburseManage/travel-reimburse/travelReimburseUtils.js
@@ -0,0 +1,189 @@
+import dayjs from "dayjs";
+
+/** 璐圭敤绉戠洰 */
+export const EXPENSE_SUBJECT_OPTIONS = [
+  { label: "浜ら�氳垂", value: "transport" },
+  { label: "浣忓璐�", value: "hotel" },
+  { label: "椁愰ギ璐�", value: "meal" },
+  { label: "鍏朵粬", value: "other" },
+];
+
+const TIER1_CITIES = ["鍖椾含", "涓婃捣", "骞垮窞", "娣卞湷"];
+
+export function expenseSubjectLabel(v) {
+  return EXPENSE_SUBJECT_OPTIONS.find((x) => x.value === v)?.label || "鈥�";
+}
+
+export function statusLabel(v) {
+  if (v === "draft") return "鑽夌";
+  if (v === "approved") return "閫氳繃";
+  if (v === "paid") return "宸蹭粯娆�";
+  if (v === "rejected") return "椹冲洖";
+  if (v === "cancelled") return "宸叉挙鍥�";
+  return "瀹℃牳涓�";
+}
+
+export function statusTagType(v) {
+  if (v === "draft") return "info";
+  if (v === "approved" || v === "paid") return "success";
+  if (v === "rejected") return "danger";
+  if (v === "cancelled") return "info";
+  return "warning";
+}
+
+export function detectTravelTier(destination) {
+  const city = (destination || "").trim();
+  if (!city) return "tier3";
+  if (TIER1_CITIES.some((c) => city.includes(c))) return "tier1";
+  const tier2Keywords = ["鏉窞", "鍗椾含", "姝︽眽", "鎴愰兘", "閲嶅簡", "瑗垮畨", "澶╂触", "鑻忓窞", "闀挎矙", "閮戝窞"];
+  if (tier2Keywords.some((c) => city.includes(c))) return "tier2";
+  return "tier3";
+}
+
+export function getTravelStandardByTier(tier) {
+  const map = {
+    tier1: { hotelPerNight: 600, transportPerDay: 80, mealPerDay: 100, label: "涓�绾垮煄甯�" },
+    tier2: { hotelPerNight: 450, transportPerDay: 60, mealPerDay: 80, label: "浜岀嚎鍩庡競" },
+    tier3: { hotelPerNight: 350, transportPerDay: 40, mealPerDay: 60, label: "鍏朵粬鍩庡競" },
+  };
+  return map[tier] || map.tier3;
+}
+
+export function computeTravelDays(startStr, endStr) {
+  if (!startStr || !endStr) return null;
+  const t0 = dayjs(startStr);
+  const t1 = dayjs(endStr);
+  if (!t0.isValid() || !t1.isValid() || !t1.isAfter(t0)) return null;
+  const days = Math.ceil(t1.diff(t0, "day", true));
+  return Math.max(1, days);
+}
+
+export function createEmptyExpenseDetail() {
+  return {
+    id: `ed_${Date.now()}_${Math.random().toString(36).slice(2, 7)}`,
+    invoiceDate: "",
+    expenseSubject: "",
+    amount: undefined,
+    description: "",
+  };
+}
+
+export function createEmptyForm() {
+  return {
+    id: undefined,
+    reimburseNo: "",
+    applicantId: "",
+    employeeNo: "",
+    employeeName: "",
+    reimburseReason: "",
+    travelStartTime: "",
+    travelEndTime: "",
+    travelDays: undefined,
+    departurePlace: "",
+    destination: "",
+    hotelStandard: undefined,
+    hotelDays: undefined,
+    livingSubsidy: undefined,
+    applyAmount: undefined,
+    payee: "",
+    expenseDetails: [],
+    attachmentList: [],
+    approvalFlowNodes: [],
+    currentNodeIndex: 0,
+    needSpecialApproval: false,
+    deptId: "",
+    deptName: "",
+    travelTier: "tier3",
+  };
+}
+
+export function initApprovalFlowNodes(nodes) {
+  return (nodes || []).map((n, i) => ({
+    ...n,
+    sortOrder: i + 1,
+    nodeOrder: i + 1,
+    nodeStatus: i === 0 ? "process" : "wait",
+    approveOpinion: n.approveOpinion || "",
+    approveTime: n.approveTime || "",
+  }));
+}
+
+export function advanceApprovalFlow(row, opinion) {
+  const nodes = [...(row.approvalFlowNodes || [])];
+  const idx = row.currentNodeIndex ?? 0;
+  if (!nodes.length) return { nodes, currentNodeIndex: idx, approvalResult: row.approvalResult };
+  const now = dayjs().format("YYYY-MM-DD HH:mm:ss");
+  nodes[idx] = {
+    ...nodes[idx],
+    nodeStatus: "finish",
+    approveOpinion: opinion || "鍚屾剰",
+    approveTime: now,
+  };
+  const next = idx + 1;
+  if (next >= nodes.length) {
+    return { nodes, currentNodeIndex: idx, approvalResult: "approved" };
+  }
+  nodes[next] = { ...nodes[next], nodeStatus: "process" };
+  return { nodes, currentNodeIndex: next, approvalResult: "pending" };
+}
+
+export function rejectApprovalFlow(row, opinion) {
+  const nodes = [...(row.approvalFlowNodes || [])];
+  const idx = row.currentNodeIndex ?? 0;
+  const now = dayjs().format("YYYY-MM-DD HH:mm:ss");
+  if (nodes[idx]) {
+    nodes[idx] = {
+      ...nodes[idx],
+      nodeStatus: "error",
+      approveOpinion: opinion || "椹冲洖",
+      approveTime: now,
+    };
+  }
+  return { nodes, currentNodeIndex: idx, approvalResult: "rejected", rejectReason: opinion || "椹冲洖" };
+}
+
+/** 閮ㄩ棬棰勭畻锛堝鎺ラ绠楃郴缁熷墠杩斿洖绌猴級 */
+export function mockDeptBudget(deptId) {
+  if (!deptId) return null;
+  return null;
+}
+
+export function normalizeImportedRow(raw, idx) {
+  const id = raw.id != null && String(raw.id).length ? `imp_${String(raw.id)}_${idx}` : `imp_${Date.now()}_${idx}`;
+  const travelDays =
+    raw.travelDays != null
+      ? Number(raw.travelDays)
+      : computeTravelDays(raw.travelStartTime, raw.travelEndTime);
+  return {
+    id,
+    reimburseNo: raw.reimburseNo || `TR${dayjs().format("YYYYMMDD")}${String(idx).padStart(4, "0")}`,
+    applicantId: raw.applicantId != null ? String(raw.applicantId) : `imp_user_${idx}`,
+    employeeNo: raw.employeeNo ?? raw.applicantNo ?? "",
+    employeeName: raw.employeeName ?? raw.applicantName ?? "鏈煡",
+    applicantNo: raw.employeeNo ?? raw.applicantNo ?? "",
+    applicantName: raw.employeeName ?? raw.applicantName ?? "鏈煡",
+    reimburseReason: raw.reimburseReason ?? "",
+    travelStartTime: raw.travelStartTime ?? "",
+    travelEndTime: raw.travelEndTime ?? "",
+    travelDays: travelDays == null || Number.isNaN(travelDays) ? 1 : travelDays,
+    departurePlace: raw.departurePlace ?? "",
+    destination: raw.destination ?? "",
+    hotelStandard: raw.hotelStandard,
+    hotelDays: raw.hotelDays,
+    livingSubsidy: raw.livingSubsidy,
+    applyAmount: raw.applyAmount ?? 0,
+    payee: raw.payee ?? "",
+    expenseDetails: Array.isArray(raw.expenseDetails) ? raw.expenseDetails : [],
+    invoiceAttachments: Array.isArray(raw.invoiceAttachments) ? raw.invoiceAttachments : [],
+    approvalFlowNodes: Array.isArray(raw.approvalFlowNodes) ? raw.approvalFlowNodes : [],
+    currentNodeIndex: raw.currentNodeIndex ?? 0,
+    approvalResult: ["pending", "approved", "rejected"].includes(raw.approvalResult) ? raw.approvalResult : "pending",
+    rejectReason: raw.rejectReason ?? "",
+    approvalRecords: Array.isArray(raw.approvalRecords) ? raw.approvalRecords : [],
+    needSpecialApproval: !!raw.needSpecialApproval,
+    deptId: raw.deptId ?? "",
+    deptName: raw.deptName ?? "",
+    travelTier: raw.travelTier || detectTravelTier(raw.destination),
+    createTime: raw.createTime || dayjs().format("YYYY-MM-DD HH:mm:ss"),
+  };
+}
diff --git a/src/views/officeProcessAutomation/ReimburseManage/travel-reimburse/useTravelReimburse.js b/src/views/officeProcessAutomation/ReimburseManage/travel-reimburse/useTravelReimburse.js
new file mode 100644
index 0000000..c92d88c
--- /dev/null
+++ b/src/views/officeProcessAutomation/ReimburseManage/travel-reimburse/useTravelReimburse.js
@@ -0,0 +1,696 @@
+import { Search } from "@element-plus/icons-vue";
+import dayjs from "dayjs";
+import {
+  deleteFinReimbursement,
+  getFinReimbursementDetail,
+  listFinReimbursementPage,
+  persistFinReimbursement,
+} from "@/api/officeProcessAutomation/finReimbursement.js";
+import { ElMessageBox } from "element-plus";
+import { userListNoPageByTenantId } from "@/api/system/user.js";
+import { computed, getCurrentInstance, nextTick, onMounted, reactive, ref } from "vue";
+import {
+  buildFinReimbursementListParams,
+  filterReimbursementRowsBySearch,
+  hasActiveReimbursementSearch,
+  buildTravelReimbursementSaveDto,
+  canDeleteReimbursementRow,
+  canEditReimbursementRow,
+  enrichReimbursementListRowsWithApprovalFlow,
+  filterRowsByReimbursementType,
+  FIN_REIMBURSEMENT_TYPE,
+  mapFinReimbursementDetailRow,
+  mapTravelReimbursementRow,
+  resolveReimbursementDeleteId,
+  unwrapFinReimbursementDetail,
+  unwrapFinReimbursementPage,
+  validateReimbursementApprovalNodes,
+  validateReimbursementPersistDto,
+} from "../shared/finReimbursementMappers.js";
+import { consumeReimburseEditFromApprove } from "../shared/reimburseApproveBridge.js";
+import {
+  EXPENSE_SUBJECT_OPTIONS,
+  expenseSubjectLabel,
+  statusLabel,
+  statusTagType,
+  detectTravelTier,
+  getTravelStandardByTier,
+  computeTravelDays,
+  createEmptyExpenseDetail,
+  createEmptyForm,
+  initApprovalFlowNodes,
+  advanceApprovalFlow,
+  rejectApprovalFlow,
+  mockDeptBudget,
+  normalizeImportedRow,
+} from "./travelReimburseUtils.js";
+
+function unwrapArray(payload) {
+  if (Array.isArray(payload)) return payload;
+  if (payload?.data && Array.isArray(payload.data)) return payload.data;
+  if (payload?.rows && Array.isArray(payload.rows)) return payload.rows;
+  return [];
+}
+
+function isActiveUser(u) {
+  if (u.delFlag === "2" || u.delFlag === 2) return false;
+  if (u.status == null) return true;
+  return String(u.status) === "0";
+}
+
+export function useTravelReimburse() {
+  const { proxy } = getCurrentInstance();
+
+  const allRows = ref([]);
+
+  const searchForm = reactive({ applicantKeyword: "" });
+  const tableLoading = ref(false);
+  const page = reactive({ current: 1, size: 10, total: 0 });
+  const importInputRef = ref(null);
+  const allUsersCache = ref([]);
+  const applicantFormSearchLoading = ref(false);
+  const applicantFormOptions = ref([]);
+  const formRef = ref();
+  const form = reactive(createEmptyForm());
+  const formDialog = reactive({ visible: false, title: "", mode: "add", readonly: false });
+  const detailDialog = reactive({ visible: false });
+  const detailLoading = ref(false);
+  const detailRow = ref({});
+  const approveDialog = reactive({ visible: false, row: null });
+  const approveOpinion = ref("");
+  const submitSaving = ref(false);
+
+  const tableData = computed(() => allRows.value);
+
+  async function fetchList() {
+    tableLoading.value = true;
+    try {
+      const res = await listFinReimbursementPage(
+        buildFinReimbursementListParams({
+          page,
+          searchForm,
+          reimbursementType: FIN_REIMBURSEMENT_TYPE.TRAVEL,
+        })
+      );
+      const { records, total } = unwrapFinReimbursementPage(res);
+      const filtered = filterRowsByReimbursementType(
+        records,
+        FIN_REIMBURSEMENT_TYPE.TRAVEL
+      );
+      let mapped = filtered.map(mapTravelReimbursementRow);
+      mapped = await enrichReimbursementListRowsWithApprovalFlow(
+        mapped,
+        FIN_REIMBURSEMENT_TYPE.TRAVEL
+      );
+      if (hasActiveReimbursementSearch(searchForm)) {
+        mapped = filterReimbursementRowsBySearch(mapped, searchForm);
+      }
+      allRows.value = mapped;
+      const dropped = records.length - filtered.length;
+      let nextTotal =
+        dropped > 0 ? Math.max(0, Number(total) - dropped) : Number(total);
+      if (hasActiveReimbursementSearch(searchForm)) {
+        nextTotal = mapped.length;
+      }
+      page.total = nextTotal;
+    } catch {
+      allRows.value = [];
+      page.total = 0;
+      proxy?.$modal?.msgError?.("宸梾鎶ラ攢鍒楄〃鍔犺浇澶辫触");
+    } finally {
+      tableLoading.value = false;
+    }
+  }
+
+  const flowUserOptions = computed(() => allUsersCache.value.filter(isActiveUser));
+
+  const travelDaysDisplay = computed(() => {
+    const d = computeTravelDays(form.travelStartTime, form.travelEndTime);
+    return d == null ? "" : String(d);
+  });
+
+  const travelTierLabel = computed(() => {
+    const std = getTravelStandardByTier(form.travelTier || detectTravelTier(form.destination));
+    return `鎸�${std.label}鏍囧噯`;
+  });
+
+  const suggestedLivingSubsidy = computed(() => {
+    const days = computeTravelDays(form.travelStartTime, form.travelEndTime) || form.hotelDays || 0;
+    const std = getTravelStandardByTier(form.travelTier);
+    return Math.round(std.mealPerDay * days * 100) / 100;
+  });
+
+  const suggestedTransportSubsidy = computed(() => {
+    const days = computeTravelDays(form.travelStartTime, form.travelEndTime) || 0;
+    const std = getTravelStandardByTier(form.travelTier);
+    return Math.round(std.transportPerDay * days * 100) / 100;
+  });
+
+  const suggestedHotelLimit = computed(() => {
+    const nights = form.hotelDays || 0;
+    const perNight = form.hotelStandard ?? getTravelStandardByTier(form.travelTier).hotelPerNight;
+    return Math.round(perNight * nights * 100) / 100;
+  });
+
+  const detailTotalAmount = computed(() => {
+    const sum = (form.expenseDetails || []).reduce((s, d) => s + (Number(d.amount) || 0), 0);
+    return Math.round(sum * 100) / 100;
+  });
+
+  const overBudgetWarnings = computed(() => buildOverBudgetWarnings(form, detailTotalAmount.value, suggestedHotelLimit.value, suggestedTransportSubsidy.value, suggestedLivingSubsidy.value));
+
+  const budgetHint = computed(() => {
+    if (!form.deptId) return { visible: false };
+    const b = mockDeptBudget(form.deptId);
+    const apply = Number(form.applyAmount) || detailTotalAmount.value || 0;
+    const after = b.remainingAmount - apply;
+    return {
+      visible: true,
+      type: after < 0 ? "error" : "info",
+      title: `閮ㄩ棬棰勭畻鑱斿姩锛�${form.deptName || b.deptId}锛塦,
+      description: `骞村害棰勭畻 ${b.totalBudget} 鍏冿紝宸茬敤 ${b.usedAmount} 鍏冿紝鍓╀綑 ${b.remainingAmount} 鍏冿紱鏈崟鐢宠鍚庨璁″墿浣� ${Math.round(after * 100) / 100} 鍏冦�俙,
+    };
+  });
+
+  const tableColumn = ref([
+    { label: "鎶ラ攢鍗曞彿", prop: "reimburseNo", width: 150 },
+    { label: "鐢宠浜虹紪鍙�", prop: "applicantNo", width: 110 },
+    { label: "鐢宠浜�", prop: "applicantName", minWidth: 90 },
+    { label: "鍑哄樊寮�濮�", prop: "travelStartTime", width: 165 },
+    { label: "鍑哄樊缁撴潫", prop: "travelEndTime", width: 165 },
+    { label: "鍒涘缓鏃堕棿", prop: "createTime", width: 165 },
+    {
+      label: "鐘舵��",
+      prop: "approvalResult",
+      width: 100,
+      dataType: "tag",
+      formatData: (v) => statusLabel(v),
+      formatType: (v) => statusTagType(v),
+    },
+    {
+      dataType: "action",
+      label: "鎿嶄綔",
+      align: "center",
+      fixed: "right",
+      width: 220,
+      operation: [
+        {
+          name: "缂栬緫",
+          type: "text",
+          disabled: (row) => !canEditReimbursementRow(row),
+          clickFun: (row) => openFormDialog("edit", row),
+        },
+        { name: "璇︽儏", type: "text", clickFun: (row) => openDetail(row) },
+        {
+          name: "鍒犻櫎",
+          type: "danger",
+          disabled: (row) => !canDeleteReimbursementRow(row),
+          clickFun: (row) => confirmRemoveRow(row),
+        },
+      ],
+    },
+  ]);
+
+  const formRules = {
+    applicantId: [{ required: true, message: "璇烽�夋嫨鍛樺伐", trigger: "change" }],
+    reimburseReason: [{ required: true, message: "璇峰~鍐欐姤閿�鍘熷洜", trigger: "blur" }],
+    travelStartTime: [{ required: true, message: "璇烽�夋嫨鍑哄樊寮�濮嬫椂闂�", trigger: "change" }],
+    travelEndTime: [
+      { required: true, message: "璇烽�夋嫨鍑哄樊缁撴潫鏃堕棿", trigger: "change" },
+      {
+        validator: (_r, val, cb) => {
+          if (!form.travelStartTime || !val) { cb(); return; }
+          if (computeTravelDays(form.travelStartTime, val) == null) cb(new Error("缁撴潫鏃堕棿椤绘櫄浜庡紑濮嬫椂闂�"));
+          else cb();
+        },
+        trigger: "change",
+      },
+    ],
+    departurePlace: [{ required: true, message: "璇峰~鍐欏嚭宸湴", trigger: "blur" }],
+    destination: [{ required: true, message: "璇峰~鍐欑洰鐨勫湴", trigger: "blur" }],
+    applyAmount: [{ required: true, message: "璇峰~鍐欑敵璇烽噾棰�", trigger: "blur" }],
+    payee: [{ required: true, message: "璇峰~鍐欐敹娆句汉", trigger: "blur" }],
+    approvalFlowNodes: [
+      {
+        validator: (_r, _v, cb) => {
+          const nodes = form.approvalFlowNodes || [];
+          if (!nodes.length) { cb(new Error("璇疯嚦灏戦厤缃竴涓鎵硅妭鐐�")); return; }
+          if (nodes.some((n) => n.approverId == null || n.approverId === "")) { cb(new Error("姣忎釜鑺傜偣椤婚�夋嫨瀹℃壒浜�")); return; }
+          cb();
+        },
+        trigger: "change",
+      },
+    ],
+  };
+
+  function buildOverBudgetWarnings(f, detailTotal, hotelLimit, transportLimit, mealLimit) {
+    const warnings = [];
+    const bySubject = { transport: 0, hotel: 0, meal: 0, other: 0 };
+    (f.expenseDetails || []).forEach((d) => {
+      const key = d.expenseSubject || "other";
+      bySubject[key] = (bySubject[key] || 0) + (Number(d.amount) || 0);
+    });
+    if (bySubject.transport > transportLimit && transportLimit > 0) {
+      warnings.push(`浜ら�氳垂 ${bySubject.transport} 鍏冭秴鍑烘爣鍑� ${transportLimit} 鍏僠);
+    }
+    if (bySubject.hotel > hotelLimit && hotelLimit > 0) {
+      warnings.push(`浣忓璐� ${bySubject.hotel} 鍏冭秴鍑洪檺棰� ${hotelLimit} 鍏僠);
+    }
+    if (bySubject.meal > mealLimit && mealLimit > 0) {
+      warnings.push(`椁愰ギ璐� ${bySubject.meal} 鍏冭秴鍑虹敓娲昏ˉ璐村缓璁� ${mealLimit} 鍏僠);
+    }
+    const std = getTravelStandardByTier(f.travelTier);
+    if (f.hotelStandard > std.hotelPerNight) {
+      warnings.push(`閰掑簵鏍囧噯 ${f.hotelStandard} 鍏�/鏅氶珮浜�${std.label}鏍囧噯 ${std.hotelPerNight} 鍏�/鏅歚);
+    }
+    const apply = Number(f.applyAmount) || detailTotal;
+    const standardTotal = transportLimit + hotelLimit + mealLimit;
+    if (apply > standardTotal && standardTotal > 0) {
+      warnings.push(`鐢宠鎬婚 ${apply} 鍏冮珮浜庡樊鏃呮爣鍑嗗悎璁$害 ${standardTotal} 鍏僠);
+    }
+    return warnings;
+  }
+
+  async function loadUserPool() {
+    try {
+      allUsersCache.value = unwrapArray(await userListNoPageByTenantId());
+    } catch {
+      allUsersCache.value = [];
+    }
+  }
+
+  function userSelectLabel(u) {
+    const nick = u.nickName || "";
+    const name = u.userName || "";
+    if (nick && name && nick !== name) return `${nick}锛�${name}锛塦;
+    return nick || name || `鐢ㄦ埛${u.userId ?? u.id ?? ""}`;
+  }
+
+  function userById(id) {
+    return allUsersCache.value.find((u) => String(u.userId ?? u.id) === String(id));
+  }
+
+  function employeeNoFromUser(u) {
+    if (!u) return "";
+    return u.userName ?? u.userCode ?? u.jobNumber ?? u.workNo ?? (u.userId != null ? String(u.userId) : "");
+  }
+
+  function filterUsersByQuery(query) {
+    const list = allUsersCache.value.filter(isActiveUser);
+    const q = (query || "").trim().toLowerCase();
+    if (!q) return [...list];
+    return list.filter((u) => {
+      const nick = (u.nickName || "").toLowerCase();
+      const uname = (u.userName || "").toLowerCase();
+      return nick.includes(q) || uname.includes(q);
+    });
+  }
+
+  async function remoteSearchApplicantForm(query) {
+    applicantFormSearchLoading.value = true;
+    try {
+      if (!allUsersCache.value.length) await loadUserPool();
+      applicantFormOptions.value = filterUsersByQuery(query);
+    } finally {
+      applicantFormSearchLoading.value = false;
+    }
+  }
+
+  function onApplicantChange(uid) {
+    const u = userById(uid);
+    if (u) {
+      form.employeeName = u.nickName || u.userName || "";
+      form.employeeNo = employeeNoFromUser(u);
+      form.payee = form.payee || form.employeeName;
+      form.deptId = String(u.deptId ?? u.sysDeptId ?? "");
+      form.deptName = u.dept?.deptName ?? u.deptName ?? "";
+    } else {
+      form.employeeName = "";
+      form.employeeNo = "";
+    }
+  }
+
+  function recalcTravelStandards() {
+    form.travelTier = detectTravelTier(form.destination);
+    const std = getTravelStandardByTier(form.travelTier);
+    if (form.hotelStandard == null || form.hotelStandard === 0) form.hotelStandard = std.hotelPerNight;
+    const days = computeTravelDays(form.travelStartTime, form.travelEndTime);
+    if (days != null) {
+      form.travelDays = days;
+      if (form.hotelDays == null) form.hotelDays = Math.max(0, days - 1);
+      if (form.livingSubsidy == null || form.livingSubsidy === 0) form.livingSubsidy = suggestedLivingSubsidy.value;
+    }
+    form.needSpecialApproval = buildOverBudgetWarnings(form, detailTotalAmount.value, suggestedHotelLimit.value, suggestedTransportSubsidy.value, suggestedLivingSubsidy.value).length > 0;
+  }
+
+  function onTravelRangeChange() {
+    recalcTravelStandards();
+    nextTick(() => formRef.value?.validateField?.("travelEndTime"));
+  }
+
+  function onDetailAmountChange() {
+    recalcTravelStandards();
+  }
+
+  function onApprovalFlowChange() {
+    nextTick(() => formRef.value?.validateField?.("approvalFlowNodes"));
+  }
+
+  function addExpenseDetail() {
+    form.expenseDetails.push(createEmptyExpenseDetail());
+  }
+
+  function removeExpenseDetail(index) {
+    form.expenseDetails.splice(index, 1);
+    recalcTravelStandards();
+  }
+
+  function mapAttachmentList(list) {
+    return (list || []).map((f, i) => ({
+      id: f.id ?? f.uid ?? `inv_${Date.now()}_${i}`,
+      name: f.name || f.fileName || f.originalFilename || "鏈懡鍚�",
+      url: f.url || f.downloadURL || f.previewURL || f.previewUrl || "",
+    }));
+  }
+
+  function syncApplyAmountFromDetails() {
+    form.applyAmount = detailTotalAmount.value;
+    recalcTravelStandards();
+  }
+
+  function handleQuery() {
+    page.current = 1;
+    return fetchList();
+  }
+
+  function resetSearch() {
+    searchForm.applicantKeyword = "";
+    handleQuery();
+  }
+
+  function pagination(obj) {
+    page.current = obj.page;
+    page.size = obj.limit;
+    return fetchList();
+  }
+
+  async function loadTravelDetailRow(row) {
+    const id = resolveReimbursementDeleteId(row);
+    if (id == null) {
+      throw new Error("missing id");
+    }
+    const res = await getFinReimbursementDetail(id);
+    const raw = unwrapFinReimbursementDetail(res);
+    return mapFinReimbursementDetailRow(raw, FIN_REIMBURSEMENT_TYPE.TRAVEL);
+  }
+
+  async function openDetail(row) {
+    const id = resolveReimbursementDeleteId(row);
+    if (id == null) {
+      proxy?.$modal?.msgWarning?.("鏃犳硶鏌ョ湅璇︽儏锛氱己灏戞姤閿�鍗� ID");
+      return;
+    }
+    detailDialog.visible = true;
+    detailLoading.value = true;
+    detailRow.value = { ...row };
+    try {
+      detailRow.value = await loadTravelDetailRow(row);
+    } catch {
+      proxy?.$modal?.msgError?.("鍔犺浇璇︽儏澶辫触");
+      detailDialog.visible = false;
+    } finally {
+      detailLoading.value = false;
+    }
+  }
+
+  async function confirmRemoveRow(row) {
+    const id = resolveReimbursementDeleteId(row);
+    if (id == null) {
+      proxy?.$modal?.msgWarning?.("鏃犳硶鍒犻櫎锛氱己灏戞姤閿�鍗� ID");
+      return;
+    }
+    const title = row.reimburseNo || row.billNo || row.reimburseReason || "璇ユ姤閿�鍗�";
+    try {
+      await ElMessageBox.confirm(
+        `纭畾瑕佸垹闄ゃ��${title}銆嶅悧锛熷垹闄ゅ悗涓嶅彲鎭㈠銆俙,
+        "鍒犻櫎纭",
+        {
+          type: "warning",
+          confirmButtonText: "纭畾鍒犻櫎",
+          cancelButtonText: "鍙栨秷",
+          distinguishCancelAndClose: true,
+          autofocus: false,
+        }
+      );
+    } catch {
+      return;
+    }
+    try {
+      await deleteFinReimbursement([id]);
+      proxy?.$modal?.msgSuccess?.("鍒犻櫎鎴愬姛");
+      if (detailDialog.visible && resolveReimbursementDeleteId(detailRow.value) === id) {
+        detailDialog.visible = false;
+      }
+      await handleQuery();
+    } catch {
+      proxy?.$modal?.msgError?.("鍒犻櫎澶辫触");
+    }
+  }
+
+  function openApprove(row) {
+    approveDialog.row = { ...row };
+    approveDialog.visible = true;
+  }
+
+  function approvalActionLabel(v) {
+    if (v === "approved") return "閫氳繃";
+    if (v === "rejected") return "椹冲洖";
+    return "鎻愪氦";
+  }
+
+  async function openFormDialog(mode, row) {
+    formDialog.mode = mode;
+    formDialog.readonly = false;
+    formDialog.title = mode === "add" ? "鏂板宸梾鎶ラ攢" : "缂栬緫宸梾鎶ラ攢";
+    if (!allUsersCache.value.length) await loadUserPool();
+    Object.assign(form, createEmptyForm());
+    if (mode === "edit" && row) {
+      let editRow = row;
+      try {
+        editRow = await loadTravelDetailRow(row);
+      } catch {
+        proxy?.$modal?.msgError?.("鍔犺浇鎶ラ攢璇︽儏澶辫触");
+        return;
+      }
+      Object.assign(form, {
+        ...JSON.parse(JSON.stringify(editRow)),
+        reimbursementId: editRow.reimbursementId ?? editRow.id,
+        attachmentList: JSON.parse(JSON.stringify(editRow.attachmentList || editRow.invoiceAttachments || [])),
+        approvalFlowNodes: JSON.parse(JSON.stringify(editRow.approvalFlowNodes || [])),
+        expenseDetails: JSON.parse(JSON.stringify(editRow.expenseDetails || [])),
+      });
+      const u = userById(editRow.applicantId);
+      applicantFormOptions.value = u
+        ? [u]
+        : [{ userId: editRow.applicantId, nickName: editRow.employeeName, userName: editRow.employeeNo }];
+    } else {
+      form.approvalFlowNodes = [{ approverId: null, approverName: "", sortOrder: 1, nodeOrder: 1 }];
+      remoteSearchApplicantForm("");
+    }
+    formDialog.visible = true;
+    nextTick(() => {
+      formRef.value?.clearValidate?.();
+      recalcTravelStandards();
+    });
+  }
+
+  function onFormClosed() {
+    formRef.value?.resetFields?.();
+  }
+
+  async function submitForm() {
+    try {
+      await formRef.value?.validate?.();
+    } catch {
+      return;
+    }
+    if (!(form.expenseDetails || []).length) {
+      proxy?.$modal?.msgWarning?.("璇疯嚦灏戞坊鍔犱竴鏉℃姤閿�鏄庣粏");
+      return;
+    }
+    recalcTravelStandards();
+    if (form.needSpecialApproval) {
+      try {
+        await proxy.$modal.confirm("瀛樺湪瓒呮敮椤癸紝鎻愪氦鍚庡皢鏍囪涓洪渶鐗规壒锛屾槸鍚︾户缁紵");
+      } catch {
+        return;
+      }
+    }
+    if (submitSaving.value) return;
+    const isEdit = formDialog.mode === "edit";
+    const dto = buildTravelReimbursementSaveDto(form, { computeTravelDays });
+    const check = validateReimbursementPersistDto(dto, isEdit);
+    if (!check.ok) {
+      proxy?.$modal?.msgWarning?.(check.message);
+      return;
+    }
+    const nodeCheck = validateReimbursementApprovalNodes(dto);
+    if (!nodeCheck.ok) {
+      proxy?.$modal?.msgWarning?.(nodeCheck.message);
+      return;
+    }
+    submitSaving.value = true;
+    try {
+      await persistFinReimbursement(dto, isEdit);
+      proxy?.$modal?.msgSuccess?.(isEdit ? "淇濆瓨鎴愬姛" : "鎻愪氦鎴愬姛");
+      formDialog.visible = false;
+      await handleQuery();
+    } catch {
+      proxy?.$modal?.msgError?.(isEdit ? "淇濆瓨澶辫触" : "鎻愪氦澶辫触");
+    } finally {
+      submitSaving.value = false;
+    }
+  }
+
+  async function submitApprove(result) {
+    const row = approveDialog.row;
+    if (!row) return;
+    if (result === "rejected" && !(approveOpinion.value || "").trim()) {
+      proxy?.$modal?.msgWarning?.("椹冲洖椤诲~鍐欏鎵规剰瑙�");
+      return;
+    }
+    const idx = allRows.value.findIndex((r) => r.id === row.id);
+    if (idx === -1) return;
+    const cur = allRows.value[idx];
+    const operatorName = "褰撳墠瀹℃壒浜�";
+    const record = {
+      operatorName,
+      result,
+      opinion: approveOpinion.value || (result === "approved" ? "鍚屾剰" : "椹冲洖"),
+      time: dayjs().format("YYYY-MM-DD HH:mm:ss"),
+    };
+    const records = [...(cur.approvalRecords || []), record];
+    let flowUpdate;
+    if (result === "approved") {
+      flowUpdate = advanceApprovalFlow(cur, approveOpinion.value);
+    } else {
+      flowUpdate = rejectApprovalFlow(cur, approveOpinion.value);
+    }
+    allRows.value[idx] = {
+      ...cur,
+      approvalFlowNodes: flowUpdate.nodes,
+      currentNodeIndex: flowUpdate.currentNodeIndex,
+      approvalResult: flowUpdate.approvalResult,
+      rejectReason: flowUpdate.rejectReason ?? cur.rejectReason,
+      approvalRecords: records,
+    };
+    proxy?.$modal?.msgSuccess?.(result === "approved" ? "宸查�氳繃" : "宸查┏鍥�");
+    approveDialog.visible = false;
+    handleQuery();
+  }
+
+  function handleExport() {
+    const data = allRows.value;
+    const blob = new Blob([JSON.stringify(data, null, 2)], { type: "application/json;charset=utf-8" });
+    const url = URL.createObjectURL(blob);
+    const a = document.createElement("a");
+    a.href = url;
+    a.download = `宸梾鎶ラ攢瀵煎嚭_${dayjs().format("YYYYMMDDHHmmss")}.json`;
+    a.click();
+    URL.revokeObjectURL(url);
+    proxy?.$modal?.msgSuccess?.(`宸插鍑� ${data.length} 鏉);
+  }
+
+  function handleImportClick() {
+    importInputRef.value?.click?.();
+  }
+
+  function onImportFile(e) {
+    const file = e.target.files?.[0];
+    e.target.value = "";
+    if (!file) return;
+    const reader = new FileReader();
+    reader.onload = () => {
+      try {
+        const parsed = JSON.parse(String(reader.result || ""));
+        const arr = Array.isArray(parsed) ? parsed : parsed?.rows || parsed?.data;
+        if (!Array.isArray(arr) || !arr.length) {
+          proxy?.$modal?.msgWarning?.("瀵煎叆鏍煎紡椤讳负宸梾鎶ラ攢 JSON 鏁扮粍");
+          return;
+        }
+        arr.forEach((raw, i) => allRows.value.unshift(normalizeImportedRow(raw, i)));
+        proxy?.$modal?.msgSuccess?.(`鎴愬姛瀵煎叆 ${arr.length} 鏉);
+        handleQuery();
+      } catch {
+        proxy?.$modal?.msgError?.("瑙f瀽澶辫触");
+      }
+    };
+    reader.readAsText(file, "utf-8");
+  }
+
+  onMounted(async () => {
+    loadUserPool();
+    await fetchList();
+    const editPayload = consumeReimburseEditFromApprove();
+    if (editPayload?.reimbursementId != null) {
+      await openFormDialog("edit", { reimbursementId: editPayload.reimbursementId });
+    }
+  });
+
+  return {
+    Search,
+    EXPENSE_SUBJECT_OPTIONS,
+    expenseSubjectLabel,
+    searchForm,
+    tableLoading,
+    page,
+    tableData,
+    tableColumn,
+    importInputRef,
+    formRef,
+    form,
+    formDialog,
+    formRules,
+    detailDialog,
+    detailLoading,
+    detailRow,
+    approveDialog,
+    approveOpinion,
+    applicantFormSearchLoading,
+    applicantFormOptions,
+    flowUserOptions,
+    travelDaysDisplay,
+    travelTierLabel,
+    suggestedLivingSubsidy,
+    suggestedTransportSubsidy,
+    suggestedHotelLimit,
+    detailTotalAmount,
+    overBudgetWarnings,
+    budgetHint,
+    handleQuery,
+    resetSearch,
+    pagination,
+    remoteSearchApplicantForm,
+    userSelectLabel,
+    onApplicantChange,
+    recalcTravelStandards,
+    onTravelRangeChange,
+    onDetailAmountChange,
+    onApprovalFlowChange,
+    addExpenseDetail,
+    removeExpenseDetail,
+    syncApplyAmountFromDetails,
+    openFormDialog,
+    onFormClosed,
+    submitForm,
+    submitSaving,
+    openDetail,
+    confirmRemoveRow,
+    openApprove,
+    approvalActionLabel,
+    submitApprove,
+    handleExport,
+    handleImportClick,
+    onImportFile,
+  };
+}
diff --git a/src/views/officeProcessAutomation/SysAdmin/dept-manage/index.vue b/src/views/officeProcessAutomation/SysAdmin/dept-manage/index.vue
new file mode 100644
index 0000000..9dd4e90
--- /dev/null
+++ b/src/views/officeProcessAutomation/SysAdmin/dept-manage/index.vue
@@ -0,0 +1,291 @@
+<!--OA妯″潡锛氶儴闂ㄧ鐞�-->
+<template>
+	<div class="app-container">
+		<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch">
+			<el-form-item label="閮ㄩ棬鍚嶇О" prop="deptName">
+				<el-input
+					v-model="queryParams.deptName"
+					placeholder="璇疯緭鍏ラ儴闂ㄥ悕绉�"
+					clearable
+					style="width: 200px"
+					@keyup.enter="handleQuery"
+				/>
+			</el-form-item>
+			<el-form-item label="鐘舵��" prop="status">
+				<el-select v-model="queryParams.status" placeholder="閮ㄩ棬鐘舵��" clearable style="width: 200px">
+					<el-option
+						v-for="dict in sys_normal_disable"
+						:key="dict.value"
+						:label="dict.label"
+						:value="dict.value"
+					/>
+				</el-select>
+			</el-form-item>
+			<el-form-item>
+				<el-button type="primary" icon="Search" @click="handleQuery">鎼滅储</el-button>
+				<el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button>
+			</el-form-item>
+		</el-form>
+		
+		<el-row :gutter="10" class="mb8">
+			<el-col :span="1.5">
+				<el-button
+					type="primary"
+					plain
+					icon="Plus"
+					@click="handleAdd"
+					v-hasPermi="['system:dept:add']"
+				>鏂板</el-button>
+			</el-col>
+			<el-col :span="1.5">
+				<el-button
+					type="info"
+					plain
+					icon="Sort"
+					@click="toggleExpandAll"
+				>灞曞紑/鎶樺彔</el-button>
+			</el-col>
+			<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
+		</el-row>
+		<el-table
+			v-if="refreshTable"
+			v-loading="loading"
+			:data="deptList"
+			row-key="deptId"
+			:default-expand-all="isExpandAll"
+			:tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
+		>
+			<el-table-column prop="deptName" label="閮ㄩ棬鍚嶇О" width="260"></el-table-column>
+			<el-table-column prop="orderNum" label="鎺掑簭" width="200"></el-table-column>
+			<el-table-column prop="status" label="鐘舵��" width="100">
+				<template #default="scope">
+					<dict-tag :options="sys_normal_disable" :value="scope.row.status" />
+				</template>
+			</el-table-column>
+			<el-table-column label="鍒涘缓鏃堕棿" align="center" prop="createTime" width="200">
+				<template #default="scope">
+					<span>{{ parseTime(scope.row.createTime) }}</span>
+				</template>
+			</el-table-column>
+			<el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
+				<template #default="scope">
+					<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:dept:edit']">淇敼</el-button>
+					<el-button link type="primary" icon="Plus" @click="handleAdd(scope.row)" v-hasPermi="['system:dept:add']">鏂板</el-button>
+					<el-button v-if="scope.row.parentId != 0" link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:dept:remove']">鍒犻櫎</el-button>
+				</template>
+			</el-table-column>
+		</el-table>
+		
+		<!-- 娣诲姞鎴栦慨鏀归儴闂ㄥ璇濇 -->
+		<el-dialog :title="title" v-model="open" width="600px" append-to-body>
+			<el-form ref="deptRef" :model="form" :rules="rules" label-width="80px">
+				<el-row>
+					<el-col :span="24" v-if="form.parentId !== 0">
+						<el-form-item label="涓婄骇閮ㄩ棬" prop="parentId">
+							<el-tree-select
+								v-model="form.parentId"
+								:data="deptOptions"
+								:props="{ value: 'deptId', label: 'deptName', children: 'children' }"
+								value-key="deptId"
+								placeholder="閫夋嫨涓婄骇閮ㄩ棬"
+								check-strictly
+							/>
+						</el-form-item>
+					</el-col>
+					<el-col :span="12">
+						<el-form-item label="閮ㄩ棬鍚嶇О" prop="deptName">
+							<el-input v-model="form.deptName" placeholder="璇疯緭鍏ラ儴闂ㄥ悕绉�" />
+						</el-form-item>
+					</el-col>
+					<el-col :span="12">
+						<el-form-item label="鏄剧ず鎺掑簭" prop="orderNum">
+							<el-input-number v-model="form.orderNum" controls-position="right" :min="0"/>
+						</el-form-item>
+					</el-col>
+					<el-col :span="12">
+						<el-form-item label="璐熻矗浜�" prop="leader">
+							<el-input v-model="form.leader" placeholder="璇疯緭鍏ヨ礋璐d汉" maxlength="20" />
+						</el-form-item>
+					</el-col>
+					<el-col :span="12">
+						<el-form-item label="鑱旂郴鐢佃瘽" prop="phone">
+							<el-input v-model="form.phone" placeholder="璇疯緭鍏ヨ仈绯荤數璇�" maxlength="11" />
+						</el-form-item>
+					</el-col>
+					<el-col :span="12">
+						<el-form-item label="閭" prop="email">
+							<el-input v-model="form.email" placeholder="璇疯緭鍏ラ偖绠�" maxlength="50" />
+						</el-form-item>
+					</el-col>
+					<el-col :span="12">
+						<el-form-item label="閮ㄩ棬鐘舵��">
+							<el-radio-group v-model="form.status">
+								<el-radio
+									v-for="dict in sys_normal_disable"
+									:key="dict.value"
+									:value="dict.value"
+								>{{ dict.label }}</el-radio>
+							</el-radio-group>
+						</el-form-item>
+					</el-col>
+					<el-col :span="12">
+						<el-form-item label="閮ㄩ棬缂栧彿" prop="deptNick">
+							<el-input v-model="form.deptNick" placeholder="璇疯緭鍏ラ儴闂ㄧ紪鍙�" maxlength="50" />
+						</el-form-item>
+					</el-col>
+				</el-row>
+			</el-form>
+			<template #footer>
+				<div class="dialog-footer">
+					<el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+					<el-button @click="cancel">鍙� 娑�</el-button>
+				</div>
+			</template>
+		</el-dialog>
+	</div>
+</template>
+
+<script setup name="Dept">
+import { listDept, getDept, delDept, addDept, updateDept, listDeptExcludeChild } from "@/api/system/dept"
+
+const { proxy } = getCurrentInstance()
+const { sys_normal_disable } = proxy.useDict("sys_normal_disable")
+
+const deptList = ref([])
+const open = ref(false)
+const loading = ref(true)
+const showSearch = ref(true)
+const title = ref("")
+const deptOptions = ref([])
+const isExpandAll = ref(true)
+const refreshTable = ref(true)
+
+const data = reactive({
+	form: {},
+	queryParams: {
+		deptName: undefined,
+		status: undefined
+	},
+	rules: {
+		parentId: [{ required: true, message: "涓婄骇閮ㄩ棬涓嶈兘涓虹┖", trigger: "blur" }],
+		deptName: [{ required: true, message: "閮ㄩ棬鍚嶇О涓嶈兘涓虹┖", trigger: "blur" }],
+		orderNum: [{ required: true, message: "鏄剧ず鎺掑簭涓嶈兘涓虹┖", trigger: "blur" }],
+		email: [{ type: "email", message: "璇疯緭鍏ユ纭殑閭鍦板潃", trigger: ["blur", "change"] }],
+		phone: [{ pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: "璇疯緭鍏ユ纭殑鎵嬫満鍙风爜", trigger: "blur" }],
+		deptNick: [{ required: true, message: "閮ㄩ棬缂栧彿涓嶈兘涓虹┖", trigger: "blur" }],
+	},
+})
+
+const { queryParams, form, rules } = toRefs(data)
+
+/** 鏌ヨ閮ㄩ棬鍒楄〃 */
+function getList() {
+	loading.value = true
+	listDept(queryParams.value).then(response => {
+		deptList.value = proxy.handleTree(response.data, "deptId")
+		loading.value = false
+	})
+}
+
+/** 鍙栨秷鎸夐挳 */
+function cancel() {
+	open.value = false
+	reset()
+}
+
+/** 琛ㄥ崟閲嶇疆 */
+function reset() {
+	form.value = {
+		deptId: undefined,
+		parentId: undefined,
+		deptName: undefined,
+		orderNum: 0,
+		leader: undefined,
+		phone: undefined,
+		email: undefined,
+		status: "0",
+		deptNick: undefined,
+	}
+	proxy.resetForm("deptRef")
+}
+
+/** 鎼滅储鎸夐挳鎿嶄綔 */
+function handleQuery() {
+	getList()
+}
+
+/** 閲嶇疆鎸夐挳鎿嶄綔 */
+function resetQuery() {
+	proxy.resetForm("queryRef")
+	handleQuery()
+}
+
+/** 鏂板鎸夐挳鎿嶄綔 */
+function handleAdd(row) {
+	reset()
+	listDept().then(response => {
+		deptOptions.value = proxy.handleTree(response.data, "deptId")
+	})
+	if (row != undefined) {
+		form.value.parentId = row.deptId
+	}
+	open.value = true
+	title.value = "娣诲姞閮ㄩ棬"
+}
+
+/** 灞曞紑/鎶樺彔鎿嶄綔 */
+function toggleExpandAll() {
+	refreshTable.value = false
+	isExpandAll.value = !isExpandAll.value
+	nextTick(() => {
+		refreshTable.value = true
+	})
+}
+
+/** 淇敼鎸夐挳鎿嶄綔 */
+function handleUpdate(row) {
+	reset()
+	listDeptExcludeChild(row.deptId).then(response => {
+		deptOptions.value = proxy.handleTree(response.data, "deptId")
+	})
+	getDept(row.deptId).then(response => {
+		form.value = response.data
+		open.value = true
+		title.value = "淇敼閮ㄩ棬"
+	})
+}
+
+/** 鎻愪氦鎸夐挳 */
+function submitForm() {
+	proxy.$refs["deptRef"].validate(valid => {
+		if (valid) {
+			if (form.value.deptId != undefined) {
+				updateDept(form.value).then(response => {
+					proxy.$modal.msgSuccess("淇敼鎴愬姛")
+					open.value = false
+					getList()
+				})
+			} else {
+				addDept(form.value).then(response => {
+					proxy.$modal.msgSuccess("鏂板鎴愬姛")
+					open.value = false
+					getList()
+				})
+			}
+		}
+	})
+}
+
+/** 鍒犻櫎鎸夐挳鎿嶄綔 */
+function handleDelete(row) {
+	proxy.$modal.confirm('鏄惁纭鍒犻櫎鍚嶇О涓�"' + row.deptName + '"鐨勬暟鎹」?').then(function() {
+		return delDept(row.deptId)
+	}).then(() => {
+		getList()
+		proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛")
+	}).catch(() => {})
+}
+
+getList()
+</script>
+
diff --git a/src/views/officeProcessAutomation/SysAdmin/log-manage/index.vue b/src/views/officeProcessAutomation/SysAdmin/log-manage/index.vue
new file mode 100644
index 0000000..2701c1a
--- /dev/null
+++ b/src/views/officeProcessAutomation/SysAdmin/log-manage/index.vue
@@ -0,0 +1,315 @@
+<!--OA妯″潡锛氭棩蹇楃鐞�-->
+<template>
+  <div class="app-container">
+     <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
+        <el-form-item label="鎿嶄綔鍦板潃" prop="operIp">
+           <el-input
+              v-model="queryParams.operIp"
+              placeholder="璇疯緭鍏ユ搷浣滃湴鍧�"
+              clearable
+              style="width: 240px;"
+              @keyup.enter="handleQuery"
+           />
+        </el-form-item>
+        <el-form-item label="绯荤粺妯″潡" prop="title">
+           <el-input
+              v-model="queryParams.title"
+              placeholder="璇疯緭鍏ョ郴缁熸ā鍧�"
+              clearable
+              style="width: 240px;"
+              @keyup.enter="handleQuery"
+           />
+        </el-form-item>
+        <el-form-item label="鎿嶄綔浜哄憳" prop="operName">
+           <el-input
+              v-model="queryParams.operName"
+              placeholder="璇疯緭鍏ユ搷浣滀汉鍛�"
+              clearable
+              style="width: 240px;"
+              @keyup.enter="handleQuery"
+           />
+        </el-form-item>
+        <el-form-item label="绫诲瀷" prop="businessType">
+           <el-select
+              v-model="queryParams.businessType"
+              placeholder="鎿嶄綔绫诲瀷"
+              clearable
+              style="width: 240px"
+           >
+              <el-option
+                 v-for="dict in sys_oper_type"
+                 :key="dict.value"
+                 :label="dict.label"
+                 :value="dict.value"
+              />
+           </el-select>
+        </el-form-item>
+        <el-form-item label="鐘舵��" prop="status">
+           <el-select
+              v-model="queryParams.status"
+              placeholder="鎿嶄綔鐘舵��"
+              clearable
+              style="width: 240px"
+           >
+              <el-option
+                 v-for="dict in sys_common_status"
+                 :key="dict.value"
+                 :label="dict.label"
+                 :value="dict.value"
+              />
+           </el-select>
+        </el-form-item>
+        <el-form-item label="鎿嶄綔鏃堕棿" style="width: 308px">
+           <el-date-picker
+              v-model="dateRange"
+              value-format="YYYY-MM-DD HH:mm:ss"
+              type="daterange"
+              range-separator="-"
+              start-placeholder="寮�濮嬫棩鏈�"
+              end-placeholder="缁撴潫鏃ユ湡"
+              :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]"
+           ></el-date-picker>
+        </el-form-item>
+        <el-form-item>
+           <el-button type="primary" icon="Search" @click="handleQuery">鎼滅储</el-button>
+           <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button>
+        </el-form-item>
+     </el-form>
+
+     <el-row :gutter="10" class="mb8">
+        <el-col :span="1.5">
+           <el-button
+              type="danger"
+              plain
+              icon="Delete"
+              :disabled="multiple"
+              @click="handleDelete"
+              v-hasPermi="['monitor:operlog:remove']"
+           >鍒犻櫎</el-button>
+        </el-col>
+        <el-col :span="1.5">
+           <el-button
+              type="danger"
+              plain
+              icon="Delete"
+              @click="handleClean"
+              v-hasPermi="['monitor:operlog:remove']"
+           >娓呯┖</el-button>
+        </el-col>
+        <el-col :span="1.5">
+           <el-button
+              type="warning"
+              plain
+              icon="Download"
+              @click="handleExport"
+              v-hasPermi="['monitor:operlog:export']"
+           >瀵煎嚭</el-button>
+        </el-col>
+        <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
+     </el-row>
+
+     <el-table ref="operlogRef" v-loading="loading" :data="operlogList" @selection-change="handleSelectionChange" :default-sort="defaultSort" @sort-change="handleSortChange">
+        <el-table-column type="selection" width="50" align="center" />
+        <el-table-column label="鏃ュ織缂栧彿" align="center" prop="operId" />
+        <el-table-column label="绯荤粺妯″潡" align="center" prop="title" :show-overflow-tooltip="true" />
+        <el-table-column label="鎿嶄綔绫诲瀷" align="center" prop="businessType">
+           <template #default="scope">
+              <dict-tag :options="sys_oper_type" :value="scope.row.businessType" />
+           </template>
+        </el-table-column>
+        <el-table-column label="鎿嶄綔浜哄憳" align="center" width="110" prop="operName" :show-overflow-tooltip="true" sortable="custom" :sort-orders="['descending', 'ascending']" />
+        <el-table-column label="鎿嶄綔鍦板潃" align="center" prop="operIp" width="130" :show-overflow-tooltip="true" />
+        <el-table-column label="鎿嶄綔鐘舵��" align="center" prop="status">
+           <template #default="scope">
+              <dict-tag :options="sys_common_status" :value="scope.row.status" />
+           </template>
+        </el-table-column>
+        <el-table-column label="鎿嶄綔鏃ユ湡" align="center" prop="operTime" width="180" sortable="custom" :sort-orders="['descending', 'ascending']">
+           <template #default="scope">
+              <span>{{ parseTime(scope.row.operTime) }}</span>
+           </template>
+        </el-table-column>
+        <el-table-column label="娑堣�楁椂闂�" align="center" prop="costTime" width="110" :show-overflow-tooltip="true" sortable="custom" :sort-orders="['descending', 'ascending']">
+           <template #default="scope">
+              <span>{{ scope.row.costTime }}姣</span>
+           </template>
+        </el-table-column>
+        <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
+           <template #default="scope">
+              <el-button link type="primary" icon="View" @click="handleView(scope.row, scope.index)" v-hasPermi="['monitor:operlog:query']">璇︾粏</el-button>
+           </template>
+        </el-table-column>
+     </el-table>
+
+     <pagination
+        v-show="total > 0"
+        :total="total"
+        v-model:page="queryParams.pageNum"
+        v-model:limit="queryParams.pageSize"
+        @pagination="getList"
+     />
+
+     <!-- 鎿嶄綔鏃ュ織璇︾粏 -->
+     <el-dialog title="鎿嶄綔鏃ュ織璇︾粏" v-model="open" width="800px" append-to-body>
+        <el-form :model="form" label-width="100px">
+           <el-row>
+              <el-col :span="12">
+                 <el-form-item label="鎿嶄綔妯″潡锛�">{{ form.title }} / {{ typeFormat(form) }}</el-form-item>
+                 <el-form-item
+                   label="鐧诲綍淇℃伅锛�"
+                 >{{ form.operName }} / {{ form.operIp }} / {{ form.operLocation }}</el-form-item>
+              </el-col>
+              <el-col :span="12">
+                 <el-form-item label="璇锋眰鍦板潃锛�">{{ form.operUrl }}</el-form-item>
+                 <el-form-item label="璇锋眰鏂瑰紡锛�">{{ form.requestMethod }}</el-form-item>
+              </el-col>
+              <el-col :span="24">
+                 <el-form-item label="鎿嶄綔鏂规硶锛�">{{ form.method }}</el-form-item>
+              </el-col>
+              <el-col :span="24">
+                 <el-form-item label="璇锋眰鍙傛暟锛�">{{ form.operParam }}</el-form-item>
+              </el-col>
+              <el-col :span="24">
+                 <el-form-item label="杩斿洖鍙傛暟锛�">{{ form.jsonResult }}</el-form-item>
+              </el-col>
+              <el-col :span="8">
+                 <el-form-item label="鎿嶄綔鐘舵�侊細">
+                    <div v-if="form.status === 0">姝e父</div>
+                    <div v-else-if="form.status === 1">澶辫触</div>
+                 </el-form-item>
+              </el-col>
+              <el-col :span="8">
+                 <el-form-item label="娑堣�楁椂闂达細">{{ form.costTime }}姣</el-form-item>
+              </el-col>
+              <el-col :span="8">
+                 <el-form-item label="鎿嶄綔鏃堕棿锛�">{{ parseTime(form.operTime) }}</el-form-item>
+              </el-col>
+              <el-col :span="24">
+                 <el-form-item label="寮傚父淇℃伅锛�" v-if="form.status === 1">{{ form.errorMsg }}</el-form-item>
+              </el-col>
+           </el-row>
+        </el-form>
+        <template #footer>
+           <div class="dialog-footer">
+              <el-button @click="open = false">鍏� 闂�</el-button>
+           </div>
+        </template>
+     </el-dialog>
+  </div>
+</template>
+
+<script setup name="Operlog">
+import { list, delOperlog, cleanOperlog } from "@/api/monitor/operlog"
+import {onMounted} from "vue";
+
+const { proxy } = getCurrentInstance()
+const { sys_oper_type, sys_common_status } = proxy.useDict("sys_oper_type","sys_common_status")
+
+const operlogList = ref([])
+const open = ref(false)
+const loading = ref(true)
+const showSearch = ref(true)
+const ids = ref([])
+const single = ref(true)
+const multiple = ref(true)
+const total = ref(0)
+const title = ref("")
+const dateRange = ref([])
+const defaultSort = ref({ prop: "operTime", order: "descending" })
+
+const data = reactive({
+ form: {},
+ queryParams: {
+   pageNum: 1,
+   pageSize: 10,
+   operIp: undefined,
+   title: undefined,
+   operName: undefined,
+   businessType: undefined,
+   status: undefined
+ }
+})
+
+const { queryParams, form } = toRefs(data)
+
+/** 鏌ヨ鐧诲綍鏃ュ織 */
+function getList() {
+ loading.value = true
+ list(proxy.addDateRange(queryParams.value, dateRange.value)).then(response => {
+   operlogList.value = response.rows
+   total.value = response.total
+   loading.value = false
+ })
+}
+
+/** 鎿嶄綔鏃ュ織绫诲瀷瀛楀吀缈昏瘧 */
+function typeFormat(row, column) {
+ return proxy.selectDictLabel(sys_oper_type.value, row.businessType)
+}
+
+/** 鎼滅储鎸夐挳鎿嶄綔 */
+function handleQuery() {
+ queryParams.value.pageNum = 1
+ getList()
+}
+
+/** 閲嶇疆鎸夐挳鎿嶄綔 */
+function resetQuery() {
+ dateRange.value = []
+ proxy.resetForm("queryRef")
+ queryParams.value.pageNum = 1
+ proxy.$refs["operlogRef"].sort(defaultSort.value.prop, defaultSort.value.order)
+}
+
+/** 澶氶�夋閫変腑鏁版嵁 */
+function handleSelectionChange(selection) {
+ ids.value = selection.map(item => item.operId)
+ multiple.value = !selection.length
+}
+
+/** 鎺掑簭瑙﹀彂浜嬩欢 */
+function handleSortChange(column, prop, order) {
+ queryParams.value.orderByColumn = column.prop
+ queryParams.value.isAsc = column.order
+ getList()
+}
+
+/** 璇︾粏鎸夐挳鎿嶄綔 */
+function handleView(row) {
+ open.value = true
+ form.value = row
+}
+
+/** 鍒犻櫎鎸夐挳鎿嶄綔 */
+function handleDelete(row) {
+ const operIds = row.operId || ids.value
+ proxy.$modal.confirm('鏄惁纭鍒犻櫎鏃ュ織缂栧彿涓�"' + operIds + '"鐨勬暟鎹」?').then(function () {
+   return delOperlog(operIds)
+ }).then(() => {
+   getList()
+   proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛")
+ }).catch(() => {})
+}
+
+/** 娓呯┖鎸夐挳鎿嶄綔 */
+function handleClean() {
+ proxy.$modal.confirm("鏄惁纭娓呯┖鎵�鏈夋搷浣滄棩蹇楁暟鎹」?").then(function () {
+   return cleanOperlog()
+ }).then(() => {
+   getList()
+   proxy.$modal.msgSuccess("娓呯┖鎴愬姛")
+ }).catch(() => {})
+}
+
+/** 瀵煎嚭鎸夐挳鎿嶄綔 */
+function handleExport() {
+ proxy.download("monitor/operlog/export",{
+   ...queryParams.value,
+ }, `config_${new Date().getTime()}.xlsx`)
+}
+
+onMounted(() => {
+ getList();
+});
+</script>
+
diff --git a/src/views/officeProcessAutomation/SysAdmin/user-manage/authRole.vue b/src/views/officeProcessAutomation/SysAdmin/user-manage/authRole.vue
new file mode 100644
index 0000000..a7546aa
--- /dev/null
+++ b/src/views/officeProcessAutomation/SysAdmin/user-manage/authRole.vue
@@ -0,0 +1,123 @@
+<template>
+   <div class="app-container">
+      <h4 class="form-header h4">鍩烘湰淇℃伅</h4>
+      <el-form :model="form" label-width="80px">
+         <el-row>
+            <el-col :span="8" :offset="2">
+               <el-form-item label="鐢ㄦ埛鏄电О" prop="nickName">
+                  <el-input v-model="form.nickName" disabled />
+               </el-form-item>
+            </el-col>
+            <el-col :span="8" :offset="2">
+               <el-form-item label="鐧诲綍璐﹀彿" prop="userName">
+                  <el-input v-model="form.userName" disabled />
+               </el-form-item>
+            </el-col>
+         </el-row>
+      </el-form>
+
+      <h4 class="form-header h4">瑙掕壊淇℃伅</h4>
+      <el-table v-loading="loading" :row-key="getRowKey" @row-click="clickRow" ref="roleRef" @selection-change="handleSelectionChange" :data="roles.slice((pageNum - 1) * pageSize, pageNum * pageSize)">
+         <el-table-column label="搴忓彿" width="55" type="index" align="center">
+            <template #default="scope">
+               <span>{{ (pageNum - 1) * pageSize + scope.$index + 1 }}</span>
+            </template>
+         </el-table-column>
+         <el-table-column type="selection" :reserve-selection="true" :selectable="checkSelectable" width="55"></el-table-column>
+         <el-table-column label="瑙掕壊缂栧彿" align="center" prop="roleId" />
+         <el-table-column label="瑙掕壊鍚嶇О" align="center" prop="roleName" />
+         <el-table-column label="鏉冮檺瀛楃" align="center" prop="roleKey" />
+         <el-table-column label="鍒涘缓鏃堕棿" align="center" prop="createTime" width="180">
+            <template #default="scope">
+               <span>{{ parseTime(scope.row.createTime) }}</span>
+            </template>
+         </el-table-column>
+      </el-table>
+
+      <pagination v-show="total > 0" :total="total" v-model:page="pageNum" v-model:limit="pageSize" />
+
+      <el-form label-width="100px">
+         <div style="text-align: center;margin-left:-120px;margin-top:30px;">
+            <el-button type="primary" @click="submitForm()">鎻愪氦</el-button>
+            <el-button @click="close()">杩斿洖</el-button>
+         </div>
+      </el-form>
+   </div>
+</template>
+
+<script setup name="AuthRole">
+import { getAuthRole, updateAuthRole } from "@/api/system/user"
+
+const route = useRoute()
+const { proxy } = getCurrentInstance()
+
+const loading = ref(true)
+const total = ref(0)
+const pageNum = ref(1)
+const pageSize = ref(10)
+const roleIds = ref([])
+const roles = ref([])
+const form = ref({
+  nickName: undefined,
+  userName: undefined,
+  userId: undefined
+})
+
+/** 鍗曞嚮閫変腑琛屾暟鎹� */
+function clickRow(row) {
+  if (checkSelectable(row)) {
+    proxy.$refs["roleRef"].toggleRowSelection(row)
+  }
+}
+
+/** 澶氶�夋閫変腑鏁版嵁 */
+function handleSelectionChange(selection) {
+  roleIds.value = selection.map(item => item.roleId)
+}
+
+/** 淇濆瓨閫変腑鐨勬暟鎹紪鍙� */
+function getRowKey(row) {
+  return row.roleId
+}
+
+// 妫�鏌ヨ鑹茬姸鎬�
+function checkSelectable(row) {
+  return row.status === "0" ? true : false
+}
+
+/** 鍏抽棴鎸夐挳 */
+function close() {
+  const obj = { path: "/system/user" }
+  proxy.$tab.closeOpenPage(obj)
+}
+
+/** 鎻愪氦鎸夐挳 */
+function submitForm() {
+  const userId = form.value.userId
+  const rIds = roleIds.value.join(",")
+  updateAuthRole({ userId: userId, roleIds: rIds }).then(response => {
+    proxy.$modal.msgSuccess("鎺堟潈鎴愬姛")
+    close()
+  })
+}
+
+(() => {
+  const userId = route.params && route.params.userId
+  if (userId) {
+    loading.value = true
+    getAuthRole(userId).then(response => {
+      form.value = response.user
+      roles.value = response.roles
+      total.value = roles.value.length
+      nextTick(() => {
+        roles.value.forEach(row => {
+          if (row.flag) {
+            proxy.$refs["roleRef"].toggleRowSelection(row)
+          }
+        })
+      })
+      loading.value = false
+    })
+  }
+})()
+</script>
diff --git a/src/views/officeProcessAutomation/SysAdmin/user-manage/index.vue b/src/views/officeProcessAutomation/SysAdmin/user-manage/index.vue
new file mode 100644
index 0000000..97a06b1
--- /dev/null
+++ b/src/views/officeProcessAutomation/SysAdmin/user-manage/index.vue
@@ -0,0 +1,550 @@
+<!--OA妯″潡锛氱敤鎴风鐞�-->
+<template>
+	<div class="app-container">
+		<el-row :gutter="20" style="height: calc(100vh - 8em)">
+			<splitpanes :horizontal="appStore.device === 'mobile'" class="default-theme">
+				<!--閮ㄩ棬鏁版嵁-->
+				<pane size="16">
+					<el-col style="padding: 10px">
+						<div class="head-container">
+							<el-input v-model="deptNames" placeholder="璇疯緭鍏ラ儴闂ㄥ悕绉�" clearable prefix-icon="Search" style="margin-bottom: 20px" />
+						</div>
+						<div class="head-container">
+							<el-tree :data="deptOptions" :props="{ label: 'label', children: 'children' }" :expand-on-click-node="false" :filter-node-method="filterNode" ref="deptTreeRef" node-key="id" highlight-current default-expand-all @node-click="handleNodeClick" />
+						</div>
+					</el-col>
+				</pane>
+				<!--鐢ㄦ埛鏁版嵁-->
+				<pane size="84">
+					<el-col style="padding: 10px; height: 100%; display: flex; flex-direction: column;">
+						<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
+							<el-form-item label="鐧诲綍璐﹀彿" prop="userName">
+								<el-input v-model="queryParams.userName" placeholder="璇疯緭鍏ョ櫥褰曡处鍙�" clearable style="width: 240px" @keyup.enter="handleQuery" />
+							</el-form-item>
+							<el-form-item label="鎵嬫満鍙风爜" prop="phonenumber">
+								<el-input v-model="queryParams.phonenumber" placeholder="璇疯緭鍏ユ墜鏈哄彿鐮�" clearable style="width: 240px" @keyup.enter="handleQuery" />
+							</el-form-item>
+							<el-form-item label="鐘舵��" prop="status">
+								<el-select v-model="queryParams.status" placeholder="鐢ㄦ埛鐘舵��" clearable style="width: 240px">
+									<el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label" :value="dict.value" />
+								</el-select>
+							</el-form-item>
+							<el-form-item label="鍒涘缓鏃堕棿" style="width: 308px">
+								<el-date-picker v-model="dateRange" value-format="YYYY-MM-DD" type="daterange" range-separator="-" start-placeholder="寮�濮嬫棩鏈�" end-placeholder="缁撴潫鏃ユ湡"></el-date-picker>
+							</el-form-item>
+							<el-form-item>
+								<el-button type="primary" icon="Search" @click="handleQuery">鎼滅储</el-button>
+								<el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button>
+							</el-form-item>
+						</el-form>
+						
+						<el-row :gutter="10" class="mb8">
+							<el-col :span="1.5">
+								<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:user:add']">鏂板</el-button>
+							</el-col>
+							<el-col :span="1.5">
+								<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate" v-hasPermi="['system:user:edit']">淇敼</el-button>
+							</el-col>
+							<el-col :span="1.5">
+								<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete" v-hasPermi="['system:user:remove']">鍒犻櫎</el-button>
+							</el-col>
+							<el-col :span="1.5">
+								<el-button type="info" plain icon="Upload" @click="handleImport" v-hasPermi="['system:user:import']">瀵煎叆</el-button>
+							</el-col>
+							<el-col :span="1.5">
+								<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['system:user:export']">瀵煎嚭</el-button>
+							</el-col>
+							<right-toolbar v-model:showSearch="showSearch" @queryTable="getList" :columns="columns"></right-toolbar>
+						</el-row>
+						
+						<div style="flex: 1; overflow: hidden;">
+							<el-table v-loading="loading" :data="userList" height="100%" @selection-change="handleSelectionChange">
+								<el-table-column type="selection" width="50" align="center" />
+								<el-table-column label="鐢ㄦ埛缂栧彿" align="center" key="userId" prop="userId" v-if="columns[0].visible" />
+								<el-table-column label="鐧诲綍璐﹀彿" align="center" key="userName" prop="userName" v-if="columns[1].visible" :show-overflow-tooltip="true" />
+								<el-table-column label="鐢ㄦ埛鏄电О" align="center" key="nickName" prop="nickName" v-if="columns[2].visible" :show-overflow-tooltip="true" />
+								<el-table-column label="閮ㄩ棬" align="center" key="deptNames" prop="deptNames" v-if="columns[3].visible" :show-overflow-tooltip="true" />
+								<el-table-column label="鎵嬫満鍙风爜" align="center" key="phonenumber" prop="phonenumber" v-if="columns[4].visible" width="120" />
+								<el-table-column label="鐘舵��" align="center" key="status" v-if="columns[5].visible">
+									<template #default="scope">
+										<el-switch
+											v-model="scope.row.status"
+											active-value="0"
+											inactive-value="1"
+											@change="handleStatusChange(scope.row)"
+										></el-switch>
+									</template>
+								</el-table-column>
+								<el-table-column label="鍒涘缓鏃堕棿" align="center" prop="createTime" v-if="columns[6].visible" width="160">
+									<template #default="scope">
+										<span>{{ parseTime(scope.row.createTime) }}</span>
+									</template>
+								</el-table-column>
+								<el-table-column label="鎿嶄綔" align="center" width="150" class-name="small-padding fixed-width">
+									<template #default="scope">
+										<el-tooltip content="淇敼" placement="top" v-if="scope.row.userId !== 1">
+											<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:user:edit']"></el-button>
+										</el-tooltip>
+										<el-tooltip content="鍒犻櫎" placement="top" v-if="scope.row.userId !== 1">
+											<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:user:remove']"></el-button>
+										</el-tooltip>
+										<el-tooltip content="閲嶇疆瀵嗙爜" placement="top" v-if="scope.row.userId !== 1">
+											<el-button link type="primary" icon="Key" @click="handleResetPwd(scope.row)" v-hasPermi="['system:user:resetPwd']"></el-button>
+										</el-tooltip>
+										<el-tooltip content="鍒嗛厤瑙掕壊" placement="top" v-if="scope.row.userId !== 1">
+											<el-button link type="primary" icon="CircleCheck" @click="handleAuthRole(scope.row)" v-hasPermi="['system:user:edit']"></el-button>
+										</el-tooltip>
+									</template>
+								</el-table-column>
+							</el-table>
+						</div>
+						<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
+					</el-col>
+				</pane>
+			</splitpanes>
+		</el-row>
+		
+		<!-- 娣诲姞鎴栦慨鏀圭敤鎴烽厤缃璇濇 -->
+		<el-dialog :title="title" v-model="open" width="600px" append-to-body>
+			<el-form :model="form" :rules="rules" ref="userRef" label-width="80px">
+				<el-row>
+					<el-col :span="12">
+						<el-form-item v-if="form.userId == undefined" label="鐧诲綍璐﹀彿" prop="userName">
+							<el-input v-model="form.userName" placeholder="璇疯緭鍏ョ敤鎴峰悕绉�" maxlength="30" />
+						</el-form-item>
+					</el-col>
+					<el-col :span="12">
+						<el-form-item v-if="form.userId == undefined" label="鐢ㄦ埛瀵嗙爜" prop="password">
+							<el-input v-model="form.password" placeholder="璇疯緭鍏ョ敤鎴峰瘑鐮�" type="password" maxlength="20" show-password />
+						</el-form-item>
+					</el-col>
+				</el-row>
+				<el-row>
+					<el-col :span="12">
+						<el-form-item label="鐢ㄦ埛鏄电О" prop="nickName">
+							<el-input v-model="form.nickName" placeholder="璇疯緭鍏ョ敤鎴锋樀绉�" maxlength="30" />
+						</el-form-item>
+					</el-col>
+					<el-col :span="12">
+						<el-form-item label="褰掑睘閮ㄩ棬" prop="deptId">
+							<el-tree-select v-model="form.deptId" :data="enabledDeptOptions" :props="{ value: 'id', label: 'label', children: 'children' }" value-key="id" placeholder="璇烽�夋嫨褰掑睘閮ㄩ棬" check-strictly />
+						</el-form-item>
+					</el-col>
+				</el-row>
+				<el-row>
+					<el-col :span="12">
+						<el-form-item label="宀椾綅" prop="postIds">
+							<el-select v-model="form.postIds" multiple placeholder="璇烽�夋嫨">
+								<el-option v-for="item in postOptions" :key="item.postId" :label="item.postName" :value="item.postId" :disabled="item.status == 1"></el-option>
+							</el-select>
+						</el-form-item>
+					</el-col>
+					<el-col :span="12">
+						<el-form-item label="瑙掕壊" prop="roleIds">
+							<el-select v-model="form.roleIds" multiple placeholder="璇烽�夋嫨">
+								<el-option v-for="item in roleOptions" :key="item.roleId" :label="item.roleName" :value="item.roleId" :disabled="item.status == 1"></el-option>
+							</el-select>
+						</el-form-item>
+					</el-col>
+				</el-row>
+				<el-row>
+					<el-col :span="12">
+						<el-form-item label="鎵嬫満鍙风爜" prop="phonenumber">
+							<el-input v-model="form.phonenumber" placeholder="璇疯緭鍏ユ墜鏈哄彿鐮�" maxlength="11" />
+						</el-form-item>
+					</el-col>
+					<el-col :span="12">
+						<el-form-item label="閭" prop="email">
+							<el-input v-model="form.email" placeholder="璇疯緭鍏ラ偖绠�" maxlength="50" />
+						</el-form-item>
+					</el-col>
+				</el-row>
+				<el-row>
+					<el-col :span="12">
+						<el-form-item label="鐢ㄦ埛鎬у埆">
+							<el-select v-model="form.sex" placeholder="璇烽�夋嫨">
+								<el-option v-for="dict in sys_user_sex" :key="dict.value" :label="dict.label" :value="dict.value"></el-option>
+							</el-select>
+						</el-form-item>
+					</el-col>
+					<el-col :span="12">
+						<el-form-item label="鐘舵��">
+							<el-radio-group v-model="form.status">
+								<el-radio v-for="dict in sys_normal_disable" :key="dict.value" :value="dict.value">{{ dict.label }}</el-radio>
+							</el-radio-group>
+						</el-form-item>
+					</el-col>
+				</el-row>
+				<el-row>
+					<el-col :span="24">
+						<el-form-item label="澶囨敞">
+							<el-input v-model="form.remark" type="textarea" placeholder="璇疯緭鍏ュ唴瀹�"></el-input>
+						</el-form-item>
+					</el-col>
+				</el-row>
+			</el-form>
+			<template #footer>
+				<div class="dialog-footer">
+					<el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+					<el-button @click="cancel">鍙� 娑�</el-button>
+				</div>
+			</template>
+		</el-dialog>
+		
+		<!-- 鐢ㄦ埛瀵煎叆瀵硅瘽妗� -->
+		<el-dialog :title="upload.title" v-model="upload.open" width="400px" append-to-body>
+			<el-upload ref="uploadRef" :limit="1" accept=".xlsx, .xls" :headers="upload.headers" :action="upload.url + '?updateSupport=' + upload.updateSupport" :disabled="upload.isUploading" :on-progress="handleFileUploadProgress" :on-success="handleFileSuccess" :auto-upload="false" drag>
+				<el-icon class="el-icon--upload"><upload-filled /></el-icon>
+				<div class="el-upload__text">灏嗘枃浠舵嫋鍒版澶勶紝鎴�<em>鐐瑰嚮涓婁紶</em></div>
+				<template #tip>
+					<div class="el-upload__tip text-center">
+						<div class="el-upload__tip">
+							<el-checkbox v-model="upload.updateSupport" />鏄惁鏇存柊宸茬粡瀛樺湪鐨勭敤鎴锋暟鎹�
+						</div>
+						<span>浠呭厑璁稿鍏ls銆亁lsx鏍煎紡鏂囦欢銆�</span>
+						<el-link type="primary" :underline="false" style="font-size: 12px; vertical-align: baseline" @click="importTemplate">涓嬭浇妯℃澘</el-link>
+					</div>
+				</template>
+			</el-upload>
+			<template #footer>
+				<div class="dialog-footer">
+					<el-button type="primary" @click="submitFileForm">纭� 瀹�</el-button>
+					<el-button @click="upload.open = false">鍙� 娑�</el-button>
+				</div>
+			</template>
+		</el-dialog>
+	</div>
+</template>
+
+<script setup name="User">
+import { getToken } from "@/utils/auth"
+import useAppStore from '@/store/modules/app'
+import { changeUserStatus, listUser, resetUserPwd, delUser, getUser, updateUser, addUser, deptTreeSelect } from "@/api/system/user"
+import { Splitpanes, Pane } from "splitpanes"
+import "splitpanes/dist/splitpanes.css"
+
+const router = useRouter()
+const appStore = useAppStore()
+const { proxy } = getCurrentInstance()
+const { sys_normal_disable, sys_user_sex } = proxy.useDict("sys_normal_disable", "sys_user_sex")
+
+const userList = ref([])
+const open = ref(false)
+const loading = ref(true)
+const showSearch = ref(true)
+const ids = ref([])
+const single = ref(true)
+const multiple = ref(true)
+const total = ref(0)
+const title = ref("")
+const dateRange = ref([])
+const deptNames = ref("")
+const deptOptions = ref(undefined)
+const enabledDeptOptions = ref(undefined)
+const initPassword = ref(undefined)
+const postOptions = ref([])
+const roleOptions = ref([])
+/*** 鐢ㄦ埛瀵煎叆鍙傛暟 */
+const upload = reactive({
+	// 鏄惁鏄剧ず寮瑰嚭灞傦紙鐢ㄦ埛瀵煎叆锛�
+	open: false,
+	// 寮瑰嚭灞傛爣棰橈紙鐢ㄦ埛瀵煎叆锛�
+	title: "",
+	// 鏄惁绂佺敤涓婁紶
+	isUploading: false,
+	// 鏄惁鏇存柊宸茬粡瀛樺湪鐨勭敤鎴锋暟鎹�
+	updateSupport: 0,
+	// 璁剧疆涓婁紶鐨勮姹傚ご閮�
+	headers: { Authorization: "Bearer " + getToken() },
+	// 涓婁紶鐨勫湴鍧�
+	url: import.meta.env.VITE_APP_BASE_API + "/system/user/importData"
+})
+// 鍒楁樉闅愪俊鎭�
+const columns = ref([
+	{ key: 0, label: `鐢ㄦ埛缂栧彿`, visible: true },
+	{ key: 1, label: `鐧诲綍璐﹀彿`, visible: true },
+	{ key: 2, label: `鐢ㄦ埛鏄电О`, visible: true },
+	{ key: 3, label: `閮ㄩ棬`, visible: true },
+	{ key: 4, label: `鎵嬫満鍙风爜`, visible: true },
+	{ key: 5, label: `鐘舵�乣, visible: true },
+	{ key: 6, label: `鍒涘缓鏃堕棿`, visible: true }
+])
+
+const data = reactive({
+	form: {},
+	queryParams: {
+		pageNum: 1,
+		pageSize: 10,
+		userName: undefined,
+		phonenumber: undefined,
+		status: undefined,
+		deptId: undefined
+	},
+	rules: {
+		userName: [{ required: true, message: "鐢ㄦ埛鍚嶇О涓嶈兘涓虹┖", trigger: "blur" }, { min: 2, max: 20, message: "鐢ㄦ埛鍚嶇О闀垮害蹇呴』浠嬩簬 2 鍜� 20 涔嬮棿", trigger: "blur" }],
+		nickName: [{ required: true, message: "鐢ㄦ埛鏄电О涓嶈兘涓虹┖", trigger: "blur" }],
+		password: [{ required: true, message: "鐢ㄦ埛瀵嗙爜涓嶈兘涓虹┖", trigger: "blur" }, { min: 5, max: 20, message: "鐢ㄦ埛瀵嗙爜闀垮害蹇呴』浠嬩簬 5 鍜� 20 涔嬮棿", trigger: "blur" }, { pattern: /^[^<>"'|\\]+$/, message: "涓嶈兘鍖呭惈闈炴硶瀛楃锛�< > \" ' \\\ |", trigger: "blur" }],
+		email: [{ type: "email", message: "璇疯緭鍏ユ纭殑閭鍦板潃", trigger: ["blur", "change"] }],
+		phonenumber: [{ pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: "璇疯緭鍏ユ纭殑鎵嬫満鍙风爜", trigger: "blur" }],
+		deptId: [{ required: true, message: "褰掑睘閮ㄩ棬涓嶈兘涓虹┖", trigger: "change" }],
+		postIds: [{ required: true, message: "宀椾綅涓嶈兘涓虹┖", trigger: "change" }],
+		roleIds: [{ required: true, message: "瑙掕壊涓嶈兘涓虹┖", trigger: "change" }]
+	}
+})
+
+const { queryParams, form, rules } = toRefs(data)
+
+/** 閫氳繃鏉′欢杩囨护鑺傜偣  */
+const filterNode = (value, data) => {
+	if (!value) return true
+	return data.label.indexOf(value) !== -1
+}
+
+/** 鏍规嵁鍚嶇О绛涢�夐儴闂ㄦ爲 */
+watch(deptNames, val => {
+	proxy.$refs["deptTreeRef"].filter(val)
+})
+
+/** 鏌ヨ鐢ㄦ埛鍒楄〃 */
+function getList() {
+	loading.value = true
+	listUser(proxy.addDateRange(queryParams.value, dateRange.value)).then(res => {
+		loading.value = false
+		userList.value = res.rows
+		total.value = res.total
+	})
+}
+
+/** 鏌ヨ閮ㄩ棬涓嬫媺鏍戠粨鏋� */
+function getDeptTree() {
+	deptTreeSelect().then(response => {
+		deptOptions.value = response.data
+		enabledDeptOptions.value = filterDisabledDept(JSON.parse(JSON.stringify(response.data)))
+	})
+}
+
+/** 杩囨护绂佺敤鐨勯儴闂� */
+function filterDisabledDept(deptList) {
+	return deptList.filter(dept => {
+		if (dept.disabled) {
+			return false
+		}
+		if (dept.children && dept.children.length) {
+			dept.children = filterDisabledDept(dept.children)
+		}
+		return true
+	})
+}
+
+/** 鑺傜偣鍗曞嚮浜嬩欢 */
+function handleNodeClick(data) {
+	queryParams.value.deptId = data.id
+	handleQuery()
+}
+
+/** 鎼滅储鎸夐挳鎿嶄綔 */
+function handleQuery() {
+	queryParams.value.pageNum = 1
+	getList()
+}
+
+/** 閲嶇疆鎸夐挳鎿嶄綔 */
+function resetQuery() {
+	dateRange.value = []
+	proxy.resetForm("queryRef")
+	queryParams.value.deptId = undefined
+	proxy.$refs.deptTreeRef.setCurrentKey(null)
+	handleQuery()
+}
+
+/** 鍒犻櫎鎸夐挳鎿嶄綔 */
+function handleDelete(row) {
+	const userIds = row.userId || ids.value
+	proxy.$modal.confirm('鏄惁纭鍒犻櫎鐢ㄦ埛缂栧彿涓�"' + userIds + '"鐨勬暟鎹」锛�').then(function () {
+		return delUser(userIds)
+	}).then(() => {
+		getList()
+		proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛")
+	}).catch(() => {})
+}
+
+/** 瀵煎嚭鎸夐挳鎿嶄綔 */
+function handleExport() {
+	proxy.download("system/user/export", {
+		...queryParams.value,
+	},`user_${new Date().getTime()}.xlsx`)
+}
+
+/** 鐢ㄦ埛鐘舵�佷慨鏀�  */
+function handleStatusChange(row) {
+	let text = row.status === "0" ? "鍚敤" : "鍋滅敤"
+	proxy.$modal.confirm('纭瑕�"' + text + '""' + row.userName + '"鐢ㄦ埛鍚�?').then(function () {
+		return changeUserStatus(row.userId, row.status)
+	}).then(() => {
+		proxy.$modal.msgSuccess(text + "鎴愬姛")
+	}).catch(function () {
+		row.status = row.status === "0" ? "1" : "0"
+	})
+}
+
+/** 鏇村鎿嶄綔 */
+function handleCommand(command, row) {
+	switch (command) {
+		case "handleResetPwd":
+			handleResetPwd(row)
+			break
+		case "handleAuthRole":
+			handleAuthRole(row)
+			break
+		default:
+			break
+	}
+}
+
+/** 璺宠浆瑙掕壊鍒嗛厤 */
+function handleAuthRole(row) {
+	const userId = row.userId
+	router.push("/system/user-auth/role/" + userId)
+}
+
+/** 閲嶇疆瀵嗙爜鎸夐挳鎿嶄綔 */
+function handleResetPwd(row) {
+	proxy.$prompt('璇疯緭鍏�"' + row.userName + '"鐨勬柊瀵嗙爜', "鎻愮ず", {
+		confirmButtonText: "纭畾",
+		cancelButtonText: "鍙栨秷",
+		closeOnClickModal: false,
+		inputPattern: /^.{5,20}$/,
+		inputErrorMessage: "鐢ㄦ埛瀵嗙爜闀垮害蹇呴』浠嬩簬 5 鍜� 20 涔嬮棿",
+		inputValidator: (value) => {
+			if (/<|>|"|'|\||\\/.test(value)) {
+				return "涓嶈兘鍖呭惈闈炴硶瀛楃锛�< > \" ' \\\ |"
+			}
+		},
+	}).then(({ value }) => {
+		resetUserPwd(row.userId, value).then(response => {
+			proxy.$modal.msgSuccess("淇敼鎴愬姛锛屾柊瀵嗙爜鏄細" + value)
+		})
+	}).catch(() => {})
+}
+
+/** 閫夋嫨鏉℃暟  */
+function handleSelectionChange(selection) {
+	ids.value = selection.map(item => item.userId)
+	single.value = selection.length != 1
+	multiple.value = !selection.length
+}
+
+/** 瀵煎叆鎸夐挳鎿嶄綔 */
+function handleImport() {
+	upload.title = "鐢ㄦ埛瀵煎叆"
+	upload.open = true
+}
+
+/** 涓嬭浇妯℃澘鎿嶄綔 */
+function importTemplate() {
+	proxy.download("system/user/importTemplate", {
+	}, `user_template_${new Date().getTime()}.xlsx`)
+}
+
+/**鏂囦欢涓婁紶涓鐞� */
+const handleFileUploadProgress = (event, file, fileList) => {
+	upload.isUploading = true
+}
+
+/** 鏂囦欢涓婁紶鎴愬姛澶勭悊 */
+const handleFileSuccess = (response, file, fileList) => {
+	upload.open = false
+	upload.isUploading = false
+	proxy.$refs["uploadRef"].handleRemove(file)
+	proxy.$alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.msg + "</div>", "瀵煎叆缁撴灉", { dangerouslyUseHTMLString: true })
+	getList()
+}
+
+/** 鎻愪氦涓婁紶鏂囦欢 */
+function submitFileForm() {
+	proxy.$refs["uploadRef"].submit()
+}
+
+/** 閲嶇疆鎿嶄綔琛ㄥ崟 */
+function reset() {
+	form.value = {
+		userId: undefined,
+		deptId: undefined,
+		userName: undefined,
+		nickName: undefined,
+		password: undefined,
+		phonenumber: undefined,
+		email: undefined,
+		sex: undefined,
+		status: "0",
+		remark: undefined,
+		postIds: [],
+		roleIds: []
+	}
+	proxy.resetForm("userRef")
+}
+
+/** 鍙栨秷鎸夐挳 */
+function cancel() {
+	open.value = false
+	reset()
+}
+
+/** 鏂板鎸夐挳鎿嶄綔 */
+function handleAdd() {
+	reset()
+	getUser().then(response => {
+		postOptions.value = response.posts
+		roleOptions.value = response.roles
+		open.value = true
+		title.value = "娣诲姞鐢ㄦ埛"
+		form.value.password = initPassword.value
+	})
+}
+
+/** 淇敼鎸夐挳鎿嶄綔 */
+function handleUpdate(row) {
+	reset()
+	const userId = row.userId || ids.value
+	getUser(userId).then(response => {
+		form.value = response.data
+		postOptions.value = response.posts
+		roleOptions.value = response.roles
+		form.value.postIds = response.postIds
+		form.value.roleIds = response.roleIds
+		open.value = true
+		title.value = "淇敼鐢ㄦ埛"
+		form.password = ""
+	})
+}
+
+/** 鎻愪氦鎸夐挳 */
+function submitForm() {
+	proxy.$refs["userRef"].validate(valid => {
+		if (valid) {
+			// 褰掑睘閮ㄩ棬铏界劧鏄崟閫夛紝浣嗗悗绔渶瑕佷紶鏁扮粍瀛楁 deptIds
+			const payload = {
+				...form.value,
+				deptIds: form.value.deptId ? [form.value.deptId] : []
+			}
+			if (form.value.userId != undefined) {
+				updateUser(payload).then(response => {
+					proxy.$modal.msgSuccess("淇敼鎴愬姛")
+					open.value = false
+					getList()
+				})
+			} else {
+				addUser(payload).then(response => {
+					proxy.$modal.msgSuccess("鏂板鎴愬姛")
+					open.value = false
+					getList()
+				})
+			}
+		}
+	})
+}
+
+getDeptTree()
+getList()
+</script>
+
diff --git a/src/views/officeProcessAutomation/SysAdmin/user-manage/profile/index.vue b/src/views/officeProcessAutomation/SysAdmin/user-manage/profile/index.vue
new file mode 100644
index 0000000..719a028
--- /dev/null
+++ b/src/views/officeProcessAutomation/SysAdmin/user-manage/profile/index.vue
@@ -0,0 +1,87 @@
+<template>
+   <div class="app-container">
+      <el-row :gutter="20">
+         <el-col :span="6" :xs="24">
+            <el-card class="box-card">
+               <template v-slot:header>
+                 <div class="clearfix">
+                   <span>涓汉淇℃伅</span>
+                 </div>
+               </template>
+               <div>
+                  <div class="text-center">
+                     <userAvatar />
+                  </div>
+                  <ul class="list-group list-group-striped">
+                     <li class="list-group-item">
+                        <svg-icon icon-class="user" />鐢ㄦ埛鍚嶇О
+                        <div class="pull-right">{{ state.user.userName }}</div>
+                     </li>
+                     <li class="list-group-item">
+                        <svg-icon icon-class="phone" />鎵嬫満鍙风爜
+                        <div class="pull-right">{{ state.user.phonenumber }}</div>
+                     </li>
+                     <li class="list-group-item">
+                        <svg-icon icon-class="email" />鐢ㄦ埛閭
+                        <div class="pull-right">{{ state.user.email }}</div>
+                     </li>
+                     <li class="list-group-item">
+                        <svg-icon icon-class="tree" />鎵�灞為儴闂�
+                        <div class="pull-right" v-if="state.user.dept">{{ state.user.dept.deptName }} / {{ state.postGroup }}</div>
+                     </li>
+                     <li class="list-group-item">
+                        <svg-icon icon-class="peoples" />鎵�灞炶鑹�
+                        <div class="pull-right">{{ state.roleGroup }}</div>
+                     </li>
+                     <li class="list-group-item">
+                        <svg-icon icon-class="date" />鍒涘缓鏃ユ湡
+                        <div class="pull-right">{{ state.user.createTime }}</div>
+                     </li>
+                  </ul>
+               </div>
+            </el-card>
+         </el-col>
+         <el-col :span="18" :xs="24">
+            <el-card>
+               <template v-slot:header>
+                 <div class="clearfix">
+                   <span>鍩烘湰璧勬枡</span>
+                 </div>
+               </template>
+               <el-tabs v-model="activeTab">
+                  <el-tab-pane label="鍩烘湰璧勬枡" name="userinfo">
+                     <userInfo :user="state.user" />
+                  </el-tab-pane>
+                  <el-tab-pane label="淇敼瀵嗙爜" name="resetPwd">
+                     <resetPwd />
+                  </el-tab-pane>
+               </el-tabs>
+            </el-card>
+         </el-col>
+      </el-row>
+   </div>
+</template>
+
+<script setup name="Profile">
+import userAvatar from "./userAvatar"
+import userInfo from "./userInfo"
+import resetPwd from "./resetPwd"
+import { getUserProfile } from "@/api/system/user"
+
+const activeTab = ref("userinfo")
+const state = reactive({
+  user: {},
+  roleGroup: {},
+  postGroup: {}
+})
+
+function getUser() {
+  getUserProfile().then(response => {
+    state.user = response.data
+    state.roleGroup = response.roleGroup
+    state.postGroup = response.postGroup
+  })
+}
+
+getUser()
+</script>
diff --git a/src/views/officeProcessAutomation/SysAdmin/user-manage/profile/resetPwd.vue b/src/views/officeProcessAutomation/SysAdmin/user-manage/profile/resetPwd.vue
new file mode 100644
index 0000000..73c6b18
--- /dev/null
+++ b/src/views/officeProcessAutomation/SysAdmin/user-manage/profile/resetPwd.vue
@@ -0,0 +1,59 @@
+<template>
+   <el-form ref="pwdRef" :model="user" :rules="rules" label-width="80px">
+      <el-form-item label="鏃у瘑鐮�" prop="oldPassword">
+         <el-input v-model="user.oldPassword" placeholder="璇疯緭鍏ユ棫瀵嗙爜" type="password" show-password />
+      </el-form-item>
+      <el-form-item label="鏂板瘑鐮�" prop="newPassword">
+         <el-input v-model="user.newPassword" placeholder="璇疯緭鍏ユ柊瀵嗙爜" type="password" show-password />
+      </el-form-item>
+      <el-form-item label="纭瀵嗙爜" prop="confirmPassword">
+         <el-input v-model="user.confirmPassword" placeholder="璇风‘璁ゆ柊瀵嗙爜" type="password" show-password/>
+      </el-form-item>
+      <el-form-item>
+      <el-button type="primary" @click="submit">淇濆瓨</el-button>
+      <el-button type="danger" @click="close">鍏抽棴</el-button>
+      </el-form-item>
+   </el-form>
+</template>
+
+<script setup>
+import { updateUserPwd } from "@/api/system/user"
+
+const { proxy } = getCurrentInstance()
+
+const user = reactive({
+  oldPassword: undefined,
+  newPassword: undefined,
+  confirmPassword: undefined
+})
+
+const equalToPassword = (rule, value, callback) => {
+  if (user.newPassword !== value) {
+    callback(new Error("涓ゆ杈撳叆鐨勫瘑鐮佷笉涓�鑷�"))
+  } else {
+    callback()
+  }
+}
+
+const rules = ref({
+  oldPassword: [{ required: true, message: "鏃у瘑鐮佷笉鑳戒负绌�", trigger: "blur" }],
+  newPassword: [{ required: true, message: "鏂板瘑鐮佷笉鑳戒负绌�", trigger: "blur" }, { min: 6, max: 20, message: "闀垮害鍦� 6 鍒� 20 涓瓧绗�", trigger: "blur" }, { pattern: /^[^<>"'|\\]+$/, message: "涓嶈兘鍖呭惈闈炴硶瀛楃锛�< > \" ' \\\ |", trigger: "blur" }],
+  confirmPassword: [{ required: true, message: "纭瀵嗙爜涓嶈兘涓虹┖", trigger: "blur" }, { required: true, validator: equalToPassword, trigger: "blur" }]
+})
+
+/** 鎻愪氦鎸夐挳 */
+function submit() {
+  proxy.$refs.pwdRef.validate(valid => {
+    if (valid) {
+      updateUserPwd(user.oldPassword, user.newPassword).then(response => {
+        proxy.$modal.msgSuccess("淇敼鎴愬姛")
+      })
+    }
+  })
+}
+
+/** 鍏抽棴鎸夐挳 */
+function close() {
+  proxy.$tab.closePage()
+}
+</script>
diff --git a/src/views/officeProcessAutomation/SysAdmin/user-manage/profile/userAvatar.vue b/src/views/officeProcessAutomation/SysAdmin/user-manage/profile/userAvatar.vue
new file mode 100644
index 0000000..2594543
--- /dev/null
+++ b/src/views/officeProcessAutomation/SysAdmin/user-manage/profile/userAvatar.vue
@@ -0,0 +1,168 @@
+<template>
+  <div class="user-info-head" @click="editCropper()">
+    <img :src="options.img" title="鐐瑰嚮涓婁紶澶村儚" class="img-circle img-lg" />
+    <el-dialog :title="title" v-model="open" width="800px" append-to-body @opened="modalOpened" @close="closeDialog">
+      <el-row>
+        <el-col :xs="24" :md="12" :style="{ height: '350px' }">
+          <vue-cropper ref="cropper" :img="options.img" :info="true" :autoCrop="options.autoCrop"
+            :autoCropWidth="options.autoCropWidth" :autoCropHeight="options.autoCropHeight" :fixedBox="options.fixedBox"
+            :outputType="options.outputType" @realTime="realTime" v-if="visible" />
+        </el-col>
+        <el-col :xs="24" :md="12" :style="{ height: '350px' }">
+          <div class="avatar-upload-preview">
+            <img :src="options.previews.url" :style="options.previews.img" />
+          </div>
+        </el-col>
+      </el-row>
+      <br />
+      <el-row>
+        <el-col :lg="2" :md="2">
+          <el-upload action="#" :http-request="requestUpload" :show-file-list="false" :before-upload="beforeUpload">
+            <el-button>
+              閫夋嫨
+              <el-icon class="el-icon--right">
+                <Upload />
+              </el-icon>
+            </el-button>
+          </el-upload>
+        </el-col>
+        <el-col :lg="{ span: 1, offset: 2 }" :md="2">
+          <el-button icon="Plus" @click="changeScale(1)"></el-button>
+        </el-col>
+        <el-col :lg="{ span: 1, offset: 1 }" :md="2">
+          <el-button icon="Minus" @click="changeScale(-1)"></el-button>
+        </el-col>
+        <el-col :lg="{ span: 1, offset: 1 }" :md="2">
+          <el-button icon="RefreshLeft" @click="rotateLeft()"></el-button>
+        </el-col>
+        <el-col :lg="{ span: 1, offset: 1 }" :md="2">
+          <el-button icon="RefreshRight" @click="rotateRight()"></el-button>
+        </el-col>
+        <el-col :lg="{ span: 2, offset: 6 }" :md="2">
+          <el-button type="primary" @click="uploadImg()">鎻� 浜�</el-button>
+        </el-col>
+      </el-row>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup>
+import "vue-cropper/dist/index.css"
+import { VueCropper } from "vue-cropper"
+import { uploadAvatar } from "@/api/system/user"
+import useUserStore from "@/store/modules/user"
+
+const userStore = useUserStore()
+const { proxy } = getCurrentInstance()
+
+const open = ref(false)
+const visible = ref(false)
+const title = ref("淇敼澶村儚")
+
+//鍥剧墖瑁佸壀鏁版嵁
+const options = reactive({
+  img: userStore.avatar,     // 瑁佸壀鍥剧墖鐨勫湴鍧�
+  autoCrop: true,            // 鏄惁榛樿鐢熸垚鎴浘妗�
+  autoCropWidth: 200,        // 榛樿鐢熸垚鎴浘妗嗗搴�
+  autoCropHeight: 200,       // 榛樿鐢熸垚鎴浘妗嗛珮搴�
+  fixedBox: true,            // 鍥哄畾鎴浘妗嗗ぇ灏� 涓嶅厑璁告敼鍙�
+  outputType: "png",         // 榛樿鐢熸垚鎴浘涓篜NG鏍煎紡
+  filename: 'avatar',        // 鏂囦欢鍚嶇О
+  previews: {}               //棰勮鏁版嵁
+})
+
+/** 缂栬緫澶村儚 */
+function editCropper() {
+  open.value = true
+}
+
+/** 鎵撳紑寮瑰嚭灞傜粨鏉熸椂鐨勫洖璋� */
+function modalOpened() {
+  visible.value = true
+}
+
+/** 瑕嗙洊榛樿涓婁紶琛屼负 */
+function requestUpload() { }
+
+/** 鍚戝乏鏃嬭浆 */
+function rotateLeft() {
+  proxy.$refs.cropper.rotateLeft()
+}
+
+/** 鍚戝彸鏃嬭浆 */
+function rotateRight() {
+  proxy.$refs.cropper.rotateRight()
+}
+
+/** 鍥剧墖缂╂斁 */
+function changeScale(num) {
+  num = num || 1
+  proxy.$refs.cropper.changeScale(num)
+}
+
+/** 涓婁紶棰勫鐞� */
+function beforeUpload(file) {
+  if (file.type.indexOf("image/") == -1) {
+    proxy.$modal.msgError("鏂囦欢鏍煎紡閿欒锛岃涓婁紶鍥剧墖绫诲瀷,濡傦細JPG锛孭NG鍚庣紑鐨勬枃浠躲��")
+  } else {
+    const reader = new FileReader()
+    reader.readAsDataURL(file)
+    reader.onload = () => {
+      options.img = reader.result
+      options.filename = file.name
+    }
+  }
+}
+
+/** 涓婁紶鍥剧墖 */
+function uploadImg() {
+  proxy.$refs.cropper.getCropBlob(data => {
+    let formData = new FormData()
+    formData.append("avatarfile", data, options.filename)
+    uploadAvatar(formData).then(response => {
+      open.value = false
+      options.img = import.meta.env.VITE_APP_BASE_API + '/profile/' + response.imgUrl
+      userStore.avatar = options.img
+      proxy.$modal.msgSuccess("淇敼鎴愬姛")
+      visible.value = false
+    })
+  })
+}
+
+/** 瀹炴椂棰勮 */
+function realTime(data) {
+  options.previews = data
+}
+
+/** 鍏抽棴绐楀彛 */
+function closeDialog() {
+  options.img = userStore.avatar
+  options.visible = false
+}
+</script>
+
+<style lang='scss' scoped>
+.user-info-head {
+  position: relative;
+  display: inline-block;
+  height: 120px;
+}
+
+.user-info-head:hover:after {
+  content: "+";
+  position: absolute;
+  left: 0;
+  right: 0;
+  top: 0;
+  bottom: 0;
+  color: #eee;
+  background: rgba(0, 0, 0, 0.5);
+  font-size: 24px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+  cursor: pointer;
+  line-height: 110px;
+  border-radius: 50%;
+}
+</style>
\ No newline at end of file
diff --git a/src/views/officeProcessAutomation/SysAdmin/user-manage/profile/userInfo.vue b/src/views/officeProcessAutomation/SysAdmin/user-manage/profile/userInfo.vue
new file mode 100644
index 0000000..5099ffa
--- /dev/null
+++ b/src/views/officeProcessAutomation/SysAdmin/user-manage/profile/userInfo.vue
@@ -0,0 +1,67 @@
+<template>
+   <el-form ref="userRef" :model="form" :rules="rules" label-width="80px">
+      <el-form-item label="鐢ㄦ埛鏄电О" prop="nickName">
+         <el-input v-model="form.nickName" maxlength="30" />
+      </el-form-item>
+      <el-form-item label="鎵嬫満鍙风爜" prop="phonenumber">
+         <el-input v-model="form.phonenumber" maxlength="11" />
+      </el-form-item>
+      <el-form-item label="閭" prop="email">
+         <el-input v-model="form.email" maxlength="50" />
+      </el-form-item>
+      <el-form-item label="鎬у埆">
+         <el-radio-group v-model="form.sex">
+            <el-radio value="0">鐢�</el-radio>
+            <el-radio value="1">濂�</el-radio>
+         </el-radio-group>
+      </el-form-item>
+      <el-form-item>
+      <el-button type="primary" @click="submit">淇濆瓨</el-button>
+      <el-button type="danger" @click="close">鍏抽棴</el-button>
+      </el-form-item>
+   </el-form>
+</template>
+
+<script setup>
+import { updateUserProfile } from "@/api/system/user"
+
+const props = defineProps({
+  user: {
+    type: Object
+  }
+})
+
+const { proxy } = getCurrentInstance()
+
+const form = ref({})
+const rules = ref({
+  nickName: [{ required: true, message: "鐢ㄦ埛鏄电О涓嶈兘涓虹┖", trigger: "blur" }],
+  email: [{ required: true, message: "閭鍦板潃涓嶈兘涓虹┖", trigger: "blur" }, { type: "email", message: "璇疯緭鍏ユ纭殑閭鍦板潃", trigger: ["blur", "change"] }],
+  phonenumber: [{ required: true, message: "鎵嬫満鍙风爜涓嶈兘涓虹┖", trigger: "blur" }, { pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: "璇疯緭鍏ユ纭殑鎵嬫満鍙风爜", trigger: "blur" }],
+})
+
+/** 鎻愪氦鎸夐挳 */
+function submit() {
+  proxy.$refs.userRef.validate(valid => {
+    if (valid) {
+      updateUserProfile(form.value).then(response => {
+        proxy.$modal.msgSuccess("淇敼鎴愬姛")
+        props.user.phonenumber = form.value.phonenumber
+        props.user.email = form.value.email
+      })
+    }
+  })
+}
+
+/** 鍏抽棴鎸夐挳 */
+function close() {
+  proxy.$tab.closePage()
+}
+
+// 鍥炴樉褰撳墠鐧诲綍鐢ㄦ埛淇℃伅
+watch(() => props.user, user => {
+  if (user) {
+    form.value = { nickName: user.nickName, phonenumber: user.phonenumber, email: user.email, sex: user.sex }
+  }
+},{ immediate: true })
+</script>
diff --git a/src/views/officeProcessAutomation/SysMonitor/cache-monitor/index.vue b/src/views/officeProcessAutomation/SysMonitor/cache-monitor/index.vue
new file mode 100644
index 0000000..d5a90b0
--- /dev/null
+++ b/src/views/officeProcessAutomation/SysMonitor/cache-monitor/index.vue
@@ -0,0 +1,134 @@
+<!--OA妯″潡锛氱紦瀛樼洃鎺�-->
+<template>
+  <div class="app-container">
+    <el-row :gutter="10">
+      <el-col :span="24" class="card-box">
+        <el-card>
+          <template #header><Monitor style="width: 1em; height: 1em; vertical-align: middle;" /> <span style="vertical-align: middle;">鍩烘湰淇℃伅</span></template>
+          <div class="el-table el-table--enable-row-hover el-table--medium">
+            <table cellspacing="0" style="width: 100%">
+              <tbody>
+                <tr>
+                  <td class="el-table__cell is-leaf"><div class="cell">Redis鐗堟湰</div></td>
+                  <td class="el-table__cell is-leaf"><div class="cell" v-if="cache.info">{{ cache.info.redis_version }}</div></td>
+                  <td class="el-table__cell is-leaf"><div class="cell">杩愯妯″紡</div></td>
+                  <td class="el-table__cell is-leaf"><div class="cell" v-if="cache.info">{{ cache.info.redis_mode == "standalone" ? "鍗曟満" : "闆嗙兢" }}</div></td>
+                  <td class="el-table__cell is-leaf"><div class="cell">绔彛</div></td>
+                  <td class="el-table__cell is-leaf"><div class="cell" v-if="cache.info">{{ cache.info.tcp_port }}</div></td>
+                  <td class="el-table__cell is-leaf"><div class="cell">瀹㈡埛绔暟</div></td>
+                  <td class="el-table__cell is-leaf"><div class="cell" v-if="cache.info">{{ cache.info.connected_clients }}</div></td>
+                </tr>
+                <tr>
+                  <td class="el-table__cell is-leaf"><div class="cell">杩愯鏃堕棿(澶�)</div></td>
+                  <td class="el-table__cell is-leaf"><div class="cell" v-if="cache.info">{{ cache.info.uptime_in_days }}</div></td>
+                  <td class="el-table__cell is-leaf"><div class="cell">浣跨敤鍐呭瓨</div></td>
+                  <td class="el-table__cell is-leaf"><div class="cell" v-if="cache.info">{{ cache.info.used_memory_human }}</div></td>
+                  <td class="el-table__cell is-leaf"><div class="cell">浣跨敤CPU</div></td>
+                  <td class="el-table__cell is-leaf"><div class="cell" v-if="cache.info">{{ parseFloat(cache.info.used_cpu_user_children).toFixed(2) }}</div></td>
+                  <td class="el-table__cell is-leaf"><div class="cell">鍐呭瓨閰嶇疆</div></td>
+                  <td class="el-table__cell is-leaf"><div class="cell" v-if="cache.info">{{ cache.info.maxmemory_human }}</div></td>
+                </tr>
+                <tr>
+                  <td class="el-table__cell is-leaf"><div class="cell">AOF鏄惁寮�鍚�</div></td>
+                  <td class="el-table__cell is-leaf"><div class="cell" v-if="cache.info">{{ cache.info.aof_enabled == "0" ? "鍚�" : "鏄�" }}</div></td>
+                  <td class="el-table__cell is-leaf"><div class="cell">RDB鏄惁鎴愬姛</div></td>
+                  <td class="el-table__cell is-leaf"><div class="cell" v-if="cache.info">{{ cache.info.rdb_last_bgsave_status }}</div></td>
+                  <td class="el-table__cell is-leaf"><div class="cell">Key鏁伴噺</div></td>
+                  <td class="el-table__cell is-leaf"><div class="cell" v-if="cache.dbSize">{{ cache.dbSize }} </div></td>
+                  <td class="el-table__cell is-leaf"><div class="cell">缃戠粶鍏ュ彛/鍑哄彛</div></td>
+                  <td class="el-table__cell is-leaf"><div class="cell" v-if="cache.info">{{ cache.info.instantaneous_input_kbps }}kps/{{cache.info.instantaneous_output_kbps}}kps</div></td>
+                </tr>
+              </tbody>
+            </table>
+          </div>
+        </el-card>
+      </el-col>
+
+      <el-col :span="12" class="card-box">
+        <el-card>
+          <template #header><PieChart style="width: 1em; height: 1em; vertical-align: middle;" /> <span style="vertical-align: middle;">鍛戒护缁熻</span></template>
+          <div class="el-table el-table--enable-row-hover el-table--medium">
+            <div ref="commandstats" style="height: 420px" />
+          </div>
+        </el-card>
+      </el-col>
+
+      <el-col :span="12" class="card-box">
+        <el-card>
+          <template #header><Odometer style="width: 1em; height: 1em; vertical-align: middle;" /> <span style="vertical-align: middle;">鍐呭瓨淇℃伅</span></template>
+          <div class="el-table el-table--enable-row-hover el-table--medium">
+            <div ref="usedmemory" style="height: 420px" />
+          </div>
+        </el-card>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script setup name="Cache">
+import { getCache } from '@/api/monitor/cache'
+import * as echarts from 'echarts'
+
+const cache = ref([])
+const commandstats = ref(null)
+const usedmemory = ref(null)
+const { proxy } = getCurrentInstance()
+
+function getList() {
+  proxy.$modal.loading("姝e湪鍔犺浇缂撳瓨鐩戞帶鏁版嵁锛岃绋嶅�欙紒")
+  getCache().then(response => {
+    proxy.$modal.closeLoading()
+    cache.value = response.data
+
+    const commandstatsIntance = echarts.init(commandstats.value, "macarons")
+    commandstatsIntance.setOption({
+      tooltip: {
+        trigger: "item",
+        formatter: "{a} <br/>{b} : {c} ({d}%)"
+      },
+      series: [
+        {
+          name: "鍛戒护",
+          type: "pie",
+          roseType: "radius",
+          radius: [15, 95],
+          center: ["50%", "38%"],
+          data: response.data.commandStats,
+          animationEasing: "cubicInOut",
+          animationDuration: 1000
+        }
+      ]
+    })
+    const usedmemoryInstance = echarts.init(usedmemory.value, "macarons")
+    usedmemoryInstance.setOption({
+      tooltip: {
+        formatter: "{b} <br/>{a} : " + cache.value.info.used_memory_human
+      },
+      series: [
+        {
+          name: "宄板��",
+          type: "gauge",
+          min: 0,
+          max: 1000,
+          detail: {
+            formatter: cache.value.info.used_memory_human
+          },
+          data: [
+            {
+              value: parseFloat(cache.value.info.used_memory_human),
+              name: "鍐呭瓨娑堣��"
+            }
+          ]
+        }
+      ]
+    })
+    window.addEventListener("resize", () => {
+      commandstatsIntance.resize()
+      usedmemoryInstance.resize()
+    })
+  })
+}
+
+getList()
+</script>
+
diff --git a/src/views/officeProcessAutomation/SysMonitor/data-monitor/index.vue b/src/views/officeProcessAutomation/SysMonitor/data-monitor/index.vue
new file mode 100644
index 0000000..fe13414
--- /dev/null
+++ b/src/views/officeProcessAutomation/SysMonitor/data-monitor/index.vue
@@ -0,0 +1,14 @@
+<!--OA妯″潡锛氭暟鎹洃鎺�-->
+<template>
+  <div>
+     <i-frame v-model:src="url"></i-frame>
+  </div>
+</template>
+
+<script setup>
+import iFrame from '@/components/iFrame'
+
+import { ref } from 'vue'
+
+const url = ref(import.meta.env.VITE_APP_BASE_API + '/druid/login.html')
+</script>
diff --git a/src/views/officeProcessAutomation/SysMonitor/server-monitor/index.vue b/src/views/officeProcessAutomation/SysMonitor/server-monitor/index.vue
new file mode 100644
index 0000000..053d55e
--- /dev/null
+++ b/src/views/officeProcessAutomation/SysMonitor/server-monitor/index.vue
@@ -0,0 +1,191 @@
+<!--OA妯″潡锛氭湇鍔″櫒鐩戞帶-->
+<template>
+  <div class="app-container">
+    <el-row :gutter="10">
+      <el-col :span="12" class="card-box">
+        <el-card>
+          <template #header><Cpu style="width: 1em; height: 1em; vertical-align: middle;" /> <span style="vertical-align: middle;">CPU</span></template>
+          <div class="el-table el-table--enable-row-hover el-table--medium">
+            <table cellspacing="0" style="width: 100%;">
+              <thead>
+                <tr>
+                  <th class="el-table__cell is-leaf"><div class="cell">灞炴��</div></th>
+                  <th class="el-table__cell is-leaf"><div class="cell">鍊�</div></th>
+                </tr>
+              </thead>
+              <tbody>
+                <tr>
+                  <td class="el-table__cell is-leaf"><div class="cell">鏍稿績鏁�</div></td>
+                  <td class="el-table__cell is-leaf"><div class="cell" v-if="server.cpu">{{ server.cpu.cpuNum }}</div></td>
+                </tr>
+                <tr>
+                  <td class="el-table__cell is-leaf"><div class="cell">鐢ㄦ埛浣跨敤鐜�</div></td>
+                  <td class="el-table__cell is-leaf"><div class="cell" v-if="server.cpu">{{ server.cpu.used }}%</div></td>
+                </tr>
+                <tr>
+                  <td class="el-table__cell is-leaf"><div class="cell">绯荤粺浣跨敤鐜�</div></td>
+                  <td class="el-table__cell is-leaf"><div class="cell" v-if="server.cpu">{{ server.cpu.sys }}%</div></td>
+                </tr>
+                <tr>
+                  <td class="el-table__cell is-leaf"><div class="cell">褰撳墠绌洪棽鐜�</div></td>
+                  <td class="el-table__cell is-leaf"><div class="cell" v-if="server.cpu">{{ server.cpu.free }}%</div></td>
+                </tr>
+              </tbody>
+            </table>
+          </div>
+        </el-card>
+      </el-col>
+
+      <el-col :span="12" class="card-box">
+        <el-card>
+          <template #header><Tickets style="width: 1em; height: 1em; vertical-align: middle;" /> <span style="vertical-align: middle;">鍐呭瓨</span></template>
+          <div class="el-table el-table--enable-row-hover el-table--medium">
+            <table cellspacing="0" style="width: 100%;">
+              <thead>
+                <tr>
+                  <th class="el-table__cell is-leaf"><div class="cell">灞炴��</div></th>
+                  <th class="el-table__cell is-leaf"><div class="cell">鍐呭瓨</div></th>
+                  <th class="el-table__cell is-leaf"><div class="cell">JVM</div></th>
+                </tr>
+              </thead>
+              <tbody>
+                <tr>
+                  <td class="el-table__cell is-leaf"><div class="cell">鎬诲唴瀛�</div></td>
+                  <td class="el-table__cell is-leaf"><div class="cell" v-if="server.mem">{{ server.mem.total }}G</div></td>
+                  <td class="el-table__cell is-leaf"><div class="cell" v-if="server.jvm">{{ server.jvm.total }}M</div></td>
+                </tr>
+                <tr>
+                  <td class="el-table__cell is-leaf"><div class="cell">宸茬敤鍐呭瓨</div></td>
+                  <td class="el-table__cell is-leaf"><div class="cell" v-if="server.mem">{{ server.mem.used}}G</div></td>
+                  <td class="el-table__cell is-leaf"><div class="cell" v-if="server.jvm">{{ server.jvm.used}}M</div></td>
+                </tr>
+                <tr>
+                  <td class="el-table__cell is-leaf"><div class="cell">鍓╀綑鍐呭瓨</div></td>
+                  <td class="el-table__cell is-leaf"><div class="cell" v-if="server.mem">{{ server.mem.free }}G</div></td>
+                  <td class="el-table__cell is-leaf"><div class="cell" v-if="server.jvm">{{ server.jvm.free }}M</div></td>
+                </tr>
+                <tr>
+                  <td class="el-table__cell is-leaf"><div class="cell">浣跨敤鐜�</div></td>
+                  <td class="el-table__cell is-leaf"><div class="cell" v-if="server.mem" :class="{'text-danger': server.mem.usage > 80}">{{ server.mem.usage }}%</div></td>
+                  <td class="el-table__cell is-leaf"><div class="cell" v-if="server.jvm" :class="{'text-danger': server.jvm.usage > 80}">{{ server.jvm.usage }}%</div></td>
+                </tr>
+              </tbody>
+            </table>
+          </div>
+        </el-card>
+      </el-col>
+
+      <el-col :span="24" class="card-box">
+        <el-card>
+          <template #header><Monitor style="width: 1em; height: 1em; vertical-align: middle;" /> <span style="vertical-align: middle;">鏈嶅姟鍣ㄤ俊鎭�</span></template>
+          <div class="el-table el-table--enable-row-hover el-table--medium">
+            <table cellspacing="0" style="width: 100%;">
+              <tbody>
+                <tr>
+                  <td class="el-table__cell is-leaf"><div class="cell">鏈嶅姟鍣ㄥ悕绉�</div></td>
+                  <td class="el-table__cell is-leaf"><div class="cell" v-if="server.sys">{{ server.sys.computerName }}</div></td>
+                  <td class="el-table__cell is-leaf"><div class="cell">鎿嶄綔绯荤粺</div></td>
+                  <td class="el-table__cell is-leaf"><div class="cell" v-if="server.sys">{{ server.sys.osName }}</div></td>
+                </tr>
+                <tr>
+                  <td class="el-table__cell is-leaf"><div class="cell">鏈嶅姟鍣↖P</div></td>
+                  <td class="el-table__cell is-leaf"><div class="cell" v-if="server.sys">{{ server.sys.computerIp }}</div></td>
+                  <td class="el-table__cell is-leaf"><div class="cell">绯荤粺鏋舵瀯</div></td>
+                  <td class="el-table__cell is-leaf"><div class="cell" v-if="server.sys">{{ server.sys.osArch }}</div></td>
+                </tr>
+              </tbody>
+            </table>
+          </div>
+        </el-card>
+      </el-col>
+
+      <el-col :span="24" class="card-box">
+        <el-card>
+          <template #header><CoffeeCup style="width: 1em; height: 1em; vertical-align: middle;" /> <span style="vertical-align: middle;">Java铏氭嫙鏈轰俊鎭�</span></template>
+          <div class="el-table el-table--enable-row-hover el-table--medium">
+            <table cellspacing="0" style="width: 100%;table-layout:fixed;">
+              <tbody>
+                <tr>
+                  <td class="el-table__cell is-leaf"><div class="cell">Java鍚嶇О</div></td>
+                  <td class="el-table__cell is-leaf"><div class="cell" v-if="server.jvm">{{ server.jvm.name }}</div></td>
+                  <td class="el-table__cell is-leaf"><div class="cell">Java鐗堟湰</div></td>
+                  <td class="el-table__cell is-leaf"><div class="cell" v-if="server.jvm">{{ server.jvm.version }}</div></td>
+                </tr>
+                <tr>
+                  <td class="el-table__cell is-leaf"><div class="cell">鍚姩鏃堕棿</div></td>
+                  <td class="el-table__cell is-leaf"><div class="cell" v-if="server.jvm">{{ server.jvm.startTime }}</div></td>
+                  <td class="el-table__cell is-leaf"><div class="cell">杩愯鏃堕暱</div></td>
+                  <td class="el-table__cell is-leaf"><div class="cell" v-if="server.jvm">{{ server.jvm.runTime }}</div></td>
+                </tr>
+                <tr>
+                  <td colspan="1" class="el-table__cell is-leaf"><div class="cell">瀹夎璺緞</div></td>
+                  <td colspan="3" class="el-table__cell is-leaf"><div class="cell" v-if="server.jvm">{{ server.jvm.home }}</div></td>
+                </tr>
+                <tr>
+                  <td colspan="1" class="el-table__cell is-leaf"><div class="cell">椤圭洰璺緞</div></td>
+                  <td colspan="3" class="el-table__cell is-leaf"><div class="cell" v-if="server.sys">{{ server.sys.userDir }}</div></td>
+                </tr>
+                <tr>
+                  <td colspan="1" class="el-table__cell is-leaf"><div class="cell">杩愯鍙傛暟</div></td>
+                  <td colspan="3" class="el-table__cell is-leaf"><div class="cell" v-if="server.jvm">{{ server.jvm.inputArgs }}</div></td>
+                </tr>
+              </tbody>
+            </table>
+          </div>
+        </el-card>
+      </el-col>
+
+      <el-col :span="24" class="card-box">
+        <el-card>
+          <template #header><MessageBox style="width: 1em; height: 1em; vertical-align: middle;" /> <span style="vertical-align: middle;">纾佺洏鐘舵��</span></template>
+          <div class="el-table el-table--enable-row-hover el-table--medium">
+            <table cellspacing="0" style="width: 100%;">
+              <thead>
+                <tr>
+                  <th class="el-table__cell el-table__cell is-leaf"><div class="cell">鐩樼璺緞</div></th>
+                  <th class="el-table__cell is-leaf"><div class="cell">鏂囦欢绯荤粺</div></th>
+                  <th class="el-table__cell is-leaf"><div class="cell">鐩樼绫诲瀷</div></th>
+                  <th class="el-table__cell is-leaf"><div class="cell">鎬诲ぇ灏�</div></th>
+                  <th class="el-table__cell is-leaf"><div class="cell">鍙敤澶у皬</div></th>
+                  <th class="el-table__cell is-leaf"><div class="cell">宸茬敤澶у皬</div></th>
+                  <th class="el-table__cell is-leaf"><div class="cell">宸茬敤鐧惧垎姣�</div></th>
+                </tr>
+              </thead>
+              <tbody v-if="server.sysFiles">
+                <tr v-for="(sysFile, index) in server.sysFiles" :key="index">
+                  <td class="el-table__cell is-leaf"><div class="cell">{{ sysFile.dirName }}</div></td>
+                  <td class="el-table__cell is-leaf"><div class="cell">{{ sysFile.sysTypeName }}</div></td>
+                  <td class="el-table__cell is-leaf"><div class="cell">{{ sysFile.typeName }}</div></td>
+                  <td class="el-table__cell is-leaf"><div class="cell">{{ sysFile.total }}</div></td>
+                  <td class="el-table__cell is-leaf"><div class="cell">{{ sysFile.free }}</div></td>
+                  <td class="el-table__cell is-leaf"><div class="cell">{{ sysFile.used }}</div></td>
+                  <td class="el-table__cell is-leaf"><div class="cell" :class="{'text-danger': sysFile.usage > 80}">{{ sysFile.usage }}%</div></td>
+                </tr>
+              </tbody>
+            </table>
+          </div>
+        </el-card>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script setup>
+import { getServer } from '@/api/monitor/server'
+import {onMounted} from "vue";
+
+const server = ref([])
+const { proxy } = getCurrentInstance()
+
+function getList() {
+  proxy.$modal.loading("姝e湪鍔犺浇鏈嶅姟鐩戞帶鏁版嵁锛岃绋嶅�欙紒")
+  getServer().then(response => {
+    server.value = response.data
+    proxy.$modal.closeLoading()
+  })
+}
+
+onMounted(() => {
+	getList();
+});
+</script>
diff --git a/src/views/personnelManagement/contractManagement/components/formDia.vue b/src/views/personnelManagement/contractManagement/components/formDia.vue
index 54b2ef9..3db1bee 100644
--- a/src/views/personnelManagement/contractManagement/components/formDia.vue
+++ b/src/views/personnelManagement/contractManagement/components/formDia.vue
@@ -1,96 +1,93 @@
 <template>
   <div>
-    <el-dialog
-        v-model="dialogFormVisible"
-        title="璇︽儏"
-        width="70%"
-        @close="closeDia"
-    >
-      <PIMTable
-          rowKey="id"
-          :column="tableColumn"
-          :tableData="tableData"
-          :tableLoading="tableLoading"
-          height="600"
-      ></PIMTable>
+    <el-dialog v-model="dialogFormVisible"
+               title="璇︽儏"
+               width="70%"
+               @close="closeDia">
+      <PIMTable rowKey="id"
+                :column="tableColumn"
+                :tableData="tableData"
+                :tableLoading="tableLoading"
+                height="600"></PIMTable>
       <template #footer>
         <div class="dialog-footer">
           <el-button @click="closeDia">鍙栨秷</el-button>
         </div>
       </template>
     </el-dialog>
-    <Files ref="filesDia"></Files>
+    <FileList v-if="fileDialogVisible"
+              v-model:visible="fileDialogVisible"
+              :record-type="'staff_contract'"
+              :record-id="recordId" />
   </div>
 </template>
 
 <script setup>
-import {ref} from "vue";
-import {findStaffContractListPage} from "@/api/personnelManagement/staffContract.js";
-const Files = defineAsyncComponent(() => import( "@/views/personnelManagement/contractManagement/filesDia.vue"));
-const { proxy } = getCurrentInstance()
-const emit = defineEmits(['close'])
-const filesDia = ref()
-const dialogFormVisible = ref(false);
-const operationType = ref('')
-const tableColumn = ref([
-  {
-    label: "鍚堝悓骞撮檺",
-    prop: "contractTerm",
-  },
-  {
-    label: "鍚堝悓寮�濮嬫棩鏈�",
-    prop: "contractStartTime",
-  },
-  {
-    label: "鍚堝悓缁撴潫鏃ユ湡",
-    prop: "contractEndTime",
-  },
-  {
-    dataType: "action",
-    label: "鎿嶄綔",
-    align: "center",
-    fixed: 'right',
-    width: 120,
-    operation: [
-      {
-        name: "涓婁紶闄勪欢",
-        type: "text",
-        clickFun: (row) => {
-          filesDia.value.openDialog( row,'鍚堝悓')
+  import { ref, defineAsyncComponent, getCurrentInstance } from "vue";
+  import { findStaffContractListPage } from "@/api/personnelManagement/staffContract.js";
+  const FileList = defineAsyncComponent(() =>
+    import("@/components/Dialog/FileList.vue")
+  );
+  const { proxy } = getCurrentInstance();
+  const emit = defineEmits(["close"]);
+  const fileDialogVisible = ref(false);
+  const recordId = ref(0);
+  const dialogFormVisible = ref(false);
+  const operationType = ref("");
+  const tableColumn = ref([
+    {
+      label: "鍚堝悓骞撮檺",
+      prop: "contractTerm",
+    },
+    {
+      label: "鍚堝悓寮�濮嬫棩鏈�",
+      prop: "contractStartTime",
+    },
+    {
+      label: "鍚堝悓缁撴潫鏃ユ湡",
+      prop: "contractEndTime",
+    },
+    {
+      dataType: "action",
+      label: "鎿嶄綔",
+      align: "center",
+      fixed: "right",
+      width: 120,
+      operation: [
+        {
+          name: "闄勪欢",
+          type: "text",
+          clickFun: row => {
+            recordId.value = row.id;
+            fileDialogVisible.value = true;
+          },
         },
-      }
-    ],
-  },
-]);
-const tableData = ref([]);
-const tableLoading = ref(false);
+      ],
+    },
+  ]);
+  const tableData = ref([]);
+  const tableLoading = ref(false);
 
-// 鎵撳紑寮规
-const openDialog = (type, row) => {
-  operationType.value = type;
-  dialogFormVisible.value = true;
-  if (operationType.value === 'edit') {
-    findStaffContractListPage({staffOnJobId: row.id}).then(res => {
-      tableData.value = res.data.records
-    })
-  }
-}
+  // 鎵撳紑寮规
+  const openDialog = (type, row) => {
+    operationType.value = type;
+    dialogFormVisible.value = true;
+    if (operationType.value === "edit") {
+      findStaffContractListPage({ staffOnJobId: row.id }).then(res => {
+        tableData.value = res.data.records;
+      });
+    }
+  };
 
-const openUploadFile = (row) => {
-  filesDia.value.open = true
-  filesDia.value.row = row
-}
-
-// 鍏抽棴寮规
-const closeDia = () => {
-  dialogFormVisible.value = false;
-  emit('close')
-};
-defineExpose({
-  openDialog,
-});
+  // 鍏抽棴寮规
+  const closeDia = () => {
+    dialogFormVisible.value = false;
+    emit("close");
+  };
+  defineExpose({
+    openDialog,
+  });
 </script>
 
 <style scoped>
-
 </style>
\ No newline at end of file
diff --git a/src/views/personnelManagement/contractManagement/index.vue b/src/views/personnelManagement/contractManagement/index.vue
index 074b9ac..ae0087e 100644
--- a/src/views/personnelManagement/contractManagement/index.vue
+++ b/src/views/personnelManagement/contractManagement/index.vue
@@ -136,7 +136,7 @@
   },
   {
     label: "宀椾綅",
-    prop: "postJob",
+    prop: "postName",
   },
   {
     label: "鐜颁綇鍧�",
diff --git a/src/views/personnelManagement/employeeRecord/index.vue b/src/views/personnelManagement/employeeRecord/index.vue
index 5dda8c7..a0699b0 100644
--- a/src/views/personnelManagement/employeeRecord/index.vue
+++ b/src/views/personnelManagement/employeeRecord/index.vue
@@ -386,7 +386,11 @@
   upload.open = false
   upload.isUploading = false
   proxy.$refs["uploadRef"].handleRemove(file)
-  proxy.$alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.msg + "</div>", "瀵煎叆缁撴灉", { dangerouslyUseHTMLString: true })
+  if (response.code !== 200) {
+    proxy.$modal.msgError(response.msg)
+  } else {
+    proxy.$modal.msgSuccess(response.msg)
+  }
   getList()
 }
 
diff --git a/src/views/procurementManagement/invoiceEntry/components/ExpandTable.vue b/src/views/procurementManagement/invoiceEntry/components/ExpandTable.vue
deleted file mode 100644
index d329768..0000000
--- a/src/views/procurementManagement/invoiceEntry/components/ExpandTable.vue
+++ /dev/null
@@ -1,144 +0,0 @@
-<template>
-  <PIMTable
-    rowKey="id"
-    :column="columns"
-    :tableData="dataList"
-    :tableLoading="loading"
-		:summaryMethod="summarizeChildrenTable"
-		:isShowSummary="true"
-    :isShowPagination="false"
-    height="auto"
-  >
-  </PIMTable>
-</template>
-
-<script setup>
-import { usePaginationApi } from "@/hooks/usePaginationApi";
-import { productList } from "@/api/procurementManagement/procurementLedger.js";
-import { nextTick } from "vue";
-const { proxy } = getCurrentInstance();
-
-defineOptions({
-  name: "鏉ョエ鐧昏鎶樺彔琛�",
-});
-
-const {
-  loading,
-  filters,
-  columns,
-  dataList,
-  pagination,
-  getTableData,
-  resetFilters,
-} = usePaginationApi(
-  productList,
-  {
-    salesLedgerId: undefined,
-    type: 2,
-  },
-  [
-    {
-      label: "浜у搧澶х被",
-      prop: "productCategory",
-    },
-    {
-      label: "瑙勬牸鍨嬪彿",
-      prop: "specificationModel",
-    },
-    {
-      label: "鍗曚綅",
-      prop: "unit",
-    },
-    {
-      label: "鏁伴噺",
-      prop: "quantity",
-    },
-    {
-      label: "绋庣巼(%)",
-      prop: "taxRate",
-    },
-    {
-      label: "鍚◣鍗曚环(鍏�)",
-      prop: "taxInclusiveUnitPrice",
-			width:200,
-      formatData: (val) => {
-        return val ? parseFloat(val).toFixed(2) : "-";
-      },
-    },
-    {
-      label: "鍚◣鎬讳环(鍏�)",
-      prop: "taxInclusiveTotalPrice",
-			width:200,
-      formatData: (val) => {
-        return val ? parseFloat(val).toFixed(2) : "-";
-      },
-    },
-    {
-      label: "涓嶅惈绋庢�讳环(鍏�)",
-      prop: "taxExclusiveTotalPrice",
-			width:200,
-      formatData: (val) => {
-        return val ? parseFloat(val).toFixed(2) : "-";
-      },
-    },
-    {
-      label: "鏈鏉ョエ閲戦(鍏�)",
-      prop: "ticketsAmount",
-			width:200,
-      formatData: (val) => {
-        return val ? parseFloat(val).toFixed(2) : "-";
-      },
-    },
-    {
-      label: "鏈潵绁ㄦ暟",
-      prop: "futureTickets",
-    },
-    {
-      label: "鏈潵绁ㄩ噾棰�(鍏�)",
-      prop: "futureTicketsAmount",
-			width:200,
-      formatData: (val) => {
-        return val ? parseFloat(val).toFixed(2) : "-";
-      },
-    },
-  ],
-  {},
-  {},
-  (data) => {
-    dataList.value = data;
-  }
-);
-
-const getList = async (id) => {
-  await nextTick();
-  filters.salesLedgerId = id;
-  // 璁剧疆涓�涓緢澶х殑 pageSize 浠ヨ幏鍙栨墍鏈夋暟鎹�
-  pagination.pageSize = 10000;
-  pagination.currentPage = 1;
-  getTableData();
-};
-// 瀛愯〃鍚堣鏂规硶
-const summarizeChildrenTable = (param) => {
-	return proxy.summarizeTable(
-		param,
-		[
-			"taxInclusiveUnitPrice",
-			"taxInclusiveTotalPrice",
-			"taxExclusiveTotalPrice",
-			"ticketsNum",
-			"ticketsAmount",
-			"futureTickets",
-			"futureTicketsAmount",
-		],
-		{
-			ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
-			futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
-		}
-	);
-};
-defineExpose({
-  getList,
-});
-</script>
-
-<style lang="scss" scoped></style>
diff --git a/src/views/procurementManagement/invoiceEntry/components/Modal.vue b/src/views/procurementManagement/invoiceEntry/components/Modal.vue
deleted file mode 100644
index 33d5144..0000000
--- a/src/views/procurementManagement/invoiceEntry/components/Modal.vue
+++ /dev/null
@@ -1,718 +0,0 @@
-<template>
-	<el-dialog :title="modalOptions.title" v-model="visible" width="70%" draggable>
-		<el-form
-			ref="formRef"
-			:model="form"
-			:rules="rules"
-			label-width="120px"
-			label-position="top"
-		>
-			<el-row :gutter="30">
-				<el-col :span="12">
-					<el-form-item label="閲囪喘鍚堝悓鍙凤細" prop="purchaseLedgerNo">
-						<el-input v-model="form.purchaseLedgerNo" disabled placeholder="澶氬悎鍚屾壒閲忓鐞嗭紙鍏蜂綋鍚堝悓鍙疯浜у搧鍒楄〃锛�" />
-					</el-form-item>
-				</el-col>
-				<el-col :span="12">
-					<el-form-item label="閿�鍞悎鍚屽彿锛�" prop="salesContractNo">
-						<el-input
-							v-model="form.salesContractNo"
-							placeholder="鑷姩濉厖"
-							clearable
-							disabled
-						/>
-					</el-form-item>
-				</el-col>
-				<el-col :span="12">
-					<el-form-item label="渚涘簲鍟嗗悕绉帮細" prop="supplierName">
-						<el-input
-							v-model="form.supplierName"
-							placeholder="鑷姩濉厖"
-							clearable
-							disabled
-						/>
-					</el-form-item>
-				</el-col>
-<!--				<el-col :span="12">-->
-<!--					<el-form-item label="椤圭洰鍚嶇О锛�" prop="projectName">-->
-<!--						<el-input-->
-<!--							v-model="form.projectName"-->
-<!--							placeholder="鑷姩濉厖"-->
-<!--							clearable-->
-<!--							disabled-->
-<!--						/>-->
-<!--					</el-form-item>-->
-<!--				</el-col>-->
-				<el-col :span="12">
-					<el-form-item label="鍙戠エ鍙凤細" prop="invoiceNumber">
-						<el-input
-							v-model="form.invoiceNumber"
-							placeholder="璇疯緭鍏�"
-							clearable
-						/>
-					</el-form-item>
-				</el-col>
-				<el-col :span="12">
-					<el-form-item label="鍙戠エ閲戦(鍏�)锛�" prop="invoiceAmount">
-						<el-input-number :step="0.01" :min="0" style="width: 100%"
-														 v-model="form.invoiceAmount"
-														 placeholder="璇疯緭鍏ュ彂绁ㄩ噾棰�"
-														 clearable
-                             disabled
-						/>
-					</el-form-item>
-				</el-col>
-				<el-col :span="12">
-					<el-form-item label="褰曞叆浜猴細" prop="issUer">
-						<el-input
-							v-model="form.issUer"
-							placeholder="璇疯緭鍏�"
-							clearable
-							disabled
-						/>
-					</el-form-item>
-				</el-col>
-				<el-col :span="12">
-					<el-form-item label="寮�绁ㄦ棩鏈燂細" prop="entryDate">
-						<el-date-picker
-							style="width: 100%"
-							v-model="form.entryDate"
-							type="date"
-							value-format="YYYY-MM-DD"
-							format="YYYY-MM-DD"
-							clearable
-						/>
-					</el-form-item>
-				</el-col>
-				<el-col :span="12">
-					<el-form-item label="褰曞叆鏃ユ湡锛�" prop="enterDate">
-						<el-date-picker
-							style="width: 100%"
-							v-model="form.enterDate"
-							type="date"
-							value-format="YYYY-MM-DD"
-							format="YYYY-MM-DD"
-							clearable
-						/>
-					</el-form-item>
-				</el-col>
-			
-			</el-row>
-			<el-form-item label="浜у搧淇℃伅锛�"> </el-form-item>
-			<el-table
-				:data="form.productData"
-				border
-				show-summary
-				:summary-method="summarizeChildrenTable"
-			>
-				<el-table-column align="center" label="搴忓彿" type="index" width="60" />
-				<el-table-column label="鎵�灞炲悎鍚�" prop="purchaseLedgerNo" width="200">
-					<template #default="{ row }">
-						<el-tag type="primary">{{ row.purchaseLedgerNo }}</el-tag>
-					</template>
-				</el-table-column>
-				<el-table-column label="浜у搧澶х被" prop="productCategory" />
-				<el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" width="150" />
-				<el-table-column label="鍗曚綅" prop="unit" width="70" />
-				<el-table-column label="鏁伴噺" prop="quantity" width="70" />
-				<el-table-column label="绋庣巼(%)" prop="taxRate" width="80" />
-				<el-table-column
-					label="鍚◣鍗曚环(鍏�)"
-					prop="taxInclusiveUnitPrice"
-					:formatter="formattedNumber"
-				/>
-				<el-table-column
-					label="鍚◣鎬讳环(鍏�)"
-					prop="taxInclusiveTotalPrice"
-					:formatter="formattedNumber"
-				/>
-				<el-table-column
-					label="涓嶅惈绋庢�讳环(鍏�)"
-					prop="taxExclusiveTotalPrice"
-					:formatter="formattedNumber"
-				/>
-				<el-table-column label="鏈寮�绁ㄦ暟" prop="ticketsNum" width="180">
-					<template #default="scope">
-						<el-input-number 
-							:step="0.1" 
-							:min="0" 
-							:max="scope.row.tempFutureTickets || 0" 
-							style="width: 100%"
-							:precision="2"
-							v-model="scope.row.ticketsNum"
-							:disabled="isProductDisabled(scope.row)"
-							@change="invoiceNumBlur(scope.row)"
-						/>
-					</template>
-				</el-table-column>
-				<el-table-column
-					label="鏈寮�绁ㄩ噾棰�(鍏�)"
-					prop="ticketsAmount"
-					width="180"
-				>
-					<template #default="scope">
-						<el-input-number 
-							:step="0.01" 
-							:min="0" 
-							style="width: 100%"
-							:precision="2"
-							v-model="scope.row.ticketsAmount"
-							:disabled="isProductDisabled(scope.row)"
-							@change="invoiceAmountBlur(scope.row)"
-						/>
-					</template>
-				</el-table-column>
-				<el-table-column
-					label="鏈潵绁ㄦ暟"
-					prop="futureTickets"
-					:formatter="formattedNumber"
-				/>
-				<el-table-column
-					label="鏈鏉ョエ閲戦(鍏�)"
-					prop="ticketsAmount"
-					:formatter="formattedNumber"
-				/>
-				<el-table-column
-					label="鏈潵绁ㄦ暟"
-					prop="futureTickets"
-					:formatter="formattedNumber"
-				/>
-				<el-table-column
-					label="鏈潵绁ㄩ噾棰�(鍏�)"
-					prop="futureTicketsAmount"
-					:formatter="formattedNumber"
-				/>
-			</el-table>
-		</el-form>
-		<template #footer>
-			<el-button type="primary" :loading="modalLoading" @click="submitForm">
-				纭
-			</el-button>
-			<el-button @click="closeModal">鍙栨秷</el-button>
-		</template>
-	</el-dialog>
-</template>
-
-<script setup>
-import { ref, getCurrentInstance } from "vue";
-import { defineEmits } from 'vue';
-import { useModal } from "@/hooks/useModal";
-import useFormData from "@/hooks/useFormData";
-import {
-	getPurchaseNoById,
-	getInfo,
-	addOrUpdateRegistration,
-} from "@/api/procurementManagement/invoiceEntry.js";
-import { getPurchaseById } from "@/api/procurementManagement/procurementLedger.js";
-import useUserStore from "@/store/modules/user";
-import dayjs from "dayjs";
-
-defineOptions({
-	name: "鏉ョエ鐧昏妯℃�佹",
-});
-
-const userStore = useUserStore();
-const formRef = ref();
-const { proxy } = getCurrentInstance();
-const { form } = useFormData({
-	purchaseLedgerNo: undefined, // 閲囪喘鍚堝悓鍙�
-	salesContractNo: undefined, // 閿�鍞悎鍚屽彿
-	supplierName: undefined, // 渚涘簲鍟嗗悕绉�
-	projectName: undefined, // 椤圭洰鍚嶇О
-	invoiceNumber: undefined, // 鍙戠エ鍙�
-	invoiceAmount: undefined, // 鍙戠エ閲戦(鍏�)
-	issUerId: userStore.id, // 褰曞叆浜�
-	issUer: userStore.nickName, // 褰曞叆浜�
-	entryDate: undefined, // 寮�绁ㄦ棩鏈�
-	salesContractNoId: undefined, // 寮�绁ㄦ棩鏈�
-	enterDate: dayjs().format("YYYY-MM-DD"),
-	productData: [], // 琛ㄦ牸
-});
-
-const selectedContracts = ref([]); // 瀛樺偍閫変腑鐨勫悎鍚屾暟鎹�
-
-const rules = ref({
-	invoiceNumber: [
-		{ required: true, message: "璇疯緭鍏ュ彂绁ㄥ彿", trigger: "blur" },
-		{ type: "string" },
-	],
-	invoiceAmount: [
-		{ required: true, message: "璇疯緭鍏ュ彂绁ㄩ噾棰�", trigger: "blur" },
-	],
-	entryDate: [{ required: true, message: "璇烽�夋嫨寮�绁ㄦ棩鏈�", trigger: "change" }],
-	enterDate: [{ required: true, message: "璇烽�夋嫨褰曞叆鏃ユ湡", trigger: "change" }],
-});
-
-const {
-	id,
-	visible,
-	loading: modalLoading,
-	openModal,
-	modalOptions,
-	handleConfirm,
-	closeModal,
-} = useModal({
-	title: "鏉ョエ鐧昏",
-});
-
-const emit = defineEmits(['refreshList']);
-
-const columns = [
-	{
-		label: "浜у搧澶х被",
-		prop: "productCategory",
-		width: 120,
-	},
-	{
-		label: "瑙勬牸鍨嬪彿",
-		prop: "specificationModel",
-		width: 120,
-	},
-	{
-		label: "鍗曚綅",
-		prop: "unit",
-		width: 80,
-	},
-	{
-		label: "鏁伴噺",
-		prop: "quantity",
-		width: 80,
-	},
-	{
-		label: "绋庣巼(%)",
-		prop: "taxRate",
-		width: 80,
-	},
-	{
-		label: "褰曞叆鏃ユ湡",
-		prop: "registerDate",
-		width: 120,
-	},
-	{
-		label: "鍚◣鍗曚环(鍏�)",
-		prop: "taxInclusiveUnitPrice",
-		width: 150,
-		formatData: (val) => {
-			return val ? parseFloat(val).toFixed(2) : 0;
-		},
-	},
-	{
-		label: "鍚◣鎬讳环(鍏�)",
-		prop: "taxInclusiveTotalPrice",
-		width: 150,
-		formatData: (val) => {
-			return parseFloat(val).toFixed(2) ?? 0;
-		},
-	},
-	{
-		label: "涓嶅惈绋庢�讳环(鍏�)",
-		prop: "taxExclusiveTotalPrice",
-		width: 150,
-		formatData: (val) => {
-			return parseFloat(val).toFixed(2) ?? 0;
-		},
-	},
-	{
-		label: "鏈鏉ョエ鏁�",
-		prop: "ticketsNum",
-		dataType: "slot",
-		slot: "ticketsNumRef",
-		width: 180,
-		align: "center",
-	},
-	{
-		label: "鏈鏉ョエ閲戦(鍏�)",
-		prop: "ticketsAmount",
-		dataType: "slot",
-		slot: "ticketsAmountRef",
-		width: 180,
-		align: "center",
-	},
-	{
-		label: "鏈潵绁ㄦ暟",
-		prop: "futureTickets",
-		width: 100,
-	},
-	{
-		label: "鏈潵绁ㄩ噾棰�(鍏�)",
-		prop: "futureTicketsAmount",
-		width: 200,
-	},
-];
-const formattedNumber = (row, column, cellValue) => {
-	if (cellValue == 0) {
-		return parseFloat(cellValue).toFixed(2);
-	}
-	if (cellValue) {
-		return parseFloat(cellValue).toFixed(2);
-	} else {
-		return cellValue;
-	}
-};
-const getTableData = async (type, selectedRows) => {
-	if (type == "add") {
-		// 妫�鏌ユ墍鏈夐�夋嫨鐨勫悎鍚屾槸鍚﹀叿鏈夌浉鍚岀殑渚涘簲鍟嗗悕绉�
-		const firstRow = selectedRows[0];
-		const isSameSupplier = selectedRows.every(row =>
-			row.supplierName === firstRow.supplierName
-		);
-		
-		if (!isSameSupplier) {
-			proxy.$modal.msgError("璇烽�夋嫨鐩稿悓渚涘簲鍟嗗悕绉扮殑鍚堝悓");
-			return;
-		}
-		
-		// 鍏佽涓嶅悓鐨勯噰璐悎鍚屽彿鎵归噺澶勭悊锛屾棤闇�妫�鏌ラ噸澶�
-		
-		// 娓呯┖琛ㄥ崟鏁版嵁
-		Object.keys(form).forEach(key => {
-			if (key !== 'productData') {
-				form[key] = undefined;
-			}
-		});
-		form.productData = [];
-		
-		// 鍔犺浇鎵�鏈夐�変腑鍚堝悓鐨勪骇鍝佹暟鎹�
-		const promises = selectedRows.map(row =>
-			getInfo({ id: row.id })
-		);
-		
-		Promise.all(promises).then(results => {
-			// 鍚堝苟鎵�鏈夊悎鍚岀殑浜у搧鏁版嵁锛屽苟涓烘瘡涓骇鍝佹坊鍔犲搴旂殑鍚堝悓淇℃伅
-			const allProductData = [];
-			results.forEach((result, index) => {
-				const contract = selectedRows[index];
-				const contractId = contract.id;
-				if (result.data && result.data.productData) {
-					result.data.productData.forEach(item => {
-						allProductData.push({
-							...item,
-							purchaseLedgerId: contractId, // 娣诲姞鍚堝悓ID鐢ㄤ簬绛涢��
-							purchaseLedgerNo: contract.purchaseContractNumber, // 娣诲姞閲囪喘鍚堝悓鍙�
-							supplierName: contract.supplierName, // 娣诲姞渚涘簲鍟嗗悕绉�
-							projectName: contract.projectName // 娣诲姞椤圭洰鍚嶇О
-							// 淇濈暀浜у搧鏈韩鐨刬d锛屼笉瑕嗙洊
-						});
-					});
-				}
-			});
-			
-			// 璁剧疆琛ㄥ崟鏁版嵁锛堜娇鐢ㄧ涓�涓悎鍚岀殑鍩烘湰淇℃伅锛岄噰璐悎鍚屽彿鐣欑┖锛�
-			form.purchaseLedgerNo = ""; // 閲囪喘鍚堝悓鍙风暀绌猴紝鍥犱负浼氬湪浜у搧琛ㄦ牸涓垎鍒樉绀�
-			form.invoiceNumber = "";
-			form.entryDate = dayjs().format("YYYY-MM-DD");
-			form.enterDate = dayjs().format("YYYY-MM-DD");
-			form.salesContractNo = results[0].data.salesContractNo;
-			form.projectName = results[0].data.projectName;
-			form.supplierName = results[0].data.supplierName;
-			// 淇濈暀褰曞叆浜轰俊鎭�
-			form.issUerId = userStore.id;
-			form.issUer = userStore.nickName;
-			
-			// 璁剧疆浜у搧鏁版嵁锛屽苟鍒濆鍖栧紑绁ㄦ暟閲忓拰閲戦
-			allProductData.forEach(item => {
-				// 淇濆瓨"鍘熷鏈潵绁ㄦ暟/閲戦"锛堢敤浜庢牎楠屼笌璁$畻锛�
-				// 浼樺厛浣跨敤鍚庣杩斿洖鐨� futureTickets/futureTicketsAmount锛涙病鏈夊垯鍥為��鍒� quantity/taxInclusiveTotalPrice
-				item.tempFutureTickets = Number(
-					item.futureTickets !== undefined ? item.futureTickets : (item.quantity || 0)
-				);
-				item.tempFutureTicketsAmount = Number(
-					item.futureTicketsAmount !== undefined ? item.futureTicketsAmount : (item.taxInclusiveTotalPrice || 0)
-				);
-
-				// 濡傛灉鏈潵绁ㄩ噾棰濅负0锛屽垯鏈寮�绁ㄦ暟鍜岄噾棰濋兘璁剧疆涓�0
-				if (item.tempFutureTicketsAmount <= 0) {
-					item.ticketsNum = 0;
-					item.ticketsAmount = 0;
-					item.futureTickets = Number(item.tempFutureTickets || 0);
-					item.futureTicketsAmount = 0;
-				} else {
-					// 鏂板鏃讹細鏈寮�绁ㄦ暟榛樿 = 鏈潵绁ㄦ暟锛堜笖涓嶈兘澶т簬鏈潵绁ㄦ暟锛�
-					item.ticketsNum = Number(item.tempFutureTickets || 0);
-					// 鑱斿姩璁$畻鏈寮�绁ㄩ噾棰濄�佹湭鏉ョエ鏁般�佹湭鏉ョエ閲戦
-					const unitPrice = Number(item.taxInclusiveUnitPrice || 0);
-					item.ticketsAmount = Number((item.ticketsNum * unitPrice).toFixed(2));
-					item.futureTickets = Number((item.tempFutureTickets - item.ticketsNum).toFixed(2));
-					item.futureTicketsAmount = Number(
-						(item.tempFutureTicketsAmount - item.ticketsAmount).toFixed(2)
-					);
-				}
-			});
-			
-			form.productData = allProductData;
-			
-			// 璁$畻鍙戠エ閲戦锛氭墍鏈変骇鍝佺殑鏈寮�绁ㄩ噾棰濅箣鍜岋紙鏂板榛樿 0锛�
-			const totalAmount = allProductData.reduce((sum, item) => {
-				return sum + (Number(item.ticketsAmount) || 0);
-			}, 0);
-			form.invoiceAmount = Number(totalAmount.toFixed(2));
-			
-			// 瀛樺偍閫変腑鐨勫悎鍚屾暟鎹�
-			selectedContracts.value = selectedRows;
-		});
-	} else if (type == "edit") {
-		const id = Array.isArray(selectedRows) ? selectedRows[0].id : selectedRows;
-		const response = await getPurchaseById({ id, type: 2 });
-		// 鍏煎涓嶅悓鐨勮繑鍥炴牸寮忥細鍙兘鏄� { code, data } 鎴栫洿鎺ヨ繑鍥炴暟鎹�
-		const data = response.data || response;
-		
-		// 鍏煎涓嶅悓鐨勫瓧娈靛悕锛歱urchaseContractNumber 鎴� purchaseLedgerNo
-		form.purchaseLedgerNo = data.purchaseContractNumber || data.purchaseLedgerNo || "";
-		form.invoiceAmount = data.invoiceAmount;
-		form.invoiceNumber = data.invoiceNumber;
-		form.salesContractNo = data.salesContractNo;
-		form.projectName = data.projectName;
-		form.supplierName = data.supplierName;
-		form.entryDate = data.entryDate;
-		form.enterDate = data.enterDate || dayjs().format("YYYY-MM-DD");
-		
-		// 缂栬緫鏃朵篃闇�瑕佸垵濮嬪寲浜у搧鏁版嵁鐨� tempFutureTickets 鍜� tempFutureTicketsAmount
-		// 鍚屾椂涓烘瘡涓骇鍝佹坊鍔犲悎鍚屽彿绛変俊鎭�
-		const contractNumber = data.purchaseContractNumber || data.purchaseLedgerNo || "";
-		if (data.productData && Array.isArray(data.productData)) {
-			data.productData.forEach(item => {
-				// 淇濆瓨"鍘熷鏈潵绁ㄦ暟/閲戦"锛堢敤浜庢牎楠屼笌璁$畻锛�
-				// 浼樺厛浣跨敤鍚庣杩斿洖鐨� futureTickets/futureTicketsAmount锛涙病鏈夊垯鍥為��鍒� quantity/taxInclusiveTotalPrice
-				item.tempFutureTickets = Number(
-					item.futureTickets !== undefined ? item.futureTickets : (item.quantity || 0)
-				);
-				item.tempFutureTicketsAmount = Number(
-					item.futureTicketsAmount !== undefined ? item.futureTicketsAmount : (item.taxInclusiveTotalPrice || 0)
-				);
-				
-				// 纭繚姣忎釜浜у搧閮芥湁鍚堝悓鍙凤紝鐢ㄤ簬鏄剧ず鍦�"鎵�灞炲悎鍚�"鍒�
-				if (!item.purchaseLedgerNo) {
-					item.purchaseLedgerNo = contractNumber;
-				}
-			});
-		}
-		
-		form.productData = data.productData || [];
-		
-		// 缂栬緫妯″紡涓嬶紝鏍规嵁浜у搧鏁版嵁涓殑鏈寮�绁ㄩ噾棰濊嚜鍔ㄨ绠楀彂绁ㄩ噾棰�
-		calculateinvoiceAmount();
-	}
-};
-// 瀛愯〃鍚堣鏂规硶
-const summarizeChildrenTable = (param) => {
-	return proxy.summarizeTable(param, [
-		"taxInclusiveUnitPrice",
-		"taxInclusiveTotalPrice",
-		"taxExclusiveTotalPrice",
-		"ticketsNum",
-		"ticketsAmount",
-		"ticketsAmountRef",
-		"futureTickets",
-		"futureTicketsAmount",
-	]);
-};
-//鏈鏉ョエ鏁板け鐒︽搷浣�
-const invoiceNumBlur = (row) => {
-	if (!row.ticketsNum || row.ticketsNum === "") {
-		row.ticketsNum = 0;
-	}
-	if (Number(row.ticketsNum) > Number(row.tempFutureTickets)) {
-		proxy.$modal.msgWarning("鏈寮�绁ㄦ暟涓嶈兘澶т簬鏈潵绁ㄦ暟");
-		row.ticketsNum = Number(row.tempFutureTickets || 0);
-	}
-	// 璁$畻鏈鏉ョエ閲戦
-	row.ticketsAmount = Number((Number(row.ticketsNum) * Number(row.taxInclusiveUnitPrice || 0)).toFixed(2));
-	// 璁$畻鏈潵绁ㄦ暟
-	row.futureTickets = Number((Number(row.tempFutureTickets || 0) - Number(row.ticketsNum || 0)).toFixed(2));
-	// 璁$畻鏈潵绁ㄩ噾棰�
-	row.futureTicketsAmount = Number((Number(row.tempFutureTicketsAmount || 0) - Number(row.ticketsAmount || 0)).toFixed(2));
-	calculateinvoiceAmount();
-};
-
-// 鏈鏉ョエ閲戦澶辩劍鎿嶄綔
-const invoiceAmountBlur = (row) => {
-	if (!row.ticketsAmount) {
-		row.ticketsAmount = 0;
-	}
-	// 璁$畻鏄惁瓒呰繃鏉ョエ鎬婚噾棰�
-	if (row.ticketsAmount > row.tempFutureTicketsAmount) {
-		proxy.$modal.msgWarning("鏈鏉ョエ閲戦涓嶅緱澶т簬鏈潵绁ㄩ噾棰�");
-		row.ticketsAmount = Number(row.tempFutureTicketsAmount || 0);
-	}
-	// 璁$畻鏈鏉ョエ鏁�
-	row.ticketsNum = Number(
-		(row.ticketsAmount / row.taxInclusiveUnitPrice).toFixed(2)
-	);
-	// 妫�鏌ユ湰娆″紑绁ㄦ暟鏄惁澶т簬鏈潵绁ㄦ暟
-	if (Number(row.ticketsNum) > Number(row.tempFutureTickets)) {
-		proxy.$modal.msgWarning("鏈寮�绁ㄦ暟涓嶈兘澶т簬鏈潵绁ㄦ暟");
-		row.ticketsNum = Number(row.tempFutureTickets || 0);
-		// 閲嶆柊璁$畻鏈鏉ョエ閲戦
-		row.ticketsAmount = Number((Number(row.ticketsNum) * Number(row.taxInclusiveUnitPrice || 0)).toFixed(2));
-	}
-	// 璁$畻鏈潵绁ㄦ暟
-	row.futureTickets = Number((Number(row.tempFutureTickets || 0) - Number(row.ticketsNum || 0)).toFixed(2));
-	// 璁$畻鏈潵绁ㄩ噾棰�
-	row.futureTicketsAmount = Number((Number(row.tempFutureTicketsAmount || 0) - Number(row.ticketsAmount || 0)).toFixed(2));
-	calculateinvoiceAmount();
-};
-
-const calculateinvoiceAmount = () => {
-	let invoiceAmountTotal = 0;
-	form.productData.forEach((item) => {
-		if (item.ticketsAmount) {
-			invoiceAmountTotal += Number(item.ticketsAmount);
-		}
-	});
-	form.invoiceAmount = Number(invoiceAmountTotal.toFixed(2));
-};
-
-// 鍒ゆ柇浜у搧鏄惁鍙互缁х画鏉ョエ鎿嶄綔锛氬鏋滄湭鏉ョエ鏁板拰鏈潵绁ㄩ噾棰濋兘涓�0鎴栧皬浜庣瓑浜�0锛屽垯绂佺敤
-const isProductDisabled = (row) => {
-	// 浼樺厛浣跨敤 tempFutureTickets锛堝師濮嬫湭鏉ョエ鏁帮級锛屽鏋滄病鏈夊垯浣跨敤 futureTickets
-	const futureTickets = Number(row.tempFutureTickets !== undefined 
-		? row.tempFutureTickets 
-		: (row.futureTickets !== undefined ? row.futureTickets : 0));
-	
-	// 浼樺厛浣跨敤 tempFutureTicketsAmount锛堝師濮嬫湭鏉ョエ閲戦锛夛紝濡傛灉娌℃湁鍒欎娇鐢� futureTicketsAmount
-	const futureAmount = Number(row.tempFutureTicketsAmount !== undefined 
-		? row.tempFutureTicketsAmount 
-		: (row.futureTicketsAmount !== undefined ? row.futureTicketsAmount : 0));
-	
-	// 鍙湁褰撴湭鏉ョエ鏁板拰鏈潵绁ㄩ噾棰濋兘涓�0鎴栧皬浜庣瓑浜�0鏃讹紝鎵嶇鐢�
-	return futureTickets <= 0 && futureAmount <= 0;
-};
-
-const open = async (type, selectedRows) => {
-	// 纭繚 modalOptions.value 鏄璞�
-	if (!modalOptions.value || typeof modalOptions.value !== 'object') {
-		modalOptions.value = {};
-	}
-	
-	// 鏍规嵁鎿嶄綔绫诲瀷鍜岄�変腑鏁版嵁璁剧疆鏍囬
-	if (Array.isArray(selectedRows) && selectedRows.length > 1) {
-		// 鎵归噺鎿嶄綔
-		modalOptions.value.title = type === "add" ? `鎵归噺鏂板 (${selectedRows.length}鏉�)` : `鎵归噺缂栬緫 (${selectedRows.length}鏉�)`;
-	} else {
-		// 鍗曚釜鎿嶄綔 - 鏄庣‘鍒ゆ柇 type 鐨勫��
-		if (type === "add" || type === "鏂板") {
-			modalOptions.value.title = "鏂板";
-		} else if (type === "edit" || type === "缂栬緫") {
-			modalOptions.value.title = "缂栬緫";
-		} else {
-			modalOptions.value.title = "鏉ョエ鐧昏"; // 榛樿鏍囬
-		}
-	}
-	
-	visible.value = true;
-	
-	// 濡傛灉鏄崟涓搷浣滐紝鑾峰彇id
-	if (!Array.isArray(selectedRows) || selectedRows.length === 1) {
-		const idValue = Array.isArray(selectedRows) ? selectedRows[0].id : selectedRows;
-		id.value = idValue;
-	}
-	
-	await getTableData(type, selectedRows);
-};
-
-
-const closeAndRefresh = () => {
-	closeModal();
-	emit('refreshList');
-};
-
-const submitForm = () => {
-	proxy.$refs["formRef"].validate((valid) => {
-		if (valid) {
-			// 濡傛灉鏄壒閲忔搷浣滐紝灏嗘墍鏈夊悎鍚岀殑鏁版嵁鏀惧湪涓�涓暟缁勯噷锛屽彧璋冪敤涓�娆℃帴鍙�
-			if (selectedContracts.value.length > 1) {
-				// 鍒涘缓鍖呭惈鎵�鏈夊悎鍚屾暟鎹殑鏁扮粍
-				const batchData = selectedContracts.value.map(contract => {
-					// 绛涢�夊嚭灞炰簬褰撳墠鍚堝悓鐨勪骇鍝佹暟鎹�
-					const contractProductData = form.productData.filter(item =>
-						item.purchaseLedgerId === contract.id
-					);
-					
-					// 涓烘瘡涓噰璐悎鍚屽垱寤虹嫭绔嬬殑瀵硅薄
-					return {
-					// 鍩虹琛ㄥ崟鏁版嵁
-					invoiceNumber: form.invoiceNumber,
-					invoiceAmount: form.invoiceAmount,
-					entryDate: form.entryDate,
-					enterDate: form.enterDate,
-					issUerId: form.issUerId, // 褰曞叆浜篿d
-					issUer: form.issUer, // 褰曞叆浜�
-					
-					// 鍚堝悓瀹為檯淇℃伅
-					purchaseLedgerId: contract.id, // 浣跨敤id浣滀负瀛楁鍚嶏紝鍊间负purchaseLedgerId
-						purchaseContractNumber: contract.purchaseContractNumber, // 浣跨敤瀹為檯鐨勯噰璐悎鍚屽彿
-						salesContractNo: contract.salesContractNo, // 浣跨敤瀹為檯鐨勯攢鍞悎鍚屽彿
-						supplierName: contract.supplierName, // 浣跨敤瀹為檯鐨勪緵搴斿晢鍚嶇О
-						projectName: contract.projectName, // 浣跨敤瀹為檯鐨勯」鐩悕绉�
-						
-						// 浜у搧鏁版嵁
-						productData: proxy.HaveJson(contractProductData),
-						
-						// 鎵归噺鏍囪瘑
-						isBatch: true,
-						type: 4
-					};
-				});
-				
-				// 鍙皟鐢ㄤ竴娆℃帴鍙o紝浼犻�掑寘鍚墍鏈夊悎鍚屾暟鎹殑鏁扮粍
-				modalLoading.value = true;
-				addOrUpdateRegistration(batchData).then((res) => {
-					modalLoading.value = false;
-					if (res.code === 200) {
-						proxy.$modal.msgSuccess("鎵归噺鐧昏鎴愬姛");
-						closeAndRefresh();
-					}
-				}).catch(() => {
-					modalLoading.value = false;
-					proxy.$modal.msgError("鎵归噺鐧昏澶辫触");
-				});
-			} else {
-					// 鍗曚釜鍚堝悓鎻愪氦閫昏緫 - 浠ユ暟缁勬牸寮忎紶閫�
-					const singleContract = selectedContracts.value[0];
-					const singleFormArray = [{
-					// 鍩虹琛ㄥ崟鏁版嵁
-					invoiceNumber: form.invoiceNumber,
-					invoiceAmount: form.invoiceAmount,
-					entryDate: form.entryDate,
-					enterDate: form.enterDate,
-					issUerId: form.issUerId, // 褰曞叆浜篿d
-					issUer: form.issUer, // 褰曞叆浜�
-					
-					// 鍚堝悓瀹為檯淇℃伅
-					purchaseLedgerId: singleContract.id, // 浣跨敤id浣滀负瀛楁鍚嶏紝鍊间负purchaseLedgerId
-						purchaseContractNumber: singleContract.purchaseContractNumber, // 浣跨敤瀹為檯鐨勯噰璐悎鍚屽彿
-						salesContractNo: singleContract.salesContractNo, // 浣跨敤瀹為檯鐨勯攢鍞悎鍚屽彿
-						supplierName: singleContract.supplierName, // 浣跨敤瀹為檯鐨勪緵搴斿晢鍚嶇О
-						projectName: singleContract.projectName, // 浣跨敤瀹為檯鐨勯」鐩悕绉�
-						
-						// 浜у搧鏁版嵁
-						productData: proxy.HaveJson(form.productData),
-						
-						// 鎵归噺鏍囪瘑
-						isBatch: false,
-						type: 4
-					}];
-					
-					modalLoading.value = true;
-					addOrUpdateRegistration(singleFormArray).then((res) => {
-						modalLoading.value = false;
-						if (res.code === 200) {
-							proxy.$modal.msgSuccess("鐧昏鎴愬姛");
-							closeAndRefresh();
-						}
-					}).catch(() => {
-						modalLoading.value = false;
-						proxy.$modal.msgError("鐧昏澶辫触");
-					});
-				}
-		}
-	});
-};
-
-defineExpose({
-	open,
-	closeAndRefresh,
-});
-</script>
-
-<style lang="scss" scoped></style>
diff --git a/src/views/procurementManagement/invoiceEntry/index.vue b/src/views/procurementManagement/invoiceEntry/index.vue
deleted file mode 100644
index 8c435e0..0000000
--- a/src/views/procurementManagement/invoiceEntry/index.vue
+++ /dev/null
@@ -1,311 +0,0 @@
-<template>
-  <div class="app-container">
-    <div class="search_form">
-      <el-form :model="filters" :inline="true">
-        <el-form-item label="渚涘簲鍟嗗悕绉�">
-          <el-input
-              v-model="filters.supplierName"
-              placeholder="璇疯緭鍏ュ悕绉版悳绱�"
-              clearable
-              prefix-icon="Search"
-              @change="getTableData"
-          />
-        </el-form-item>
-        <el-form-item label="閲囪喘璁㈠崟鍙凤細">
-          <el-input
-            v-model="filters.purchaseContractNumber"
-            placeholder="璇疯緭鍏�"
-            clearable
-            prefix-icon="Search"
-            @change="getTableData"
-          />
-        </el-form-item>
-
-        <el-form-item label="閿�鍞悎鍚屽彿">
-          <el-input
-              v-model="filters.salesContractNo"
-              placeholder="璇疯緭鍏ラ攢鍞悎鍚屽彿"
-              clearable
-          />
-        </el-form-item>
-        <el-form-item>
-          <el-button type="primary" @click="getTableData"> 鎼滅储 </el-button>
-          <el-button @click="resetFilters"> 閲嶇疆 </el-button>
-        </el-form-item>
-      </el-form>
-    </div>
-    <div class="table_list">
-      <div class="actions">
-        <div></div>
-        <div>
-          <el-button @click="handleExport" style="margin-right: 10px">瀵煎嚭</el-button>
-          <el-button type="primary" @click="handleAdd('add')" :disabled="isInvoiceDisabled">
-            鏉ョエ鐧昏
-          </el-button>
-<!--          <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>-->
-        </div>
-      </div>
-      <PIMTable
-        rowKey="id"
-        :column="columns"
-        :tableData="dataList"
-        :tableLoading="loading"
-        :isSelection="true"
-        :page="{
-          current: pagination.currentPage,
-          size: pagination.pageSize,
-          total: pagination.total,
-        }"
-        :expand-row-keys="expandRowKeys"
-        :summaryMethod="summarizeMainTable"
-        :isShowSummary="true"
-        @expand-change="expandChange"
-        @selection-change="handleSelectionChange"
-        @pagination="changePage"
-      >
-        <template #expand="{ row }">
-          <ExpandTable ref="expandTableRef" />
-        </template>
-        <template #operation="{ row }">
-          <el-button
-            link
-            type="primary"
-            @click="handleEdit('edit', row.id)"
-          >
-            缂栬緫
-          </el-button>
-        </template>
-      </PIMTable>
-    </div>
-    <Modal ref="modalRef" @refreshList="getTableData"></Modal>
-  </div>
-</template>
-
-<script setup>
-import { usePaginationApi } from "@/hooks/usePaginationApi";
-import {delRegistration, gePurchaseListPage} from "@/api/procurementManagement/invoiceEntry.js";
-import { nextTick, onMounted, getCurrentInstance, ref, computed } from "vue";
-import ExpandTable from "./components/ExpandTable.vue";
-import Modal from "./components/Modal.vue";
-import {ElMessageBox} from "element-plus";
-
-defineOptions({
-  name: "鏉ョエ鐧昏",
-});
-
-const { proxy } = getCurrentInstance();
-const expandRowKeys = ref([]);
-const expandTableRef = ref();
-const modalRef = ref();
-const selectedRows = ref([]);
-
-const {
-  loading,
-  filters,
-  columns,
-  dataList,
-  pagination,
-  getTableData,
-  resetFilters,
-  onCurrentChange,
-} = usePaginationApi(
-  gePurchaseListPage,
-  {
-    purchaseContractNumber: undefined,
-    // 鍙煡璇㈠凡瀹℃壒閫氳繃锛堟垨鎸囧畾鐘舵�佷负 3锛夌殑璁板綍
-    approvalStatus: 3,
-  },
-  [
-    {
-      type: "expand",
-      dataType: "slot",
-      slot: "expand",
-    },
-    {
-      label: "閲囪喘璁㈠崟鍙�",
-      prop: "purchaseContractNumber",
-      width:150
-    },
-    {
-      label: "閿�鍞悎鍚屽彿",
-      prop: "salesContractNo",
-      width:150
-    },
-    {
-      label: "渚涘簲鍟嗗悕绉�",
-      prop: "supplierName",
-      width:300
-    },
-    {
-      label: "褰曞叆浜�",
-      prop: "recorderName",
-    },
-    {
-      label: "褰曞叆鏃ユ湡",
-      prop: "entryDate",
-      width:110
-    },
-    {
-      label: "鍚堝悓閲戦(鍏�)",
-      prop: "contractAmount",
-      width:200,
-      formatData: (val) => {
-        return val ? parseFloat(val).toFixed(2) : 0;
-      },
-    },
-    {
-      label: "宸叉潵绁ㄩ噾棰�(鍏�)",
-      prop: "receiptPaymentAmount",
-      width:200,
-      formatData: (val) => {
-        return val ? parseFloat(val).toFixed(2) : 0;
-      },
-    },
-    {
-      label: "寰呮潵绁ㄩ噾棰�(鍏�)",
-      prop: "unReceiptPaymentAmount",
-      width:200,
-      formatData: (val) => {
-        return val ? parseFloat(val).toFixed(2) : 0;
-      },
-    },
-    {
-      fixed: "right",
-      label: "鎿嶄綔",
-      dataType: "slot",
-      slot: "operation",
-      align: "center",
-      width: 100,
-    },
-  ]
-);
-
-const handleSelectionChange = (selection) => {
-  selectedRows.value = selection.filter(
-    (item) => item.purchaseContractNumber !== undefined
-  );
-};
-
-// 璁$畻鏄惁鍙互鏉ョエ鐧昏锛氬鏋滄墍鏈夐�変腑琛岀殑寰呮潵绁ㄩ噾棰濋兘涓�0锛屽垯绂佺敤鎸夐挳
-const isInvoiceDisabled = computed(() => {
-  if (selectedRows.value.length === 0) {
-    return true;
-  }
-  // 濡傛灉鎵�鏈夐�変腑琛岀殑寰呮潵绁ㄩ噾棰濋兘涓�0鎴栧皬浜庣瓑浜�0锛屽垯绂佺敤
-  return selectedRows.value.every(row => {
-    const amount = parseFloat(row.unReceiptPaymentAmount || 0);
-    return amount <= 0;
-  });
-});
-
-const handleAdd = (type) => {
-	if (selectedRows.value.length < 1) {
-		proxy.$modal.msgWarning("璇疯嚦灏戦�変腑涓�鏉℃暟鎹�");
-		return;
-	}
-	modalRef.value.open(type, selectedRows.value);
-};
-
-const handleEdit = (type, id) => {
-  modalRef.value.open(type, id);
-};
-
-// 瀵煎嚭
-const handleOut = () => {
-	ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
-		confirmButtonText: "纭",
-		cancelButtonText: "鍙栨秷",
-		type: "warning",
-	})
-		.then(() => {
-			proxy.download("/purchase/registration/export", {}, "鏉ョエ鐧昏.xlsx");
-		})
-		.catch(() => {
-			proxy.$modal.msg("宸插彇娑�");
-		});
-};
-
-// 瀵煎嚭閲囪喘鍙拌处
-const handleExport = () => {
-	ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
-		confirmButtonText: "纭",
-		cancelButtonText: "鍙栨秷",
-		type: "warning",
-	})
-		.then(() => {
-			proxy.download("/purchase/ledger/exportOne", {}, "鏉ョエ鐧昏.xlsx");
-		})
-		.catch(() => {
-			proxy.$modal.msg("宸插彇娑�");
-		});
-};
-
-// 鍒犻櫎
-const handleDelete = () => {
-	let ids = [];
-	if (selectedRows.value.length > 0) {
-    // 鏂板鍒ゆ柇锛氬鏋滄湁閫変腑鐨勬暟鎹病鏈塼icketRegistrationId锛屾彁绀哄苟缁堟
-    const noTicket = selectedRows.value.some(item => !item.ticketRegistrationId);
-    if (noTicket) {
-      proxy.$modal.msgWarning("閲囪喘鍙拌处杩樻湭杩涜鏉ョエ鐧昏,鏃犳硶杩涜鍒犻櫎鎿嶄綔");
-      return;
-    }
-		ids = selectedRows.value.map((item) => item.ticketRegistrationId);
-	} else {
-		proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
-		return;
-	}
-	ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
-		confirmButtonText: "纭",
-		cancelButtonText: "鍙栨秷",
-		type: "warning",
-	})
-		.then(() => {
-			delRegistration(ids).then((res) => {
-				proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
-				getList();
-			});
-		})
-		.catch(() => {
-			proxy.$modal.msg("宸插彇娑�");
-		});
-};
-
-const expandChange = async (row, expandedRows) => {
-  if (expandedRows.length > 0) {
-    await nextTick();
-    expandTableRef.value.getList(row.id);
-  }
-};
-
-const changePage = ({ page, limit }) => {
-  pagination.currentPage = page;
-  pagination.pageSize = limit;
-  onCurrentChange(page);
-};
-// 涓昏〃鍚堣鏂规硶
-const summarizeMainTable = (param) => {
-	return proxy.summarizeTable(
-		param,
-		["contractAmount", "receiptPaymentAmount", "unReceiptPaymentAmount"],
-		{
-			ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
-			futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
-		}
-	);
-};
-onMounted(() => {
-  getTableData();
-});
-</script>
-
-<style lang="scss" scoped>
-.table_list {
-  margin-top: unset;
-}
-.actions {
-  display: flex;
-  justify-content: space-between;
-  margin-bottom: 10px;
-}
-</style>
diff --git a/src/views/procurementManagement/paymentEntry/index.vue b/src/views/procurementManagement/paymentEntry/index.vue
deleted file mode 100644
index 9ce59ad..0000000
--- a/src/views/procurementManagement/paymentEntry/index.vue
+++ /dev/null
@@ -1,597 +0,0 @@
-<template>
-  <div class="app-container">
-    <div class="search_form">
-      <el-form :inline="true" :model="searchForm" style="width: 100%">
-        <el-row justify="space-between">
-          <el-col :span="20">
-            <el-form-item label="渚涘簲鍟嗗悕绉�/鍚堝悓鍙�">
-              <el-input
-                v-model="searchForm.supplierNameOrContractNo"
-                style="width: 240px"
-                placeholder="杈撳叆渚涘簲鍟嗗悕绉�/鍚堝悓鍙锋悳绱�"
-                clearable
-                prefix-icon="Search"
-                @change="handleQuery"
-              />
-            </el-form-item>
-            <el-form-item>
-              <el-checkbox
-                v-model="searchForm.status"
-                label="涓嶆樉绀哄緟浠樻涓�0"
-                @change="handleQuery"
-              />
-            </el-form-item>
-            <el-form-item>
-              <el-button type="primary" @click="handleQuery"> 鎼滅储 </el-button>
-            </el-form-item>
-          </el-col>
-          <el-col :span="4">
-            <el-form-item style="float: right; margin-right: unset">
-              <el-button type="primary" @click="openForm('add')">
-                鏂板浠樻
-              </el-button>
-              <el-button @click="handleExport" style="margin-right: 10px">瀵煎嚭</el-button>
-<!--              <el-button type="danger" plain @click="handleDelete">-->
-<!--                鍒犻櫎-->
-<!--              </el-button>-->
-            </el-form-item>
-          </el-col>
-        </el-row>
-      </el-form>
-    </div>
-    <div class="table_list">
-      <PIMTable
-        rowKey="id"
-        :column="tableColumn"
-        :tableData="tableData"
-        :page="page"
-        :expandRowKeys="expandedRowKeys"
-        :isSelection="true"
-        :isShowSummary="isShowSummarySon"
-        :summaryMethod="summarizeMainTable1"
-        @selection-change="handleSelectionChange"
-        @expand-change="expandChange"
-        :tableLoading="tableLoading"
-        @pagination="pagination"
-        :total="page.total"
-      >
-				<template #expand="{ row }">
-					<el-table
-						:data="expandData"
-						border
-						show-summary
-						v-loading="childrenLoading"
-						:summary-method="summarizeMainTable2"
-					>
-						<el-table-column
-							align="center"
-							label="搴忓彿"
-							type="index"
-							width="60"
-						/>
-						<el-table-column label="浠樻鏃ユ湡" prop="paymentDate" />
-						<el-table-column label="浠樻閲戦" prop="currentPaymentAmount">
-							<template #default="scope">
-								<el-input-number :step="0.01" :min="0" style="width: 100%"
-																 v-model="scope.row.currentPaymentAmount"
-																 :disabled="!scope.row.editType"
-																 :precision="2"
-																 placeholder="璇疯緭鍏�"
-																 clearable
-								/>
-							</template>
-						</el-table-column>
-						<el-table-column label="浠樻鏂瑰紡" prop="paymentMethod">
-							<template #default="scope">
-								<el-select
-									:disabled="!scope.row.editType"
-									v-model="scope.row.paymentMethod"
-									placeholder="璇烽�夋嫨"
-									clearable
-								>
-									<el-option
-										v-for="item in checkout_payment"
-										:key="item.value"
-										:label="item.label"
-										:value="item.value"
-									/>
-								</el-select>
-							</template>
-						</el-table-column>
-						<el-table-column label="鐧昏浜�" prop="registrant" />
-						<el-table-column label="鐧昏鏃ユ湡" prop="registrationtDate" />
-						<el-table-column label="鎿嶄綔" width="150">
-							<template #default="scope">
-								<el-button
-									link
-									type="primary"
-									@click="changeEditType(scope.row)"
-									v-if="!scope.row.editType"
-								>缂栬緫</el-button
-								>
-								<el-button
-									link
-									type="primary"
-									@click="saveReceiptPayment(scope.row)"
-									v-if="scope.row.editType"
-								>淇濆瓨</el-button
-								>
-								<el-button
-									link
-									type="primary"
-									@click="handleDelete(scope.row)"
-								>鍒犻櫎</el-button
-								>
-							</template>
-						</el-table-column>
-					</el-table>
-				</template>
-			</PIMTable>
-    </div>
-    <FormDialog
-      v-model="dialogFormVisible"
-      title="鏂板浠樻椤甸潰"
-      :width="'90%'"
-      @close="closeDia"
-      @confirm="submitForm"
-      @cancel="closeDia"
-    >
-      <el-table
-        v-if="forms.length"
-        :data="forms"
-        border
-        style="width: 100%"
-        size="small"
-      >
-        <el-table-column type="index" label="搴忓彿" width="50" align="center"/>
-        <el-table-column label="閲囪喘鍚堝悓鍙�" prop="purchaseContractNumber" show-overflow-tooltip />
-        <el-table-column label="閿�鍞悎鍚屽彿" prop="salesContractNo" show-overflow-tooltip />
-        <el-table-column label="渚涘簲鍟嗗悕绉�" prop="supplierName" show-overflow-tooltip />
-        <el-table-column
-          label="浜у搧澶х被"
-          prop="productCategory"
-          show-overflow-tooltip
-          width="100"
-        />
-        <el-table-column
-          label="瑙勬牸鍨嬪彿"
-          prop="specificationModel"
-          show-overflow-tooltip
-          width="150"
-        />
-        <el-table-column
-          label="寰呬粯娆鹃噾棰�(鍏�)"
-          prop="pendingTicketsTotal"
-          show-overflow-tooltip
-          width="170"
-        >
-          <template #default="{ row, column }">
-            <el-text type="danger">
-              {{ formattedNumber(row, column, row.pendingTicketsTotal) }}
-            </el-text>
-          </template>
-        </el-table-column>
-        <el-table-column label="鏈浠樻閲戦(鍏�)" width="180">
-          <template #default="{ row }">
-            <el-input-number
-              v-model="row.currentPaymentAmount"
-              :step="0.01"
-              :min="0"
-              :max="Number(row.pendingTicketsTotal || 0)"
-              :precision="2"
-              style="width: 100%"
-              placeholder="璇疯緭鍏�"
-            />
-          </template>
-        </el-table-column>
-        <el-table-column label="浠樻鏂瑰紡" width="160">
-          <template #default="{ row }">
-            <el-select v-model="row.paymentMethod" placeholder="璇烽�夋嫨" clearable>
-              <el-option
-                v-for="item in checkout_payment"
-                :key="item.value"
-                :label="item.label"
-                :value="item.value"
-              />
-            </el-select>
-          </template>
-        </el-table-column>
-        <el-table-column label="浠樻鏃ユ湡" width="170">
-          <template #default="{ row }">
-            <el-date-picker
-              v-model="row.paymentDate"
-              value-format="YYYY-MM-DD"
-              format="YYYY-MM-DD"
-              type="date"
-              placeholder="璇烽�夋嫨"
-              style="width: 100%"
-            />
-          </template>
-        </el-table-column>
-        <el-table-column label="鐧昏浜�" width="140">
-          <template #default="{ row }">
-            <el-input v-model="row.registrant" disabled />
-          </template>
-        </el-table-column>
-        <el-table-column label="鐧昏鏃ユ湡" width="170">
-          <template #default="{ row }">
-            <el-input v-model="row.registrationtDate" />
-          </template>
-        </el-table-column>
-      </el-table>
-      <div v-else class="empty-tip">璇烽�夋嫨闇�瑕佷粯娆剧殑璁板綍</div>
-    </FormDialog>
-  </div>
-</template>
-
-<script setup>
-import FormDialog from '@/components/Dialog/FormDialog.vue';
-import { ref, reactive, toRefs, getCurrentInstance, nextTick, onMounted } from "vue";
-import { Search } from "@element-plus/icons-vue";
-import { ElMessageBox } from "element-plus";
-import useUserStore from "@/store/modules/user.js";
-import {
-  byPurchaseId,
-  paymentRegistrationAdd,
-  paymentRegistrationDel,
-  paymentRegistrationEdit,
-  getTicketNo,
-} from "@/api/procurementManagement/paymentEntry.js";
-import {
-	delPaymentRegistration,
-	invoiceListPage,
-	registrationListPageGetById,
-	updatePaymentRegistration
-} from "@/api/procurementManagement/procurementInvoiceLedger.js";
-import useFormData from "@/hooks/useFormData";
-import { getCurrentDate } from "@/utils/index.js";
-
-const { proxy } = getCurrentInstance();
-const { checkout_payment } = proxy.useDict("checkout_payment");
-const tableColumn = ref([
-	{
-		type: "expand",
-		dataType: "slot",
-		slot: "expand",
-	},
-  {
-    label: "閲囪喘鍚堝悓鍙�",
-    prop: "purchaseContractNumber",
-    width:160
-  },
-  {
-    label: "閿�鍞悎鍚屽彿",
-    prop: "salesContractNo",
-    width:160
-  },
-  {
-    label: "渚涘簲鍟嗗悕绉�",
-    prop: "supplierName",
-  },
-	{
-		label: "浠樻鐘舵��",
-		prop: "statusName",
-    width:110,
-		dataType: "tag",
-		formatType: (params) => {
-			if (params == '鏈畬鎴愪粯娆�') {
-				return "danger";
-			} else if (params == '宸插畬鎴愪粯娆�') {
-				return "success";
-			} else {
-				return null;
-			}
-		},
-	},
-	{
-		label: "浜у搧澶х被",
-		prop: "productCategory",
-		showOverflowTooltip: true,
-	},
-	{
-		label: "瑙勬牸鍨嬪彿",
-		prop: "specificationModel",
-		showOverflowTooltip: true,
-		width: 150
-	},
-  {
-    label: "宸蹭粯娆鹃噾棰�(鍏�)",
-    prop: "ticketsTotal",
-    formatData: (params) => {
-      return params ? parseFloat(params).toFixed(2) : 0;
-    },
-  },
-  {
-    label: "寰呬粯娆鹃噾棰�(鍏�)",
-    prop: "pendingTicketsTotal",
-    formatData: (params) => {
-      return params ? parseFloat(params).toFixed(2) : 0;
-    },
-  },
-]);
-const tableData = ref([]);
-const expandData = ref([]);
-const selectedRows = ref([]);
-const tableLoading = ref(false);
-const childrenLoading = ref(false);
-const forms = ref([]);
-const userStore = useUserStore();
-const page = reactive({
-  current: 1,
-  size: 100,
-	total: 0,
-});
-
-// 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
-const operationType = ref("");
-const dialogFormVisible = ref(false);
-const data = reactive({
-  searchForm: {
-    supplierNameOrContractNo: "",
-    status: false,
-    // 鍙煡璇㈠鎵圭姸鎬佷负 3 鐨勮褰�
-    approvalStatus: 3,
-  },
-  form: {
-    purchaseContractNumber: "",
-    purchaseLedgerId: "",
-    salesContractNo: "",
-    supplierName: "",
-    taxRate: "",
-    currentPaymentAmount: "",
-    paymentMethod: "",
-    registrant: "",
-    registrantId: "",
-    paymentDate: "",
-    registrationtDate: "",
-  },
-  rules: {
-    purchaseLedgerId: [
-      { required: true, message: "璇烽�夋嫨", trigger: "change" },
-    ],
-    currentPaymentAmount: [
-      { required: true, message: "璇疯緭鍏�", trigger: "blur" },
-    ],
-    paymentMethod: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
-  },
-});
-const { form, rules } = toRefs(data);
-const { form: searchForm, resetForm } = useFormData(data.searchForm);
-const isShowSummarySon = ref(true);
-const expandedRowKeys = ref([]);
-
-const getStatusTagType = (statusName = '') => {
-	const normalized = statusName.trim();
-	if (!normalized) return 'info';
-	return normalized === '鏈畬鎴愪粯娆�' ? 'danger' : 'success';
-};
-
-const formattedNumber = (row, column, cellValue) => {
-  const val = Number(cellValue ?? 0);
-  return Number.isFinite(val) ? val.toFixed(2) : "0.00";
-};
-// 瀛愯〃鍚堣鏂规硶
-const summarizeMainTable1 = (param) => {
-  return proxy.summarizeTable(
-    param,
-    ["ticketsTotal", "pendingTicketsTotal"],
-    {
-      ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
-      futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
-    }
-  );
-};
-// 瀛愯〃鍚堣鏂规硶
-const summarizeMainTable2 = (param) => {
-	return proxy.summarizeTable(param, ["currentPaymentAmount"], {
-		ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
-		futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
-	});
-};
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
-  page.current = 1;
-  getList();
-};
-const pagination = (obj) => {
-  page.current = obj.page;
-  page.size = obj.limit;
-  getList();
-};
-const getList = () => {
-  tableLoading.value = true;
-  invoiceListPage({ ...searchForm, ...page }).then((res) => {
-    tableLoading.value = false;
-    tableData.value = res.data.records;
-		page.total = res.data.total;
-		if (expandedRowKeys.value.length > 0) {
-			const arr = []
-			const index = tableData.value.findIndex(item => item.id === expandedRowKeys.value[0]);
-			if (index > -1) {
-				arr.push(tableData.value[index]);
-				expandChange(tableData.value[index], arr)
-			}
-		}
-  });
-};
-// 灞曞紑琛�
-const expandChange = (row, expandedRows) => {
-	if (expandedRows.length > 0) {
-		nextTick(() => {
-			expandedRowKeys.value = [];
-			try {
-				childrenLoading.value = true;
-				registrationListPageGetById({ id: row.id }).then((res) => {
-					childrenLoading.value = false;
-					const index = tableData.value.findIndex((item) => item.id === row.id);
-					if (index > -1) {
-						expandData.value = res;
-					}
-					expandedRowKeys.value.push(row.id);
-				});
-			} catch (error) {
-				childrenLoading.value = false;
-				console.log(error);
-			}
-		})
-	} else {
-		expandedRowKeys.value = [];
-	}
-};
-// 缂栬緫淇敼鐘舵��
-const changeEditType = (row) => {
-	row.editType = !row.editType;
-};
-// 淇濆瓨鍥炴璁板綍
-const saveReceiptPayment = (row) => {
-	let updateData = {
-		id: row.id,
-		currentPaymentAmount: row.currentPaymentAmount,
-		paymentMethod: row.paymentMethod,
-	};
-	updatePaymentRegistration(updateData).then((res) => {
-		row.editType = !row.editType;
-		getList();
-		proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
-	});
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
-  selectedRows.value = selection;
-};
-// 鎵撳紑寮规
-const openForm = (type, row) => {
-  if (selectedRows.value.length === 0) {
-    proxy.$modal.msgError("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
-    return;
-  }
-  const validRows = selectedRows.value.filter((item) => Number(item.pendingTicketsTotal || 0) !== 0);
-  if (validRows.length === 0) {
-    proxy.$modal.msgWarning("鎵�閫夎褰曞潎鏃犻渶浠樻");
-    return;
-  }
-  forms.value = validRows.map((row) => ({
-    purchaseContractNumber: row.purchaseContractNumber || "",
-    salesContractNo: row.salesContractNo || "",
-    supplierName: row.supplierName || "",
-    supplierId: row.supplierId,
-    productCategory: row.productCategory || "",
-    specificationModel: row.specificationModel || "",
-    pendingTicketsTotal: Number(row.pendingTicketsTotal || 0),
-    currentPaymentAmount: "",
-    paymentMethod: "",
-    paymentDate: "",
-    registrant: userStore.nickName,
-    registrationtDate: getCurrentDate(),
-    ticketRegistrationId: row.id,
-    purchaseLedgerId: row.salesLedgerId,
-    salesLedgerProductId: row.id,
-  }));
-  dialogFormVisible.value = true;
-};
-// 鎻愪氦琛ㄥ崟
-const submitForm = () => {
-  if (forms.value.length === 0) {
-    proxy.$modal.msgError("璇烽�夋嫨浠樻璁板綍");
-    return;
-  }
-  for (let i = 0; i < forms.value.length; i++) {
-    const item = forms.value[i];
-    const pendingAmount = Number(item.pendingTicketsTotal || 0);
-    const currentAmount = Number(item.currentPaymentAmount);
-    if (!item.currentPaymentAmount && item.currentPaymentAmount !== 0) {
-      proxy.$modal.msgError(`绗� ${i + 1} 鏉★細璇峰~鍐欎粯娆鹃噾棰漙);
-      return;
-    }
-    if (currentAmount > pendingAmount) {
-      proxy.$modal.msgError(
-        `绗� ${i + 1} 鏉★細浠樻閲戦涓嶈兘瓒呰繃寰呬粯娆鹃噾棰濓紙寰呬粯娆撅細${pendingAmount.toFixed(
-          2
-        )}锛塦
-      );
-      return;
-    }
-    if (!item.paymentMethod) {
-      proxy.$modal.msgError(`绗� ${i + 1} 鏉★細璇烽�夋嫨浠樻鏂瑰紡`);
-      return;
-    }
-    if (!item.paymentDate) {
-      proxy.$modal.msgError(`绗� ${i + 1} 鏉★細璇烽�夋嫨浠樻鏃ユ湡`);
-      return;
-    }
-  }
-  const normalizePaymentMethodValue = (method) => {
-    const hit = checkout_payment.value.find((item) => item.value == method || item.label == method);
-    return hit ? hit.value : method;
-  };
-  const submitRows = forms.value.map((item) => ({
-    ...item,
-    paymentMethod: normalizePaymentMethodValue(item.paymentMethod),
-  }));
-  paymentRegistrationAdd(submitRows).then(() => {
-    proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
-    closeDia();
-    getList();
-  });
-};
-// 鍏抽棴寮规
-const closeDia = () => {
-  forms.value = [];
-  dialogFormVisible.value = false;
-};
-// 鍒犻櫎
-const handleDelete = (row) => {
-  ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鍒犻櫎鎻愮ず", {
-    confirmButtonText: "纭",
-    cancelButtonText: "鍙栨秷",
-    type: "warning",
-  })
-    .then(() => {
-      tableLoading.value = true;
-			delPaymentRegistration([row.id])
-        .then((res) => {
-          proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
-          getList();
-        })
-        .finally(() => {
-          tableLoading.value = false;
-        });
-    })
-    .catch(() => {
-      proxy.$modal.msg("宸插彇娑�");
-    });
-};
-// 瀵煎嚭
-const handleExport = () => {
-  ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
-    confirmButtonText: "纭",
-    cancelButtonText: "鍙栨秷",
-    type: "warning",
-  })
-    .then(() => {
-      proxy.download("/purchase/registration/exportOne", { ...searchForm, ...page }, "浠樻鐧昏.xlsx");
-    })
-    .catch(() => {
-      proxy.$modal.msg("宸插彇娑�");
-    });
-};
-
-onMounted(() => {
-  getList();
-});
-</script>
-
-<style scoped lang="scss">
-.table_list {
-  margin-top: unset;
-}
-:deep(.el-checkbox__label) {
-  font-weight: bold;
-}
-.empty-tip {
-  text-align: center;
-  padding: 20px 0;
-  color: #909399;
-}
-</style>
diff --git a/src/views/procurementManagement/paymentHistory/index.vue b/src/views/procurementManagement/paymentHistory/index.vue
deleted file mode 100644
index c9e9836..0000000
--- a/src/views/procurementManagement/paymentHistory/index.vue
+++ /dev/null
@@ -1,270 +0,0 @@
-<template>
-  <div class="app-container">
-    <el-form :model="searchForm" :inline="true">
-      <el-form-item label="閲囪喘鍚堝悓鍙�">
-        <el-input
-          v-model="searchForm.purchaseContractNumber"
-          style="width: 240px"
-          placeholder="杈撳叆閲囪喘鍚堝悓鍙锋悳绱�"
-          @change="handleQuery"
-          clearable
-          :prefix-icon="Search"
-        />
-      </el-form-item>
-      <el-form-item label="渚涘簲鍟嗗悕绉�">
-        <el-input
-          v-model="searchForm.searchText"
-          style="width: 240px"
-          placeholder="杈撳叆渚涘簲鍟嗗悕绉版悳绱�"
-          @change="handleQuery"
-          clearable
-          :prefix-icon="Search"
-        />
-      </el-form-item>
-      <el-form-item label="浠樻鏃ユ湡">
-        <el-date-picker
-          v-model="searchForm.paymentDate"
-          value-format="YYYY-MM-DD"
-          format="YYYY-MM-DD"
-          type="daterange"
-          start-placeholder="寮�濮嬫椂闂�"
-          end-placeholder="缁撴潫鏃堕棿"
-          clearable
-          @change="changeDateRange"
-          @clear="clearRange"
-        />
-      </el-form-item>
-      <el-form-item>
-        <el-button
-          type="primary"
-          @click="handleQuery"
-          style="margin-left: 10px"
-        >
-          鎼滅储
-        </el-button>
-        <el-button @click="handleExport">瀵煎嚭</el-button>
-        <el-button
-          type="danger"
-          :disabled="selectedRows.length === 0"
-          @click="handleBatchDelete"
-        >
-          鎵归噺鍒犻櫎 ({{ selectedRows.length }})
-        </el-button>
-      </el-form-item>
-    </el-form>
-    <div class="table_list">
-      <PIMTable
-        rowKey="id"
-        :column="tableColumn"
-        :tableData="tableData"
-        :page="page"
-        :isSelection="true"
-        :isShowSummary="isShowSummarySon"
-        :summaryMethod="summarizeMainTable1"
-        @selection-change="handleSelectionChange"
-        :tableLoading="tableLoading"
-        @pagination="pagination"
-        :total="page.total"
-      >
-        <template #operation="{ row }">
-          <el-button
-            type="primary"
-            link
-            @click="handleDelete(row)"
-          >
-            鍒犻櫎
-          </el-button>
-        </template>
-      </PIMTable>
-    </div>
-  </div>
-</template>
-
-<script setup>
-import { ref, reactive, getCurrentInstance, onMounted } from "vue";
-import { Search } from "@element-plus/icons-vue";
-import { ElMessageBox } from "element-plus";
-import { paymentHistoryListPage} from "@/api/procurementManagement/paymentEntry.js";
-import {delPaymentRegistration } from "@/api/procurementManagement/procurementInvoiceLedger.js";
-import useFormData from "@/hooks/useFormData";
-import dayjs from "dayjs";
-
-const { proxy } = getCurrentInstance();
-const isShowSummarySon = ref(true);
-const tableColumn = ref([
-  {
-    label: "閲囪喘鍚堝悓鍙�",
-    prop: "purchaseContractNumber",
-  },
-  {
-    label: "浠樻鏃ユ湡",
-    prop: "paymentDate",
-  },
-  {
-    label: "渚涘簲鍟嗗悕绉�",
-    prop: "supplierName",
-    width:240
-  },
-  {
-    label: "浠樻閲戦",
-    prop: "currentPaymentAmount",
-    formatData: (params) => {
-      return params ? parseFloat(params).toFixed(2) : 0;
-    },
-  },
-  {
-    label: "浠樻鏂瑰紡",
-    prop: "paymentMethod",
-  },
-  {
-    label: "鐧昏浜�",
-    prop: "registrant",
-  },
-  {
-    label: "鐧昏鏃ユ湡",
-    prop: "registrationtDate",
-  },
-  {
-    label: "鎿嶄綔",
-    dataType: "slot",
-    slot: "operation",
-    width: 100,
-    align: "center",
-  },
-]);
-const tableData = ref([]);
-const selectedRows = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
-  current: 1,
-  size: 100,
-  total: 0,
-});
-const total = ref(0);
-const { form: searchForm } = useFormData({
-  searchText: undefined,
-	purchaseContractNumber: undefined,
-  paymentDate: [],
-  paymentDateStart: undefined,
-  paymentDateEnd: undefined,
-});
-
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
-  page.current = 1;
-  getList();
-};
-const pagination = (obj) => {
-  page.current = obj.page;
-  page.size = obj.limit;
-  getList();
-};
-const getList = () => {
-  tableLoading.value = true;
-  const { paymentDate, ...rest } = searchForm;
-  paymentHistoryListPage({ ...rest, ...page }).then((res) => {
-    tableLoading.value = false;
-    tableData.value = res.records;
-		page.total = res.total;
-  });
-};
-// 瀛愯〃鍚堣鏂规硶
-const summarizeMainTable1 = (param) => {
-  return proxy.summarizeTable(param, ["currentPaymentAmount"], {
-    ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
-    futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
-  });
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
-  selectedRows.value = selection;
-};
-
-const changeDateRange = (date) => {
-  if (date) {
-    searchForm.paymentDateStart = date[0];
-    searchForm.paymentDateEnd = date[1];
-    getList();
-  }
-};
-
-const clearRange = () => {
-  searchForm.paymentDate = [];
-  searchForm.paymentDateStart = undefined;
-  searchForm.paymentDateEnd = undefined;
-  getList();
-};
-
-// 鍒犻櫎
-const handleDelete = (row) => {
-  ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鍒犻櫎鎻愮ず", {
-    confirmButtonText: "纭",
-    cancelButtonText: "鍙栨秷",
-    type: "warning",
-  })
-    .then(() => {
-      tableLoading.value = true;
-      delPaymentRegistration([row.id])
-        .then((res) => {
-          proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
-          getList();
-        })
-        .finally(() => {
-          tableLoading.value = false;
-        });
-    })
-    .catch(() => {
-      proxy.$modal.msg("宸插彇娑�");
-    });
-};
-
-// 鎵归噺鍒犻櫎
-const handleBatchDelete = () => {
-  if (selectedRows.value.length === 0) {
-    proxy.$modal.msgWarning("璇烽�夋嫨瑕佸垹闄ょ殑鏁版嵁");
-    return;
-  }
-  ElMessageBox.confirm(
-    `纭畾瑕佸垹闄ら�変腑鐨� ${selectedRows.value.length} 鏉℃暟鎹悧锛焋,
-    "鍒犻櫎鎻愮ず",
-    {
-      confirmButtonText: "纭",
-      cancelButtonText: "鍙栨秷",
-      type: "warning",
-    }
-  )
-    .then(() => {
-      tableLoading.value = true;
-      const ids = selectedRows.value.map((item) => item.id);
-      delPaymentRegistration(ids)
-        .then((res) => {
-          proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
-          selectedRows.value = [];
-          getList();
-        })
-        .finally(() => {
-          tableLoading.value = false;
-        });
-    })
-    .catch(() => {
-      proxy.$modal.msg("宸插彇娑�");
-    });
-};
-
-// 瀵煎嚭
-const handleExport = () => {
-  const { paymentDate, ...rest } = searchForm;
-  proxy.download("/purchase/paymentRegistration/export", { ...rest, ...page }, "浠樻娴佹按.xlsx");
-};
-
-onMounted(() => {
-  getList();
-});
-</script>
-
-<style scoped lang="scss">
-.table_list {
-  margin-top: unset;
-}
-</style>
diff --git a/src/views/procurementManagement/paymentLedger/index.vue b/src/views/procurementManagement/paymentLedger/index.vue
index 23a62aa..99b4b39 100644
--- a/src/views/procurementManagement/paymentLedger/index.vue
+++ b/src/views/procurementManagement/paymentLedger/index.vue
@@ -1,64 +1,54 @@
 <template>
   <div class="app-container">
-    <div class="search_form" style="margin-bottom: 20px;">
+    <div class="search_form"
+         style="margin-bottom: 20px;">
       <div>
         <span class="search_title">渚涘簲鍟嗗悕绉�:</span>
-        <el-input
-          v-model="searchForm.supplierName"
-          style="width: 240px"
-          placeholder="杈撳叆渚涘簲鍟嗗悕绉�"
-          @change="handleQuery"
-          clearable
-          :prefix-icon="Search"
-        />
-        <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
-          >鎼滅储</el-button
-        >
+        <el-input v-model="searchForm.supplierName"
+                  style="width: 240px"
+                  placeholder="杈撳叆渚涘簲鍟嗗悕绉�"
+                  @change="handleQuery"
+                  clearable
+                  :prefix-icon="Search" />
+        <el-button type="primary"
+                   @click="handleQuery"
+                   style="margin-left: 10px">鎼滅储</el-button>
       </div>
       <div></div>
     </div>
     <el-row :gutter="20">
       <el-col :span="14">
         <div class="table_list">
-          <el-table
-            ref="multipleTable"
-            border
-            v-loading="tableLoading"
-            :data="tableData"
-            :header-cell-style="{ background: '#F0F1F5', color: '#333333' }"
-            height="calc(100vh - 18.5em)"
-            :highlight-current-row="true"
-            style="width: 100%"
-            tooltip-effect="dark"
-            @row-click="rowClick"
-            :show-summary="isShowSummary"
-            :summary-method="summarizeMainTable"
-            class="lims-table"
-          >
-            <el-table-column
-              align="center"
-              label="搴忓彿"
-              type="index"
-              width="60"
-            />
-            <el-table-column label="渚涘簲鍟嗗悕绉�" prop="supplierName" />
-            <el-table-column
-              label="鍚堝悓閲戦(鍏�)"
-              prop="invoiceAmount"
-              show-overflow-tooltip
-              :formatter="formattedNumber"
-            />
-            <el-table-column
-              label="浠樻閲戦(鍏�)"
-              prop="paymentAmount"
-              show-overflow-tooltip
-              :formatter="formattedNumber"
-            />
-            <el-table-column
-              label="搴斾粯閲戦(鍏�)"
-              prop="payableAmount"
-              show-overflow-tooltip
-            >
+          <el-table ref="multipleTable"
+                    border
+                    v-loading="tableLoading"
+                    :data="tableData"
+                    :header-cell-style="{ background: '#F0F1F5', color: '#333333' }"
+                    height="calc(100vh - 18.5em)"
+                    :highlight-current-row="true"
+                    style="width: 100%"
+                    tooltip-effect="dark"
+                    @row-click="rowClick"
+                    :show-summary="isShowSummary"
+                    :summary-method="summarizeMainTable"
+                    class="lims-table">
+            <el-table-column align="center"
+                             label="搴忓彿"
+                             type="index"
+                             width="60" />
+            <el-table-column label="渚涘簲鍟嗗悕绉�"
+                             prop="supplierName" />
+            <el-table-column label="鍚堝悓閲戦(鍏�)"
+                             prop="contractAmounts"
+                             show-overflow-tooltip
+                             :formatter="formattedNumber" />
+            <el-table-column label="浠樻閲戦(鍏�)"
+                             prop="paymentAmount"
+                             show-overflow-tooltip
+                             :formatter="formattedNumber" />
+            <el-table-column label="搴斾粯閲戦(鍏�)"
+                             prop="payableAmount"
+                             show-overflow-tooltip>
               <template #default="{ row, column }">
                 <el-text type="danger">
                   {{ formattedNumber(row, column, row.payableAmount) }}
@@ -66,29 +56,27 @@
               </template>
             </el-table-column>
           </el-table>
-          <pagination
-            v-show="total > 0"
-            @pagination="paginationSearch"
-            :total="total"
-            :layout="page.layout"
-            :page="page.current"
-            :limit="page.size"
-          />
+          <pagination v-show="total > 0"
+                      @pagination="paginationSearch"
+                      :total="total"
+                      :layout="page.layout"
+                      :page="page.current"
+                      :limit="page.size" />
         </div>
       </el-col>
       <el-col :span="10">
         <div class="table_list">
-          <PIMTable
-            rowKey="id"
-            :column="tableColumnSon"
-            :tableData="originalTableDataSon"
-            :isSelection="false"
-            :isShowPagination="false"
-            :tableLoading="tableLoadingSon"
-            :isShowSummary="isShowSummarySon"
-            :summaryMethod="summarizeMainTable1"
-						height="calc(100vh - 18.5em)"
-          >
+          <PIMTable rowKey="id"
+                    :column="tableColumnSon"
+                    :tableData="originalTableDataSon"
+                    :isSelection="false"
+                    :isShowPagination="true"
+                    :page="sonPage"
+                    :tableLoading="tableLoadingSon"
+                    :isShowSummary="isShowSummarySon"
+                    :summaryMethod="summarizeMainTable1"
+                    height="calc(100vh - 18.5em)"
+                    @pagination="sonPaginationSearch">
             <template #payableAmountSlot="{ row }">
               <el-text type="danger">
                 {{ parseFloat(row.payableAmount).toFixed(2) }}
@@ -102,191 +90,205 @@
 </template>
 
 <script setup>
-import { ref, toRefs } from "vue";
-import { Search } from "@element-plus/icons-vue";
-import {
-  paymentLedgerList,
-  paymentRecordList,
-} from "@/api/procurementManagement/paymentLedger.js";
-import Pagination from "../../../components/PIMTable/Pagination.vue";
+  import { ref, toRefs } from "vue";
+  import { Search } from "@element-plus/icons-vue";
+  import {
+    paymentLedgerList,
+    paymentRecordList,
+  } from "@/api/procurementManagement/paymentLedger.js";
+  import Pagination from "../../../components/PIMTable/Pagination.vue";
 
-const tableData = ref([]);
-const tableLoading = ref(false);
-const data = reactive({
-  searchForm: {
-    supplierNameOrContractNo: "",
-  },
-});
-const page = reactive({
-  current: 1,
-  size: 100,
-});
-const sonPage = reactive({
-  current: 1,
-  size: 100,
-});
-const total = ref(0);
-const sonTotal = ref(0);
-const isShowSummary = ref(true);
-const { searchForm } = toRefs(data);
-const currentSupplierId = ref("");
-const rowClick = (row) => {
-  currentSupplierId.value = row.supplierId;
-  getPaymenRecordtList(row.supplierId);
-};
-// 瀛愭ā鍧�
-const tableColumnSon = ref([
-  {
-    label: "鍙戠敓鏃ユ湡",
-    prop: "paymentDate",
-		width: 110,
-  },
-  {
-    label: "閲囪喘鍚堝悓鍙�",
-    prop: "purchaseContractNumber",
-		width: 150,
-  },
-  {
-    label: "鍚堝悓閲戦(鍏�)",
-    prop: "invoiceAmount",
-		width: 200,
-    formatData: (params) => {
-      return params ? parseFloat(params).toFixed(2) : 0;
+  const tableData = ref([]);
+  const tableLoading = ref(false);
+  const data = reactive({
+    searchForm: {
+      supplierName: "",
     },
-  },
-  {
-    label: "浠樻閲戦(鍏�)",
-    prop: "paymentAmount",
-		width: 200,
-    formatData: (params) => {
-      return params ? parseFloat(params).toFixed(2) : 0;
-    },
-  },
-  {
-    label: "搴斾粯閲戦(鍏�)",
-    dataType: "slot",
-		width: 200,
-    prop: "payableAmount",
-    slot: "payableAmountSlot",
-  },
-]);
-const tableDataSon = ref([]);
-const originalTableDataSon = ref([]);
-const tableLoadingSon = ref(false);
-const isShowSummarySon = ref(true);
-const detailPageNum = ref(1);
-const detailPageSize = ref(10);
-const { proxy } = getCurrentInstance();
-
-// 涓昏〃鍚堣鏂规硶
-const summarizeMainTable = (param) => {
-  return proxy.summarizeTable(
-    param,
-    ["invoiceAmount", "paymentAmount", "payableAmount"],
-    {
-      ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
-      futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
-    }
-  );
-};
-// 瀛愯〃鍚堣鏂规硶
-const summarizeMainTable1 = (param) => {
-  let summarizeTable = proxy.summarizeTable(
-    param,
-    ["invoiceAmount", "paymentAmount"],
-    {
-      ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
-      futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
-    }
-  );
-  if (originalTableDataSon.value.length > 0) {
-    summarizeTable[summarizeTable.length - 1] =
-      originalTableDataSon.value[
-        originalTableDataSon.value.length - 1
-      ].payableAmount.toFixed(2);
-  } else {
-    summarizeTable[summarizeTable.length - 1] = 0.0;
-  }
-  return summarizeTable;
-};
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
-  page.current = 1;
-  getList();
-};
-const paginationSearch = (obj) => {
-  page.current = obj.page;
-  page.size = obj.limit;
-  getList();
-};
-const getList = () => {
-  tableLoading.value = true;
-  paymentLedgerList({
-    ...searchForm.value,
-    ...page,
-  }).then((res) => {
-    let result = res.data;
-    tableLoading.value = false;
-    tableData.value = result.records || [];
-    total.value = result.total || 0;
-    if (tableData.value.length > 0) {
-      getPaymenRecordtList(tableData.value[0].supplierId);
-      currentSupplierId.value = tableData.value[0].supplierId;
-    }
   });
-};
+  const page = reactive({
+    current: 1,
+    size: 100,
+  });
+  const sonPage = reactive({
+    current: 1,
+    size: 10,
+    total: 0,
+    layout: "total, sizes, prev, pager, next, jumper",
+  });
+  const total = ref(0);
+  const isShowSummary = ref(true);
+  const { searchForm } = toRefs(data);
+  const currentSupplierId = ref("");
+  const rowClick = row => {
+    currentSupplierId.value = row.supplierId;
+    sonPage.current = 1;
+    getPaymenRecordtList(row.supplierId);
+  };
+  // 瀛愭ā鍧�
+  const tableColumnSon = ref([
+    {
+      label: "鍚堝悓绛捐鏃ユ湡",
+      prop: "executionDate",
+      width: 110,
+    },
+    {
+      label: "閲囪喘鍚堝悓鍙�",
+      prop: "purchaseContractNumber",
+      width: 150,
+    },
+    {
+      label: "鍚堝悓閲戦(鍏�)",
+      prop: "contractAmount",
+      width: 200,
+      formatData: params => {
+        return params ? parseFloat(params).toFixed(2) : 0;
+      },
+    },
+    {
+      label: "浠樻閲戦(鍏�)",
+      prop: "paymentAmount",
+      width: 200,
+      formatData: params => {
+        return params ? parseFloat(params).toFixed(2) : 0;
+      },
+    },
+    {
+      label: "搴斾粯閲戦(鍏�)",
+      dataType: "slot",
+      width: 200,
+      prop: "payableAmount",
+      slot: "payableAmountSlot",
+    },
+  ]);
+  const tableDataSon = ref([]);
+  const originalTableDataSon = ref([]);
+  const tableLoadingSon = ref(false);
+  const isShowSummarySon = ref(true);
+  const { proxy } = getCurrentInstance();
 
-const getPaymenRecordtList = (supplierId) => {
-  tableLoadingSon.value = true;
-  paymentRecordList({supplierId: supplierId})
-    .then((res) => {
-      tableLoadingSon.value = false;
-      tableDataSon.value = res.data;
-      handlePagination({ page: 1, limit: sonPage.size });
-      sonTotal.value = res.data.length;
-    })
-    .catch((e) => {
-      tableLoadingSon.value = false;
+  // 涓昏〃鍚堣鏂规硶
+  const summarizeMainTable = param => {
+    return proxy.summarizeTable(
+      param,
+      ["contractAmounts", "paymentAmount", "payableAmount"],
+      {
+        ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
+        futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
+      }
+    );
+  };
+  // 瀛愯〃鍚堣鏂规硶
+  const summarizeMainTable1 = param => {
+    let summarizeTable = proxy.summarizeTable(
+      param,
+      ["contractAmount", "invoiceAmount", "paymentAmount"],
+      {
+        ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
+        futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
+      }
+    );
+    if (originalTableDataSon.value.length > 0) {
+      summarizeTable[summarizeTable.length - 1] =
+        originalTableDataSon.value[
+          originalTableDataSon.value.length - 1
+        ].payableAmount.toFixed(2);
+    } else {
+      summarizeTable[summarizeTable.length - 1] = 0.0;
+    }
+    return summarizeTable;
+  };
+  /** 鎼滅储鎸夐挳鎿嶄綔 */
+  const handleQuery = () => {
+    page.current = 1;
+    getList();
+  };
+  const paginationSearch = obj => {
+    page.current = obj.page;
+    page.size = obj.limit;
+    getList();
+  };
+  const getList = () => {
+    tableLoading.value = true;
+    paymentLedgerList({
+      ...searchForm.value,
+      ...page,
+    }).then(res => {
+      let result = res.data;
+      tableLoading.value = false;
+      tableData.value = result.records || [];
+      total.value = result.total || 0;
+      if (tableData.value.length > 0) {
+        currentSupplierId.value = tableData.value[0].supplierId;
+        sonPage.current = 1;
+        getPaymenRecordtList(tableData.value[0].supplierId);
+      }
     });
-};
-const handlePagination = ({ page, limit }) => {
-  sonPage.current = page;
-  sonPage.size = limit;
+  };
 
-  const start = (page - 1) * limit;
-  const end = start + limit;
+  const getPaymenRecordtList = supplierId => {
+    tableLoadingSon.value = true;
+    paymentRecordList({
+      supplierId: supplierId,
+      current: sonPage.current,
+      size: sonPage.size,
+    })
+      .then(res => {
+        tableLoadingSon.value = false;
+        let result = res.data;
+        if (Array.isArray(result)) {
+          tableDataSon.value = result;
+          sonPage.total = result.length;
+          handlePagination({ page: sonPage.current, limit: sonPage.size });
+        } else {
+          originalTableDataSon.value = result.records || [];
+          sonPage.total = result.total || 0;
+        }
+      })
+      .catch(e => {
+        tableLoadingSon.value = false;
+      });
+  };
+  const handlePagination = ({ page, limit }) => {
+    console.log(page, limit);
+    sonPage.current = page;
+    sonPage.size = limit;
 
-  originalTableDataSon.value = tableDataSon.value.slice(start, end);
-};
+    const start = (page - 1) * limit;
+    const end = start + limit;
 
-const sonPaginationSearch = (pagination) => {
-  // 鎺ユ敹鍒嗛〉鍣ㄥ弬鏁� { page, limit }
-  handlePagination(pagination);
-};
-const formattedNumber = (row, column, cellValue) => {
-  if (column.property !== "supplierName") {
-    return parseFloat(cellValue).toFixed(2);
-  } else {
-    return cellValue;
-  }
-};
-getList();
+    originalTableDataSon.value = tableDataSon.value.slice(start, end);
+  };
+
+  const sonPaginationSearch = pagination => {
+    // 鎺ユ敹鍒嗛〉鍣ㄥ弬鏁� { page, limit }
+    sonPage.current = pagination.page;
+    sonPage.size = pagination.limit;
+    getPaymenRecordtList(currentSupplierId.value);
+  };
+  const formattedNumber = (row, column, cellValue) => {
+    if (column.property !== "supplierName") {
+      return parseFloat(cellValue).toFixed(2);
+    } else {
+      return cellValue;
+    }
+  };
+  getList();
 </script>
 
 <style scoped lang="scss">
-.el-pagination {
-  width: 100%;
-  height: 55px;
-  display: flex;
-  justify-content: flex-end;
-  float: right;
-  flex-direction: row;
-  align-items: center;
-  background: #fff;
-  margin: -20px 0 0 0;
-  padding: 0 20px;
-}
-.pagination-container {
-  margin-top: 0;
-}
+  .el-pagination {
+    width: 100%;
+    height: 55px;
+    display: flex;
+    justify-content: flex-end;
+    float: right;
+    flex-direction: row;
+    align-items: center;
+    background: #fff;
+    margin: -20px 0 0 0;
+    padding: 0 20px;
+  }
+  .pagination-container {
+    margin-top: 0;
+  }
 </style>
diff --git a/src/views/procurementManagement/procurementInvoiceLedger/Modal/EditModal.vue b/src/views/procurementManagement/procurementInvoiceLedger/Modal/EditModal.vue
deleted file mode 100644
index 4e461dc..0000000
--- a/src/views/procurementManagement/procurementInvoiceLedger/Modal/EditModal.vue
+++ /dev/null
@@ -1,238 +0,0 @@
-<template>
-  <el-dialog :title="modalOptions.title"
-             v-model="visible"
-             @close="close">
-    <el-form :model="form">
-      <el-row :gutter="20">
-        <el-col :span="12">
-          <el-form-item label="閲囪喘鍚堝悓鍙凤細">
-            <el-tag size="large">{{ form.purchaseContractNumber }}</el-tag>
-          </el-form-item>
-        </el-col>
-        <el-col :span="12">
-          <el-form-item label="閿�鍞悎鍚屽彿锛�">
-            <el-text>{{ form.salesContractNo }}</el-text>
-          </el-form-item>
-        </el-col>
-        <el-col :span="12">
-          <el-form-item label="鍚◣鍗曚环(鍏�)锛�">
-            <el-text type="primary">{{ form.taxInclusiveUnitPrice }}</el-text>
-          </el-form-item>
-        </el-col>
-        <el-col :span="12">
-          <el-form-item label="鍒涘缓鏃堕棿锛�">
-            <el-text>{{ form.createdAt }}</el-text>
-          </el-form-item>
-        </el-col>
-        <el-col :span="12">
-          <el-form-item label="鍙戠エ鍙凤細">
-            <el-input disabled
-                      v-model="form.invoiceNumber" />
-          </el-form-item>
-        </el-col>
-        <el-col :span="12">
-          <el-form-item label="鏉ョエ鏁帮細">
-            <el-input-number :step="0.1"
-                             :min="0"
-                             :max="maxTicketsNum"
-                             style="width: 100%"
-                             v-model="form.ticketsNum"
-                             @change="inputTicketsNum"
-                             :precision="2" />
-            <div style="font-size: 12px; color: #909399; margin-top: 4px;">
-              鍙~鍐欐暟閲忥細{{ maxTicketsNum }}
-            </div>
-          </el-form-item>
-        </el-col>
-        <el-col :span="12">
-          <el-form-item label="鏈鏉ョエ閲戦(鍏�)锛�">
-            <el-input-number :step="0.1"
-                             :min="0"
-                             style="width: 100%"
-                             v-model="form.ticketsAmount"
-                             @change="inputTicketsAmount"
-                             :precision="2" />
-          </el-form-item>
-        </el-col>
-        <el-col :span="12">
-          <el-form-item label="鏈潵绁ㄦ暟锛�">
-            <el-text type="success">{{ form.futureTickets }}</el-text>
-          </el-form-item>
-        </el-col>
-      </el-row>
-    </el-form>
-    <template #footer>
-      <el-button type="primary"
-                 :loading="loading"
-                 @click="sendForm">
-        {{ modalOptions.confirmText }}
-      </el-button>
-      <el-button @click="closeModal">{{ modalOptions.cancelText }}</el-button>
-    </template>
-  </el-dialog>
-</template>
-
-<script setup>
-import { useModal } from "@/hooks/useModal";
-import useFormData from "@/hooks/useFormData";
-import { updateRegistration, getProductRecordById } from "@/api/procurementManagement/procurementInvoiceLedger";
-import { ElMessage } from "element-plus";
-import { getCurrentInstance, ref, nextTick, computed } from "vue";
-
-defineOptions({
-  name: "鏉ョエ鍙拌处缂栬緫",
-});
-const emits = defineEmits(["success"]);
-
-const saleLedgerProjectId = ref("");
-const temFutureTickets = ref(0);
-const originalTicketsNum = ref(0); // 鍘熷宸叉潵绁ㄦ暟
-const { proxy } = getCurrentInstance();
-
-// 璁$畻鏈�澶у彲濉啓鏁伴噺 = 鍘熷宸叉潵绁ㄦ暟 + 鏈潵绁ㄦ暟
-const maxTicketsNum = computed(() => {
-  return Number(originalTicketsNum.value) + Number(temFutureTickets.value);
-});
-
-const {
-  id,
-  visible,
-  loading,
-  openModal,
-  modalOptions,
-  handleConfirm,
-  closeModal,
-} = useModal({ title: "鏉ョエ鍙拌处" });
-
-const { form, resetForm } = useFormData({
-  id: undefined,
-  purchaseContractNumber: undefined, // 閲囪喘鍚堝悓鍙�
-  salesContractNo: undefined, // 閿�鍞悎鍚屽彿
-  createdAt: undefined, // 鍒涘缓鏃堕棿
-  invoiceNumber: undefined, // 鍙戠エ鍙�
-  ticketsNum: undefined, // 鏉ョエ鏁�
-  ticketsAmount: undefined, // 鏉ョエ閲戦
-  taxInclusiveUnitPrice: undefined, // 鍚◣鍗曚环
-  futureTickets: undefined, // 鏈潵绁ㄦ暟
-});
-
-const load = async (id, purchaseLedgerId, productModelId) => {
-  const { code, data } = await getProductRecordById({
-    id: id,
-    purchaseLedgerId: purchaseLedgerId,
-    productModelId: productModelId,
-  });
-  if (code === 200) {
-    form.id = data.id;
-    form.purchaseContractNumber = data.purchaseContractNumber;
-    form.salesContractNo = data.salesContractNo;
-    form.createdAt = data.createdAt;
-    form.invoiceNumber = data.invoiceNumber;
-    form.ticketsNum = data.ticketsNum;
-    form.ticketsAmount = data.ticketsAmount.toFixed(2);
-    form.taxInclusiveUnitPrice = data.taxInclusiveUnitPrice;
-    form.futureTickets = data.futureTickets;
-    temFutureTickets.value = data.futureTickets;
-    // 淇濆瓨鍘熷宸叉潵绁ㄦ暟
-    originalTicketsNum.value = data.ticketsNum || 0;
-  }
-};
-
-const inputTicketsNum = val => {
-  // 纭繚鍚◣鍗曚环瀛樺湪涓斾笉涓洪浂
-  if (!form.taxInclusiveUnitPrice || Number(form.taxInclusiveUnitPrice) === 0) {
-    proxy.$modal.msgWarning("鍚◣鍗曚环涓嶈兘涓洪浂鎴栨湭瀹氫箟");
-    return;
-  }
-  
-  // 妫�鏌ユ潵绁ㄦ暟涓嶈兘澶т簬锛堝師濮嬪凡鏉ョエ鏁� + 鏈潵绁ㄦ暟锛�
-  const maxNum = maxTicketsNum.value;
-  if (Number(form.ticketsNum) > maxNum) {
-    proxy.$modal.msgWarning(`鏉ョエ鏁颁笉鑳藉ぇ浜�${maxNum}锛堝凡鏉ョエ鏁�${originalTicketsNum.value} + 鏈潵绁ㄦ暟${temFutureTickets.value}锛塦);
-    form.ticketsNum = maxNum;
-    return;
-  }
-  
-  // 璁$畻鏈鏂板鐨勬潵绁ㄦ暟锛堝綋鍓嶆潵绁ㄦ暟 - 鍘熷宸叉潵绁ㄦ暟锛�
-  const newTicketsNum = Number(form.ticketsNum) - Number(originalTicketsNum.value);
-  
-  // 濡傛灉鏂板鐨勬潵绁ㄦ暟澶т簬鏈潵绁ㄦ暟锛屽垯闄愬埗
-  if (newTicketsNum > Number(temFutureTickets.value)) {
-    proxy.$modal.msgWarning("鏈鏂板鏉ョエ鏁颁笉寰楀ぇ浜庢湭鏉ョエ鏁�");
-    form.ticketsNum = Number(originalTicketsNum.value) + Number(temFutureTickets.value);
-    return;
-  }
-
-  // 纭繚鎵�鏈夋暟鍊奸兘杞崲涓烘暟瀛楃被鍨嬭繘琛岃绠�
-  const ticketsAmount =
-    Number(form.ticketsNum) * Number(form.taxInclusiveUnitPrice);
-  const futureTickets =
-    Number(temFutureTickets.value) - newTicketsNum;
-  form.futureTickets = Number(futureTickets.toFixed(2));
-  form.ticketsAmount = Number(ticketsAmount.toFixed(2));
-};
-
-const inputTicketsAmount = val => {
-  // 纭繚鍚◣鍗曚环瀛樺湪涓斾笉涓洪浂
-  if (!form.taxInclusiveUnitPrice || Number(form.taxInclusiveUnitPrice) === 0) {
-    proxy.$modal.msgWarning("鍚◣鍗曚环涓嶈兘涓洪浂鎴栨湭瀹氫箟");
-    return;
-  }
-
-  // 璁$畻鏈�澶у彲濉啓閲戦 = 锛堝師濮嬪凡鏉ョエ鏁� + 鏈潵绁ㄦ暟锛�* 鍚◣鍗曚环
-  const maxAmount = maxTicketsNum.value * Number(form.taxInclusiveUnitPrice);
-  
-  if (Number(val) > maxAmount) {
-    proxy.$modal.msgWarning(`鏈鏉ョエ閲戦涓嶅緱澶т簬${maxAmount.toFixed(2)}鍏僠);
-    form.ticketsAmount = maxAmount.toFixed(2);
-    form.ticketsNum = maxTicketsNum.value;
-    return;
-  }
-
-  // 纭繚鎵�鏈夋暟鍊奸兘杞崲涓烘暟瀛楃被鍨嬭繘琛岃绠�
-  const ticketsNum = Number(val) / Number(form.taxInclusiveUnitPrice);
-  
-  // 妫�鏌ユ潵绁ㄦ暟涓嶈兘澶т簬鏈�澶у��
-  if (ticketsNum > maxTicketsNum.value) {
-    proxy.$modal.msgWarning(`鏉ョエ鏁颁笉鑳藉ぇ浜�${maxTicketsNum.value}`);
-    form.ticketsNum = maxTicketsNum.value;
-    form.ticketsAmount = maxAmount.toFixed(2);
-    return;
-  }
-  
-  form.ticketsNum = Number(ticketsNum.toFixed(2));
-  
-  // 璁$畻鏈潵绁ㄦ暟
-  const newTicketsNum = form.ticketsNum - originalTicketsNum.value;
-  const futureTickets = Number(temFutureTickets.value) - newTicketsNum;
-  form.futureTickets = Number(futureTickets.toFixed(2));
-};
-
-const open = async row => {
-  openModal(row.id);
-  saleLedgerProjectId.value = row.saleLedgerProjectId;
-  await nextTick();
-  load(row.id, row.purchaseLedgerId, row.productModelId);
-};
-
-const close = () => {
-  resetForm();
-  closeModal();
-};
-
-const sendForm = async () => {
-  form.saleLedgerProjectId = saleLedgerProjectId.value;
-  const { code } = await updateRegistration(form);
-  if (code === 200) {
-    emits("success");
-    ElMessage({ message: "鎿嶄綔鎴愬姛", type: "success" });
-    close();
-  }
-};
-
-defineExpose({
-  open,
-});
-</script>
-
-<style lang="scss" scoped></style>
diff --git a/src/views/procurementManagement/procurementInvoiceLedger/Modal/UploadModal.vue b/src/views/procurementManagement/procurementInvoiceLedger/Modal/UploadModal.vue
deleted file mode 100644
index b82bd10..0000000
--- a/src/views/procurementManagement/procurementInvoiceLedger/Modal/UploadModal.vue
+++ /dev/null
@@ -1,87 +0,0 @@
-<template>
-  <el-dialog v-model="upload.open" :title="upload.title" :width="500">
-    <FileUpload
-      ref="fileUploadRef"
-      accept=".xlsx, .xls, .pdf"
-      :headers="upload.headers"
-      :autoUpload="true"
-      :action="upload.url"
-      :disabled="upload.isUploading"
-      :showTip="false"
-      :limit="10"
-      @success="handleFileSuccess"
-      @remove="removeFile"
-    />
-    <template #footer>
-      <div class="dialog-footer">
-        <el-button type="primary" @click="submitFileForm">纭� 瀹�</el-button>
-        <el-button @click="upload.open = false">鍙� 娑�</el-button>
-      </div>
-    </template>
-  </el-dialog>
-</template>
-
-<script setup>
-import { reactive } from "vue";
-import { getToken } from "@/utils/auth.js";
-import { FileUpload } from "@/components/Upload";
-import { ElMessage } from "element-plus";
-import { ref } from "vue";
-import useFormData from "@/hooks/useFormData";
-
-defineOptions({
-  name: "鏉ョエ鍙拌处闄勪欢琛ュ厖",
-});
-
-const { form, resetForm } = useFormData({
-  id: undefined,
-  tempFileIds: [],
-});
-const emits = defineEmits(["uploadSuccess"]);
-const fileUploadRef = ref();
-const upload = reactive({
-  // 鏄惁鏄剧ず寮瑰嚭灞傦紙渚涘簲鍟嗗鍏ワ級
-  open: false,
-  // 寮瑰嚭灞傛爣棰橈紙渚涘簲鍟嗗鍏ワ級
-  title: "",
-  // 鏄惁绂佺敤涓婁紶
-  isUploading: false,
-  // 璁剧疆涓婁紶鐨勮姹傚ご閮�
-  headers: { Authorization: "Bearer " + getToken() },
-  // 涓婁紶鐨勫湴鍧�
-  url: import.meta.env.VITE_APP_BASE_API + "/file/upload",
-});
-// 鐐瑰嚮瀵煎叆
-const handleImport = (id) => {
-  form.id = id;
-  upload.open = true;
-  upload.title = "鏉ョエ鍙拌处闄勪欢琛ュ厖";
-};
-
-const submitFileForm = () => {
-  emits("uploadSuccess", form);
-  resetForm();
-  upload.open = false;
-  // 娓呯┖鏂囦欢鍒楄〃
-  fileUploadRef.value.fileList = [];
-};
-
-const handleFileSuccess = (response) => {
-  if (response.code == 200) {
-		form.tempFileIds.push(response.data.tempId);
-		console.log('form',form);
-    ElMessage({ message: "瀵煎叆鎴愬姛", type: "success" });
-  } else {
-    ElMessage({ message: response.msg, type: "error" });
-  }
-};
-
-const removeFile = (file) => {
-  const { tempId } = file.response.data;
-  form.tempFileIds = form.tempFileIds.filter((item) => item !== tempId);
-};
-
-defineExpose({
-  handleImport,
-});
-</script>
diff --git a/src/views/procurementManagement/procurementInvoiceLedger/index.vue b/src/views/procurementManagement/procurementInvoiceLedger/index.vue
deleted file mode 100644
index c94d8c2..0000000
--- a/src/views/procurementManagement/procurementInvoiceLedger/index.vue
+++ /dev/null
@@ -1,330 +0,0 @@
-<template>
-  <div class="app-container">
-    <el-form :model="filters" :inline="true">
-      <el-form-item label="閲囪喘鍚堝悓鍙�">
-        <el-input
-          v-model="filters.purchaseContractNumber"
-          style="width: 240px"
-          placeholder="璇疯緭鍏�"
-          clearable
-          :prefix-icon="Search"
-          @change="getTableData"
-        />
-      </el-form-item>
-      <el-form-item label="渚涘簲鍟�">
-        <el-input
-          v-model="filters.supplierName"
-          style="width: 240px"
-          placeholder="璇疯緭鍏�"
-          clearable
-          :prefix-icon="Search"
-          @change="getTableData"
-        />
-      </el-form-item>
-      <el-form-item label="鏉ョエ鏃ユ湡">
-        <el-date-picker
-          style="width: 240px"
-          v-model="filters.createdAt"
-          value-format="YYYY-MM-DD"
-          format="YYYY-MM-DD"
-          type="daterange"
-          start-placeholder="寮�濮嬫椂闂�"
-          end-placeholder="缁撴潫鏃堕棿"
-          clearable
-          @change="getTableData"
-        />
-      </el-form-item>
-      <el-form-item>
-        <el-button type="primary" @click="getTableData">鎼滅储</el-button>
-        <el-button @click="resetFilters"> 閲嶇疆 </el-button>
-        <el-button @click="handleOut">瀵煎嚭</el-button>
-      </el-form-item>
-    </el-form>
-    <div class="table_list">
-      <PIMTable
-        rowKey="id"
-        :column="columns"
-        :tableLoading="loading"
-        :tableData="dataList"
-        :isSelection="true"
-        height="calc(100vh - 19.5em)"
-        :isShowSummary="true"
-        :summaryMethod="summarizeMainTable"
-        :page="{
-          current: pagination.currentPage,
-          size: pagination.pageSize,
-          total: pagination.total,
-        }"
-        @selection-change="handleSelectionChange"
-        @pagination="changePage"
-      >
-        <template #operation="{ row }">
-          <el-button
-            type="primary"
-            link
-            @click="openEdit(row)"
-          >
-            缂栬緫
-          </el-button>
-          <el-button
-            type="primary"
-            link
-            @click="openFileDialog(row)"
-          >
-            闄勪欢
-          </el-button>
-          <el-button
-            type="primary"
-            link
-            @click="handleDelete(row)"
-          >
-            鍒犻櫎
-          </el-button>
-        </template>
-      </PIMTable>
-    </div>
-    <FileList v-if="fileDialogVisible"  v-model:visible="fileDialogVisible" record-type="ticket_registration" :record-id="recordId"  />
-    <EditModal ref="editmodalRef" @success="getTableData"></EditModal>
-  </div>
-</template>
-
-<script setup>
-import { ref, getCurrentInstance } from "vue";
-import { usePaginationApi } from "@/hooks/usePaginationApi";
-import {
-	Search,
-} from "@element-plus/icons-vue";
-import {
-	delRegistration,
-	productRecordPage,
-	delCommonFile,
-} from "@/api/procurementManagement/procurementInvoiceLedger.js";
-import request from "@/utils/request";
-import { getToken } from "@/utils/auth";
-import { onMounted } from "vue";
-import { ElMessageBox } from "element-plus";
-import EditModal from "./Modal/EditModal.vue";
-import useUserStore from "@/store/modules/user.js";
-const userStore = useUserStore();
-const FileList = defineAsyncComponent(() => import("@/components/Dialog/FileList.vue"));
-
-defineOptions({
-  name: "鏉ョエ鍙拌处",
-});
-
-const editmodalRef = ref();
-const fileListRef = ref(null);
-const fileListDialogVisible = ref(false);
-const currentRowId = ref(null); // 褰撳墠鏌ョ湅闄勪欢鐨勮ID
-
-const { proxy } = getCurrentInstance();
-const multipleVal = ref([]);
-const {
-  loading,
-  filters,
-  columns,
-  dataList,
-  pagination,
-  getTableData,
-  resetFilters,
-  onCurrentChange,
-} = usePaginationApi(
-  productRecordPage,
-  {
-    purchaseContractNumber: undefined, // 閲囪喘鍚堝悓鍙�
-    supplierName: undefined, // 渚涘簲鍟�
-    createdAt: [], // 鏉ョエ鏃ユ湡
-  },
-  [
-    {
-      label: "閲囪喘鍚堝悓鍙�",
-      prop: "purchaseContractNumber",
-      width: 150,
-    },
-    {
-      label: "閿�鍞悎鍚屽彿",
-      prop: "salesContractNo",
-      width: 150,
-    },
-    {
-      label: "椤圭洰鍚嶇О",
-      prop: "projectName",
-      width: 240,
-    },
-    {
-      label: "渚涘簲鍟嗗悕绉�",
-      prop: "supplierName",
-      width: 240,
-    },
-    {
-      label: "浜у搧澶х被",
-      prop: "productCategory",
-      width: 150,
-    },
-    {
-      label: "瑙勬牸鍨嬪彿",
-      prop: "specificationModel",
-      width: 150,
-    },
-    {
-      label: "鍙戠エ鍙�",
-      prop: "invoiceNumber",
-      width: 200,
-    },
-    {
-      label: "鍚堝悓閲戦(鍏�)",
-      prop: "taxInclusiveTotalPrice",
-      width: 200,
-      formatData: (cell) => {
-        return cell ? parseFloat(cell).toFixed(2) : 0;
-      },
-    },
-    {
-      label: "寮�绁ㄦ棩鏈�",
-      prop: "createdAt",
-      width: 110,
-    },
-    {
-      label: "寮�绁ㄩ噾棰�",
-      prop: "ticketsAmount",
-      width: 200,
-      formatData: (cell) => {
-        return cell ? parseFloat(cell).toFixed(2) : 0;
-      },
-    },
-    {
-      label: "涓嶅惈绋庨噾棰�",
-      prop: "unTicketsPrice",
-      width: 200,
-      formatData: (cell) => {
-        return cell ? parseFloat(cell).toFixed(2) : 0;
-      },
-    },
-    {
-      label: "澧炲�肩◣",
-      prop: "invoiceAmount",
-      width: 200,
-    },
-    {
-      label: "褰曞叆浜�",
-      prop: "issUer",
-      width: 200,
-    },
-    {
-      fixed: "right",
-      width: 200,
-      label: "鎿嶄綔",
-      dataType: "slot",
-      slot: "operation",
-      align: "center",
-    },
-  ],
-  {},
-  {
-    createdAt: (aim) => ({
-      createdAtStart: aim ? aim[0] : undefined,
-      createdAtEnd: aim ? aim[1] : undefined,
-    }),
-  }
-);
-
-const summarizeMainTable = (param) => {
-  const sums = proxy.summarizeTable(
-    param,
-    ["ticketsAmount", "unTicketsPrice", "invoiceAmount"],
-    {
-      ticketsNum: { noDecimal: true },
-      futureTickets: { noDecimal: true },
-    }
-  );
-
-  const keySet = new Set();
-  let taxInclusiveSum = 0;
-  (param.data || []).forEach((row) => {
-    const key = `${row.purchaseContractNumber ?? ""}\n${row.salesContractNo ?? ""}\n${row.productCategory ?? ""}\n${row.specificationModel ?? ""}`;
-    if (keySet.has(key)) return;
-    keySet.add(key);
-    const val = Number(row.taxInclusiveTotalPrice);
-    if (!isNaN(val)) taxInclusiveSum += val;
-  });
-  const taxInclusiveIndex = (param.columns || []).findIndex(
-    (c) => c.property === "taxInclusiveTotalPrice"
-  );
-  if (taxInclusiveIndex !== -1) {
-    sums[taxInclusiveIndex] = taxInclusiveSum.toFixed(2);
-  }
-  return sums;
-};
-
-const handleSelectionChange = (val) => {
-  multipleVal.value = val;
-};
-
-// 瀵煎嚭
-const handleOut = () => {
-  ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
-    confirmButtonText: "纭",
-    cancelButtonText: "鍙栨秷",
-    type: "warning",
-  })
-    .then(() => {
-      proxy.download("/purchase/registration/export", {}, "鏉ョエ鐧昏.xlsx");
-    })
-    .catch(() => {
-      proxy.$modal.msg("宸插彇娑�");
-    });
-};
-
-const changePage = ({ page, limit }) => {
-  pagination.currentPage = page;
-	pagination.pageSize = limit;
-  onCurrentChange(page);
-};
-
-// 鎵撳紑闄勪欢寮圭獥
-const recordId =ref(0)
-const fileDialogVisible = ref(false)
-
-// 鎵撳紑闄勪欢寮规
-const openFileDialog = async (row) => {
-  recordId.value = row.id
-  fileDialogVisible.value = true
-}
-
-const openEdit = (row) => {
-  editmodalRef.value.open(row);
-};
-// 鍒犻櫎
-const handleDelete = (row) => {
-	let ids = [];
-	ids.push(row.id);
-	ElMessageBox.confirm("璇ュ紑绁ㄥ彴璐﹀皢琚垹闄�,鏄惁纭鍒犻櫎", {
-		confirmButtonText: "纭",
-		cancelButtonText: "鍙栨秷",
-		type: "warning",
-	})
-		.then(() => {
-			loading.value = true;
-			delRegistration(ids).then((res) => {
-				getTableData();
-			});
-			loading.value = false;
-		})
-		.catch(() => {
-			proxy.$modal.msg("宸插彇娑�");
-		});
-};
-
-onMounted(() => {
-  getTableData();
-});
-</script>
-
-<style lang="scss" scoped>
-.table_list {
-  margin-top: unset;
-}
-.tagBox {
-  margin-top: 4px;
-}
-</style>
diff --git a/src/views/procurementManagement/procurementLedger/index.vue b/src/views/procurementManagement/procurementLedger/index.vue
index adf7b6e..dad6a26 100644
--- a/src/views/procurementManagement/procurementLedger/index.vue
+++ b/src/views/procurementManagement/procurementLedger/index.vue
@@ -42,6 +42,20 @@
                             clearable
                             @change="changeDaterange" />
           </el-form-item>
+          <el-form-item label="鍏ュ簱鐘舵�侊細">
+            <el-select v-model="searchForm.stockInStatus"
+                       placeholder="璇烽�夋嫨"
+                       clearable
+                       style="width: 240px"
+                       @change="handleQuery">
+              <el-option label="寰呭叆搴�"
+                         value="寰呭叆搴�" />
+              <el-option label="鍏ュ簱涓�"
+                         value="鍏ュ簱涓�" />
+              <el-option label="瀹屽叏鍏ュ簱"
+                         value="瀹屽叏鍏ュ簱" />
+            </el-select>
+          </el-form-item>
           <el-form-item>
             <el-button type="primary"
                        @click="handleQuery"> 鎼滅储
@@ -92,6 +106,16 @@
                                prop="specificationModel" />
               <el-table-column label="鍗曚綅"
                                prop="unit" />
+                               <el-table-column label="鍏ュ簱瀹℃牳鐘舵��"
+                               prop="stockInApprovalStatus"
+                               width="120">
+                <template #default="scope">
+                  <el-tag :type="getStockInApprovalStatusType(scope.row.stockInApprovalStatus)"
+                          size="small">
+                    {{ scope.row.stockInApprovalStatus || '--' }}
+                  </el-tag>
+                </template>
+              </el-table-column>
               <el-table-column label="鏁伴噺"
                                prop="quantity" />
               <el-table-column label="鍙敤鏁伴噺"
@@ -143,6 +167,17 @@
             </el-tag>
           </template>
         </el-table-column>
+        <el-table-column label="鍏ュ簱鐘舵��"
+                         prop="stockInStatus"
+                         width="100"
+                         show-overflow-tooltip>
+          <template #default="scope">
+            <el-tag :type="getStockInStatusType(scope.row.stockInStatus)"
+                    size="small">
+              {{ scope.row.stockInStatus || '--' }}
+            </el-tag>
+          </template>
+        </el-table-column>
         <el-table-column label="绛捐鏃ユ湡"
                          prop="executionDate"
                          width="100"
@@ -176,7 +211,7 @@
             <el-button link
                        type="primary"
                        @click="openForm('edit', scope.row)"
-                       :disabled="scope.row.approvalStatus !== 1 && scope.row.approvalStatus !== 4">缂栬緫
+                       :disabled="scope.row.stockInStatus === '瀹屽叏鍏ュ簱'">缂栬緫
             </el-button>
             <el-button link
                        type="primary"
@@ -403,6 +438,16 @@
               </el-tag>
             </template>
           </el-table-column>
+          <el-table-column label="鍏ュ簱瀹℃牳鐘舵��"
+                           prop="stockInApprovalStatus"
+                           width="120">
+            <template #default="scope">
+              <el-tag :type="getStockInApprovalStatusType(scope.row.stockInApprovalStatus)"
+                      size="small">
+                {{ scope.row.stockInApprovalStatus || '--' }}
+              </el-tag>
+            </template>
+          </el-table-column>
           <el-table-column fixed="right"
                            label="鎿嶄綔"
                            min-width="60"
@@ -410,7 +455,8 @@
             <template #default="scope">
               <el-button link
                          type="primary"
-                         @click="openProductForm('edit', scope.row, scope.$index)">缂栬緫
+                         @click="openProductForm('edit', scope.row, scope.$index)"
+                         :disabled="scope.row.stockInApprovalStatus === '瀹屽叏鍏ュ簱'">缂栬緫
               </el-button>
             </template>
           </el-table-column>
@@ -723,6 +769,26 @@
       2: "warning", // 瀹℃壒涓� - 姗欒壊
       3: "success", // 瀹℃壒閫氳繃 - 缁胯壊
       4: "danger", // 瀹℃壒澶辫触 - 绾㈣壊
+    };
+    return typeMap[status] || "";
+  };
+
+  // 鑾峰彇鍏ュ簱鐘舵�佹爣绛剧被鍨�
+  const getStockInStatusType = status => {
+    const typeMap = {
+      "寰呭叆搴�": "info", // 寰呭叆搴� - 鐏拌壊
+      "鍏ュ簱涓�": "warning", // 鍏ュ簱涓� - 姗欒壊
+      "瀹屽叏鍏ュ簱": "success", // 瀹屽叏鍏ュ簱 - 缁胯壊
+    };
+    return typeMap[status] || "";
+  };
+
+  // 鑾峰彇鍏ュ簱瀹℃牳鐘舵�佹爣绛剧被鍨�
+  const getStockInApprovalStatusType = status => {
+    const typeMap = {
+      "寰呭叆搴�": "info", // 寰呭叆搴� - 鐏拌壊
+      "鍏ュ簱涓�": "warning", // 鍏ュ簱涓� - 姗欒壊
+      "瀹屽叏鍏ュ簱": "success", // 瀹屽叏鍏ュ簱 - 缁胯壊
     };
     return typeMap[status] || "";
   };
@@ -1206,10 +1272,10 @@
   };
   // 鎵撳紑寮规
   const openForm = async (type, row) => {
-    // 缂栬緫鏃舵鏌ュ鏍哥姸鎬侊紝鍙湁寰呭鏍�(1)鍜屽鎵瑰け璐�(4)鎵嶈兘缂栬緫
+    // 缂栬緫鏃舵鏌ュ叆搴撶姸鎬侊紝瀹屽叏鍏ュ簱鏃朵笉鑳界紪杈�
     if (type === "edit" && row) {
-      if (row.approvalStatus !== 1 && row.approvalStatus !== 4) {
-        proxy.$modal.msgWarning("鍙湁寰呭鏍稿拰瀹℃壒澶辫触鐘舵�佺殑璁板綍鎵嶈兘缂栬緫");
+      if (row.stockInStatus === '瀹屽叏鍏ュ簱') {
+        proxy.$modal.msgWarning("瀹屽叏鍏ュ簱鐘舵�佺殑璁板綍涓嶈兘缂栬緫");
         return;
       }
     }
@@ -1256,9 +1322,11 @@
         currentId.value = row.id;
         try {
           const purchaseRes = await getPurchaseById({ id: row.id, type: 2 });
-          form.value = { ...purchaseRes };
-          productData.value = purchaseRes.productData || [];
+          form.value = { ...purchaseRes, stockInStatus: row.stockInStatus };
           fileList.value = purchaseRes.storageBlobVOS || [];
+          // 浣跨敤 productList 鎺ュ彛鑾峰彇浜у搧鍒楄〃锛屼互鑾峰彇鍏ュ簱瀹℃牳鐘舵��
+          const productRes = await productList({ salesLedgerId: row.id, type: 2 });
+          productData.value = productRes.data || [];
         } catch (error) {
           console.error("鍔犺浇閲囪喘鍙拌处鏁版嵁澶辫触:", error);
           proxy.$modal.msgError("鍔犺浇鏁版嵁澶辫触");
@@ -1375,6 +1443,12 @@
   };
   // 鎵撳紑浜у搧寮规
   const openProductForm = async (type, row, index) => {
+    // 缂栬緫鏃舵鏌ヤ骇鍝佸叆搴撳鏍哥姸鎬侊紝瀹屽叏鍏ュ簱鏃朵笉鑳界紪杈�
+    if (type === "edit" && row && row.stockInApprovalStatus === '瀹屽叏鍏ュ簱') {
+      proxy.$modal.msgWarning("瀹屽叏鍏ュ簱鐘舵�佺殑浜у搧涓嶈兘缂栬緫");
+      return;
+    }
+
     productOperationType.value = type;
     productOperationIndex.value = index;
     productForm.value = {};
@@ -1545,8 +1619,9 @@
     addOrUpdateSalesLedgerProduct(productForm.value).then(res => {
       proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
       closeProductDia();
-      getPurchaseById({ id: currentId.value, type: 2 }).then(res => {
-        productData.value = res.productData;
+      // 浣跨敤 productList 鎺ュ彛鍒锋柊浜у搧鍒楄〃锛屼互鑾峰彇鍏ュ簱瀹℃牳鐘舵��
+      productList({ salesLedgerId: currentId.value, type: 2 }).then(res => {
+        productData.value = res.data || [];
       });
     });
   };
@@ -1556,15 +1631,19 @@
       proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
       return;
     }
+    // 妫�鏌ラ�変腑鐨勪骇鍝佷腑鏄惁鏈夊畬鍏ㄥ叆搴撶殑
+    const hasFullyStocked = productSelectedRows.value.some(
+      row => row.stockInApprovalStatus === '瀹屽叏鍏ュ簱'
+    );
+    if (hasFullyStocked) {
+      proxy.$modal.msgWarning("閫変腑鐨勪骇鍝佷腑鍖呭惈瀹屽叏鍏ュ簱鐨勪骇鍝侊紝鏃犳硶鍒犻櫎");
+      return;
+    }
     if (operationType.value === "add") {
-      productSelectedRows.value.forEach(selectedRow => {
-        const index = productData.value.findIndex(
-          product => product.id === selectedRow.id
-        );
-        if (index !== -1) {
-          productData.value.splice(index, 1);
-        }
-      });
+      productData.value = productData.value.filter(
+        item => !productSelectedRows.value.includes(item)
+      );
+      productSelectedRows.value = [];
     } else {
       let ids = [];
       if (productSelectedRows.value.length > 0) {
@@ -1579,8 +1658,9 @@
           delProduct(ids).then(res => {
             proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
             closeProductDia();
-            getPurchaseById({ id: currentId.value, type: 2 }).then(res => {
-              productData.value = res.productData;
+            // 浣跨敤 productList 鎺ュ彛鍒锋柊浜у搧鍒楄〃锛屼互鑾峰彇鍏ュ簱瀹℃牳鐘舵��
+            productList({ salesLedgerId: currentId.value, type: 2 }).then(res => {
+              productData.value = res.data || [];
             });
           });
         })
diff --git a/src/views/procurementManagement/purchaseReturnOrder/New.vue b/src/views/procurementManagement/purchaseReturnOrder/New.vue
index 2c6801d..9474b11 100644
--- a/src/views/procurementManagement/purchaseReturnOrder/New.vue
+++ b/src/views/procurementManagement/purchaseReturnOrder/New.vue
@@ -3,8 +3,10 @@
     <el-dialog
         v-model="isShow"
         title="鏂板閲囪喘閫�璐�"
-        width="1600"
+        width="70%"
+        top="3vh"
         @close="closeModal"
+        class="purchase-return-dialog"
     >
       <el-form label-width="140px" :model="formState" label-position="top" ref="formRef" :inline="true">
         <div class="section-title">
@@ -221,19 +223,19 @@
           <el-input style="width: 240px" v-model="formState.remark" :rows="1" type="textarea" placeholder="璇疯緭鍏ュ娉�"/>
         </el-form-item>
 
-        <div style="margin: 20px 0;">
+        <div style="margin:20px 0;min-width:0;">
             <div class="section-title">
               <span class="title-dot"></span>
               <span class="title-text">浜у搧鍒楄〃</span>
             </div>
-            <el-button type="primary" size="small" style="margin-bottom: 20px" @click="isShowProductsModal = true" :disabled="!formState.purchaseLedgerId">娣诲姞浜у搧</el-button>
-            <div class="product-table-scroll">
-            <el-table class="product-table-inner"
+            <el-button type="primary" size="small" style="margin-bottom:20px" @click="isShowProductsModal = true" :disabled="!formState.purchaseLedgerId">娣诲姞浜у搧</el-button>
+            <el-table
                       :data="formState.purchaseReturnOrderProductsDtos"
                       border
                       max-height="400"
                       show-summary
-                      :summary-method="summarizeChildrenTable">
+                      :summary-method="summarizeChildrenTable"
+                      style="width:100%;min-width:0;">
               <el-table-column align="center"
                                type="selection"
                                width="55" />
@@ -324,7 +326,6 @@
                 </template>
               </el-table-column>
             </el-table>
-            </div>
           </div>
 
         <div class="section-title">
@@ -803,12 +804,5 @@
   margin-right: 8px;
 }
 
-.product-table-scroll {
-  width: 100%;
-  overflow-x: auto;
-}
 
-.product-table-inner {
-  min-width: 1280px;
-}
 </style>
\ No newline at end of file
diff --git a/src/views/procurementManagement/qualityInspection/index.vue b/src/views/procurementManagement/qualityInspection/index.vue
index ab19d6f..7628839 100644
--- a/src/views/procurementManagement/qualityInspection/index.vue
+++ b/src/views/procurementManagement/qualityInspection/index.vue
@@ -205,6 +205,26 @@
 }
 
 const handleSubmit = () => {
+  if (!formData.products || formData.products.length === 0) {
+    ElMessage.error('璇疯嚦灏戞坊鍔犱竴鏉¤川妫�鍟嗗搧')
+    return
+  }
+
+  for (let i = 0; i < formData.products.length; i++) {
+    const product = formData.products[i]
+    if (product.qualifiedQuantity === null || product.qualifiedQuantity === undefined) {
+      ElMessage.error(`绗�${i + 1}鏉″晢鍝佺殑鍚堟牸鏁伴噺涓嶈兘涓虹┖`)
+      return
+    }
+    if (product.unqualifiedQuantity === null || product.unqualifiedQuantity === undefined) {
+      ElMessage.error(`绗�${i + 1}鏉″晢鍝佺殑涓嶅悎鏍兼暟閲忎笉鑳戒负绌篳)
+      return
+    }
+  }
+
+  const totalQualified = formData.products.reduce((sum, p) => sum + (p.qualifiedQuantity || 0), 0)
+  const totalUnqualified = formData.products.reduce((sum, p) => sum + (p.unqualifiedQuantity || 0), 0)
+
   if (dialogType.value === 'add') {
     const newInspection = {
       id: Date.now(),
@@ -212,8 +232,8 @@
       arrivalNo: formData.arrivalNo,
       supplierName: formData.supplierName,
       status: 'pending',
-      qualifiedQuantity: 0,
-      unqualifiedQuantity: 0,
+      qualifiedQuantity: totalQualified,
+      unqualifiedQuantity: totalUnqualified,
       inspectionTime: new Date().toLocaleString(),
       inspector: formData.inspector,
       remark: formData.remark
diff --git a/src/views/procurementManagement/thePaymentLedger/index.vue b/src/views/procurementManagement/thePaymentLedger/index.vue
index 5fa9e6f..4031ea7 100644
--- a/src/views/procurementManagement/thePaymentLedger/index.vue
+++ b/src/views/procurementManagement/thePaymentLedger/index.vue
@@ -33,7 +33,8 @@
 <script setup>
 import { ref } from "vue";
 import { Search } from "@element-plus/icons-vue";
-import { registrationList } from "@/api/procurementManagement/paymentEntry.js";
+import dayjs from "dayjs";
+// import { registrationList } from "@/api/procurementManagement/paymentLedger.js";
 const tableColumn = ref([
   {
     label: "浠樻鏃ユ湡",
@@ -54,6 +55,8 @@
   {
     label: "鐧昏鏃ユ湡",
     prop: "registrationtDate",
+    formatData: cell =>
+      cell ? dayjs(cell).format("YYYY-MM-DD HH:mm:ss") : "-",
   },
 ]);
 const tableData = ref([]);
@@ -89,11 +92,11 @@
 };
 const getList = () => {
   tableLoading.value = true;
-  registrationList({ ...searchForm.value, ...page }).then((res) => {
-    tableLoading.value = false;
-    tableData.value = res.rows;
-    total.value = res.total;
-  });
+  // registrationList({ ...searchForm.value, ...page }).then((res) => {
+  //   tableLoading.value = false;
+  //   tableData.value = res.rows;
+  //   total.value = res.total;
+  // });
 };
 getList();
 </script>
diff --git a/src/views/productionManagement/processRoute/index.vue b/src/views/productionManagement/processRoute/index.vue
index 43425c6..1ef5b9d 100644
--- a/src/views/productionManagement/processRoute/index.vue
+++ b/src/views/productionManagement/processRoute/index.vue
@@ -61,7 +61,9 @@
   import EditProcess from "@/views/productionManagement/processRoute/Edit.vue";
   import RouteItemForm from "@/views/productionManagement/processRoute/ItemsForm.vue";
   import { listPage, del } from "@/api/productionManagement/processRoute.js";
-  const FileList = defineAsyncComponent(() => import("@/components/Dialog/FileList.vue"));
+  const FileList = defineAsyncComponent(() =>
+    import("@/components/Dialog/FileList.vue")
+  );
 
   import { useRouter } from "vue-router";
   import { ElMessage, ElMessageBox } from "element-plus";
diff --git a/src/views/productionManagement/processRoute/processRouteItem/index.vue b/src/views/productionManagement/processRoute/processRouteItem/index.vue
index 8abef17..3c52410 100644
--- a/src/views/productionManagement/processRoute/processRouteItem/index.vue
+++ b/src/views/productionManagement/processRoute/processRouteItem/index.vue
@@ -47,16 +47,45 @@
             <span class="info-value">{{ routeInfo.quantity || '-' }}</span>
           </div>
         </div>
-        <div class="info-item full-width"
-             v-if="routeInfo.description">
+        <div class="info-item">
           <div class="info-label-wrapper">
-            <span class="info-label">鎻忚堪</span>
+            <span class="info-label">澶囨敞</span>
           </div>
           <div class="info-value-wrapper">
             <span class="info-value">{{ routeInfo.description }}</span>
           </div>
         </div>
       </div>
+    </el-card>
+    <!-- 闄勪欢妯″潡 -->
+    <div v-if="pageType === 'order'"
+         class="section-header">
+      <div class="section-title">闄勪欢</div>
+    </div>
+    <el-card v-if="pageType === 'order'"
+             class="attachment-card"
+             shadow="hover"
+             style="margin-top: 10px; margin-bottom: 20px;">
+      <el-table :data="attachmentTableData"
+                border
+                class="attachment-table">
+        <el-table-column label="闄勪欢鍚嶇О"
+                         prop="originalFilename"
+                         show-overflow-tooltip />
+        <el-table-column fixed="right"
+                         label="鎿嶄綔"
+                         width="200"
+                         align="center">
+          <template #default="scope">
+            <el-button link
+                       type="primary"
+                       size="small"
+                       @click="downloadAttachmentFile(scope.row.downloadURL)">
+              涓嬭浇
+            </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
     </el-card>
     <!-- 琛ㄦ牸瑙嗗浘 -->
     <div v-if="viewMode === 'table'"
@@ -315,7 +344,7 @@
                                      :step="1"
                                      controls-position="right"
                                      style="width: 100%"
-                                     @change="handleUnitQuantityChange(row)"
+                                     @change="handleUnitQuantityChange"
                                      :disabled="!bomDataValue.isEdit || bomDataValue.dataList.some(item => (item).tempId === row.tempId)" />
                   </el-form-item>
                 </template>
@@ -333,7 +362,7 @@
                                      :step="1"
                                      controls-position="right"
                                      style="width: 100%"
-                                     :disabled="!bomDataValue.isEdit || bomDataValue.dataList.some(item => (item).tempId === row.tempId)" />
+                                     :disabled="true" />
                   </el-form-item>
                 </template>
               </el-table-column>
@@ -382,6 +411,18 @@
                          v-model="bomDataValue.showProductDialog"
                          :single="true"
                          @confirm="handleBomProduct" />
+    <!-- 涓婁紶缁勪欢寮圭獥 -->
+    <el-dialog v-model="uploadDialogVisible"
+               title="涓婁紶闄勪欢"
+               width="50%"
+               @close="closeAttachmentUpload">
+      <AttachmentUpload v-model:file-list="newFileList" />
+      <template #footer>
+        <el-button @click="saveAttachmentUpload"
+                   type="primary">淇濆瓨</el-button>
+        <el-button @click="closeAttachmentUpload">鍏抽棴</el-button>
+      </template>
+    </el-dialog>
     <!-- 鏂板/缂栬緫寮圭獥 -->
     <el-dialog v-model="dialogVisible"
                :title="operationType === 'add' ? '鏂板宸ヨ壓璺嚎椤圭洰' : '缂栬緫宸ヨ壓璺嚎椤圭洰'"
@@ -518,6 +559,12 @@
     queryList2,
     add2,
   } from "@/api/productionManagement/productStructure.js";
+  import AttachmentUpload from "@/components/AttachmentUpload/file/index.vue";
+  import {
+    attachmentList,
+    deleteAttachment,
+    createAttachment,
+  } from "@/api/basicData/storageAttachment.js";
 
   import { useRoute } from "vue-router";
   import { ElMessageBox, ElMessage } from "element-plus";
@@ -530,6 +577,7 @@
   const orderId = computed(() => route.query.orderId);
   const pageType = computed(() => route.query.type);
   const editable = computed(() => route.query.editable !== "false");
+  const technologyRoutingId = computed(() => route.query.technologyRoutingId);
 
   const tableLoading = ref(false);
   const tableData = ref([]);
@@ -548,7 +596,66 @@
     bomNo: "",
     description: "",
     quantity: 0,
+    technologyRoutingId: "",
   });
+
+  // 闄勪欢鐩稿叧
+  const attachmentTableData = ref([]);
+  const uploadDialogVisible = ref(false);
+  const newFileList = ref([]);
+
+  const getAttachmentList = () => {
+    if (!technologyRoutingId.value) return;
+    attachmentList({
+      recordType: "technology_routing",
+      recordId: technologyRoutingId.value,
+    }).then(res => {
+      attachmentTableData.value = (res && res.data) || [];
+    });
+  };
+
+  const handleUploadAttachment = () => {
+    uploadDialogVisible.value = true;
+  };
+
+  const saveAttachmentUpload = async () => {
+    if (newFileList.value.length > 0) {
+      createAttachment({
+        application: "file",
+        recordType: "technology_routing",
+        recordId: technologyRoutingId.value,
+        storageBlobDTOs: [...newFileList.value, ...attachmentTableData.value],
+      })
+        .then(res => {
+          if (res && res.code === 200) {
+            proxy?.$modal?.msgSuccess("涓婁紶鎴愬姛");
+            newFileList.value = [];
+            getAttachmentList();
+          }
+        })
+        .finally(() => {
+          uploadDialogVisible.value = false;
+        });
+    }
+  };
+
+  const closeAttachmentUpload = () => {
+    newFileList.value = [];
+    uploadDialogVisible.value = false;
+  };
+
+  const handleDeleteAttachment = async row => {
+    deleteAttachment([row.storageAttachmentId]).then(res => {
+      if (res && res.code === 200) {
+        proxy?.$modal?.msgSuccess("鍒犻櫎鎴愬姛");
+        getAttachmentList();
+      }
+    });
+  };
+
+  const downloadAttachmentFile = url => {
+    window.open(url, "_blank");
+  };
 
   const processOptions = ref([]);
   const showProductSelectDialog = ref(false);
@@ -680,6 +787,7 @@
       bomId: route.query.bomId || "",
       description: route.query.description || "",
       quantity: route.query.quantity || 0,
+      technologyRoutingId: route.query.technologyRoutingId || "",
       status: !(route.query.status == 1 || route.query.status === "false"),
     };
     bomTableData.value[0].productName = routeInfo.value.productName;
@@ -1089,6 +1197,53 @@
       }
     });
   };
+
+  const toQuantityNumber = value => {
+    const numberValue = Number(value);
+    if (!Number.isFinite(numberValue)) {
+      return 0;
+    }
+    return Number(numberValue.toFixed(2));
+  };
+
+  const syncDemandedQuantityTree = (items, parentDemandedQuantity = null) => {
+    items.forEach(item => {
+      if (parentDemandedQuantity !== null) {
+        item.demandedQuantity = toQuantityNumber(
+          parentDemandedQuantity * toQuantityNumber(item.unitQuantity)
+        );
+      }
+
+      if (Array.isArray(item.children) && item.children.length > 0) {
+        syncDemandedQuantityTree(
+          item.children,
+          toQuantityNumber(item.demandedQuantity)
+        );
+      }
+    });
+  };
+
+  const recalculateDemandedQuantities = () => {
+    if (pageType.value !== "order") {
+      return;
+    }
+
+    const rootDemandedQuantity = routeInfo.value.quantity;
+    if (
+      rootDemandedQuantity === undefined ||
+      rootDemandedQuantity === null ||
+      rootDemandedQuantity === ""
+    ) {
+      syncDemandedQuantityTree(bomDataValue.value.dataList);
+      return;
+    }
+
+    syncDemandedQuantityTree(
+      bomDataValue.value.dataList,
+      toQuantityNumber(rootDemandedQuantity)
+    );
+  };
+
   const processChange = value => {
     processOptions.value.forEach(item => {
       if (item.id == value) {
@@ -1099,9 +1254,40 @@
     });
   };
 
+  const findSiblings = (items, tempId) => {
+    if (!items || items.length === 0) return null;
+    // 妫�鏌ュ綋鍓嶅眰绾�
+    if (items.some(item => item.tempId === tempId)) {
+      return items;
+    }
+    // 閫掑綊鏌ユ壘瀛愮骇
+    for (const item of items) {
+      if (item.children && item.children.length > 0) {
+        const result = findSiblings(item.children, tempId);
+        if (result) return result;
+      }
+    }
+    return null;
+  };
+
   const handleBomProcessChange = (row, value) => {
     row.processId = value || "";
     syncProcessOperationFields(row);
+
+    // 妫�鏌ュ悓涓�灞傜骇鏄惁宸茬粡鏈夊叾浠栦笉鍚岀殑宸ュ簭琚�変腑
+    const siblings = findSiblings(bomDataValue.value.dataList, row.tempId);
+    if (siblings && value) {
+      const hasDifferentProcess = siblings.some(sibling => {
+        return (
+          sibling.tempId !== row.tempId &&
+          sibling.processId &&
+          sibling.processId !== value
+        );
+      });
+      if (hasDifferentProcess) {
+        ElMessage.warning("鍚屼竴灞傜骇宸插瓨鍦ㄤ笉鍚岀殑宸ュ簭锛岃鍏堢粺涓�宸ュ簭鍚庡啀杩涜淇敼");
+      }
+    }
   };
 
   const openBomDialog = tempId => {
@@ -1117,6 +1303,7 @@
       );
       bomDataValue.value.dataList = data || [];
       normalizeTreeData(bomDataValue.value.dataList);
+      recalculateDemandedQuantities();
     } catch (err) {
       console.error("鑾峰彇BOM鏁版嵁澶辫触锛�", err);
     }
@@ -1212,10 +1399,8 @@
     });
   };
 
-  const handleUnitQuantityChange = row => {
-    if (routeInfo.value.quantity && routeInfo.value.quantity !== 0) {
-      row.demandedQuantity = (row.unitQuantity || 0) * routeInfo.value.quantity;
-    }
+  const handleUnitQuantityChange = () => {
+    recalculateDemandedQuantities();
   };
 
   const addchildItem = (item, tempId) => {
@@ -1236,14 +1421,12 @@
           "",
         operationName: "",
         unitQuantity: 1,
-        demandedQuantity:
-          routeInfo.value.quantity && routeInfo.value.quantity !== 0
-            ? 1 * routeInfo.value.quantity
-            : 0,
+        demandedQuantity: 0,
         children: [],
         unit: "",
         tempId: new Date().getTime(),
       });
+      recalculateDemandedQuantities();
       return true;
     }
     if (item.children && item.children.length > 0) {
@@ -1275,14 +1458,12 @@
             "",
           operationName: "",
           unitQuantity: 1,
-          demandedQuantity:
-            routeInfo.value.quantity && routeInfo.value.quantity !== 0
-              ? 1 * routeInfo.value.quantity
-              : 0,
+          demandedQuantity: 0,
           unit: "",
           children: [],
           tempId: new Date().getTime(),
         });
+        recalculateDemandedQuantities();
         return;
       }
       addchildItem(item, tempId);
@@ -1322,9 +1503,36 @@
       }
     };
 
+    // 鏍¢獙鍚屼竴灞傜骇鐨勫伐搴忔槸鍚︿竴鑷�
+    const validateProcessConsistency = items => {
+      if (!items || items.length === 0) return;
+
+      // 妫�鏌ュ綋鍓嶅眰绾�
+      const processes = items
+        .filter(item => item.processId)
+        .map(item => item.processId);
+      if (processes.length > 1) {
+        const uniqueProcesses = [...new Set(processes)];
+        if (uniqueProcesses.length > 1) {
+          ElMessage.error("鍚屼竴灞傜骇鐨勫伐搴忓繀椤讳竴鑷�");
+          isValid = false;
+          return;
+        }
+      }
+
+      // 閫掑綊妫�鏌ュ瓙绾�
+      items.forEach(item => {
+        if (item.children && item.children.length > 0) {
+          validateProcessConsistency(item.children);
+        }
+      });
+    };
+
     bomDataValue.value.dataList.forEach(item => {
       validateItem(item, true);
     });
+
+    validateProcessConsistency(bomDataValue.value.dataList);
 
     return isValid;
   };
@@ -1350,6 +1558,7 @@
     console.log(bomDataValue.value.dataList, "bomDataValue.value.dataList");
 
     normalizeTreeData(bomDataValue.value.dataList);
+    recalculateDemandedQuantities();
 
     const valid = validateAllBom();
     if (valid) {
@@ -1379,6 +1588,9 @@
     getList();
     getProcessList();
     fetchBomData();
+    if (pageType.value === "order") {
+      getAttachmentList();
+    }
   };
 
   onMounted(() => {
@@ -1649,4 +1861,4 @@
     line-height: 1.5;
     word-break: break-all;
   }
-</style>
+</style>
\ No newline at end of file
diff --git a/src/views/productionManagement/productStructure/Detail/index.vue b/src/views/productionManagement/productStructure/Detail/index.vue
index 750d584..5cb08e8 100644
--- a/src/views/productionManagement/productStructure/Detail/index.vue
+++ b/src/views/productionManagement/productStructure/Detail/index.vue
@@ -86,6 +86,7 @@
                                      :step="1"
                                      controls-position="right"
                                      style="width: 100%"
+                                     @change="handleUnitQuantityChange"
                                      :disabled="!dataValue.isEdit || dataValue.dataList.some(item => (item as any).tempId === row.tempId)" />
                   </el-form-item>
                 </template>
@@ -103,7 +104,7 @@
                                      :step="1"
                                      controls-position="right"
                                      style="width: 100%"
-                                     :disabled="!dataValue.isEdit || dataValue.dataList.some(item => (item as any).tempId === row.tempId)" />
+                                     :disabled="true" />
                   </el-form-item>
                 </template>
               </el-table-column>
@@ -268,6 +269,42 @@
     });
   };
 
+  const toQuantityNumber = (value: any) => {
+    const numberValue = Number(value);
+    if (!Number.isFinite(numberValue)) {
+      return 0;
+    }
+    return Number(numberValue.toFixed(2));
+  };
+
+  const syncDemandedQuantityTree = (
+    items: any[],
+    parentDemandedQuantity: number | null = null
+  ) => {
+    items.forEach((item: any) => {
+      if (parentDemandedQuantity !== null) {
+        item.demandedQuantity = toQuantityNumber(
+          parentDemandedQuantity * toQuantityNumber(item.unitQuantity)
+        );
+      }
+
+      if (Array.isArray(item.children) && item.children.length > 0) {
+        syncDemandedQuantityTree(
+          item.children,
+          toQuantityNumber(item.demandedQuantity)
+        );
+      }
+    });
+  };
+
+  const recalculateDemandedQuantities = () => {
+    if (!isOrderPage.value) {
+      return;
+    }
+
+    syncDemandedQuantityTree(dataValue.dataList);
+  };
+
   const buildSubmitTree = (items: any[]) => {
     return items.map((item: any) => {
       const current = { ...item };
@@ -279,9 +316,40 @@
     });
   };
 
+  const findSiblings = (items: any[], tempId: string): any[] | null => {
+    if (!items || items.length === 0) return null;
+    // 妫�鏌ュ綋鍓嶅眰绾�
+    if (items.some(item => item.tempId === tempId)) {
+      return items;
+    }
+    // 閫掑綊鏌ユ壘瀛愮骇
+    for (const item of items) {
+      if (item.children && item.children.length > 0) {
+        const result = findSiblings(item.children, tempId);
+        if (result) return result;
+      }
+    }
+    return null;
+  };
+
   const handleProcessChange = (row: any, value: any) => {
     row.processId = value || "";
     syncProcessOperationFields(row);
+    
+    // 妫�鏌ュ悓涓�灞傜骇鏄惁宸茬粡鏈夊叾浠栦笉鍚岀殑宸ュ簭琚�変腑
+    const siblings = findSiblings(dataValue.dataList, row.tempId);
+    if (siblings && value) {
+      const hasDifferentProcess = siblings.some(sibling => {
+        return sibling.tempId !== row.tempId && sibling.processId && sibling.processId !== value;
+      });
+      if (hasDifferentProcess) {
+        ElMessage.warning("鍚屼竴灞傜骇宸插瓨鍦ㄤ笉鍚岀殑宸ュ簭锛岃鍏堢粺涓�宸ュ簭鍚庡啀杩涜淇敼");
+      }
+    }
+  };
+
+  const handleUnitQuantityChange = () => {
+    recalculateDemandedQuantities();
   };
 
   const tableData = reactive([
@@ -304,6 +372,7 @@
       const { data } = await listProcessBom({ orderId: routeOrderId.value });
       dataValue.dataList = (data as any) || [];
       normalizeTreeData(dataValue.dataList);
+      recalculateDemandedQuantities();
     } else {
       // 闈炶鍗曟儏鍐碉細浣跨敤鍘熸潵鐨勬帴鍙�
       const { data } = await queryList(routeId.value);
@@ -389,8 +458,41 @@
   const validateAll = () => {
     let isValid = true;
 
+    // 鏍¢獙涓�缁勫厔寮熻妭鐐圭殑宸ュ簭鏄惁閮界浉鍚�
+    const checkProcessUniqueness = (items: any[]) => {
+      if (!items || items.length === 0 || !isValid) return;
+
+      // 鑾峰彇绗竴涓潪绌虹殑宸ュ簭ID浣滀负鍙傝��
+      const firstProcessId = items.find(item => item.processId)?.processId;
+      
+      // 濡傛灉鏈夊伐搴廔D锛屾鏌ユ墍鏈夐」鏄惁閮戒娇鐢ㄧ浉鍚岀殑宸ュ簭
+      if (firstProcessId) {
+        for (const item of items) {
+          if (item.processId && item.processId !== firstProcessId) {
+            const option1 = getProcessOptionById(firstProcessId);
+            const option2 = getProcessOptionById(item.processId);
+            const processName1 = option1?.name || "鏈煡宸ュ簭";
+            const processName2 = option2?.name || "鏈煡宸ュ簭";
+            ElMessage.error(
+              `褰撳墠灞傜骇涓嬪伐搴忎笉涓�鑷达紝璇蜂娇鐢ㄧ浉鍚岀殑宸ュ簭銆傚瓨鍦ㄣ��${processName1}銆嶅拰銆�${processName2}銆峘
+            );
+            isValid = false;
+            return;
+          }
+        }
+      }
+
+      // 閫掑綊鏍¢獙瀛愮骇鐨勫厔寮熻妭鐐�
+      for (const item of items) {
+        if (item.children && item.children.length > 0) {
+          checkProcessUniqueness(item.children);
+        }
+      }
+    };
+
     // 鏍¢獙鍑芥暟
     const validateItem = (item: any, isTopLevel = false) => {
+      if (!isValid) return;
       // 鏍¢獙褰撳墠椤圭殑蹇呭~瀛楁
       if (!item.model) {
         ElMessage.error("璇烽�夋嫨瑙勬牸");
@@ -418,7 +520,7 @@
       //   return;
       // }
 
-      // 閫掑綊鏍¢獙瀛愰」
+      // 閫掑綊鏍¢獙瀛愰」瀛楁
       if (item.children && item.children.length > 0) {
         item.children.forEach(child => {
           validateItem(child, false);
@@ -426,7 +528,11 @@
       }
     };
 
-    // 閬嶅巻鎵�鏈夐《灞傞」
+    // 1. 棣栧厛鏍¢獙鍚屼竴鐖剁骇涓嬬殑鍚屽眰娑堣�楀伐搴忔槸鍚﹀敮涓�
+    checkProcessUniqueness(dataValue.dataList);
+    if (!isValid) return false;
+
+    // 2. 鐒跺悗閬嶅巻鏍¢獙鎵�鏈夐《灞傞」鐨勫瓧娈靛繀濉儏鍐�
     dataValue.dataList.forEach(item => {
       validateItem(item, true);
     });
@@ -437,6 +543,7 @@
   const submit = () => {
     dataValue.loading = true;
     normalizeTreeData(dataValue.dataList);
+    recalculateDemandedQuantities();
 
     // 鍏堣繘琛岃〃鍗曟牎楠�
     const valid = validateAll();
@@ -514,6 +621,7 @@
 
           tempId: new Date().getTime(),
         });
+        recalculateDemandedQuantities();
         return;
       }
       addchildItem(item, tempId);
@@ -542,6 +650,7 @@
         unit: "",
         tempId: new Date().getTime(),
       });
+      recalculateDemandedQuantities();
       return true;
     }
     if (item.children && item.children.length > 0) {
diff --git a/src/views/productionManagement/productionOrder/components/MaterialLedgerDialog.vue b/src/views/productionManagement/productionOrder/components/MaterialLedgerDialog.vue
index d058896..09e7421 100644
--- a/src/views/productionManagement/productionOrder/components/MaterialLedgerDialog.vue
+++ b/src/views/productionManagement/productionOrder/components/MaterialLedgerDialog.vue
@@ -111,6 +111,7 @@
         <span class="dialog-footer">
           <el-button type="primary"
                      :loading="materialSaving"
+                     :disabled="isSaveDisabled"
                      @click="handleMaterialSave">淇濆瓨</el-button>
           <el-button @click="dialogVisible = false">鍙栨秷</el-button>
         </span>
@@ -155,6 +156,33 @@
   const materialTableLoading = ref(false);
   const materialSaving = ref(false);
   const materialTableData = ref([]);
+
+  const isSaveDisabled = computed(() => {
+    if (materialTableData.value.length === 0) return true;
+    return !materialTableData.value.some(row => {
+      // 妫�鏌ユ槸鍚︽湁浠讳綍鐢ㄦ埛杈撳叆鍐呭
+      const hasBatch = Array.isArray(row.batchNo) && row.batchNo.length > 0;
+      const hasPickQty =
+        row.pickQty !== null && row.pickQty !== undefined && row.pickQty !== 0;
+
+      if (row.bom) {
+        // 瀵逛簬鏉ヨ嚜BOM鐨勮锛岃緭鍏ユ鍙湁鈥滄壒鍙封�濆拰鈥滈鐢ㄦ暟閲忊��
+        return hasBatch || hasPickQty;
+      } else {
+        // 瀵逛簬鏂板琛岋紝杈撳叆妗嗗寘鎷�滃伐搴忊�濄�佲�滃師鏂欌�濄�佲�滈渶姹傛暟閲忊�濄�佲�滄壒鍙封�濆拰鈥滈鐢ㄦ暟閲忊��
+        const hasOperation = !!row.operationName;
+        const hasMaterial = !!row.materialName;
+        const hasDemanded =
+          row.demandedQuantity !== null &&
+          row.demandedQuantity !== undefined &&
+          row.demandedQuantity !== 0;
+        return (
+          hasBatch || hasPickQty || hasOperation || hasMaterial || hasDemanded
+        );
+      }
+    });
+  });
+
   const processOptions = ref([]);
   const currentMaterialSelectRowIndex = ref(-1);
   let materialTempId = 0;
diff --git a/src/views/productionManagement/productionOrder/index.vue b/src/views/productionManagement/productionOrder/index.vue
index 90ca51d..9c7682b 100644
--- a/src/views/productionManagement/productionOrder/index.vue
+++ b/src/views/productionManagement/productionOrder/index.vue
@@ -723,6 +723,7 @@
           bomNo: row.bomNo || "",
           description: data.description || "",
           quantity: row.quantity || 0,
+          technologyRoutingId: data.technologyRoutingId,
           orderId,
           type: "order",
           editable: !row.endOrder,
diff --git a/src/views/productionManagement/productionProcess/index.vue b/src/views/productionManagement/productionProcess/index.vue
index 747b8de..ee49657 100644
--- a/src/views/productionManagement/productionProcess/index.vue
+++ b/src/views/productionManagement/productionProcess/index.vue
@@ -44,7 +44,7 @@
             <div class="card-body">
               <!-- <div class="process-name">{{ process.name }}</div> -->
               <div class="process-desc">{{ process.remark || '鏆傛棤鎻忚堪' }}</div>
-              <div class="process-device">鍏宠仈璁惧: {{ deviceOptions.find(item => item.id === Number(process.deviceLedgerId))?.deviceName|| '鏈叧鑱�' }}</div>
+              <div class="process-device">鍏宠仈璁惧: {{ (deviceOptions.find(item => item.id === Number(process.deviceLedgerId))?.deviceName) || '鏈叧鑱�' }}</div>
             </div>
             <div class="card-footer">
               <div class="status-tag">
@@ -570,7 +570,10 @@
     processForm.isQuality = !!process.isQuality;
     processForm.isProduction = !!process.isProduction;
     processForm.remark = process.remark || "";
-    processForm.deviceLedgerId = Number(process.deviceLedgerId);
+    // 濡傛灉璁惧 ID 涓� 0 鎴栬�呭湪璁惧鍒楄〃涓壘涓嶅埌锛屽垯鍥炴樉涓虹┖锛坣ull锛�
+    const deviceId = Number(process.deviceLedgerId);
+    const hasDevice = deviceOptions.value.some(item => item.id === deviceId);
+    processForm.deviceLedgerId = deviceId && hasDevice ? deviceId : null;
     processForm.type = process.type;
     processDialogVisible.value = true;
   };
diff --git a/src/views/productionManagement/productionTraceability/index.vue b/src/views/productionManagement/productionTraceability/index.vue
index ab1c34a..b9d37a1 100644
--- a/src/views/productionManagement/productionTraceability/index.vue
+++ b/src/views/productionManagement/productionTraceability/index.vue
@@ -1,5 +1,7 @@
 <template>
   <div class="app-container">
+    <PageHeader v-if="showHeader"
+                content="鐢熶骇璁㈠崟" />
     <el-card style="height:82vh;overflow:auto;">
       <template #header>
         <div class="card-header">
@@ -282,7 +284,7 @@
 </template>
 
 <script setup>
-  import { ref, reactive, onMounted } from "vue";
+  import { ref, reactive, onMounted, computed } from "vue";
   import { useRoute, useRouter } from "vue-router";
   import { ElMessage } from "element-plus";
   import { parseTime } from "@/utils/ruoyi";
@@ -295,6 +297,13 @@
   const route = useRoute();
   const router = useRouter();
 
+  // 鍒ゆ柇鏄惁鏄剧ず椤靛ご
+  const showHeader = computed(() => {
+    return (
+      Object.keys(route.query).length > 0 || Object.keys(route.params).length > 0
+    );
+  });
+
   // 鎼滅储鐩稿叧
   const searchForm = reactive({
     npsNo: "",
diff --git a/src/views/productionManagement/workOrderEdit/index.vue b/src/views/productionManagement/workOrderEdit/index.vue
index 64fd087..37cbb4e 100644
--- a/src/views/productionManagement/workOrderEdit/index.vue
+++ b/src/views/productionManagement/workOrderEdit/index.vue
@@ -73,6 +73,18 @@
                title="鎸囧畾鎶ュ伐浜�"
                width="800px">
       <div class="assign-reporter-content">
+        <div class="search-box">
+          <el-input
+            v-model="employeeSearchKeyword"
+            placeholder="鎼滅储浜哄憳濮撳悕"
+            clearable
+            @input="handleEmployeeSearch"
+            style="width: 350px">
+            <template #prefix>
+              <i class="el-icon-search"></i>
+            </template>
+          </el-input>
+        </div>
         <div class="selected-tags-box"
              v-if="selectedEmployeeIds.length > 0">
           <div class="tags-label">宸查�夋嫨锛�</div>
@@ -90,7 +102,7 @@
              v-loading="employeeTableLoading">
           <el-checkbox-group v-model="selectedEmployeeIds">
             <div class="employee-grid">
-              <div v-for="item in employeeTableData"
+              <div v-for="item in filteredEmployeeList"
                    :key="item.userId"
                    class="employee-item">
                 <el-checkbox :label="item.userId"
@@ -103,9 +115,9 @@
               </div>
             </div>
           </el-checkbox-group>
-          <div v-if="employeeTableData.length === 0"
+          <div v-if="filteredEmployeeList.length === 0"
                class="empty-text">
-            鏆傛棤鍖归厤浜哄憳
+            {{ employeeSearchKeyword ? '鏃犲尮閰嶄汉鍛�' : '鏆傛棤浜哄憳鏁版嵁' }}
           </div>
         </div>
       </div>
@@ -121,7 +133,7 @@
 </template>
 
 <script setup>
-  import { getCurrentInstance, onMounted, reactive, ref, toRefs } from "vue";
+  import { getCurrentInstance, onMounted, reactive, ref, toRefs, computed } from "vue";
   import { ElMessageBox } from "element-plus";
   import {
     productWorkOrderPage,
@@ -253,8 +265,24 @@
   const employeeSearchForm = reactive({
     staffName: "",
   });
+  const employeeSearchKeyword = ref("");
   const selectedEmployeeIds = ref([]);
   const currentWorkOrder = ref(null);
+
+  const filteredEmployeeList = computed(() => {
+    const keyword = employeeSearchKeyword.value.trim().toLowerCase();
+    if (!keyword) {
+      return employeeTableData.value;
+    }
+    return employeeTableData.value.filter(item => {
+      const name = (item.nickName || "").toLowerCase();
+      const dept = (item.dept?.deptName || "").toLowerCase();
+      return name.includes(keyword) || dept.includes(keyword);
+    });
+  });
+
+  const handleEmployeeSearch = () => {
+  };
 
   const data = reactive({
     searchForm: {
@@ -416,6 +444,12 @@
   }
 
   .assign-reporter-content {
+    .search-box {
+      margin-bottom: 16px;
+      display: flex;
+      justify-content: center;
+    }
+
     .selected-tags-box {
       margin-bottom: 16px;
       padding: 12px;
diff --git a/src/views/productionManagement/workOrderManagement/index.vue b/src/views/productionManagement/workOrderManagement/index.vue
index 119bd9e..60fe511 100644
--- a/src/views/productionManagement/workOrderManagement/index.vue
+++ b/src/views/productionManagement/workOrderManagement/index.vue
@@ -673,7 +673,10 @@
       }
     }
     currentReportRowData.value = row;
-    reportForm.planQuantity = row.planQuantity;
+    const planQuantity = Number(row.planQuantity || 0);
+    const completeQuantity = Number(row.completeQuantity || 0);
+    const remainingQuantity = Math.max(0, planQuantity - completeQuantity);
+    reportForm.planQuantity = remainingQuantity;
     reportForm.quantity =
       row.quantity !== undefined && row.quantity !== null ? row.quantity : null;
     reportForm.productProcessRouteItemId = row.productProcessRouteItemId;
diff --git a/src/views/productionPlan/productionPlan/components/PIMTable.vue b/src/views/productionPlan/productionPlan/components/PIMTable.vue
index 9431002..5f5eea5 100644
--- a/src/views/productionPlan/productionPlan/components/PIMTable.vue
+++ b/src/views/productionPlan/productionPlan/components/PIMTable.vue
@@ -11,6 +11,7 @@
             :row-key="rowKey"
             :style="tableStyle"
             tooltip-effect="dark"
+            :tooltip-options="{ appendTo: 'body' }"
             :expand-row-keys="expandRowKeys"
             :show-summary="isShowSummary"
             :summary-method="summaryMethod"
diff --git a/src/views/productionPlan/productionPlan/index.vue b/src/views/productionPlan/productionPlan/index.vue
index 01a513b..4251daa 100644
--- a/src/views/productionPlan/productionPlan/index.vue
+++ b/src/views/productionPlan/productionPlan/index.vue
@@ -303,6 +303,13 @@
         return params == "閿�鍞�" ? "閿�鍞�" : "鍐呴儴";
       },
     },
+    {
+      label: "閿�鍞悎鍚屽彿",
+      prop: "salesContractNo",
+      width: "200px",
+      dataType: "slot",
+      slot: "salesContractNo",
+    },
 
     {
       label: "浜у搧鍚嶇О",
@@ -328,7 +335,6 @@
       label: "鎵�闇�鏁伴噺",
       prop: "qtyRequired",
       width: "150px",
-      align: "right",
       dataType: "slot",
       slot: "qtyRequired",
       className: "volume-cell",
@@ -377,13 +383,7 @@
       className: "date-cell",
       formatData: cell => (cell ? dayjs(cell).format("YYYY-MM-DD") : ""),
     },
-    {
-      label: "閿�鍞悎鍚屽彿",
-      prop: "salesContractNo",
-      width: "200px",
-      dataType: "slot",
-      slot: "salesContractNo",
-    },
+
     {
       label: "瀹㈡埛鍚嶇О",
       prop: "customerName",
diff --git a/src/views/qualityManagement/finalInspection/components/formDia.vue b/src/views/qualityManagement/finalInspection/components/formDia.vue
index 5f4c975..10bfad9 100644
--- a/src/views/qualityManagement/finalInspection/components/formDia.vue
+++ b/src/views/qualityManagement/finalInspection/components/formDia.vue
@@ -2,7 +2,7 @@
   <div>
     <el-dialog
         v-model="dialogFormVisible"
-        :title="operationType === 'add' ? '鏂板鍑哄巶妫�楠�' : '缂栬緫鍑哄巶妫�楠�'"
+        :title="operationType === 'add' ? '鏂板鍑哄巶妫�楠�' : operationType === 'view' ? '鏌ョ湅鍑哄巶妫�楠�' : '缂栬緫鍑哄巶妫�楠�'"
         width="70%"
         @close="closeDia"
     >
@@ -18,19 +18,21 @@
                   @change="getModels"
                   :data="productOptions"
                   :render-after-expand="false"
-                  :disabled="operationType === 'edit'"
+                  :disabled="isViewMode || operationType === 'edit'"
                   style="width: 100%"
               />
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="瑙勬牸鍨嬪彿锛�" prop="productModelId">
-              <el-select v-model="form.productModelId" placeholder="璇烽�夋嫨" clearable :disabled="operationType === 'edit'"
+              <el-select v-model="form.productModelId" placeholder="璇烽�夋嫨" clearable :disabled="isViewMode || operationType === 'edit'"
                          filterable readonly @change="handleChangeModel">
                 <el-option v-for="item in modelOptions" :key="item.id" :label="item.model" :value="item.id" />
               </el-select>
             </el-form-item>
           </el-col>
+        </el-row>
+        <el-row :gutter="30">
           <el-col :span="12">
             <el-form-item label="鎸囨爣閫夋嫨锛�" prop="testStandardId">
               <el-select
@@ -39,6 +41,7 @@
                 clearable
                 @change="handleTestStandardChange"
                 style="width: 100%"
+                :disabled="isViewMode"
               >
                 <el-option
                   v-for="item in testStandardOptions"
@@ -58,21 +61,52 @@
           </el-col>
           <el-col :span="12">
             <el-form-item label="鏁伴噺锛�" prop="quantity">
-              <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="form.quantity" placeholder="璇疯緭鍏�" clearable :precision="2" :disabled="quantityDisabled"/>
+              <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="form.quantity" placeholder="璇疯緭鍏�" clearable :precision="2" :disabled="isViewMode || processQuantityDisabled"/>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="30">
+          <el-col :span="12">
+            <el-form-item label="鍚堟牸鏁伴噺锛�"
+                          prop="qualifiedQuantity">
+              <el-input-number :step="0.01"
+                               :min="0"
+                               style="width: 100%"
+                               v-model="form.qualifiedQuantity"
+                               placeholder="璇疯緭鍏�"
+                               clearable
+                               :precision="2"
+                               @change="handleQualifiedQuantityChange"
+                               :disabled="isViewMode" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="涓嶅悎鏍兼暟閲忥細"
+                          prop="unqualifiedQuantity">
+              <el-input-number :step="0.01"
+                               :min="0"
+                               style="width: 100%"
+                               v-model="form.unqualifiedQuantity"
+                               placeholder="璇疯緭鍏�"
+                               clearable
+                               :precision="2"
+                               @change="handleUnqualifiedQuantityChange"
+                               :disabled="isViewMode" />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="30">
           <el-col :span="12">
             <el-form-item label="妫�娴嬪崟浣嶏細" prop="checkCompany">
-              <el-input v-model="form.checkCompany" placeholder="璇疯緭鍏�" clearable/>
+              <el-input v-model="form.checkCompany" placeholder="璇疯緭鍏�" clearable :disabled="isViewMode"/>
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="妫�娴嬬粨鏋滐細" prop="checkResult">
-              <el-select v-model="form.checkResult">
+              <el-select v-model="form.checkResult" :disabled="isViewMode">
                 <el-option label="鍚堟牸" value="鍚堟牸" />
                 <el-option label="涓嶅悎鏍�" value="涓嶅悎鏍�" />
+                <el-option label="閮ㄥ垎鍚堟牸" value="閮ㄥ垎鍚堟牸" />
               </el-select>
             </el-form-item>
           </el-col>
@@ -80,10 +114,10 @@
         <el-row :gutter="30">
           <el-col :span="12">
             <el-form-item label="妫�楠屽憳锛�" prop="checkName">
-							<el-select v-model="form.checkName" placeholder="璇烽�夋嫨" clearable>
-								<el-option v-for="item in userList" :key="item.nickName" :label="item.nickName"
-													 :value="item.nickName"/>
-							</el-select>
+              <el-select v-model="form.checkName" placeholder="璇烽�夋嫨" clearable :disabled="isViewMode">
+                <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName"
+                           :value="item.nickName"/>
+              </el-select>
             </el-form-item>
           </el-col>
           <el-col :span="12">
@@ -96,6 +130,7 @@
                   format="YYYY-MM-DD"
                   clearable
                   style="width: 100%"
+                  :disabled="isViewMode"
               />
             </el-form-item>
           </el-col>
@@ -109,13 +144,16 @@
 				height="400"
 			>
 				<template #slot="{ row }">
-					<el-input v-model="row.testValue" clearable/>
+					<el-input v-model="row.testValue" clearable :disabled="isViewMode"/>
 				</template>
 			</PIMTable>
       <template #footer>
         <div class="dialog-footer">
-          <el-button type="primary" @click="submitForm">纭</el-button>
-          <el-button @click="closeDia">鍙栨秷</el-button>
+          <template v-if="!isViewMode">
+            <el-button type="primary" @click="submitForm">纭</el-button>
+            <el-button @click="closeDia">鍙栨秷</el-button>
+          </template>
+          <el-button v-else @click="closeDia">鍏抽棴</el-button>
         </div>
       </template>
     </el-dialog>
@@ -134,7 +172,7 @@
 const emit = defineEmits(['close'])
 
 const dialogFormVisible = ref(false);
-const operationType = ref('')
+const operationType = ref("");
 const data = reactive({
   form: {
     checkTime: "",
@@ -147,25 +185,31 @@
     testStandardId: "",
     unit: "",
     quantity: "",
+    qualifiedQuantity: "",
+    unqualifiedQuantity: "",
     checkCompany: "",
     checkResult: "",
   },
   rules: {
-    checkTime: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" },],
+    checkTime: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
     process: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
     checkName: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
     productId: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
     productModelId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
-    testStandardId: [{required: false, message: "璇烽�夋嫨鎸囨爣", trigger: "change"}],
+    testStandardId: [{ required: false, message: "璇烽�夋嫨鎸囨爣", trigger: "change" }],
     unit: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
     quantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    qualifiedQuantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    unqualifiedQuantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
     checkCompany: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
     checkResult: [{ required: true, message: "璇疯緭鍏�", trigger: "change" }],
   },
 });
 const { form, rules } = toRefs(data);
-// 缂栬緫鏃讹細productMainId 鎴� purchaseLedgerId 浠讳竴鏈夊�煎垯鏁伴噺缃伆
-const quantityDisabled = computed(() => {
+// 鏄惁涓烘煡鐪嬫ā寮�
+const isViewMode = computed(() => operationType.value === 'view');
+// 缂栬緫鏃讹細productMainId 鎴� purchaseLedgerId 浠讳竴鏈夊�煎垯宸ュ簭銆佹暟閲忕疆鐏�
+const processQuantityDisabled = computed(() => {
   const v = form.value || {};
   return !!(v.productMainId != null || v.purchaseLedgerId != null);
 });
@@ -209,7 +253,7 @@
   // 鍏堟竻绌鸿〃鍗曢獙璇佺姸鎬侊紝閬垮厤闂儊
   await nextTick();
   proxy.$refs.formRef?.clearValidate();
-  
+
   // 骞惰鍔犺浇鍩虹鏁版嵁
   const [userListsRes] = await Promise.all([
     userListNoPage(),
@@ -219,12 +263,12 @@
     })
   ]);
   userList.value = userListsRes.data;
-  
+
   form.value = {}
   testStandardOptions.value = [];
   tableData.value = [];
-  
-  if (operationType.value === 'edit') {
+
+  if (operationType.value === 'edit' || operationType.value === 'view') {
     // 鍏堜繚瀛� testStandardId锛岄伩鍏嶈娓呯┖
     const savedTestStandardId = row.testStandardId;
     // 鍏堣缃〃鍗曟暟鎹紝浣嗘殏鏃舵竻绌� testStandardId锛岀瓑閫夐」鍔犺浇瀹屾垚鍚庡啀璁剧疆
@@ -234,18 +278,18 @@
     nextTick(() => {
       proxy.$refs.formRef?.clearValidate();
     });
-    
+
     // 缂栬緫妯″紡涓嬶紝骞惰鍔犺浇瑙勬牸鍨嬪彿鍜屾寚鏍囬�夐」
     if (currentProductId.value) {
       // 璁剧疆浜у搧鍚嶇О
       form.value.productName = findNodeById(productOptions.value, currentProductId.value);
-      
+
       // 骞惰鍔犺浇瑙勬牸鍨嬪彿鍜屾寚鏍囬�夐」
       const params = {
         productId: currentProductId.value,
         inspectType: 2
       };
-      
+
       Promise.all([
         modelList({ id: currentProductId.value }),
         qualityInspectDetailByProductId(params)
@@ -260,15 +304,15 @@
             form.value.unit = selectedModel.unit || '';
           }
         }
-        
+
         // 璁剧疆鎸囨爣閫夐」
         testStandardOptions.value = testStandardRes.data || [];
-        
+
         // 璁剧疆 testStandardId 骞跺姞杞藉弬鏁板垪琛�
         nextTick(() => {
           if (savedTestStandardId) {
             // 纭繚绫诲瀷鍖归厤锛坕tem.id 鍙兘鏄暟瀛楁垨瀛楃涓诧級
-            const matchedOption = testStandardOptions.value.find(item => 
+            const matchedOption = testStandardOptions.value.find(item =>
               item.id == savedTestStandardId || String(item.id) === String(savedTestStandardId)
             );
             if (matchedOption) {
@@ -313,6 +357,28 @@
   form.value.unit = modelOptions.value.find(item => item.id == value)?.unit || '';
 }
 
+const handleQualifiedQuantityChange = (value) => {
+  if (value === null || value === undefined) {
+    form.value.qualifiedQuantity = 0;
+    return;
+  }
+  const quantity = parseFloat(form.value.quantity) || 0;
+  const qualified = parseFloat(value) || 0;
+  form.value.qualifiedQuantity = qualified > quantity?quantity:qualified;
+  form.value.unqualifiedQuantity = Math.max(0, quantity - qualified);
+};
+
+const handleUnqualifiedQuantityChange = (value) => {
+  if (value === null || value === undefined) {
+    form.value.unqualifiedQuantity = 0;
+    return;
+  }
+  const quantity = parseFloat(form.value.quantity) || 0;
+  const unqualified = parseFloat(value) || 0;
+  form.value.unqualifiedQuantity = unqualified > quantity?quantity:unqualified;
+  form.value.qualifiedQuantity = Math.max(0, quantity - unqualified);
+};
+
 const findNodeById = (nodes, productId) => {
   for (let i = 0; i < nodes.length; i++) {
     if (nodes[i].value === productId) {
@@ -337,7 +403,7 @@
     if (children && children.length > 0) {
       newItem.children = convertIdToValue(children);
     }
-    
+
     return newItem;
   });
 }
@@ -345,26 +411,26 @@
 const submitForm = () => {
   proxy.$refs.formRef.validate(valid => {
     if (valid) {
-      form.value.inspectType = 2
-			if (operationType.value === "add") {
-				tableData.value.forEach((item) => {
-					delete item.id
-				})
-			}
-			const data = {...form.value, qualityInspectParams: tableData.value}
+      form.value.inspectType = 2;
+      if (operationType.value === "add") {
+        tableData.value.forEach((item) => {
+          delete item.id;
+        });
+      }
+      const data = { ...form.value, qualityInspectParams: tableData.value };
       if (operationType.value === "add") {
         qualityInspectAdd(data).then(res => {
           proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
           closeDia();
-        })
+        });
       } else {
         qualityInspectUpdate(data).then(res => {
           proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
           closeDia();
-        })
+        });
       }
     }
-  })
+  });
 }
 const getList = () => {
   if (!currentProductId.value) {
@@ -375,15 +441,15 @@
   let params = {
     productId: currentProductId.value,
     inspectType: 2
-  }
-	qualityInspectDetailByProductId(params).then(res => {
-		// 淇濆瓨涓嬫媺妗嗛�夐」鏁版嵁
-		testStandardOptions.value = res.data || [];
-		// 娓呯┖琛ㄦ牸鏁版嵁锛岀瓑寰呯敤鎴烽�夋嫨鎸囨爣
-		tableData.value = [];
-		// 娓呯┖鎸囨爣閫夋嫨
-		form.value.testStandardId = '';
-	})
+  };
+  qualityInspectDetailByProductId(params).then(res => {
+    // 淇濆瓨涓嬫媺妗嗛�夐」鏁版嵁
+    testStandardOptions.value = res.data || [];
+    // 娓呯┖琛ㄦ牸鏁版嵁锛岀瓑寰呯敤鎴烽�夋嫨鎸囨爣
+    tableData.value = [];
+    // 娓呯┖鎸囨爣閫夋嫨
+    form.value.testStandardId = '';
+  });
 }
 
 // 鎸囨爣閫夋嫨鍙樺寲澶勭悊
@@ -395,17 +461,21 @@
   tableLoading.value = true;
   getQualityTestStandardParamByTestStandardId(testStandardId).then(res => {
     tableData.value = res.data || [];
+    tableData.value = tableData.value.map(item => ({
+      ...item,
+      id: null
+    }));
   }).catch(error => {
     console.error('鑾峰彇鏍囧噯鍙傛暟澶辫触:', error);
     tableData.value = [];
   }).finally(() => {
     tableLoading.value = false;
-  })
+  });
 }
 const getQualityInspectParamList = (id) => {
-	qualityInspectParamInfo(id).then(res => {
-		tableData.value = res.data;
-	})
+  qualityInspectParamInfo(id).then(res => {
+    tableData.value = res.data;
+  });
 }
 // 鍏抽棴寮规
 const closeDia = () => {
@@ -414,8 +484,8 @@
   testStandardOptions.value = [];
   form.value.testStandardId = '';
   dialogFormVisible.value = false;
-  emit('close')
-};
+  emit('close');
+}
 defineExpose({
   openDialog,
 });
@@ -423,4 +493,4 @@
 
 <style scoped>
 
-</style>
\ No newline at end of file
+</style>
diff --git a/src/views/qualityManagement/finalInspection/index.vue b/src/views/qualityManagement/finalInspection/index.vue
index a2d1acc..ad49048 100644
--- a/src/views/qualityManagement/finalInspection/index.vue
+++ b/src/views/qualityManagement/finalInspection/index.vue
@@ -1,25 +1,61 @@
 <template>
   <div class="app-container">
     <div class="search_form mb20">
-      <div>
-        <span class="search_title">浜у搧鍚嶇О锛�</span>
-        <el-input
-            v-model="searchForm.productName"
-            style="width: 240px"
-            placeholder="璇疯緭鍏ヤ骇鍝佸悕绉版悳绱�"
-            @change="handleQuery"
-            clearable
-            :prefix-icon="Search"
-        />
-        <span style="margin-left: 10px" class="search_title">妫�娴嬫棩鏈燂細</span>
-        <el-date-picker v-model="searchForm.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="daterange"
-                        placeholder="璇烽�夋嫨" clearable @change="changeDaterange"/>
-        <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
-        >鎼滅储
-        </el-button
-        >
-      </div>
-      <div>
+      <el-form
+          ref="searchFormRef"
+          :model="searchForm"
+          class="demo-form-inline"
+      >
+        <el-row :gutter="20">
+          <el-col :span="4">
+            <el-form-item label="浜у搧鍚嶇О" prop="productName">
+              <el-input
+                  v-model="searchForm.productName"
+                  style="width: 240px"
+                  placeholder="璇疯緭鍏ヤ骇鍝佸悕绉版悳绱�"
+                  clearable
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="妫�娴嬫棩鏈�" prop="entryDate">
+              <el-date-picker v-model="searchForm.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="daterange"
+                              placeholder="璇烽�夋嫨" clearable @change="changeDaterange"/>
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="4">
+            <el-form-item label="閿�鍞崟鍙�" prop="salesContractNo">
+              <el-input
+                  v-model="searchForm.salesContractNo"
+                  style="width: 240px"
+                  placeholder="璇疯緭鍏ラ攢鍞崟鍙锋悳绱�"
+                  clearable
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="4">
+            <el-form-item label="鐢熶骇宸ュ崟鍙�" prop="workOrderNo">
+              <el-input
+                  v-model="searchForm.workOrderNo"
+                  style="width: 240px"
+                  placeholder="璇疯緭鍏ョ敓浜у伐鍗曞彿鎼滅储"
+                  clearable
+              />
+            </el-form-item>
+          </el-col>
+          <!-- 鎸夐挳 -->
+          <el-col :span="4">
+            <el-form-item>
+              <el-button type="primary" @click="getList">
+                鎼滅储
+              </el-button>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+
+      <div class="actions">
         <el-button type="primary" @click="openForm('add')">鏂板</el-button>
         <el-button @click="handleOut">瀵煎嚭</el-button>
         <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
@@ -81,6 +117,8 @@
 const data = reactive({
   searchForm: {
     productName: "",
+    salesContractNo: "",
+    workOrderNo: "",
     entryDate: undefined, // 褰曞叆鏃ユ湡
     entryDateStart: undefined,
     entryDateEnd: undefined,
@@ -123,8 +161,18 @@
     prop: "unit",
   },
   {
-    label: "鏁伴噺",
+    label: "鎬绘暟閲�",
     prop: "quantity",
+    width: 100
+  },
+  {
+    label: "鍚堟牸鏁伴噺",
+    prop: "qualifiedQuantity",
+    width: 100
+  },
+  {
+    label: "涓嶅悎鏍兼暟閲�",
+    prop: "unqualifiedQuantity",
     width: 100
   },
   {
@@ -142,7 +190,7 @@
       } else if (params == '鍚堟牸') {
         return "success";
       } else {
-        return null;
+        return 'danger';
       }
     },
   },
@@ -179,6 +227,13 @@
           }
           return false;
         }
+      },
+      {
+        name: "鏌ョ湅",
+        type: "text",
+        clickFun: (row) => {
+          openForm("view", row);
+        },
       },
       {
         name: "闄勪欢",
@@ -400,4 +455,10 @@
 });
 </script>
 
-<style scoped></style>
+<style scoped lang="scss">
+.actions {
+  display: flex;
+  justify-content: flex-end;
+  margin-bottom: 10px;
+}
+</style>
diff --git a/src/views/qualityManagement/nonconformingManagement/components/formDia.vue b/src/views/qualityManagement/nonconformingManagement/components/formDia.vue
index 0c6562c..e747d04 100644
--- a/src/views/qualityManagement/nonconformingManagement/components/formDia.vue
+++ b/src/views/qualityManagement/nonconformingManagement/components/formDia.vue
@@ -35,10 +35,10 @@
           </el-col>
           <el-col :span="12">
             <el-form-item label="瑙勬牸鍨嬪彿锛�" prop="model">
-              <el-select v-model="form.model" placeholder="璇烽�夋嫨" clearable :disabled="operationType === 'edit'"
-                          filterable readonly @change="handleChangeModel">
-              <el-option v-for="item in modelOptions" :key="item.id" :label="item.model" :value="item.id" />
-            </el-select>
+              <el-select v-model="form.productModelId" placeholder="璇烽�夋嫨" clearable :disabled="operationType === 'edit'"
+                         filterable readonly @change="handleChangeModel">
+                <el-option v-for="item in modelOptions" :key="item.id" :label="item.model" :value="item.id" />
+              </el-select>
             </el-form-item>
           </el-col>
         </el-row>
@@ -149,7 +149,7 @@
     productId: "",
     model: "",
     unit: "",
-    quantity: "",
+    quantity: undefined,
     checkCompany: "",
     checkResult: "",
     inspectType: '',
@@ -157,6 +157,7 @@
     dealResult: '',
     dealName: '',
     dealTime: '',
+    productModelId: undefined,
   },
   rules: {
     checkTime: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" },],
@@ -199,8 +200,9 @@
       productId: '',
       model: '',
       unit: '',
-      quantity: '',
+      quantity: undefined,
       productName: '',
+      productModelId: undefined,
     };
   } else {
     form.value = {};
@@ -223,6 +225,12 @@
   modelList({ id: value }).then((res) => {
     modelOptions.value = res;
   })
+};
+const handleChangeModel = (value) => {
+  const selectedModel = modelOptions.value.find(item => item.id === value);
+  if (selectedModel) {
+    form.value.model = selectedModel.model;
+  }
 };
 const findNodeById = (nodes, productId) => {
   for (let i = 0; i < nodes.length; i++) {
@@ -285,4 +293,4 @@
 
 <style scoped>
 
-</style>
\ No newline at end of file
+</style>
diff --git a/src/views/qualityManagement/nonconformingManagement/index.vue b/src/views/qualityManagement/nonconformingManagement/index.vue
index 6306397..fc9d5d2 100644
--- a/src/views/qualityManagement/nonconformingManagement/index.vue
+++ b/src/views/qualityManagement/nonconformingManagement/index.vue
@@ -98,7 +98,7 @@
       } else if (params == '鍚堟牸') {
         return "success";
       } else {
-        return null;
+        return 'danger';
       }
     },
   },
diff --git a/src/views/qualityManagement/processInspection/components/formDia.vue b/src/views/qualityManagement/processInspection/components/formDia.vue
index 88c1e20..635360f 100644
--- a/src/views/qualityManagement/processInspection/components/formDia.vue
+++ b/src/views/qualityManagement/processInspection/components/formDia.vue
@@ -1,7 +1,7 @@
 <template>
   <div>
     <el-dialog v-model="dialogFormVisible"
-               :title="operationType === 'add' ? '鏂板杩囩▼妫�楠�' : '缂栬緫杩囩▼妫�楠�'"
+               :title="operationType === 'add' ? '鏂板杩囩▼妫�楠�' : operationType === 'view' ? '鏌ョ湅杩囩▼妫�楠�' : '缂栬緫杩囩▼妫�楠�'"
                width="70%"
                @close="closeDia">
       <el-form :model="form"
@@ -16,7 +16,7 @@
               <el-select v-model="form.process"
                          placeholder="璇烽�夋嫨宸ュ簭"
                          clearable
-                         :disabled="processQuantityDisabled"
+                         :disabled="isViewMode || processQuantityDisabled"
                          style="width: 100%">
                 <el-option v-for="item in processList"
                            :key="item.name"
@@ -35,7 +35,7 @@
                               @change="getModels"
                               :data="productOptions"
                               :render-after-expand="false"
-                              :disabled="operationType === 'edit'"
+                              :disabled="isViewMode || operationType === 'edit'"
                               style="width: 100%" />
             </el-form-item>
           </el-col>
@@ -47,7 +47,7 @@
               <el-select v-model="form.productModelId"
                          placeholder="璇烽�夋嫨"
                          clearable
-                         :disabled="operationType === 'edit'"
+                         :disabled="isViewMode || operationType === 'edit'"
                          filterable
                          readonly
                          @change="handleChangeModel">
@@ -65,7 +65,8 @@
                          placeholder="璇烽�夋嫨鎸囨爣"
                          clearable
                          @change="handleTestStandardChange"
-                         style="width: 100%">
+                         style="width: 100%"
+                         :disabled="isViewMode">
                 <el-option v-for="item in testStandardOptions"
                            :key="item.id"
                            :label="item.standardName || item.standardNo"
@@ -93,7 +94,37 @@
                                placeholder="璇疯緭鍏�"
                                clearable
                                :precision="2"
-                               :disabled="processQuantityDisabled" />
+                               :disabled="isViewMode || processQuantityDisabled" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="30">
+          <el-col :span="12">
+            <el-form-item label="鍚堟牸鏁伴噺锛�"
+                          prop="qualifiedQuantity">
+              <el-input-number :step="0.01"
+                               :min="0"
+                               style="width: 100%"
+                               v-model="form.qualifiedQuantity"
+                               placeholder="璇疯緭鍏�"
+                               clearable
+                               :precision="2"
+                               @change="handleQualifiedQuantityChange"
+                               :disabled="isViewMode" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="涓嶅悎鏍兼暟閲忥細"
+                          prop="unqualifiedQuantity">
+              <el-input-number :step="0.01"
+                               :min="0"
+                               style="width: 100%"
+                               v-model="form.unqualifiedQuantity"
+                               placeholder="璇疯緭鍏�"
+                               clearable
+                               :precision="2"
+                               @change="handleUnqualifiedQuantityChange"
+                               :disabled="isViewMode" />
             </el-form-item>
           </el-col>
         </el-row>
@@ -103,17 +134,20 @@
                           prop="checkCompany">
               <el-input v-model="form.checkCompany"
                         placeholder="璇疯緭鍏�"
-                        clearable />
+                        clearable
+                        :disabled="isViewMode" />
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="妫�娴嬬粨鏋滐細"
                           prop="checkResult">
-              <el-select v-model="form.checkResult">
+              <el-select v-model="form.checkResult" :disabled="isViewMode">
                 <el-option label="鍚堟牸"
                            value="鍚堟牸" />
                 <el-option label="涓嶅悎鏍�"
                            value="涓嶅悎鏍�" />
+                <el-option label="閮ㄥ垎鍚堟牸"
+                           value="閮ㄥ垎鍚堟牸" />
               </el-select>
             </el-form-item>
           </el-col>
@@ -124,7 +158,8 @@
                           prop="checkName">
               <el-select v-model="form.checkName"
                          placeholder="璇烽�夋嫨"
-                         clearable>
+                         clearable
+                         :disabled="isViewMode">
                 <el-option v-for="item in userList"
                            :key="item.nickName"
                            :label="item.nickName"
@@ -141,7 +176,8 @@
                               value-format="YYYY-MM-DD"
                               format="YYYY-MM-DD"
                               clearable
-                              style="width: 100%" />
+                              style="width: 100%"
+                              :disabled="isViewMode" />
             </el-form-item>
           </el-col>
         </el-row>
@@ -153,14 +189,18 @@
                 height="400">
         <template #slot="{ row }">
           <el-input v-model="row.testValue"
-                    clearable />
+                    clearable
+                    :disabled="isViewMode" />
         </template>
       </PIMTable>
       <template #footer>
         <div class="dialog-footer">
-          <el-button type="primary"
-                     @click="submitForm">纭</el-button>
-          <el-button @click="closeDia">鍙栨秷</el-button>
+          <template v-if="!isViewMode">
+            <el-button type="primary"
+                       @click="submitForm">纭</el-button>
+            <el-button @click="closeDia">鍙栨秷</el-button>
+          </template>
+          <el-button v-else @click="closeDia">鍏抽棴</el-button>
         </div>
       </template>
     </el-dialog>
@@ -189,6 +229,7 @@
   import { userListNoPage } from "@/api/system/user.js";
   import { qualityInspectParamInfo } from "@/api/qualityManagement/qualityInspectParam.js";
   import { list } from "@/api/productionManagement/productionProcess";
+  import qualified from "@/views/inventoryManagement/stockManagement/Qualified.vue";
   const { proxy } = getCurrentInstance();
   const emit = defineEmits(["close"]);
 
@@ -206,6 +247,8 @@
       testStandardId: "",
       unit: "",
       quantity: "",
+      qualifiedQuantity: "",
+      unqualifiedQuantity: "",
       checkCompany: "",
       checkResult: "",
     },
@@ -215,17 +258,19 @@
       checkName: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
       productId: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
       productModelId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
-      testStandardId: [
-        { required: false, message: "璇烽�夋嫨鎸囨爣", trigger: "change" },
-      ],
+      testStandardId: [{ required: false, message: "璇烽�夋嫨鎸囨爣", trigger: "change" }],
       unit: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
       quantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+      qualifiedQuantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+      unqualifiedQuantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
       checkCompany: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
       checkResult: [{ required: true, message: "璇疯緭鍏�", trigger: "change" }],
     },
   });
   const userList = ref([]);
   const { form, rules } = toRefs(data);
+  // 鏄惁涓烘煡鐪嬫ā寮�
+  const isViewMode = computed(() => operationType.value === 'view');
   // 缂栬緫鏃讹細productMainId 鎴� purchaseLedgerId 浠讳竴鏈夊�煎垯宸ュ簭銆佹暟閲忕疆鐏�
   const processQuantityDisabled = computed(() => {
     const v = form.value || {};
@@ -299,7 +344,7 @@
     tableData.value = [];
     // 鍏堢‘淇濅骇鍝佹爲宸插姞杞斤紝鍚﹀垯缂栬緫鏃朵骇鍝�/瑙勬牸鍨嬪彿鏃犳硶鍙嶆樉
     await getProductOptions();
-    if (operationType.value === "edit") {
+    if (operationType.value === "edit" || operationType.value === "view") {
       // 鍏堜繚瀛� testStandardId锛岄伩鍏嶈娓呯┖
       const savedTestStandardId = row.testStandardId;
       // 鍏堣缃〃鍗曟暟鎹紝浣嗘殏鏃舵竻绌� testStandardId锛岀瓑閫夐」鍔犺浇瀹屾垚鍚庡啀璁剧疆
@@ -400,6 +445,28 @@
       modelOptions.value.find(item => item.id == value)?.unit || "";
   };
 
+  const handleQualifiedQuantityChange = (value) => {
+    if (value === null || value === undefined) {
+      form.value.qualifiedQuantity = 0;
+      return;
+    }
+    const quantity = parseFloat(form.value.quantity) || 0;
+    const qualified = parseFloat(value) || 0;
+    form.value.qualifiedQuantity = qualified > quantity?quantity:qualified;
+    form.value.unqualifiedQuantity = Math.max(0, quantity - qualified);
+  };
+
+  const handleUnqualifiedQuantityChange = (value) => {
+    if (value === null || value === undefined) {
+      form.value.unqualifiedQuantity = 0;
+      return;
+    }
+    const quantity = parseFloat(form.value.quantity) || 0;
+    const unqualified = parseFloat(value) || 0;
+    form.value.unqualifiedQuantity = unqualified > quantity?quantity:unqualified;
+    form.value.qualifiedQuantity = Math.max(0, quantity - unqualified);
+  };
+
   const findNodeById = (nodes, productId) => {
     for (let i = 0; i < nodes.length; i++) {
       if (nodes[i].value === productId) {
@@ -440,6 +507,17 @@
             delete item.id;
           });
         }
+        // 纭繚鏁伴噺涓嶄负null
+        const quantity = parseFloat(form.value.quantity) || 0;
+        const qualified = parseFloat(form.value.qualifiedQuantity) || 0;
+        const unqualified = parseFloat(form.value.unqualifiedQuantity) || 0;
+
+        // 楠岃瘉鏁伴噺鍏崇郴
+        if (qualified + unqualified !== quantity) {
+          proxy.$modal.msgError("鍚堟牸鏁伴噺涓庝笉鍚堟牸鏁伴噺涔嬪拰蹇呴』绛変簬鎬绘暟閲�");
+          return;
+        }
+
         const data = {
           ...form.value,
           process: processName, // 淇濈暀 process 瀛楁浠ュ吋瀹瑰悗绔�
@@ -491,6 +569,10 @@
     getQualityTestStandardParamByTestStandardId(testStandardId)
       .then(res => {
         tableData.value = res.data || [];
+        tableData.value = tableData.value.map(item => ({
+          ...item,
+          id: null
+        }));
       })
       .catch(error => {
         console.error("鑾峰彇鏍囧噯鍙傛暟澶辫触:", error);
@@ -520,4 +602,4 @@
 </script>
 
 <style scoped>
-</style>
\ No newline at end of file
+</style>
diff --git a/src/views/qualityManagement/processInspection/index.vue b/src/views/qualityManagement/processInspection/index.vue
index e5504b6..79bd3a9 100644
--- a/src/views/qualityManagement/processInspection/index.vue
+++ b/src/views/qualityManagement/processInspection/index.vue
@@ -14,6 +14,15 @@
         <span  style="margin-left: 10px" class="search_title">妫�娴嬫棩鏈燂細</span>
         <el-date-picker  v-model="searchForm.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="daterange"
                          placeholder="璇烽�夋嫨" clearable @change="changeDaterange" />
+        <span style="margin-left: 10px" class="search_title">鐢熶骇宸ュ崟鍙凤細</span>
+        <el-input
+            v-model="searchForm.workOrderNo"
+            style="width: 240px"
+            placeholder="璇疯緭鍏ョ敓浜у伐鍗曞彿鎼滅储"
+            @change="handleQuery"
+            clearable
+            :prefix-icon="Search"
+        />
         <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
         >鎼滅储</el-button
         >
@@ -81,6 +90,7 @@
   searchForm: {
     process: "",
     entryDate: undefined, // 褰曞叆鏃ユ湡
+    workOrderNo: "",
     entryDateStart: undefined,
     entryDateEnd: undefined,
   },
@@ -122,8 +132,18 @@
     prop: "unit",
   },
   {
-    label: "鏁伴噺",
+    label: "鎬绘暟閲�",
     prop: "quantity",
+    width: 100
+  },
+  {
+    label: "鍚堟牸鏁伴噺",
+    prop: "qualifiedQuantity",
+    width: 100
+  },
+  {
+    label: "涓嶅悎鏍兼暟閲�",
+    prop: "unqualifiedQuantity",
     width: 100
   },
   {
@@ -141,7 +161,7 @@
       } else if (params == '鍚堟牸') {
         return "success";
       } else {
-        return null;
+        return 'danger';
       }
     },
   },
@@ -178,6 +198,13 @@
 					}
 					return false;
 				}
+      },
+      {
+        name: "鏌ョ湅",
+        type: "text",
+        clickFun: (row) => {
+          openForm("view", row);
+        },
       },
       {
         name: "闄勪欢",
@@ -363,13 +390,13 @@
 			type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
 		})
 		const downloadUrl = window.URL.createObjectURL(blob)
-		
+
 		const link = document.createElement('a')
 		link.href = downloadUrl
 		link.download = '杩囩▼妫�楠屾姤鍛�.docx'
 		document.body.appendChild(link)
 		link.click()
-		
+
 		document.body.removeChild(link)
 		window.URL.revokeObjectURL(downloadUrl)
 	})
diff --git a/src/views/qualityManagement/rawMaterialInspection/components/formDia.vue b/src/views/qualityManagement/rawMaterialInspection/components/formDia.vue
index 7e373bf..8bcc72b 100644
--- a/src/views/qualityManagement/rawMaterialInspection/components/formDia.vue
+++ b/src/views/qualityManagement/rawMaterialInspection/components/formDia.vue
@@ -2,7 +2,7 @@
   <div>
     <el-dialog
         v-model="dialogFormVisible"
-        :title="operationType === 'add' ? '鏂板鍘熸潗鏂欐楠�' : '缂栬緫鍘熸潗鏂欐楠�'"
+        :title="operationType === 'add' ? '鏂板鍘熸潗鏂欐楠�' : operationType === 'view' ? '鏌ョ湅鍘熸潗鏂欐楠�' : '缂栬緫鍘熸潗鏂欐楠�'"
         width="70%"
         @close="closeDia"
     >
@@ -14,7 +14,7 @@
                   v-model="form.supplier"
                   placeholder="璇烽�夋嫨"
                   clearable
-                  :disabled="supplierQuantityDisabled"
+                  :disabled="isViewMode || supplierQuantityDisabled"
               >
                 <el-option
                     v-for="item in supplierList"
@@ -35,7 +35,7 @@
                   @change="getModels"
                   :data="productOptions"
                   :render-after-expand="false"
-                  :disabled="operationType === 'edit'"
+                  :disabled="isViewMode || operationType === 'edit'"
                   style="width: 100%"
               />
             </el-form-item>
@@ -44,7 +44,7 @@
         <el-row :gutter="30">
           <el-col :span="12">
             <el-form-item label="瑙勬牸鍨嬪彿锛�" prop="productModelId">
-              <el-select v-model="form.productModelId" placeholder="璇烽�夋嫨" clearable :disabled="operationType === 'edit'"
+              <el-select v-model="form.productModelId" placeholder="璇烽�夋嫨" clearable :disabled="isViewMode || operationType === 'edit'"
                          filterable readonly @change="handleChangeModel">
                 <el-option v-for="item in modelOptions" :key="item.id" :label="item.model" :value="item.id" />
               </el-select>
@@ -58,6 +58,7 @@
                 clearable
                 @change="handleTestStandardChange"
                 style="width: 100%"
+                :disabled="isViewMode"
               >
                 <el-option
                   v-for="item in testStandardOptions"
@@ -78,21 +79,39 @@
           <el-col :span="12">
             <el-form-item label="鏁伴噺锛�" prop="quantity">
               <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="form.quantity" placeholder="璇疯緭鍏�"
-                               clearable :precision="2" :disabled="supplierQuantityDisabled"/>
+                               clearable :precision="2" :disabled="isViewMode || supplierQuantityDisabled"/>
             </el-form-item>
           </el-col>
         </el-row>
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="鍚堟牸鏁伴噺锛�" prop="qualifiedQuantity">
+              <el-input-number :step="0.01" :min="0" :max="form.quantity || 0" style="width: 100%"
+                               v-model="form.qualifiedQuantity" placeholder="璇疯緭鍏�" :precision="2"
+                               @change="onQualifiedChange" :disabled="isViewMode"/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="涓嶅悎鏍兼暟閲忥細" prop="unqualifiedQuantity">
+              <el-input-number :step="0.01" :min="0" :max="form.quantity || 0" style="width: 100%"
+                               v-model="form.unqualifiedQuantity" placeholder="璇疯緭鍏�" :precision="2"
+                               @change="onUnqualifiedChange" :disabled="isViewMode"/>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
         <el-row :gutter="30">
           <el-col :span="12">
             <el-form-item label="妫�娴嬪崟浣嶏細" prop="checkCompany">
-              <el-input v-model="form.checkCompany" placeholder="璇疯緭鍏�" clearable/>
+              <el-input v-model="form.checkCompany" placeholder="璇疯緭鍏�" clearable :disabled="isViewMode"/>
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="妫�娴嬬粨鏋滐細" prop="checkResult">
-              <el-select v-model="form.checkResult">
+              <el-select v-model="form.checkResult" :disabled="isViewMode">
                 <el-option label="鍚堟牸" value="鍚堟牸"/>
                 <el-option label="涓嶅悎鏍�" value="涓嶅悎鏍�"/>
+                <el-option label="閮ㄥ垎鍚堟牸" value="閮ㄥ垎鍚堟牸"/>
               </el-select>
             </el-form-item>
           </el-col>
@@ -100,7 +119,7 @@
         <el-row :gutter="30">
           <el-col :span="12">
             <el-form-item label="妫�楠屽憳锛�" prop="checkName">
-              <el-select v-model="form.checkName" placeholder="璇烽�夋嫨" clearable style="width: 100%">
+              <el-select v-model="form.checkName" placeholder="璇烽�夋嫨" clearable style="width: 100%" :disabled="isViewMode">
                 <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName" :value="item.nickName"/>
               </el-select>
             </el-form-item>
@@ -115,6 +134,7 @@
                   format="YYYY-MM-DD"
                   clearable
                   style="width: 100%"
+                  :disabled="isViewMode"
               />
             </el-form-item>
           </el-col>
@@ -131,13 +151,16 @@
           height="400"
       >
         <template #slot="{ row }">
-          <el-input v-model="row.testValue" clearable/>
+          <el-input v-model="row.testValue" clearable :disabled="isViewMode"/>
         </template>
       </PIMTable>
       <template #footer>
         <div class="dialog-footer">
-          <el-button type="primary" @click="submitForm">纭</el-button>
-          <el-button @click="closeDia">鍙栨秷</el-button>
+          <template v-if="!isViewMode">
+            <el-button type="primary" @click="submitForm">纭</el-button>
+            <el-button @click="closeDia">鍙栨秷</el-button>
+          </template>
+          <el-button v-else @click="closeDia">鍏抽棴</el-button>
         </div>
       </template>
     </el-dialog>
@@ -182,6 +205,8 @@
     testStandardId: [{required: false, message: "璇烽�夋嫨鎸囨爣", trigger: "change"}],
     unit: [{required: false, message: "璇疯緭鍏�", trigger: "blur"}],
     quantity: [{required: true, message: "璇疯緭鍏�", trigger: "blur"}],
+    qualifiedQuantity: [{required: true, message: "璇疯緭鍏�", trigger: "blur"}],
+    unqualifiedQuantity: [{required: true, message: "璇疯緭鍏�", trigger: "blur"}],
     checkCompany: [{required: false, message: "璇疯緭鍏�", trigger: "blur"}],
     checkResult: [{required: true, message: "璇烽�夋嫨妫�娴嬬粨鏋�", trigger: "change"}],
   },
@@ -220,6 +245,9 @@
 const testStandardOptions = ref([]); // 鎸囨爣閫夋嫨涓嬫媺妗嗘暟鎹�
 const modelOptions = ref([]);
 const userList = ref([]); // 妫�楠屽憳涓嬫媺鍒楄〃
+
+// 鏄惁涓烘煡鐪嬫ā寮�
+const isViewMode = computed(() => operationType.value === 'view');
 
 // 缂栬緫鏃讹細productMainId 鎴� purchaseLedgerId 浠讳竴鏈夊�煎垯渚涘簲鍟嗐�佹暟閲忕疆鐏�
 const supplierQuantityDisabled = computed(() => {
@@ -260,7 +288,7 @@
   tableData.value = [];
   // 鍏堢‘淇濅骇鍝佹爲宸插姞杞斤紝鍚﹀垯缂栬緫鏃朵骇鍝�/瑙勬牸鍨嬪彿鏃犳硶鍙嶆樉
   await getProductOptions();
-  if (operationType.value === 'edit') {
+  if (operationType.value === 'edit' || operationType.value === 'view') {
     // 鍏堜繚瀛� testStandardId锛岄伩鍏嶈娓呯┖
     const savedTestStandardId = row.testStandardId;
     form.value = {...row}
@@ -294,7 +322,7 @@
             // 濡傛灉缂栬緫鏁版嵁涓湁 testStandardId锛屽垯璁剧疆骞跺姞杞藉搴旂殑鍙傛暟
             if (savedTestStandardId) {
               // 纭繚绫诲瀷鍖归厤锛坕tem.id 鍙兘鏄暟瀛楁垨瀛楃涓诧級
-              const matchedOption = testStandardOptions.value.find(item => 
+              const matchedOption = testStandardOptions.value.find(item =>
                 item.id == savedTestStandardId || String(item.id) === String(savedTestStandardId)
               );
               if (matchedOption) {
@@ -435,6 +463,10 @@
   tableLoading.value = true;
   getQualityTestStandardParamByTestStandardId(testStandardId).then(res => {
     tableData.value = res.data || [];
+    tableData.value = tableData.value.map(item => ({
+      ...item,
+      id: null
+    }));
   }).catch(error => {
     console.error('鑾峰彇鏍囧噯鍙傛暟澶辫触:', error);
     tableData.value = [];
@@ -448,6 +480,32 @@
     tableData.value = res.data;
   })
 }
+// 鑷姩璁$畻鍚堟牸鏁伴噺鍙樺寲鏃剁殑涓嶅悎鏍兼暟閲�
+const onQualifiedChange = (value) => {
+  if (form.value.quantity !== undefined && form.value.quantity !== null) {
+    const maxUnqualified = form.value.quantity - value;
+    if (maxUnqualified >= 0) {
+      form.value.unqualifiedQuantity = maxUnqualified;
+    } else {
+      form.value.qualifiedQuantity = form.value.quantity;
+      form.value.unqualifiedQuantity = 0;
+    }
+  }
+};
+
+// 鑷姩璁$畻涓嶅悎鏍兼暟閲忓彉鍖栨椂鐨勫悎鏍兼暟閲�
+const onUnqualifiedChange = (value) => {
+  if (form.value.quantity !== undefined && form.value.quantity !== null) {
+    const maxQualified = form.value.quantity - value;
+    if (maxQualified >= 0) {
+      form.value.qualifiedQuantity = maxQualified;
+    } else {
+      form.value.unqualifiedQuantity = form.value.quantity;
+      form.value.qualifiedQuantity = 0;
+    }
+  }
+};
+
 // 鍏抽棴寮规
 const closeDia = () => {
   proxy.resetForm("formRef");
@@ -464,4 +522,4 @@
 
 <style scoped>
 
-</style>
\ No newline at end of file
+</style>
diff --git a/src/views/qualityManagement/rawMaterialInspection/index.vue b/src/views/qualityManagement/rawMaterialInspection/index.vue
index cc2c151..1e47496 100644
--- a/src/views/qualityManagement/rawMaterialInspection/index.vue
+++ b/src/views/qualityManagement/rawMaterialInspection/index.vue
@@ -14,6 +14,15 @@
         <span style="margin-left: 10px" class="search_title">妫�娴嬫棩鏈燂細</span>
         <el-date-picker v-model="searchForm.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="daterange"
                         placeholder="璇烽�夋嫨" clearable @change="changeDaterange"/>
+        <span style="margin-left: 10px" class="search_title">閲囪喘璁㈠崟鍙凤細</span>
+        <el-input
+            v-model="searchForm.purchaseContractNo"
+            style="width: 240px"
+            placeholder="璇疯緭鍏ラ噰璐鍗曞彿鎼滅储"
+            @change="handleQuery"
+            clearable
+            :prefix-icon="Search"
+        />
         <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
         >鎼滅储
         </el-button
@@ -83,6 +92,7 @@
   searchForm: {
     supplier: "",
     entryDate: undefined, // 褰曞叆鏃ユ湡
+    purchaseContractNo: "",
     entryDateStart: undefined,
     entryDateEnd: undefined,
   },
@@ -124,8 +134,23 @@
     prop: "unit",
   },
   {
-    label: "鏁伴噺",
+    label: "鎬绘暟閲�",
     prop: "quantity",
+    width: 100
+  },
+  {
+    label: "鍚堟牸鏁伴噺",
+    prop: "qualifiedQuantity",
+    width: 100
+  },
+  {
+    label: "涓嶅悎鏍兼暟閲�",
+    prop: "unqualifiedQuantity",
+    width: 100
+  },
+  {
+    label: "妫�娴嬪崟浣�",
+    prop: "checkCompany",
     width: 120
   },
   {
@@ -143,7 +168,7 @@
       } else if (params === '鍚堟牸') {
         return "success";
       } else {
-        return null;
+        return 'danger';
       }
     },
   },
@@ -182,6 +207,13 @@
 				}
       },
       {
+        name: "鏌ョ湅",
+        type: "text",
+        clickFun: (row) => {
+          openForm("view", row);
+        },
+      },
+      {
         name: "闄勪欢",
         type: "text",
         clickFun: (row) => {
diff --git a/src/views/reportAnalysis/dataDashboard/index0.vue b/src/views/reportAnalysis/dataDashboard/index0.vue
index a89a174..ff92e41 100644
--- a/src/views/reportAnalysis/dataDashboard/index0.vue
+++ b/src/views/reportAnalysis/dataDashboard/index0.vue
@@ -322,8 +322,6 @@
 import {getRepairPage} from "@/api/equipmentManagement/repair.js";
 import {getUpkeepPage} from "@/api/equipmentManagement/upkeep.js";
 import {measuringInstrumentListPage} from "@/api/equipmentManagement/measurementEquipment.js";
-import {listPageAnalysis} from "@/api/financialManagement/expenseManagement.js";
-import {productOrderListPage} from "@/api/productionManagement/productionOrder.js";
 
 // 鍏ㄥ睆鐩稿叧鐘舵��
 const isFullscreen = ref(false);
@@ -927,15 +925,18 @@
 	})
 }
 // 搴斾粯搴旀敹缁熻
-const statisticsReceivable = (type) => {
-	statisticsReceivablePayable({type: radio1.value}).then((res) => {
+const statisticsReceivable = (type = radio1.value) => {
+	statisticsReceivablePayable({ type }).then((res) => {
+		const data = res?.data || {}
+		const payableMoney = Number(data.payableMoney ?? 0)
+		const receivableMoney = Number(data.receivableMoney ?? 0)
 		// 璁剧疆搴斾粯閲戦鏁版嵁
 		barSeries.value[0].data = [
-			{ value: res.data.payableMoney }
+			{ value: payableMoney }
 		]
 		// 璁剧疆搴旀敹閲戦鏁版嵁
 		barSeries.value[1].data = [
-			{ value: res.data.receivableMoney }
+			{ value: receivableMoney }
 		]
 	})
 }
@@ -2033,4 +2034,4 @@
   color: #B8C8E0;
   font-size: 11px;
 }
-</style>
\ No newline at end of file
+</style>
diff --git a/src/views/reportAnalysis/financialAnalysis/components/center-top.vue b/src/views/reportAnalysis/financialAnalysis/components/center-top.vue
index 85f4928..becb376 100644
--- a/src/views/reportAnalysis/financialAnalysis/components/center-top.vue
+++ b/src/views/reportAnalysis/financialAnalysis/components/center-top.vue
@@ -112,50 +112,69 @@
   profitRate: { value: 0, trend: 0 },
 })
 
-const fetchMonthlyIncome = async () => {
-  const res = await getMonthlyIncome()
-  const data = res?.data || {}
+const toNumber = (val) => {
+  const num = Number(val)
+  return Number.isFinite(num) ? num : 0
+}
 
-  income.value.amount = data.monthlyIncome ?? 0
-  const collectionRate = Number(data.collectionRate ?? 0)
-  const overdueRate = Number(data.overdueRate ?? 0)
-  income.value.repayRate = {
-    value: collectionRate,
-    trend: collectionRate >= 0 ? 1 : -1,
-  }
-  income.value.overdueCount = data.overdueNum ?? 0
-  income.value.overdueRate = {
-    value: overdueRate,
-    trend: overdueRate >= 0 ? 1 : -1,
+const fetchMonthlyIncome = async () => {
+  try {
+    const res = await getMonthlyIncome()
+    const data = res?.data || {}
+
+    income.value.amount = toNumber(data.monthlyIncome)
+    const collectionRate = toNumber(data.collectionRate)
+    const overdueRate = toNumber(data.overdueRate)
+    income.value.repayRate = {
+      value: collectionRate,
+      trend: collectionRate >= 0 ? 1 : -1,
+    }
+    income.value.overdueCount = toNumber(data.overdueNum)
+    income.value.overdueRate = {
+      value: overdueRate,
+      trend: overdueRate >= 0 ? 1 : -1,
+    }
+  } catch {
+    income.value.amount = 0
+    income.value.repayRate = { value: 0, trend: 0 }
+    income.value.overdueCount = 0
+    income.value.overdueRate = { value: 0, trend: 0 }
   }
 }
 
 const fetchMonthlyExpenditure = async () => {
-  const res = await getMonthlyExpenditure()
-  const data = res?.data || {}
+  try {
+    const res = await getMonthlyExpenditure()
+    const data = res?.data || {}
 
-  expense.value.amount = data.monthlyExpenditure ?? 0
-  const paymentRate = Number(data.paymentRate ?? 0)
-  expense.value.netProfit = {
-    value: paymentRate,
-    trend: paymentRate >= 0 ? 1 : -1,
-  }
-  expense.value.grossProfit = data.grossProfit ?? 0
+    expense.value.amount = toNumber(data.monthlyExpenditure)
+    const paymentRate = toNumber(data.paymentRate)
+    expense.value.netProfit = {
+      value: paymentRate,
+      trend: paymentRate >= 0 ? 1 : -1,
+    }
+    expense.value.grossProfit = toNumber(data.grossProfit)
 
-  const profitMarginRate = Number(data.profitMarginRate ?? 0)
-  expense.value.profitRate = {
-    value: profitMarginRate,
-    trend: profitMarginRate >= 0 ? 1 : -1,
+    const profitMarginRate = toNumber(data.profitMarginRate)
+    expense.value.profitRate = {
+      value: profitMarginRate,
+      trend: profitMarginRate >= 0 ? 1 : -1,
+    }
+  } catch {
+    expense.value.amount = 0
+    expense.value.netProfit = { value: 0, trend: 0 }
+    expense.value.grossProfit = 0
+    expense.value.profitRate = { value: 0, trend: 0 }
   }
 }
 
 const isWanAmount = (val) => {
-  const num = Number(val) || 0
+  const num = toNumber(val)
   return Math.abs(num) >= 10000
 }
 
 const formatAmountWanNumber = (val) => {
-  const num = Number(val) || 0
+  const num = toNumber(val)
   if (Math.abs(num) >= 10000) {
     return (num / 10000).toFixed(2)
   }
@@ -163,7 +182,7 @@
 }
 
 const formatPercent = (val) => {
-  const num = Number(val) || 0
+  const num = toNumber(val)
   // 鐧惧垎姣斿睍绀哄缁堢敤缁濆鍊硷紝灏忔暟淇濈暀涓や綅
   return `${Math.abs(num).toFixed(2)}%`
 }
diff --git a/src/views/safeProduction/safetyTrainingAssessment/detail.vue b/src/views/safeProduction/safetyTrainingAssessment/detail.vue
index 9796980..9e3af6b 100644
--- a/src/views/safeProduction/safetyTrainingAssessment/detail.vue
+++ b/src/views/safeProduction/safetyTrainingAssessment/detail.vue
@@ -111,8 +111,6 @@
 
 <script setup>
   import { onMounted, ref } from "vue";
-  import { invoiceLedgerSalesAccount } from "@/api/salesManagement/invoiceLedger.js";
-  import { customerInteractions } from "@/api/salesManagement/receiptPayment.js";
   import Pagination from "@/components/PIMTable/Pagination.vue";
   import {
     safeTrainingDetailListPage,
diff --git a/src/views/salesManagement/invoiceLedger/index.vue b/src/views/salesManagement/invoiceLedger/index.vue
deleted file mode 100644
index e52ea47..0000000
--- a/src/views/salesManagement/invoiceLedger/index.vue
+++ /dev/null
@@ -1,438 +0,0 @@
-<template>
-  <div class="app-container">
-    <div class="search_form">
-      <el-form :inline="true" :model="searchForm">
-        <el-form-item label="瀹㈡埛鍚嶇О/鍚堝悓鍙�">
-          <el-input v-model="searchForm.searchText" style="width: 240px" placeholder="杈撳叆瀹㈡埛鍚嶇О/閿�鍞悎鍚屽彿鎼滅储"
-            @change="handleQuery" clearable :prefix-icon="Search" />
-        </el-form-item>
-        <el-form-item label="寮�绁ㄦ棩鏈�">
-          <el-date-picker style="width: 240px" v-model="searchForm.invoiceDate" value-format="YYYY-MM-DD"
-            format="YYYY-MM-DD" type="daterange" start-placeholder="寮�濮嬫椂闂�" end-placeholder="缁撴潫鏃堕棿" clearable
-            @change="changeDateRange" @clear="clearRange" />
-        </el-form-item>
-        <el-form-item label="褰曞叆鏃ユ湡">
-          <el-date-picker style="width: 100%" v-model="searchForm.createTimeStart" value-format="YYYY-MM-DD HH:mm:ss"
-            format="YYYY-MM-DD" type="date" placeholder="璇烽�夋嫨" clearable @change="handleQuery" />
-        </el-form-item>
-        <el-form-item label="涓嶆樉绀烘湁鍙戠エ琛�">
-          <el-checkbox v-model="searchForm.status" @change="handleQuery" />
-        </el-form-item>
-        <el-form-item>
-          <el-button type="primary" @click="handleQuery"> 鎼滅储 </el-button>
-          <el-button @click="resetForm"> 閲嶇疆 </el-button>
-          <el-button @click="handleOut" type="primary">瀵煎嚭</el-button>
-        </el-form-item>
-      </el-form>
-    </div>
-    <div class="table_list">
-      <el-table :data="tableData" border v-loading="tableLoading" @selection-change="handleSelectionChange"
-        :row-key="(row) => row.id" show-summary :summary-method="summarizeMainTable" height="calc(100vh - 18.5em)">
-        <el-table-column align="center" type="selection" width="55" />
-        <el-table-column align="center" label="搴忓彿" type="index" width="60" />
-        <el-table-column label="閿�鍞悎鍚屽彿" prop="salesContractNo" show-overflow-tooltip width="180" />
-        <el-table-column label="瀹㈡埛鍚嶇О" prop="customerName" show-overflow-tooltip width="240" />
-        <el-table-column label="浜у搧澶х被" prop="productCategory" width="200" />
-        <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" width="160" show-overflow-tooltip />
-        <el-table-column label="鍙戠エ鍙�" prop="invoiceNo" width="200" show-overflow-tooltip />
-        <el-table-column label="鍙戠エ閲戦(鍏�)" prop="invoiceTotal" show-overflow-tooltip :formatter="formattedNumber"
-          width="200" />
-        <el-table-column label="绋庣巼(%)" prop="taxRate" show-overflow-tooltip />
-        <el-table-column label="褰曞叆浜�" prop="invoicePerson" show-overflow-tooltip />
-        <el-table-column label="褰曞叆鏃ユ湡" prop="createTime" show-overflow-tooltip :formatter="formatDate" width="180" />
-        <el-table-column label="寮�绁ㄦ棩鏈�" prop="invoiceDate" show-overflow-tooltip width="120" />
-        <el-table-column fixed="right" label="鎿嶄綔" width="150" align="center">
-          <template #default="scope">
-            <el-button link type="primary" @click="openForm(scope.row)">缂栬緫</el-button>
-            <el-button link type="primary" @click="openFileDialog(scope.row)">闄勪欢</el-button>
-            <el-button link type="primary" @click="delInvoiceLedger(scope.row)">鍒犻櫎</el-button>
-          </template>
-        </el-table-column>
-      </el-table>
-      <pagination v-show="total > 0" :total="total" layout="total, sizes, prev, pager, next, jumper"
-        :page="page.current" :limit="page.size" @pagination="paginationChange" />
-    </div>
-    <FormDialog v-model="dialogFormVisible" title="寮�绁ㄥ彴璐﹂〉闈�" :width="'70%'" @close="closeDia" @confirm="submitForm" @cancel="closeDia">
-      <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
-        <el-row :gutter="30">
-          <el-col :span="12">
-            <el-form-item label="閿�鍞悎鍚屽彿锛�" prop="salesContractNo">
-              <el-input v-model="form.salesContractNo" disabled></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="瀹㈡埛鍚嶇О锛�" prop="customerName">
-              <el-input v-model="form.customerName" placeholder="鑷姩濉厖" clearable disabled />
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="30">
-          <el-col :span="12">
-            <el-form-item label="鍙戠エ鍙凤細" prop="invoiceNo">
-              <el-input v-model="form.invoiceNo" placeholder="璇疯緭鍏�" clearable />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item :label="`鍙戠エ閲戦(鍏�)锛� `" prop="invoiceTotal">
-              <el-input-number :step="0.01" :min="0" :max="maxInvoiceAmount || form.taxInclusiveTotalPrice" style="width: 100%" v-model="form.invoiceTotal" placeholder="璇疯緭鍏�" clearable :precision="2"/>
-              <div v-if="maxInvoiceAmount > 0" style="color: #909399; font-size: 12px; margin-top: 5px;">
-                鍙~鏈�澶ч噾棰濅负锛毬{ maxInvoiceAmount.toFixed(2) }}鍏�
-              </div>
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="30">
-          <el-col :span="12">
-            <el-form-item label="寮�绁ㄤ汉锛�" prop="invoicePerson">
-              <el-input v-model="form.invoicePerson" placeholder="璇疯緭鍏�" clearable disabled />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="寮�绁ㄦ棩鏈燂細" prop="invoiceDate">
-              <el-date-picker style="width: 100%" v-model="form.invoiceDate" value-format="YYYY-MM-DD"
-                format="YYYY-MM-DD" type="date" placeholder="璇烽�夋嫨" clearable />
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="30">
-          <el-col :span="24">
-            <el-form-item label="闄勪欢鏉愭枡锛�" prop="remark">
-              <el-upload v-model:file-list="fileList" :action="upload.url" multiple ref="fileUpload" auto-upload
-                :headers="upload.headers" accept=".pdf" :limit="10" :before-upload="handleBeforeUpload"
-                :on-error="handleUploadError" :on-success="handleUploadSuccess">
-                <el-button type="primary">涓婁紶</el-button>
-                <template #tip>
-                  <!--                  鏂囦欢鏍煎紡鏀寔 doc锛宒ocx锛寈ls锛寈lsx锛宲pt锛宲ptx锛宲df锛宼xt锛寈ml锛宩pg锛宩peg锛宲ng锛実if锛宐mp锛宺ar锛寊ip锛�7z-->
-                  <div class="el-upload__tip">鏂囦欢鏍煎紡鏀寔 pdf</div>
-                </template>
-              </el-upload>
-            </el-form-item>
-          </el-col>
-        </el-row>
-      </el-form>
-    </FormDialog>
-    <el-dialog title="涓婁紶寮圭獥" width="50%" v-model="uploadModal">
-      <el-row :gutter="30">
-        <el-col :span="24">
-          <el-form-item label="闄勪欢鏉愭枡锛�" prop="remark">
-            <el-upload v-model:file-list="fileList" :action="upload.url" multiple ref="fileUpload" auto-upload
-              :headers="upload.headers" accept=".pdf" :limit="10" style="width: 100%" :on-exceed="handleExceed"
-              :before-upload="handleBeforeUpload" :on-error="handleUploadError" :on-success="handleUploadSuccess"
-              :on-remove="handleRemove">
-              <el-button type="primary">涓婁紶</el-button>
-              <template #tip>
-                <div class="el-upload__tip">鏂囦欢鏍煎紡浠呮敮鎸� pdf</div>
-              </template>
-            </el-upload>
-          </el-form-item>
-        </el-col>
-      </el-row>
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button @click="commiInvoicetFile" type="primary">纭</el-button>
-          <el-button @click="uploadModal = false">鍙栨秷</el-button>
-        </div>
-      </template>
-    </el-dialog>
-    <FileList v-if="fileDialogVisible"  v-model:visible="fileDialogVisible" record-type="invoice_registration_product" :record-id="recordId"  />
-  </div>
-</template>
-
-<script setup>
-import pagination from "@/components/PIMTable/Pagination.vue";
-import FormDialog from '@/components/Dialog/FormDialog.vue';
-import { ref } from "vue";
-import { Search } from "@element-plus/icons-vue";
-import { ElMessageBox } from "element-plus";
-import { getToken } from "@/utils/auth";
-import {
-  invoiceLedgerSaveOrUpdate,
-  invoiceLedgerProductInfo,
-  commitFile,
-  registrationProductPage,
-  delInvoiceLedgerByRegProductId,
-} from "@/api/salesManagement/invoiceLedger.js";
-import useUserStore from "@/store/modules/user.js";
-import useFormData from "@/hooks/useFormData";
-import dayjs from "dayjs";
-import { getCurrentDate } from "@/utils/index.js";
-const FileList = defineAsyncComponent(() => import("@/components/Dialog/FileList.vue"));
-
-const { proxy } = getCurrentInstance();
-const tableData = ref([]);
-const productData = ref([]);
-const selectedRows = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
-  current: 1,
-  size: 100,
-});
-const total = ref(0);
-const fileList = ref([]);
-const dialogFormVisible = ref(false);
-const data = reactive({
-  searchForm: {
-    searchText: "",
-    status: false,
-    invoiceDate: null,
-    invoiceDateStart: undefined,
-    invoiceDateEnd: undefined,
-    createTimeStart: "", // 褰曞叆鏃ユ湡
-  },
-  form: {
-    salesLedgerId: "",
-    customerId: "",
-    invoiceNo: "",
-    invoiceTotal: "",
-    taxRate: "",
-    invoicePerson: "",
-    invoiceDate: "",
-    customerName: "",
-    fileList: [],
-    createTime: "", // 褰曞叆鏃ユ湡
-  },
-  rules: {
-    salesLedgerId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
-    customerId: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
-    invoiceNo: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
-    invoiceAmount: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
-    taxRate: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
-    invoicePerson: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
-    invoiceDate: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
-    customerName: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
-  },
-});
-const { form, rules } = toRefs(data);
-const { form: searchForm, resetForm } = useFormData(data.searchForm);
-const currentId = ref("");
-const userStore = useUserStore();
-const maxInvoiceAmount = ref(0); // 鍙戠エ閲戦鏈�澶у��
-const upload = reactive({
-  // 涓婁紶鐨勫湴鍧�
-  url: import.meta.env.VITE_APP_BASE_API + "/invoiceLedger/uploadFile",
-  // 璁剧疆涓婁紶鐨勮姹傚ご閮�
-  headers: { Authorization: "Bearer " + getToken() },
-});
-const matchFileType = ref(["pdf"]);
-const uploadModal = ref(false);
-const formattedNumber = (row, column, cellValue) => {
-  return parseFloat(cellValue).toFixed(2);
-};
-const formatDate = (row, column, cellValue) => {
-  return dayjs(cellValue).format("YYYY-MM-DD HH:mm:ss");
-};
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
-  page.current = 1;
-  getList();
-};
-const paginationChange = (obj) => {
-  page.current = obj.page;
-  page.size = obj.limit;
-  getList();
-};
-const getList = () => {
-  tableLoading.value = true;
-  const { invoiceDate, ...rest } = searchForm;
-  // 灏嗚寖鍥存棩鏈熷瓧娈典紶閫掔粰鍚庣
-  const params = { ...rest, ...page };
-  // 绉婚櫎寮�绁ㄦ棩鏈熺殑榛樿鍊艰缃紝鍙繚鐣欒寖鍥存棩鏈熷瓧娈�
-  delete params.invoiceDate;
-  registrationProductPage(params).then((res) => {
-    tableLoading.value = false;
-    tableData.value = res.data.records;
-    total.value = res.data.total;
-  });
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
-  selectedRows.value = selection;
-};
-// 涓昏〃鍚堣鏂规硶
-const summarizeMainTable = (param) => {
-  return proxy.summarizeTable(param, ["invoiceTotal"], {
-    ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
-    futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
-  });
-};
-// 鎵撳紑寮规
-const openForm = (row) => {
-  form.value = {};
-  productData.value = [];
-  fileList.value = [];
-  currentId.value = row.id;
-
-  invoiceLedgerProductInfo({ id: row.id }).then((res) => {
-    form.value = { ...res.data };
-    fileList.value = res.data.fileList;
-    // 淇濆瓨ticketRegistrationId鍒拌〃鍗曟暟鎹腑
-    if (row.ticketRegistrationId) {
-      form.value.ticketRegistrationId = row.ticketRegistrationId;
-    }
-    if (!form.value.invoicePerson) {
-      form.value.invoicePerson = userStore.nickName;
-    }
-    
-    // 璁$畻鍙戠エ閲戦鏈�澶у�硷細noInvoiceAmount + invoiceAmount
-    const noInvoiceAmount = parseFloat(res.data.noInvoiceAmount || 0);
-    const invoiceAmount = parseFloat(res.data.invoiceAmount || 0);
-    maxInvoiceAmount.value = noInvoiceAmount + invoiceAmount;
-  });
-  dialogFormVisible.value = true;
-};
-// 涓婁紶澶氫釜鏂囦欢灏辫鐩栧師鏉ョ殑
-const handleExceed = (files) => {
-  proxy.$refs["fileUpload"].clearFiles();
-  const file = files[0];
-  file.uid = genFileId();
-  proxy.$refs["fileUpload"].handleStart(file);
-};
-// 涓婁紶鍓嶆牎妫�
-function handleBeforeUpload(file) {
-  // 鏍℃鏂囦欢澶у皬
-  if (file.size > 1024 * 1024 * 10) {
-    proxy.$modal.msgError("涓婁紶鏂囦欢澶у皬涓嶈兘瓒呰繃10MB!");
-    return false;
-  }
-  // 鍒ゆ柇鏂囦欢鏍煎紡鏄惁绗﹀悎
-  const fileType = file.name.split(".").pop().toLowerCase();
-  if (!matchFileType.value.includes(fileType)) {
-    proxy.$modal.msgError("鏂囦欢鏍煎紡涓嶅尮閰�");
-    return false;
-  }
-  proxy.$modal.loading("姝e湪涓婁紶鏂囦欢锛岃绋嶅��...");
-  return true;
-}
-// 涓婁紶澶辫触
-function handleUploadError(err) {
-  proxy.$modal.msgError("涓婁紶鏂囦欢澶辫触");
-  proxy.$modal.closeLoading();
-}
-// 涓婁紶鎴愬姛鍥炶皟
-function handleUploadSuccess(res, file, uploadFiles) {
-  proxy.$modal.closeLoading();
-  if (res.code === 200) {
-    proxy.$modal.msgSuccess("涓婁紶鎴愬姛");
-    // 灏嗕笂浼犳垚鍔熺殑鏂囦欢淇℃伅娣诲姞鍒癴ileList涓�
-    const fileInfo = {
-      name: file.name,
-      url: res.data.url || file.response?.data?.url || file.url,
-      response: file.response
-    };
-    // 妫�鏌ユ槸鍚﹀凡瀛樺湪鐩稿悓鏂囦欢锛岄伩鍏嶉噸澶嶆坊鍔�
-    const existingFileIndex = fileList.value.findIndex(f => f.name === fileInfo.name);
-    if (existingFileIndex === -1) {
-      fileList.value.push(fileInfo);
-    } else {
-      fileList.value[existingFileIndex] = fileInfo;
-    }
-    // 纭繚琛ㄥ崟鏁版嵁涓殑fileList涔熸洿鏂�
-    form.value.fileList = fileList.value;
-  } else {
-    proxy.$modal.msgError(res.msg);
-    proxy.$refs.fileUpload.handleRemove(file);
-  }
-}
-// 鎻愪氦琛ㄥ崟
-const submitForm = () => {
-  proxy.$refs["formRef"].validate((valid) => {
-    if (valid) {
-      form.value.fileList = fileList.value;
-      invoiceLedgerSaveOrUpdate(form.value).then((res) => {
-        proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
-        closeDia();
-        getList();
-      });
-    }
-  });
-};
-// 鍏抽棴寮规
-const closeDia = () => {
-  proxy.resetForm("formRef");
-  dialogFormVisible.value = false;
-};
-// 瀵煎嚭
-const handleOut = () => {
-  ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
-    confirmButtonText: "纭",
-    cancelButtonText: "鍙栨秷",
-    type: "warning",
-  })
-    .then(() => {
-      proxy.download("/invoiceLedger/export", {}, "寮�绁ㄥ彴璐�.xlsx");
-    })
-    .catch(() => {
-      proxy.$modal.msg("宸插彇娑�");
-    });
-};
-
-// 纭鏂囦欢涓婁紶
-const commiInvoicetFile = () => {
-  const object = {
-    fileList: fileList.value,
-    id: currentId.value,
-  };
-  commitFile(object).then((res) => {
-    if (res.code === 200) {
-      proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
-      uploadModal.value = false;
-    }
-    getList();
-    currentId.value = "";
-    fileList.value = [];
-  });
-};
-// 鍒犻櫎寮�绁ㄥ彴璐�
-const delInvoiceLedger = (row) => {
-  ElMessageBox.confirm("璇ュ彂绁ㄥ彴璐﹀皢琚垹闄�,鏄惁纭鍒犻櫎", {
-    confirmButtonText: "纭",
-    cancelButtonText: "鍙栨秷",
-    type: "warning",
-  })
-    .then(() => {
-      delInvoiceLedgerByRegProductId(row.id).then((res) => {
-				proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
-        getList();
-      });
-    })
-    .catch(() => {
-      proxy.$modal.msg("宸插彇娑�");
-    });
-};
-
-const changeDateRange = (date) => {
-  if (date) {
-    searchForm.invoiceDateStart = date[0];
-    searchForm.invoiceDateEnd = date[1];
-    getList();
-  }
-};
-
-const clearRange = () => {
-  searchForm.invoiceDate = [];
-  searchForm.invoiceDateStart = undefined;
-  searchForm.invoiceDateEnd = undefined;
-  getList();
-};
-
-// 鎵撳紑闄勪欢寮圭獥
-const recordId =ref(0)
-const fileDialogVisible = ref(false)
-
-// 鎵撳紑闄勪欢寮规
-const openFileDialog = async (row) => {
-  recordId.value = row.id
-  fileDialogVisible.value = true
-}
-
-onMounted(() => {
-  getList();
-});
-</script>
-
-<style scoped lang="scss">
-.table_list {
-  margin-top: unset;
-}
-</style>
diff --git a/src/views/salesManagement/invoiceRegistration/index.vue b/src/views/salesManagement/invoiceRegistration/index.vue
deleted file mode 100644
index 44e1c4e..0000000
--- a/src/views/salesManagement/invoiceRegistration/index.vue
+++ /dev/null
@@ -1,814 +0,0 @@
-<template>
-	<div class="app-container">
-		<div class="search_form">
-			<el-form :inline="true" :model="searchForm">
-				<el-form-item label="瀹㈡埛鍚嶇О">
-					<el-input
-						v-model="searchForm.customerName"
-						style="width: 240px"
-						placeholder="璇疯緭鍏ュ悕绉版悳绱�"
-						clearable
-						:prefix-icon="Search"
-						@change="handleQuery"
-					/>
-				</el-form-item>
-				<el-form-item>
-					<el-checkbox
-						v-model="searchForm.status"
-						label="涓嶆樉绀烘湭寮�绁ㄩ噾棰濅负0"
-						@change="handleQuery"
-					/>
-				</el-form-item>
-				<el-form-item>
-					<el-button type="primary" @click="handleQuery"> 鎼滅储 </el-button>
-					<el-button @click="resetForm"> 閲嶇疆 </el-button>
-					<el-button @click="handleExport" style="margin-right: 10px">瀵煎嚭</el-button>
-				</el-form-item>
-			</el-form>
-		</div>
-		<div class="table_list">
-			<div class="flex justify-between">
-				<div></div>
-				<div>
-					<el-button 
-						type="primary" 
-						@click="openForm" 
-						style="margin-bottom: 8px"
-						:disabled="!canInvoice"
-					>
-						寮�绁ㄧ櫥璁�
-					</el-button>
-				</div>
-			</div>
-			<el-table
-				:data="tableData"
-				:border="true"
-				height="calc(100vh - 21em)"
-				v-loading="tableLoading"
-				:expand-row-keys="expandedRowKeys"
-				:row-key="(row) => row.id"
-				show-summary
-				:summary-method="summarizeMainTable"
-				@expand-change="expandChange"
-				@selection-change="handleSelectionChange"
-			>
-				<el-table-column align="center" type="selection" width="55" />
-				<el-table-column type="expand">
-					<template #default="props">
-						<el-table
-							:data="props.row.children"
-							border
-							show-summary
-							:summary-method="summarizeChildrenTable"
-						>
-							<el-table-column
-								align="center"
-								label="搴忓彿"
-								type="index"
-								width="60"
-							/>
-							<el-table-column label="浜у搧澶х被" prop="productCategory" />
-							<el-table-column
-								label="瑙勬牸鍨嬪彿"
-								prop="specificationModel"
-								width="150"
-							/>
-							<el-table-column label="鍗曚綅" prop="unit" width="70" />
-							<el-table-column label="鏁伴噺" prop="quantity" width="70" />
-							<el-table-column label="绋庣巼(%)" prop="taxRate" width="80" />
-							<el-table-column
-								label="鍚◣鍗曚环(鍏�)"
-								prop="taxInclusiveUnitPrice"
-								:formatter="formattedNumber"
-							/>
-							<el-table-column
-								label="鍚◣鎬讳环(鍏�)"
-								prop="taxInclusiveTotalPrice"
-								:formatter="formattedNumber"
-							/>
-							<el-table-column
-								label="涓嶅惈绋庢�讳环(鍏�)"
-								prop="taxExclusiveTotalPrice"
-								:formatter="formattedNumber"
-							/>
-							<el-table-column
-								label="寮�绁ㄦ暟"
-								prop="invoiceNum"
-								:formatter="formattedNumber"
-							/>
-							<el-table-column
-								label="寮�绁ㄩ噾棰�(鍏�)"
-								prop="invoiceAmount"
-								:formatter="formattedNumber"
-							/>
-							<el-table-column
-								label="鏈紑绁ㄦ暟"
-								prop="noInvoiceNum"
-								:formatter="formattedNumber"
-							/>
-							<el-table-column
-								label="鏈紑绁ㄩ噾棰�(鍏�)"
-								prop="noInvoiceAmount"
-								:formatter="formattedNumber"
-							/>
-						</el-table>
-					</template>
-				</el-table-column>
-				<el-table-column align="center" label="搴忓彿" type="index" width="60" />
-				<el-table-column
-					label="閿�鍞悎鍚屽彿"
-					prop="salesContractNo"
-					show-overflow-tooltip
-				/>
-<!--				<el-table-column-->
-<!--					label="瀹㈡埛鍚堝悓鍙�"-->
-<!--					prop="customerContractNo"-->
-<!--					width="200"-->
-<!--					show-overflow-tooltip-->
-<!--				/>-->
-				<el-table-column
-					label="瀹㈡埛鍚嶇О"
-					prop="customerName"
-					show-overflow-tooltip
-				/>
-				<el-table-column label="涓氬姟鍛�" prop="salesman" show-overflow-tooltip/>
-				<el-table-column
-					label="鍚堝悓閲戦(鍏�)"
-					prop="contractAmount"
-					show-overflow-tooltip
-					:formatter="formattedNumber"
-				
-				/>
-				<el-table-column
-					label="宸插紑绁ㄩ噾棰�(鍏�)"
-					prop="invoiceTotal"
-					show-overflow-tooltip
-					:formatter="formattedNumber"
-				/>
-				<el-table-column
-					label="鏈紑绁ㄩ噾棰�(鍏�)"
-					prop="noInvoiceAmountTotal"
-					show-overflow-tooltip
-					width="120"
-				>
-					<template #default="{ row, column }">
-						<el-text type="danger">
-							{{ formattedNumber(row, column, row.noInvoiceAmountTotal) }}
-						</el-text>
-					</template>
-				</el-table-column>
-			</el-table>
-			<pagination
-				v-show="total > 0"
-				:total="total"
-				layout="total, sizes, prev, pager, next, jumper"
-				:page="page.current"
-				:limit="page.size"
-				@pagination="paginationChange"
-			/>
-		</div>
-		<FormDialog
-			v-model="dialogFormVisible"
-			title="鏂板寮�绁ㄧ櫥璁伴〉闈�"
-			:width="'85%'"
-			@close="closeDia"
-			@confirm="submitForm"
-			@cancel="closeDia"
-		>
-			<el-form
-				:model="form"
-				label-width="140px"
-				label-position="top"
-				:rules="rules"
-				ref="formRef"
-			>
-				<el-row :gutter="30">
-					<el-col :span="12">
-						<el-form-item label="閿�鍞悎鍚屽彿锛�" prop="salesContractNo">
-							<el-input v-model="form.salesContractNo" disabled placeholder="澶氬悎鍚屾壒閲忓鐞嗭紙鍏蜂綋鍚堝悓鍙疯浜у搧鍒楄〃锛�"></el-input>
-						</el-form-item>
-					</el-col>
-					<el-col :span="12">
-						<el-form-item label="瀹㈡埛鍚嶇О锛�" prop="customerName">
-							<el-input
-								v-model="form.customerName"
-								placeholder="鑷姩濉厖"
-								disabled
-							></el-input>
-						</el-form-item>
-					</el-col>
-				</el-row>
-				<el-row :gutter="30">
-					<el-col :span="12">
-						<el-form-item label="涓氬姟鍛橈細" prop="salesman">
-							<el-input
-								v-model="form.salesman"
-								placeholder="鑷姩濉厖"
-								disabled
-							/>
-						</el-form-item>
-					</el-col>
-					<el-col :span="12">
-						<el-form-item label="鍙戠エ鍙风爜锛�" prop="invoiceNo">
-							<el-input
-								v-model="form.invoiceNo"
-								placeholder="璇疯緭鍏�"
-								clearable
-							/>
-						</el-form-item>
-					</el-col>
-				</el-row>
-				<el-row :gutter="30">
-					<el-col :span="12">
-						<el-form-item label="寮�绁ㄦ棩鏈�" prop="issueDate">
-							<el-date-picker
-								style="width: 100%"
-								v-model="form.issueDate"
-								type="date"
-								placeholder="璇烽�夋嫨"
-								clearable
-								format="YYYY-MM-DD"
-								value-format="YYYY-MM-DD"
-							/>
-						</el-form-item>
-					</el-col>
-				</el-row>
-				<el-row :gutter="30">
-					<el-col :span="12">
-						<el-form-item label="褰曞叆浜�" prop="createUer">
-							<el-input v-model="form.createUer" placeholder="璇疯緭鍏ュ綍鍏ヤ汉" />
-						</el-form-item>
-					</el-col>
-					<el-col :span="12">
-						<el-form-item label="褰曞叆鏃ユ湡锛�" prop="createTime">
-							<el-date-picker
-								style="width: 100%"
-								v-model="form.createTime"
-								type="date"
-								placeholder="璇烽�夋嫨"
-								clearable
-							/>
-						</el-form-item>
-					</el-col>
-					
-				</el-row>
-				<el-row>
-					<el-form-item label="浜у搧淇℃伅锛�" prop="entryDate"> </el-form-item>
-				</el-row>
-				<el-table
-					:data="productData"
-					border
-					show-summary
-					:summary-method="summarizeChildrenTable"
-				>
-					<el-table-column
-						align="center"
-						label="搴忓彿"
-						type="index"
-						width="60"
-					/>
-					<el-table-column label="鎵�灞炲悎鍚�" prop="salesContractNo" width="200">
-						<template #default="{ row }">
-							<el-tag type="primary">{{ row.salesContractNo }}</el-tag>
-						</template>
-					</el-table-column>
-					<el-table-column label="浜у搧澶х被" prop="productCategory" />
-					<el-table-column
-						label="瑙勬牸鍨嬪彿"
-						prop="specificationModel"
-						width="150"
-					/>
-					<el-table-column label="鍗曚綅" prop="unit" />
-					<el-table-column label="鏁伴噺" prop="quantity" width="70" />
-					<el-table-column label="绋庣巼(%)" prop="taxRate" width="80" />
-					<el-table-column
-						label="鍚◣鍗曚环(鍏�)"
-						prop="taxInclusiveUnitPrice"
-						:formatter="formattedNumber"
-						width="200"
-					/>
-					<el-table-column
-						label="鍚◣鎬讳环(鍏�)"
-						prop="taxInclusiveTotalPrice"
-						:formatter="formattedNumber"
-						width="200"
-					/>
-					<el-table-column
-						label="涓嶅惈绋庢�讳环(鍏�)"
-						prop="taxExclusiveTotalPrice"
-						:formatter="formattedNumber"
-						width="150"
-					/>
-					<el-table-column label="鏈寮�绁ㄦ暟" prop="currentInvoiceNum" width="180">
-						<template #default="scope">
-							<el-input-number 
-								:step="0.1" 
-								:min="0" 
-								style="width: 100%"
-								:precision="2"
-								v-model="scope.row.currentInvoiceNum"
-								@change="invoiceNumBlur(scope.row)"
-								:disabled="isProductInvoiceDisabled(scope.row)"
-							></el-input-number>
-						</template>
-					</el-table-column>
-					<el-table-column
-						label="鏈寮�绁ㄩ噾棰�(鍏�)"
-						prop="currentInvoiceAmount"
-						width="180"
-					>
-						<template #default="scope">
-							<el-input-number 
-								:step="0.01" 
-								:min="0" 
-								style="width: 100%"
-								:precision="2"
-								v-model="scope.row.currentInvoiceAmount"
-								@change="invoiceAmountBlur(scope.row)"
-								:disabled="isProductInvoiceDisabled(scope.row)"
-							></el-input-number>
-						</template>
-					</el-table-column>
-					<el-table-column label="鏈紑绁ㄦ暟" prop="noInvoiceNum" width="120">
-						<template #default="scope">
-							<el-input
-								type="number"
-								min="0"
-								disabled
-								v-model="scope.row.noInvoiceNum"
-							></el-input>
-						</template>
-					</el-table-column>
-					<el-table-column
-						label="鏈紑绁ㄩ噾棰�(鍏�)"
-						prop="noInvoiceAmount"
-						width="200"
-					>
-						<template #default="scope">
-							<el-input
-								type="number"
-								min="0"
-								disabled
-								v-model="scope.row.noInvoiceAmount"
-								:formatter="formattedInputNumber"
-								:precision="2"
-								:step="0.01"
-							></el-input>
-						</template>
-					</el-table-column>
-					<el-table-column label="鐧昏浜�" prop="register" width="100">
-						<!-- <template #default="{ row }">
-							<el-input
-								v-model="row.register"
-								placeholder="璇疯緭鍏ョ櫥璁颁汉"
-								disabled
-							/>
-						</template> -->
-					</el-table-column>
-					<el-table-column label="鐧昏鏃ユ湡" prop="registerDate" width="150">
-						<!-- <template #default="{ row }">
-							<el-date-picker
-								style="width: 100%"
-								v-model="row.registerDate"
-								value-format="YYYY-MM-DD"
-								format="YYYY-MM-DD"
-								type="date"
-								placeholder="璇烽�夋嫨"
-								clearable
-								disabled
-							/>
-						</template> -->
-					</el-table-column>
-				</el-table>
-			</el-form>
-		</FormDialog>
-	</div>
-</template>
-
-<script setup>
-import pagination from "@/components/PIMTable/Pagination.vue";
-import FormDialog from '@/components/Dialog/FormDialog.vue';
-import { onMounted, ref, computed } from "vue";
-import { Search } from "@element-plus/icons-vue";
-import { ElMessageBox } from "element-plus";
-// import {userListNoPage} from "@/api/system/user.js";
-import {
-	getSalesLedgerWithProducts,
-	ledgerListPage,
-	productList,
-} from "@/api/salesManagement/salesLedger.js";
-import { invoiceRegistrationSave } from "@/api/salesManagement/invoiceRegistration.js";
-import useFormData from "@/hooks/useFormData";
-import useUserStore from "@/store/modules/user";
-import dayjs from "dayjs";
-
-const { proxy } = getCurrentInstance();
-const userStore = useUserStore();
-const tableData = ref([]);
-const productData = ref([]);
-const selectedRows = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
-	current: 1,
-	size: 100,
-});
-const total = ref(0);
-// 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
-const operationType = ref("");
-const dialogFormVisible = ref(false);
-const data = reactive({
-	searchForm: {
-		customerName: "",
-		status: false,
-		customerContractNo: undefined, // 瀹㈡埛鍚堝悓鍙�
-		projectName: undefined, // 椤圭洰鍚嶇О
-		createUer: undefined, // 鐧昏浜�
-		issueDate: undefined, // 寮�绁ㄦ棩鏈�
-		createTime: undefined, // 褰曞叆鏃ユ湡锛�
-		productCategory: "",
-		isInvoice: 1
-	},
-	form: {
-		salesLedgerId: "",
-		customerName: "",
-		salesman: "",
-		projectName: "",
-		productData: [],
-		invoiceNo: "",
-		createUer: userStore.nickName,
-		issueDate: dayjs().format("YYYY-MM-DD"),
-		selectedContractIds: [], // 鏂板锛氬瓨鍌ㄦ墍鏈夐�変腑鐨勫悎鍚孖D
-		isBatch: false // 鏂板锛氭爣璇嗘槸鍚︿负鎵归噺鎿嶄綔
-	},
-	rules: {
-		createUer: [{ required: true, message: "璇烽�夋嫨", trigger: "blur" }],
-		issueDate: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
-		invoiceNo: [{ required: true, message: "璇疯緭鍏�", trigger: "change" }],
-		createTime: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
-	},
-});
-const { form, rules } = toRefs(data);
-const { form: searchForm, resetForm } = useFormData(data.searchForm);
-
-const formattedNumber = (row, column, cellValue) => {
-	if (cellValue == 0) {
-		return parseFloat(cellValue).toFixed(2);
-	}
-	if (cellValue) {
-		return parseFloat(cellValue).toFixed(2);
-	} else {
-		return cellValue;
-	}
-};
-
-const formattedInputNumber = (value) => {
-	return value ? parseFloat(value).toFixed(2) : 0;
-};
-
-// 鍒ゆ柇鏄惁鍙互寮�绁紙鍩轰簬閫変腑鐨勫彴璐︽暟鎹級
-const canInvoice = computed(() => {
-	if (selectedRows.value.length === 0) {
-		return false;
-	}
-	// 妫�鏌ユ墍鏈夐�変腑鐨勫彴璐︼紝鍙鏈変竴涓湭寮�绁ㄩ噾棰濆ぇ浜�0锛屽氨鍙互寮�绁�
-	return selectedRows.value.some(row => {
-		const noInvoiceAmount = parseFloat(row.noInvoiceAmountTotal || 0);
-		return noInvoiceAmount > 0;
-	});
-});
-
-// 鍒ゆ柇鍗曚釜浜у搧鏄惁鍙互寮�绁�
-const isProductInvoiceDisabled = (row) => {
-	// 妫�鏌ユ湭寮�绁ㄩ噾棰濆拰鏈紑绁ㄦ暟锛屽鏋滈兘涓�0鎴栧皬浜庣瓑浜�0锛屽垯绂佺敤
-	// 浼樺厛浣跨敤 tempnoInvoiceAmount 鍜� tempNoInvoiceNum锛堝垵濮嬪�硷級锛屽鏋滄病鏈夊垯浣跨敤 noInvoiceAmount 鍜� originalNoInvoiceNum
-	const noInvoiceAmount = parseFloat(row.tempnoInvoiceAmount || row.noInvoiceAmount || 0);
-	const noInvoiceNum = parseFloat(row.tempNoInvoiceNum || row.originalNoInvoiceNum || row.noInvoiceNum || 0);
-	return noInvoiceAmount <= 0 || noInvoiceNum <= 0;
-};
-
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
-	page.current = 1;
-	getList();
-};
-const paginationChange = (obj) => {
-	page.current = obj.page;
-	page.size = obj.limit;
-	getList();
-};
-const getList = () => {
-	tableLoading.value = true;
-	ledgerListPage({ ...searchForm, ...page }).then((res) => {
-		tableLoading.value = false;
-		tableData.value = res.records;
-		total.value = res.total;
-		expandedRowKeys.value = [];
-	});
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
-	console.log("selection", selection);
-	selectedRows.value = selection.filter(
-		(item) => item.salesContractNo !== undefined
-	);
-};
-const expandedRowKeys = ref([]);
-// 灞曞紑琛�
-const expandChange = (row, expandedRows) => {
-	if (expandedRows.length > 0) {
-		expandedRowKeys.value = [];
-		try {
-			productList({ salesLedgerId: row.id, type: 1 }).then((res) => {
-				const index = tableData.value.findIndex((item) => item.id === row.id);
-				if (index > -1) {
-					tableData.value[index].children = res.data;
-				}
-				expandedRowKeys.value.push(row.id);
-			});
-		} catch (error) {
-			console.log(error);
-		}
-	} else {
-		expandedRowKeys.value = [];
-	}
-};
-// 涓昏〃鍚堣鏂规硶
-const summarizeMainTable = (param) => {
-	return proxy.summarizeTable(param, [
-		"contractAmount",
-		"invoiceTotal",
-		"noInvoiceAmountTotal",
-	]);
-};
-// 瀛愯〃鍚堣鏂规硶
-const summarizeChildrenTable = (param) => {
-	return proxy.summarizeTable(param, [
-		"taxInclusiveUnitPrice",
-		"taxInclusiveTotalPrice",
-		"taxExclusiveTotalPrice",
-		"invoiceNum",
-		"invoiceAmount",
-		"currentInvoiceAmount",
-		"noInvoiceNum",
-		"noInvoiceAmount",
-		"currentInvoiceNum",
-	]);
-};
-// 鎵撳紑寮规
-const openForm = () => {
-	// 鍒ゆ柇鏄惁閫夋嫨浜嗗悎鍚�
-	if (selectedRows.value.length === 0) {
-		proxy.$modal.msgError("璇疯嚦灏戦�夋嫨涓�鏉″悎鍚�");
-		return;
-	}
-	
-	// 妫�鏌ユ墍鏈夐�夋嫨鐨勫悎鍚屾槸鍚﹀叿鏈夌浉鍚岀殑瀹㈡埛鍚嶇О
-	const firstRow = selectedRows.value[0];
-	const isSameCustomer = selectedRows.value.every(row =>
-		row.customerName === firstRow.customerName
-	);
-	
-	if (!isSameCustomer) {
-		proxy.$modal.msgError("璇烽�夋嫨鐩稿悓瀹㈡埛鍚嶇О鐨勫悎鍚�");
-		return;
-	}
-	
-	// 鍏佽涓嶅悓鐨勯攢鍞悎鍚屽彿鎵归噺澶勭悊锛屾棤闇�妫�鏌ラ噸澶�
-	
-	form.value = {};
-	productData.value = [];
-	
-	// 鍔犺浇鎵�鏈夐�変腑鍚堝悓鐨勪骇鍝佹暟鎹�
-	const promises = selectedRows.value.map(row =>
-		getSalesLedgerWithProducts({ id: row.id })
-	);
-	
-	Promise.all(promises).then(results => {
-		// 鍚堝苟鎵�鏈夊悎鍚岀殑浜у搧鏁版嵁锛屽苟涓烘瘡涓骇鍝佹坊鍔犲搴旂殑鍚堝悓淇℃伅
-		const allProductData = [];
-		results.forEach((result, index) => {
-			const contract = selectedRows.value[index];
-			// const contractId = contract.id;
-			if (result.productData) {
-				result.productData.forEach(item => {
-					allProductData.push({
-						...item,
-						// id: contractId, // 鏄庣‘璁剧疆鍚堝悓ID
-						salesContractNo: contract.salesContractNo, // 娣诲姞閿�鍞悎鍚屽彿
-						customerName: contract.customerName, // 娣诲姞瀹㈡埛鍚嶇О
-						customerContractNo: contract.customerContractNo // 娣诲姞瀹㈡埛鍚堝悓鍙�
-					});
-				});
-			}
-		});
-		
-		// 璁剧疆琛ㄥ崟鏁版嵁锛堜娇鐢ㄧ涓�涓悎鍚岀殑鍩烘湰淇℃伅锛岄攢鍞悎鍚屽彿鐣欑┖锛�
-		form.value = { ...results[0] };
-		form.value.createTime = dayjs().format("YYYY-MM-DD");
-		form.value.issueDate = dayjs().format("YYYY-MM-DD");
-		form.value.createUer = userStore.nickName;
-		form.value.selectedContractIds = selectedRows.value.map(row => row.id); // 瀛樺偍鎵�鏈夐�変腑鐨勫悎鍚孖D
-		form.value.salesContractNo = ""; // 閿�鍞悎鍚屽彿鐣欑┖锛屽洜涓轰細鍦ㄤ骇鍝佽〃鏍间腑鍒嗗埆鏄剧ず
-		
-		productData.value = allProductData;
-		
-		// 瀵逛簬涓嶈兘寮�绁ㄧ殑浜у搧锛屽皢寮�绁ㄦ暟鍜屽紑绁ㄩ噾棰濊缃负0
-		productData.value.forEach(item => {
-			if (isProductInvoiceDisabled(item)) {
-				item.currentInvoiceNum = 0;
-				item.currentInvoiceAmount = 0;
-			}
-		});
-		
-		dialogFormVisible.value = true;
-		console.log("productData.value ", productData.value);
-	});
-};
-// 鎻愪氦琛ㄥ崟
-const submitForm = () => {
-	proxy.$refs["formRef"].validate((valid) => {
-		if (valid) {
-			// 濡傛灉鏄壒閲忔搷浣滐紝灏嗘墍鏈夊悎鍚岀殑鏁版嵁鏀惧湪涓�涓暟缁勯噷锛屽彧璋冪敤涓�娆℃帴鍙�
-			if (selectedRows.value.length > 1) {
-				// 鍒涘缓鍖呭惈鎵�鏈夊悎鍚屾暟鎹殑鏁扮粍
-				const batchData = selectedRows.value.map(contract => {
-					// 绛涢�夊嚭灞炰簬褰撳墠鍚堝悓鐨勪骇鍝佹暟鎹�
-					const contractProductData = productData.value.filter(item =>
-						item.salesLedgerId === contract.id
-					);
-					
-					// 涓烘瘡涓攢鍞悎鍚屽彿鍒涘缓鐙珛鐨勫璞�
-					return {
-						// 鍩虹琛ㄥ崟鏁版嵁
-						issueDate: form.value.issueDate,
-						createTime: form.value.createTime,
-						createUer: form.value.createUer,
-						invoiceNo: form.value.invoiceNo,
-						
-						// 鍚堝悓瀹為檯淇℃伅
-						id: contract.id, // 浣跨敤id浣滀负瀛楁鍚嶏紝鍊间负salesLedgerId
-						salesContractNo: contract.salesContractNo, // 浣跨敤瀹為檯鐨勯攢鍞悎鍚屽彿
-						customerName: contract.customerName, // 浣跨敤瀹為檯鐨勫鎴峰悕绉�
-						customerId: contract.customerId, // 娣诲姞瀹㈡埛ID
-						customerContractNo: contract.customerContractNo, // 浣跨敤瀹為檯鐨勫鎴峰悎鍚屽彿
-						projectName: contract.projectName, // 浣跨敤瀹為檯鐨勯」鐩悕绉�
-						salesman: contract.salesman, // 浣跨敤瀹為檯鐨勪笟鍔″憳
-						
-						// 浜у搧鏁版嵁
-						productData: proxy.HaveJson(contractProductData),
-						
-						// 鎵归噺鏍囪瘑
-						isBatch: true
-					};
-				});
-				
-				// 鍙皟鐢ㄤ竴娆℃帴鍙o紝浼犻�掑寘鍚墍鏈夊悎鍚屾暟鎹殑鏁扮粍
-				invoiceRegistrationSave(batchData).then(() => {
-					proxy.$modal.msgSuccess("鎵归噺鏂板鎴愬姛");
-					closeDia();
-					getList();
-				});
-			} else {
-				// 鍗曚釜鍚堝悓鎻愪氦閫昏緫 - 涔熶互鏁扮粍褰㈠紡浼犻��
-				const singleContract = selectedRows.value[0];
-				const singleFormArray = [
-					{
-						// 鍩虹琛ㄥ崟鏁版嵁
-						issueDate: form.value.issueDate,
-						createTime: form.value.createTime,
-						createUer: form.value.createUer,
-						invoiceNo: form.value.invoiceNo,
-						
-						// 鍚堝悓瀹為檯淇℃伅
-						id: singleContract.id, // 浣跨敤id浣滀负瀛楁鍚嶏紝鍊间负salesLedgerId
-						salesContractNo: singleContract.salesContractNo, // 浣跨敤瀹為檯鐨勯攢鍞悎鍚屽彿
-						customerName: singleContract.customerName, // 浣跨敤瀹為檯鐨勫鎴峰悕绉�
-						customerId: singleContract.customerId, // 娣诲姞瀹㈡埛ID
-						customerContractNo: singleContract.customerContractNo, // 浣跨敤瀹為檯鐨勫鎴峰悎鍚屽彿
-						projectName: singleContract.projectName, // 浣跨敤瀹為檯鐨勯」鐩悕绉�
-						salesman: singleContract.salesman, // 浣跨敤瀹為檯鐨勪笟鍔″憳
-						
-						// 浜у搧鏁版嵁
-						productData: proxy.HaveJson(productData.value),
-						
-						// 鎵归噺鏍囪瘑
-						isBatch: false
-					}
-				];
-				invoiceRegistrationSave(singleFormArray).then((res) => {
-					proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
-					closeDia();
-					getList();
-				});
-			}
-		}
-	});
-};
-// 鍏抽棴寮规
-const closeDia = () => {
-	proxy.resetForm("formRef");
-	dialogFormVisible.value = false;
-};
-// 瀵煎嚭
-const handleOut = () => {
-	ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
-		confirmButtonText: "纭",
-		cancelButtonText: "鍙栨秷",
-		type: "warning",
-	})
-		.then(() => {
-			proxy.download("/invoiceRegistration/export", {}, "寮�绁ㄧ櫥璁颁俊鎭�.xlsx");
-		})
-		.catch(() => {
-			proxy.$modal.msg("宸插彇娑�");
-		});
-};
-
-// 瀵煎嚭閿�鍞彴璐�
-const handleExport = () => {
-	ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
-		confirmButtonText: "纭",
-		cancelButtonText: "鍙栨秷",
-		type: "warning",
-	})
-		.then(() => {
-			proxy.download("/sales/ledger/exportOne", { ...searchForm, ...page }, "寮�绁ㄧ櫥璁�.xlsx");
-		})
-		.catch(() => {
-			proxy.$modal.msg("宸插彇娑�");
-		});
-};
-
-//鏈寮�绁ㄥけ鐒︽搷浣�
-const invoiceNumBlur = (row) => {
-	if (!row.currentInvoiceNum) {
-		row.currentInvoiceNum = 0;
-	}
-	if (row.currentInvoiceNum > row.tempNoInvoiceNum) {
-		proxy.$modal.msgWarning("鏈寮�绁ㄦ暟涓嶅緱澶т簬鏈紑绁ㄦ暟");
-		row.currentInvoiceNum = 0;
-	}
-	// 璁$畻鏈寮�绁ㄩ噾棰�
-	row.currentInvoiceAmount = (
-		row.currentInvoiceNum * row.taxInclusiveUnitPrice
-	).toFixed(2);
-	// 璁$畻鏈紑绁ㄦ暟
-	row.noInvoiceNum = (row.originalNoInvoiceNum - row.currentInvoiceNum).toFixed(
-		2
-	);
-	// 璁$畻鏈紑绁ㄩ噾棰�
-	row.noInvoiceAmount = (
-		row.tempnoInvoiceAmount - row.currentInvoiceAmount
-	).toFixed(2);
-};
-// 鏈寮�绁ㄩ噾棰濆け鐒︽搷浣�
-const invoiceAmountBlur = (row) => {
-	if (!row.currentInvoiceAmount) {
-		row.currentInvoiceAmount = 0;
-	}
-	// 璁$畻鏄惁瓒呰繃寮�绁ㄦ�婚噾棰�
-	if (row.currentInvoiceAmount > row.tempnoInvoiceAmount) {
-		proxy.$modal.msgWarning("鏈寮�绁ㄩ噾棰濅笉寰楀ぇ浜庢湭寮�绁ㄩ噾棰�");
-		row.currentInvoiceAmount = 0;
-	}
-	// 璁$畻鏈寮�绁ㄦ暟
-	row.currentInvoiceNum = (
-		row.currentInvoiceAmount / row.taxInclusiveUnitPrice
-	).toFixed(2);
-	console.log("row.currentInvoiceNum ", row.currentInvoiceNum);
-	console.log(" row.originalNoInvoiceNum  ", row.originalNoInvoiceNum);
-	// 璁$畻鏈紑绁ㄦ暟
-	row.noInvoiceNum = (row.originalNoInvoiceNum - row.currentInvoiceNum).toFixed(
-		2
-	);
-	// 璁$畻鏈紑绁ㄩ噾棰�
-	row.noInvoiceAmount = (
-		row.tempnoInvoiceAmount - row.currentInvoiceAmount
-	).toFixed(2);
-};
-
-onMounted(() => {
-	getList();
-});
-</script>
-
-<style scoped lang="scss">
-.table_list {
-	margin-top: unset;
-}
-.flex {
-	display: flex;
-}
-.justify-between {
-	justify-content: space-between;
-}
-:deep(.el-checkbox__label) {
-	font-weight: bold;
-}
-</style>
-
-
-
-
-
diff --git a/src/views/salesManagement/receiptPayment/index.vue b/src/views/salesManagement/receiptPayment/index.vue
deleted file mode 100644
index 25bd280..0000000
--- a/src/views/salesManagement/receiptPayment/index.vue
+++ /dev/null
@@ -1,605 +0,0 @@
-<template>
-  <div class="app-container">
-    <div class="search_form">
-      <el-form :inline="true" :model="searchForm" style="width: 100%">
-        <el-row justify="space-between">
-          <el-col :span="24">
-            <el-form-item label="瀹㈡埛鍚嶇О">
-              <el-input
-                v-model="searchForm.customerName"
-                placeholder="璇疯緭鍏�"
-                @change="handleQuery"
-                clearable
-                prefix-icon="Search"
-              />
-            </el-form-item>
-            <el-form-item>
-              <el-checkbox
-                v-model="searchForm.status"
-                label="涓嶆樉绀哄緟鍥炴涓�0"
-                @change="handleQuery"
-              />
-            </el-form-item>
-            <el-form-item>
-              <el-button type="primary" @click="handleQuery"> 鎼滅储 </el-button>
-            </el-form-item>
-          </el-col>
-        </el-row>
-      </el-form>
-    </div>
-    <div class="table_list">
-      <div class="actions">
-        <div></div>
-        <div>
-          <el-button type="primary" @click="openForm('add')">
-            鏂板鍥炴
-          </el-button>
-          <el-button icon="Download" @click="handleOut"> 瀵煎嚭 </el-button>
-        </div>
-      </div>
-      <el-table
-        :data="tableData"
-        border
-        ref="tableRef"
-        v-loading="tableLoading"
-        @selection-change="handleSelectionChange"
-        :row-key="(row) => row.id"
-        show-summary
-        :summary-method="summarizeMainTable"
-        :expand-row-keys="expandedRowKeys"
-        @expand-change="expandChange"
-
-        height="calc(100vh - 21.5em)"
-      >
-        <el-table-column align="center" type="selection" width="55" />
-        <el-table-column type="expand">
-          <template #default="props">
-            <el-table
-              :data="props.row.children"
-              border
-              show-summary
-              :summary-method="summarizeChildrenTable"
-            >
-              <el-table-column
-                align="center"
-                label="搴忓彿"
-                type="index"
-                width="60"
-              />
-              <el-table-column label="鍥炴鏃ユ湡" prop="receiptPaymentDate"  width="130"/>
-              <el-table-column label="鍥炴閲戦" prop="receiptPaymentAmount">
-                <template #default="scope">
-									<el-input-number :step="0.01" :min="0" style="width: 100%"
-																	 v-model="scope.row.receiptPaymentAmount"
-																	 :disabled="!scope.row.editType"
-																	 :precision="2"
-																	 placeholder="璇疯緭鍏�"
-																	 clearable
-									/>
-                </template>
-              </el-table-column>
-              <el-table-column label="鍥炴鏂瑰紡" prop="receiptPaymentType">
-                <template #default="scope">
-                  <el-select
-                    v-model="scope.row.receiptPaymentType"
-                    placeholder="璇烽�夋嫨"
-                    clearable
-                    :disabled="!scope.row.editType"
-                  >
-                    <el-option
-                      v-for="item in receipt_payment_type"
-                      :key="item.value"
-                      :label="item.label"
-                      :value="item.value"
-                    />
-                  </el-select>
-                </template>
-              </el-table-column>
-              <el-table-column label="鐧昏浜�" prop="registrant" width="90"/>
-              <el-table-column label="鐧昏鏃ユ湡" prop="createTime"   width="130"/>
-              <el-table-column label="鎿嶄綔" width="150" align="center">
-                <template #default="scope">
-                  <el-button
-                    link
-                    type="primary"
-                    @click="changeEditType(scope.row)"
-                    v-if="!scope.row.editType"
-                    >缂栬緫</el-button
-                  >
-                  <el-button
-                    link
-                    type="primary"
-                    @click="saveReceiptPayment(scope.row)"
-                    v-if="scope.row.editType"
-                    >淇濆瓨</el-button
-                  >
-                  <el-button
-                    link
-                    type="primary"
-                    @click="delReceiptRecord(scope.row)"
-                    >鍒犻櫎</el-button
-                  >
-                </template>
-              </el-table-column>
-            </el-table>
-          </template>
-        </el-table-column>
-        <el-table-column align="center" label="搴忓彿" type="index" width="60" />
-        <el-table-column
-          label="閿�鍞悎鍚屽彿"
-          prop="salesContractNo"
-          show-overflow-tooltip
-          width="240"
-        />
-        <el-table-column
-          label="瀹㈡埛鍚嶇О"
-          prop="customerName"
-          show-overflow-tooltip
-          width="240"
-        />
-        <el-table-column
-          label="鍥炴鐘舵��"
-          prop="statusName"
-          width="120"
-        >
-          <template #default="{ row }">
-            <el-tag :type="getStatusTagType(row.statusName)" disable-transitions>
-              {{ row.statusName || "--" }}
-            </el-tag>
-          </template>
-        </el-table-column>
-        <el-table-column
-          label="浜у搧澶х被"
-          prop="productCategory"
-          show-overflow-tooltip
-          width="100"
-        />
-        <el-table-column
-          label="瑙勬牸鍨嬪彿"
-          prop="specificationModel"
-          show-overflow-tooltip
-          width="200"
-        />
-        <el-table-column label="绋庣巼(%)" prop="taxRate" show-overflow-tooltip />
-        <el-table-column
-          label="宸插洖娆鹃噾棰�(鍏�)"
-          prop="invoiceTotal"
-          show-overflow-tooltip
-          :formatter="formattedNumber"
-          width="200"
-        />
-        <el-table-column
-          label="寰呭洖娆鹃噾棰�(鍏�)"
-          prop="pendingInvoiceTotal"
-          show-overflow-tooltip
-          width="200"
-        >
-          <template #default="{ row, column }">
-            <el-text type="danger">
-              {{ formattedNumber(row, column, row.pendingInvoiceTotal) }}
-            </el-text>
-          </template>
-        </el-table-column>
-      </el-table>
-      <pagination
-        v-show="total > 0"
-        :total="total"
-        layout="total, sizes, prev, pager, next, jumper"
-        :page="page.current"
-        :limit="page.size"
-        @pagination="paginationChange"
-      />
-    </div>
-    <FormDialog
-      v-model="dialogFormVisible"
-      title="鏂板鍥炴椤甸潰"
-      :width="'90%'"
-      @close="closeDia"
-      @confirm="submitForm"
-      @cancel="closeDia"
-    >
-      <el-table
-        v-if="forms.length"
-        :data="forms"
-        border
-        style="width: 100%"
-        size="small"
-      >
-        <el-table-column type="index" label="搴忓彿" width="50" align="center"/>
-        <el-table-column label="閿�鍞悎鍚屽彿" prop="salesContractNo" show-overflow-tooltip />
-        <el-table-column label="瀹㈡埛鍚嶇О" prop="customerName" show-overflow-tooltip />
-				<el-table-column
-					label="浜у搧澶х被"
-					prop="productCategory"
-					show-overflow-tooltip
-					width="100"
-				/>
-				<el-table-column
-					label="瑙勬牸鍨嬪彿"
-					prop="specificationModel"
-					show-overflow-tooltip
-					width="200"
-				/>
-        <el-table-column label="绋庣巼(%)" width="110">
-          <template #default="{ row }">
-            <el-input v-model="row.taxRate" disabled />
-          </template>
-        </el-table-column>
-        <el-table-column
-          label="寰呭洖娆鹃噾棰�(鍏�)"
-          prop="pendingInvoiceTotal"
-          show-overflow-tooltip
-          width="170"
-        >
-          <template #default="{ row, column }">
-            <el-text type="danger">
-              {{ formattedNumber(row, column, row.pendingInvoiceTotal) }}
-            </el-text>
-          </template>
-        </el-table-column>
-        <el-table-column label="鏈鍥炴閲戦(鍏�)" width="180">
-          <template #default="{ row }">
-            <el-input-number
-              v-model="row.receiptPaymentAmount"
-              :step="0.01"
-              :min="0"
-              :max="Number(row.pendingInvoiceTotal || 0)"
-              :precision="2"
-              style="width: 100%"
-              placeholder="璇疯緭鍏�"
-            />
-          </template>
-        </el-table-column>
-        <el-table-column label="鍥炴褰㈠紡" width="160">
-          <template #default="{ row }">
-            <el-select v-model="row.receiptPaymentType" placeholder="璇烽�夋嫨" clearable>
-              <el-option
-                v-for="opt in receipt_payment_type"
-                :key="opt.value"
-                :label="opt.label"
-                :value="opt.value"
-              />
-            </el-select>
-          </template>
-        </el-table-column>
-        <el-table-column label="鍥炴鏃ユ湡" width="170">
-          <template #default="{ row }">
-            <el-date-picker
-              v-model="row.receiptPaymentDate"
-              value-format="YYYY-MM-DD"
-              format="YYYY-MM-DD"
-              type="date"
-              placeholder="璇烽�夋嫨"
-              style="width: 100%"
-            />
-          </template>
-        </el-table-column>
-        <el-table-column label="鐧昏浜�" width="140">
-          <template #default="{ row }">
-            <el-input v-model="row.registrant" />
-          </template>
-        </el-table-column>
-      </el-table>
-      <div v-else class="empty-tip">璇烽�夋嫨闇�瑕佸洖娆剧殑璁板綍</div>
-    </FormDialog>
-  </div>
-</template>
-
-<script setup>
-import pagination from "@/components/PIMTable/Pagination.vue";
-import FormDialog from '@/components/Dialog/FormDialog.vue';
-import { onMounted, ref, reactive, getCurrentInstance } from "vue";
-import {
-  receiptPaymentSaveOrUpdate,
-  bindInvoiceNoRegPage,
-  receiptPaymentHistoryListNoPage,
-  receiptPaymentDel,
-} from "../../../api/salesManagement/receiptPayment.js";
-import useUserStore from "@/store/modules/user";
-import { ElMessage, ElMessageBox } from "element-plus";
-import useFormData from "@/hooks/useFormData";
-
-const userStore = useUserStore();
-const { proxy } = getCurrentInstance();
-const tableData = ref([]);
-const selectedRows = ref([]);
-const tableLoading = ref(false);
-const forms = ref([]);
-const page = reactive({
-  current: 1,
-  size: 100,
-});
-const total = ref(0);
-const expandedRowKeys = ref([]);
-const tableRef = ref(null);
-
-// 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
-const dialogFormVisible = ref(false);
-const data = reactive({
-  searchForm: {
-    searchText: "",
-    status: true,
-    customerName: "",
-    specificationModel: "",
-  },
-});
-const { form: searchForm } = useFormData(data.searchForm);
-const { receipt_payment_type } = proxy.useDict("receipt_payment_type");
-
-const formattedNumber = (row, column, cellValue) => {
-  const val = Number(cellValue ?? 0);
-  return Number.isFinite(val) ? val.toFixed(2) : "0.00";
-};
-
-const getStatusTagType = (statusName = '') => {
-  const normalized = statusName.trim();
-  if (!normalized) return 'info';
-  return normalized === '鏈畬鎴愪粯娆�' ? 'danger' : 'success';
-};
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
-  page.current = 1;
-  getList();
-};
-const paginationChange = (obj) => {
-  page.current = obj.page;
-  page.size = obj.limit;
-  getList();
-};
-const getList = () => {
-  tableLoading.value = true;
-  bindInvoiceNoRegPage({ ...searchForm, ...page })
-    .then((res) => {
-      tableLoading.value = false;
-      tableData.value = res.data.records;
-      total.value = res.data.total;
-			if (expandedRowKeys.value.length > 0) {
-				const arr = []
-				const index = tableData.value.findIndex(item => item.id === expandedRowKeys.value[0]);
-				if (index > -1) {
-					arr.push(tableData.value[index]);
-					expandChange(tableData.value[index], arr)
-				}
-			}
-    })
-    .catch(() => {
-      tableLoading.value = false;
-    });
-};
-// 灞曞紑琛�
-const expandChange = (row, expandedRows) => {
-  if (expandedRows.length > 0) {
-    expandedRowKeys.value = [];
-    try {
-      receiptPaymentHistoryListNoPage({
-        invoiceLedgerId: row.id,
-        type: 1,
-      }).then((res) => {
-        const index = tableData.value.findIndex((item) => item.id === row.id);
-        if (index > -1) {
-          if (res?.length > 0) {
-            res.forEach((item) => {
-              item.editType = false;
-            });
-          }
-          tableData.value[index].children = res;
-        }
-        expandedRowKeys.value.push(row.id);
-      });
-    } catch (error) {
-      console.log(error);
-    }
-  } else {
-    expandedRowKeys.value = [];
-  }
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
-  console.log("selection", selection);
-  selectedRows.value = selection;
-};
-// 涓昏〃鍚堣鏂规硶
-const summarizeMainTable = (param) => {
-  return proxy.summarizeTable(
-    param,
-    ["receiptPaymentAmountTotal", "noReceiptAmount"],
-    {
-      ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
-      futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
-    }
-  );
-};
-// 瀛愯〃鍚堣鏂规硶
-const summarizeChildrenTable = (param) => {
-  return proxy.summarizeTable(param, ["receiptPaymentAmount"]);
-};
-// 鎵撳紑寮规
-const openForm = () => {
-  if (selectedRows.value.length === 0) {
-    proxy.$modal.msgError("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
-    return;
-  }
-  // 浠呭厑璁糕�滃緟鍥炴閲戦 > 0鈥濈殑璁板綍杩涘叆鏂板鍥炴寮圭獥锛屽苟杩囨护鎺夊彲鑳芥贩鍏ョ殑绌哄璞�
-  const validRows = selectedRows.value.filter((item) => {
-    if (!item || !item.id) return false;
-    return Number(item.pendingInvoiceTotal ?? 0) > 0;
-  });
-  if (validRows.length === 0) {
-    proxy.$modal.msgWarning("鎵�閫夎褰曞潎鏃犻渶鍥炴");
-    return;
-  }
-  forms.value = validRows.map((row) => ({
-    salesContractNo: row.salesContractNo || "",
-    customerName: row.customerName || "",
-    productCategory: row.productCategory || "",
-    specificationModel: row.specificationModel || "",
-    pendingInvoiceTotal: Number(row.pendingInvoiceTotal || 0),
-    taxRate: row.taxRate ?? "",
-    // 榛樿鏈鍥炴閲戦 = 寰呭洖娆鹃噾棰�
-    receiptPaymentAmount: Number(row.pendingInvoiceTotal || 0),
-    receiptPaymentType: "",
-    registrant: userStore.nickName,
-    receiptPaymentDate: "",
-    invoiceLedgerId: row.id,
-    salesLedgerId: row.salesLedgerId,
-    salesLedgerProductId: row.id,
-  }));
-  dialogFormVisible.value = true;
-};
-// 鎻愪氦琛ㄥ崟
-const submitForm = () => {
-  if (forms.value.length === 0) {
-    proxy.$modal.msgError("璇烽�夋嫨鍥炴璁板綍");
-    return;
-  }
-  for (let i = 0; i < forms.value.length; i++) {
-    const item = forms.value[i];
-    const pendingAmount = Number(item.pendingInvoiceTotal || 0);
-    const currentAmount = Number(item.receiptPaymentAmount);
-    if (!item.receiptPaymentAmount && item.receiptPaymentAmount !== 0) {
-      proxy.$modal.msgError(`绗� ${i + 1} 鏉★細璇峰~鍐欏洖娆鹃噾棰漙);
-      return;
-    }
-    if (currentAmount > pendingAmount) {
-      proxy.$modal.msgError(
-        `绗� ${i + 1} 鏉★細鍥炴閲戦涓嶈兘瓒呰繃寰呭洖娆鹃噾棰濓紙寰呭洖娆撅細${pendingAmount.toFixed(
-          2
-        )}锛塦
-      );
-      return;
-    }
-    if (!item.receiptPaymentType) {
-      proxy.$modal.msgError(`绗� ${i + 1} 鏉★細璇烽�夋嫨鍥炴褰㈠紡`);
-      return;
-    }
-    if (!item.receiptPaymentDate) {
-      proxy.$modal.msgError(`绗� ${i + 1} 鏉★細璇烽�夋嫨鍥炴鏃ユ湡`);
-      return;
-    }
-  }
-  receiptPaymentSaveOrUpdate(forms.value).then(() => {
-    proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
-    closeDia();
-    getList();
-  });
-};
-// 鍏抽棴寮规
-const closeDia = () => {
-  forms.value = [];
-  dialogFormVisible.value = false;
-  // 閬垮厤浜屾鎵撳紑寮圭獥鏃朵粛鎼哄甫涓婁竴娆$殑閫夋嫨瀵艰嚧鈥滃鍑轰竴琛�/鑴忔暟鎹��
-  selectedRows.value = [];
-  tableRef.value?.clearSelection();
-};
-
-// 鍒犻櫎鍥炴璁板綍
-const delReceiptRecord = (row) => {
-  console.log("row", row);
-  ElMessageBox.confirm("纭鍒犻櫎璇ヨ褰曞悧锛�", "鎻愮ず", {
-    confirmButtonText: "纭畾",
-    cancelButtonText: "鍙栨秷",
-    type: "warning",
-  })
-    .then(async () => {
-      try {
-        let ids = [];
-        ids.push(row.id);
-        await receiptPaymentDel(ids);
-        ElMessage.success("鍒犻櫎鎴愬姛");
-        getList();
-      } catch (error) {
-        console.error("鍒犻櫎澶辫触:", error);
-        ElMessage.error("鍒犻櫎澶辫触");
-      }
-    })
-    .catch(() => {
-      ElMessage.info("宸插彇娑堝垹闄�");
-    });
-};
-
-// 缂栬緫淇敼鐘舵��
-const changeEditType = (row) => {
-  row.editType = !row.editType;
-};
-
-// 淇濆瓨鍥炴璁板綍
-const saveReceiptPayment = (row) => {
-  // 瀛愯〃鍥炴閲戦鍚堣鏍¢獙锛氭墍鏈夊洖娆捐褰曢噾棰濅箣鍜屼笉鑳藉ぇ浜庣埗鏁版嵁鍚堝悓閲戦
-  // 杩欓噷鐖舵暟鎹�滃悎鍚岄噾棰濃�濇寜锛氬凡鍥炴閲戦( invoiceTotal ) + 寰呭洖娆鹃噾棰�( pendingInvoiceTotal ) 璁$畻
-  const findParentRowByChildId = (childId) => {
-    return tableData.value.find((p) =>
-      Array.isArray(p.children) && p.children.some((c) => c.id === childId)
-    );
-  };
-  const parentRow = findParentRowByChildId(row.id);
-  if (parentRow) {
-    const contractAmount =
-      Number(parentRow.invoiceTotal || 0) + Number(parentRow.pendingInvoiceTotal || 0);
-    const sumReceipt = (parentRow.children || []).reduce((sum, item) => {
-      const val = Number(item?.receiptPaymentAmount ?? 0);
-      return sum + (Number.isFinite(val) ? val : 0);
-    }, 0);
-    if (sumReceipt > contractAmount) {
-      proxy.$modal.msgError(
-        `鍥炴閲戦鍚堣(${sumReceipt.toFixed(2)})涓嶈兘澶т簬鍚堝悓閲戦(${contractAmount.toFixed(2)})`
-      );
-      return;
-    }
-  }
-
-  let updateData = {
-    id: row.id,
-    receiptPaymentType: row.receiptPaymentType,
-    receiptPaymentAmount: row.receiptPaymentAmount,
-  };
-  receiptPaymentSaveOrUpdate([updateData]).then((res) => {
-    row.editType = !row.editType;
-		getList();
-		proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
-  });
-};
-
-// 瀵煎嚭
-const handleOut = () => {
-  ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
-    confirmButtonText: "纭",
-    cancelButtonText: "鍙栨秷",
-    type: "warning",
-  })
-    .then(() => {
-      const ids = selectedRows.value.map((item) => item.id);
-      proxy.download(
-        `/receiptPayment/export`,
-        { ids: `${ids}` },
-        "鍥炴鐧昏妗f.xlsx"
-      );
-    })
-    .catch(() => {
-      proxy.$modal.msg("宸插彇娑�");
-    });
-};
-
-onMounted(() => {
-  getList();
-});
-</script>
-
-<style scoped lang="scss">
-.table_list {
-  margin-top: unset;
-}
-:deep(.el-checkbox__label) {
-  font-weight: bold;
-}
-.actions {
-  display: flex;
-  justify-content: space-between;
-  margin-bottom: 10px;
-}
-.empty-tip {
-  text-align: center;
-  padding: 20px 0;
-  color: #909399;
-}
-</style>
diff --git a/src/views/salesManagement/receiptPaymentHistory/index.vue b/src/views/salesManagement/receiptPaymentHistory/index.vue
deleted file mode 100644
index 11a59a6..0000000
--- a/src/views/salesManagement/receiptPaymentHistory/index.vue
+++ /dev/null
@@ -1,279 +0,0 @@
-<template>
-  <div class="app-container">
-    <el-form :model="searchForm" :inline="true">
-      <el-form-item label="瀹㈡埛鍚嶇О">
-        <el-input
-          v-model="searchForm.searchText"
-          placeholder="杈撳叆瀹㈡埛鍚嶇О鎼滅储"
-          @change="handleQuery"
-          clearable
-          :prefix-icon="Search"
-        />
-      </el-form-item>
-      <el-form-item label="鍥炴鏃ユ湡">
-        <el-date-picker
-          v-model="searchForm.receiptPaymentDate"
-          value-format="YYYY-MM-DD"
-          format="YYYY-MM-DD"
-          type="daterange"
-          start-placeholder="寮�濮嬫椂闂�"
-          end-placeholder="缁撴潫鏃堕棿"
-          clearable
-          style="width: 300px"
-          @change="changeDateRange"
-          @clear="clearRange"
-        />
-      </el-form-item>
-      <el-form-item>
-        <el-button type="primary" @click="handleQuery"> 鎼滅储 </el-button>
-        <el-button @click="handleExport">瀵煎嚭</el-button>
-        <el-button
-          type="danger"
-          :disabled="selectedRows.length === 0"
-          @click="handleBatchDelete"
-        >
-          鎵归噺鍒犻櫎 ({{ selectedRows.length }})
-        </el-button>
-      </el-form-item>
-    </el-form>
-    <div class="table_list">
-      <PIMTable
-        rowKey="id"
-        :column="tableColumn"
-        :tableData="tableData"
-        :page="page"
-        :isSelection="true"
-        :isShowSummary="isShowSummarySon"
-        :summaryMethod="summarizeMainTable1"
-        :tableLoading="tableLoading"
-        :total="page.total"
-        @pagination="pagination"
-        @selection-change="handleSelectionChange"
-      >
-        <template #operation="{ row }">
-          <el-button
-            type="primary"
-            link
-            @click="handleDelete(row)"
-          >
-            鍒犻櫎
-          </el-button>
-        </template>
-      </PIMTable>
-    </div>
-  </div>
-</template>
-
-<script setup>
-import { ref, reactive, getCurrentInstance, onMounted } from "vue";
-import { Search } from "@element-plus/icons-vue";
-import { ElMessageBox } from "element-plus";
-import { receiptPaymentHistoryListPage, receiptPaymentDel } from "@/api/salesManagement/receiptPayment.js";
-import useFormData from "@/hooks/useFormData";
-import dayjs from "dayjs";
-
-const { proxy } = getCurrentInstance();
-const tableColumn = ref([
-  {
-    label: "閿�鍞悎鍚屽彿",
-    prop: "salesContractNo",
-    width:240
-  },
-  {
-    label: "鍥炴鏃ユ湡",
-    prop: "receiptPaymentDate",
-    width:100
-  },
-  {
-    label: "瀹㈡埛鍚嶇О",
-    prop: "customerName",
-    width:240
-  },
-  {
-    label: "鍥炴閲戦锛堝厓锛�",
-    prop: "receiptPaymentAmount",
-    width:200,
-    formatData: (params) => {
-      return params ? parseFloat(params).toFixed(2) : 0;
-    },
-  },
-  {
-    label: "鍥炴鏂瑰紡",
-    prop: "receiptPaymentType",
-    dataType: "tag",
-    formatData: (params) => {
-      if (params == 0) {
-        return "鐢垫眹";
-      } else if (params == 1) {
-        return "鎵垮厬";
-      } else {
-        return null;
-      }
-    },
-    formatType: (params) => {
-      return "info";
-    },
-  },
-  {
-    label: "鐧昏浜�",
-    prop: "registrant",
-  },
-  {
-    label: "鐧昏鏃ユ湡",
-    prop: "createTime",
-    width:100
-  },
-  {
-    label: "鎿嶄綔",
-    dataType: "slot",
-    fixed: "right",
-    slot: "operation",
-    width: 100,
-    align: "center",
-  },
-]);
-const tableData = ref([]);
-const selectedRows = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
-  current: 1,
-  size: 100,
-	total: 0,
-});
-const total = ref(0);
-
-const { form: searchForm } = useFormData({
-  searchText: undefined,
-  receiptPaymentDate: [],
-  receiptPaymentDateStart: undefined,
-  receiptPaymentDateEnd: undefined,
-});
-const { receipt_payment_type } = proxy.useDict("receipt_payment_type");
-const isShowSummarySon = ref(true);
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
-  page.current = 1;
-  getList();
-};
-const pagination = (obj) => {
-  page.current = obj.page;
-  page.size = obj.limit;
-  getList();
-};
-const getList = () => {
-  tableLoading.value = true;
-  const { receiptPaymentDate, ...rest } = searchForm;
-  receiptPaymentHistoryListPage({ ...rest, ...page }).then((res) => {
-    tableLoading.value = false;
-    tableData.value = res.records;
-		page.total = res.total;
-  });
-};
-// 瀛愯〃鍚堣鏂规硶
-const summarizeMainTable1 = (param) => {
-  return proxy.summarizeTable(param, ["receiptPaymentAmount"], {
-    ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
-    futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
-  });
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
-  selectedRows.value = selection;
-};
-
-const changeDateRange = (date) => {
-  if (date) {
-    searchForm.receiptPaymentDateStart = dayjs(date[0]).format(
-      "YYYY-MM-DD 00:00:00"
-    );
-    searchForm.receiptPaymentDateEnd = dayjs(date[1]).format(
-      "YYYY-MM-DD 23:59:59"
-    );
-    getList();
-  }
-};
-
-const clearRange = () => {
-  searchForm.receiptPaymentDate = [];
-  searchForm.receiptPaymentDateStart = undefined;
-  searchForm.receiptPaymentDateEnd = undefined;
-  getList();
-};
-
-// 鍒犻櫎
-const handleDelete = (row) => {
-  ElMessageBox.confirm("纭鍒犻櫎璇ヨ褰曞悧锛�", "鎻愮ず", {
-    confirmButtonText: "纭畾",
-    cancelButtonText: "鍙栨秷",
-    type: "warning",
-  })
-    .then(async () => {
-      try {
-        tableLoading.value = true;
-        await receiptPaymentDel([row.id]);
-        proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
-        getList();
-      } catch (error) {
-        console.error("鍒犻櫎澶辫触:", error);
-        proxy.$modal.msgError("鍒犻櫎澶辫触");
-      } finally {
-        tableLoading.value = false;
-      }
-    })
-    .catch(() => {
-      proxy.$modal.msg("宸插彇娑堝垹闄�");
-    });
-};
-
-// 鎵归噺鍒犻櫎
-const handleBatchDelete = () => {
-  if (selectedRows.value.length === 0) {
-    proxy.$modal.msgWarning("璇烽�夋嫨瑕佸垹闄ょ殑鏁版嵁");
-    return;
-  }
-  ElMessageBox.confirm(
-    `纭畾瑕佸垹闄ら�変腑鐨� ${selectedRows.value.length} 鏉℃暟鎹悧锛焋,
-    "鍒犻櫎鎻愮ず",
-    {
-      confirmButtonText: "纭",
-      cancelButtonText: "鍙栨秷",
-      type: "warning",
-    }
-  )
-    .then(async () => {
-      try {
-        tableLoading.value = true;
-        const ids = selectedRows.value.map((item) => item.id);
-        await receiptPaymentDel(ids);
-        proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
-        selectedRows.value = [];
-        getList();
-      } catch (error) {
-        console.error("鍒犻櫎澶辫触:", error);
-        proxy.$modal.msgError("鍒犻櫎澶辫触");
-      } finally {
-        tableLoading.value = false;
-      }
-    })
-    .catch(() => {
-      proxy.$modal.msg("宸插彇娑�");
-    });
-};
-
-// 瀵煎嚭
-const handleExport = () => {
-  const { receiptPaymentDate, ...rest } = searchForm;
-  proxy.download("/receiptPayment/exportOne", { ...rest, ...page }, "鍥炴娴佹按.xlsx");
-};
-
-onMounted(() => {
-  getList();
-});
-</script>
-
-<style scoped lang="scss">
-.table_list {
-  margin-top: unset;
-}
-</style>
diff --git a/src/views/salesManagement/receiptPaymentLedger/index.vue b/src/views/salesManagement/receiptPaymentLedger/index.vue
index e41e24f..f5a9d8f 100644
--- a/src/views/salesManagement/receiptPaymentLedger/index.vue
+++ b/src/views/salesManagement/receiptPaymentLedger/index.vue
@@ -1,268 +1,252 @@
 <template>
   <div class="app-container">
-    <div class="search_form" style="margin-bottom: 20px;">
+    <div class="search_form"
+         style="margin-bottom: 20px;">
       <div>
         <span class="search_title">瀹㈡埛鍚嶇О锛�</span>
-        <el-input
-          v-model="searchForm.searchText"
-          style="width: 240px"
-          placeholder="杈撳叆瀹㈡埛鍚嶇О鎼滅储"
-          @change="handleQuery"
-          clearable
-          prefix-icon="Search"
-        />
-        <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
-          >鎼滅储</el-button
-        >
+        <el-input v-model="searchForm.searchText"
+                  style="width: 240px"
+                  placeholder="杈撳叆瀹㈡埛鍚嶇О鎼滅储"
+                  @change="handleQuery"
+                  clearable
+                  prefix-icon="Search" />
+        <el-button type="primary"
+                   @click="handleQuery"
+                   style="margin-left: 10px">鎼滅储</el-button>
       </div>
     </div>
-    <div style="display: flex">
-      <div class="table_list">
-        <el-table
-          :data="tableData"
-          border
-          v-loading="tableLoading"
-          :row-key="(row) => row.id"
-          show-summary
-          :summary-method="summarizeMainTable"
-          @row-click="rowClickMethod"
-          height="calc(100vh - 18.5em)"
-        >
-          <el-table-column
-            align="center"
-            label="搴忓彿"
-            type="index"
-            width="60"
-          />
-          <el-table-column
-            label="瀹㈡埛鍚嶇О"
-            prop="customerName"
-            show-overflow-tooltip
-						width="200"
-          />
-          <el-table-column
-            label="鍚堝悓閲戦(鍏�)"
-            prop="invoiceTotal"
-            show-overflow-tooltip
-            :formatter="formattedNumber"
-						width="200"
-          />
-          <el-table-column
-            label="鍥炴閲戦(鍏�)"
-            prop="receiptPaymentAmount"
-            show-overflow-tooltip
-            :formatter="formattedNumber"
-						width="200"
-          />
-          <el-table-column
-            label="搴旀敹閲戦(鍏�)"
-            prop="unReceiptPaymentAmount"
-            show-overflow-tooltip
-						width="200"
-          >
-            <template #default="{ row, column }">
-              <el-text type="danger">
-                {{ formattedNumber(row, column, row.unReceiptPaymentAmount) }}
-              </el-text>
-            </template>
-          </el-table-column>
-        </el-table>
-        <pagination
-          v-show="total > 0"
-          :total="total"
-          layout="total, sizes, prev, pager, next, jumper"
-          :page="page.current"
-          :limit="page.size"
-          @pagination="paginationChange"
-        />
-      </div>
-      <div class="table_list">
-        <el-table
-          :data="receiptRecord"
-          border
-          :row-key="(row) => row.id"
-          show-summary
-          :summary-method="summarizeMainTable1"
-          height="calc(100vh - 18.5em)"
-        >
-          <el-table-column
-            align="center"
-            label="搴忓彿"
-            type="index"
-            width="60"
-          />
-          <el-table-column
-            label="鍙戠敓鏃ユ湡"
-            prop="receiptPaymentDate"
-            show-overflow-tooltip
-						width="110"
-          />
-          <el-table-column
-            label="閿�鍞悎鍚屽彿"
-            prop="salesContractNo"
-            show-overflow-tooltip
-						width="200"
-          />
-          <el-table-column
-            label="鍚堝悓閲戦(鍏�)"
-            prop="invoiceTotal"
-            show-overflow-tooltip
-            :formatter="formattedNumber"
-						width="200"
-          />
-          <el-table-column
-            label="鍥炴閲戦(鍏�)"
-            prop="receiptPaymentAmount"
-            show-overflow-tooltip
-            :formatter="formattedNumber"
-						width="200"
-          />
-          <el-table-column
-            label="搴旀敹閲戦(鍏�)"
-            prop="unReceiptPaymentAmount"
-            show-overflow-tooltip
-						width="200"
-          >
-            <template #default="{ row, column }">
-              <el-text type="danger">
-                {{ formattedNumber(row, column, row.unReceiptPaymentAmount) }}
-              </el-text>
-            </template>
-          </el-table-column>
-        </el-table>
-      </div>
-    </div>
+    <el-row :gutter="20">
+      <el-col :span="12">
+        <div class="table_list"
+             style="width: 100%">
+          <el-table :data="tableData"
+                    border
+                    v-loading="tableLoading"
+                    :row-key="(row) => row.customerId"
+                    show-summary
+                    :summary-method="summarizeMainTable"
+                    @row-click="rowClickMethod"
+                    highlight-current-row
+                    height="calc(100vh - 18.5em)">
+            <el-table-column align="center"
+                             label="搴忓彿"
+                             type="index"
+                             width="60" />
+            <el-table-column label="瀹㈡埛鍚嶇О"
+                             prop="customerName"
+                             show-overflow-tooltip
+                             width="200" />
+            <el-table-column label="鍚堝悓閲戦(鍏�)"
+                             prop="contractAmounts"
+                             show-overflow-tooltip
+                             :formatter="formattedNumber"
+                             width="200" />
+            <el-table-column label="鍥炴閲戦(鍏�)"
+                             prop="receiptPaymentAmount"
+                             show-overflow-tooltip
+                             :formatter="formattedNumber"
+                             width="200" />
+            <el-table-column label="搴旀敹閲戦(鍏�)"
+                             prop="receiptableAmount"
+                             show-overflow-tooltip
+                             width="200">
+              <template #default="{ row, column }">
+                <el-text type="danger">
+                  {{ formattedNumber(row, column, row.receiptableAmount) }}
+                </el-text>
+              </template>
+            </el-table-column>
+          </el-table>
+          <pagination v-show="total > 0"
+                      :total="total"
+                      layout="total, sizes, prev, pager, next, jumper"
+                      :page="page.current"
+                      :limit="page.size"
+                      @pagination="paginationChange" />
+        </div>
+      </el-col>
+      <el-col :span="12">
+        <div class="table_list"
+             style="width: 100%">
+          <el-table :data="receiptRecord"
+                    border
+                    :row-key="(row) => row.id"
+                    show-summary
+                    :summary-method="summarizeMainTable1"
+                    height="calc(100vh - 18.5em)">
+            <el-table-column align="center"
+                             label="搴忓彿"
+                             type="index"
+                             width="60" />
+            <el-table-column label="鍚堝悓绛捐鏃ユ湡"
+                             prop="executionDate"
+                             show-overflow-tooltip
+                             width="110" />
+            <el-table-column label="閿�鍞悎鍚屽彿"
+                             prop="salesContractNo"
+                             show-overflow-tooltip
+                             width="200" />
+            <el-table-column label="鍚堝悓閲戦(鍏�)"
+                             prop="contractAmount"
+                             show-overflow-tooltip
+                             :formatter="formattedNumber"
+                             width="200" />
+            <el-table-column label="鍥炴閲戦(鍏�)"
+                             prop="receiptPaymentAmount"
+                             show-overflow-tooltip
+                             :formatter="formattedNumber"
+                             width="200" />
+            <el-table-column label="搴旀敹閲戦(鍏�)"
+                             prop="receiptableAmount"
+                             show-overflow-tooltip
+                             width="200">
+              <template #default="{ row, column }">
+                <el-text type="danger">
+                  {{ formattedNumber(row, column, row.receiptableAmount) }}
+                </el-text>
+              </template>
+            </el-table-column>
+          </el-table>
+          <pagination v-show="recordTotal > 0"
+                      :total="recordTotal"
+                      layout="total, sizes, prev, pager, next, jumper"
+                      :page="recordPage.current"
+                      :limit="recordPage.size"
+                      @pagination="recordPaginationChange" />
+        </div>
+      </el-col>
+    </el-row>
   </div>
 </template>
 
 <script setup>
-import {onMounted, ref} from "vue";
-import { invoiceLedgerSalesAccount } from "../../../api/salesManagement/invoiceLedger.js";
-import { customerInteractions } from "../../../api/salesManagement/receiptPayment.js";
-import Pagination from "../../../components/PIMTable/Pagination.vue";
-const { proxy } = getCurrentInstance();
-const tableData = ref([]);
-const receiptRecord = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
-  current: 1,
-  size: 100,
-});
-const recordPage = reactive({
-  current: 1,
-  size: 100,
-});
-const total = ref(0);
-const recordTotal = ref(0);
-const data = reactive({
-  searchForm: {
-    searchText: "",
-    invoiceDate: "",
-  },
-});
-const customerId = ref("");
-const { searchForm } = toRefs(data);
-const originReceiptRecord = ref([]);
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
-  page.current = 1;
-  getList();
-};
-const paginationChange = (obj) => {
-  page.current = obj.page;
-  page.size = obj.limit;
-  getList();
-};
-const getList = () => {
-  tableLoading.value = true;
-  invoiceLedgerSalesAccount({ ...searchForm.value, ...page }).then((res) => {
-    tableLoading.value = false;
-    tableData.value = res.data.records;
-    total.value = res.data.total;
-    if (tableData.value.length > 0) {
-      recordPage.current = 1;
-      customerId.value = tableData.value[0].id;
-      receiptPaymentList(customerId.value);
-    }
+  import { onMounted, ref, reactive, toRefs, getCurrentInstance } from "vue";
+  import {
+    customewTransactions,
+    customewTransactionsDetails,
+  } from "@/api/salesManagement/indicatorStats.js";
+  import Pagination from "../../../components/PIMTable/Pagination.vue";
+  const { proxy } = getCurrentInstance();
+  const tableData = ref([]);
+  const receiptRecord = ref([]);
+  const tableLoading = ref(false);
+  const page = reactive({
+    current: 1,
+    size: 100,
   });
-};
-const formattedNumber = (row, column, cellValue) => {
-  return parseFloat(cellValue).toFixed(2);
-};
-// 涓昏〃鍚堣鏂规硶
-const summarizeMainTable = (param) => {
-  return proxy.summarizeTable(
-    param,
-    ["invoiceTotal", "receiptPaymentAmount", "unReceiptPaymentAmount"],
-    {
-      ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
-      futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
-    }
-  );
-};
-// 瀛愯〃鍚堣鏂规硶
-const summarizeMainTable1 = (param) => {
-  var summarizeTable = proxy.summarizeTable(
-    param,
-    ["invoiceAmount", "receiptAmount", "unReceiptAmount"],
-    {
-      ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
-      futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
-    }
-  );
-  // 鍙栨渶鍚庝竴琛屾暟鎹�;
-  if (receiptRecord.value?.length > 0) {
-    const index = tableData.value.findIndex(
-      (item) => item.id == customerId.value
-    );
-    summarizeTable[summarizeTable.length - 1] =
-      tableData.value[index].unReceiptPaymentAmount.toFixed(2);
-  } else {
-    summarizeTable[summarizeTable.length - 1] = 0.0;
-  }
-  return summarizeTable;
-};
-
-const receiptPaymentList = (id) => {
-  const param = {
-    customerId: id,
+  const recordPage = reactive({
+    current: 1,
+    size: 100,
+  });
+  const total = ref(0);
+  const recordTotal = ref(0);
+  const data = reactive({
+    searchForm: {
+      searchText: "",
+      invoiceDate: "",
+    },
+  });
+  const customerId = ref("");
+  const { searchForm } = toRefs(data);
+  const originReceiptRecord = ref([]);
+  // 鏌ヨ鍒楄〃
+  /** 鎼滅储鎸夐挳鎿嶄綔 */
+  const handleQuery = () => {
+    page.current = 1;
+    getList();
   };
-  console.log("param", param);
-  customerInteractions(param).then((res) => {
-    originReceiptRecord.value = res.data;
-    handlePagination({ page: 1, limit: recordPage.size });
-    recordTotal.value = res.data.length;
+  const paginationChange = obj => {
+    page.current = obj.page;
+    page.size = obj.limit;
+    getList();
+  };
+  const getList = () => {
+    tableLoading.value = true;
+    customewTransactions({ ...searchForm.value, ...page }).then(res => {
+      tableLoading.value = false;
+      tableData.value = res.data.records;
+      total.value = res.data.total;
+      if (tableData.value.length > 0) {
+        recordPage.current = 1;
+        customerId.value = tableData.value[0].customerId;
+        receiptPaymentList(customerId.value);
+      }
+    });
+  };
+  const formattedNumber = (row, column, cellValue) => {
+    return cellValue ? parseFloat(cellValue).toFixed(2) : "0.00";
+  };
+  // 涓昏〃鍚堣鏂规硶
+  const summarizeMainTable = param => {
+    return proxy.summarizeTable(
+      param,
+      ["invoiceTotal", "receiptPaymentAmount", "unReceiptPaymentAmount"],
+      {
+        ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
+        futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
+      }
+    );
+  };
+  // 瀛愯〃鍚堣鏂规硶
+  const summarizeMainTable1 = param => {
+    var summarizeTable = proxy.summarizeTable(
+      param,
+      ["contractAmount", "receiptPaymentAmount", "receiptableAmount"],
+      {
+        ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
+        futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
+      }
+    );
+    return summarizeTable;
+  };
+
+  const receiptPaymentList = id => {
+    const param = {
+      customerId: id,
+      current: recordPage.current,
+      size: recordPage.size,
+    };
+    customewTransactionsDetails(param).then(res => {
+      if (Array.isArray(res.data)) {
+        originReceiptRecord.value = res.data;
+        recordTotal.value = res.data.length;
+        handlePagination({ page: 1, limit: recordPage.size });
+      } else {
+        receiptRecord.value = res.data.records;
+        recordTotal.value = res.data.total;
+      }
+    });
+  };
+
+  // 姹囨璁板綍鍒楄〃鍒嗛〉
+  const recordPaginationChange = pagination => {
+    recordPage.current = pagination.page;
+    recordPage.size = pagination.limit;
+    receiptPaymentList(customerId.value);
+  };
+
+  const rowClickMethod = row => {
+    customerId.value = row.customerId;
+    receiptPaymentList(customerId.value);
+  };
+
+  const handlePagination = ({ page, limit }) => {
+    recordPage.current = page;
+    recordPage.size = limit;
+
+    const start = (page - 1) * limit;
+    const end = start + limit;
+
+    receiptRecord.value = originReceiptRecord.value.slice(start, end);
+  };
+
+  onMounted(() => {
+    getList();
   });
-};
-
-// 姹囨璁板綍鍒楄〃鍒嗛〉
-const recordPaginationChange = (pagination) => {
-  handlePagination(pagination);
-};
-
-const rowClickMethod = (row) => {
-  customerId.value = row.id;
-  receiptPaymentList(customerId.value);
-};
-
-const handlePagination = ({ page, limit }) => {
-  recordPage.current = page;
-  recordPage.size = limit;
-
-  const start = (page - 1) * limit;
-  const end = start + limit;
-
-  receiptRecord.value = originReceiptRecord.value.slice(start, end);
-};
-
-onMounted(() => {
-	getList();
-});
 </script>
 
 <style scoped lang="scss">
-.table_list {
-  width: 50%;
-}
+  .table_list {
+    width: 50%;
+  }
 </style>
diff --git a/src/views/salesManagement/salesLedger/index.vue b/src/views/salesManagement/salesLedger/index.vue
index a4ebbdf..2e58391 100644
--- a/src/views/salesManagement/salesLedger/index.vue
+++ b/src/views/salesManagement/salesLedger/index.vue
@@ -234,9 +234,13 @@
                          show-overflow-tooltip />
         <el-table-column fixed="right"
                          label="鎿嶄綔"
-                         width="130"
+                         width="220"
                          align="center">
           <template #default="scope">
+            <el-button link
+                       type="primary"
+                       @click="openForm('view', scope.row)">璇︽儏
+            </el-button>
             <el-button link
                        type="primary"
                        @click="openForm('edit', scope.row)"
@@ -257,7 +261,7 @@
                   @pagination="paginationChange" />
     </div>
     <FormDialog v-model="dialogFormVisible"
-                :title="operationType === 'add' ? '鏂板閿�鍞彴璐﹂〉闈�' : '缂栬緫閿�鍞彴璐﹂〉闈�'"
+                :title="operationType === 'add' ? '鏂板閿�鍞彴璐﹂〉闈�' : (operationType === 'edit' ? '缂栬緫閿�鍞彴璐﹂〉闈�' : '閿�鍞彴璐﹁鎯�')"
                 :width="'70%'"
                 :operation-type="operationType"
                 @close="closeDia"
@@ -284,10 +288,15 @@
           <el-col :span="12">
             <el-form-item label="閿�鍞悎鍚屽彿锛�"
                           prop="salesContractNo">
-              <el-input v-model="form.salesContractNo"
-                        placeholder="鑷姩鐢熸垚"
-                        clearable
-                        disabled />
+              <div style="display: flex; align-items: center; gap: 12px;width: 100%;">
+                <el-checkbox v-model="form.autoGenerateContractNo"
+                             v-if="operationType === 'add'">鑷姩鐢熸垚
+                </el-checkbox>
+                <el-input v-model="form.salesContractNo"
+                          :placeholder="form.autoGenerateContractNo ? '鑷姩鐢熸垚' : '璇疯緭鍏�'"
+                          clearable
+                          :disabled="form.autoGenerateContractNo || operationType === 'view'" />
+              </div>
             </el-form-item>
           </el-col>
           <el-col :span="12">
@@ -369,6 +378,7 @@
                          :reserve-keyword="false"
                          placeholder="璇烽�夋嫨"
                          clearable
+                         :disabled="operationType === 'view'"
                          @change="changs">
                 <el-option v-for="item in userList"
                            :key="item.userId"
@@ -386,7 +396,8 @@
                               format="YYYY-MM-DD"
                               type="date"
                               placeholder="璇烽�夋嫨"
-                              clearable />
+                              clearable
+                              :disabled="operationType === 'view'" />
             </el-form-item>
           </el-col>
         </el-row>
@@ -400,7 +411,8 @@
                               format="YYYY-MM-DD"
                               type="date"
                               placeholder="璇烽�夋嫨"
-                              clearable />
+                              clearable
+                              :disabled="operationType === 'view'" />
             </el-form-item>
           </el-col>
         </el-row>
@@ -488,11 +500,13 @@
             </el-form-item>
           </el-col>
         </el-row>
-        <el-row :gutter="30">
+        <el-row v-if="operationType !== 'view'"
+                :gutter="30">
           <el-col :span="24">
             <el-form-item label="闄勪欢鏉愭枡锛�"
                           prop="salesLedgerFiles">
-              <FileUpload v-model:file-list="fileList" />
+              <FileUpload v-model:file-list="fileList"
+                          :disabled="operationType === 'view'" />
             </el-form-item>
           </el-col>
         </el-row>
@@ -915,7 +929,8 @@
           </el-col>
         </el-row>
         <el-row :gutter="30">
-          <el-col :span="24" v-if="deliveryForm.type === '璐ц溅'">
+          <el-col :span="24"
+                  v-if="deliveryForm.type === '璐ц溅'">
             <el-form-item label="鍙戣揣杞︾墝鍙凤細"
                           prop="shippingCarNumber">
               <el-input v-model="deliveryForm.shippingCarNumber"
@@ -923,7 +938,8 @@
                         clearable />
             </el-form-item>
           </el-col>
-          <el-col :span="24" v-else>
+          <el-col :span="24"
+                  v-else>
             <el-form-item label="蹇�掑叕鍙革細"
                           prop="expressCompany">
               <el-input v-model="deliveryForm.expressCompany"
@@ -932,7 +948,8 @@
             </el-form-item>
           </el-col>
         </el-row>
-        <el-row :gutter="30" v-if="deliveryForm.type === '蹇��'">
+        <el-row :gutter="30"
+                v-if="deliveryForm.type === '蹇��'">
           <el-col :span="24">
             <el-form-item label="蹇�掑崟鍙凤細"
                           prop="expressNumber">
@@ -945,13 +962,14 @@
         <el-row :gutter="30">
           <el-col :span="24">
             <el-form-item label="鍙戣揣鍥剧墖锛�">
-              <ImageUpload v-model:file-list="deliveryFileList" :limit="9" />
+              <ImageUpload v-model:file-list="deliveryFileList"
+                           :limit="9" />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="30">
           <el-col :span="24">
-            <el-form-item label="鎵瑰彿锛�"
+            <el-form-item label="搴撳瓨锛�"
                           prop="batchNo">
               <el-table :data="deliveryForm.batchNoList"
                         border
@@ -961,6 +979,15 @@
                 <el-table-column label="鎵瑰彿"
                                  prop="batchNo"
                                  min-width="180" />
+                <el-table-column label="浜у搧澶х被"
+                                 prop="productName"
+                                 min-width="100" />
+                <el-table-column label="瑙勬牸鍨嬪彿"
+                                 prop="model"
+                                 min-width="100" />
+                <el-table-column label="鍗曚綅"
+                                 prop="unit"
+                                 min-width="100" />
                 <el-table-column label="搴撳瓨鏁伴噺"
                                  min-width="120"
                                  align="center">
@@ -1069,6 +1096,7 @@
     },
     form: {
       salesContractNo: "",
+      autoGenerateContractNo: true,
       salesman: "",
       customerId: "",
       entryPerson: "",
@@ -1256,7 +1284,9 @@
       shippingCarNumber: [
         { validator: validateDeliveryShippingCarNumber, trigger: "blur" },
       ],
-      expressCompany: [{ validator: validateDeliveryExpressCompany, trigger: "blur" }],
+      expressCompany: [
+        { validator: validateDeliveryExpressCompany, trigger: "blur" },
+      ],
       type: [{ required: true, message: "璇烽�夋嫨鍙戣揣绫诲瀷", trigger: "change" }],
     },
   });
@@ -1587,6 +1617,8 @@
       form.value.entryDate = getCurrentDate();
       // 绛捐鏃ユ湡榛樿涓哄綋澶�
       form.value.executionDate = getCurrentDate();
+      // 榛樿鑷姩鐢熸垚閿�鍞悎鍚屽彿
+      form.value.autoGenerateContractNo = true;
     } else {
       currentId.value = row.id;
       getSalesLedgerWithProducts({ id: row.id, type: 1 }).then(res => {
@@ -1594,6 +1626,8 @@
         form.value.entryPerson = Number(res.entryPerson);
         productData.value = form.value.productData;
         fileList.value = form.value.storageBlobVOs;
+        // 缂栬緫鏃惰缃嚜鍔ㄧ敓鎴愪负false锛屽厑璁告墜鍔ㄤ慨鏀�
+        form.value.autoGenerateContractNo = false;
       });
     }
     // let userAll = await userStore.getInfo()
@@ -1706,7 +1740,7 @@
         invoiceType: "澧炴櫘绁�",
         isProduction: true,
         productId: p.productId,
-        productModelId: p.productModelId
+        productModelId: p.productModelId,
       };
     });
 
@@ -1730,6 +1764,9 @@
         }
         form.value.storageBlobDTOs = fileList;
         form.value.type = 1;
+        if (form.value.autoGenerateContractNo) {
+          form.value.salesContractNo = "";
+        }
         addOrUpdateSalesLedger(form.value).then(res => {
           proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
           closeDia();
@@ -1838,14 +1875,10 @@
     }
 
     if (operationType.value === "add") {
-      productSelectedRows.value.forEach(selectedRow => {
-        const index = productData.value.findIndex(
-          product => product.id === selectedRow.id
-        );
-        if (index !== -1) {
-          productData.value.splice(index, 1);
-        }
-      });
+      productData.value = productData.value.filter(
+        item => !productSelectedRows.value.includes(item)
+      );
+      productSelectedRows.value = [];
     } else {
       let ids = [];
       if (productSelectedRows.value.length > 0) {
@@ -2047,286 +2080,286 @@
 
     // 鏋勫缓鎵撳嵃鍐呭
     let printContent = `
-                                                                <!DOCTYPE html>
-                                                                <html>
-                                                                <head>
-                                                                  <meta charset="UTF-8">
-                                                                  <title>鎵撳嵃棰勮</title>
-                                                                  <style>
-                                                                    body {
-                                                                      margin: 0;
-                                                                      padding: 0;
-                                                                      font-family: "SimSun", serif;
-                                                                      background: white;
-                                                                    }
-                                                                                                                 .print-page {
-                                                                        width: 200mm;
-                                                                        height: 75mm;
-                                                                        padding: 10mm;
-                                                                        padding-left: 20mm;
-                                                                        background: white;
-                                                                        box-sizing: border-box;
-                                                                        page-break-after: always;
-                                                                        page-break-inside: avoid;
-                                                                      }
-                                                                     .print-page:last-child {
-                                                                       page-break-after: avoid;
-                                                                     }
-                                                                    .delivery-note {
-                                                                      width: 100%;
-                                                                      height: 100%;
-                                                                      font-size: 12px;
-                                                                      line-height: 1.2;
-                                                                      display: flex;
-                                                                      flex-direction: column;
-                                                                      color: #000;
-                                                                    }
-                                                                    .header {
-                                                                      text-align: center;
-                                                                      margin-bottom: 8px;
-                                                                    }
-                                                                    .company-name {
-                                                                      font-size: 18px;
-                                                                      font-weight: bold;
-                                                                      margin-bottom: 4px;
-                                                                    }
-                                                                    .document-title {
-                                                                      font-size: 16px;
-                                                                      font-weight: bold;
-                                                                    }
-                                                                    .info-section {
-                                                                      margin-bottom: 8px;
-                                                                      display: flex;
-                                                                      justify-content: space-between;
-                                                                      align-items: center;
-                                                                    }
-                                                                    .info-row {
-                                                                      line-height: 20px;
-                                                                    }
-                                                                    .label {
-                                                                      font-weight: bold;
-                                                                      width: 60px;
-                                                                      font-size: 12px;
-                                                                    }
-                                                                    .value {
-                                                                      margin-right: 20px;
-                                                                      min-width: 80px;
-                                                                      font-size: 12px;
-                                                                    }
-                                                                             .table-section {
-                                                                             margin-bottom: 40px;
-                                                                      //  flex: 0.6;
-                                                                     }
-                                                                    .product-table {
-                                                                      width: 100%;
-                                                                      border-collapse: collapse;
-                                                                      border: 1px solid #000;
-                                                                    }
-                                                                             .product-table th, .product-table td {
-                                                                       border: 1px solid #000;
-                                                                       padding: 6px;
-                                                                       text-align: center;
-                                                                       font-size: 12px;
-                                                                       line-height: 1.4;
-                                                                     }
-                                                                    .product-table th {
-                                                                      font-weight: bold;
-                                                                    }
-                                                                    .total-value {
-                                                                      font-weight: bold;
-                                                                    }
-                                                                    .footer-section {
-                                                                      margin-top: auto;
-                                                                    }
-                                                                    .footer-row {
-                                                                      display: flex;
-                                                                      margin-bottom: 3px;
-                                                                      line-height: 22px;
-                                                                      justify-content: space-between;
-                                                                    }
-                                                                    .footer-item {
-                                                                      display: flex;
-                                                                      margin-right: 20px;
-                                                                    }
-                                                                    .footer-item .label {
-                                                                      font-weight: bold;
-                                                                      width: 80px;
-                                                                      font-size: 12px;
-                                                                    }
-                                                                    .footer-item .value {
-                                                                      min-width: 80px;
-                                                                      font-size: 12px;
-                                                                    }
-                                                                    .address-item .address-value {
-                                                                      min-width: 200px;
-                                                                    }
-                                                                    @media print {
-                                                                      body {
-                                                                        margin: 0;
-                                                                        padding: 0;
-                                                                      }
-                                                                                 .print-page {
-                                                                         margin: 0;
-                                                                         padding: 10mm;
-                                                                         /* padding-left: 20mm; */
-                                                                         page-break-inside: avoid;
-                                                                         page-break-after: always;
-                                                                       }
-                                                                       .print-page:last-child {
-                                                                         page-break-after: avoid;
-                                                                       }
-                                                                    }
-                                                                  </style>
-                                                                </head>
-                                                                <body>
-                                                              `;
+                                                                                  <!DOCTYPE html>
+                                                                                  <html>
+                                                                                  <head>
+                                                                                    <meta charset="UTF-8">
+                                                                                    <title>鎵撳嵃棰勮</title>
+                                                                                    <style>
+                                                                                      body {
+                                                                                        margin: 0;
+                                                                                        padding: 0;
+                                                                                        font-family: "SimSun", serif;
+                                                                                        background: white;
+                                                                                      }
+                                                                                                                                   .print-page {
+                                                                                          width: 200mm;
+                                                                                          height: 75mm;
+                                                                                          padding: 10mm;
+                                                                                          padding-left: 20mm;
+                                                                                          background: white;
+                                                                                          box-sizing: border-box;
+                                                                                          page-break-after: always;
+                                                                                          page-break-inside: avoid;
+                                                                                        }
+                                                                                       .print-page:last-child {
+                                                                                         page-break-after: avoid;
+                                                                                       }
+                                                                                      .delivery-note {
+                                                                                        width: 100%;
+                                                                                        height: 100%;
+                                                                                        font-size: 12px;
+                                                                                        line-height: 1.2;
+                                                                                        display: flex;
+                                                                                        flex-direction: column;
+                                                                                        color: #000;
+                                                                                      }
+                                                                                      .header {
+                                                                                        text-align: center;
+                                                                                        margin-bottom: 8px;
+                                                                                      }
+                                                                                      .company-name {
+                                                                                        font-size: 18px;
+                                                                                        font-weight: bold;
+                                                                                        margin-bottom: 4px;
+                                                                                      }
+                                                                                      .document-title {
+                                                                                        font-size: 16px;
+                                                                                        font-weight: bold;
+                                                                                      }
+                                                                                      .info-section {
+                                                                                        margin-bottom: 8px;
+                                                                                        display: flex;
+                                                                                        justify-content: space-between;
+                                                                                        align-items: center;
+                                                                                      }
+                                                                                      .info-row {
+                                                                                        line-height: 20px;
+                                                                                      }
+                                                                                      .label {
+                                                                                        font-weight: bold;
+                                                                                        width: 60px;
+                                                                                        font-size: 12px;
+                                                                                      }
+                                                                                      .value {
+                                                                                        margin-right: 20px;
+                                                                                        min-width: 80px;
+                                                                                        font-size: 12px;
+                                                                                      }
+                                                                                               .table-section {
+                                                                                               margin-bottom: 40px;
+                                                                                        //  flex: 0.6;
+                                                                                       }
+                                                                                      .product-table {
+                                                                                        width: 100%;
+                                                                                        border-collapse: collapse;
+                                                                                        border: 1px solid #000;
+                                                                                      }
+                                                                                               .product-table th, .product-table td {
+                                                                                         border: 1px solid #000;
+                                                                                         padding: 6px;
+                                                                                         text-align: center;
+                                                                                         font-size: 12px;
+                                                                                         line-height: 1.4;
+                                                                                       }
+                                                                                      .product-table th {
+                                                                                        font-weight: bold;
+                                                                                      }
+                                                                                      .total-value {
+                                                                                        font-weight: bold;
+                                                                                      }
+                                                                                      .footer-section {
+                                                                                        margin-top: auto;
+                                                                                      }
+                                                                                      .footer-row {
+                                                                                        display: flex;
+                                                                                        margin-bottom: 3px;
+                                                                                        line-height: 22px;
+                                                                                        justify-content: space-between;
+                                                                                      }
+                                                                                      .footer-item {
+                                                                                        display: flex;
+                                                                                        margin-right: 20px;
+                                                                                      }
+                                                                                      .footer-item .label {
+                                                                                        font-weight: bold;
+                                                                                        width: 80px;
+                                                                                        font-size: 12px;
+                                                                                      }
+                                                                                      .footer-item .value {
+                                                                                        min-width: 80px;
+                                                                                        font-size: 12px;
+                                                                                      }
+                                                                                      .address-item .address-value {
+                                                                                        min-width: 200px;
+                                                                                      }
+                                                                                      @media print {
+                                                                                        body {
+                                                                                          margin: 0;
+                                                                                          padding: 0;
+                                                                                        }
+                                                                                                   .print-page {
+                                                                                           margin: 0;
+                                                                                           padding: 10mm;
+                                                                                           /* padding-left: 20mm; */
+                                                                                           page-break-inside: avoid;
+                                                                                           page-break-after: always;
+                                                                                         }
+                                                                                         .print-page:last-child {
+                                                                                           page-break-after: avoid;
+                                                                                         }
+                                                                                      }
+                                                                                    </style>
+                                                                                  </head>
+                                                                                  <body>
+                                                                                `;
 
     // 涓烘瘡鏉℃暟鎹敓鎴愭墦鍗伴〉闈�
     printData.value.forEach((item, index) => {
       printContent += `
-                                                                  <div class="print-page">
-                                                                    <div class="delivery-note">
-                                                                      <div class="header">
-                                                                        <div class="document-title">闆跺敭鍙戣揣鍗�</div>
-                                                                      </div>
-                                                                      
-                                                                      <div class="info-section">
-                                                                        <div class="info-row">
-                                                                          <div>
-                                                                            <span class="label">鍙戣揣鏃ユ湡锛�</span>
-                                                                            <span class="value">${formatDate(
-                                                                              item.createTime
-                                                                            )}</span>
-                                                                          </div>
-                                                                          <div>
-                                                                            <span class="label">瀹㈡埛鍚嶇О锛�</span>
-                                                                            <span class="value">${
-                                                                              item.customerName
-                                                                            }</span>
-                                                                          </div>
-                                                                        </div>
-                                                                        <div class="info-row">
-                                                                          <span class="label">鍗曞彿锛�</span>
-                                                                          <span class="value">${
-                                                                            item.salesContractNo ||
-                                                                            ""
-                                                                          }</span>
-                                                                        </div>
-                                                                      </div>
+                                                                                    <div class="print-page">
+                                                                                      <div class="delivery-note">
+                                                                                        <div class="header">
+                                                                                          <div class="document-title">闆跺敭鍙戣揣鍗�</div>
+                                                                                        </div>
 
-                                                                      <div class="table-section">
-                                                                        <table class="product-table">
-                                                                          <thead>
-                                                                            <tr>
-                                                                              <th>浜у搧鍚嶇О</th>
-                                                                              <th>瑙勬牸鍨嬪彿</th>
-                                                                              <th>鍗曚綅</th>
-                                                                              <th>鍗曚环</th>
-                                                                              <th>闆跺敭鏁伴噺</th>
-                                                                              <th>闆跺敭閲戦</th>
-                                                                            </tr>
-                                                                          </thead>
-                                                                          <tbody>
-                                                                            ${
-                                                                              item.products &&
-                                                                              item
-                                                                                .products
-                                                                                .length >
-                                                                                0
-                                                                                ? item.products
-                                                                                    .map(
-                                                                                      product => `
-                                                                                <tr>
-                                                                                  <td>${
-                                                                                    product.productCategory ||
-                                                                                    ""
-                                                                                  }</td>
-                                                                                  <td>${
-                                                                                    product.specificationModel ||
-                                                                                    ""
-                                                                                  }</td>
-                                                                                  <td>${
-                                                                                    product.unit ||
-                                                                                    ""
-                                                                                  }</td>
-                                                                                  <td>${
-                                                                                    product.taxInclusiveUnitPrice ||
-                                                                                    "0"
-                                                                                  }</td>
-                                                                                  <td>${
-                                                                                    product.quantity ||
-                                                                                    "0"
-                                                                                  }</td>
-                                                                                  <td>${
-                                                                                    product.taxInclusiveTotalPrice ||
-                                                                                    "0"
-                                                                                  }</td>
-                                                                                </tr>
-                                                                              `
-                                                                                    )
-                                                                                    .join(
-                                                                                      ""
-                                                                                    )
-                                                                                : '<tr><td colspan="6" style="text-align: center; color: #999;">鏆傛棤浜у搧鏁版嵁</td></tr>'
-                                                                            }
-                                                                          </tbody>
-                                                                          <tfoot>
-                                                                            <tr>
-                                                                              <td class="label">鍚堣</td>
-                                                                              <td class="total-value"></td>
-                                                                              <td class="total-value"></td>
-                                                                              <td class="total-value"></td>
-                                                                              <td class="total-value">${getTotalQuantityForPrint(
-                                                                                item.products
-                                                                              )}</td>
-                                                                              <td class="total-value">${getTotalAmountForPrint(
-                                                                                item.products
-                                                                              )}</td>
-                                                                            </tr>
-                                                                          </tfoot>
-                                                                        </table>
-                                                                      </div>
+                                                                                        <div class="info-section">
+                                                                                          <div class="info-row">
+                                                                                            <div>
+                                                                                              <span class="label">鍙戣揣鏃ユ湡锛�</span>
+                                                                                              <span class="value">${formatDate(
+                                                                                                item.createTime
+                                                                                              )}</span>
+                                                                                            </div>
+                                                                                            <div>
+                                                                                              <span class="label">瀹㈡埛鍚嶇О锛�</span>
+                                                                                              <span class="value">${
+                                                                                                item.customerName
+                                                                                              }</span>
+                                                                                            </div>
+                                                                                          </div>
+                                                                                          <div class="info-row">
+                                                                                            <span class="label">鍗曞彿锛�</span>
+                                                                                            <span class="value">${
+                                                                                              item.salesContractNo ||
+                                                                                              ""
+                                                                                            }</span>
+                                                                                          </div>
+                                                                                        </div>
 
-                                                                      <div class="footer-section">
-                                                                        <div class="footer-row">
-                                                                          <div class="footer-item">
-                                                                            <span class="label">鏀惰揣鐢佃瘽锛�</span>
-                                                                            <span class="value"></span>
-                                                                          </div>
-                                                                          <div class="footer-item">
-                                                                            <span class="label">鏀惰揣浜猴細</span>
-                                                                            <span class="value"></span>
-                                                                          </div>
-                                                                          <div class="footer-item address-item">
-                                                                            <span class="label">鏀惰揣鍦板潃锛�</span>
-                                                                            <span class="value address-value"></span>
-                                                                          </div>
-                                                                        </div>
-                                                                        <div class="footer-row">
-                                                                          <div class="footer-item">
-                                                                            <span class="label">鎿嶄綔鍛橈細</span>
-                                                                            <span class="value">${
-                                                                              userStore.nickName ||
-                                                                              "鎾曞紑鍓�"
-                                                                            }</span>
-                                                                          </div>
-                                                                          <div class="footer-item">
-                                                                            <span class="label">鎵撳嵃鏃ユ湡锛�</span>
-                                                                            <span class="value">${formatDateTime(
-                                                                              new Date()
-                                                                            )}</span>
-                                                                          </div>
-                                                                        </div>
-                                                                      </div>
-                                                                    </div>
-                                                                  </div>
-                                                                `;
+                                                                                        <div class="table-section">
+                                                                                          <table class="product-table">
+                                                                                            <thead>
+                                                                                              <tr>
+                                                                                                <th>浜у搧鍚嶇О</th>
+                                                                                                <th>瑙勬牸鍨嬪彿</th>
+                                                                                                <th>鍗曚綅</th>
+                                                                                                <th>鍗曚环</th>
+                                                                                                <th>闆跺敭鏁伴噺</th>
+                                                                                                <th>闆跺敭閲戦</th>
+                                                                                              </tr>
+                                                                                            </thead>
+                                                                                            <tbody>
+                                                                                              ${
+                                                                                                item.products &&
+                                                                                                item
+                                                                                                  .products
+                                                                                                  .length >
+                                                                                                  0
+                                                                                                  ? item.products
+                                                                                                      .map(
+                                                                                                        product => `
+                                                                                                  <tr>
+                                                                                                    <td>${
+                                                                                                      product.productCategory ||
+                                                                                                      ""
+                                                                                                    }</td>
+                                                                                                    <td>${
+                                                                                                      product.specificationModel ||
+                                                                                                      ""
+                                                                                                    }</td>
+                                                                                                    <td>${
+                                                                                                      product.unit ||
+                                                                                                      ""
+                                                                                                    }</td>
+                                                                                                    <td>${
+                                                                                                      product.taxInclusiveUnitPrice ||
+                                                                                                      "0"
+                                                                                                    }</td>
+                                                                                                    <td>${
+                                                                                                      product.quantity ||
+                                                                                                      "0"
+                                                                                                    }</td>
+                                                                                                    <td>${
+                                                                                                      product.taxInclusiveTotalPrice ||
+                                                                                                      "0"
+                                                                                                    }</td>
+                                                                                                  </tr>
+                                                                                                `
+                                                                                                      )
+                                                                                                      .join(
+                                                                                                        ""
+                                                                                                      )
+                                                                                                  : '<tr><td colspan="6" style="text-align: center; color: #999;">鏆傛棤浜у搧鏁版嵁</td></tr>'
+                                                                                              }
+                                                                                            </tbody>
+                                                                                            <tfoot>
+                                                                                              <tr>
+                                                                                                <td class="label">鍚堣</td>
+                                                                                                <td class="total-value"></td>
+                                                                                                <td class="total-value"></td>
+                                                                                                <td class="total-value"></td>
+                                                                                                <td class="total-value">${getTotalQuantityForPrint(
+                                                                                                  item.products
+                                                                                                )}</td>
+                                                                                                <td class="total-value">${getTotalAmountForPrint(
+                                                                                                  item.products
+                                                                                                )}</td>
+                                                                                              </tr>
+                                                                                            </tfoot>
+                                                                                          </table>
+                                                                                        </div>
+
+                                                                                        <div class="footer-section">
+                                                                                          <div class="footer-row">
+                                                                                            <div class="footer-item">
+                                                                                              <span class="label">鏀惰揣鐢佃瘽锛�</span>
+                                                                                              <span class="value"></span>
+                                                                                            </div>
+                                                                                            <div class="footer-item">
+                                                                                              <span class="label">鏀惰揣浜猴細</span>
+                                                                                              <span class="value"></span>
+                                                                                            </div>
+                                                                                            <div class="footer-item address-item">
+                                                                                              <span class="label">鏀惰揣鍦板潃锛�</span>
+                                                                                              <span class="value address-value"></span>
+                                                                                            </div>
+                                                                                          </div>
+                                                                                          <div class="footer-row">
+                                                                                            <div class="footer-item">
+                                                                                              <span class="label">鎿嶄綔鍛橈細</span>
+                                                                                              <span class="value">${
+                                                                                                userStore.nickName ||
+                                                                                                "鎾曞紑鍓�"
+                                                                                              }</span>
+                                                                                            </div>
+                                                                                            <div class="footer-item">
+                                                                                              <span class="label">鎵撳嵃鏃ユ湡锛�</span>
+                                                                                              <span class="value">${formatDateTime(
+                                                                                                new Date()
+                                                                                              )}</span>
+                                                                                            </div>
+                                                                                          </div>
+                                                                                        </div>
+                                                                                      </div>
+                                                                                    </div>
+                                                                                  `;
     });
 
     printContent += `
-                                                                </body>
-                                                                </html>
-                                                              `;
+                                                                                  </body>
+                                                                                  </html>
+                                                                                `;
 
     // 鍐欏叆鍐呭鍒版柊绐楀彛
     printWindow.document.write(printContent);
@@ -2654,7 +2687,11 @@
 
     // 鍙戣揣鐘舵�佸繀椤绘槸"寰呭彂璐�"鎴�"瀹℃牳鎷掔粷"
     const statusStr = shippingStatus ? String(shippingStatus).trim() : "";
-    return statusStr === "寰呭彂璐�" || statusStr === "瀹℃牳鎷掔粷" || statusStr === "閮ㄥ垎鍙戣揣";
+    return (
+      statusStr === "寰呭彂璐�" ||
+      statusStr === "瀹℃牳鎷掔粷" ||
+      statusStr === "閮ㄥ垎鍙戣揣"
+    );
   };
 
   // 鎵撳紑闄勪欢寮圭獥
@@ -3007,4 +3044,4 @@
       page-break-after: avoid;
     }
   }
-</style>
+</style>
\ No newline at end of file
diff --git a/src/views/system/user/index.vue b/src/views/system/user/index.vue
index 9d16126..f3059f8 100644
--- a/src/views/system/user/index.vue
+++ b/src/views/system/user/index.vue
@@ -511,6 +511,9 @@
 		roleOptions.value = response.roles
 		form.value.postIds = response.postIds
 		form.value.roleIds = response.roleIds
+		if (response.deptIds && response.deptIds.length > 0) {
+			form.value.deptId = response.deptIds[0]
+		}
 		open.value = true
 		title.value = "淇敼鐢ㄦ埛"
 		form.password = ""
diff --git a/src/views/systemArchitecture/index.vue b/src/views/systemArchitecture/index.vue
index 1eb37bb..a070122 100644
--- a/src/views/systemArchitecture/index.vue
+++ b/src/views/systemArchitecture/index.vue
@@ -1,436 +1,626 @@
 <template>
   <div class="architecture-page">
-    <section ref="canvasRef" class="canvas">
-      <svg
-        v-if="linkPath"
-        class="link-overlay"
-        :width="svgSize.width"
-        :height="svgSize.height"
-        aria-hidden="true"
-      >
-        <defs>
-          <marker
-            id="erp-link-arrow"
-            markerWidth="10"
-            markerHeight="10"
-            refX="7"
-            refY="3.5"
-            orient="auto"
-            markerUnits="strokeWidth"
-          >
-            <path d="M0,0 L0,7 L7,3.5 z" fill="#94a3b8" />
-          </marker>
-        </defs>
-        <path
-          :d="linkPath"
-          class="link-overlay__path"
-          marker-end="url(#erp-link-arrow)"
-        />
-      </svg>
+    <div class="architecture-shell">
+      <header class="page-title">
+        <span class="page-title__bar"></span>
+        <h1>绯荤粺鏋舵瀯鍥�</h1>
+      </header>
 
-      <section
-        v-for="row in architectureRows"
-        :key="row.key"
-        class="lane"
-      >
-        <aside class="lane__aside">
-          <svg-icon :icon-class="row.icon" class="lane__icon" />
-          <h2>{{ row.label }}</h2>
-          <span class="lane__arrow"></span>
-        </aside>
+      <section class="section-card section-card--top">
+        <article class="module-title module-title--basic">
+          <div class="module-title__icon">
+            <img :src="jichupeizhi" alt="鍩虹閰嶇疆" />
+          </div>
+          <div class="module-title__text">
+            <h2>鍩虹閰嶇疆</h2>
+            <p>绯荤粺鍩虹淇℃伅绠$悊</p>
+          </div>
+        </article>
 
-        <div class="lane__flow">
-          <div
-            v-for="(item, index) in row.items"
-            :key="item.name"
-            class="node-wrap"
-          >
-            <article
-              class="node"
-              :class="{ 'node--accent': item.accent }"
-              :ref="setNodeRef(item)"
-            >
-              <span class="node__mark">
-                <span class="node__cap"></span>
-                <span class="node__base"></span>
-                <svg-icon :icon-class="item.icon" class="node__icon" />
-              </span>
-              <h3>{{ item.name }}</h3>
-            </article>
-            <span v-if="index < row.items.length - 1" class="flow-arrow"></span>
+        <div class="flow-row flow-row--top">
+          <template v-for="item in basicFlow" :key="item.key">
+            <div class="flow-item">
+              <article class="flow-node">
+                <div class="flow-node__icon">
+                  <img :src="item.icon" :alt="item.name" />
+                </div>
+                <span>{{ item.name }}</span>
+              </article>
+            </div>
+          </template>
+        </div>
+      </section>
+
+      <section class="middle-layout">
+        <div class="panel-card panel-card--sale">
+          <article class="module-title module-title--sale">
+            <div class="module-title__icon">
+              <img :src="xiaoshoupeizhi" alt="閿�鍞厤缃�" />
+            </div>
+            <div class="module-title__text">
+              <h2>閿�鍞厤缃�</h2>
+              <p>瀹㈡埛涓庨攢鍞鐞�</p>
+            </div>
+          </article>
+
+          <div class="flow-grid flow-grid--sale">
+            <template v-for="(item, index) in saleFlow" :key="item.key">
+              <div class="grid-cell">
+                <article class="flow-node">
+                  <div class="flow-node__icon" :class="{ 'flow-node__icon--accent': item.accent }">
+                    <img :src="item.icon" :alt="item.name" />
+                  </div>
+                  <span>{{ item.name }}</span>
+                </article>
+                <span
+                  v-if="item.arrow === 'right'"
+                  class="flow-arrow flow-arrow--right flow-arrow--grid"
+                ></span>
+                <span
+                  v-if="item.arrow === 'down'"
+                  class="flow-arrow flow-arrow--down flow-arrow--grid"
+                ></span>
+              </div>
+            </template>
+          </div>
+        </div>
+
+        <div class="ai-stage">
+          <div class="ai-stage__ring">
+            <div class="ai-stage__core">
+              <img :src="aiHead" alt="AI 鏍稿績寮曟搸" />
+            </div>
+          </div>
+        </div>
+
+        <div class="panel-card panel-card--purchase">
+          <article class="module-title module-title--purchase">
+            <div class="module-title__icon">
+              <img :src="caigoupeizhi" alt="閲囪喘閰嶇疆" />
+            </div>
+            <div class="module-title__text">
+              <h2>閲囪喘閰嶇疆</h2>
+              <p>閲囪喘涓庝緵搴斿晢绠$悊</p>
+            </div>
+          </article>
+
+          <div class="flow-grid flow-grid--purchase">
+            <template v-for="(item, index) in purchaseFlow" :key="item.key">
+              <div class="grid-cell">
+                <article class="flow-node">
+                  <div class="flow-node__icon" :class="{ 'flow-node__icon--accent': item.accent }">
+                    <img :src="item.icon" :alt="item.name" />
+                  </div>
+                  <span>{{ item.name }}</span>
+                </article>
+                <span
+                  v-if="item.arrow === 'right'"
+                  class="flow-arrow flow-arrow--right flow-arrow--grid"
+                ></span>
+                <span
+                  v-if="item.arrow === 'down'"
+                  class="flow-arrow flow-arrow--down flow-arrow--grid"
+                ></span>
+              </div>
+            </template>
           </div>
         </div>
       </section>
-    </section>
+
+      <section class="section-card section-card--bottom">
+        <article class="module-title module-title--produce">
+          <div class="module-title__icon">
+            <img :src="shengchanpeizhi" alt="鐢熶骇閰嶇疆" />
+          </div>
+          <div class="module-title__text">
+            <h2>鐢熶骇閰嶇疆</h2>
+            <p>鐢熶骇杩囩▼绠$悊</p>
+          </div>
+        </article>
+
+        <div class="flow-row flow-row--wide">
+          <template v-for="(item, index) in produceFlow" :key="item.key">
+            <div class="flow-item">
+              <article class="flow-node">
+                <div class="flow-node__icon" :class="{ 'flow-node__icon--green': item.green, 'flow-node__icon--accent': item.accent }">
+                  <img :src="item.icon" :alt="item.name" />
+                </div>
+                <span>{{ item.name }}</span>
+              </article>
+              <span v-if="index < produceFlow.length - 1" class="flow-arrow flow-arrow--right"></span>
+            </div>
+          </template>
+        </div>
+      </section>
+
+      <section class="section-card section-card--bottom">
+        <article class="module-title module-title--store">
+          <div class="module-title__icon">
+            <img :src="cangchuwuliu" alt="浠撳偍鐗╂祦" />
+          </div>
+          <div class="module-title__text">
+            <h2>浠撳偍鐗╂祦</h2>
+            <p>搴撳瓨涓庡嚭鍏ュ簱绠$悊</p>
+          </div>
+        </article>
+
+        <div class="flow-row flow-row--store">
+          <template v-for="(item, index) in storeFlow" :key="item.key">
+            <div class="flow-item">
+              <article class="flow-node">
+                <div class="flow-node__icon">
+                  <img :src="item.icon" :alt="item.name" />
+                </div>
+                <span>{{ item.name }}</span>
+              </article>
+              <span v-if="index < storeFlow.length - 1" class="flow-arrow flow-arrow--right"></span>
+            </div>
+          </template>
+        </div>
+      </section>
+    </div>
   </div>
 </template>
 
 <script setup>
-import { nextTick, onBeforeUnmount, onMounted, onUpdated, ref } from 'vue'
+import aiHead from '@/assets/system/ai.svg'
+import jichupeizhi from '@/assets/system/jichupeizhi.svg'
+import xiaoshoupeizhi from '@/assets/system/xiaoshoupeizhi.svg'
+import caigoupeizhi from '@/assets/system/caigoupeizhi.svg'
+import shengchanpeizhi from '@/assets/system/shengchanpeizhi.svg'
+import cangchuwuliu from '@/assets/system/cangchuwuliu.svg'
 
-const architectureRows = [
-  {
-    key: 'basic',
-    label: '鍩虹閰嶇疆',
-    icon: 'system',
-    items: [
-      { name: '瑙掕壊鐢ㄦ埛绠$悊', icon: 'user' },
-      { name: '浜у搧缁存姢', icon: 'monitor' },
-      { name: '瀹℃壒绠$悊', icon: 'tree', accent: true }
-    ]
-  },
-  {
-    key: 'sale',
-    label: '閿�鍞�',
-    icon: 'chart',
-    items: [
-      { name: '瀹㈡埛妗f', icon: 'peoples' },
-      { name: '閿�鍞姤浠�', icon: 'form' },
-      { name: '閿�鍞彴璐�', icon: 'table' },
-      { name: '鍙戣揣鍙拌处', icon: 'clipboard', accent: true, linkSource: true },
-      { name: '閿�鍞��璐�', icon: 'nested' },
-      { name: '瀹㈡埛寰�鏉�', icon: 'money' },
-      { name: '鎸囨爣缁熻', icon: 'chart' }
-    ]
-  },
-  {
-    key: 'purchase',
-    label: '閲囪喘',
-    icon: 'shopping',
-    items: [
-      { name: '渚涘簲鍟嗘。妗�', icon: 'people' },
-      { name: '閲囪喘鍙拌处', icon: 'table', accent: true },
-      { name: '閲囪喘閫�璐�', icon: 'nested' },
-      { name: '渚涘簲鍟嗗線鏉�', icon: 'money' },
-      { name: '閲囪喘鎶ヨ〃', icon: 'chart' }
-    ]
-  },
-  {
-    key: 'produce',
-    label: '鐢熶骇',
-    icon: 'build',
-    items: [
-      { name: '宸ュ簭', icon: 'tree' },
-      { name: 'BOM', icon: 'list' },
-      { name: '宸ヨ壓璺嚎', icon: 'guide' },
-      { name: '鐢熶骇璁㈠崟', icon: 'form' },
-      { name: '鐢熶骇鎺掍骇', icon: 'date' },
-      { name: '鐢熶骇鎶ュ伐', icon: 'edit' },
-      { name: '鎶ュ伐鍙拌处', icon: 'clipboard' },
-      { name: '鐢熶骇鏍哥畻', icon: 'money', accent: true }
-    ]
-  },
-  {
-    key: 'store',
-    label: '浠撳偍鐗╂祦',
-    icon: 'redis',
-    items: [
-      { name: '鍏ュ簱绠$悊', icon: 'download', accent: true },
-      { name: '鍑哄簱绠$悊', icon: 'upload', accent: true, linkTarget: true },
-      { name: '搴撳瓨绠$悊', icon: 'redis-list' }
-    ]
-  }
+import yonghuguanli from '@/assets/system/yonghuguanli.svg'
+import shenpiguanli from '@/assets/system/shenpiguanli.svg'
+import chanpinweihu from '@/assets/system/chanpinweihu.svg'
+
+import kehudangan from '@/assets/system/kehudangan.svg'
+import xiaoshoubaojia from '@/assets/system/xiaoshoubaojia.svg'
+import xiaoshoutaizhang from '@/assets/system/xiaoshoutaizhang.svg'
+import fahuotaizhang from '@/assets/system/fahuotaizhang.svg'
+import xiaoshoutuihuo from '@/assets/system/xiaoshoutuihuo.svg'
+
+import gongyingshangdangan from '@/assets/system/gongyingshangdangan.svg'
+import caigoutaizhang from '@/assets/system/caigoutaizhang.svg'
+import caigoutuihuo from '@/assets/system/caigoutuihuo.svg'
+import gongyingshangwanglai from '@/assets/system/gongyingshangwanglai.svg'
+import caigoubaobiao from '@/assets/system/caigoubaobiao.svg'
+
+import gongxu from '@/assets/system/gongxu.svg'
+import BOM from '@/assets/system/BOM.svg'
+import shengchandingdan from '@/assets/system/shengchandingdan.svg'
+import shengchanpaichan from '@/assets/system/shengchanpaichan.svg'
+import baogong from '@/assets/system/baogong.svg'
+import baogongtaizhang from '@/assets/system/baogongtaizhang.svg'
+import shengchanheduan from '@/assets/system/shengchanheduan.svg'
+
+import rukuguanli from '@/assets/system/rukuguanli.svg'
+import chukuguanli from '@/assets/system/chukuguanli.svg'
+import kucunguanli from '@/assets/system/kucunguanli.svg'
+
+const basicFlow = [
+  { key: 'basic-user', name: '鐢ㄦ埛绠$悊', icon: yonghuguanli },
+  { key: 'basic-approval', name: '瀹℃壒绠$悊', icon: shenpiguanli },
+  { key: 'basic-product', name: '浜у搧缁存姢', icon: chanpinweihu }
 ]
 
-const canvasRef = ref(null)
-const sourceNodeRef = ref(null)
-const targetNodeRef = ref(null)
-const linkPath = ref('')
-const svgSize = ref({ width: 0, height: 0 })
-let resizeObserver = null
+const saleFlow = [
+  { key: 'sale-customer', name: '瀹㈡埛妗f', icon: kehudangan, arrow: 'right' },
+  { key: 'sale-quote', name: '閿�鍞姤浠�', icon: xiaoshoubaojia, arrow: 'right' },
+  { key: 'sale-ledger', name: '閿�鍞彴璐�', icon: xiaoshoutaizhang, arrow: 'right' },
+  { key: 'sale-delivery', name: '鍙戣揣鍙拌处', icon: fahuotaizhang, arrow: 'right' },
+  { key: 'sale-return', name: '閿�鍞��璐�', icon: xiaoshoutuihuo, accent: true }
+]
 
-function setNodeRef(item) {
-  return (el) => {
-    if (item.linkSource) sourceNodeRef.value = el
-    if (item.linkTarget) targetNodeRef.value = el
-  }
-}
+const purchaseFlow = [
+  { key: 'purchase-supplier', name: '渚涘簲鍟嗘。妗�', icon: gongyingshangdangan, arrow: 'right' },
+  { key: 'purchase-ledger', name: '閲囪喘鍙拌处', icon: caigoutaizhang, arrow: 'right' },
+  { key: 'purchase-return', name: '閲囪喘閫�璐�', icon: caigoutuihuo, accent: true },
+  { key: 'purchase-contact', name: '渚涘簲鍟嗗線鏉�', icon: gongyingshangwanglai, arrow: 'right' },
+  { key: 'purchase-report', name: '閲囪喘鎶ヨ〃', icon: caigoubaobiao }
+]
 
-function resetLine() {
-  linkPath.value = ''
-}
+const produceFlow = [
+  { key: 'produce-process', name: '宸ュ簭', icon: gongxu },
+  { key: 'produce-bom', name: 'BOM', icon: BOM },
+  { key: 'produce-order', name: '鐢熶骇璁㈠崟', icon: shengchandingdan, green: true },
+  { key: 'produce-schedule', name: '鐢熶骇鎺掍骇', icon: shengchanpaichan },
+  { key: 'produce-work', name: '鐢熶骇鎶ュ伐', icon: baogong },
+  { key: 'produce-ledger', name: '鎶ュ伐鍙拌处', icon: baogongtaizhang },
+  { key: 'produce-cost', name: '鐢熶骇鏍哥畻', icon: shengchanheduan, accent: true }
+]
 
-function updateLinkLine() {
-  if (!canvasRef.value || !sourceNodeRef.value || !targetNodeRef.value || window.innerWidth <= 768) {
-    resetLine()
-    return
-  }
-
-  const canvasRect = canvasRef.value.getBoundingClientRect()
-  const sourceRect = sourceNodeRef.value.getBoundingClientRect()
-  const targetRect = targetNodeRef.value.getBoundingClientRect()
-
-  svgSize.value = {
-    width: Math.ceil(canvasRef.value.scrollWidth),
-    height: Math.ceil(canvasRef.value.scrollHeight)
-  }
-
-  const startX = sourceRect.left + sourceRect.width / 2 - canvasRect.left
-  const startY = sourceRect.bottom - canvasRect.top + 2
-  const endX = targetRect.left + targetRect.width / 2 - canvasRect.left
-  const endY = targetRect.top - canvasRect.top - 6
-  const middleY = startY + Math.max(24, (endY - startY) / 2)
-
-  linkPath.value = `M ${startX} ${startY} L ${startX} ${middleY} L ${endX} ${middleY} L ${endX} ${endY}`
-}
-
-function handleResize() {
-  requestAnimationFrame(() => {
-    requestAnimationFrame(updateLinkLine)
-  })
-}
-
-onMounted(async () => {
-  await nextTick()
-  handleResize()
-  window.addEventListener('resize', handleResize)
-  if (window.ResizeObserver && canvasRef.value) {
-    resizeObserver = new ResizeObserver(handleResize)
-    resizeObserver.observe(canvasRef.value)
-  }
-})
-
-onUpdated(() => {
-  nextTick(handleResize)
-})
-
-onBeforeUnmount(() => {
-  window.removeEventListener('resize', handleResize)
-  if (resizeObserver) resizeObserver.disconnect()
-})
+const storeFlow = [
+  { key: 'store-in', name: '鍏ュ簱绠$悊', icon: rukuguanli },
+  { key: 'store-out', name: '鍑哄簱绠$悊', icon: chukuguanli },
+  { key: 'store-stock', name: '搴撳瓨绠$悊', icon: kucunguanli }
+]
 </script>
 
 <style scoped>
 .architecture-page {
-  min-height: calc(100vh - 84px);
-  padding: 18px;
-  background: #f6f7f9;
+  padding: 20px 0;
 }
 
-.canvas {
-  position: relative;
-  display: grid;
-  gap: 10px;
+.architecture-shell {
+  max-width: 1680px;
+  margin: 0 auto;
+  padding: 12px 12px 18px;
+  border-radius: 34px;
+  background: linear-gradient(180deg, rgba(255, 255, 255, 0.98) 0%, rgba(246, 250, 255, 0.98) 100%);
+  box-shadow:
+    0 18px 48px rgba(117, 146, 198, 0.12),
+    inset 0 0 0 1px rgba(228, 237, 250, 0.9);
 }
 
-.lane {
-  display: grid;
-  grid-template-columns: 94px 1fr;
-  gap: 10px;
-  align-items: stretch;
-}
-
-.lane__aside {
+.page-title {
   display: flex;
   align-items: center;
-  justify-content: center;
-  gap: 8px;
-  padding: 8px 6px;
+  gap: 12px;
+  padding: 8px 10px 18px;
 }
 
-.lane__icon {
-  font-size: 18px;
-  color: #2563eb;
-  flex-shrink: 0;
+.page-title__bar {
+  width: 5px;
+  height: 24px;
+  border-radius: 999px;
+  background: linear-gradient(180deg, #1f71ff 0%, #5daaff 100%);
 }
 
-.lane__aside h2 {
+.page-title h1 {
   margin: 0;
-  width: 34px;
+  font-size: 24px;
+  font-weight: 700;
+  color: #1f2d3d;
+}
+
+.section-card,
+.panel-card {
+  background: rgba(255, 255, 255, 0.96);
+  border-radius: 26px;
+  box-shadow:
+    0 12px 28px rgba(118, 147, 204, 0.08),
+    0 4px 12px rgba(118, 147, 204, 0.05);
+}
+
+.section-card {
+  display: grid;
+  grid-template-columns: 290px minmax(0, 1fr);
+  gap: 8px;
+  align-items: center;
+  padding: 18px 24px;
+}
+
+.section-card + .section-card {
+  margin-top: 18px;
+}
+
+.middle-layout {
+  display: grid;
+  grid-template-columns: minmax(300px, 1fr) 420px minmax(300px, 1fr);
+  gap: 18px;
+  align-items: center;
+}
+
+.panel-card {
+  min-height: 284px;
+  padding: 16px 18px 18px;
+}
+
+.module-title {
+  display: flex;
+  align-items: center;
+  gap: 10px;
+}
+
+.module-title__icon {
+  width: 72px;
+  height: 72px;
+  display: grid;
+  place-items: center;
+}
+
+.module-title__icon img {
+  width: 100%;
+  height: 100%;
+}
+
+.module-title__text h2 {
+  margin: 0;
+  font-size: 17px;
+  font-weight: 800;
+  color: #1f2d3d;
+}
+
+.module-title__text p {
+  margin: 6px 0 0;
   font-size: 12px;
-  line-height: 1.15;
-  font-weight: 600;
-  color: #1f2937;
+  color: #7f8ba3;
+}
+
+
+
+.flow-row {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  gap: 8px;
+  min-width: 0;
+}
+
+.flow-row--top {
+  padding-right: 16px;
+}
+
+.flow-row--wide {
+  gap: 2px;
+}
+
+.flow-row--store {
+  justify-content: flex-start;
+  gap: 36px;
+}
+
+.flow-item {
+  display: flex;
+  align-items: center;
+  min-width: 0;
+}
+
+.flow-node {
+  width: 84px;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  gap: 8px;
   text-align: center;
 }
 
-.lane__arrow {
-  position: relative;
-  width: 16px;
-  height: 1px;
-  background: #cbd5e1;
-  flex-shrink: 0;
+.flow-node__icon {
+  width: 38px;
+  height: 38px;
+  display: grid;
+  place-items: center;
+  color: #3f76f3;
+  font-size: 24px;
 }
 
-.lane__arrow::after {
+.flow-node__icon img {
+  width: 100%;
+  height: 100%;
+  object-fit: contain;
+}
+
+.flow-node__icon--accent {
+  color: #ff6c4f;
+}
+
+.flow-node__icon--green {
+  color: #2bb875;
+}
+
+.flow-node span {
+  font-size: 13px;
+  line-height: 1.2;
+  font-weight: 600;
+  color: #1f2d3d;
+}
+
+.flow-arrow {
+  position: relative;
+  flex: 0 0 auto;
+  opacity: 0.68;
+}
+
+.flow-arrow--right {
+  width: 24px;
+  height: 1px;
+  margin: 0 4px;
+  background: linear-gradient(90deg, rgba(182, 205, 255, 0.9) 0%, rgba(127, 168, 255, 0.9) 100%);
+}
+
+.flow-arrow--right::after {
   content: '';
   position: absolute;
+  right: 0;
   top: 50%;
-  right: -1px;
   width: 6px;
   height: 6px;
-  border-top: 1px solid #cbd5e1;
-  border-right: 1px solid #cbd5e1;
+  border-top: 1px solid #8aacff;
+  border-right: 1px solid #8aacff;
   transform: translateY(-50%) rotate(45deg);
 }
 
-.lane__flow {
-  position: relative;
-  z-index: 2;
-  display: flex;
-  flex-wrap: wrap;
-  align-items: center;
-  gap: 8px;
-  padding: 12px 14px;
-  background: #f1f3f5;
+.flow-arrow--down {
+  width: 1px;
+  height: 22px;
+  margin: 2px auto 0;
+  background: linear-gradient(180deg, rgba(182, 205, 255, 0.9) 0%, rgba(127, 168, 255, 0.9) 100%);
 }
 
-.node-wrap {
-  display: flex;
-  align-items: center;
-  gap: 8px;
-  position: relative;
+.flow-arrow--down::after {
+  content: '';
+  position: absolute;
+  left: 50%;
+  bottom: 0;
+  width: 6px;
+  height: 6px;
+  border-right: 1px solid #8aacff;
+  border-bottom: 1px solid #8aacff;
+  transform: translateX(-50%) rotate(45deg);
 }
 
-.node {
-  width: 100px;
-  min-height: 72px;
-  padding: 4px 2px;
+.flow-grid {
+  display: grid;
+  margin-top: 26px;
+}
+
+.flow-grid--sale {
+  grid-template-columns: repeat(3, minmax(0, 1fr));
+  row-gap: 18px;
+}
+
+.flow-grid--purchase {
+  grid-template-columns: repeat(3, 1fr);
+  grid-template-rows: repeat(2, auto);
+  row-gap: 34px;
+}
+
+.grid-cell {
+  position: relative;
+  min-height: 80px;
+}
+
+.flow-arrow--grid.flow-arrow--right {
+  position: absolute;
+  top: 18px;
+  right: 2px;
+  margin: 0;
+}
+
+.flow-arrow--grid.flow-arrow--down {
+  position: absolute;
+  left: 50%;
+  bottom: -2px;
+  transform: translateX(-50%);
+  margin: 0;
+}
+
+.ai-stage {
+  position: relative;
+  height: 388px;
   display: flex;
   flex-direction: column;
   align-items: center;
   justify-content: center;
-  gap: 6px;
+  transform: translateX(-30px);
 }
 
-.node__mark {
+.ai-stage__ring {
+  width: 300px;
+  height: 300px;
+  display: grid;
+  place-items: center;
   position: relative;
-  width: 34px;
-  height: 28px;
-  display: flex;
-  align-items: flex-start;
-  justify-content: center;
 }
 
-.node__cap {
-  position: absolute;
-  top: 0;
-  width: 18px;
-  height: 14px;
-  border-radius: 4px 4px 3px 3px;
-  background: linear-gradient(180deg, #60a5fa, #2563eb);
-  box-shadow: 0 3px 6px rgba(37, 99, 235, 0.16);
+.ai-stage__core {
+  width: 340px;
+  height: 340px;
+  display: grid;
+  place-items: center;
 }
 
-.node__base {
-  position: absolute;
-  bottom: 0;
-  width: 30px;
-  height: 12px;
-  border-radius: 4px;
-  background: linear-gradient(180deg, #ffffff, #e8edf3);
-  border: 1px solid #d7dee7;
+.ai-stage__core img {
+  width: 360px;
+  height: 360px;
+  object-fit: contain;
+  transform: translateY(-24px);
+  filter: drop-shadow(0 10px 24px rgba(76, 135, 255, 0.22));
 }
 
-.node__icon {
-  position: relative;
-  z-index: 1;
-  margin-top: 2px;
-  font-size: 15px;
-  color: #ffffff;
+.ai-stage__base {
+  width: 210px;
+  height: 42px;
+  margin-top: -14px;
+  border-radius: 999px;
+  background:
+    radial-gradient(circle at center, rgba(111, 223, 255, 0.8) 0%, rgba(111, 223, 255, 0.22) 34%, rgba(111, 223, 255, 0) 66%),
+    linear-gradient(180deg, #ffffff 0%, #dce9ff 100%);
+  box-shadow:
+    0 10px 22px rgba(102, 145, 222, 0.14),
+    inset 0 -4px 10px rgba(94, 170, 255, 0.2);
 }
 
-.node--accent .node__cap {
-  background: linear-gradient(180deg, #2dd4bf, #0f766e);
-  box-shadow: 0 3px 6px rgba(15, 118, 110, 0.16);
+.ai-stage__label {
+  margin-top: 18px;
+  padding: 8px 18px;
+  border-radius: 999px;
+  background: rgba(255, 255, 255, 0.9);
+  color: #537ae5;
+  font-size: 14px;
+  font-weight: 700;
+  box-shadow: 0 10px 20px rgba(118, 147, 204, 0.08);
 }
 
-.node h3 {
-  margin: 0;
-  font-size: 12px;
-  line-height: 1.3;
-  font-weight: 600;
-  color: #111827;
-  text-align: center;
-}
+@media (max-width: 1440px) {
+  .middle-layout {
+    grid-template-columns: 1fr 360px 1fr;
+  }
 
-.flow-arrow {
-  width: 18px;
-  height: 1px;
-  background: #b6c1ce;
-  position: relative;
-  flex-shrink: 0;
-}
+  .ai-stage__ring {
+    width: 260px;
+    height: 260px;
+  }
 
-.flow-arrow::after {
-  content: '';
-  position: absolute;
-  top: 50%;
-  right: -1px;
-  width: 6px;
-  height: 6px;
-  border-top: 1px solid #94a3b8;
-  border-right: 1px solid #94a3b8;
-  transform: translateY(-50%) rotate(45deg);
-}
-
-.link-overlay {
-  position: absolute;
-  inset: 0;
-  z-index: 20;
-  pointer-events: none;
-  overflow: visible;
-}
-
-.link-overlay__path {
-  fill: none;
-  stroke: #94a3b8;
-  stroke-width: 1;
-  stroke-dasharray: 4 4;
-  stroke-linecap: round;
-  stroke-linejoin: round;
+  .ai-stage__core img {
+    width: 272px;
+    height: 272px;
+  }
 }
 
 @media (max-width: 1180px) {
-  .lane {
+  .section-card {
     grid-template-columns: 1fr;
-    gap: 6px;
+    gap: 18px;
   }
 
-  .lane__aside {
-    justify-content: flex-start;
+  .middle-layout {
+    grid-template-columns: 1fr;
+  }
+
+  .ai-stage {
+    order: 2;
+    height: 360px;
+  }
+
+  .panel-card--sale {
+    order: 1;
+  }
+
+  .panel-card--purchase {
+    order: 3;
   }
 }
 
-@media (max-width: 768px) {
+@media (max-width: 860px) {
   .architecture-page {
     padding: 12px;
   }
 
-  .lane__flow {
-    display: grid;
-    gap: 8px;
-    padding: 12px;
+  .architecture-shell {
+    padding: 10px;
+    border-radius: 24px;
   }
 
-  .node-wrap {
-    display: grid;
-    gap: 8px;
+  .page-title h1 {
+    font-size: 22px;
   }
 
-  .node {
-    width: 100%;
-    min-height: 52px;
-    flex-direction: row;
+  .section-card,
+  .panel-card {
+    padding: 16px;
+    border-radius: 20px;
+  }
+
+  .module-title__icon {
+    width: 40px;
+    height: 46px;
+    font-size: 16px;
+  }
+
+  .module-title__text h2 {
+    font-size: 16px;
+  }
+
+  .flow-row {
     justify-content: flex-start;
-    gap: 10px;
+    flex-wrap: wrap;
   }
 
-  .node h3 {
-    text-align: left;
-  }
-
-  .flow-arrow {
-    width: 1px;
-    height: 16px;
-    margin: 0 auto;
-  }
-
-  .flow-arrow::after {
-    top: auto;
-    bottom: -1px;
-    right: 50%;
-    transform: translateX(50%) rotate(135deg);
+  .flow-grid--sale,
+  .flow-grid--purchase {
+    grid-template-columns: repeat(2, 1fr);
   }
 }
 </style>
diff --git a/vite.config.js b/vite.config.js
index 03311be..fcc019d 100644
--- a/vite.config.js
+++ b/vite.config.js
@@ -12,7 +12,7 @@
           : env.VITE_BASE_API;
   const javaUrl =
       env.VITE_APP_ENV === "development"
-          ? "http://1.15.17.182:9049"
+          ? "http://1.15.17.182:9048"
           : env.VITE_JAVA_API;
   return {
     define:{

--
Gitblit v1.9.3