chengsc
2024-08-19 5e2454c2a75cb70afc0d1933e5c29e02e21231e6
Wms/WMS.BLL/BllAsnServer/PalletBindServer.cs
@@ -31,6 +31,366 @@
        {
        }
        #region 接口方法
        //绑定物料托盘
        public void BindPalletStock(BoxPalletBindVm model, int userId)
        {
            try
            {
                #region 判断
                //判断托盘是否在库外
                var stockDetail = Db.Queryable<DataStockDetail>().First(m => m.IsDel == "0" && m.PalletNo == model.PalletNo);
                if (stockDetail != null)
                {
                    if (!string.IsNullOrWhiteSpace(stockDetail.LocatNo))
                    {
                        throw new Exception("该托盘已有库存信息,请核实!");
                    }
                    return;
                }
                if (model.Type != "0" && model.Type != "1")
                {
                    throw new Exception("托盘类型错误");
                }
                if (string.IsNullOrEmpty(model.PalletNo))
                {
                    throw new Exception("托盘号不可为空!");
                }
                //托盘是否存在
                var pallet = Db.Queryable<SysPallets>().First(m => m.IsDel == "0" && m.PalletNo == model.PalletNo);
                if (pallet == null)
                {
                    throw new Exception("未查询到托盘信息,请核实!");
                }
                if (model.Detail.Count == 0)
                {
                    throw new Exception("托盘绑定明细信息为空,请核实");
                }
                BllArrivalNotice notice = null;
                BllArrivalNoticeDetail detail = null;
                if (model.Type == "0")
                {
                    //0:成品入库 1:采购入库 3:退货入库 4:车间余料入库 5:其它入库 6:代储入库
                    if (string.IsNullOrEmpty(model.AsnNo))
                    {
                        throw new Exception("单据号不可为空!");
                    }
                    if (model.AsnDetailNo == 0)
                    {
                        throw new Exception("单据明细不可为空!");
                    }
                    //根据单据号获取入库单总单
                    notice = Db.Queryable<BllArrivalNotice>().First(a => a.IsDel == "0" && a.ASNNo == model.AsnNo && a.OrderCode == model.OrderCode);
                    if (notice.Status != "0" && notice.Status != "1" && notice.Status != "2")
                    {
                        throw new Exception("该单据已关单!");
                    }
                    if (notice.Type != "0")
                    {
                        throw new Exception("当前单据不能生产成品入库,请核实");
                    }
                    if (string.IsNullOrEmpty(model.LotNo))
                    {
                        throw new Exception("批次不能为空!");
                    }
                    // 验证入库单明细是否存在
                    detail = Db.Queryable<BllArrivalNoticeDetail>().First(m => m.IsDel == "0" && m.Id == model.AsnDetailNo && m.ASNNo == model.AsnNo && m.LotNo == model.LotNo && m.SkuNo == model.SkuNo);
                    if (detail == null)
                    {
                        throw new Exception("当前物料及批次与单据无关联,请核实!");
                    }
                }
                #endregion
                Db.BeginTran();
                var comTime = DateTime.Now;
                #region 包装
                var package = Db.Queryable<SysPackag>().Where(m => m.IsDel == "0");
                var sku = Db.Queryable<SysMaterials>().First(m => m.IsDel == "0" && m.SkuNo == model.SkuNo);
                SysPackag pack = null;
                if (model.Type == "0")
                {
                    pack = package.First(m => m.IsDel == "0" && m.PackagNo == detail.PackagNo);
                }
                else
                {
                    pack = package.First(m => m.IsDel == "0" && m.PackagNo == sku.PackagNo);
                }
                var pNum = 0;//托盘物品数量
                var bNum = 0;//箱码物品数量
                if (pack == null)
                {
                    throw new Exception("获取物料包装失败,请核实!");
                }
                if (pack.L5Num.HasValue)
                {
                    pNum = (int)pack.L5Num;
                    bNum = (int)pack.L4Num;
                }
                else if (pack.L4Num.HasValue)
                {
                    pNum = (int)pack.L4Num;
                    bNum = (int)pack.L3Num;
                }
                else if (pack.L3Num.HasValue)
                {
                    pNum = (int)pack.L3Num;
                    bNum = (int)pack.L2Num;
                }
                else if (pack.L2Num.HasValue)
                {
                    pNum = (int)pack.L2Num;
                    bNum = (int)pack.L1Num;
                }
                else if (pack.L1Num.HasValue)
                {
                    pNum = (int)pack.L1Num;
                    bNum = (int)pack.L1Num;
                }
                if (pNum == 0 || bNum == 0)
                {
                    throw new Exception($"绑定失败,{detail.SkuNo}物品包装未找到!");
                }
                #endregion
                #region 验证是否允许立库同托盘不同物料入库或同托盘同物料不同批次入库
                var list = model.Detail.GroupBy(m => new { m.SkuNo, m.LotNo }).ToList();
                if (list.Count >= 2)
                {
                    var funSetting = Db.Queryable<SysFunSetting>().First(a => a.IsDel == "0" && a.FunSetNo == "Fun045");
                    if (funSetting == null || funSetting.IsEnable == "OFF")
                    {
                        throw new Exception($"不允许立库同托盘不同物料入库或同托盘不同批次入库!");
                    }
                }
                #endregion
                //判断托盘绑定信息中是否有
                var bind = Db.Queryable<BllPalletBind>().First(m => m.IsDel == "0" && m.ASNDetailNo == model.AsnDetailNo && m.PalletNo == model.PalletNo && m.Status != "2");
                var bindId = 0;
                if (bind == null)
                {
                    bind = new BllPalletBind
                    {
                        ASNNo = model.AsnNo,
                        ASNDetailNo = model.AsnDetailNo,
                        PalletNo = model.PalletNo,
                        PalletNo2 = "",
                        PalletNo3 = "",
                        Qty = model.Qty,
                        FullQty = pNum,
                        Status = "0",//等待执行
                        Type = model.Type, //托盘类型  0物料托  1空托盘托
                        LotNo = model.LotNo,
                        LotText = model.LotText,
                        SupplierLot = model.SupplierLot,
                        InspectMark = "0",      //是否取样托盘
                        //SamplingQty = 0,     //取样数量  后期业务开发时 接口传值需添加对应字段判断
                        BitPalletMark = model.Qty == pNum ? "0" : "1",
                        IsBale = "0",
                        IsBelt = "0",
                        CreateUser = userId,
                    };
                    if (bind.FullQty < bind.Qty)
                    {
                        throw new Exception("托盘绑定数量已超出该物料包装数量");
                    }
                    // 插入托盘绑定表
                    bindId = Db.Insertable(bind).ExecuteReturnIdentity();
                }
                else
                {
                    throw new Exception("组盘信息重复");
                }
                #region 箱码信息
                decimal factQty = 0.00m;//托盘总数量
                var boxInfoList = new List<BllBoxInfo>();
                if (model.Type == "1")//托盘托
                {
                    if (model.Detail.Count > 1)
                    {
                        throw new Exception("空托盘绑定信息中明细错误,超过了两条明细");
                    }
                    //添加箱码信息/空托盘明细信息
                    foreach (var box in model.Detail)
                    {
                        var boxInfo = new BllBoxInfo()
                        {
                            ASNNo = model.AsnNo,
                            ASNDetailNo = model.AsnDetailNo,
                            OrderCode = box.OrderCode,
                            BindNo = bindId,
                            BoxNo = box.BoxNo,
                            BoxNo2 = box.BoxNo2,
                            BoxNo3 = box.BoxNo3,
                            PalletNo = model.PalletNo,
                            Qty = box.Qty,
                            FullQty = box.FullQty,
                            Status = "1",
                            SkuNo = box.SkuNo,
                            SkuName = box.SkuName,
                            LotNo = box.LotNo,
                            LotText = box.LotText,
                            SupplierLot = model.SupplierLot,
                            ProductionTime = box.ProductionTime,
                            ExpirationTime = box.ExpirationTime,
                            CompleteTime = comTime,
                            InspectMark = box.InspectMark,
                            BitBoxMark = box.BitBoxMark,
                            InspectStatus = box.InspectStatus,
                            Origin = "WCS",
                            Standard = box.Standard,
                            PackageStandard = box.PackageStandard,
                            StoreTime = box.StoreTime,
                            CreateUser = userId,
                            CreateTime = comTime,
                        };
                        boxInfoList.Add(boxInfo);
                        factQty += box.Qty;
                    }
                    if (factQty > pNum)
                    {
                        throw new Exception($"绑定失败,托盘绑定数量大于该物品包装数量!");
                    }
                }
                else if (model.Type == "0")//物料托
                {
                    if (model.Detail.Count(m => m.OrderCode != detail.OrderDetailCode) > 0)
                    {
                        throw new Exception($"托盘绑定明细中,含有箱码生产工单不一致");
                    }
                    if (model.Detail.Count(m => m.SkuNo != model.SkuNo || m.LotNo != model.LotNo) > 0)
                    {
                        throw new Exception($"托盘绑定明细中,含有箱码物料或批次不一致");
                    }
                    var boxGroup = model.Detail.GroupBy(m => m.BoxNo).ToList();
                    foreach (var g in boxGroup)
                    {
                        decimal boxFullQty = 0;//箱内总数量
                        foreach (var box in g)
                        {
                            factQty += box.Qty;
                            boxFullQty += box.Qty;
                            var boxInfo = new BllBoxInfo()
                            {
                                ASNNo = model.AsnNo,
                                ASNDetailNo = model.AsnDetailNo,
                                OrderCode = box.OrderCode,
                                BindNo = bindId,
                                BoxNo = box.BoxNo,
                                BoxNo2 = box.BoxNo2,
                                BoxNo3 = box.BoxNo3,
                                PalletNo = model.PalletNo,
                                Qty = box.Qty,
                                FullQty = box.FullQty,
                                Status = "1",//已组托
                                SkuNo = box.SkuNo,
                                SkuName = box.SkuName,
                                LotNo = box.LotNo,
                                LotText = box.LotText,
                                SupplierLot = model.SupplierLot,
                                ProductionTime = box.ProductionTime,
                                ExpirationTime = box.ExpirationTime,
                                CompleteTime = comTime,
                                InspectMark = box.InspectMark,
                                BitBoxMark = box.BitBoxMark,
                                InspectStatus = box.InspectStatus,
                                Origin = "WCS",
                                Standard = box.Standard,
                                PackageStandard = box.PackageStandard,
                                StoreTime = box.StoreTime,
                                QtyCount = (int)box.QtyCount,
                                QtyOrd = (int)box.QtyOrd,
                                CreateUser = userId,
                                CreateTime = comTime,
                            };
                            boxInfoList.Add(boxInfo);
                        }
                        if (boxFullQty > bNum)
                        {
                            throw new Exception($"绑定失败,{g.Key}箱码绑定数量大于该物品包装数量!");
                        }
                    }
                }
                Db.Insertable(boxInfoList).ExecuteCommand();
                #endregion
                if (factQty != bind.Qty)
                {
                    throw new Exception("箱码明细总数量不同于托盘总数量,请核实");
                }
                #region 入库单及明细
                if (model.Type == "0")
                {
                    detail.FactQty += factQty;//已组数量
                    //detail.CompleteQty += factQty;//完成数量
                    detail.Status = "1";//0:等待执行 1:正在执行 2:执行完成
                    if (detail.CompleteQty >= detail.Qty)
                    {
                        detail.Status = "2";
                        detail.CompleteTime = comTime;
                    }
                    detail.UpdateUser = userId;
                    detail.UpdateTime = comTime;
                    //更新入库单明细
                    Db.Updateable(detail).ExecuteCommand();
                    notice.UpdateUser = userId;
                    notice.UpdateTime = comTime;
                    if (notice.Status == "0")
                    {
                        notice.Status = "1";
                    }
                    var asnDetailNum = Db.Queryable<BllArrivalNoticeDetail>().Count(m => m.IsDel == "0" && m.ASNNo == detail.ASNNo && m.Status != "2");
                    if (asnDetailNum == 0)
                    {
                        notice.Status = "2";
                        notice.CompleteTime = comTime;//完成时间
                    }
                    //更新入库单
                    Db.Updateable(notice).ExecuteCommand();
                }
                #endregion
                // 更改托盘使用状态
                var sqlStr = $"update SysPallets set Status = '1' where PalletNo = '{model.PalletNo}';";
                //添加托盘记录表数据
                sqlStr += $"insert into LogPalletTrack values('{model.PalletNo}','{model.AsnNo}','组盘','0',getDate(),{userId},NULL,NULL);";
                Db.Ado.ExecuteCommand(sqlStr);
                new OperationASNServer().AddLogOperationAsn("PDA模块", "托盘绑定", model.AsnNo, "添加", $"添加了托盘码为:{model.PalletNo}的组盘信息", userId);
                Db.CommitTran();
            }
            catch (Exception e)
            {
                Db.RollbackTran();
                throw new Exception(e.Message);
            }
        }
        #endregion
        #region 托盘绑定
        public List<PalletBindDto> GetPalletBindList(PalletBindVm model, out int count)
        {
@@ -1770,10 +2130,11 @@
                        var oldTask = Db.Queryable<LogTask>().First(m => m.IsDel == "0" && m.TaskNo == oldTaskNo);
                        oldTask.EndLocat = locate.LocatNo;
                        oldTask.EndRoadway = locate.RoadwayNo;
                        oldTask.Msg += $"{roadwayNo}巷道口=>>{locate.LocatNo}储位地址";
                        if (oldTask.IsSuccess == 0)
                        {
                            oldTask.IsSuccess = 1;
                            oldTask.Status = "1";
                            oldTask.Status = "1";
                        }
                        Db.Updateable(oldTask).ExecuteCommand();
@@ -2045,6 +2406,7 @@
                {
                    locate.Status = "1";
                    Db.Updateable(locate).ExecuteCommand();
                    Db.CommitTran();
                    return;
                }
                // 判断储位是否为空