From dcc3a4d842740f7ff6e79a58ddec945f50ea9b5d Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期三, 03 六月 2026 10:10:22 +0800
Subject: [PATCH] Merge branch 'dev_NEW_pro' into dev_宁夏_英泽防锈

---
 src/views/procurementManagement/qualityInspection/index.vue                                    |   16 
 src/views/procurementManagement/purchaseOrder/index.vue                                        |   15 
 src/api/procurementManagement/procurementLedger.js                                             |   70 +
 src/views/basicData/parameterMaintenance/index.vue                                             |   14 
 multiple/assets/favicon/QFSWfavicon.ico                                                        |    0 
 src/views/salesManagement/salesLedger/index.vue                                                |   26 
 multiple/assets/favicon/RFSYfavicon.ico                                                        |    0 
 src/views/officeProcessAutomation/ApproveManage/approve-list/components/ApproveDetailPanel.vue |  123 +++
 src/views/productManagement/productIdentifier/index.vue                                        |   11 
 src/views/collaborativeApproval/sealManagement/index.vue                                       |   94 +
 multiple/assets/logo/ZDJCLogo.png                                                              |    0 
 src/views/procurementManagement/procurementPlan/index.vue                                      |   13 
 multiple/assets/logo/QFSWLogo.png                                                              |    0 
 src/views/financialManagement/assets/intangibleAssets.vue                                      |   11 
 multiple/assets/favicon/RFSYLogo.png                                                           |    0 
 src/views/safeProduction/safetyTrainingAssessment/index.vue                                    |   11 
 src/layout/components/Sidebar/SidebarItem.vue                                                  |  107 +-
 multiple/assets/favicon/ZDJCfavicon.ico                                                        |    0 
 multiple/assets/logo/XHKSLogo.png                                                              |    0 
 src/views/officeProcessAutomation/ApproveManage/approve-list/index.vue                         |    7 
 src/assets/styles/sidebar.scss                                                                 | 1333 ++++++++++++++++++-----------------
 src/views/financialManagement/receivable/receipt.vue                                           |   12 
 multiple/assets/favicon/XHKSfavicon.ico                                                        |    0 
 src/views/financialManagement/receivable/invoiceApply.vue                                      |   12 
 src/views/financialManagement/assets/fixedAssets.vue                                           |   11 
 src/views/officeProcessAutomation/ApproveManage/approve-template/useApproveTemplate.js         |   15 
 src/views/financialManagement/payable/paymentApply.vue                                         |   22 
 src/views/officeProcessAutomation/ApproveManage/approve-list/useApproveList.js                 |   78 ++
 src/views/procurementManagement/procurementLedger/index.vue                                    |   62 +
 src/views/productionPlan/productionPlan/index.vue                                              |   22 
 src/views/officeProcessAutomation/ApproveManage/approve-list/approveListConstants.js           |    3 
 multiple/assets/logo/RFSYLogo.png                                                              |    0 
 src/views/officeProcessAutomation/ApproveManage/approve-template/index.vue                     |   73 +
 33 files changed, 1,297 insertions(+), 864 deletions(-)

diff --git a/multiple/assets/favicon/QFSWfavicon.ico b/multiple/assets/favicon/QFSWfavicon.ico
new file mode 100644
index 0000000..79ac2a8
--- /dev/null
+++ b/multiple/assets/favicon/QFSWfavicon.ico
Binary files differ
diff --git a/multiple/assets/favicon/RFSYLogo.png b/multiple/assets/favicon/RFSYLogo.png
new file mode 100644
index 0000000..d9eaab1
--- /dev/null
+++ b/multiple/assets/favicon/RFSYLogo.png
Binary files differ
diff --git a/multiple/assets/favicon/RFSYfavicon.ico b/multiple/assets/favicon/RFSYfavicon.ico
new file mode 100644
index 0000000..ef5b5d3
--- /dev/null
+++ b/multiple/assets/favicon/RFSYfavicon.ico
Binary files differ
diff --git a/multiple/assets/favicon/XHKSfavicon.ico b/multiple/assets/favicon/XHKSfavicon.ico
new file mode 100644
index 0000000..01a1259
--- /dev/null
+++ b/multiple/assets/favicon/XHKSfavicon.ico
Binary files differ
diff --git a/multiple/assets/favicon/ZDJCfavicon.ico b/multiple/assets/favicon/ZDJCfavicon.ico
new file mode 100644
index 0000000..ca5d236
--- /dev/null
+++ b/multiple/assets/favicon/ZDJCfavicon.ico
Binary files differ
diff --git a/multiple/assets/logo/QFSWLogo.png b/multiple/assets/logo/QFSWLogo.png
new file mode 100644
index 0000000..e1db2cc
--- /dev/null
+++ b/multiple/assets/logo/QFSWLogo.png
Binary files differ
diff --git a/multiple/assets/logo/RFSYLogo.png b/multiple/assets/logo/RFSYLogo.png
new file mode 100644
index 0000000..d9eaab1
--- /dev/null
+++ b/multiple/assets/logo/RFSYLogo.png
Binary files differ
diff --git a/multiple/assets/logo/XHKSLogo.png b/multiple/assets/logo/XHKSLogo.png
new file mode 100644
index 0000000..c09746f
--- /dev/null
+++ b/multiple/assets/logo/XHKSLogo.png
Binary files differ
diff --git a/multiple/assets/logo/ZDJCLogo.png b/multiple/assets/logo/ZDJCLogo.png
new file mode 100644
index 0000000..4fe753c
--- /dev/null
+++ b/multiple/assets/logo/ZDJCLogo.png
Binary files differ
diff --git a/src/api/procurementManagement/procurementLedger.js b/src/api/procurementManagement/procurementLedger.js
index 49416d2..88f4ce0 100644
--- a/src/api/procurementManagement/procurementLedger.js
+++ b/src/api/procurementManagement/procurementLedger.js
@@ -74,53 +74,61 @@
   });
 }
 export function updateApprovalStatus(query) {
-    return request({
-        url: "/purchase/ledger/updateApprovalStatus",
-        method: "post",
-        data: query,
-    });
+  return request({
+    url: "/purchase/ledger/updateApprovalStatus",
+    method: "post",
+    data: query,
+  });
 }
 
 // 淇濆瓨閲囪喘妯℃澘
 export function addPurchaseTemplate(data) {
-    return request({
-        url: "/purchaseLedgerTemplate/add",
-        method: "post",
-        data: data,
-    });
+  return request({
+    url: "/purchaseLedgerTemplate/add",
+    method: "post",
+    data: data,
+  });
 }
 
 // 淇敼閲囪喘妯℃澘
 export function updatePurchaseTemplate(data) {
-    return request({
-        url: "/purchaseLedgerTemplate/update",
-        method: "post",
-        data: data,
-    });
+  return request({
+    url: "/purchaseLedgerTemplate/update",
+    method: "post",
+    data: data,
+  });
 }
 
 // 鏌ヨ閲囪喘妯℃澘
 export function getPurchaseTemplateList(query) {
-    return request({
-        url: "/purchase/ledger/getPurchaseTemplateList",
-        method: "get",
-        params: query,
-    });
+  return request({
+    url: "/purchase/ledger/getPurchaseTemplateList",
+    method: "get",
+    params: query,
+  });
 }
 
 // 鍒犻櫎閲囪喘妯℃澘
 export function delPurchaseTemplate(id) {
-    return request({
-        url: "/purchaseLedgerTemplate/delete",
-        method: "delete",
-        data: id,
-    });
+  return request({
+    url: "/purchaseLedgerTemplate/delete",
+    method: "delete",
+    data: id,
+  });
 }
 // 鏌ヨ閲囪喘璇︽儏
 export function getPurchaseByCode(id) {
-    return request({
-        url: "/purchase/ledger/getPurchaseByCode",
-        method: "get",
-        params: id,
-    });
-}
\ No newline at end of file
+  return request({
+    url: "/purchase/ledger/getPurchaseByCode",
+    method: "get",
+    params: id,
+  });
+}
+
+export function batchGeneratePurchaseInboundSteps(query) {
+  return request({
+    url: "/purchase/ledger/batchInsertPurchaseSteps",
+    method: "post",
+    data: query,
+  });
+}
diff --git a/src/assets/styles/sidebar.scss b/src/assets/styles/sidebar.scss
index b3fdff7..5da0e59 100644
--- a/src/assets/styles/sidebar.scss
+++ b/src/assets/styles/sidebar.scss
@@ -1,664 +1,669 @@
-#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;
-    }
-
-    &::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);
-      }
-    }
-
-    .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;
-      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: 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: 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: var(--sidebar-collapsed-width) !important;
-    }
-
-    .main-container {
-      margin-left: var(--sidebar-collapsed-width);
-    }
-
-    .submenu-title-noDropdown {
-      padding: 0 !important;
-      position: relative;
-      display: flex !important;
-      align-items: center;
-      justify-content: center;
-
-      .svg-icon {
-        margin-right: 0;
-      }
-
-      .el-tooltip {
-        padding: 0 !important;
-        display: inline-flex !important;
-        align-items: center;
-        justify-content: center;
-        width: 100%;
-
-        .svg-icon {
-          margin-left: 0;
-        }
-      }
-
-      .el-menu-tooltip__trigger {
-        width: 100%;
-        display: inline-flex !important;
-        align-items: center;
-        justify-content: center;
-
-        .svg-icon {
-          width: 22px;
-          height: 22px;
-          margin-right: 0;
-          flex-shrink: 0;
-        }
-      }
-    }
-
-    .el-sub-menu {
-      overflow: hidden;
-
-      & > .el-sub-menu__title {
-        padding: 0 !important;
-        display: flex !important;
-        align-items: center;
-        justify-content: center;
-
-        .svg-icon {
-          margin-left: 0;
-          margin-right: 0;
-        }
-      }
-    }
-
-    .el-menu--collapse {
-      width: 100% !important;
-      padding: 12px 0 16px;
-
-      > .el-menu-item,
-      .el-sub-menu {
-        & > .el-sub-menu__title,
-        &.el-menu-item {
-          width: calc(100% - 12px) !important;
-          margin: 0 6px 8px !important;
-          padding-left: 0 !important;
-          padding-right: 0 !important;
-          box-sizing: border-box;
-          display: flex !important;
-          align-items: center;
-          justify-content: center;
-
-          .svg-icon {
-            width: 22px;
-            height: 22px;
-            margin-right: 0;
-            flex-shrink: 0;
-          }
-
-          & > span {
-            height: 0;
-            width: 0;
-            overflow: hidden;
-            visibility: hidden;
-            display: inline-block;
-          }
-        }
-      }
-    }
-  }
-
-  .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 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 {
-      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: 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;
-    }
-  }
-
-  > .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);
-  }
-}
+#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;
+    }
+
+    &::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);
+      }
+    }
+
+    .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;
+      width: calc(100% - 32px) !important;
+      margin: 0 16px 6px !important;
+      height: 40px;
+      line-height: 40px;
+      padding-left: 12px !important;
+      padding-right: 12px !important;
+      border-radius: 8px;
+      transition: all 0.24s ease;
+      color: var(--sidebar-text);
+      border: none !important;
+      background: transparent;
+      font-size: 13px;
+
+      &:hover {
+        background: rgba(var(--el-color-primary-rgb, 37, 99, 235), 0.12) !important;
+        transform: translateX(4px);
+      }
+
+      &.is-active {
+        background: rgba(var(--el-color-primary-rgb, 37, 99, 235), 0.85) !important;
+        color: #fff !important;
+        font-weight: 500;
+        box-shadow: 0 4px 12px rgba(var(--el-color-primary-rgb, 37, 99, 235), 0.25);
+      }
+    }
+
+    // 瀛愯彍鍗曞鍣ㄦ牱寮� - 澧炲姞缂╄繘鍜岃瑙夊眰娆�
+    & .el-sub-menu .el-menu {
+      padding: 4px 0 8px;
+      margin-left: 8px;
+      border-left: 2px solid rgba(255, 255, 255, 0.08);
+    }
+  }
+
+  .hideSidebar {
+    .sidebar-container {
+      width: var(--sidebar-collapsed-width) !important;
+    }
+
+    .main-container {
+      margin-left: var(--sidebar-collapsed-width);
+    }
+
+    .submenu-title-noDropdown {
+      padding: 0 !important;
+      position: relative;
+      display: flex !important;
+      align-items: center;
+      justify-content: center;
+
+      .svg-icon {
+        margin-right: 0;
+      }
+
+      .el-tooltip {
+        padding: 0 !important;
+        display: inline-flex !important;
+        align-items: center;
+        justify-content: center;
+        width: 100%;
+
+        .svg-icon {
+          margin-left: 0;
+        }
+      }
+
+      .el-menu-tooltip__trigger {
+        width: 100%;
+        display: inline-flex !important;
+        align-items: center;
+        justify-content: center;
+
+        .svg-icon {
+          width: 22px;
+          height: 22px;
+          margin-right: 0;
+          flex-shrink: 0;
+        }
+      }
+    }
+
+    .el-sub-menu {
+      overflow: hidden;
+
+      & > .el-sub-menu__title {
+        padding: 0 !important;
+        display: flex !important;
+        align-items: center;
+        justify-content: center;
+
+        .svg-icon {
+          margin-left: 0;
+          margin-right: 0;
+        }
+      }
+    }
+
+    .el-menu--collapse {
+      width: 100% !important;
+      padding: 12px 0 16px;
+
+      > .el-menu-item,
+      .el-sub-menu {
+        & > .el-sub-menu__title,
+        &.el-menu-item {
+          width: calc(100% - 12px) !important;
+          margin: 0 6px 8px !important;
+          padding-left: 0 !important;
+          padding-right: 0 !important;
+          box-sizing: border-box;
+          display: flex !important;
+          align-items: center;
+          justify-content: center;
+
+          .svg-icon {
+            width: 22px;
+            height: 22px;
+            margin-right: 0;
+            flex-shrink: 0;
+          }
+
+          & > span {
+            height: 0;
+            width: 0;
+            overflow: hidden;
+            visibility: hidden;
+            display: inline-block;
+          }
+        }
+      }
+    }
+  }
+
+  .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 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 {
+      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: 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;
+    }
+  }
+
+  > .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/layout/components/Sidebar/SidebarItem.vue b/src/layout/components/Sidebar/SidebarItem.vue
index 003b489..3712c68 100644
--- a/src/layout/components/Sidebar/SidebarItem.vue
+++ b/src/layout/components/Sidebar/SidebarItem.vue
@@ -102,57 +102,70 @@
 </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;
-  }
+.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; }
-  }
-}
+  :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: 18px;
+      height: 18px;
+      margin-right: 8px;
+      opacity: 0.7;
+    }
+    
+    .menu-title { 
+      font-size: 13px;
+      opacity: 0.85;
+    }
+    
+    .el-menu-item.is-active {
+      .menu-icon {
+        opacity: 1;
+      }
+      .menu-title {
+        opacity: 1;
+      }
+    }
+  }
+}
 </style>
diff --git a/src/views/basicData/parameterMaintenance/index.vue b/src/views/basicData/parameterMaintenance/index.vue
index bd73467..38ddd4f 100644
--- a/src/views/basicData/parameterMaintenance/index.vue
+++ b/src/views/basicData/parameterMaintenance/index.vue
@@ -84,7 +84,7 @@
         </el-form-item> -->
         <el-form-item label="鍒涘缓鏃堕棿"
                       prop="createTime">
-          <el-date-picker v-model="formData.createTime"
+          <el-date-picker v-model="formCreateTimeDate"
                           type="date"
                           placeholder="閫夋嫨鏃ユ湡"
                           value-format="YYYY-MM-DD"
@@ -215,7 +215,8 @@
 </template>
 
 <script setup>
-  import { onMounted, ref, reactive } from "vue";
+  import { onMounted, ref, reactive, computed } from "vue";
+  import dayjs from "dayjs";
   import {
     parameterListPage,
     addParameter,
@@ -369,6 +370,12 @@
         },
       },
     ],
+  });
+  const formCreateTimeDate = computed({
+    get: () => (formData.createTime ? String(formData.createTime).split(" ")[0] : ""),
+    set: (value) => {
+      formData.createTime = value ? `${value} ${dayjs().format("HH:mm:ss")}` : "";
+    },
   });
   // const productTypes = ref([]);
   const isEdit = ref(false);
@@ -528,7 +535,7 @@
     formData.unit = "";
     formData.remark = "";
     formData.isRequired = 0;
-    formData.createTime = new Date().toISOString().split("T")[0];
+    formData.createTime = dayjs().format("YYYY-MM-DD HH:mm:ss");
     dialogVisible.value = true;
   };
 
@@ -547,6 +554,7 @@
     formData.remark = row.remark || "";
     formData.paramFormat = row.paramFormat || "";
     formData.isRequired = row.isRequired || 0;
+    formData.createTime = row.createTime || "";
     dialogVisible.value = true;
   };
 
diff --git a/src/views/collaborativeApproval/sealManagement/index.vue b/src/views/collaborativeApproval/sealManagement/index.vue
index 9d68848..a06f6d5 100644
--- a/src/views/collaborativeApproval/sealManagement/index.vue
+++ b/src/views/collaborativeApproval/sealManagement/index.vue
@@ -7,7 +7,6 @@
         </div>
       </template>
 
-      
    <!-- 鐢ㄥ嵃鐢宠绠$悊 -->
         <div class="tab-content">
             <el-row :gutter="20" class="mb-20 ">
@@ -45,7 +44,7 @@
               :isShowPagination="true"
               @pagination="paginationChange"
             />
-        </div> 
+        </div>
     </el-card>
 
     <!-- 鐢ㄥ嵃鐢宠瀵硅瘽妗� -->
@@ -177,6 +176,7 @@
 const sealFormRef = ref()
 const userList = ref([])
 const sealForm = reactive({
+  id: null,
   applicationNum: '',
   title: '',
   sealType: '',
@@ -241,9 +241,9 @@
 
 // 鐢ㄥ嵃鐢宠琛ㄦ牸鍒楅厤缃紙闇�鍦� getStatusText/getSealTypeText 绛変箣鍚庡畾涔夛級
 const sealTableColumn = ref([
-  { label: '鐢宠缂栧彿', prop: 'applicationNum',},
+  { label: '鐢宠缂栧彿', prop: 'applicationNum' },
   { label: '鐢宠鏍囬', prop: 'title', showOverflowTooltip: true },
-  { label: '鐢宠浜�', prop: 'createUserName', },
+  { label: '鐢宠浜�', prop: 'createUserName' },
   { label: '鎵�灞為儴闂�', prop: 'department', width: 150 },
   {
     label: '鐢ㄥ嵃绫诲瀷',
@@ -261,34 +261,38 @@
     formatData: (v) => getStatusText(v),
     formatType: (v) => getStatusType(v)
   },
+  { label: '瀹℃壒浜�', prop: 'approveUserName', width: 100 },
   {
     dataType: 'action',
     label: '鎿嶄綔',
-    width: 200,
+    width: 250,
     fixed: 'right',
     align: 'center',
     operation: [
       {
         name: '瀹℃壒',
         clickFun: (row) => approveSeal(row),
-        showHide: (row) => row.status === 'pending'
+        showHide: (row) => row.status === 'pending' && Number(userStore.id) === row.approveUserId
       },
       {
         name: '鎷掔粷',
         clickFun: (row) => rejectSeal(row),
-        showHide: (row) => row.status === 'pending'
+        showHide: (row) => row.status === 'pending' && Number(userStore.id) === row.approveUserId
       },
-			{ name: '璇︽儏', clickFun: (row) => viewSealDetail(row) }
+      {
+        name: '閲嶆柊鐢宠',
+        clickFun: (row) => reapplySeal(row),
+        showHide: (row) => row.status === 'rejected' && Number(userStore.id) === row.createUser
+      },
+      { name: '璇︽儏', clickFun: (row) => viewSealDetail(row) }
     ]
   }
 ])
 
 // 鎼滅储鍗扮珷鐢宠
 const searchSealApplications = () => {
-  page.current=1
+  page.current = 1
   getSealApplicationList()
-
-  // ElMessage.success('鎼滅储瀹屾垚')
 }
 // 閲嶇疆鍗扮珷鐢宠鎼滅储
 const resetSealSearch = () => {
@@ -297,37 +301,58 @@
   sealSearchForm.applicationNum = ''
   searchSealApplications()
 }
+
+// 閲嶆柊鐢宠鐢ㄥ嵃
+const reapplySeal = (row) => {
+  // 棰勫~琛ㄥ崟鏁版嵁
+  Object.assign(sealForm, {
+    id: row.id,
+    applicationNum: row.applicationNum,
+    title: row.title,
+    sealType: row.sealType,
+    reason: row.reason,
+    approveUserId: row.approveUserId,
+    urgency: row.urgency || 'normal',
+    status: 'pending',
+    storageBlobDTOs: row.storageBlobVOList || []
+  })
+  showSealApplyDialog.value = true
+}
+
 // 鎻愪氦鐢ㄥ嵃鐢宠
 const submitSealApplication = async () => {
   try {
     await sealFormRef.value.validate()
-    addSealApplication(sealForm).then(res => {
-      if(res.code == 200){
-        ElMessage.success('鐢宠鎻愪氦鎴愬姛')
+    const request = sealForm.id ? updateSealApplication : addSealApplication
+    request(sealForm).then(res => {
+      if (res.code == 200) {
+        ElMessage.success(sealForm.id ? '閲嶆柊鐢宠鎴愬姛' : '鐢宠鎻愪氦鎴愬姛')
         closeSealApplyDialog()
         getSealApplicationList()
         Object.assign(sealForm, {
-        applicationNum: '',
-        title: '',
-        sealType: '',
-        reason: '',
-        approveUserId: '',
-        urgency: 'normal',
-        status: 'pending',
-        storageBlobDTOs: []
-      })
+          id: null,
+          applicationNum: '',
+          title: '',
+          sealType: '',
+          reason: '',
+          approveUserId: '',
+          urgency: 'normal',
+          status: 'pending',
+          storageBlobDTOs: []
+        })
       }
     }).catch(err => {
       console.log(err.msg)
     })
-  
   } catch (error) {
   }
 }
+
 // 鍏抽棴鐢ㄥ嵃鐢宠瀵硅瘽妗�
 const closeSealApplyDialog = () => {
   // 娓呯┖琛ㄥ崟鏁版嵁
   Object.assign(sealForm, {
+    id: null,
     applicationNum: '',
     title: '',
     sealType: '',
@@ -383,7 +408,7 @@
   }).then(() => {
     row.status = 'approved'
     updateSealApplication(row).then(res => {
-      if(res.code == 200){
+      if (res.code == 200) {
         ElMessage.success('瀹℃壒閫氳繃')
         getSealApplicationList()
       }
@@ -399,8 +424,9 @@
     inputErrorMessage: '鎷掔粷鍘熷洜涓嶈兘涓虹┖'
   }).then(({ value }) => {
     row.status = 'rejected'
+    row.reason = value
     updateSealApplication(row).then(res => {
-      if(res.code == 200){
+      if (res.code == 200) {
         ElMessage.success('宸叉嫆缁濈敵璇�')
         getSealApplicationList()
       }
@@ -418,13 +444,13 @@
 const getSealApplicationList = async () => {
   tableLoading.value = true
   listSealApplication(page, sealSearchForm)
-  .then(res => {
-    sealApplications.value = res.data.records
-    page.total = res.data.total
-    tableLoading.value = false
-  }).catch(err => {
-    tableLoading.value = false
-  })
+    .then(res => {
+      sealApplications.value = res.data.records
+      page.total = res.data.total
+      tableLoading.value = false
+    }).catch(err => {
+      tableLoading.value = false
+    })
 }
 // 鍒嗛〉鍙樺寲澶勭悊
 const paginationChange = (obj) => {
@@ -491,4 +517,4 @@
 .attachment-table {
   border-radius: 4px;
 }
-</style>
+</style>
\ No newline at end of file
diff --git a/src/views/financialManagement/assets/fixedAssets.vue b/src/views/financialManagement/assets/fixedAssets.vue
index de0f8c8..95eb017 100644
--- a/src/views/financialManagement/assets/fixedAssets.vue
+++ b/src/views/financialManagement/assets/fixedAssets.vue
@@ -178,7 +178,7 @@
         <el-row :gutter="20">
           <el-col :span="12">
             <el-form-item label="鍒涘缓鏃堕棿" prop="createTime">
-              <el-date-picker v-model="form.createTime" type="date" placeholder="閫夋嫨鏃ユ湡" value-format="YYYY-MM-DD" style="width: 100%;" />
+              <el-date-picker v-model="createTimeDate" type="date" placeholder="閫夋嫨鏃ユ湡" value-format="YYYY-MM-DD" style="width: 100%;" />
             </el-form-item>
           </el-col>
         </el-row>
@@ -196,6 +196,7 @@
 
 <script setup>
 import { ref, reactive, onMounted, computed } from "vue";
+import dayjs from "dayjs";
 import { ElMessage, ElMessageBox } from "element-plus";
 import FormDialog from "@/components/Dialog/FormDialog.vue";
 import {
@@ -270,6 +271,12 @@
 
 const form = reactive({
   ...createDefaultForm(),
+});
+const createTimeDate = computed({
+  get: () => (form.createTime ? String(form.createTime).split(" ")[0] : ""),
+  set: (value) => {
+    form.createTime = value ? `${value} ${dayjs().format("HH:mm:ss")}` : "";
+  },
 });
 
 const rules = {
@@ -371,7 +378,7 @@
   dialogTitle.value = "鏂板鍥哄畾璧勪骇";
   Object.assign(form, createDefaultForm(), {
     purchaseDate: new Date().toISOString().split('T')[0],
-    createTime: new Date().toISOString().split('T')[0],
+    createTime: dayjs().format("YYYY-MM-DD HH:mm:ss"),
   });
   dialogVisible.value = true;
 };
diff --git a/src/views/financialManagement/assets/intangibleAssets.vue b/src/views/financialManagement/assets/intangibleAssets.vue
index 167ae6b..9aef2bf 100644
--- a/src/views/financialManagement/assets/intangibleAssets.vue
+++ b/src/views/financialManagement/assets/intangibleAssets.vue
@@ -168,7 +168,7 @@
         <el-row :gutter="20">
           <el-col :span="12">
             <el-form-item label="鍒涘缓鏃堕棿" prop="createTime">
-              <el-date-picker v-model="form.createTime" type="date" placeholder="閫夋嫨鏃ユ湡" value-format="YYYY-MM-DD" style="width: 100%;" />
+              <el-date-picker v-model="createTimeDate" type="date" placeholder="閫夋嫨鏃ユ湡" value-format="YYYY-MM-DD" style="width: 100%;" />
             </el-form-item>
           </el-col>
         </el-row>
@@ -189,6 +189,7 @@
 
 <script setup>
 import { ref, reactive, onMounted, computed } from "vue";
+import dayjs from "dayjs";
 import { ElMessage, ElMessageBox } from "element-plus";
 import FormDialog from "@/components/Dialog/FormDialog.vue";
 import {
@@ -262,6 +263,12 @@
 
 const form = reactive({
   ...createDefaultForm(),
+});
+const createTimeDate = computed({
+  get: () => (form.createTime ? String(form.createTime).split(" ")[0] : ""),
+  set: (value) => {
+    form.createTime = value ? `${value} ${dayjs().format("HH:mm:ss")}` : "";
+  },
 });
 
 const rules = {
@@ -369,7 +376,7 @@
   dialogTitle.value = "鏂板鏃犲舰璧勪骇";
   Object.assign(form, createDefaultForm(), {
     acquisitionDate: new Date().toISOString().split('T')[0],
-    createTime: new Date().toISOString().split('T')[0],
+    createTime: dayjs().format("YYYY-MM-DD HH:mm:ss"),
   });
   dialogVisible.value = true;
 };
diff --git a/src/views/financialManagement/payable/paymentApply.vue b/src/views/financialManagement/payable/paymentApply.vue
index b83eb58..e34793f 100644
--- a/src/views/financialManagement/payable/paymentApply.vue
+++ b/src/views/financialManagement/payable/paymentApply.vue
@@ -160,7 +160,7 @@
           <el-col :span="12">
             <el-form-item label="鍒涘缓鏃堕棿" prop="createTime">
               <el-date-picker
-                v-model="form.createTime"
+                v-model="formCreateTimeDate"
                 type="date"
                 placeholder="閫夋嫨鏃ユ湡"
                 value-format="YYYY-MM-DD"
@@ -260,7 +260,7 @@
           <el-col :span="12">
             <el-form-item label="鍒涘缓鏃堕棿" prop="createTime">
               <el-date-picker
-                v-model="paymentForm.createTime"
+                v-model="paymentFormCreateTimeDate"
                 type="date"
                 placeholder="閫夋嫨鏃ユ湡"
                 value-format="YYYY-MM-DD"
@@ -353,6 +353,7 @@
 
 <script setup>
 import { ref, reactive, computed, onMounted, nextTick, getCurrentInstance } from "vue";
+import dayjs from "dayjs";
 import { ElMessage, ElMessageBox } from "element-plus";
 import FormDialog from "@/components/Dialog/FormDialog.vue";
 import { getOptions } from "@/api/procurementManagement/procurementLedger.js";
@@ -454,6 +455,18 @@
   inboundBatches: "",
   status: 0,
   createTime: "",
+});
+const formCreateTimeDate = computed({
+  get: () => (form.createTime ? String(form.createTime).split(" ")[0] : ""),
+  set: (value) => {
+    form.createTime = value ? `${value} ${dayjs().format("HH:mm:ss")}` : "";
+  },
+});
+const paymentFormCreateTimeDate = computed({
+  get: () => (paymentForm.createTime ? String(paymentForm.createTime).split(" ")[0] : ""),
+  set: (value) => {
+    paymentForm.createTime = value ? `${value} ${dayjs().format("HH:mm:ss")}` : "";
+  },
 });
 
 const rules = {
@@ -620,6 +633,7 @@
     remark: form.remark || "",
     status: 0,
     paymentAmount: form.paymentAmount,
+    createTime: form.createTime,
   };
   if (forUpdate) {
     payload.id = currentId.value;
@@ -730,7 +744,7 @@
     stockInRecordIds: [],
     inboundBatches: "",
     status: 0,
-    createTime: new Date().toISOString().split("T")[0],
+    createTime: dayjs().format("YYYY-MM-DD HH:mm:ss"),
   });
   inboundBatchList.value = [];
   inboundBatchOptions.value = [];
@@ -809,7 +823,7 @@
     bankAccount: row.bankAccountNum ?? row.bankAccount ?? "",
     bankName: row.bankAccountName ?? row.bankName ?? "",
     remark: "",
-    createTime: new Date().toISOString().split("T")[0],
+    createTime: dayjs().format("YYYY-MM-DD HH:mm:ss"),
   });
   paymentDialogVisible.value = true;
   nextTick(() => {
diff --git a/src/views/financialManagement/receivable/invoiceApply.vue b/src/views/financialManagement/receivable/invoiceApply.vue
index d5ab6dc..85f30b2 100644
--- a/src/views/financialManagement/receivable/invoiceApply.vue
+++ b/src/views/financialManagement/receivable/invoiceApply.vue
@@ -193,7 +193,7 @@
           <el-col :span="12">
             <el-form-item label="鍒涘缓鏃堕棿" prop="createTime">
               <el-date-picker
-                v-model="form.createTime"
+                v-model="formCreateTimeDate"
                 type="date"
                 placeholder="閫夋嫨鏃ユ湡"
                 value-format="YYYY-MM-DD"
@@ -267,6 +267,7 @@
 
 <script setup>
 import { ref, reactive, computed, onMounted, nextTick, getCurrentInstance, defineAsyncComponent } from "vue";
+import dayjs from "dayjs";
 import { ElMessage, ElMessageBox } from "element-plus";
 import FormDialog from "@/components/Dialog/FormDialog.vue";
 import { listCustomer } from "@/api/basicData/customer.js";
@@ -540,6 +541,12 @@
   remark: "",
   createTime: "",
 });
+const formCreateTimeDate = computed({
+  get: () => (form.createTime ? String(form.createTime).split(" ")[0] : ""),
+  set: (value) => {
+    form.createTime = value ? `${value} ${dayjs().format("HH:mm:ss")}` : "";
+  },
+});
 
 const rules = {
   customerId: [{ required: true, message: "璇烽�夋嫨瀹㈡埛", trigger: "change" }],
@@ -721,6 +728,7 @@
     status: normalizeStatus(row.status ?? row.auditStatus),
     outboundBatchNos,
     outboundBatches: formatOutboundBatches(row.outboundBatches),
+    createTime: row.createTime ?? "",
   });
 };
 
@@ -739,7 +747,7 @@
     applyDate: new Date().toISOString().split("T")[0],
     content: "",
     remark: "",
-    createTime: new Date().toISOString().split("T")[0],
+    createTime: dayjs().format("YYYY-MM-DD HH:mm:ss"),
   });
   outboundBatchList.value = [];
   outboundBatchOptions.value = [];
diff --git a/src/views/financialManagement/receivable/receipt.vue b/src/views/financialManagement/receivable/receipt.vue
index 1c84594..ae7a763 100644
--- a/src/views/financialManagement/receivable/receipt.vue
+++ b/src/views/financialManagement/receivable/receipt.vue
@@ -196,7 +196,7 @@
           <el-col :span="12">
             <el-form-item label="鍒涘缓鏃堕棿"
                           prop="createTime">
-              <el-date-picker v-model="form.createTime"
+              <el-date-picker v-model="formCreateTimeDate"
                               type="date"
                               placeholder="閫夋嫨鏃ユ湡"
                               value-format="YYYY-MM-DD"
@@ -299,6 +299,7 @@
     nextTick,
     getCurrentInstance,
   } from "vue";
+  import dayjs from "dayjs";
   import { ElMessage, ElMessageBox } from "element-plus";
   import FormDialog from "@/components/Dialog/FormDialog.vue";
   import { listCustomer } from "@/api/basicData/customer.js";
@@ -391,6 +392,12 @@
     outboundBatches: "",
     remark: "",
     createTime: "",
+  });
+  const formCreateTimeDate = computed({
+    get: () => (form.createTime ? String(form.createTime).split(" ")[0] : ""),
+    set: (value) => {
+      form.createTime = value ? `${value} ${dayjs().format("HH:mm:ss")}` : "";
+    },
   });
 
   const rules = {
@@ -691,6 +698,7 @@
       stockOutRecordIds,
       outboundBatches: formatOutboundBatches(row.outboundBatches),
       remark: row.remark ?? "",
+      createTime: row.createTime ?? "",
     });
   };
 
@@ -767,7 +775,7 @@
       stockOutRecordIds: [],
       outboundBatches: "",
       remark: "",
-      createTime: new Date().toISOString().split("T")[0],
+      createTime: dayjs().format("YYYY-MM-DD HH:mm:ss"),
     });
     outboundBatchList.value = [];
     outboundBatchOptions.value = [];
diff --git a/src/views/officeProcessAutomation/ApproveManage/approve-list/approveListConstants.js b/src/views/officeProcessAutomation/ApproveManage/approve-list/approveListConstants.js
index 12cf082..ecd310c 100644
--- a/src/views/officeProcessAutomation/ApproveManage/approve-list/approveListConstants.js
+++ b/src/views/officeProcessAutomation/ApproveManage/approve-list/approveListConstants.js
@@ -460,6 +460,9 @@
     currentNodeIndex: 0,
     approvalRecords,
     rejectReason: approvalRecords.find(r => r.result === "rejected")?.opinion || "",
+    purchaseContractNumber: row.purchaseContractNumber || "",
+    quotationNo: row.quotationNo || "",
+    shippingNo: row.shippingNo || "",
   };
 }
 
diff --git a/src/views/officeProcessAutomation/ApproveManage/approve-list/components/ApproveDetailPanel.vue b/src/views/officeProcessAutomation/ApproveManage/approve-list/components/ApproveDetailPanel.vue
index 721a5c2..b9eb42f 100644
--- a/src/views/officeProcessAutomation/ApproveManage/approve-list/components/ApproveDetailPanel.vue
+++ b/src/views/officeProcessAutomation/ApproveManage/approve-list/components/ApproveDetailPanel.vue
@@ -35,9 +35,116 @@
     </div>
     <div class="detail-block">
       <div class="detail-block-title">濉姤鍐呭</div>
-      <FormPayloadFields :fields="formResolved.fields"
+      <!-- 榛樿琛ㄥ崟灞曠ず -->
+      <FormPayloadFields v-if="!isSpecialApprovalType"
+                         :fields="formResolved.fields"
                          :form-payload="formResolved.formPayload"
                          readonly />
+      
+      <!-- 鍙戣揣瀹℃壒璇︽儏 -->
+      <template v-else-if="row.businessType === 7">
+        <div v-if="detailData.shippingInfo" class="shipment-detail">
+          <el-divider content-position="left">鍙戣揣璇︽儏</el-divider>
+          <el-descriptions :column="2" border>
+            <el-descriptions-item label="閿�鍞鍗�">{{ detailData.shippingInfo.salesContractNo || "--" }}</el-descriptions-item>
+            <el-descriptions-item label="鍙戣揣璁㈠崟鍙�">{{ detailData.shippingInfo.shippingNo || "--" }}</el-descriptions-item>
+            <el-descriptions-item label="瀹㈡埛鍚嶇О">{{ detailData.shippingInfo.customerName || "--" }}</el-descriptions-item>
+            <el-descriptions-item label="鍙戣揣绫诲瀷">{{ detailData.shippingInfo.type || "--" }}</el-descriptions-item>
+            <el-descriptions-item label="鍙戣揣鏃ユ湡">{{ detailData.shippingInfo.shippingDateDate || "--" }}</el-descriptions-item>
+            <el-descriptions-item label="瀹℃牳鐘舵��">{{ detailData.shippingInfo.status || "--" }}</el-descriptions-item>
+            <el-descriptions-item label="鍙戣揣杞︾墝鍙�">{{ detailData.shippingInfo.shippingCarNumber || "--" }}</el-descriptions-item>
+            <el-descriptions-item label="蹇�掑叕鍙�">{{ detailData.shippingInfo.expressCompany || "--" }}</el-descriptions-item>
+            <el-descriptions-item label="蹇�掑崟鍙�" :span="2">{{ detailData.shippingInfo.expressNumber || "--" }}</el-descriptions-item>
+          </el-descriptions>
+          <div v-if="detailData.shippingProductDetailDtoList.length" style="margin-top: 20px;">
+            <h4>浜у搧鏄庣粏</h4>
+            <el-table :data="detailData.shippingProductDetailDtoList"
+                      border
+                      size="small"
+                      style="width: 100%">
+              <el-table-column label="鎵瑰彿" prop="batchNo" min-width="160" show-overflow-tooltip />
+              <el-table-column label="浜у搧鍚嶇О" prop="productName" min-width="160" show-overflow-tooltip />
+              <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" min-width="160" show-overflow-tooltip />
+              <el-table-column label="鍙戣揣鏁伴噺" prop="deliveryQuantity" min-width="120" align="center" />
+            </el-table>
+          </div>
+        </div>
+      </template>
+      
+      <!-- 閲囪喘瀹℃壒璇︽儏 -->
+      <template v-else-if="row.businessType === 5">
+        <div v-if="detailData" class="procurement-detail">
+          <el-divider content-position="left">閲囪喘璇︽儏</el-divider>
+          <el-descriptions :column="2" border>
+            <el-descriptions-item label="閲囪喘鍚堝悓鍙�">{{ detailData.purchaseContractNumber || "--" }}</el-descriptions-item>
+            <el-descriptions-item label="渚涘簲鍟嗗悕绉�">{{ detailData.supplierName || "--" }}</el-descriptions-item>
+            <el-descriptions-item label="椤圭洰鍚嶇О">{{ detailData.projectName || "--" }}</el-descriptions-item>
+            <el-descriptions-item label="閿�鍞悎鍚屽彿">{{ detailData.salesContractNo || "--" }}</el-descriptions-item>
+            <el-descriptions-item label="绛捐鏃ユ湡">{{ detailData.executionDate || "--" }}</el-descriptions-item>
+            <el-descriptions-item label="褰曞叆鏃ユ湡">{{ detailData.entryDate || "--" }}</el-descriptions-item>
+            <el-descriptions-item label="浠樻鏂瑰紡">{{ detailData.paymentMethod || "--" }}</el-descriptions-item>
+            <el-descriptions-item label="鍚堝悓閲戦" :span="2">
+              <span style="font-size: 18px; color: #e6a23c; font-weight: bold;">
+                楼{{ Number(detailData.contractAmount ?? 0).toFixed(2) }}
+              </span>
+            </el-descriptions-item>
+          </el-descriptions>
+          <div v-if="detailData.productData.length" style="margin-top: 20px;">
+            <h4>浜у搧鏄庣粏</h4>
+            <el-table :data="detailData.productData"
+                      border
+                      style="width: 100%">
+              <el-table-column prop="productCategory" label="浜у搧鍚嶇О" />
+              <el-table-column prop="specificationModel" label="瑙勬牸鍨嬪彿" />
+              <el-table-column prop="unit" label="鍗曚綅" />
+              <el-table-column prop="quantity" label="鏁伴噺" />
+              <el-table-column prop="taxInclusiveUnitPrice" label="鍚◣鍗曚环">
+                <template #default="scope">楼{{ Number(scope.row.taxInclusiveUnitPrice ?? 0).toFixed(2) }}</template>
+              </el-table-column>
+              <el-table-column prop="taxInclusiveTotalPrice" label="鍚◣鎬讳环">
+                <template #default="scope">楼{{ Number(scope.row.taxInclusiveTotalPrice ?? 0).toFixed(2) }}</template>
+              </el-table-column>
+            </el-table>
+          </div>
+        </div>
+      </template>
+      
+      <!-- 鎶ヤ环瀹℃壒璇︽儏 -->
+      <template v-else-if="row.businessType === 6">
+        <div v-if="detailData" class="quotation-detail">
+          <el-divider content-position="left">鎶ヤ环璇︽儏</el-divider>
+          <el-descriptions :column="2" border>
+            <el-descriptions-item label="鎶ヤ环鍗曞彿">{{ detailData.quotationNo || "--" }}</el-descriptions-item>
+            <el-descriptions-item label="瀹㈡埛鍚嶇О">{{ detailData.customer || "--" }}</el-descriptions-item>
+            <el-descriptions-item label="涓氬姟鍛�">{{ detailData.salesperson || "--" }}</el-descriptions-item>
+            <el-descriptions-item label="鎶ヤ环鏃ユ湡">{{ detailData.quotationDate || "--" }}</el-descriptions-item>
+            <el-descriptions-item label="鏈夋晥鏈熻嚦">{{ detailData.validDate || "--" }}</el-descriptions-item>
+            <el-descriptions-item label="浠樻鏂瑰紡">{{ detailData.paymentMethod || "--" }}</el-descriptions-item>
+            <el-descriptions-item label="鎶ヤ环鎬婚" :span="2">
+              <span style="font-size: 18px; color: #e6a23c; font-weight: bold;">
+                楼{{ Number(detailData.totalAmount ?? 0).toFixed(2) }}
+              </span>
+            </el-descriptions-item>
+          </el-descriptions>
+          <div v-if="detailData.products.length" style="margin-top: 20px;">
+            <h4>浜у搧鏄庣粏</h4>
+            <el-table :data="detailData.products"
+                      border
+                      style="width: 100%">
+              <el-table-column prop="product" label="浜у搧鍚嶇О" />
+              <el-table-column prop="specification" label="瑙勬牸鍨嬪彿" />
+              <el-table-column prop="unit" label="鍗曚綅" />
+              <el-table-column prop="unitPrice" label="鍗曚环">
+                <template #default="scope">楼{{ Number(scope.row.unitPrice ?? 0).toFixed(2) }}</template>
+              </el-table-column>
+            </el-table>
+          </div>
+          <div v-if="detailData.remark" style="margin-top: 20px;">
+            <h4>澶囨敞</h4>
+            <p>{{ detailData.remark }}</p>
+          </div>
+        </div>
+      </template>
     </div>
     <div v-if="attachmentList.length"
          class="detail-block">
@@ -86,9 +193,21 @@
 
   const props = defineProps({
     row: { type: Object, default: () => ({}) },
+    detailData: { type: Object, default: () => ({}) },
   });
 
   const formResolved = computed(() => resolveInstanceFormFields(props.row));
+
+
+  // 鏄惁涓虹壒娈婂鎵圭被鍨嬶紙閲囪喘銆佸彂璐с�佹姤浠凤級
+  const isSpecialApprovalType = computed(() => {
+    return [5, 7, 6].includes(props.row.businessType);
+  });
+
+  // 璇︽儏鏁版嵁锛堢洿鎺ヤ娇鐢ㄤ紶鍏ョ殑 detail-data 鍙傛暟锛�
+  const detailData = computed(() => {
+    return props.detailData || {};
+  });
 
   const attachmentList = computed(() => {
     const list = props.row.storageBlobVOList || props.row.storageBlobDTOs || [];
@@ -164,4 +283,4 @@
     align-items: center;
     flex-shrink: 0;
   }
-</style>
+</style>
\ No newline at end of file
diff --git a/src/views/officeProcessAutomation/ApproveManage/approve-list/index.vue b/src/views/officeProcessAutomation/ApproveManage/approve-list/index.vue
index 078fd45..1a91e17 100644
--- a/src/views/officeProcessAutomation/ApproveManage/approve-list/index.vue
+++ b/src/views/officeProcessAutomation/ApproveManage/approve-list/index.vue
@@ -174,7 +174,7 @@
       class="approve-detail-dialog"
     >
       <div class="approve-detail-body">
-        <ApproveDetailPanel :row="detailRow" />
+        <ApproveDetailPanel :row="detailRow" :detail-data="detailData" />
         <div class="detail-block">
           <div class="detail-block-title">
             瀹℃壒娴佺▼锛坽{ detailRow.tasks?.length || detailRow.flowNodes?.length || 0 }} 椤癸級
@@ -292,7 +292,7 @@
       destroy-on-close
       @closed="approveOpinion = ''"
     >
-      <ApproveDetailPanel :row="approveDialog.row" />
+      <ApproveDetailPanel :row="approveDialog.row" :detail-data="detailData" />
       <div class="detail-block mt16">
         <div class="detail-block-title">
           瀹℃壒娴佺▼锛坽{ approveDialog.row?.tasks?.length || approveDialog.row?.flowNodes?.length || 0 }} 椤癸級
@@ -371,6 +371,7 @@
   tableColumn,
   detailDialog,
   detailRow,
+  detailData,
   reimburseDialog,
   approveDialog,
   approveOpinion,
@@ -614,4 +615,4 @@
   border-left: 3px solid var(--el-color-primary);
   line-height: 1.4;
 }
-</style>
+</style>
\ No newline at end of file
diff --git a/src/views/officeProcessAutomation/ApproveManage/approve-list/useApproveList.js b/src/views/officeProcessAutomation/ApproveManage/approve-list/useApproveList.js
index 68a3a3e..7c198e5 100644
--- a/src/views/officeProcessAutomation/ApproveManage/approve-list/useApproveList.js
+++ b/src/views/officeProcessAutomation/ApproveManage/approve-list/useApproveList.js
@@ -10,6 +10,9 @@
   saveApprovalInstance,
   updateApprovalInstance,
 } from "@/api/officeProcessAutomation/approvalInstance.js";
+import { getQuotationList } from "@/api/salesManagement/salesQuotation.js";
+import { getPurchaseByCode } from "@/api/procurementManagement/procurementLedger.js";
+import { getDeliveryDetailByShippingNo } from "@/api/salesManagement/deliveryLedger.js";
 import useUserStore from "@/store/modules/user";
 import { Search } from "@element-plus/icons-vue";
 import { ElMessage, ElMessageBox } from "element-plus";
@@ -77,6 +80,7 @@
 
   const detailDialog = reactive({ visible: false });
   const detailRow = ref({});
+  const detailData = ref({});
 
   const approveDialog = reactive({ visible: false, row: null });
   const approveOpinion = ref("");
@@ -138,7 +142,7 @@
   }));
 
   const tableColumn = ref([
-    { label: "鐢宠浜虹紪鍙�", prop: "applicantNo", width: 110 },
+    // { label: "鐢宠浜虹紪鍙�", prop: "applicantNo", width: 110 },
     { label: "鐢宠浜哄悕绉�", prop: "applicantName", minWidth: 100 },
     { label: "妯℃澘绫诲瀷", prop: "businessName", minWidth: 120 },
     {
@@ -223,7 +227,7 @@
         fetchBusinessTypeOptions(),
         listApprovalTemplate(TEMPLATE_TYPE_CUSTOM),
       ]);
-      submitBusinessTypeOptions.value = typeOptions;
+      submitBusinessTypeOptions.value = typeOptions.filter((x) => ![5, 6, 7].includes(x.value));
       allSubmitTemplates.value = unwrapTemplateList(customRes)
         .filter((row) => mapEnabledFromApi(row.enabled))
         .map(mapSubmitTemplateCard);
@@ -291,11 +295,46 @@
       await openReimburseDetail(row, "detail");
       return;
     }
+    
     detailRow.value = { ...row };
+    // 鎶ヤ环瀹℃壒锛氱敤瀹℃壒浜嬬敱瀛楁鎵胯浇鐨�"鎶ヤ环鍗曞彿"鍘绘煡鎶ヤ环鍒楄〃
+    if (row.businessType === 6) {
+      const quotationNo = row?.quotationNo;
+      if (quotationNo) {
+        const res = await getQuotationList({ quotationNo });
+        const records = res?.data?.records || [];
+        detailData.value = records[0] || {};
+      }
+    }
+    
+    // 閲囪喘瀹℃壒锛氱敤瀹℃壒浜嬬敱瀛楁鎵胯浇鐨�"閲囪喘鍚堝悓鍙�"鍘绘煡閲囪喘璇︽儏
+    else if (row.businessType === 5) {
+      const purchaseContractNumber = row?.purchaseContractNumber;
+      if (purchaseContractNumber) {
+        const res = await getPurchaseByCode({ purchaseContractNumber });
+        detailData.value = res || {};
+      }
+    }
+    
+    // 鍙戣揣瀹℃壒锛氱敤瀹℃壒浜嬬敱瀛楁鎵胯浇鐨�"鍙戣揣鍗曞彿"鍘绘煡鍙戣揣璇︽儏
+    else if (row.businessType === 7) {
+      const shippingNo = row?.shippingNo;
+      if (shippingNo) {
+        const res = await getDeliveryDetailByShippingNo({ shippingNo });
+        detailData.value = res?.data || res || {};
+      }
+    }
+    
+    // 鍏朵粬瀹℃壒绫诲瀷
+    else {
+      detailData.value = {};
+    }
+    
     detailDialog.visible = true;
   }
 
   async function openApprove(row) {
+
     if (inferReimburseModuleKeyFromInstance(row)) {
       approveOpinion.value = "";
       await openReimburseDetail(row, "approve");
@@ -303,6 +342,38 @@
     }
     approveDialog.row = { ...row };
     approveOpinion.value = "";
+    // 鎶ヤ环瀹℃壒锛氱敤瀹℃壒浜嬬敱瀛楁鎵胯浇鐨�"鎶ヤ环鍗曞彿"鍘绘煡鎶ヤ环鍒楄〃
+    if (row.businessType === 6) {
+      const quotationNo = row?.quotationNo;
+      if (quotationNo) {
+        const res = await getQuotationList({ quotationNo });
+        const records = res?.data?.records || [];
+        detailData.value = records[0] || {};
+      }
+    }
+
+    // 閲囪喘瀹℃壒锛氱敤瀹℃壒浜嬬敱瀛楁鎵胯浇鐨�"閲囪喘鍚堝悓鍙�"鍘绘煡閲囪喘璇︽儏
+    else if (row.businessType === 5) {
+      const purchaseContractNumber = row?.purchaseContractNumber;
+      if (purchaseContractNumber) {
+        const res = await getPurchaseByCode({ purchaseContractNumber });
+        detailData.value = res || {};
+      }
+    }
+
+    // 鍙戣揣瀹℃壒锛氱敤瀹℃壒浜嬬敱瀛楁鎵胯浇鐨�"鍙戣揣鍗曞彿"鍘绘煡鍙戣揣璇︽儏
+    else if (row.businessType === 7) {
+      const shippingNo = row?.shippingNo;
+      if (shippingNo) {
+        const res = await getDeliveryDetailByShippingNo({ shippingNo });
+        detailData.value = res?.data || res || {};
+      }
+    }
+
+    // 鍏朵粬瀹℃壒绫诲瀷
+    else {
+      detailData.value = {};
+    }
     approveDialog.visible = true;
   }
 
@@ -632,6 +703,7 @@
     tableColumn,
     detailDialog,
     detailRow,
+    detailData,
     reimburseDialog,
     approveDialog,
     approveOpinion,
@@ -673,4 +745,4 @@
     selectedRows,
     batchDelete,
   };
-}
+}
\ No newline at end of file
diff --git a/src/views/officeProcessAutomation/ApproveManage/approve-template/index.vue b/src/views/officeProcessAutomation/ApproveManage/approve-template/index.vue
index d094c13..0a495c6 100644
--- a/src/views/officeProcessAutomation/ApproveManage/approve-template/index.vue
+++ b/src/views/officeProcessAutomation/ApproveManage/approve-template/index.vue
@@ -380,23 +380,18 @@
 
       <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>
+        <div class="detail-attachment-list">
+          <div
+            v-for="(f, i) in detailAttachments"
+            :key="i"
+            class="detail-attachment-item"
+            @click="openAttachmentFile(f)"
+          >
+            <el-icon class="attachment-icon"><Document /></el-icon>
+            <span class="attachment-name">{{ attachmentDisplayName(f) }}</span>
+            <el-icon class="attachment-download"><Download /></el-icon>
+          </div>
+        </div>
 
       </template>
 
@@ -422,7 +417,7 @@
 
 <script setup>
 
-import { ArrowRight, Plus, RefreshRight } from "@element-plus/icons-vue";
+import { ArrowRight, Document, Download, Plus, RefreshRight } from "@element-plus/icons-vue";
 
 import { ElMessage } from "element-plus";
 
@@ -525,6 +520,14 @@
 
 }
 
+function openAttachmentFile(file) {
+  const url = file?.url || file?.previewURL || file?.downloadURL || file?.previewUrl || "";
+  if (url) {
+    window.open(url, "_blank");
+  } else {
+    ElMessage.warning("鏃犳硶鎵撳紑璇ラ檮浠�");
+  }
+}
 
 
 function unwrapArray(payload) {
@@ -795,10 +798,40 @@
 
 }
 
-.detail-attachment-tag {
+.detail-attachment-list {
+  display: flex;
+  flex-wrap: wrap;
+  gap: 8px;
+}
 
-  margin: 0 8px 8px 0;
+.detail-attachment-item {
+  display: flex;
+  align-items: center;
+  gap: 6px;
+  padding: 8px 12px;
+  background: var(--el-fill-color-light);
+  border-radius: 6px;
+  cursor: pointer;
+  transition: background 0.2s;
+}
 
+.detail-attachment-item:hover {
+  background: var(--el-fill-color);
+}
+
+.attachment-icon {
+  font-size: 16px;
+  color: var(--el-text-color-regular);
+}
+
+.attachment-name {
+  font-size: 14px;
+  color: var(--el-text-color-primary);
+}
+
+.attachment-download {
+  font-size: 14px;
+  color: var(--el-text-color-secondary);
 }
 
 .text-muted {
diff --git a/src/views/officeProcessAutomation/ApproveManage/approve-template/useApproveTemplate.js b/src/views/officeProcessAutomation/ApproveManage/approve-template/useApproveTemplate.js
index 61aa6c0..79e96bc 100644
--- a/src/views/officeProcessAutomation/ApproveManage/approve-template/useApproveTemplate.js
+++ b/src/views/officeProcessAutomation/ApproveManage/approve-template/useApproveTemplate.js
@@ -214,10 +214,21 @@
     });
   }
 
-  function openFormDialog(mode, row) {
+  async function openFormDialog(mode, row) {
     formDialog.mode = mode;
     formDialog.title = mode === "add" ? "鏂板缓瀹℃壒妯℃澘" : "缂栬緫瀹℃壒妯℃澘";
-    resetForm(mode === "edit" ? row : null);
+    if (mode === "edit" && row?.id) {
+      // 缂栬緫鏃跺厛鏌ヨ璇︽儏鑾峰彇瀹屾暣鏁版嵁锛堝寘鍚檮浠讹級
+      try {
+        const res = await getApprovalTemplateDetail(row.id);
+        const detailData = mapTemplateFromApi(unwrapTemplateDetail(res));
+        resetForm(detailData);
+      } catch {
+        resetForm(row);
+      }
+    } else {
+      resetForm(mode === "edit" ? row : null);
+    }
     formDialog.visible = true;
   }
 
diff --git a/src/views/procurementManagement/procurementLedger/index.vue b/src/views/procurementManagement/procurementLedger/index.vue
index cbd6e23..2d42b57 100644
--- a/src/views/procurementManagement/procurementLedger/index.vue
+++ b/src/views/procurementManagement/procurementLedger/index.vue
@@ -66,6 +66,9 @@
     </div>
     <div class="table_list">
       <div style="display: flex;justify-content: flex-end;margin-bottom: 20px;">
+        <el-button type="success"
+                   plain
+                   @click="handleBatchGenerate">鎵归噺鐢熸垚鏁版嵁</el-button>
         <el-button type="primary"
                    @click="openForm('add')">鏂板鍙拌处</el-button>
         <el-button type="primary"
@@ -106,7 +109,7 @@
                                prop="specificationModel" />
               <el-table-column label="鍗曚綅"
                                prop="unit" />
-                               <el-table-column label="鍏ュ簱瀹℃牳鐘舵��"
+              <el-table-column label="鍏ュ簱瀹℃牳鐘舵��"
                                prop="stockInApprovalStatus"
                                width="120">
                 <template #default="scope">
@@ -721,6 +724,7 @@
     getOptions,
     getPurchaseTemplateList,
     delPurchaseTemplate,
+    batchGeneratePurchaseInboundSteps,
   } from "@/api/procurementManagement/procurementLedger.js";
   import useFormData from "@/hooks/useFormData.js";
   const FileList = defineAsyncComponent(() =>
@@ -776,9 +780,9 @@
   // 鑾峰彇鍏ュ簱鐘舵�佹爣绛剧被鍨�
   const getStockInStatusType = status => {
     const typeMap = {
-      "寰呭叆搴�": "info", // 寰呭叆搴� - 鐏拌壊
-      "鍏ュ簱涓�": "warning", // 鍏ュ簱涓� - 姗欒壊
-      "瀹屽叏鍏ュ簱": "success", // 瀹屽叏鍏ュ簱 - 缁胯壊
+      寰呭叆搴�: "info", // 寰呭叆搴� - 鐏拌壊
+      鍏ュ簱涓�: "warning", // 鍏ュ簱涓� - 姗欒壊
+      瀹屽叏鍏ュ簱: "success", // 瀹屽叏鍏ュ簱 - 缁胯壊
     };
     return typeMap[status] || "";
   };
@@ -786,9 +790,9 @@
   // 鑾峰彇鍏ュ簱瀹℃牳鐘舵�佹爣绛剧被鍨�
   const getStockInApprovalStatusType = status => {
     const typeMap = {
-      "寰呭叆搴�": "info", // 寰呭叆搴� - 鐏拌壊
-      "鍏ュ簱涓�": "warning", // 鍏ュ簱涓� - 姗欒壊
-      "瀹屽叏鍏ュ簱": "success", // 瀹屽叏鍏ュ簱 - 缁胯壊
+      寰呭叆搴�: "info", // 寰呭叆搴� - 鐏拌壊
+      鍏ュ簱涓�: "warning", // 鍏ュ簱涓� - 姗欒壊
+      瀹屽叏鍏ュ簱: "success", // 瀹屽叏鍏ュ簱 - 缁胯壊
     };
     return typeMap[status] || "";
   };
@@ -1274,7 +1278,7 @@
   const openForm = async (type, row) => {
     // 缂栬緫鏃舵鏌ュ叆搴撶姸鎬侊紝瀹屽叏鍏ュ簱鏃朵笉鑳界紪杈�
     if (type === "edit" && row) {
-      if (row.stockInStatus === '瀹屽叏鍏ュ簱') {
+      if (row.stockInStatus === "瀹屽叏鍏ュ簱") {
         proxy.$modal.msgWarning("瀹屽叏鍏ュ簱鐘舵�佺殑璁板綍涓嶈兘缂栬緫");
         return;
       }
@@ -1314,7 +1318,10 @@
           form.value = { ...purchaseRes, stockInStatus: row.stockInStatus };
           fileList.value = purchaseRes.storageBlobVOS || [];
           // 浣跨敤 productList 鎺ュ彛鑾峰彇浜у搧鍒楄〃锛屼互鑾峰彇鍏ュ簱瀹℃牳鐘舵��
-          const productRes = await productList({ salesLedgerId: row.id, type: 2 });
+          const productRes = await productList({
+            salesLedgerId: row.id,
+            type: 2,
+          });
           productData.value = productRes.data || [];
         } catch (error) {
           console.error("鍔犺浇閲囪喘鍙拌处鏁版嵁澶辫触:", error);
@@ -1447,7 +1454,7 @@
   // 鎵撳紑浜у搧寮规
   const openProductForm = async (type, row, index) => {
     // 缂栬緫鏃舵鏌ヤ骇鍝佸叆搴撳鏍哥姸鎬侊紝瀹屽叏鍏ュ簱鏃朵笉鑳界紪杈�
-    if (type === "edit" && row && row.stockInApprovalStatus === '瀹屽叏鍏ュ簱') {
+    if (type === "edit" && row && row.stockInApprovalStatus === "瀹屽叏鍏ュ簱") {
       proxy.$modal.msgWarning("瀹屽叏鍏ュ簱鐘舵�佺殑浜у搧涓嶈兘缂栬緫");
       return;
     }
@@ -1636,7 +1643,7 @@
     }
     // 妫�鏌ラ�変腑鐨勪骇鍝佷腑鏄惁鏈夊畬鍏ㄥ叆搴撶殑
     const hasFullyStocked = productSelectedRows.value.some(
-      row => row.stockInApprovalStatus === '瀹屽叏鍏ュ簱'
+      row => row.stockInApprovalStatus === "瀹屽叏鍏ュ簱"
     );
     if (hasFullyStocked) {
       proxy.$modal.msgWarning("閫変腑鐨勪骇鍝佷腑鍖呭惈瀹屽叏鍏ュ簱鐨勪骇鍝侊紝鏃犳硶鍒犻櫎");
@@ -1712,6 +1719,37 @@
           proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
           getList();
         });
+      })
+      .catch(() => {
+        proxy.$modal.msg("宸插彇娑�");
+      });
+  };
+
+  const handleBatchGenerate = async () => {
+    if (selectedRows.value.length === 0) {
+      proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
+      return;
+    }
+    const ids = selectedRows.value.map((item) => item.id);
+    
+    ElMessageBox.confirm("纭鎵归噺鐢熸垚鏁版嵁锛�", "鎵归噺鐢熸垚", {
+      confirmButtonText: "纭",
+      cancelButtonText: "鍙栨秷",
+      type: "info",
+    })
+      .then(() => {
+        proxy.$modal.loading("姝e湪鎵归噺鐢熸垚鏁版嵁锛岃绋嶅��...");
+        batchGeneratePurchaseInboundSteps({ ids })
+          .then((res) => {
+            proxy.$modal.msgSuccess("鎵归噺鐢熸垚鎴愬姛");
+            getList();
+          })
+          .catch(() => {
+            proxy.$modal.msgError("鎵归噺鐢熸垚澶辫触");
+          })
+          .finally(() => {
+            proxy.$modal.closeLoading();
+          });
       })
       .catch(() => {
         proxy.$modal.msg("宸插彇娑�");
@@ -1855,7 +1893,7 @@
       contractNo: form.value.salesLedgerId,
     });
     if (code == 200) {
-      productData.value = data;
+      productData.value = data || [];
     }
   };
 
diff --git a/src/views/procurementManagement/procurementPlan/index.vue b/src/views/procurementManagement/procurementPlan/index.vue
index 5be6ffe..ba9a38c 100644
--- a/src/views/procurementManagement/procurementPlan/index.vue
+++ b/src/views/procurementManagement/procurementPlan/index.vue
@@ -183,7 +183,7 @@
               </el-col>
               <el-col :span="12">
                 <el-form-item label="鍒涘缓鏃堕棿" prop="createTime">
-                  <el-date-picker v-model="formData.createTime"
+                  <el-date-picker v-model="formCreateTimeDate"
                                   type="date"
                                   placeholder="閫夋嫨鏃ユ湡"
                                   value-format="YYYY-MM-DD"
@@ -377,7 +377,8 @@
 
 <script setup>
   import FormDialog from "@/components/Dialog/FormDialog.vue";
-  import { ref, reactive, onMounted, getCurrentInstance } from "vue";
+  import { ref, reactive, onMounted, getCurrentInstance, computed } from "vue";
+  import dayjs from "dayjs";
   import { ElMessage, ElMessageBox } from "element-plus";
   import { Search, Refresh, Plus, Download } from "@element-plus/icons-vue";
   import {
@@ -432,6 +433,12 @@
     summaryMaterial: false,
     summaryAuxAttributes: false,
     summaryDemandDate: false,
+  });
+  const formCreateTimeDate = computed({
+    get: () => (formData.createTime ? String(formData.createTime).split(" ")[0] : ""),
+    set: (value) => {
+      formData.createTime = value ? `${value} ${dayjs().format("HH:mm:ss")}` : "";
+    },
   });
 
   // 褰撳墠婵�娲荤殑鏍囩椤�
@@ -510,7 +517,7 @@
   const handleAdd = () => {
     dialogType.value = "add";
     resetForm();
-    formData.createTime = new Date().toISOString().split("T")[0];
+    formData.createTime = dayjs().format("YYYY-MM-DD HH:mm:ss");
     dialogVisible.value = true;
   };
 
diff --git a/src/views/procurementManagement/purchaseOrder/index.vue b/src/views/procurementManagement/purchaseOrder/index.vue
index 71d6caa..4f9812f 100644
--- a/src/views/procurementManagement/purchaseOrder/index.vue
+++ b/src/views/procurementManagement/purchaseOrder/index.vue
@@ -57,7 +57,7 @@
           </el-select>
         </el-form-item>
         <el-form-item label="鍒涘缓鏃堕棿">
-          <el-date-picker v-model="formData.createTime"
+          <el-date-picker v-model="formCreateTimeDate"
                           type="date"
                           placeholder="閫夋嫨鏃ユ湡"
                           value-format="YYYY-MM-DD"
@@ -73,7 +73,8 @@
 
 <script setup>
 import FormDialog from '@/components/Dialog/FormDialog.vue';
-import { ref, reactive } from 'vue'
+import { ref, reactive, computed } from 'vue'
+import dayjs from 'dayjs'
 import { ElMessage, ElMessageBox } from 'element-plus'
 
 const loading = ref(false)
@@ -90,6 +91,12 @@
   supplierName: '',
   remark: '',
   createTime: ''
+})
+const formCreateTimeDate = computed({
+  get: () => (formData.createTime ? String(formData.createTime).split(' ')[0] : ''),
+  set: (value) => {
+    formData.createTime = value ? `${value} ${dayjs().format('HH:mm:ss')}` : ''
+  }
 })
 
 const mockData = [
@@ -130,9 +137,9 @@
 const openDialog = (type, row = {}) => {
   dialogType.value = type
   if (type === 'edit' && row.id) {
-    Object.assign(formData, { supplierName: row.supplierName, remark: row.remark })
+    Object.assign(formData, { supplierName: row.supplierName, remark: row.remark, createTime: row.createTime || '' })
   } else {
-    Object.assign(formData, { supplierName: '', remark: '', createTime: new Date().toISOString().split('T')[0] })
+    Object.assign(formData, { supplierName: '', remark: '', createTime: dayjs().format('YYYY-MM-DD HH:mm:ss') })
   }
   dialogVisible.value = true
 }
diff --git a/src/views/procurementManagement/qualityInspection/index.vue b/src/views/procurementManagement/qualityInspection/index.vue
index fde8c68..aee1d99 100644
--- a/src/views/procurementManagement/qualityInspection/index.vue
+++ b/src/views/procurementManagement/qualityInspection/index.vue
@@ -119,7 +119,7 @@
         <el-row :gutter="20">
           <el-col :span="12">
             <el-form-item label="鍒涘缓鏃堕棿">
-              <el-date-picker v-model="formData.createTime"
+              <el-date-picker v-model="formCreateTimeDate"
                               type="date"
                               placeholder="閫夋嫨鏃ユ湡"
                               value-format="YYYY-MM-DD"
@@ -138,7 +138,8 @@
 
 <script setup>
 import FormDialog from '@/components/Dialog/FormDialog.vue';
-import { ref, reactive } from 'vue'
+import { ref, reactive, computed } from 'vue'
+import dayjs from 'dayjs'
 import { ElMessage, ElMessageBox } from 'element-plus'
 
 const loading = ref(false)
@@ -158,6 +159,12 @@
   inspector: '',
   remark: '',
   createTime: ''
+})
+const formCreateTimeDate = computed({
+  get: () => (formData.createTime ? String(formData.createTime).split(' ')[0] : ''),
+  set: (value) => {
+    formData.createTime = value ? `${value} ${dayjs().format('HH:mm:ss')}` : ''
+  }
 })
 
 const mockData = [
@@ -203,7 +210,8 @@
       arrivalNo: row.arrivalNo, 
       supplierName: row.supplierName, 
       inspector: row.inspector,
-      remark: row.remark 
+      remark: row.remark,
+      createTime: row.createTime || ''
     })
   } else {
     Object.assign(formData, {
@@ -212,7 +220,7 @@
       products: [],
       inspector: '',
       remark: '',
-      createTime: new Date().toISOString().split('T')[0]
+      createTime: dayjs().format('YYYY-MM-DD HH:mm:ss')
     })
   }
   dialogVisible.value = true
diff --git a/src/views/productManagement/productIdentifier/index.vue b/src/views/productManagement/productIdentifier/index.vue
index 2eceb31..d638e7a 100644
--- a/src/views/productManagement/productIdentifier/index.vue
+++ b/src/views/productManagement/productIdentifier/index.vue
@@ -240,7 +240,7 @@
           <span>{{ currentProduct.identifierType }}</span>
         </el-form-item>
         <el-form-item label="鍒涘缓鏃堕棿">
-          <el-date-picker v-model="createTime"
+          <el-date-picker v-model="createTimeDate"
                           type="date"
                           placeholder="閫夋嫨鏃ユ湡"
                           value-format="YYYY-MM-DD"
@@ -363,6 +363,7 @@
 
 <script setup>
   import { ref, reactive, computed } from "vue";
+  import dayjs from "dayjs";
   import { ElMessage, ElMessageBox } from "element-plus";
   import { Plus, Search, Loading, Download } from "@element-plus/icons-vue";
   import Pagination from "@/components/PIMTable/Pagination.vue";
@@ -449,7 +450,13 @@
   const generateQuantity = ref(1);
   const codeRule = ref("");
   const customPrefix = ref("");
-  const createTime = ref(new Date().toISOString().split('T')[0]);
+  const createTime = ref(dayjs().format("YYYY-MM-DD HH:mm:ss"));
+  const createTimeDate = computed({
+    get: () => (createTime.value ? String(createTime.value).split(" ")[0] : ""),
+    set: (value) => {
+      createTime.value = value ? `${value} ${dayjs().format("HH:mm:ss")}` : "";
+    },
+  });
   const newBatchNo = ref("");
   const reassignReason = ref("");
   const formRef = ref();
diff --git a/src/views/productionPlan/productionPlan/index.vue b/src/views/productionPlan/productionPlan/index.vue
index 78d9870..fd6c1a3 100644
--- a/src/views/productionPlan/productionPlan/index.vue
+++ b/src/views/productionPlan/productionPlan/index.vue
@@ -140,7 +140,7 @@
                            style="width: 100%" />
         </el-form-item>
         <el-form-item label="鍒涘缓鏃堕棿">
-          <el-date-picker v-model="mergeForm.createTime"
+          <el-date-picker v-model="mergeCreateTimeDate"
                           type="date"
                           value-format="YYYY-MM-DD"
                           style="width: 100%" />
@@ -235,7 +235,7 @@
         </el-form-item>
         <el-form-item label="鍒涘缓鏃堕棿"
                       prop="createTime">
-          <el-date-picker v-model="form.createTime"
+          <el-date-picker v-model="formCreateTimeDate"
                           type="date"
                           value-format="YYYY-MM-DD"
                           style="width: 100%"
@@ -444,7 +444,7 @@
               Number(row.qtyRequired || 0) - Number(row.quantityIssued || 0);
             mergeForm.planCompleteTime = row.requiredDate || "";
             mergeForm.productId = row.productId || "";
-            mergeForm.createTime = new Date().toISOString().split("T")[0];
+            mergeForm.createTime = dayjs().format("YYYY-MM-DD HH:mm:ss");
             mergeForm.ids = [row.id];
             sumAssignedQuantity.value =
               Number(row.qtyRequired || 0) - Number(row.quantityIssued || 0);
@@ -490,6 +490,12 @@
     productId: "",
     createTime: "",
   });
+  const mergeCreateTimeDate = computed({
+    get: () => (mergeForm.createTime ? String(mergeForm.createTime).split(" ")[0] : ""),
+    set: (value) => {
+      mergeForm.createTime = value ? `${value} ${dayjs().format("HH:mm:ss")}` : "";
+    },
+  });
 
   // 瀵煎叆鐩稿叧
   const importDialogRef = ref(null);
@@ -520,6 +526,12 @@
     promisedDeliveryDate: "",
     remark: "",
     createTime: "",
+  });
+  const formCreateTimeDate = computed({
+    get: () => (form.createTime ? String(form.createTime).split(" ")[0] : ""),
+    set: (value) => {
+      form.createTime = value ? `${value} ${dayjs().format("HH:mm:ss")}` : "";
+    },
   });
   const rules = reactive({
     productId: [{ required: true, message: "璇烽�夋嫨浜у搧", trigger: "change" }],
@@ -763,6 +775,7 @@
     mergeForm.totalAssignedQuantity = totalAssignedQuantity;
     mergeForm.planCompleteTime = firstRow.requiredDate || "";
     mergeForm.productId = firstRow.productId || "";
+    mergeForm.createTime = dayjs().format("YYYY-MM-DD HH:mm:ss");
     mergeForm.ids = selectedRows.value.map(row => row.id);
 
     // 鎵撳紑寮圭獥
@@ -906,7 +919,7 @@
       requiredDate: "",
       promisedDeliveryDate: "",
       remark: "",
-      createTime: new Date().toISOString().split("T")[0],
+      createTime: dayjs().format("YYYY-MM-DD HH:mm:ss"),
     });
     dialogVisible.value = true;
     fetchProductOptions();
@@ -927,6 +940,7 @@
       requiredDate: row.requiredDate || "",
       promisedDeliveryDate: row.promisedDeliveryDate || "",
       remark: row.remark || "",
+      createTime: row.createTime || "",
     });
     dialogVisible.value = true;
     fetchProductOptions();
diff --git a/src/views/safeProduction/safetyTrainingAssessment/index.vue b/src/views/safeProduction/safetyTrainingAssessment/index.vue
index ff09589..38c2172 100644
--- a/src/views/safeProduction/safetyTrainingAssessment/index.vue
+++ b/src/views/safeProduction/safetyTrainingAssessment/index.vue
@@ -85,7 +85,7 @@
             <el-form-item label="鍒涘缓鏃堕棿"
                           prop="createTime">
               <el-date-picker style="width: 100%"
-                              v-model="form.createTime"
+                              v-model="formCreateTimeDate"
                               value-format="YYYY-MM-DD"
                               format="YYYY-MM-DD"
                               type="date"
@@ -466,6 +466,12 @@
     dialogType: "add",
     viewDialogVisible: false,
     currentKnowledge: {},
+  });
+  const formCreateTimeDate = computed({
+    get: () => (form.value.createTime ? String(form.value.createTime).split(" ")[0] : ""),
+    set: (value) => {
+      form.value.createTime = value ? `${value} ${dayjs().format("HH:mm:ss")}` : "";
+    },
   });
 
   const {
@@ -1040,7 +1046,7 @@
         trainingMode: "", // 鍩硅鏂瑰紡
         placeTraining: "", // 鍩硅鍦扮偣
         classHour: "", // 璇炬椂
-        createTime: new Date().toISOString().split("T")[0], // 鍒涘缓鏃堕棿
+        createTime: dayjs().format("YYYY-MM-DD HH:mm:ss"), // 鍒涘缓鏃堕棿
       });
     } else if (type === "edit" && row) {
       dialogTitle.value = "缂栬緫鍩硅";
@@ -1058,6 +1064,7 @@
         trainingMode: row.trainingMode, // 鍩硅鏂瑰紡
         placeTraining: row.placeTraining, // 鍩硅鍦扮偣
         classHour: row.classHour, // 璇炬椂
+        createTime: row.createTime || "", // 鍒涘缓鏃堕棿
       });
     }
     dialogVisible.value = true;
diff --git a/src/views/salesManagement/salesLedger/index.vue b/src/views/salesManagement/salesLedger/index.vue
index 4c13d3d..5c643d7 100644
--- a/src/views/salesManagement/salesLedger/index.vue
+++ b/src/views/salesManagement/salesLedger/index.vue
@@ -117,6 +117,11 @@
                   </el-tag>
                 </template>
               </el-table-column>
+              <el-table-column label="瀹℃壒涓暟閲�" width="120" align="center">
+                <template #default="scope">
+                  <span>{{ scope.row.pendingApprovalQuantity || 0 }}</span>
+                </template>
+              </el-table-column>
               <el-table-column
                 label="蹇�掑叕鍙�"
                 prop="expressCompany"
@@ -1749,7 +1754,7 @@
     // 绛捐鏃ユ湡榛樿涓哄綋澶�
     form.value.executionDate = getCurrentDate();
     // 鍒涘缓鏃堕棿榛樿涓哄綋澶�
-    form.value.createTime = getCurrentDate();
+    form.value.createTime = dayjs().format("YYYY-MM-DD HH:mm:ss");
     // 榛樿鑷姩鐢熸垚閿�鍞悎鍚屽彿
     form.value.autoGenerateContractNo = true;
   } else {
@@ -2155,7 +2160,7 @@
 };
 
 // 鎵撳嵃鍔熻兘
-const handlePrint = async () => {
+  const handlePrint = async () => {
   if (selectedRows.value.length === 0) {
     proxy.$modal.msgWarning("璇烽�夋嫨瑕佹墦鍗扮殑鏁版嵁");
     return;
@@ -2512,11 +2517,7 @@
 // 鏍煎紡鍖栨棩鏈�
 const formatDate = (dateString) => {
   if (!dateString) return getCurrentDate();
-  const date = new Date(dateString);
-  const year = date.getFullYear();
-  const month = String(date.getMonth() + 1).padStart(2, "0");
-  const day = String(date.getDate()).padStart(2, "0");
-  return `${year}/${month}/${day}`;
+  return dayjs(dateString).format("YYYY/MM/DD HH:mm:ss");
 };
 // 鏍煎紡鍖栨棩鏈熸椂闂�
 const formatDateTime = (date) => {
@@ -2803,7 +2804,7 @@
 
 /**
  * 鍒ゆ柇鏄惁鍙互鍙戣揣
- * 鍙湁鍦ㄤ骇鍝佺姸鎬佹槸鍏呰冻锛屽彂璐х姸鎬佹槸寰呭彂璐у拰瀹℃牳鎷掔粷鐨勬椂鍊欐墠鍙互鍙戣揣
+ * 鍙湁鍦ㄤ骇鍝佺姸鎬佹槸鍏呰冻锛屽彂璐х姸鎬佹槸寰呭彂璐с�佸鎵逛腑銆佸鏍告嫆缁濄�侀儴鍒嗗彂璐х殑鏃跺�欐墠鍙互鍙戣揣
  * @param row 琛屾暟鎹�
  */
 const canShip = (row) => {
@@ -2815,15 +2816,16 @@
   // 鑾峰彇鍙戣揣鐘舵��
   const shippingStatus = row.shippingStatus;
 
-  // 濡傛灉宸插彂璐э紙鏈夊彂璐ф棩鏈熸垨杞︾墝鍙凤級锛屼笉鑳藉啀娆″彂璐�
+  // 濡傛灉宸插彂璐э紝涓嶈兘鍐嶆鍙戣揣
   if (shippingStatus === "宸插彂璐�") {
     return false;
   }
 
-  // 鍙戣揣鐘舵�佸繀椤绘槸"寰呭彂璐�"鎴�"瀹℃牳鎷掔粷"
+  // 鍙戣揣鐘舵�佸繀椤绘槸"寰呭彂璐�"銆�"瀹℃壒涓�"銆�"瀹℃牳鎷掔粷"鎴�"閮ㄥ垎鍙戣揣"
   const statusStr = shippingStatus ? String(shippingStatus).trim() : "";
   return (
     statusStr === "寰呭彂璐�" ||
+    statusStr === "瀹℃壒涓�" ||
     statusStr === "瀹℃牳鎷掔粷" ||
     statusStr === "閮ㄥ垎鍙戣揣"
   );
@@ -2844,7 +2846,7 @@
   // 妫�鏌ユ槸鍚﹀彲浠ュ彂璐�
   if (!canShip(row)) {
     proxy.$modal.msgWarning(
-      "鍙湁鍦ㄤ骇鍝佺姸鎬佹槸鍏呰冻锛屽彂璐х姸鎬佹槸寰呭彂璐ф垨瀹℃牳鎷掔粷鐨勬椂鍊欐墠鍙互鍙戣揣"
+      "鍙湁鍦ㄤ骇鍝佺姸鎬佹槸鍏呰冻锛屽彂璐х姸鎬佹槸寰呭彂璐с�佸鎵逛腑銆佸鏍告嫆缁濇垨閮ㄥ垎鍙戣揣鐨勬椂鍊欐墠鍙互鍙戣揣"
     );
     return;
   }
@@ -3179,4 +3181,4 @@
     page-break-after: avoid;
   }
 }
-</style>
+</style>
\ No newline at end of file

--
Gitblit v1.9.3