فهرست منبع

1、修复床垫清单复制清单覆盖参考用料量问题
2、修复床网报价没有计算FOB费用问题
3、修复副规格删除后保存依然存在问题
4、修复床垫报价复制报价副规格自动带出唯一码导致无法保存问题
5、修复配置选配项删除会自动清空选配项问题

MY 8 ساعت پیش
والد
کامیت
9afd6a194d

+ 4 - 0
JLHHJSvr/Com/GetMattressSubspecs.cs

@@ -15,6 +15,10 @@ namespace JLHHJSvr.Com
         }
         public string token { get; set; }
         public int mattressid { get; set; }
+        /// <summary>
+        /// 0 - 常规 1 - 复制
+        /// </summary>
+        public int type { get; set; }
     }
 
     public sealed class GetMattressSubspecsResponse : LJResponse

+ 1 - 1
JLHHJSvr/Com/Model/u_configure_code.cs

@@ -6,7 +6,7 @@ using System.Text;
 
 namespace JLHHJSvr.Com.Model
 {
-    [PK(new[] { "typeid", "pzid" })]
+    [PK(new[] { "typeid,pzid" })]
     public sealed class u_configure_code
     {
         /// <summary>

+ 24 - 0
JLHHJSvr/Com/Model/u_mattress.cs

@@ -160,6 +160,25 @@ namespace JLHHJSvr.Com.Model
         /// </summary>
         public int? child_count { get; set; }
 
+        #region 明细关联
+        /// <summary>
+        /// 明细内容
+        /// </summary>
+        public List<u_mattress_mx_mtrl> mxList { get; set; }
+        /// <summary>
+        /// 特殊工艺列表
+        /// </summary>
+        public List<u_mattress_mx_extra> extraList { get; set; }
+        /// <summary>
+        /// 其他额外费用列表
+        /// </summary>
+        public List<u_mattress_mx_extra> extraCostList { get; set; }
+        /// <summary>
+        /// 副规格
+        /// </summary>
+        public List<u_mattress> subspecsList { get; set; }
+        #endregion
+
         #region 其他
         public int? pricelistid { get; set; }
         public int? copy_id { get; set; }
@@ -171,6 +190,7 @@ namespace JLHHJSvr.Com.Model
         /// 主副规格记录:弹簧排列个数-长
         /// </summary>
         public int? spring_qty_length { get; set; }
+        public decimal? bednet_fork_qty { get; set; }
         public int? mtrltypeid { get; set; }
         public string bj_mxdscrp { get; set; }
         public decimal? dijia_cost { get; set; }
@@ -217,6 +237,10 @@ namespace JLHHJSvr.Com.Model
         /// 床网是否使用弹叉
         /// </summary>
         public byte? bednet_iffork { get; set; }
+        /// <summary>
+        /// 动态信息记录
+        /// </summary>
+        public Dictionary<string,object> DynamicFields { get; set; }
         #endregion
     }
 }

+ 4 - 0
JLHHJSvr/Com/SaveMattress.cs

@@ -31,6 +31,10 @@ namespace JLHHJSvr.Com
         /// </summary>
         public List<JObject> subspecs { get; set; }
         /// <summary>
+        /// 副规格列表
+        /// </summary>
+        public List<u_mattress> subspecsList { get; set; }
+        /// <summary>
         /// 特殊工艺列表
         /// </summary>
         public List<u_mattress_mx_extra> extraProcesses { get; set; }

+ 6 - 1
JLHHJSvr/Excutor/GetMattressSubspecsExcutor.cs

@@ -43,9 +43,14 @@ namespace JLHHJSvr.Excutor
 
                     var subspecsList = new List<u_mattress>();
                     var result = new List<u_mattress_mx_subspecs>();
+                    var fields = "mattress_width,mattress_length,mattress_height,mattressname,mattressrelcode";
+                    if (request.type == 0)
+                    {
+                        fields += ",mattressid,mattresscode,parentid,erp_mtrlid,erp_mtrlcode,erp_configcodetype, erp_mtrlengname, erp_mtrlmode, erp_mtrlname, erp_mtrltype, erp_mtrltypeid, erp_mtrlunit, erp_piccode";
+                    }
 
                     //获取副规格列表
-                    subspecsList = helper.GetMattressSubspecs(request.mattressid);
+                    subspecsList = helper.GetMattressSubspecs(request.mattressid, fields);
 
                     if (subspecsList.Count > 0)
                     {

+ 159 - 9
JLHHJSvr/Excutor/SaveMattressExcutor.cs

@@ -18,7 +18,7 @@ namespace JLHHJSvr.Excutor
 {
     internal sealed class SaveMattressExcutor : ExcutorBase<SaveMattressRequest, SaveMattressResponse>
     {
-        protected override void ExcuteInternal(SaveMattressRequest request, object state, SaveMattressResponse rslt)
+        /*protected override void ExcuteInternal(SaveMattressRequest request, object state, SaveMattressResponse rslt)
         {
             var tokendata = BllHelper.GetToken(request.token);
             if (tokendata == null)
@@ -117,7 +117,7 @@ namespace JLHHJSvr.Excutor
 
                     var helper = HelperBase.GetHelper<MattressHelper>(cmd, new HelperBase.Context() { tokendata = tokendata });
 
-                    var helperBednet = HelperBase.GetHelper<BedNetHelper>(cmd, new HelperBase.Context() { tokendata = tokendata });
+                    var bednetHelper = HelperBase.GetHelper<BedNetHelper>(cmd, new HelperBase.Context() { tokendata = tokendata });
 
                     try
                     {
@@ -243,9 +243,9 @@ namespace JLHHJSvr.Excutor
                                         {
                                             bednetIndex++;
                                             var oBednet = new u_bednet();
-                                            var _bednet = helperBednet.GetBedNet(item.mtrlid.Value);
-                                            var _bednetMx = helperBednet.GetBedNetMxList(item.mtrlid.Value);
-                                            var _bednetSpring = helperBednet.GetBedNetSpringList(item.mtrlid.Value);
+                                            var _bednet = bednetHelper.GetBedNet(item.mtrlid.Value);
+                                            var _bednetMx = bednetHelper.GetBedNetMxList(item.mtrlid.Value);
+                                            var _bednetSpring = bednetHelper.GetBedNetSpringList(item.mtrlid.Value);
 
                                             //_bednet.mattress_width = Convert.ToInt32(submx["mattress_width"]) - (request.mattress.mattress_width - _bednet.mattress_width);
                                             //_bednet.mattress_length = Convert.ToInt32(submx["mattress_length"]) - (request.mattress.mattress_length - _bednet.mattress_length);
@@ -379,9 +379,9 @@ namespace JLHHJSvr.Excutor
                                                 oBednet.bednetid = 0;
 
                                                 // 袋装网,多个分区时,重新分配弹簧
-                                                helperBednet.GetSpringListQty(oBednet, _bednetMx[0], ref _bednetSpring);
+                                                bednetHelper.GetSpringListQty(oBednet, _bednetMx[0], ref _bednetSpring);
 
-                                                helperBednet.SaveBedNet(oBednet, _bednetMx, _bednetSpring);
+                                                bednetHelper.SaveBedNet(oBednet, _bednetMx, _bednetSpring);
                                             //}
 
                                             var _mtrlname = oBednet.typename +
@@ -454,7 +454,7 @@ namespace JLHHJSvr.Excutor
 
                 }
             }
-        }
+        }*/
 
         public List<string> toSaveMattress(SqlCommand cmd, u_mattress mattress, List<u_mattress_mx_mtrl> mattressMx, List<u_mattress_mx_extra> extraProcesses, List<u_mattress_mx_extra> extraCosts, TokenData tokendata,bool iferpmtrl)
         {
@@ -479,7 +479,7 @@ namespace JLHHJSvr.Excutor
 
                 if (mattress.copy_id != null && mattress.copy_id > 0)
                 {
-                    helper.CopyMattressInterface(mattress.mattressid,mattress.copy_id.Value);
+                    helper.CopyMattressInterface(mattress.copy_id.Value,mattress.mattressid);
                 }
 
             }
@@ -490,5 +490,155 @@ namespace JLHHJSvr.Excutor
 
             return message;
         }
+
+        protected override void ExcuteInternal(SaveMattressRequest request, object state, SaveMattressResponse rslt)
+        {
+            var tokendata = BllHelper.GetToken(request.token);
+            if (tokendata == null)
+            {
+                rslt.ErrMsg = "会话已经中断,请重新登录";
+                return;
+            }
+            if (request.mattress == null)
+            {
+                rslt.ErrMsg = "缺少主表信息";
+                return;
+            }
+
+            using (var con = new SqlConnection(GlobalVar.ConnectionString))
+            using (var cmd = con.CreateCommand())
+            {
+                con.Open();
+
+                var mattressHelper = HelperBase.GetHelper<MattressHelper>(cmd, new HelperBase.Context() { tokendata = tokendata });
+                var bednetHelper = HelperBase.GetHelper<BedNetHelper>(cmd, new HelperBase.Context() { tokendata = tokendata });
+
+                var subspecsList = new List<u_mattress>();
+                // 状态判断
+                if (request.mattress.mattressid > 0)
+                {
+                    var mattressInfo = new u_mattress() { mattressid = request.mattress.mattressid };
+                    if (DbSqlHelper.SelectOne(cmd, mattressInfo, "flag, xd_flag, yw_flag, mattresscode, parentid") == 1)
+                    {
+                        if (mattressInfo.xd_flag == 1)
+                        {
+                            rslt.ErrMsg = "床垫报价单【" + mattressInfo.mattresscode + "】已业务下单,不能修改";
+                            return;
+                        }
+                    }
+
+                    // 副规格
+                    if (mattressInfo.parentid != null && mattressInfo.parentid > 0)
+                    {
+                        subspecsList = mattressHelper.GetMattressSubspecs(mattressInfo.parentid.Value, "flag, xd_flag, yw_flag, mattresscode, parentid,mattressid,mattress_width,mattress_length,mattress_height,mattressname,mattressrelcode");
+                        foreach(var submx in subspecsList)
+                        {
+                            if (submx.xd_flag == 1)
+                            {
+                                rslt.ErrMsg = "副规格-床垫报价单【" + submx.mattresscode + "】已业务下单,不能修改";
+                                return;
+                            }
+                        }
+                    }
+                }
+
+                var _mattress = ObjectHelper.DeepCopy(request.mattress);
+                _mattress.mxList = request.mattressMx;
+                _mattress.extraList = request.extraProcesses;
+                _mattress.extraCostList = request.extraCosts;
+                _mattress.subspecsList = request.subspecsList;
+
+                #region TODO:需要优化
+                List<string> message = new List<string>();
+                mattressHelper.MattressCalculateCost(_mattress, _mattress.mxList, _mattress.extraList, _mattress.extraCostList);
+                var mxmessageList = _mattress.mxList.Where(item => !string.IsNullOrEmpty(item.message)).ToList();
+                if (mxmessageList.Any())
+                {
+                    foreach (var mx in mxmessageList)
+                    {
+                        message.Add(mx.message);
+                    }
+                }
+                rslt.mxmessage = message;
+                #endregion
+
+                #region 复制报价初始化
+                if(_mattress.copy_id != null && _mattress.copy_id > 0)
+                {
+                    _mattress.mattressid = 0;
+                    _mattress.mattresscode = string.Empty;
+                    _mattress.yw_flag = 0;
+                    _mattress.yw_auditingrep = "";
+                    _mattress.yw_auditingdate = null;
+                    _mattress.js1_flag = 0;
+                    _mattress.js1_auditingrep = "";
+                    _mattress.js1_auditingdate = null;
+                    _mattress.js2_flag = 0;
+                    _mattress.js2_auditingrep = "";
+                    _mattress.js2_auditingdate = null;
+                    _mattress.xd_flag = 0;
+                    _mattress.xd_auditingrep = "";
+                    _mattress.xd_auditingdate = null;
+                    _mattress.flag = 0;
+                    _mattress.auditingrep = "";
+                    _mattress.auditingdate = null;
+                    _mattress.qr_auditingrep = "";
+                    _mattress.qr_auditingdate = null;
+                    _mattress.erp_mtrlid = 0;
+                    _mattress.erp_mtrlcode = "";
+                    _mattress.erp_piccode = "";
+                    _mattress.erp_mtrlname = "";
+
+                    foreach (var mx in _mattress.mxList)
+                    {
+                        mx.mattressid = 0;
+                        mx.mattressmxid = 0;
+                    }
+
+                    foreach(var mx in _mattress.extraList)
+                    {
+                        mx.mattressid = 0;
+                        mx.mattressmxid = 0;
+                    }
+
+                    foreach (var mx in _mattress.extraCostList)
+                    {
+                        mx.mattressid = 0;
+                        mx.mattressmxid = 0;
+                    }
+
+                    foreach(var mx in _mattress.subspecsList)
+                    {
+                        mx.mattressid = 0;
+                        mx.mattresscode = string.Empty;
+                    }
+                }
+                #endregion
+
+                using (cmd.Transaction = con.BeginTransaction())
+                {
+                    try
+                    {
+                        mattressHelper.SaveMattressPro(_mattress, true);
+
+                        rslt.mattressid = _mattress.mattressid;
+                        rslt.mattresscode = _mattress.mattresscode;
+
+                        if (_mattress.copy_id != null && _mattress.copy_id > 0)
+                        {
+                            mattressHelper.CopyMattressInterface(_mattress.copy_id.Value, _mattress.mattressid);
+                        }
+
+                        cmd.Transaction.Commit();
+                    }
+                    catch (Exception e)
+                    {
+                        rslt.ErrMsg = e.ToString();
+                        Trace.Write(e);
+                        cmd.Transaction?.Rollback();
+                    }
+                }
+            }
+        }
     }
 }

+ 2 - 5
JLHHJSvr/Helper/BedNetHelper.cs

@@ -832,9 +832,6 @@ namespace JLHHJSvr.Helper
                 bednet.sponge_drilling_hr_cost.Value
             }.Sum();
             AddKeyValue("总人力费用", bednet.total_hr_cost);
-            //
-            AddKeyValue("额外费用", 0);
-            AddKeyValue("FOB", 0);
 
             //1.总成本=总材料成本+总人力费用+ 额外费用
             //bednet.total_cost = bednet.total_mtrl_cost + bednet.total_hr_cost + bednet.total_fees_cost;
@@ -1250,7 +1247,8 @@ namespace JLHHJSvr.Helper
             AddKeyValue("部门利润率", bednet.dept_profitrate);
             AddKeyValue("佣金点数", bednet.commission);
             AddKeyValue("额外点数", bednet.other_rate);
-            AddKeyValue("额外费用", bednet.extras_cost);
+            AddKeyValue("额外费用", bednet.extras_cost); 
+            AddKeyValue("FOB", bednet.fob);
             AddKeyValue("汇率", bednet.moneyrate);
             AddKeyValue("税率", bednet.taxrate);
             AddKeyValue("卷包", bednet.if_jb);
@@ -2084,7 +2082,6 @@ namespace JLHHJSvr.Helper
         /// <param name="areaid"></param>
         public void GetSpringListQty(u_bednet bednet, u_bednetmx bednetMx, ref List<u_bednetmx_spring> springList)
         {
-
             if (bednetMx.if_part == 1 && springList.Count > 0)
             {
 

+ 360 - 39
JLHHJSvr/Helper/MattressHelper.cs

@@ -6,7 +6,10 @@ using JLHHJSvr.LJException;
 using JLHHJSvr.LJFramework.Tools;
 using JLHHJSvr.Tools;
 using LJLib.DAL.SQL;
+using NPOI.POIFS.Properties;
+using NPOI.SS.Formula.Functions;
 using System;
+using System.Collections;
 using System.Collections.Generic;
 using System.Data.SqlClient;
 using System.Linq;
@@ -118,8 +121,10 @@ namespace JLHHJSvr.Helper
 
                     string expression = ConvertToEnglishSymbols(mx.formula), use_expression = ConvertToEnglishSymbols(mx.useformula);
 
+                    #region 替换大侧,小侧,V侧高度
                     expression = InitMxSideReplaceMents(mattress, mx, diancengList, mattersstype, expression);
                     use_expression = InitMxSideReplaceMents(mattress, mx, diancengList, mattersstype,use_expression);
+                    #endregion
 
                     #region 替换布料幅宽
                     //大侧
@@ -1732,7 +1737,7 @@ namespace JLHHJSvr.Helper
             var fieldsHs = "bednetid_mattressid, typeid, cmpdate, cmpemp, nottax_dept_cost, dept_cost, foreign_cost, dannum_cost1, dannum_cost2, dannum_cost3, dannum_cost4,dijia_cost1,dijia_cost2,dijia_cost3,dijia_cost4,fob,cabinet_type,taxrate,commission";
             DbSqlHelper.Insert(cmd, "u_his_price", null, hisprice, fieldsHs);
         }
-        public u_mattress GetMattress(int mattressid)
+        public u_mattress GetMattress(int mattressid,string fields = null)
         {
             if(mattressid <= 0)
             {
@@ -1740,16 +1745,35 @@ namespace JLHHJSvr.Helper
             }
 
             var mattress = new u_mattress() { mattressid = mattressid };
-            var fields = @"mattressid,mattressname,deptid,mattresstypeid,mattresscode,mattress_width,mattress_length,mattress_height,packtype,packqty,woodpallettype,old_mtrlname,
+            fields = fields ?? @"mattressid,mattressname,deptid,mattresstypeid,mattresscode,mattress_width,mattress_length,mattress_height,packtype,packqty,woodpallettype,old_mtrlname,
                         total_hr_cost,total_material_cost,fees_dscrp,total_fees_cost,taxrate,commissionrate,commission,fob,profitrate,profitrate_point,butao_point,chaizhuang_point,
                         haimian_point,dannum_rate,hrcost,biandaicost,zhizao_amt,guanli_rate,discount,extras_cost,dept_profitrate,dept_profitrate_rangli,moneyrate,mattressrelcode,
                         flag,auditingrep,auditingdate,createtime,createby,total_cost,nottax_factory_cost,nottax_dept_cost,taxes,dept_cost,foreign_cost,foreign_cost_bz,
-                        nottax_factory_cost/(dept_profitratedept_profitrate_rangli/100)asdijia_cost,xd_flag,xd_auditingrep,xd_auditingdate,qr_flag,qr_auditingrep,
+                        nottax_factory_cost/(dept_profitratedept_profitrate_rangli/100) as dijia_cost,xd_flag,xd_auditingrep,xd_auditingdate,qr_flag,qr_auditingrep,
                         qr_auditingdate,js1_flag,erp_mtrlcode,erp_cb_updatetime,if_bcp_type,if_zhedie_type,if_w_butao,biandai_qty,other_rate,if_moneyrate,parentid,
                         if_m_chai,if_z_chai,if_d_chai,if_n_butao,if_m_wbutao_way,s_cover_qty,z_cover_qty,x_cover_qty,s_m_cover_qty,z_m_cover_qty,x_m_cover_qty,cabinet_type,area,diameter,cubage,erp_mtrlcode,erp_mtrlid,dannum_type";
             DbSqlHelper.SelectOne(cmd, mattress, fields);
             return mattress;
         }
+        public List<u_mattress> GetMattressList (int mattressid, string fields)
+        {
+            if (mattressid <= 0)
+            {
+                throw new LJCommonException("查找床垫报价失败,ID错误!");
+            }
+
+            var mattressList = new List<u_mattress>();
+            fields = fields ?? @"mattressid,mattressname,deptid,mattresstypeid,mattresscode,mattress_width,mattress_length,mattress_height,packtype,packqty,woodpallettype,old_mtrlname,
+                        total_hr_cost,total_material_cost,fees_dscrp,total_fees_cost,taxrate,commissionrate,commission,fob,profitrate,profitrate_point,butao_point,chaizhuang_point,
+                        haimian_point,dannum_rate,hrcost,biandaicost,zhizao_amt,guanli_rate,discount,extras_cost,dept_profitrate,dept_profitrate_rangli,moneyrate,mattressrelcode,
+                        flag,auditingrep,auditingdate,createtime,createby,total_cost,nottax_factory_cost,nottax_dept_cost,taxes,dept_cost,foreign_cost,foreign_cost_bz,
+                        nottax_factory_cost/(dept_profitratedept_profitrate_rangli/100) as dijia_cost,xd_flag,xd_auditingrep,xd_auditingdate,qr_flag,qr_auditingrep,
+                        qr_auditingdate,js1_flag,erp_mtrlcode,erp_cb_updatetime,if_bcp_type,if_zhedie_type,if_w_butao,biandai_qty,other_rate,if_moneyrate,parentid,
+                        if_m_chai,if_z_chai,if_d_chai,if_n_butao,if_m_wbutao_way,s_cover_qty,z_cover_qty,x_cover_qty,s_m_cover_qty,z_m_cover_qty,x_m_cover_qty,cabinet_type,area,diameter,cubage,erp_mtrlcode,erp_mtrlid,dannum_type";
+            DbSqlHelper.Select(cmd, "u_mattress", "mattressid = @mattressid", new Dictionary<string, object>() { { "@mattressid", mattressid } }, "createtime", 0, 0, mattressList, null, fields);
+
+            return mattressList;
+        }
         public List<u_mattress_mx_mtrl> GetMattressMxMtrl(int mattressid,List<string> extraWhere = null)
         {
             var mxList = new List<u_mattress_mx_mtrl>();
@@ -1875,38 +1899,15 @@ namespace JLHHJSvr.Helper
         /// </summary>
         /// <param name="mattressid"></param>
         /// <returns></returns>
-        public List<u_mattress> GetMattressSubspecs(int mattressid)
+        public List<u_mattress> GetMattressSubspecs(int mattressid,string fields = null)
         {
             var list = new List<u_mattress>();
-            var outputFields = @"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";
-            var selectStr = @"SELECT 
-		                            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
-                                FROM 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";
             var whereList = new List<string>();
             whereList.Add(@"u_mattress.parentid = @mattressid OR  parentid = (
                 SELECT parentid FROM u_mattress WHERE mattressid = @mattressid and parentid > 0
             )");
-
-            DbSqlHelper.SelectJoin(cmd, selectStr, ListEx.GetWhereStr(whereList), new Dictionary<string, object>() { { "@mattressid", mattressid } }, "mattressid", outputFields, 0, 0, list);
-
+            DbSqlHelper.Select(cmd, "u_mattress", ListEx.GetWhereStr(whereList), new Dictionary<string, object>() { { "@mattressid", mattressid } }, "mattressid", 0, 0, list, null, fields);
             return list;
         }
         /// <summary>
@@ -1980,7 +1981,7 @@ namespace JLHHJSvr.Helper
             return list;
         }
         /// <summary>
-        /// 保存床垫复制清单
+        /// 床垫报价复制清单
         /// </summary>
         /// <param name="mattressid"></param>
         public void CopyMattressInterface(int cpoyid,int mattressid)
@@ -2014,8 +2015,8 @@ namespace JLHHJSvr.Helper
                                 FROM u_mattress_interface
                                 WHERE mattressid = @copy_id";
             cmd.Parameters.Clear();
-            cmd.Parameters.AddWithValue("@mattressid", cpoyid);
-            cmd.Parameters.AddWithValue("@copy_id", mattressid);
+            cmd.Parameters.AddWithValue("@mattressid", mattressid);
+            cmd.Parameters.AddWithValue("@copy_id", cpoyid);
             cmd.ExecuteNonQuery();
 
             cmd.CommandText = @"INSERT INTO u_mattress_interface_qd (
@@ -2051,8 +2052,8 @@ namespace JLHHJSvr.Helper
                                 FROM u_mattress_interface_qd
                                 WHERE mattressid = @copy_id";
             cmd.Parameters.Clear();
-            cmd.Parameters.AddWithValue("@mattressid", cpoyid);
-            cmd.Parameters.AddWithValue("@copy_id", mattressid);
+            cmd.Parameters.AddWithValue("@mattressid", mattressid);
+            cmd.Parameters.AddWithValue("@copy_id", cpoyid);
             cmd.ExecuteNonQuery();
         }
 
@@ -2161,7 +2162,7 @@ namespace JLHHJSvr.Helper
                 }
 
                 SaveMattress(mattress_copy, mattressMxMtrlList, mattressMxExtra1List, mattressMxExtra2List, true, mattress.createby);
-                CopyMattressInterface(mattress_copy.mattressid, mattress.mattressid);
+                CopyMattressInterface(mattress.mattressid,mattress_copy.mattressid);
 
                 var mattressSubspecs = GetMattressSubspecs(mattress.mattressid);
                 foreach (var sub in mattressSubspecs)
@@ -2229,7 +2230,7 @@ namespace JLHHJSvr.Helper
                     submattress_copy.xd_flag = 0;
 
                     SaveMattress(submattress_copy, mattressMxList, mattressMxExtra1, mattressMxExtra2, true, mattress.createby);
-                    CopyMattressInterface(submattress_copy.mattressid, sub.mattressid);
+                    CopyMattressInterface(sub.mattressid,submattress_copy.mattressid);
                 }
 
                 foreach (var mx in mxlist)
@@ -2278,7 +2279,6 @@ namespace JLHHJSvr.Helper
 
 
             AutoUpdateBcp(mattressid);
-
         }
 
         public void MattressCalculateCost(u_mattress mattress, List<u_mattress_mx_mtrl> mattressMx, List<u_mattress_mx_extra> extraProcesses, List<u_mattress_mx_extra> extraCosts)
@@ -2308,7 +2308,6 @@ namespace JLHHJSvr.Helper
 
                             if (i == 1)
                             {
-
                                 _mattress.dijia_cost1 = nottax_value;
                             }
                             else if (i == 2)
@@ -2810,6 +2809,328 @@ namespace JLHHJSvr.Helper
         }
         #endregion
 
+
+        #region 方法优化
+        /// <summary>
+        /// 床垫报价保存
+        /// </summary>
+        /// <param name="mattress"></param>
+        /// <param name="ifErp"></param>
+        public void SaveMattressPro(u_mattress mattress,bool ifErp = false)
+        {
+            var fields = @"mattressname, deptid, mattresscode, mattresstypeid, mattress_width, mattress_length, mattress_height, packtype, packqty, woodpallettype, total_hr_cost,
+                            total_material_cost, fees_dscrp, total_fees_cost, total_cost, taxrate, taxes, commissionrate, commission, fob,  profitrate, dept_profitrate, 
+                            moneyrate, nottax_factory_cost, nottax_dept_cost, foreign_cost, diameter, area, cabinet_type, hrcost, biandaicost,
+                            mattressrelcode, other_rate, flag, dept_profitrate_rangli, profitrate_point, if_moneyrate, discount, if_m_chai,  if_z_chai, if_d_chai, if_n_butao, 
+                            if_w_butao, if_m_wbutao_way, s_cover_qty, z_cover_qty, x_cover_qty, biandai_qty, s_m_cover_qty, z_m_cover_qty, x_m_cover_qty, chaizhuang_point, 
+                            haimian_point, if_zhedie_type, qr_auditingrep, qr_auditingdate, if_bcp_type, zhizao_amt, foreign_cost_bz,  cubage, extras_cost, extras_cost_dscrp, 
+                            parentid, flag, xd_flag, dannum_type,dannum_cost1,dannum_cost2, dannum_cost3, dannum_cost4, dijia_cost1,dijia_cost2,dijia_cost3,dijia_cost4";
+            var fieldsMx = "mattressmxid,mattressid,formulaid,formula,replace_formula,if_success,priceunit,shrinkage,mtrlid,price,gram_weight,cloth_width,if_inputqty,qty ,costamt,if_areaprice,thickness,chastr,xu,useqty,useformula,replace_useformula,gydscrp,mattress_width,mattress_length";
+            var fieldsExtra = "mattressmxid,mattressid, extraid, extramxid, extraname, price, qty, dscrp, mtrlid";
+
+            mattress.qr_auditingdate = context.opdate;
+            mattress.qr_auditingrep = context.tokendata.username;
+
+            if (ifErp)
+            {
+                fields += ",erp_mtrlcode,erp_mtrlid,erp_configcodetype, erp_mtrlengname, erp_mtrlmode, erp_mtrlname, erp_mtrltype, erp_mtrltypeid, erp_mtrlunit, erp_piccode";
+            }
+
+            if (mattress.mattressid <= 0)
+            {
+                // 新建
+                AutoInit.AutoInitS(mattress);
+                // 
+                mattress.createtime = context.opdate;
+                if (mattress.parentid == null || mattress.parentid == 0) mattress.createby = context.tokendata.username;
+
+                mattress.mattressid = BllHelper.GetID(cmd, "u_mattress");
+                fields += ",mattressid, createtime, createby";
+
+                if (string.IsNullOrEmpty(mattress.mattresscode))
+                {
+                    var mattresstype = new u_mattress_type() { mattresstypeid = mattress.mattresstypeid };
+                    DbSqlHelper.SelectOne(cmd, mattresstype, "typecode");
+
+                    mattress.mattresscode = $"{mattresstype.typecode}-{context.opdate.ToString("yyyyMMdd")}{(mattress.mattressid % 10000).ToString("D4")}";
+                }
+
+                DbSqlHelper.Insert(cmd, "u_mattress", null, mattress, fields);
+            }
+            else
+            {
+                // 修改
+                AutoInit.AutoInitS(mattress);
+                //
+                DbSqlHelper.Update(cmd, "u_mattress", null, mattress, "mattressid", fields);
+                DeleteMattress(mattress.mattressid);
+            }
+
+            // 插入明细内容
+            if (mattress.mxList != null && mattress.mxList.Count > 0)
+            {
+                foreach (var item in mattress.mxList)
+                {
+                    AutoInit.AutoInitS(cmd, item);
+
+                    item.mattressid = mattress.mattressid;
+                    if (item.mattressmxid == null || item.mattressmxid <= 0)
+                    {
+                        item.mattressmxid = BllHelper.GetID(cmd, "u_mattress_mx_mtrl");
+                    }
+
+                    DbSqlHelper.Insert(cmd, "u_mattress_mx_mtrl", null, item, fieldsMx);
+                }
+            }
+
+            // 插入特殊工艺
+            if (mattress.extraList != null && mattress.extraList.Count > 0)
+            {
+                foreach (var item in mattress.extraList)
+                {
+                    AutoInit.AutoInitS(cmd, item);
+
+                    item.mattressid = mattress.mattressid;
+                    item.mattressmxid = BllHelper.GetID(cmd, "u_mattress_mx_extra");
+
+                    DbSqlHelper.Insert(cmd, "u_mattress_mx_extra", null, item, fieldsExtra);
+                }
+            }
+
+            // 特殊费用
+            if (mattress.extraCostList != null && mattress.extraCostList.Count > 0)
+            {
+                foreach (var item in mattress.extraCostList)
+                {
+                    AutoInit.AutoInitS(cmd, item);
+
+                    item.mattressid = mattress.mattressid;
+                    item.mattressmxid = BllHelper.GetID(cmd, "u_mattress_mx_extra");
+
+                    DbSqlHelper.Insert(cmd, "u_mattress_mx_extra", null, item, fieldsExtra);
+                }
+            }
+
+            // 更新计价历史
+            var hisprice = new u_his_price
+            {
+                bednetid_mattressid = mattress.mattressid,
+                typeid = 1,
+                cmpdate = context.opdate,
+                cmpemp = context.tokendata.username,
+                nottax_dept_cost = mattress.nottax_dept_cost,
+                dept_cost = mattress.dept_cost,
+                foreign_cost = mattress.foreign_cost,
+                dannum_cost1 = mattress.dannum_cost1,
+                dannum_cost2 = mattress.dannum_cost2,
+                dannum_cost3 = mattress.dannum_cost3,
+                dannum_cost4 = mattress.dannum_cost4,
+                dijia_cost1 = mattress.dijia_cost1,
+                dijia_cost2 = mattress.dijia_cost2,
+                dijia_cost3 = mattress.dijia_cost3,
+                dijia_cost4 = mattress.dijia_cost4,
+                fob = mattress.fob,
+                cabinet_type = mattress.cabinet_type,
+                taxrate = mattress.taxrate,
+                commission = mattress.commission
+            };
+            var fieldsHs = "bednetid_mattressid, typeid, cmpdate, cmpemp, nottax_dept_cost, dept_cost, foreign_cost, dannum_cost1, dannum_cost2, dannum_cost3, dannum_cost4,dijia_cost1,dijia_cost2,dijia_cost3,dijia_cost4,fob,cabinet_type,taxrate,commission";
+            DbSqlHelper.Insert(cmd, "u_his_price", null, hisprice, fieldsHs);
+
+            /**
+             * 处理子规格
+             */
+            ProcessSubSpecs(mattress, ifErp);
+        }
+        /// <summary>
+        /// 初始化子规格
+        /// </summary>
+        /// <param name="parent">主规格</param>
+        /// <param name="subspecsList">副规格</param>
+        public void InitMattressSubSpecs(u_mattress parent, u_mattress child)
+        {
+            var bedNetHelper = GetHelper<BedNetHelper>(cmd, context);
+            // 处理副规格的明细内容
+            foreach (var childMx in child.mxList)
+            {
+                var bednetIndex = 0; // 床网索引
+                var ifSubspecsIndex = 0; // 垫层主副规格物料索引
+                                         // 副规格床网自动匹配/新增逻辑
+                if (childMx.formulatype == 99 && childMx.mtrlid > 0)
+                {
+                    bednetIndex++;
+                    var oBednet = new u_bednet();
+                    var _bednet = bedNetHelper.GetBedNet(childMx.mtrlid.Value);
+                    var _bednetMx = bedNetHelper.GetBedNetMxList(childMx.mtrlid.Value);
+                    var _bednetSpring = bedNetHelper.GetBedNetSpringList(childMx.mtrlid.Value);
+
+                    // 20250714 副规格的床网,不匹配查找,直接新建
+                    oBednet = _bednet;
+                    oBednet.bednetid = 0;
+
+                    oBednet.mattress_width = child.mattress_width;
+                    oBednet.mattress_length = child.mattress_length;
+                    if (child.DynamicFields != null && child.DynamicFields.Count > 0)
+                    {
+                        child.DynamicFields.TryGetValue($"spring_qty_width_{bednetIndex}", out var _spring_qty_width);
+                        child.DynamicFields.TryGetValue($"spring_qty_length_{bednetIndex}", out var _spring_qty_length);
+
+                        _bednetMx[0].spring_qty_width = Convert.ToInt32(_spring_qty_width);
+                        _bednetMx[0].spring_qty_length = Convert.ToInt32(_spring_qty_length);
+
+                        if (!child.DynamicFields.TryGetValue($"bednet_fork_qty_{bednetIndex}", out var _bednet_fork_qty))
+                        {
+                            _bednet_fork_qty = _bednet.fork_qty;
+                        }
+
+                        oBednet.fork_qty = Convert.ToDecimal(_bednet_fork_qty);
+                    }
+
+                    // 袋装网,多个分区时,重新分配弹簧
+                    bedNetHelper.GetSpringListQty(oBednet, _bednetMx[0], ref _bednetSpring);
+                    bedNetHelper.SaveBedNet(oBednet, _bednetMx, _bednetSpring);
+
+                    childMx.mtrlid = oBednet.bednetid;
+                    childMx.mtrlname = $"{oBednet.typename} {oBednet.bednetcode} {oBednet.mattress_width}*{oBednet.mattress_length}*{oBednet.mattress_height}";
+                    childMx.price = oBednet.nottax_factory_cost;
+                    childMx.qty = 1;
+                }
+
+                // 垫层改动逻辑
+                if (childMx.formulatype == 1 && childMx.mtrlid > 0)
+                {
+                    // 规格长/宽,按比例缩放
+                    if (childMx.mattress_width > 0)
+                    {
+                        childMx.mattress_width = (int)Math.Floor((decimal)childMx.mattress_width * (Convert.ToDecimal(child.mattress_width) / (decimal)parent.mattress_width));
+                    }
+                    if (childMx.mattress_length > 0)
+                    {
+                        childMx.mattress_length = (int)Math.Floor((decimal)childMx.mattress_length * (Convert.ToDecimal(child.mattress_length) / (decimal)parent.mattress_length));
+                    }
+
+                    // 副规格-垫层物料替换
+                    if (childMx.if_subspecs == 1 && child.DynamicFields.TryGetValue($"cushions_subspecs_{ifSubspecsIndex}", out var cushions_subspecs))
+                    {
+                        ifSubspecsIndex++;
+                        childMx.mtrlid = Convert.ToInt32(cushions_subspecs);
+                    }
+                }
+
+                // 内布套 / 顶部裥棉逻辑
+                if ((childMx.formulatype == 101 || childMx.formulatype == 102 || childMx.formulatype == 103) && childMx.mtrlid > 0 && (childMx.mattress_width > 0 || childMx.mattress_length > 0))
+                {
+                    childMx.mattress_width += child.mattress_width - parent.mattress_width;
+                    childMx.mattress_length += child.mattress_length - parent.mattress_length;
+                }
+            }
+        }
+        /// <summary>
+        /// 子规格保存
+        /// </summary>
+        /// <param name="mattress"></param>
+        /// <param name="ifErp"></param>
+        private void ProcessSubSpecs(u_mattress mattress, bool ifErp)
+        {
+            if (mattress.subspecsList == null) return;
+
+            var existing = GetMattressSubspecs(mattress.mattressid, "mattressid") ?? new List<u_mattress>();
+
+            var oldIdSet = new HashSet<int>(existing.Select(x => x.mattressid));
+            var newIdSet = new HashSet<int>(mattress.subspecsList.Where(x => x.mattressid != 0).Select(x => x.mattressid));
+            var toUpdate = mattress.subspecsList.Where(x => oldIdSet.Contains(x.mattressid)).ToList();
+            var toInsert = mattress.subspecsList.Where(x => x.mattressid == 0).ToList();
+            var toDelete = existing.Where(x => !newIdSet.Contains(x.mattressid)).ToList();
+
+            toDelete.ForEach(x => DeleteMattress(x.mattressid, true));
+
+            var subspecsList = new List<u_mattress>();
+
+            foreach (var child in toInsert)
+            {
+                var copy = CreateSubSpecClone(mattress, child);
+                subspecsList.Add(copy);
+            }
+
+            foreach (var child in toUpdate)
+            {
+                child.mxList = GetMattressMxMtrl(child.mattressid);
+                child.extraList = GetMattressMxExtra(child.mattressid, 1);
+                child.extraCostList = GetMattressMxExtra(child.mattressid, 2);
+                subspecsList.Add(child);
+            }
+
+            subspecsList.Sort((a, b) =>
+            {
+                int cmp = a.mattress_width.Value.CompareTo(b.mattress_width);
+                return cmp != 0 ? cmp : a.mattress_length.Value.CompareTo(b.mattress_length);
+            });
+
+            foreach (var child in subspecsList)
+            {
+                InitMattressSubSpecs(mattress, child);
+                SaveMattressPro(child, ifErp);
+            }
+        }
+        /// <summary>
+        /// 子规格复制逻辑
+        /// </summary>
+        /// <param name="parent"></param>
+        /// <param name="child"></param>
+        /// <returns></returns>
+        private u_mattress CreateSubSpecClone(u_mattress parent, u_mattress child)
+        {
+            var clone = ObjectHelper.DeepCopy(parent);
+            clone.parentid = parent.mattressid;
+            clone.createby = parent.createby;
+            clone.mattressid = child.mattressid;
+            clone.mattresscode = child.mattresscode;
+            clone.subspecsList = child.subspecsList;
+            clone.mattress_width = child.mattress_width;
+            clone.mattress_length = child.mattress_length;
+            clone.mattress_height = child.mattress_height;
+            clone.DynamicFields = child.DynamicFields;
+            clone.mxList = parent.mxList?.Select(mx =>
+            {
+                var mxClone = ObjectHelper.DeepCopy(mx);
+                mxClone.mattressid = 0;
+                mxClone.mattressmxid = 0;
+                return mxClone;
+            }).ToList();
+
+            return clone;
+        }
+
+        /// <summary>
+        /// 删除床垫报价
+        /// </summary>
+        /// <param name="mattressid"></param>
+        /// <param name="isDelMain"></param>
+        public void DeleteMattress(int mattressid, bool isDelMain = false)
+        {
+            // 删除所有明细
+            cmd.CommandText = @"DELETE u_mattress_mx_mtrl WHERE mattressid = @mattressid";
+            cmd.Parameters.Clear();
+            cmd.Parameters.AddWithValue("@mattressid", mattressid);
+            cmd.ExecuteNonQuery();
+
+            // 删除所有额外费用明细
+            cmd.CommandText = @"DELETE u_mattress_mx_extra WHERE mattressid = @mattressid";
+            cmd.Parameters.Clear();
+            cmd.Parameters.AddWithValue("@mattressid", mattressid);
+            cmd.ExecuteNonQuery();
+
+            // 删除主表
+            if(isDelMain)
+            {
+                cmd.CommandText = @"DELETE u_mattress WHERE mattressid = @mattressid";
+                cmd.Parameters.Clear();
+                cmd.Parameters.AddWithValue("@mattressid", mattressid);
+                cmd.ExecuteNonQuery();
+            }
+        }
+        #endregion
+
         #region 公式计算通用方法
         private void AddKeyValue(string key, object value, bool isReplace = true)
         {
@@ -2923,7 +3244,7 @@ namespace JLHHJSvr.Helper
 
             var new_replacements = new Dictionary<string, object>();
 
-            foreach (Match match in matches)
+            foreach (System.Text.RegularExpressions.Match match in matches)
             {
                 if (replacements.TryGetValue(match.Value, out object value2))
                 {

+ 1 - 0
JLHWEB/src/api/interface/index.ts

@@ -1274,6 +1274,7 @@ export namespace Mattress {
     mattress: any;
     mattressMx?: any[];
     subspecs?: any[];
+    subspecsList?: any[];
     check_original?: number;
   }
   export interface ResSaveMattress {

+ 11 - 1
JLHWEB/src/views/quote/mattressQuote/detail.vue

@@ -1459,6 +1459,7 @@ const getData_subSpecs = (params?: any) => {
   console.log("getData_subSpecs getData params :>> ", params);
   let newParams: any = {};
   newParams.mattressid = initParams.value.arg_mattressid;
+  newParams.type = orderStatus.value == "copy" ? 1 : 0;
   return GetMattressSubspecs(newParams);
 };
 const dataCallbackSubspecs = (data: any) => {
@@ -1787,10 +1788,18 @@ const save = async () => {
             }
           });
         }
+
+        const prefixes = ["spring_qty_width", "spring_qty_length", "bednet_iffork", "bednet_fork_qty"];
         subspecs = subspecs.map(itm => {
           itm.mattress_width = Number(itm.mattress_width ?? 0);
           itm.mattress_length = Number(itm.mattress_length ?? 0);
           itm.mattress_height = Number(mattress.mattress_height ?? 0);
+          itm.DynamicFields = Object.keys(itm)
+            .filter(key => prefixes.some(prefix => key.startsWith(prefix)))
+            .reduce((obj, key) => {
+              obj[key] = itm[key];
+              return obj;
+            }, {});
           return itm;
         });
       } catch (error) {
@@ -1824,7 +1833,8 @@ const save = async () => {
     let _param_mf = {
       mattress,
       mattressMx,
-      subspecs,
+      // subspecs,
+      subspecsList: subspecs,
       extraProcesses,
       extraCosts
     };