Selaa lähdekoodia

1、床垫报价,修复复制报价切换到详情页后变成详情页问题
2、床垫报价,限制已生成L1物料编码无法删除
3、床垫报价,副规格新增额外费用列
4、床垫报价,修复副规格修改物料没有变化问题

MY 1 viikko sitten
vanhempi
commit
516ae2ad53

+ 5 - 1
JLHHJSvr/Excutor/DelMattressExcutor.cs

@@ -47,7 +47,7 @@ namespace JLHHJSvr.Excutor
                         foreach (int itemid in request.mattressids)
                         {
                             var mattressInfo = new u_mattress() { mattressid = itemid };
-                            if (DbSqlHelper.SelectOne(cmd, mattressInfo, "flag, js1_flag, mattresscode, parentid") != 1)
+                            if (DbSqlHelper.SelectOne(cmd, mattressInfo, "flag, js1_flag, mattresscode, parentid,erp_mtrlid") != 1)
                             {
                                 rslt.ErrMsg = "查找报价单据失败:" + itemid;
                                 return;
@@ -61,6 +61,10 @@ namespace JLHHJSvr.Excutor
                             {
                                 throw new LJCommonException("资料已技术审核不能删除!(" + mattressInfo.mattresscode + ")");
                             }
+                            if (mattressInfo.erp_mtrlid > 0)
+                            {
+                                throw new LJCommonException($"床垫报价[{mattressInfo.mattresscode}]已生成L1物料编码,无法删除!");
+                            }
 
                             if (mattressInfo.parentid == null || mattressInfo.parentid == 0)
                             {

+ 1 - 1
JLHHJSvr/Excutor/GetMattressSubspecsExcutor.cs

@@ -44,7 +44,7 @@ namespace JLHHJSvr.Excutor
 
                     var subspecsList = new List<u_mattress>();
                     var result = new List<u_mattress_mx_subspecs>();
-                    var fields = "mattressid,mattress_width,mattress_length,mattress_height,mattressname,mattressrelcode,version";
+                    var fields = "mattressid,mattress_width,mattress_length,mattress_height,mattressname,mattressrelcode,version,extras_cost";
                     if (request.type == 0)
                     {
                         fields += ",mattresscode,parentid,erp_mtrlid,erp_mtrlcode,erp_configcodetype, erp_mtrlengname, erp_mtrlmode, erp_mtrlname, erp_mtrltype, erp_mtrltypeid, erp_mtrlunit, erp_piccode, xd_flag, flag, js1_flag";

+ 6 - 3
JLHHJSvr/Helper/MattressHelper.cs

@@ -1704,7 +1704,7 @@ namespace JLHHJSvr.Helper
         public List<u_mattress_mx_mtrl> GetMattressMxMtrl(int mattressid,List<string> extraWhere = null)
         {
             var mxList = new List<u_mattress_mx_mtrl>();
-            var outputFields = @"mattressmxid, mattressid, formulakind, formula, formulaid, mtrlid, mtrlname, price, gram_weight, cloth_width, if_inputqty, qty , costamt, if_areaprice, formulatype, sortcode, if_mtrl, if_success, replace_formula, priceunit, shrinkage, name, dannum1_rate, dannum2_rate, dannum3_rate, dannum4_rate, thickness, chastr, xu, useqty, useformula, replace_useformula , gydscrp, mattress_width, mattress_length, spring_qty_width, spring_qty_length,sidecover";
+            var outputFields = @"mattressmxid, mattressid, formulakind, formula, formulaid, mtrlid, mtrlname, price, gram_weight, cloth_width, if_inputqty, qty , costamt, if_areaprice, formulatype, sortcode, if_mtrl, if_success, replace_formula, priceunit, shrinkage, name, dannum1_rate, dannum2_rate, dannum3_rate, dannum4_rate, thickness, chastr, xu, useqty, useformula, replace_useformula , gydscrp, mattress_width, mattress_length, spring_qty_width, spring_qty_length,sidecover,if_subspecs";
             var selectStr = @"
 		                        SELECT
 			                        u_mattress_mx_mtrl.mattressmxid,
@@ -1731,6 +1731,7 @@ namespace JLHHJSvr.Helper
 			                        CASE when u_mattress_formula.if_mtrl > 1 THEN '+' ELSE '' END as addmx,
 			                        CASE when u_mattress_formula.if_mtrl > 1 THEN '-' ELSE '' END as delmx,
 			                        u_mtrl_price.name,
+			                        u_mtrl_price.if_subspecs,
 			                        ISNULL(u_mtrltype.dannum1_rate, 0) AS dannum1_rate,
 			                        ISNULL(u_mtrltype.dannum2_rate, 0) AS dannum2_rate,
 			                        ISNULL(u_mtrltype.dannum3_rate, 0) AS dannum3_rate,
@@ -1830,7 +1831,7 @@ namespace JLHHJSvr.Helper
         public List<u_mattress> GetMattressSubspecs(int mattressid,string fields = null)
         {
             var list = new List<u_mattress>();
-            fields = fields ?? "mattressid,mattresscode,mattress_width,mattress_length,mattress_height,mattressname,mattressrelcode,parentid,erp_mtrlid,erp_mtrlcode,erp_configcodetype, erp_mtrlengname, erp_mtrlmode, erp_mtrlname, erp_mtrltype, erp_mtrltypeid, erp_mtrlunit, erp_piccode,xd_flag, flag, js1_flag";
+            fields = fields ?? "mattressid,mattresscode,mattress_width,mattress_length,mattress_height,mattressname,mattressrelcode,parentid,erp_mtrlid,erp_mtrlcode,erp_configcodetype, erp_mtrlengname, erp_mtrlmode, erp_mtrlname, erp_mtrltype, erp_mtrltypeid, erp_mtrlunit, erp_piccode,xd_flag, flag, js1_flag,extras_cost";
             var whereList = new List<string>();
             whereList.Add(@"u_mattress.parentid = @mattressid OR  parentid = (
                 SELECT parentid FROM u_mattress WHERE mattressid = @mattressid and parentid > 0
@@ -2967,6 +2968,7 @@ namespace JLHHJSvr.Helper
             clone.mattress_width = child.mattress_width;
             clone.mattress_length = child.mattress_length;
             clone.mattress_height = child.mattress_height;
+            clone.extras_cost = child.extras_cost;
             clone.version = child.version;
             clone.DynamicFields = child.DynamicFields;
             clone.mxList = parent.mxList?.Select(mx =>
@@ -3015,11 +3017,12 @@ namespace JLHHJSvr.Helper
         {
             //
             if (mattressid <= 0) throw new LJCommonException("ID错误,删除床垫报价失败!");
-            var mattress = GetMattress(mattressid, "mattresscode,flag,js1_flag,xd_flag,parentid");
+            var mattress = GetMattress(mattressid, "mattresscode,flag,js1_flag,xd_flag,parentid,erp_mtrlid");
             if (mattress.parentid > 0 && (mattress.js1_flag == 1 || mattress.flag == 1)) return;
             if (mattress.xd_flag == 1) throw new LJCommonException($"床垫报价[{mattress.mattresscode}]已下单,无法删除!");
             if (mattress.js1_flag == 1) throw new LJCommonException($"床垫报价[{mattress.mattresscode}]已产品审核,无法删除!");
             if (mattress.flag == 1) throw new LJCommonException($"床垫报价[{mattress.mattresscode}]已财务审核,无法删除!");
+            if (mattress.erp_mtrlid > 0) throw new LJCommonException($"床垫报价[{mattress.mattresscode}]已生成L1物料,无法删除!");
 
             // 删除所有明细
             cmd.CommandText = @"DELETE u_mattress_mx_mtrl WHERE mattressid = @mattressid";

+ 94 - 207
JLHWEB/src/stores/modules/keepAlive.ts

@@ -262,9 +262,12 @@ export const useKeepAliveStore = defineStore({
       !isReplace && tabStore.addTabs(tabsParams);
       !isReplace && to.meta.isKeepAlive && this.addKeepAliveName(to);
     },
-    computedKeepAliveNamePro(to, from) {
+    async computedKeepAliveNamePro(to, from) {
       const tabStore = useTabsStore();
+      const tabsMenuList = [...tabStore.tabsMenuList];
+      let isReplace = false;
 
+      // --- 生成 tab 参数 ---
       const tabsParams = {
         icon: to.meta.icon as string,
         title: to.meta.title as string,
@@ -275,252 +278,136 @@ export const useKeepAliveStore = defineStore({
         query: to.query
       };
 
-      // 如果需要锁定单据,添加锁定相关参数
-      if (to.meta.needLock && Number(to.query.id)) {
+      if (to.meta.needLock && Number(to.query?.id)) {
         tabsParams["needLock"] = to.meta.needLock;
         tabsParams["keyword"] = String(to.meta.billtype);
         tabsParams["billid"] = Number(to.query.id);
         tabsParams["billcode"] = String(to.query.code);
       }
 
-      let isReplace = false;
-      const tabsMenuList = [...tabStore.tabsMenuList];
-
-      // 判断是否为同一单据的单据编码和单据类型
-      const getBillCode = route => {
-        return route?.query?.code || "";
-      };
+      // --- 工具函数 ---
+      const getBillCode = route => route?.query?.code || "";
       const getBillType = route => {
         const pathMatch = route?.fullPath?.match(/\/([a-zA-Z]+)\/(detail|edit|copy|index)/);
         return pathMatch ? pathMatch[1] : "";
-      };
+      }; // 改为 meta 管理类型更可靠
+      const isSameBill = (code1, type1, code2, type2) =>
+        !!code1 && !!code2 && code1 === code2 && !!type1 && !!type2 && type1 === type2;
 
       const toBillCode = getBillCode(to);
       const fromBillCode = getBillCode(from);
       const toBillType = getBillType(to);
       const fromBillType = getBillType(from);
 
-      // 判断是否为相同类型的单据(同时比较单据编码和单据类型)
-      const isSameBill = (code1, type1, code2, type2) => {
-        return code1 && code2 && code1 === code2 && type1 && type2 && type1 === type2;
-      };
-
-      console.log("computedKeepAliveNamePro 路由分析:", {
-        to: to.fullPath,
-        from: from?.fullPath,
-        toBillCode,
-        toBillType,
-        fromBillCode,
-        fromBillType,
-        isSameBillType: isSameBill(toBillCode, toBillType, fromBillCode, fromBillType)
-      });
-
-      // 情况1: 列表页跳转到详情页 (/list -> /detail)
-      const isListToDetail =
-        (!from || from.fullPath.includes("/index")) && (to.fullPath.includes("/detail?") || to.fullPath.includes("/detail/"));
-
-      if (isListToDetail && toBillCode) {
-        // 查找是否有相同单据类型和单据编码的编辑页
-        const editTabIndex = tabsMenuList.findIndex(item => {
+      // --- 查找 tab 工具函数 ---
+      const findTabIndex = (tabType: "edit" | "detail" | "copy") => {
+        return tabsMenuList.findIndex(item => {
           const itemBillCode = getBillCode(item);
           const itemBillType = getBillType(item);
-          return (
-            isSameBill(itemBillCode, itemBillType, toBillCode, toBillType) &&
-            (item.path.includes("/edit?") || item.path.includes("/edit/"))
-          );
+          const isTypeMatch =
+            (tabType === "edit" && item.path.includes("/edit")) ||
+            (tabType === "detail" && item.path.includes("/detail")) ||
+            (tabType === "copy" && item.path.includes("/copy"));
+          return isSameBill(itemBillCode, itemBillType, toBillCode, toBillType) && isTypeMatch;
         });
+      };
 
-        if (editTabIndex > -1) {
-          // 保存被替换的编辑页信息
-          const oldEditTab = tabsMenuList[editTabIndex];
-
-          // 替换编辑页为详情页
-          console.log("列表页->详情页: 替换编辑页", oldEditTab.path, "=>", to.fullPath);
-          tabsMenuList[editTabIndex] = tabsParams;
-          tabStore.setTabs(tabsMenuList);
-
-          // 移除编辑页的 keepAlive 缓存(removeKeepAliveName 已包含解锁逻辑)
-          console.log("情况1解锁检查:", {
-            oldEditTab: {
-              path: oldEditTab.path,
-              needLock: oldEditTab.needLock,
-              billid: oldEditTab.billid,
-              keyword: oldEditTab.keyword,
-              billcode: oldEditTab.billcode
-            }
-          });
-          this.removeKeepAliveName(oldEditTab);
+      // --- 替换 tab 并管理 keep-alive ---
+      const replaceTab = (index: number) => {
+        const oldTab = tabsMenuList[index];
+        tabsMenuList[index] = tabsParams;
+        tabStore.setTabs(tabsMenuList);
 
-          isReplace = true;
-          to.meta.isKeepAlive && this.addKeepAliveName(to);
-          to.meta.isKeepAlive && this.updateKeepAliveName(to);
+        if (oldTab?.name) {
+          this.removeKeepAliveName(oldTab); // 移除旧缓存
         }
-      }
-
-      // 情况2: 详情页跳转到编辑页 (/detail -> /edit)
-      const isDetailToEdit =
-        from &&
-        (from.fullPath.includes("/detail?") || from.fullPath.includes("/detail/")) &&
-        (to.fullPath.includes("/edit?") || to.fullPath.includes("/edit/")) &&
-        isSameBill(toBillCode, toBillType, fromBillCode, fromBillType);
 
-      if (isDetailToEdit) {
-        // 查找是否有相同单据类型和单据编码的详情页
-        const detailTabIndex = tabsMenuList.findIndex(item => {
-          const itemBillCode = getBillCode(item);
-          const itemBillType = getBillType(item);
-          const isDetailTab = item.path.includes("/detail?") || item.path.includes("/detail/");
-          console.log("检查tab:", {
-            itemPath: item.path,
-            itemBillCode,
-            itemBillType,
-            toBillCode,
-            toBillType,
-            isDetailTab,
-            match: isSameBill(itemBillCode, itemBillType, toBillCode, toBillType) && isDetailTab
-          });
-          return isSameBill(itemBillCode, itemBillType, toBillCode, toBillType) && isDetailTab;
-        });
-
-        console.log("找到的详情页索引:", detailTabIndex);
-        if (detailTabIndex > -1) {
-          // 替换详情页为编辑页
-          console.log("详情页->编辑页: 替换详情页", tabsMenuList[detailTabIndex].path, "=>", to.fullPath);
-          tabsMenuList[detailTabIndex] = tabsParams;
-          tabStore.setTabs(tabsMenuList);
-          isReplace = true;
-          to.meta.isKeepAlive && this.addKeepAliveName(to);
-          to.meta.isKeepAlive && this.updateKeepAliveName(to);
+        if (to.meta.isKeepAlive) {
+          this.addKeepAliveName(to);
+          this.updateKeepAliveName(to);
         }
-      }
 
-      // 情况3: 编辑页跳转到详情页 (/edit -> /detail),需要解锁单据
-      const isEditToDetailPro =
-        from &&
-        (from.fullPath.includes("/edit?") || from.fullPath.includes("/edit/")) &&
-        (to.fullPath.includes("/detail?") || to.fullPath.includes("/detail/")) &&
-        isSameBill(toBillCode, toBillType, fromBillCode, fromBillType);
-
-      if (isEditToDetailPro) {
-        console.log("编辑页->详情页: 解锁单据", fromBillType, fromBillCode);
-        // 查找是否有相同单据类型和单据编码的编辑页
-        const editTabIndex = tabsMenuList.findIndex(item => {
-          const itemBillCode = getBillCode(item);
-          const itemBillType = getBillType(item);
-          const isEditTab = item.path.includes("/edit?") || item.path.includes("/edit/");
-          console.log("检查tab:", {
-            itemPath: item.path,
-            itemBillCode,
-            itemBillType,
-            fromBillCode,
-            fromBillType,
-            isEditTab,
-            match: isSameBill(itemBillCode, itemBillType, fromBillCode, fromBillType) && isEditTab
-          });
-          return isSameBill(itemBillCode, itemBillType, fromBillCode, fromBillType) && isEditTab;
-        });
+        isReplace = true;
+      };
 
-        console.log("找到的编辑页索引:", editTabIndex);
-        if (editTabIndex > -1) {
-          // 替换编辑页为详情页
-          console.log("编辑页->详情页: 替换编辑页", tabsMenuList[editTabIndex].path, "=>", to.fullPath);
-          tabsMenuList[editTabIndex] = tabsParams;
-          tabStore.setTabs(tabsMenuList);
-
-          // 移除编辑页的 keepAlive 缓存
-          this.removeKeepAliveName(from);
-
-          // 手动解锁单据(因为 from 路由对象可能缺少锁定属性,需要单独处理)
-          if (from.meta?.needLock && from.query?.id) {
-            UnLockBill({
-              keyword: String(from.meta.billtype),
-              billid: Number(from.query.id),
-              billcode: String(from.query.code)
-            }).catch(err => {
-              console.warn("edit->detail 解锁失败:", err);
+      // --- 解锁单据 ---
+      const unlockBill = async route => {
+        if (route?.meta?.needLock && route?.query?.id) {
+          try {
+            await UnLockBill({
+              keyword: String(route.meta.billtype),
+              billid: Number(route.query.id),
+              billcode: String(route.query.code)
             });
+          } catch (err) {
+            console.warn("解锁单据失败:", err);
           }
+        }
+      };
+
+      // --- 逻辑判断 ---
+      const fromName = from?.name || "";
 
-          isReplace = true;
-          to.meta.isKeepAlive && this.addKeepAliveName(to);
-          to.meta.isKeepAlive && this.updateKeepAliveName(to);
+      // 情况1: 列表 -> 详情
+      if ((!from || fromNameIncludes(from, "/index")) && toNameIncludes(to, "/detail") && toBillCode) {
+        const editTabIndex = findTabIndex("edit");
+        if (editTabIndex > -1) {
+          await unlockBill(tabsMenuList[editTabIndex]);
+          replaceTab(editTabIndex);
         }
       }
 
-      // 情况4: 列表页跳转到编辑页 (/list -> /edit),需要替换相同单据的详情页
-      const isListToEdit =
-        (!from || from.fullPath.includes("/index")) && (to.fullPath.includes("/edit?") || to.fullPath.includes("/edit/"));
-      if (isListToEdit && toBillCode) {
-        // 查找是否有相同单据类型和单据编码的详情页
-        const detailTabIndex = tabsMenuList.findIndex(item => {
-          const itemBillCode = getBillCode(item);
-          const itemBillType = getBillType(item);
-          const isDetailTab = item.path.includes("/detail?") || item.path.includes("/detail/");
-          console.log("检查tab:", {
-            itemPath: item.path,
-            itemBillCode,
-            itemBillType,
-            toBillCode,
-            toBillType,
-            isDetailTab,
-            match: isSameBill(itemBillCode, itemBillType, toBillCode, toBillType) && isDetailTab
-          });
-          return isSameBill(itemBillCode, itemBillType, toBillCode, toBillType) && isDetailTab;
-        });
+      // 情况2: 详情 -> 编辑
+      if (
+        fromName &&
+        toNameIncludes(to, "/edit") &&
+        fromNameIncludes(from, "/detail") &&
+        isSameBill(toBillCode, toBillType, fromBillCode, fromBillType)
+      ) {
+        const detailTabIndex = findTabIndex("detail");
+        if (detailTabIndex > -1) replaceTab(detailTabIndex);
+      }
 
-        console.log("找到的详情页索引:", detailTabIndex);
-        if (detailTabIndex > -1) {
-          // 替换详情页为编辑页
-          console.log("列表页->编辑页: 替换详情页", tabsMenuList[detailTabIndex].path, "=>", to.fullPath);
-          tabsMenuList[detailTabIndex] = tabsParams;
-          tabStore.setTabs(tabsMenuList);
-          isReplace = true;
-          to.meta.isKeepAlive && this.addKeepAliveName(to);
-          to.meta.isKeepAlive && this.updateKeepAliveName(to);
+      // 情况3: 编辑 -> 详情
+      if (
+        fromName &&
+        fromNameIncludes(from, "/edit") &&
+        toNameIncludes(to, "/detail") &&
+        isSameBill(toBillCode, toBillType, fromBillCode, fromBillType)
+      ) {
+        const editTabIndex = findTabIndex("edit");
+        if (editTabIndex > -1) {
+          await unlockBill(from); // 保证顺序
+          replaceTab(editTabIndex);
         }
       }
 
-      // 情况5: 复制页跳转到详情页 (/copy -> /detail),复制保存后生成新单据
-      // 需要将复制tab替换为新单据的详情tab
-      const isCopyToDetail =
-        from &&
-        (from.fullPath.includes("/copy?") || from.fullPath.includes("/copy/")) &&
-        (to.fullPath.includes("/detail?") || to.fullPath.includes("/detail/"));
-
-      if (isCopyToDetail) {
-        console.log("复制页->详情页: 替换复制tab为新单据详情tab", {
-          from: from?.fullPath,
-          to: to.fullPath,
-          fromBillCode,
-          toBillCode,
-          note: "虽然单据编码不同,但需要替换当前复制页tab"
-        });
-
-        // 查找复制页tab的索引
-        const copyTabIndex = tabsMenuList.findIndex(item => {
-          const isCopyTab = item.path.includes("/copy?") || item.path.includes("/copy/");
-          // 通过from.fullPath匹配当前正在跳转的复制页
-          return isCopyTab && item.path === from.fullPath;
-        });
+      // 情况4: 列表 -> 编辑
+      if ((!from || fromNameIncludes(from, "/index")) && toNameIncludes(to, "/edit") && toBillCode) {
+        const detailTabIndex = findTabIndex("detail");
+        if (detailTabIndex > -1) replaceTab(detailTabIndex);
+      }
 
-        console.log("找到的复制页索引:", copyTabIndex);
-        if (copyTabIndex > -1) {
-          // 替换复制页为新单据详情页
-          console.log("复制页->详情页: 替换复制页", tabsMenuList[copyTabIndex].path, "=>", to.fullPath);
-          tabsMenuList[copyTabIndex] = tabsParams;
-          tabStore.setTabs(tabsMenuList);
-          isReplace = true;
-          to.meta.isKeepAlive && this.addKeepAliveName(to);
-          to.meta.isKeepAlive && this.updateKeepAliveName(to);
-        } else {
-          console.log("未找到复制页tab,将添加新tab");
-        }
+      // 情况5: 复制 -> 详情
+      if (fromNameIncludes(from, "/copy") && toNameIncludes(to, "/detail") && to.query?.fromCopySave) {
+        const copyTabIndex = tabsMenuList.findIndex(item => item.path === from.fullPath);
+        if (copyTabIndex > -1) replaceTab(copyTabIndex);
       }
 
-      // 如果没有发生替换,则正常添加tab
+      // 默认添加 tab
       if (!isReplace) {
         tabStore.addTabs(tabsParams);
-        to.meta.isKeepAlive && this.addKeepAliveName(to);
+        if (to.meta.isKeepAlive) {
+          this.addKeepAliveName(to);
+        }
+      }
+
+      // --- 辅助函数: 判断 route.name 类型 ---
+      function toNameIncludes(route, type: string) {
+        return route?.fullPath?.toString().toLowerCase().includes(type);
+      }
+      function fromNameIncludes(route, type: string) {
+        return route?.fullPath?.toString().toLowerCase().includes(type);
       }
     }
   }

+ 14 - 2
JLHWEB/src/views/quote/bednetQuote/detail.vue

@@ -467,8 +467,20 @@ const orderDefaultAction: detailAction[] = [
                 emit("aftersave", res, bednet.bednetid);
               } else {
                 if (res.bednet.bednetid) {
-                  tabRemove(route.fullPath);
-                  router.replace(`/bednetQuote/detail?id=${res.bednet.bednetid}`);
+                  // tabRemove(route.fullPath);
+                  // router.replace(`/bednetQuote/detail?id=${res.bednet.bednetid}`);
+                  pageRefresh({
+                    name: "bednetQuoteDetail",
+                    params: {
+                      id: res.bednet.bednetid,
+                      code: res.bednet.bednetcode
+                    },
+                    query: {
+                      id: res.bednet.bednetid,
+                      code: res.bednet.bednetcode,
+                      fromCopySave: orderStatus.value == "copy"
+                    }
+                  });
                 } else {
                   router.replace("/bednetQuote");
                 }

+ 12 - 2
JLHWEB/src/views/quote/mattressQuote/detail.vue

@@ -1896,8 +1896,18 @@ const save = async () => {
           });
           if (res.mattressid) {
             console.log("tabRemove route.fullPath :>> ", route.fullPath);
-            // tabRemove(route.fullPath);
-            router.replace(`/mattressQuote/detail?id=${res.mattressid}&code=${res.mattresscode}`);
+            pageRefresh({
+              name: "mattressQuoteDetail",
+              params: {
+                id: res.mattressid,
+                code: res.mattresscode
+              },
+              query: {
+                id: res.mattressid,
+                code: res.mattresscode,
+                fromCopySave: orderStatus.value == "copy"
+              }
+            });
           } else {
             router.replace("/mattressQuote");
           }

+ 11 - 0
JLHWEB/src/views/quote/mattressQuote/hooks/index.tsx

@@ -5473,6 +5473,17 @@ export const useHooks = (t?: any) => {
       //     </>
       //   );
       // }
+    },
+    {
+      title: "额外费用",
+      field: "extras_cost",
+      datatype: "number",
+      editRender: {
+        name: "$input",
+        props: {
+          type: "number"
+        }
+      }
     }
     // {
     //   title: "弹簧排列个数-宽",