wxw
3 天以前 f6d9155a4a0cf27fd5732314b70109cbc090ccf8
Wms/WMS.BLL/BllAsnServer/BllBoxInfoServer.cs
@@ -15,6 +15,9 @@
using WMS.Entity.Context;
using WMS.Entity.SysEntity;
using WMS.IBLL.IBllAsnServer;
using WMS.Entity.DataEntity;
using Dm;
using System.Reflection;
namespace WMS.BLL.BllAsnServer
{
@@ -514,7 +517,7 @@
                        CreateTime = a.CreateTime,
                        UpdateTime = a.UpdateTime
                    }).OrderByDescending(a => a.CreateTime).OrderBy(a => a.BoxNo).ToOffsetPage(model.Page, model.Limit, ref total);
                    }).OrderByDescending(a => a.ASNNo).OrderBy(a => a.BoxNo).ToOffsetPage(model.Page, model.Limit, ref total);
                count = total;
                return data;
            }
@@ -534,8 +537,17 @@
                {
                    throw new Exception("未查询到单据明细信息,请核实");
                }
                var skuInfo = Db.Queryable<SysMaterials>().First(w => w.IsDel == "0" && w.SkuNo == asnDetail.SkuNo);
                if (skuInfo == null)
                {
                    throw new Exception("未查询到物料信息,请核实");
                }
                if (string.IsNullOrEmpty(skuInfo.PackagNo))
                {
                    throw new Exception("未查询到物料的包装信息,请核实");
                }
                var packInfo = Db.Queryable<SysPackag>().First(m => m.IsDel == "0" && m.PackagNo == asnDetail.PackagNo);
                var packInfo = Db.Queryable<SysPackag>().First(m => m.IsDel == "0" && m.PackagNo == skuInfo.PackagNo);
                if (packInfo == null)
                {
                    throw new Exception("未查询到单据明细中的物料包装信息");
@@ -597,17 +609,31 @@
                {
                    throw new Exception("单据数量不能小于等于0");
                }
                if (string.IsNullOrWhiteSpace(asnList.LotNo))
                //if (string.IsNullOrWhiteSpace(asnList.LotNo))
                //{
                //    throw new Exception("单据批次号不能为空");
                //}
                if (string.IsNullOrWhiteSpace(asnList.BoxCodeStr))
                {
                    throw new Exception("单据批次号不能为空");
                    throw new Exception("单据箱码常值不能为空");
                }
                var asn = Db.Queryable<BllArrivalNotice>().First(m => m.ASNNo == asnList.ASNNo && m.IsDel == "0");
                if (asn == null)
                {
                    throw new Exception("未查询到单据信息");
                }
                var pack = Db.Queryable<SysPackag>().First(m => m.IsDel == "0" && m.PackagNo == asnList.PackagNo);
                //包装编码
                var packagNo = asnList.PackagNo;
                if (string.IsNullOrEmpty(packagNo))
                {
                    var skuInfo = Db.Queryable<SysMaterials>().First(w => w.IsDel == "0" && w.SkuNo == asnList.SkuNo);
                    if (skuInfo == null)
                    {
                        throw new Exception("未查询到物料信息");
                    }
                    packagNo = skuInfo.PackagNo;
                }
                var pack = Db.Queryable<SysPackag>().First(m => m.IsDel == "0" && m.PackagNo == packagNo);
                if (pack == null)
                {
                    throw new Exception("未查询到当前单据中物料的包装信息");
@@ -649,16 +675,16 @@
                #region 包装查询
                var bNum = 0;//箱物品数量
                var zNum = 0;//支物品数量
                var bNum = 0m;//箱物品数量
                var zNum = 0m;//支物品数量
                var packLevel = 0;
                if (pack.L2Num.HasValue)
                {
                    if (pack.L2Name != "托")
                    {
                        packLevel = 2;
                        bNum = Convert.ToInt32(pack.L2Num);
                        packLevel = 1;//JC34项目只有一级标签
                        bNum = Convert.ToDecimal(pack.L2Num);
                    }
                }
                if (pack.L1Num.HasValue)
@@ -666,9 +692,9 @@
                    if (packLevel == 0)
                    {
                        packLevel = 1;
                        bNum = Convert.ToInt32(pack.L1Num);
                        bNum = Convert.ToDecimal(pack.L1Num);
                    }
                    zNum = Convert.ToInt32(pack.L1Num);
                    zNum = Convert.ToDecimal(pack.L1Num);
                }
                if (packLevel < 1)//包装等级小于1,按照1级标签打印
@@ -710,22 +736,29 @@
                    #endregion
                    int labelNum = 1; //生产条码数量
                    if (zNum > 0)
                    {
                        labelNum = int.Parse(Math.Ceiling(qty / zNum).ToString());//标签数量
                    }
                    else
                    {
                        throw new Exception("当前单据物料是一级包装,未查询到一级包装信息");
                    }
                    //if (zNum > 0)
                    //{
                        labelNum = int.Parse(Math.Ceiling(qty / bNum).ToString());//标签数量
                    //}
                    //else
                    //{
                    //    throw new Exception("当前单据物料是一级包装,未查询到一级包装信息");
                    //}
                    #region 获取/生成批次号
                    string maxLotNoStr = ""; //批次号
                    string maxBoxCode = ""; //箱码号
                    maxLotNoStr = asnList.LotNo;
                    maxBoxCode = label.Where(m => m.LotNo == maxLotNoStr).Max(a => a.BoxNo);
                    maxLotNoStr = asnList.BoxCodeStr;//asnList.LotNo;
                    if (string.IsNullOrEmpty(asnList.LotNo))
                    {
                        maxBoxCode = label.Where(m => m.ASNDetailNo == asnList.Id).Max(a => a.BoxNo);
                    }
                    else
                    {
                        maxBoxCode = label.Where(m => m.LotNo == maxLotNoStr).Max(a => a.BoxNo);
                    }
                    #endregion
                    for (int i = 1; i <= labelNum; i++)
@@ -734,30 +767,30 @@
                        if (i == labelNum)
                        {
                            // 最后一个条码
                            var s = zNum * (i - 1);
                            if (zNum > qty - s)
                            var s = bNum * (i - 1);
                            if (bNum > qty - s)
                            {
                                boxQty = qty - s;// 数量
                            }
                            else
                            {
                                boxQty = zNum;// 数量
                                boxQty = bNum;// 数量
                            }
                        }
                        else
                        {
                            boxQty = zNum;         // 数量
                            boxQty = bNum;         // 数量
                        }
                        //获取箱码
                        if (string.IsNullOrWhiteSpace(maxBoxCode))
                        {
                            var str = "B" + maxLotNoStr + "000001"; //批号+ 流水  2302010001000001
                            var str = "B" + maxLotNoStr + "000001"; //批号+ 流水  B 230201 0001  000001
                            maxBoxCode = str;
                        }
                        else
                        {
                            maxBoxCode = maxBoxCode.Substring(0, 11) + (int.Parse(maxBoxCode.Substring(11, 6)) + 1).ToString().PadLeft(6, '0');
                            maxBoxCode = maxBoxCode.Substring(0, maxBoxCode.Length-6) + (int.Parse(maxBoxCode.Substring(maxBoxCode.Length - 6, 6)) + 1).ToString().PadLeft(6, '0');
                        }
                        // 将条码保存到原料条码表
@@ -771,7 +804,7 @@
                            Status = "0",
                            SkuNo = asnList.SkuNo,
                            SkuName = asnList.SkuName,
                            LotNo = maxLotNoStr,
                            LotNo = asnList.LotNo,//maxLotNoStr,
                            Standard = asnList.Standard,
                            PackageStandard = packStr,
                            SupplierLot = supplierLot,
@@ -779,14 +812,26 @@
                            BitBoxMark = bNum > boxQty ? "1" : "0",
                            InspectStatus = "0",
                            ProductionTime = DateTime.Parse(productionTime),
                            StoreTime = DateTime.Parse(storeTime),
                            ExpirationTime = DateTime.Parse(expirationTime),
                            ProductionTime = null,
                            StoreTime = null,
                            ExpirationTime = null,
                            Origin = "WMS生成",
                            CreateUser = userId,
                            CreateTime = DateTime.Now,
                        };
                        if (!string.IsNullOrEmpty(productionTime))
                        {
                            labelModel.ProductionTime = DateTime.Parse(productionTime);
                        }
                        if (!string.IsNullOrEmpty(storeTime))
                        {
                            labelModel.StoreTime = DateTime.Parse(storeTime);
                        }
                        if (!string.IsNullOrEmpty(expirationTime))
                        {
                            labelModel.ExpirationTime = DateTime.Parse(expirationTime);
                        }
                        Db.Insertable(labelModel).ExecuteCommand();
                        modelList.Add(labelModel);
@@ -931,14 +976,26 @@
                                BitBoxMark = bNum > boxQty ? "1" : "0",
                                InspectStatus = "0",
                                ProductionTime = DateTime.Parse(productionTime),
                                StoreTime = DateTime.Parse(storeTime),
                                ExpirationTime = DateTime.Parse(expirationTime),
                                ProductionTime = null,
                                StoreTime = null,
                                ExpirationTime = null,
                                Origin = "WMS生成",
                                CreateUser = userId,
                                CreateTime = DateTime.Now,
                            };
                            if (!string.IsNullOrEmpty(productionTime))
                            {
                                labelModel.ProductionTime = DateTime.Parse(productionTime);
                            }
                            if (!string.IsNullOrEmpty(storeTime))
                            {
                                labelModel.StoreTime = DateTime.Parse(storeTime);
                            }
                            if (!string.IsNullOrEmpty(expirationTime))
                            {
                                labelModel.ExpirationTime = DateTime.Parse(expirationTime);
                            }
                            Db.Insertable(labelModel).ExecuteCommand();
                            modelList.Add(labelModel);
@@ -1026,6 +1083,7 @@
                            model.ExpirationTime = data.ExpirationTime;                  // 有效期至
                            model.StoreTime = data.StoreTime;                     // 储存期至 
                            model.ProductionTime = data.ProductionTime;//生产日期
                            model.Qty = dataList.Sum(m => m.Qty);// 数量
@@ -1081,6 +1139,7 @@
                                model.ExpirationTime = data.ExpirationTime;                  // 有效期至
                                model.StoreTime = data.StoreTime;                     // 储存期至 
                                model.ProductionTime = data.ProductionTime;//生产日期
                                model.Qty = data1.Sum(m => m.Qty);// 数量
@@ -1133,6 +1192,7 @@
                            model.ExpirationTime = data.ExpirationTime;                  // 有效期至
                            model.StoreTime = data.StoreTime;                     // 储存期至 
                            model.ProductionTime = data.ProductionTime;//生产日期
                            model.Qty = data.Qty;// 数量
@@ -1185,6 +1245,7 @@
                                model.ExpirationTime = data.ExpirationTime;                  // 有效期至
                                model.StoreTime = data.StoreTime;                     // 储存期至 
                                model.ProductionTime = data.ProductionTime;//生产日期
                                model.Qty = data.Qty;// 数量
@@ -1251,6 +1312,7 @@
                                    model1.ExpirationTime = data.ExpirationTime;                  // 有效期至
                                    model1.StoreTime = data.StoreTime;                     // 储存期至 
                                    model1.ProductionTime = data.ProductionTime;//生产日期
                                    model1.Qty = dataList.Sum(m => m.Qty);// 数量
                                    model1.BoxNo = data.BoxNo;                 // 箱号     
@@ -1270,6 +1332,7 @@
                                    model.ExpirationTime = data.ExpirationTime;                  // 有效期至
                                    model.StoreTime = data.StoreTime;                     // 储存期至 
                                    model.ProductionTime = data.ProductionTime;//生产日期
                                    model.Qty = data.Qty;// 数量
                                    model.BoxNo = data.BoxNo3;                 // 支号     
@@ -1317,6 +1380,7 @@
                                    model.ExpirationTime = boxData.ExpirationTime;                  // 有效期至
                                    model.StoreTime = boxData.StoreTime;                     // 储存期至 
                                    model.ProductionTime = boxData.ProductionTime;//生产日期
                                    model.Qty = data.Sum(m => m.Qty);     // 数量
                                    model.BoxNo = boxData.BoxNo;                 // 支号     
@@ -1339,6 +1403,7 @@
                                        model1.ExpirationTime = item.ExpirationTime;                  // 有效期至
                                        model1.StoreTime = item.StoreTime;                     // 储存期至 
                                        model1.ProductionTime = item.ProductionTime;//生产日期
                                        model1.Qty = item.Qty;// 数量
                                        model1.BoxNo = item.BoxNo3;                 // 支号     
@@ -1385,6 +1450,7 @@
                                model.ExpirationTime = boxData.ExpirationTime;                  // 有效期至
                                model.StoreTime = boxData.StoreTime;                     // 储存期至 
                                model.ProductionTime = boxData.ProductionTime;//生产日期
                                model.Qty = data.Sum(m => m.Qty);     // 数量
                                model.BoxNo = boxData.BoxNo;                 // 支号     
@@ -1409,6 +1475,7 @@
                                        model1.ExpirationTime = item.ExpirationTime;                  // 有效期至
                                        model1.StoreTime = item.StoreTime;                     // 储存期至 
                                        model.ProductionTime = item.ProductionTime;//生产日期
                                        model1.Qty = item.Qty;     // 数量
                                        model1.BoxNo = item.BoxNo3;                 // 支号     
@@ -1477,6 +1544,7 @@
                                model.ExpirationTime = boxData.ExpirationTime;                  // 有效期至
                                model.StoreTime = boxData.StoreTime;                     // 储存期至 
                                model.ProductionTime = boxData.ProductionTime;//生产日期
                                model.Qty = data.Sum(m => m.Qty);     // 数量
                                model.BoxNo = boxData.BoxNo;                 // 支号     
@@ -1505,6 +1573,7 @@
                                        model1.ExpirationTime = item.ExpirationTime;                  // 有效期至
                                        model1.StoreTime = item.StoreTime;                     // 储存期至 
                                        model.ProductionTime = item.ProductionTime;//生产日期
                                        model1.Qty = item.Qty;// 数量
                                        model1.BoxNo = item.BoxNo3;                 // 支号     
@@ -1679,6 +1748,190 @@
                throw new Exception(e.Message);
            }
        }
        /// <summary>
        /// 拆分箱码标签
        /// </summary>
        /// <param name="boxNo"></param>
        /// <param name="chaiQty"></param>
        /// <param name="userId"></param>
        /// <exception cref="Exception"></exception>
        public void ChaiLableBox(string boxNo,decimal chaiQty, int userId)
        {
            try
            {
                if (string.IsNullOrEmpty(boxNo))
                {
                    throw new Exception("请输入拆箱箱码");
                }
                if (chaiQty <= 0)
                {
                    throw new Exception("请输入拆分数量");
                }
                //标签信息
                var boxList = Db.Queryable<BllBoxInfo>().Where(w => w.IsDel == "0" && w.BoxNo == boxNo).ToList();
                if (boxList.Count < 1)
                {
                    throw new Exception("该箱码信息错误,未查到此箱码信息");
                }
                if (boxList.Count > 1)
                {
                    throw new Exception("该箱码信息错误,存在多个此箱码信息");
                }
                var boxInfo = boxList.First();
                if (boxInfo.Qty <= chaiQty)
                {
                    throw new Exception("拆箱数量大等于当前箱内数量");
                }
                if (boxInfo.Status != "0")
                {
                    throw new Exception("该箱码不是未组托状态,不允许拆箱!");
                }
                //开启事务
                Db.BeginTran();
                boxInfo.Qty -= chaiQty;
                boxInfo.BitBoxMark = "1";
                //更新箱码库存表
                Db.Updateable(boxInfo).ExecuteCommand();
                var boxStr = boxInfo.BoxNo.Substring(0, boxInfo.BoxNo.Length - 6);//获取箱码前缀-除后六位流水外
                var maxBoxCode1 = Db.Queryable<BllBoxInfo>().Where(m => m.BoxNo.Contains(boxStr) && m.IsDel == "0" && m.Origin == "WMS生成").Max(a => a.BoxNo);
                var maxBoxCode2 = Db.Queryable<DataBoxInfo>().Where(m => m.BoxNo.Contains(boxStr) && m.IsDel == "0").Max(a => a.BoxNo);
                //如果结果为0,则说明两个字符串相等;  ABC  BCE
                //如果结果小于0,则说明第一个字符串小于第二个字符串;
                //如果结果大于0,则说明第一个字符串大于第二个字符串。
                var maxBoxCode = maxBoxCode1;
                var bol = String.CompareOrdinal(maxBoxCode1, maxBoxCode2);
                if (bol < 0)
                {
                    maxBoxCode = maxBoxCode2;
                }
                var boxNoNew = maxBoxCode.Substring(0, maxBoxCode.Length - 6) + (int.Parse(maxBoxCode.Substring(maxBoxCode.Length - 6, 6)) + 1).ToString().PadLeft(6, '0');
                // 添加新箱码信息
                var boxModel = new BllBoxInfo()
                {
                    ASNNo = boxInfo.ASNNo,
                    ASNDetailNo = boxInfo.ASNDetailNo,
                    BoxNo = boxNoNew,
                    BoxNo2 = "",
                    BoxNo3 = "",
                    Qty = chaiQty,
                    FullQty = boxInfo.FullQty,
                    Status = "0",//待组托
                    BindNo = null,
                    PalletNo = "",
                    SkuNo = boxInfo.SkuNo,
                    SkuName = boxInfo.SkuName,
                    LotNo = boxInfo.LotNo,
                    Standard = boxInfo.Standard,
                    PackageStandard = boxInfo.PackageStandard,
                    SupplierLot = boxInfo.SupplierLot,
                    InspectMark = boxInfo.InspectMark,
                    BitBoxMark = "1",
                    InspectStatus = "0",
                    ProductionTime = boxInfo.ProductionTime,
                    StoreTime = boxInfo.StoreTime,
                    ExpirationTime = boxInfo.ExpirationTime,
                    Origin = "WMS生成",
                    CreateUser = userId,
                    CreateTime = DateTime.Now,
                };
                Db.Insertable(boxModel).ExecuteCommand();
                //添加操作日志
                new OperationASNServer().AddLogOperationAsn("入库作业", "物料标签", boxNo, "编辑", $"拆分了箱码{boxNo}数量{chaiQty}到新箱码{boxNoNew}", userId);
                //提交事务
                Db.CommitTran();
            }
            catch (Exception e)
            {
                //回滚事务
                Db.RollbackTran();
                throw new Exception(e.Message);
            }
        }
        /// <summary>
        /// 合并箱码标签
        /// </summary>
        /// <param name="boxNo"></param>
        /// <param name="boxNo2"></param>
        /// <param name="userId"></param>
        public void MergeLableBox(string boxNo,string boxNo2, int userId)
        {
            try
            {
                if (string.IsNullOrEmpty(boxNo) || string.IsNullOrEmpty(boxNo2))
                {
                    throw new Exception("请输入要合并的箱码");
                }
                //标签信息
                var boxList = Db.Queryable<BllBoxInfo>().Where(w => w.IsDel == "0" && w.BoxNo == boxNo).ToList();
                if (boxList.Count < 1)
                {
                    throw new Exception($"{boxNo}该箱码信息错误,未查到此箱码信息");
                }
                if (boxList.Count > 1)
                {
                    throw new Exception($"{boxNo}该箱码信息错误,存在多个此箱码信息");
                }
                var boxInfo = boxList.First();
                if (boxInfo.Status != "0")
                {
                    throw new Exception($"{boxNo}该箱码不是未组托状态,不允许合并!");
                }
                var boxList2 = Db.Queryable<BllBoxInfo>().Where(w => w.IsDel == "0" && w.BoxNo == boxNo2).ToList();
                if (boxList2.Count < 1)
                {
                    throw new Exception($"{boxNo2}该箱码信息错误,未查到此箱码信息");
                }
                if (boxList2.Count > 1)
                {
                    throw new Exception($"{boxNo2}该箱码信息错误,存在多个此箱码信息");
                }
                var boxInfo2 = boxList2.First();
                if (boxInfo2.Status != "0")
                {
                    throw new Exception($"{boxNo2}该箱码不是未组托状态,不允许合并!");
                }
                if (boxInfo.SkuNo != boxInfo2.SkuNo || boxInfo.LotNo != boxInfo2.LotNo)
                {
                    throw new Exception($"两个箱码物料批次信息不一致,不允许合并!");
                }
                if (boxInfo.ASNNo != boxInfo2.ASNNo || boxInfo.ASNDetailNo != boxInfo2.ASNDetailNo)
                {
                    throw new Exception($"两个箱码所属入库单信息不一致,不允许合并!");
                }
                if (boxInfo.Qty + boxInfo2.Qty > boxInfo.FullQty)
                {
                    throw new Exception($"两个箱码合并后数量超过满箱数量,不允许合并!");
                }
                //开启事务
                Db.BeginTran();
                boxInfo.Qty += boxInfo2.Qty;
                //更新箱码库存表
                Db.Updateable(boxInfo).ExecuteCommand();
                //删除被合并箱码信息
                Db.Deleteable(boxInfo2).ExecuteCommand();
                //添加操作日志
                new OperationASNServer().AddLogOperationAsn("入库作业", "物料标签", boxNo, "编辑", $"将{boxNo2}箱码合并到了{boxNo}箱码中", userId);
                //提交事务
                Db.CommitTran();
            }
            catch (Exception e)
            {
                //回滚事务
                Db.RollbackTran();
                throw new Exception(e.Message);
            }
        }
        #endregion
        #region 数据归档