From b8ab235624031dc838f7584e19697f3e87e20e24 Mon Sep 17 00:00:00 2001
From: liyong <18434998025@163.com>
Date: 星期三, 06 五月 2026 17:32:33 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev_NEW_pro' into dev_NEW_pro

---
 src/store/modules/user.js                                                              |   53 +++--
 multiple/config.json                                                                   |    9 +
 src/layout/index.vue                                                                   |    5 
 src/views/productionManagement/productionOrder/components/MaterialSupplementDialog.vue |    6 
 src/store/modules/permission.js                                                        |   48 ++++
 src/views/salesManagement/salesLedger/index.vue                                        |   13 
 src/views/financialManagement/receivable/invoiceApply.vue                              |   16 +
 src/router/index.js                                                                    |  250 +++++++++++++-------------
 src/views/equipmentManagement/ledger/Form.vue                                          |   21 +-
 src/views/financialManagement/payable/input-invoice.vue                                |   16 +
 src/views/procurementManagement/procurementLedger/index.vue                            |   13 
 src/views/productionManagement/productionOrder/components/MaterialLedgerDialog.vue     |   11 
 src/views/productionManagement/productionOrder/index.vue                               |    4 
 src/views/projectManagement/Management/components/formDia.vue                          |   11 
 multiple/assets/favicon/SDJCfavicon.ico                                                |    0 
 multiple/assets/logo/SDJCLogo.png                                                      |    0 
 src/views/financialManagement/receivable/outputInvoice.vue                             |   16 +
 17 files changed, 280 insertions(+), 212 deletions(-)

diff --git a/multiple/assets/favicon/SDJCfavicon.ico b/multiple/assets/favicon/SDJCfavicon.ico
new file mode 100644
index 0000000..5e80af3
--- /dev/null
+++ b/multiple/assets/favicon/SDJCfavicon.ico
Binary files differ
diff --git a/multiple/assets/logo/SDJCLogo.png b/multiple/assets/logo/SDJCLogo.png
new file mode 100644
index 0000000..139e398
--- /dev/null
+++ b/multiple/assets/logo/SDJCLogo.png
Binary files differ
diff --git a/multiple/config.json b/multiple/config.json
index 60f9d3a..ead43d0 100644
--- a/multiple/config.json
+++ b/multiple/config.json
@@ -15,6 +15,15 @@
     "logo": "logo/Logo.png",
     "favicon": "favicon/favicon.ico"
   },
+  "SDJC": {
+    "env": {
+      "VITE_APP_TITLE": "榛庡煄鍘胯儨寰峰缓鏉愭湁闄愬叕鍙�",
+      "VITE_BASE_API": "http://36.138.236.153:9000",
+      "VITE_JAVA_API": "http://36.138.236.153:9001"
+    },
+    "logo": "logo/SDJCLogo.png",
+    "favicon": "favicon/SDJCfavicon.ico"
+  },
   "logo": "/src/assets/logo/logo.png",
   "favicon": "/public/favicon.ico"
 }
diff --git a/src/layout/index.vue b/src/layout/index.vue
index a1bb724..03c13ba 100644
--- a/src/layout/index.vue
+++ b/src/layout/index.vue
@@ -16,7 +16,7 @@
       <app-main />
       <settings ref="settingRef" />
     </div>
-    <AIChatSidebar />
+    <AIChatSidebar v-if="aiEnabled" />
   </div>
 </template>
 
@@ -28,15 +28,18 @@
   import defaultSettings from "@/settings";
 
   import useAppStore from "@/store/modules/app";
+  import useUserStore from "@/store/modules/user";
   import useSettingsStore from "@/store/modules/settings";
 
   const settingsStore = useSettingsStore();
+  const userStore = useUserStore();
   const theme = computed(() => settingsStore.theme);
   const sideTheme = computed(() => settingsStore.sideTheme);
   const sidebar = computed(() => useAppStore().sidebar);
   const device = computed(() => useAppStore().device);
   const needTagsView = computed(() => settingsStore.tagsView);
   const fixedHeader = computed(() => settingsStore.fixedHeader);
+  const aiEnabled = computed(() => Number(userStore.aiEnabled) === 1);
 
   const classObj = computed(() => ({
     hideSidebar: !sidebar.value.opened,
diff --git a/src/router/index.js b/src/router/index.js
index c9b163c..2bb5586 100644
--- a/src/router/index.js
+++ b/src/router/index.js
@@ -48,19 +48,19 @@
     hidden: true,
   },
   // 绯荤粺鏋舵瀯鍥�
-  {
-    path: "/system-architecture",
-    component: Layout,
-    redirect: "/system-architecture/index",
-    children: [
-      {
-        path: "index",
-        component: () => import("@/views/systemArchitecture/index.vue"),
-        name: "SystemArchitecture",
-        meta: { title: "绯荤粺鏋舵瀯鍥�", icon: "tree" },
-      },
-    ],
-  },
+  // {
+  //   path: "/system-architecture",
+  //   component: Layout,
+  //   redirect: "/system-architecture/index",
+  //   children: [
+  //     {
+  //       path: "index",
+  //       component: () => import("@/views/systemArchitecture/index.vue"),
+  //       name: "SystemArchitecture",
+  //       meta: { title: "绯荤粺鏋舵瀯鍥�", icon: "tree" },
+  //     },
+  //   ],
+  // },
   {
     path: "/:pathMatch(.*)*",
     component: () => import("@/views/error/404"),
@@ -134,118 +134,118 @@
     ],
   },
   // 璐㈠姟绠$悊妯″潡璺敱
-  {
-    path: "/financial",
-    component: Layout,
-    hidden: false,
-    redirect: "/financial/general-ledger",
-    alwaysShow: true,
-    meta: { title: "璐㈠姟绠$悊", icon: "money" },
-    children: [
-      {
-        path: "general-ledger",
-        component: () => import("@/views/financialManagement/generalLedger/index.vue"),
-        name: "GeneralLedger",
-        meta: { title: "鎬诲笎绉戠洰" },
-      },
-      {
-        path: "sales-out",
-        component: () => import("@/views/financialManagement/receivable/salesOut.vue"),
-        name: "SalesOut",
-        meta: { title: "閿�鍞嚭搴�" },
-      },
-      {
-        path: "sales-return",
-        component: () => import("@/views/financialManagement/receivable/salesReturn.vue"),
-        name: "SalesReturn",
-        meta: { title: "閿�鍞��璐�" },
-      },
-      {
-        path: "receivable-reconciliation",
-        component: () => import("@/views/financialManagement/receivable/reconciliation.vue"),
-        name: "ReceivableReconciliation",
-        meta: { title: "搴旀敹瀵硅处" },
-      },
-      {
-        path: "invoice-apply",
-        component: () => import("@/views/financialManagement/receivable/invoiceApply.vue"),
-        name: "InvoiceApply",
-        meta: { title: "寮�绁ㄧ敵璇�" },
-      },
-      {
-        path: "output-invoice",
-        component: () => import("@/views/financialManagement/receivable/outputInvoice.vue"),
-        name: "OutputInvoice",
-        meta: { title: "閿�椤瑰彂绁�" },
-      },
-      {
-        path: "receipt",
-        component: () => import("@/views/financialManagement/receivable/receipt.vue"),
-        name: "Receipt",
-        meta: { title: "鏀舵鍗�" },
-      },
-      {
-        path: "purchase-in",
-        component: () => import("@/views/financialManagement/payable/purchaseIn.vue"),
-        name: "PurchaseIn",
-        meta: { title: "閲囪喘鍏ュ簱" },
-      },
-      {
-        path: "payable-reconciliation",
-        component: () => import("@/views/financialManagement/payable/reconciliation.vue"),
-        name: "PayableReconciliation",
-        meta: { title: "搴斾粯瀵硅处" },
-      },
-      {
-        path: "input-invoice",
-        component: () => import("@/views/financialManagement/payable/input-invoice.vue"),
-        name: "InputInvoice",
-        meta: { title: "杩涢」鍙戠エ" },
-      },
-      {
-        path: "payment-apply",
-        component: () => import("@/views/financialManagement/payable/paymentApply.vue"),
-        name: "PaymentApply",
-        meta: { title: "浠樻鐢宠" },
-      },
-      {
-        path: "payment",
-        component: () => import("@/views/financialManagement/payable/payment.vue"),
-        name: "Payment",
-        meta: { title: "浠樻鍗�" },
-      },
-      {
-        path: "fixed-assets",
-        component: () => import("@/views/financialManagement/assets/fixedAssets.vue"),
-        name: "FixedAssets",
-        meta: { title: "鍥哄畾璧勪骇" },
-      },
-      {
-        path: "intangible-assets",
-        component: () => import("@/views/financialManagement/assets/intangibleAssets.vue"),
-        name: "IntangibleAssets",
-        meta: { title: "鏃犲舰璧勪骇" },
-      },
-      {
-        path: "voucher",
-        component: () => import("@/views/financialManagement/voucher/index.vue"),
-        name: "Voucher",
-        meta: { title: "鍑瘉" },
-      },
-      {
-        path: "voucher-general-ledger",
-        component: () => import("@/views/financialManagement/voucher/generalLedger.vue"),
-        name: "VoucherGeneralLedger",
-        meta: { title: "绉戠洰鎬诲笎" },
-      },
-      {
-        path: "voucher-detail-ledger",
-        component: () => import("@/views/financialManagement/voucher/detailLedger.vue"),
-        name: "VoucherDetailLedger",
-        meta: { title: "绉戠洰鏄庣粏甯�" },
-      },
-    ],
-  },
+  // {
+  //   path: "/financial",
+  //   component: Layout,
+  //   hidden: false,
+  //   redirect: "/financial/general-ledger",
+  //   alwaysShow: true,
+  //   meta: { title: "璐㈠姟绠$悊", icon: "money" },
+  //   children: [
+  //     {
+  //       path: "general-ledger",
+  //       component: () => import("@/views/financialManagement/generalLedger/index.vue"),
+  //       name: "GeneralLedger",
+  //       meta: { title: "鎬诲笎绉戠洰" },
+  //     },
+  //     {
+  //       path: "sales-out",
+  //       component: () => import("@/views/financialManagement/receivable/salesOut.vue"),
+  //       name: "SalesOut",
+  //       meta: { title: "閿�鍞嚭搴�" },
+  //     },
+  //     {
+  //       path: "sales-return",
+  //       component: () => import("@/views/financialManagement/receivable/salesReturn.vue"),
+  //       name: "SalesReturn",
+  //       meta: { title: "閿�鍞��璐�" },
+  //     },
+  //     {
+  //       path: "receivable-reconciliation",
+  //       component: () => import("@/views/financialManagement/receivable/reconciliation.vue"),
+  //       name: "ReceivableReconciliation",
+  //       meta: { title: "搴旀敹瀵硅处" },
+  //     },
+  //     {
+  //       path: "invoice-apply",
+  //       component: () => import("@/views/financialManagement/receivable/invoiceApply.vue"),
+  //       name: "InvoiceApply",
+  //       meta: { title: "寮�绁ㄧ敵璇�" },
+  //     },
+  //     {
+  //       path: "output-invoice",
+  //       component: () => import("@/views/financialManagement/receivable/outputInvoice.vue"),
+  //       name: "OutputInvoice",
+  //       meta: { title: "閿�椤瑰彂绁�" },
+  //     },
+  //     {
+  //       path: "receipt",
+  //       component: () => import("@/views/financialManagement/receivable/receipt.vue"),
+  //       name: "Receipt",
+  //       meta: { title: "鏀舵鍗�" },
+  //     },
+  //     {
+  //       path: "purchase-in",
+  //       component: () => import("@/views/financialManagement/payable/purchaseIn.vue"),
+  //       name: "PurchaseIn",
+  //       meta: { title: "閲囪喘鍏ュ簱" },
+  //     },
+  //     {
+  //       path: "payable-reconciliation",
+  //       component: () => import("@/views/financialManagement/payable/reconciliation.vue"),
+  //       name: "PayableReconciliation",
+  //       meta: { title: "搴斾粯瀵硅处" },
+  //     },
+  //     {
+  //       path: "input-invoice",
+  //       component: () => import("@/views/financialManagement/payable/input-invoice.vue"),
+  //       name: "InputInvoice",
+  //       meta: { title: "杩涢」鍙戠エ" },
+  //     },
+  //     {
+  //       path: "payment-apply",
+  //       component: () => import("@/views/financialManagement/payable/paymentApply.vue"),
+  //       name: "PaymentApply",
+  //       meta: { title: "浠樻鐢宠" },
+  //     },
+  //     {
+  //       path: "payment",
+  //       component: () => import("@/views/financialManagement/payable/payment.vue"),
+  //       name: "Payment",
+  //       meta: { title: "浠樻鍗�" },
+  //     },
+  //     {
+  //       path: "fixed-assets",
+  //       component: () => import("@/views/financialManagement/assets/fixedAssets.vue"),
+  //       name: "FixedAssets",
+  //       meta: { title: "鍥哄畾璧勪骇" },
+  //     },
+  //     {
+  //       path: "intangible-assets",
+  //       component: () => import("@/views/financialManagement/assets/intangibleAssets.vue"),
+  //       name: "IntangibleAssets",
+  //       meta: { title: "鏃犲舰璧勪骇" },
+  //     },
+  //     {
+  //       path: "voucher",
+  //       component: () => import("@/views/financialManagement/voucher/index.vue"),
+  //       name: "Voucher",
+  //       meta: { title: "鍑瘉" },
+  //     },
+  //     {
+  //       path: "voucher-general-ledger",
+  //       component: () => import("@/views/financialManagement/voucher/generalLedger.vue"),
+  //       name: "VoucherGeneralLedger",
+  //       meta: { title: "绉戠洰鎬诲笎" },
+  //     },
+  //     {
+  //       path: "voucher-detail-ledger",
+  //       component: () => import("@/views/financialManagement/voucher/detailLedger.vue"),
+  //       name: "VoucherDetailLedger",
+  //       meta: { title: "绉戠洰鏄庣粏甯�" },
+  //     },
+  //   ],
+  // },
 ];
 
 // 鍔ㄦ�佽矾鐢憋紝鍩轰簬鐢ㄦ埛鏉冮檺鍔ㄦ�佸幓鍔犺浇
diff --git a/src/store/modules/permission.js b/src/store/modules/permission.js
index f7a7044..d3f0594 100644
--- a/src/store/modules/permission.js
+++ b/src/store/modules/permission.js
@@ -1,9 +1,10 @@
 import auth from '@/plugins/auth'
 import router, { constantRoutes, dynamicRoutes } from '@/router'
 import { getRouters } from '@/api/menu'
-import Layout from '@/layout/index'
-import ParentView from '@/components/ParentView'
-import InnerLink from '@/layout/components/InnerLink'
+import Layout from '@/layout/index'
+import ParentView from '@/components/ParentView'
+import InnerLink from '@/layout/components/InnerLink'
+import useUserStore from '@/store/modules/user'
 
 // 鍖归厤views閲岄潰鎵�鏈夌殑.vue鏂囦欢
 const modules = import.meta.glob('./../../views/**/*.vue')
@@ -36,9 +37,11 @@
         return new Promise(resolve => {
           // 鍚戝悗绔姹傝矾鐢辨暟鎹�
           getRouters().then(res => {
-            const sdata = JSON.parse(JSON.stringify(res.data))
-            const rdata = JSON.parse(JSON.stringify(res.data))
-            const defaultData = JSON.parse(JSON.stringify(res.data))
+            const aiEnabled = Number(useUserStore().aiEnabled) === 1
+            const rawRoutes = filterAiFeatureRoutes(res.data, aiEnabled)
+            const sdata = JSON.parse(JSON.stringify(rawRoutes))
+            const rdata = JSON.parse(JSON.stringify(rawRoutes))
+            const defaultData = JSON.parse(JSON.stringify(rawRoutes))
             const sidebarRoutes = filterAsyncRouter(sdata)
             const rewriteRoutes = filterAsyncRouter(rdata, false, true)
             const defaultRoutes = filterAsyncRouter(defaultData)
@@ -57,7 +60,38 @@
   })
 
 // 閬嶅巻鍚庡彴浼犳潵鐨勮矾鐢卞瓧绗︿覆锛岃浆鎹负缁勪欢瀵硅薄
-function filterAsyncRouter(asyncRouterMap, lastRouter = false, type = false) {
+function filterAiFeatureRoutes(routes = [], aiEnabled = false) {
+  if (aiEnabled) {
+    return routes
+  }
+  return routes.reduce((acc, route) => {
+    if (!route || isAiFeatureRoute(route)) {
+      return acc
+    }
+    const nextRoute = { ...route }
+    if (Array.isArray(nextRoute.children) && nextRoute.children.length > 0) {
+      nextRoute.children = filterAiFeatureRoutes(nextRoute.children, aiEnabled)
+    }
+    acc.push(nextRoute)
+    return acc
+  }, [])
+}
+
+function isAiFeatureRoute(route = {}) {
+  const path = String(route.path || '').toLowerCase()
+  const component = String(route.component || '').toLowerCase()
+  const name = String(route.name || '').toLowerCase()
+  const title = String(route?.meta?.title ?? route?.title ?? '')
+
+  return (
+    path.includes('chathome') ||
+    component.includes('chathome') ||
+    name.includes('chathome') ||
+    title.includes('AI')
+  )
+}
+
+function filterAsyncRouter(asyncRouterMap, lastRouter = false, type = false) {
   return asyncRouterMap.filter(route => {
     if (type && route.children) {
       route.children = filterChildren(route.children)
diff --git a/src/store/modules/user.js b/src/store/modules/user.js
index 4f3eab4..ea358d1 100644
--- a/src/store/modules/user.js
+++ b/src/store/modules/user.js
@@ -7,13 +7,14 @@
 const useUserStore = defineStore(
   'user',
   {
-    state: () => ({
-      token: getToken(),
-      id: '',
-      name: '',
-      avatar: '',
-      roles: [],
-      permissions: []
+    state: () => ({
+      token: getToken(),
+      id: '',
+      name: '',
+      avatar: '',
+      roles: [],
+      permissions: [],
+      aiEnabled: 0
     }),
     actions: {
       // 鐧诲綍
@@ -58,29 +59,31 @@
             this.id = user.userId
             this.name = user.userName
             this.avatar = avatar
-            this.currentFactoryName = user.currentFactoryName
-            this.nickName = user.nickName
-            this.roleName = user.roles[0].roleName
-            this.currentDeptId = user.tenantId
-            this.currentLoginTime = this.getCurrentTime()
-            resolve(res)
-          }).catch(error => {
-            reject(error)
-          })
-        })
+            this.currentFactoryName = user.currentFactoryName
+            this.nickName = user.nickName
+            this.roleName = user.roles[0].roleName
+            this.currentDeptId = user.tenantId
+            this.currentLoginTime = this.getCurrentTime()
+            this.aiEnabled = Number(res.aiEnabled) === 1 ? 1 : 0
+            resolve(res)
+          }).catch(error => {
+            reject(error)
+          })
+        })
       },
       // 閫�鍑虹郴缁�
       logOut() {
         return new Promise((resolve, reject) => {
           logout(this.token).then(() => {
-            this.token = ''
-            this.roles = []
-            this.permissions = []
-            removeToken()
-            resolve()
-          }).catch(error => {
-            reject(error)
-          })
+            this.token = ''
+            this.roles = []
+            this.permissions = []
+            this.aiEnabled = 0
+            removeToken()
+            resolve()
+          }).catch(error => {
+            reject(error)
+          })
         })
       },
       // 鐧诲綍鏍¢獙
diff --git a/src/views/equipmentManagement/ledger/Form.vue b/src/views/equipmentManagement/ledger/Form.vue
index 72d594e..45ca248 100644
--- a/src/views/equipmentManagement/ledger/Form.vue
+++ b/src/views/equipmentManagement/ledger/Form.vue
@@ -100,22 +100,18 @@
       </el-col>
       <el-col :span="12">
         <el-form-item label="绋庣巼(%)" prop="taxRate">
-          <!-- <el-input
-            v-model="form.taxRate"
-            placeholder="璇疯緭鍏ョ◣鐜�"
-            type="number"
-          >
-            <template #append> % </template>
-          </el-input> -->
           <el-select
             v-model="form.taxRate"
             placeholder="璇烽�夋嫨"
             clearable
             @change="mathNum"
           >
-            <el-option label="1" :value="1" />
-            <el-option label="6" :value="6" />
-            <el-option label="13" :value="13" />
+            <el-option
+              v-for="dict in tax_rate"
+              :key="dict.value"
+              :label="dict.label"
+              :value="Number(dict.value)"
+            />
           </el-select>
         </el-form-item>
       </el-col>
@@ -174,7 +170,10 @@
   calculateTaxExclusiveTotalPrice,
 } from "@/utils/summarizeTable";
 import { ElMessage } from "element-plus";
-import {ref} from "vue";
+import {ref, getCurrentInstance} from "vue";
+
+const { proxy } = getCurrentInstance();
+const { tax_rate } = proxy.useDict("tax_rate");
 
 defineOptions({
   name: "璁惧鍙拌处琛ㄥ崟",
diff --git a/src/views/financialManagement/payable/input-invoice.vue b/src/views/financialManagement/payable/input-invoice.vue
index b809c98..660d0dd 100644
--- a/src/views/financialManagement/payable/input-invoice.vue
+++ b/src/views/financialManagement/payable/input-invoice.vue
@@ -104,11 +104,12 @@
           <el-col :span="8">
             <el-form-item label="绋庣巼" prop="taxRate">
               <el-select v-model="form.taxRate" placeholder="璇烽�夋嫨绋庣巼" style="width: 100%;" @change="calculateTax">
-                <el-option label="0%" :value="0" />
-                <el-option label="3%" :value="3" />
-                <el-option label="6%" :value="6" />
-                <el-option label="9%" :value="9" />
-                <el-option label="13%" :value="13" />
+                <el-option
+                  v-for="dict in tax_rate"
+                  :key="dict.value"
+                  :label="dict.label"
+                  :value="Number(dict.value)"
+                />
               </el-select>
             </el-form-item>
           </el-col>
@@ -150,7 +151,7 @@
 </template>
 
 <script setup>
-import { ref, reactive, onMounted } from "vue";
+import { ref, reactive, onMounted, getCurrentInstance } from "vue";
 import { ElMessage, ElMessageBox } from "element-plus";
 import FormDialog from "@/components/Dialog/FormDialog.vue";
 
@@ -158,6 +159,9 @@
   name: "杩涢」鍙戠エ",
 });
 
+const { proxy } = getCurrentInstance();
+const { tax_rate } = proxy.useDict("tax_rate");
+
 const filters = reactive({
   invoiceCode: "",
   invoiceNo: "",
diff --git a/src/views/financialManagement/receivable/invoiceApply.vue b/src/views/financialManagement/receivable/invoiceApply.vue
index be9621d..2a4bd81 100644
--- a/src/views/financialManagement/receivable/invoiceApply.vue
+++ b/src/views/financialManagement/receivable/invoiceApply.vue
@@ -86,11 +86,12 @@
           <el-col :span="12">
             <el-form-item label="绋庣巼" prop="taxRate">
               <el-select v-model="form.taxRate" placeholder="璇烽�夋嫨绋庣巼" style="width: 100%;">
-                <el-option label="0%" :value="0" />
-                <el-option label="3%" :value="3" />
-                <el-option label="6%" :value="6" />
-                <el-option label="9%" :value="9" />
-                <el-option label="13%" :value="13" />
+                <el-option
+                  v-for="dict in tax_rate"
+                  :key="dict.value"
+                  :label="dict.label"
+                  :value="Number(dict.value)"
+                />
               </el-select>
             </el-form-item>
           </el-col>
@@ -127,7 +128,7 @@
 </template>
 
 <script setup>
-import { ref, reactive, onMounted } from "vue";
+import { ref, reactive, onMounted, getCurrentInstance } from "vue";
 import { ElMessage, ElMessageBox } from "element-plus";
 import FormDialog from "@/components/Dialog/FormDialog.vue";
 
@@ -135,6 +136,9 @@
   name: "寮�绁ㄧ敵璇�",
 });
 
+const { proxy } = getCurrentInstance();
+const { tax_rate } = proxy.useDict("tax_rate");
+
 const filters = reactive({
   applyCode: "",
   customerId: "",
diff --git a/src/views/financialManagement/receivable/outputInvoice.vue b/src/views/financialManagement/receivable/outputInvoice.vue
index 1f6b0a4..3e597db 100644
--- a/src/views/financialManagement/receivable/outputInvoice.vue
+++ b/src/views/financialManagement/receivable/outputInvoice.vue
@@ -98,11 +98,12 @@
           <el-col :span="12">
             <el-form-item label="绋庣巼" prop="taxRate">
               <el-select v-model="form.taxRate" placeholder="璇烽�夋嫨绋庣巼" style="width: 100%;" @change="calculateTax">
-                <el-option label="0%" :value="0" />
-                <el-option label="3%" :value="3" />
-                <el-option label="6%" :value="6" />
-                <el-option label="9%" :value="9" />
-                <el-option label="13%" :value="13" />
+                <el-option
+                  v-for="dict in tax_rate"
+                  :key="dict.value"
+                  :label="dict.label"
+                  :value="Number(dict.value)"
+                />
               </el-select>
             </el-form-item>
           </el-col>
@@ -140,7 +141,7 @@
 </template>
 
 <script setup>
-import { ref, reactive, onMounted, computed } from "vue";
+import { ref, reactive, onMounted, computed, getCurrentInstance } from "vue";
 import { ElMessage, ElMessageBox } from "element-plus";
 import FormDialog from "@/components/Dialog/FormDialog.vue";
 
@@ -148,6 +149,9 @@
   name: "閿�椤瑰彂绁�",
 });
 
+const { proxy } = getCurrentInstance();
+const { tax_rate } = proxy.useDict("tax_rate");
+
 const filters = reactive({
   invoiceCode: "",
   invoiceNo: "",
diff --git a/src/views/procurementManagement/procurementLedger/index.vue b/src/views/procurementManagement/procurementLedger/index.vue
index 28fb968..7c8cb89 100644
--- a/src/views/procurementManagement/procurementLedger/index.vue
+++ b/src/views/procurementManagement/procurementLedger/index.vue
@@ -526,12 +526,12 @@
                          placeholder="璇烽�夋嫨"
                          clearable
                          @change="mathNum">
-                <el-option label="1"
-                           value="1"/>
-                <el-option label="6"
-                           value="6"/>
-                <el-option label="13"
-                           value="13"/>
+                <el-option
+                  v-for="dict in tax_rate"
+                  :key="dict.value"
+                  :label="dict.label"
+                  :value="dict.value"
+                />
               </el-select>
             </el-form-item>
           </el-col>
@@ -673,6 +673,7 @@
   const FileList = defineAsyncComponent(() => import("@/components/Dialog/FileList.vue"));
 
 const {proxy} = getCurrentInstance();
+const { tax_rate } = proxy.useDict("tax_rate");
 const tableData = ref([]);
 const productData = ref([]);
 const selectedRows = ref([]);
diff --git a/src/views/productionManagement/productionOrder/components/MaterialLedgerDialog.vue b/src/views/productionManagement/productionOrder/components/MaterialLedgerDialog.vue
index 991f2a1..210dbba 100644
--- a/src/views/productionManagement/productionOrder/components/MaterialLedgerDialog.vue
+++ b/src/views/productionManagement/productionOrder/components/MaterialLedgerDialog.vue
@@ -49,11 +49,8 @@
           </template>
         </el-table-column>
         <!-- 鎵瑰彿澶氶�� -->
-        <el-table-column min-width="200">
-          <template #header>
-            <span style="color: #f56c6c; margin-right: 4px;">*</span>
-            <span>鎵瑰彿</span>
-          </template>
+        <el-table-column min-width="200"
+                         label="鎵瑰彿">
           <template #default="{ row }">
             <el-select v-model="row.batchNo"
                        multiple
@@ -313,8 +310,8 @@
       item =>
         !item.operationName ||
         !item.materialName ||
-        !item.batchNo ||
-        item.batchNo.length === 0 ||
+        (Number(item.pickQty) > 0 &&
+          (!item.batchNo || item.batchNo.length === 0)) ||
         item.demandedQuantity === null ||
         item.demandedQuantity === undefined ||
         item.pickQty === null ||
diff --git a/src/views/productionManagement/productionOrder/components/MaterialSupplementDialog.vue b/src/views/productionManagement/productionOrder/components/MaterialSupplementDialog.vue
index 67e44f1..4f052ed 100644
--- a/src/views/productionManagement/productionOrder/components/MaterialSupplementDialog.vue
+++ b/src/views/productionManagement/productionOrder/components/MaterialSupplementDialog.vue
@@ -19,9 +19,15 @@
       <el-table-column label="璁¢噺鍗曚綅"
                        prop="unit"
                        width="100" />
+      <el-table-column label="闇�姹傛暟閲�"
+                       prop="demandedQuantity"
+                       width="100" />
       <el-table-column label="棰嗙敤鏁伴噺"
                        prop="pickQuantity"
                        width="100" />
+      <el-table-column label="宸茶ˉ鏁伴噺"
+                       prop="feedingQty"
+                       width="100" />
       <el-table-column label="琛ユ枡鏁伴噺"
                        min-width="150">
         <template #default="{ row }">
diff --git a/src/views/productionManagement/productionOrder/index.vue b/src/views/productionManagement/productionOrder/index.vue
index c37358b..8d44b85 100644
--- a/src/views/productionManagement/productionOrder/index.vue
+++ b/src/views/productionManagement/productionOrder/index.vue
@@ -402,7 +402,7 @@
           name: "棰嗘枡",
           type: "text",
           color: "#5EC7AB",
-          showHide: row => !row.endOrder,
+          showHide: row => !row.endOrder && !row.returned,
           clickFun: row => {
             openMaterialDialog(row);
           },
@@ -411,7 +411,7 @@
           name: "琛ユ枡",
           type: "text",
           color: "#5EC7AB",
-          showHide: row => !row.endOrder,
+          showHide: row => !row.endOrder && !row.returned,
           clickFun: row => {
             openMaterialSupplementDialog(row);
           },
diff --git a/src/views/projectManagement/Management/components/formDia.vue b/src/views/projectManagement/Management/components/formDia.vue
index f29512b..c2ee9c2 100644
--- a/src/views/projectManagement/Management/components/formDia.vue
+++ b/src/views/projectManagement/Management/components/formDia.vue
@@ -571,9 +571,12 @@
         <el-col :span="12">
           <el-form-item label="绋庣巼(%)锛�" prop="taxRate">
             <el-select v-model="productForm.taxRate" placeholder="璇烽�夋嫨" clearable @change="calculateFromTaxRate">
-              <el-option label="1" value="1" />
-              <el-option label="6" value="6" />
-              <el-option label="13" value="13" />
+              <el-option
+                v-for="dict in tax_rate"
+                :key="dict.value"
+                :label="dict.label"
+                :value="dict.value"
+              />
             </el-select>
           </el-form-item>
         </el-col>
@@ -650,7 +653,7 @@
 
 const emit = defineEmits(['completed'])
 const { proxy } = getCurrentInstance()
-const { bill_status, project_management, plan_status } = proxy.useDict('bill_status', 'project_management', 'plan_status')
+const { bill_status, project_management, plan_status, tax_rate } = proxy.useDict('bill_status', 'project_management', 'plan_status', 'tax_rate')
 
 const dialogVisible = ref(false)
 const operationType = ref('add')
diff --git a/src/views/salesManagement/salesLedger/index.vue b/src/views/salesManagement/salesLedger/index.vue
index 7849b60..c6184c8 100644
--- a/src/views/salesManagement/salesLedger/index.vue
+++ b/src/views/salesManagement/salesLedger/index.vue
@@ -640,12 +640,12 @@
                          placeholder="璇烽�夋嫨"
                          clearable
                          @change="calculateFromTaxRate">
-                <el-option label="1"
-                           value="1"/>
-                <el-option label="6"
-                           value="6"/>
-                <el-option label="13"
-                           value="13"/>
+                <el-option
+                  v-for="dict in tax_rate"
+                  :key="dict.value"
+                  :label="dict.label"
+                  :value="dict.value"
+                />
               </el-select>
             </el-form-item>
           </el-col>
@@ -996,6 +996,7 @@
 const route = useRoute();
 const userStore = useUserStore();
 const {proxy} = getCurrentInstance();
+const { tax_rate } = proxy.useDict("tax_rate");
 const tableData = ref([]);
 const productData = ref([]);
 const selectedRows = ref([]);

--
Gitblit v1.9.3