Browse Source

添加 UseFlag 属性并重构相关逻辑

在 `WetFormulaInfoRequest.cs` 中添加 `UseFlag` 属性,用于指示更新/新建或删除操作。
在 `FJService.cs` 的 `WetFormulaInfo` 方法中,根据 `UseFlag` 属性判断操作类型,并增加事务处理以确保数据一致性。
重构 `CurtainProductionOrder` 方法,增加对配方和物料基础信息的有效性检查,并完善异常处理。
统一时间获取,使用 `nowTime` 变量提高代码可读性和性能。
林豪 左 1 month ago
parent
commit
ecd9d5a7f0
2 changed files with 209 additions and 143 deletions
  1. 5 0
      wms.dto/request/fj/WetFormulaInfoRequest.cs
  2. 204 143
      wms.service/Service/FJService.cs

+ 5 - 0
wms.dto/request/fj/WetFormulaInfoRequest.cs

@@ -29,6 +29,11 @@ namespace wms.dto.request.fj
         /// 备注
         /// </summary>
         public string Remark { get; set; }
+
+        /// <summary>
+        /// true:更新/新建  false:删除
+        /// </summary>
+        public bool UseFlag { get; set; }
         /// <summary>
         /// 物料信息列表
         /// </summary>

+ 204 - 143
wms.service/Service/FJService.cs

@@ -327,31 +327,41 @@ namespace wms.service.Service
         {
             var res = new SRes();
 
-            //保存表Bill_BomInfo
-            foreach (var item in reqDto.FeedList)
+            #region 删除配方
+            if (reqDto.UseFlag == false)
             {
-                var procodelist = _billBominfoRepository.GetList(p => p.MatCode == item.InMaterialCode)
-                    .Select(p => p.ProCode).Distinct();
-                if (procodelist.Any() && procodelist.Count() > 1)
+                _db.BeginTran();
+                var result = _billBominfoRepository.Delete(p => p.Code == reqDto.FeedCode);
+                if (result == false)
                 {
-                    res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
-                    res.ResMsg = item.InMaterialCode + "不允许率属于两个投料大类编码,接收失败";
+                    _db.RollbackTran();
+                    res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
+                    res.ResMsg = "删除失败";
                     return res;
                 }
+                _db.CommitTran();
+                res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();
+                res.ResMsg = "删除成功";
+                return res;
+            }
+            #endregion
 
-                if (_billBominfoRepository.IsAny(p =>
-                        p.Code == reqDto.FeedCode && p.ProMatCode == item.OutMaterialCode &&
-                        p.MatCode == item.InMaterialCode))
-                {
-                    //var mat = _basematerrepository.GetSingle(p => p.Code == item.InMaterialCode);
-                    //_billBominfoRepository.UpdateModelColumns(p => new BillBominfo() { MatCode = item.InMaterialCode, MatId = mat.Id, Name = item.InMaterialCode, HWCountQty = item.Count, EditTime = DateTime.Now },
-                    //   p => p.Code == reqDto.FeedCode && p.MatCode == item.InMaterialCode);
-                }
-                else
+            var Bominfos = new List<BillBominfo>();
+            var nowTime= DateTime.Now;
+            try
+            {
+                foreach (var item in reqDto.FeedList)
                 {
-                    var procode = string.Join('|',
-                        reqDto.FeedList.Where(p => p.OutMaterialCode == item.OutMaterialCode)
-                            .Select(p => p.InMaterialCode).OrderBy(p => p).ToList());
+                    //var procodelist = _billBominfoRepository.GetList(p => p.MatCode == item.InMaterialCode).Select(p => p.ProCode).Distinct();
+                        
+                    //if (procodelist.Any() && procodelist.Count() > 1)
+                    //{
+                    //    res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
+                    //    res.ResMsg = item.InMaterialCode + "不允许率属于两个投料大类编码,接收失败";
+                    //    return res;
+                    //}
+
+                    var procode = string.Join('|', reqDto.FeedList.Where(p => p.OutMaterialCode == item.OutMaterialCode).Select(p => p.InMaterialCode).OrderBy(p => p).ToList());
 
                     var mat = _basematerrepository.GetSingle(p => p.Code == item.InMaterialCode);
                     if (mat == null)
@@ -368,20 +378,59 @@ namespace wms.service.Service
                         Name = reqDto.FeedName,
                         MatCode = item.InMaterialCode,
                         MatId = mat.Id,
-                        AddTime = DateTime.Now,
+                        AddTime = nowTime,
                         AddWho = "wms",
-                        EditTime = DateTime.Now,
+                        EditTime = nowTime,
                         EditWho = "wms",
                         IsStop = 0,
                         HWCountQty = item.Count,
                         ProMatCode = item.OutMaterialCode,
                         Memo = reqDto.Remark
                     };
-                    model.AddTime = DateTime.Now;
-                    _billBominfoRepository.Insert(model);
+                    model.AddTime = nowTime;
+                    Bominfos.Add(model);
                 }
             }
+            catch (Exception ex) 
+            {
+                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
+                res.ResMsg = ex.Message;
+                return res;
+            }
+            try 
+            {
+                _db.BeginTran();
+                if (_billBominfoRepository.IsAny(p => p.Code == reqDto.FeedCode))
+                {
+                    var deleteResult = _billBominfoRepository.Delete(p => p.Code == reqDto.FeedCode);
+                    if (deleteResult == false)
+                    {
+                        _db.RollbackTran();
+                        res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
+                        res.ResMsg = "删除旧信息失败";
+                        return res;
+                    }
+                }
+              
+                var result= _billBominfoRepository.InsertRange(Bominfos);
+                if (result == false)
+                {
+                    _db.RollbackTran();
+                    res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
+                    res.ResMsg = "更新/新建失败";
+                    return res;
+                }
+                _db.CommitTran();
+            } 
+            catch (Exception e) 
+            {
+                _db.RollbackTran();
+                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
+                res.ResMsg = e.Message;
+            }
 
+            res.ResCode = ResponseStatusCodeEnum.Sucess.GetHashCode();
+            res.ResMsg = "更新/新建成功";
             return res;
         }
 
@@ -394,150 +443,162 @@ namespace wms.service.Service
         {
             var res = new SRes();
 
-            //先判断是否有配方信息和物料基础信息
-            var outmat = _basematerrepository.GetSingle(p => p.Code == reqDto.MatCode);
-            if (outmat == null)
-            {
-                res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
-                res.ResMsg = reqDto.MatCode + "不存在该物料基础信息,请先同步基础信息";
-                return res;
-            }
-
-            var procode = string.Join('|', reqDto.FeedList.Select(p => p.InMaterialCode).OrderBy(p => p).ToList());
-            if (reqDto.ProdFlag == 1)
-            {
-                var bominfo =_billBominfoRepository.GetFirst(p => p.Code == reqDto.FeedCode && p.ProMatCode == reqDto.MatCode);
-                if (bominfo == null)
+            try
+            { //先判断是否有配方信息和物料基础信息
+                var outmat = _basematerrepository.GetSingle(p => p.Code == reqDto.MatCode);
+                if (outmat == null)
                 {
                     res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
-                    res.ResMsg = string.Format("当前产出为芯股,此芯股投料信息不存在请先同步投料信息,投料编码{0},产出物{1}", reqDto.FeedCode,
-                        reqDto.MatCode);
+                    res.ResMsg = reqDto.MatCode + "不存在该物料基础信息,请先同步基础信息";
                     return res;
                 }
 
-                procode = bominfo.ProCode;
-            }
-
-            BillBomsetgrp stack = null; //垛型固定获取最早更新的垛型
-            //后续一个配方会有多个垛型
-            if (reqDto.MatCode.StartsWith("57")) //是芯股
-            {
-                stack = _billBomsetgrpRepository.AsQueryable().Where(p =>
-                        (p.BomCode == procode || procode.Contains(p.BomCode)) && p.ProMaterCode.StartsWith("57") &&
-                        p.IsStop == 0).OrderBy(x => x.EditTime).First();
-                if (stack == null)
+                var procode = string.Join('|', reqDto.FeedList.Select(p => p.InMaterialCode).OrderBy(p => p).ToList());
+                if (reqDto.ProdFlag == 1)
                 {
-                    res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
-                    res.ResMsg = string.Format("{0}该单据配方没有垛型信息,请先配置垛型,bom编码{1},bom大类编码{2},产出物料{3}", reqDto.BillCode,
-                        reqDto.FeedCode, procode, reqDto.MatCode);
-                    return res;
-                }
-            }
-            else //不是芯股
-            {
-                stack = _billBomsetgrpRepository.GetList(p =>
-                    (p.BomCode == procode || procode.Contains(p.BomCode)) && !p.ProMaterCode.StartsWith("57") &&
-                    p.IsStop == 0).OrderBy(x => x.EditTime).First(); ;
+                    var bominfo = _billBominfoRepository.GetFirst(p => p.Code == reqDto.FeedCode && p.ProMatCode == reqDto.MatCode);
+                    if (bominfo == null)
+                    {
+                        res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
+                        res.ResMsg = string.Format("当前产出为芯股,此芯股投料信息不存在请先同步投料信息,投料编码{0},产出物{1}", reqDto.FeedCode,
+                            reqDto.MatCode);
+                        return res;
+                    }
 
-                if (stack == null)
-                {
-                    res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
-                    res.ResMsg = string.Format("{0}该单据配方没有垛型信息,请先配置垛型,bom编码{1},bom大类编码{2},产出物料{3}", reqDto.BillCode,
-                        reqDto.FeedCode, procode, reqDto.MatCode);
-                    return res;
+                    procode = bominfo.ProCode;
                 }
-            }
 
-            var reqjson = JsonConvert.SerializeObject(reqDto);
-            if (reqjson.Length > 5000) reqjson = "内容量过大,已截取";
-            if (reqDto.BillState == CurtainBillState.初始化.GetHashCode().ToString() ||
-                reqDto.BillState == CurtainBillState.已合并.GetHashCode().ToString() ||
-                reqDto.BillState == CurtainBillState.已排产.GetHashCode().ToString())
-            {
-                var doc = _billdocrepository.GetSingle(p => p.DocsNo == reqDto.BillCode);
-                if (doc == null)
+                BillBomsetgrp stack = null; //垛型固定获取最早更新的垛型
+                                            //后续一个配方会有多个垛型
+                if (reqDto.MatCode.StartsWith("57")) //是芯股
                 {
-                    doc = new BillDocsinfo();
-                    doc.WarehouseId = 0;
-                    doc.ReqNo = reqDto.BillCode;
-                    doc.DocsNo = reqDto.BillCode;
-                    doc.TypeNum = DocType.DocType_FJ_CurtainProduction.GetHashCode();
-                    doc.StateNum = DocState.DocState_Create.GetHashCode();
-                    doc.JsonContent = reqjson;
-                    doc.DownQty = 1;
-                    doc.IsStop = 0;
-                    doc.BomCode = reqDto.FeedCode;
-                    doc.ProMaterCode = reqDto.MatCode;
-                    doc.SetGrpCode = stack.Code;
-                    doc.WorkOrder = reqDto.WorkOrder;
-                    doc.SkuCode = reqDto.SkuCode;
-                    doc.PackRule = reqDto.PackRule;
-                    var docinsert = _billdocrepository.Insert(doc);
-                    if (!docinsert)
+                    stack = _billBomsetgrpRepository.AsQueryable().Where(p =>
+                            (p.BomCode == procode || procode.Contains(p.BomCode)) && p.ProMaterCode.StartsWith("57") &&
+                            p.IsStop == 0).OrderBy(x => x.EditTime).First();
+                    if (stack == null)
                     {
                         res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
-                        res.ResMsg = ResponseStatusCodeEnum.ErrParam.GetDescription();
+                        res.ResMsg = string.Format("{0}该单据配方没有垛型信息,请先配置垛型,bom编码{1},bom大类编码{2},产出物料{3}", reqDto.BillCode,
+                            reqDto.FeedCode, procode, reqDto.MatCode);
                         return res;
                     }
                 }
-
-                _basemachinforepository.UpdateModelColumns(
-                    p => new BillMachinfo
-                    {
-                        ProBillCode = reqDto.BillCode, ProWorkOrder = reqDto.WorkOrder, ProSetGrpCode = stack.Code,
-                        EditTime = DateTime.Now
-                    }, p => reqDto.WbList.Contains(p.MachNo));
-                //箱号处理
-                //根据箱号更新装箱信息表
-            }
-            else if (reqDto.BillState == CurtainBillState.生产中.GetHashCode().ToString())
-            {
-                var doc = _billdocrepository.GetSingle(p => p.DocsNo == reqDto.BillCode);
-                if (doc == null)
+                else //不是芯股
                 {
-                    doc = new BillDocsinfo();
-                    doc.WarehouseId = 0;
-                    doc.ReqNo = reqDto.BillCode;
-                    doc.DocsNo = reqDto.BillCode;
-                    doc.TypeNum = DocType.DocType_FJ_CurtainProduction.GetHashCode();
-                    doc.StateNum = DocState.DocState_Execute.GetHashCode();
-                    doc.JsonContent = reqjson;
-                    doc.DownQty = 1;
-                    doc.IsStop = 0;
-                    doc.BomCode = reqDto.FeedCode;
-                    doc.ProMaterCode = reqDto.MatCode;
-                    doc.SetGrpCode = stack.Code;
-                    doc.WorkOrder = reqDto.WorkOrder;
-                    doc.SkuCode = reqDto.SkuCode;
-                    doc.PackRule = reqDto.PackRule;
-                    var docinsert = _billdocrepository.Insert(doc);
-                    if (!docinsert)
+                    stack = _billBomsetgrpRepository.GetList(p =>
+                        (p.BomCode == procode || procode.Contains(p.BomCode)) && !p.ProMaterCode.StartsWith("57") &&
+                        p.IsStop == 0).OrderBy(x => x.EditTime).FirstOrDefault(); ;
+
+                    if (stack == null)
                     {
                         res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
-                        res.ResMsg = ResponseStatusCodeEnum.ErrParam.GetDescription();
+                        res.ResMsg = string.Format("{0}该单据配方没有垛型信息,请先配置垛型,bom编码{1},bom大类编码{2},产出物料{3}", reqDto.BillCode,
+                            reqDto.FeedCode, procode, reqDto.MatCode);
                         return res;
                     }
                 }
 
-                var state = DocState.DocState_Execute.GetHashCode();
-                _billdocrepository.UpdateModelColumns(
-                    p => new BillDocsinfo { StateNum = state, SetGrpCode = stack.Code },
-                    p => p.DocsNo == reqDto.BillCode);
-                _basemachinforepository.UpdateModelColumns(
-                    p => new BillMachinfo
-                    {
-                        BillCode = reqDto.BillCode, WorkOrder = reqDto.WorkOrder, SetGrpCode = stack.Code,
-                        EditTime = DateTime.Now
-                    }, p => reqDto.WbList.Contains(p.MachNo));
-                //箱号处理
-                //根据箱号更新装箱信息表
+                var reqjson = JsonConvert.SerializeObject(reqDto);
+                if (reqjson.Length > 5000) reqjson = "内容量过大,已截取";
+                if (reqDto.BillState == CurtainBillState.初始化.GetHashCode().ToString() ||
+                    reqDto.BillState == CurtainBillState.已合并.GetHashCode().ToString() ||
+                    reqDto.BillState == CurtainBillState.已排产.GetHashCode().ToString())
+                {
+                    var doc = _billdocrepository.GetSingle(p => p.DocsNo == reqDto.BillCode);
+                    if (doc == null)
+                    {
+                        doc = new BillDocsinfo();
+                        doc.WarehouseId = 0;
+                        doc.ReqNo = reqDto.BillCode;
+                        doc.DocsNo = reqDto.BillCode;
+                        doc.TypeNum = DocType.DocType_FJ_CurtainProduction.GetHashCode();
+                        doc.StateNum = DocState.DocState_Create.GetHashCode();
+                        doc.JsonContent = reqjson;
+                        doc.DownQty = 1;
+                        doc.IsStop = 0;
+                        doc.BomCode = reqDto.FeedCode;
+                        doc.ProMaterCode = reqDto.MatCode;
+                        doc.SetGrpCode = stack.Code;
+                        doc.WorkOrder = reqDto.WorkOrder;
+                        doc.SkuCode = reqDto.SkuCode;
+                        doc.PackRule = reqDto.PackRule;
+                        var docinsert = _billdocrepository.Insert(doc);
+                        if (!docinsert)
+                        {
+                            res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
+                            res.ResMsg = ResponseStatusCodeEnum.ErrParam.GetDescription();
+                            return res;
+                        }
+                    }
+
+                    _basemachinforepository.UpdateModelColumns(
+                        p => new BillMachinfo
+                        {
+                            ProBillCode = reqDto.BillCode,
+                            ProWorkOrder = reqDto.WorkOrder,
+                            ProSetGrpCode = stack.Code,
+                            EditTime = DateTime.Now
+                        }, p => reqDto.WbList.Contains(p.MachNo));
+                    //箱号处理
+                    //根据箱号更新装箱信息表
+                }
+                else if (reqDto.BillState == CurtainBillState.生产中.GetHashCode().ToString())
+                {
+                    var doc = _billdocrepository.GetSingle(p => p.DocsNo == reqDto.BillCode);
+                    if (doc == null)
+                    {
+                        doc = new BillDocsinfo();
+                        doc.WarehouseId = 0;
+                        doc.ReqNo = reqDto.BillCode;
+                        doc.DocsNo = reqDto.BillCode;
+                        doc.TypeNum = DocType.DocType_FJ_CurtainProduction.GetHashCode();
+                        doc.StateNum = DocState.DocState_Execute.GetHashCode();
+                        doc.JsonContent = reqjson;
+                        doc.DownQty = 1;
+                        doc.IsStop = 0;
+                        doc.BomCode = reqDto.FeedCode;
+                        doc.ProMaterCode = reqDto.MatCode;
+                        doc.SetGrpCode = stack.Code;
+                        doc.WorkOrder = reqDto.WorkOrder;
+                        doc.SkuCode = reqDto.SkuCode;
+                        doc.PackRule = reqDto.PackRule;
+                        var docinsert = _billdocrepository.Insert(doc);
+                        if (!docinsert)
+                        {
+                            res.ResCode = ResponseStatusCodeEnum.ErrParam.GetHashCode();
+                            res.ResMsg = ResponseStatusCodeEnum.ErrParam.GetDescription();
+                            return res;
+                        }
+                    }
+
+                    var state = DocState.DocState_Execute.GetHashCode();
+                    _billdocrepository.UpdateModelColumns(
+                        p => new BillDocsinfo { StateNum = state, SetGrpCode = stack.Code },
+                        p => p.DocsNo == reqDto.BillCode);
+                    _basemachinforepository.UpdateModelColumns(
+                        p => new BillMachinfo
+                        {
+                            BillCode = reqDto.BillCode,
+                            WorkOrder = reqDto.WorkOrder,
+                            SetGrpCode = stack.Code,
+                            EditTime = DateTime.Now
+                        }, p => reqDto.WbList.Contains(p.MachNo));
+                    //箱号处理
+                    //根据箱号更新装箱信息表
+                }
+                else if (reqDto.BillState == CurtainBillState.生产结束.GetHashCode().ToString() ||
+                         reqDto.BillState == CurtainBillState.计划关闭.GetHashCode().ToString())
+                {
+                    var state = DocState.DocState_Complete.GetHashCode();
+                    _billdocrepository.UpdateModelColumns(p => new BillDocsinfo { StateNum = state },
+                        p => p.DocsNo == reqDto.BillCode);
+                }
             }
-            else if (reqDto.BillState == CurtainBillState.生产结束.GetHashCode().ToString() ||
-                     reqDto.BillState == CurtainBillState.计划关闭.GetHashCode().ToString())
+            catch (Exception ex)
             {
-                var state = DocState.DocState_Complete.GetHashCode();
-                _billdocrepository.UpdateModelColumns(p => new BillDocsinfo { StateNum = state },
-                    p => p.DocsNo == reqDto.BillCode);
+                res.ResCode = ResponseStatusCodeEnum.Fail.GetHashCode();
+                res.ResMsg = ex.StackTrace;
+                return res;
             }
 
             return res;