test
15 小时以前 b2fc93e15a14847141b0a0a8bd591b945c9fa0a3
Wms/WMS.BLL/BllPdaServer/PdaAsnServer.cs
@@ -25,6 +25,12 @@
using System.Security.Policy;
using Newtonsoft.Json; 
using Utility.Tools;
using Model.ModelDto.SysDto;
using Model.ModelVm.SysVm;
using System.Security.Cryptography.X509Certificates;
using AutoMapper.Configuration.Annotations;
using Utility;
using System.Diagnostics.Metrics;
namespace WMS.BLL.BllPdaServer
{
@@ -73,14 +79,15 @@
                else
                {
                    //从物料名称-批次中取出批次
                    int indexOfDash = model.LotNo.IndexOf("-");
                    int indexOfDash = model.LotNo.IndexOf("=>");
                    if (indexOfDash != -1)
                    {
                        model.LotNo = model.LotNo.Substring(indexOfDash + 1);
                        model.LotNo = model.LotNo.Substring(indexOfDash + 2);
                    }
                    else
                    {
                        throw new Exception("物料-批次不可为空!");
                        model.LotNo = "";
                        //throw new Exception("物料-批次不可为空!");
                    }
                }
@@ -105,7 +112,15 @@
                    throw new Exception("未查询到托盘信息,请核实!");
                }
                //验证入库单明细是否存在
                var detail = Db.Queryable<BllArrivalNoticeDetail>().First(m => m.IsDel == "0" && m.Id == model.AsnDetailId && m.ASNNo == model.AsnNo && m.LotNo.Contains(model.LotNo));
                var detail = new BllArrivalNoticeDetail();
                if (string.IsNullOrEmpty(model.LotNo))
                {
                    detail = Db.Queryable<BllArrivalNoticeDetail>().First(m => m.IsDel == "0" && m.Id == model.AsnDetailId && m.ASNNo == model.AsnNo);
                }
                else
                {
                    detail = Db.Queryable<BllArrivalNoticeDetail>().First(m => m.IsDel == "0" && m.Id == model.AsnDetailId && m.ASNNo == model.AsnNo && m.LotNo.Contains(model.LotNo));
                }
                if (detail == null)
                {
                    throw new Exception("当前物料及批次与单据无关联,请核实!");
@@ -127,13 +142,20 @@
                #region 包装 
                var sku = Db.Queryable<SysMaterials>().First(m => m.IsDel == "0" && m.SkuNo == detail.SkuNo);
                var pack = Db.Queryable<SysPackag>().First(m => m.IsDel == "0" && m.PackagNo == detail.PackagNo);
                if (sku == null)
                {
                    throw new Exception("当前物料信息不存在,请核实!");
                }
                var pack = Db.Queryable<SysPackag>().First(m => m.IsDel == "0" && m.PackagNo == sku.PackagNo);
                if (pack == null)
                {
                    throw new Exception("当前物料包装信息不存在,请核实!");
                }
                var pNum = 0;//托盘物品数量 
                var bNum = 0;//箱码物品数量 
                //公共方法获取包装数量
                new Common().GetPackQtyInfo(detail.PackagNo, ref pNum, ref bNum);
                new Common().GetPackQtyInfo(sku.PackagNo, ref pNum, ref bNum);
                #endregion
@@ -182,9 +204,9 @@
                //绑定箱总数量
                //model.SkuQty = boxInfoList.Sum(s => s.Qty);
                //和选择的批次同批次的箱码信息
                var sameBoxInfoList = boxInfoList.Where(w => w.LotNo == model.LotNo && w.Status == "0").ToList();
                var sameBoxInfoList = boxInfoList.Where(w => (w.LotNo ?? "") == model.LotNo && w.Status == "0").ToList();
                //和选择的批次不同批次的箱码信息(拼箱批次)
                var notBoxInfoList = boxInfoList.Where(w => w.LotNo != model.LotNo).ToList();
                var notBoxInfoList = boxInfoList.Where(w => (w.LotNo ?? "") != model.LotNo).ToList();
                #endregion
                if (sameBoxInfoList.Count <= 0)
@@ -295,7 +317,7 @@
                            InspectMark = bind.InspectMark,
                            InspectStatus = sku.IsInspect,
                            BitPalletMark = bind.BitPalletMark,
                            PackagNo = detail.PackagNo,                    //liudl 由sku的包装编号变为入库单明细的包装编码
                            PackagNo = sku.PackagNo,
                            IsBale = bind.IsBale,
                            IsBelt = bind.IsBelt,
@@ -354,7 +376,7 @@
                                continue;
                            }
                            //箱内物料批次与单据明细不符合
                            if (box.SkuNo != detail.SkuNo || box.LotNo != model.LotNo)
                            if (box.SkuNo != detail.SkuNo || (box.LotNo ?? "") != model.LotNo)
                            {
                                throw new Exception($"-1:{box.BoxNo}箱内物料及批次与单据不一致,请核实!");
                            }
@@ -527,7 +549,7 @@
                    #endregion
                    #region 质检请验
                    if ((notice.Type == "1" || notice.Type == "4" || notice.Type == "5") && sku.IsInspect != "1")
                    if ((notice.Type == "1" || notice.Type == "4" || notice.Type == "5") && sku.IsInspect != "1" && sku.IsControlled != "1")
                    {
                        var qualityRequest = Db.Queryable<BllQualityInspectionRequest>().First(m => m.IsDel == "0" && m.SkuNo == sku.SkuNo && m.LotNo == bind.LotNo && m.SupplierLot == bind.SupplierLot);
                        if (qualityRequest == null)
@@ -1043,7 +1065,7 @@
                        #endregion
                        #region 质检请验
                        if ((arrNotice.Type == "1" || arrNotice.Type == "4" || arrNotice.Type == "5") && sku.IsInspect != "1")
                        if ((arrNotice.Type == "1" || arrNotice.Type == "4" || arrNotice.Type == "5") && sku.IsInspect != "1" && sku.IsControlled != "1")
                        {
                            var qualityRequest = Db.Queryable<BllQualityInspectionRequest>().First(m => m.IsDel == "0" && m.SkuNo == sku.SkuNo && m.LotNo == bind.LotNo && m.SupplierLot == bind.SupplierLot);
                            if (qualityRequest == null)
@@ -1132,14 +1154,15 @@
                else
                {
                    //从物料名称-批次中取出批次
                    int indexOfDash = model.LotNo.IndexOf("-");
                    int indexOfDash = model.LotNo.IndexOf("=>");
                    if (indexOfDash != -1)
                    {
                        model.LotNo = model.LotNo.Substring(indexOfDash + 1);
                        model.LotNo = model.LotNo.Substring(indexOfDash + 2);
                    }
                    else
                    {
                        throw new Exception("物料批次不可为空!");
                        model.LotNo = "";
                        //throw new Exception("物料批次不可为空!");
                    }
                }
@@ -1157,7 +1180,7 @@
                }
                //判断托盘是否在库外
                var stockDetail = Db.Queryable<DataStockDetail>().First(m => m.IsDel == "0" && m.PalletNo == model.PalletNo);
                if (stockDetail != null && !string.IsNullOrEmpty(stockDetail.WareHouseNo))
                if (stockDetail != null && !string.IsNullOrEmpty(stockDetail.WareHouseNo) && stockDetail.WareHouseNo != "W04")
                {
                    throw new Exception("该托盘已有储位信息,请核实!");
                }
@@ -1171,12 +1194,20 @@
                #region 包装
                var sku = Db.Queryable<SysMaterials>().First(m => m.IsDel == "0" && m.SkuNo == detail.SkuNo);
                //var pack = Db.Queryable<SysPackag>().First(m => m.IsDel == "0" && m.PackagNo == detail.PackagNo);    // liudl 由Sku包装编号变更为入库单明细包装编号
                if (sku == null)
                {
                    throw new Exception("未查询到该物料信息,请核实!");
                }
                var pack = Db.Queryable<SysPackag>().First(m => m.IsDel == "0" && m.PackagNo == sku.PackagNo);
                if (pack == null)
                {
                    throw new Exception("未查询到该物料包装信息,请核实!");
                }
                var pNum = 0;//托盘物品数量 
                var bNum = 0;//箱码物品数量 
                //公共方法获取包装数量
                new Common().GetPackQtyInfo(detail.PackagNo, ref pNum, ref bNum);
                new Common().GetPackQtyInfo(sku.PackagNo, ref pNum, ref bNum);
                 
                #endregion
@@ -1333,7 +1364,7 @@
                        InspectMark = bind.InspectMark,
                        InspectStatus = inspectStatusStr,
                        BitPalletMark = bind.BitPalletMark,
                        PackagNo = detail.PackagNo,                    //liudl 由sku的包装编号变为入库单明细的包装编码
                        PackagNo = sku.PackagNo,                    //liudl 由sku的包装编号变为入库单明细的包装编码
                        IsBale = bind.IsBale,
                        IsBelt = bind.IsBelt,
@@ -1341,6 +1372,13 @@
                        CreateUser = 0,
                        CreateTime = comTime
                    };
                    if (stockDetail != null)
                    {
                        sd1.WareHouseNo = stockDetail.WareHouseNo;
                        sd1.AreaNo = stockDetail.AreaNo;
                        sd1.RoadwayNo = stockDetail.RoadwayNo;
                        sd1.LocatNo = stockDetail.LocatNo;
                    }
                    //维护库存明细货主/供应商信息 //0:成品入库,2:中间品入库,4:车间余料入库,6:代储入库,7:寄存入库
                    if (notice.Type == "0" || notice.Type == "2" || notice.Type == "4" || notice.Type == "6" || notice.Type == "7")
@@ -1493,7 +1531,7 @@
                #endregion
                #region 质检请验
                if ((notice.Type == "1" || notice.Type == "4" || notice.Type == "5") && sku.IsInspect != "1")
                if ((notice.Type == "1" || notice.Type == "4" || notice.Type == "5") && sku.IsInspect != "1" && sku.IsControlled != "1")
                {
                    var qualityRequest = Db.Queryable<BllQualityInspectionRequest>().First(m => m.IsDel == "0" && m.SkuNo == sku.SkuNo && m.LotNo == bind.LotNo && m.SupplierLot == bind.SupplierLot);
                    if (qualityRequest == null)
@@ -2044,7 +2082,7 @@
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public List<BoxInfoDto> GetFMBindBoxInfos(string boxno,string url)
        /*public List<BoxInfoDto> GetFMBindBoxInfos(string boxno,string url)
        {
            try
            {
@@ -2147,6 +2185,132 @@
            {
                throw ex;
            }
        }*/
        public List<BoxInfoDto> GetFMBindBoxInfos(string boxno, string url)
        {
            try
            {
                #region 箱码请求接口,正式系统放开
                var data = new
                {
                    BoxNo = boxno
                };
                var jsonData = JsonConvert.SerializeObject(data);
                var response = HttpHelper.DoPost(url, jsonData, "箱码信息请求", "FM");
                var obj = JsonConvert.DeserializeObject<FuMaPostModel>(response);//解析返回数据
                if (obj.Success != true)
                {
                    throw new Exception("请求失败" + obj.Message);
                }
                #endregion
                if (string.IsNullOrEmpty(obj.Data.SkuNo))
                {
                    //测试用,发布正式前删除此段代码
                    //obj.Data.SkuNo = "50004632";
                    throw new Exception($"物料编码不能为空");
                }
                //查找物料信息
                var sku = Db.Queryable<SysMaterials>().First(m => m.SkuNo == obj.Data.SkuNo);
                if (sku == null)
                {
                    throw new Exception($"未查询到物料{obj.Data.SkuNo}信息");
                }
                var pNum = 0;//托盘物品数量
                var bNum = 0;//箱码物品数量
                //获取包装信息
                new Common().GetPackQtyInfo(sku.PackagNo, ref pNum, ref bNum);
                if (pNum == 0 || bNum == 0)
                {
                    throw new Exception($"{sku.SkuNo}物品包装未找到!");
                }
                var boxList = new List<BllBoxInfo>();
                var comTime = DateTime.Now;
                //添加箱码信息
                foreach (var box in obj.Data.DetailList)
                {
                    foreach (var box2 in box.DetailList2)
                    {
                        var boxInfo = new BllBoxInfo()
                        {
                            BoxNo = obj.Data.BoxNo,
                            BoxNo2 = box.BoxNo2,
                            BoxNo3 = box2.BoxNo3,
                            Qty = obj.Data.Qty,
                            BitBoxMark = obj.Data.BitBoxMark,
                            ASNNo = "",
                            //ASNDetailNo = noticeDetail.Id,
                            OrderCode = "",//notice.OrderCode
                                           //BindNo = bindId,
                                           //PalletNo = model.PallNo,
                            FullQty = bNum,
                            Status = "0",
                            SkuNo = sku.SkuNo,
                            SkuName = sku.SkuName,
                            LotNo = box2.LotNo,
                            LotText = obj.Data.LotNoBoxNum,
                            ProductionTime = DateTime.Parse(box2.ProductionTime),
                            ExpirationTime = DateTime.Parse(box2.ExpirationTime),
                            //CompleteTime = "",
                            InspectMark = "0",
                            InspectStatus = "0",
                            Origin = "赋码",
                            CreateTime = comTime,
                            CreateUser = 0
                        };
                        boxList.Add(boxInfo);
                    };
                }
                try
                {
                    //开启事务
                    Db.BeginTran();
                    Db.Fastest<BllBoxInfo>().BulkCopy(boxList);
                    //提交事务
                    Db.CommitTran();
                }
                catch (Exception ex)
                {
                    //回滚事务
                    Db.RollbackTran();
                    throw new Exception("插入箱码失败:" + ex.Message);
                }
                string sqlString = $@"SELECT
                                        ASNNo,
                                        BoxNo,
                                        SkuNo,
                                        SkuName,
                                        LotNo,
                                        BitBoxMark,
                                        SUM(Qty) as Qty
                                      FROM BllBoxInfo
                                      WHERE IsDel = '0'
                                        AND Status='0'
                                        AND BoxNo = '{boxno}'
                                      GROUP BY ASNNo,BoxNo,SkuNo,SkuName,LotNo,BitBoxMark; ";
                var models = Db.Ado.SqlQuery<BoxInfoDto>(sqlString);
                if (models.Count == 0)
                {
                    throw new Exception("箱码信息不存在!");
                }
                return models;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        /// <summary>
@@ -2222,15 +2386,17 @@
                };
                //获取状态是未组托的标签信息
                var models = Db.Queryable<BllBoxInfo>().Where(m => m.IsDel == "0" && m.ASNNo == asnNo && m.ASNDetailNo == asnDetailId ).GroupBy(m=> new { m.ProductionTime,m.ExpirationTime }).Select(m=>new { m.ProductionTime ,m.ExpirationTime}).OrderBy(m=>m.ProductionTime).ToList();//&& m.Status == "0"
                var models = Db.Queryable<BllBoxInfo>().Where(m => m.IsDel == "0" && m.ASNNo == asnNo && m.ASNDetailNo == asnDetailId && m.Status == "0")
                    .GroupBy(m=> new { m.ProductionTime,m.ExpirationTime })
                    .Select(m=>new { m.ProductionTime ,m.ExpirationTime}).OrderBy(m=>m.ProductionTime).ToList();//&& m.Status == "0"
                foreach (var item in models)
                {
                    var boxNoList = Db.Queryable<BllBoxInfo>().Where(m => m.IsDel == "0" && m.ASNNo == asnNo && m.ASNDetailNo == asnDetailId && m.ProductionTime == item.ProductionTime).Select(m => m.BoxNo).ToList();
                    var boxNoList = Db.Queryable<BllBoxInfo>().Where(m => m.IsDel == "0" && m.Status == "0" && m.ASNNo == asnNo && m.ASNDetailNo == asnDetailId && m.ProductionTime == item.ProductionTime).Select(m => m.BoxNo).ToList();
                    if (boxNoList.Count > 0)
                    {
                        data.BoxNoList = boxNoList;
                        data.Date1 = item.ProductionTime.ToString();
                        data.Date2 = item.ExpirationTime.ToString();
                        data.Date1 = item.ProductionTime == null ? "" : Convert.ToDateTime(item.ProductionTime).ToString("yyyy-MM-dd");
                        data.Date2 = item.ExpirationTime == null ? "" : Convert.ToDateTime(item.ExpirationTime).ToString("yyyy-MM-dd");
                        break;
                    }
@@ -2444,7 +2610,7 @@
            }
        }
        // 车间绑定托盘-贴标
        public void ChejianIn(string palletNo,string boxNo,decimal qty,string areaNo,int userId)
        {
            try
@@ -2530,9 +2696,15 @@
                }
                else
                {
                    var sd2 = Db.Queryable<DataStockDetail>().Where(m => m.PalletNo == palletNo && m.IsDel == "0" && !string.IsNullOrWhiteSpace(m.AreaNo));
                    if (sd2.Count(m=>m.AreaNo!= areaNo) > 0)
                    {
                        throw new Exception("当前托盘位置与选择的不同,请核实");
                    }
                    // 库存不存在 插入数据
                    sd1 = new DataStockDetail()
                    {
                        ASNNo = "",
                        LotNo = boxInfoOne.LotNo,
                        LotText = boxInfoOne.LotText,
                        SupplierLot = boxInfoOne.SupplierLot,
@@ -2629,6 +2801,22 @@
                        //添加库存箱码明细
                        Db.Insertable(box2).ExecuteCommand();
                        #endregion
                        #region  插入车间出入库记录表
                        //插入入库日志
                        var _log = new LogWorkShop
                        {
                            Type = "0",//类型,0:入库 1:出库
                            PalletNo = palletNo,
                            BoxNo=box.BoxNo,
                            LotNo=box.LotNo,
                            SkuNo=box.SkuNo,
                            SkuName=box.SkuName,
                            Qty=box.Qty
                        };
                        //添加库存箱码明细
                        Db.Insertable(_log).ExecuteCommand();
                        #endregion
                    }
                    if (boxFullQty > bNum)
                    {
@@ -2637,7 +2825,6 @@
                }
                //更改箱支关系表信息
                Db.Updateable(boxInfoList).ExecuteCommand();
                #region 库存
                var dataStock = Db.Queryable<DataStock>().First(m => m.IsDel == "0" && m.SkuNo == sku.SkuNo && m.LotNo == boxInfoOne.LotNo);
@@ -2667,11 +2854,12 @@
                }
                #endregion
                // 更改托盘使用状态
                var sqlStr = $"update SysPallets set Status = '1' where PalletNo = '{palletNo}';";
                ////添加托盘记录表数据
                //sqlStr += $"insert into LogPalletTrack values('{palletNo}','{boxNo}','组盘','0',getDate(),{userId},NULL,NULL);";
                //Db.Ado.ExecuteCommand(sqlStr);
                Db.Ado.ExecuteCommand(sqlStr);
                new OperationASNServer().AddLogOperationAsn("PDA模块", "车间入库", boxNo, "添加", $"添加了托盘码为:{palletNo}、{msgStr}的入库信息", userId);
                //提交事务
@@ -2737,8 +2925,6 @@
                new Common().GetPackQtyInfo(pack.PackagNo, ref pNum, ref bNum);
                #endregion
                #region 库存明细
@@ -2813,7 +2999,6 @@
                // 更改箱支关系表
                decimal factQty = 0.00m;//托盘总数量
                #region 库存
                var dataStock = Db.Queryable<DataStock>().First(m => m.IsDel == "0" && m.SkuNo == skuInfo.SkuNo && m.LotNo == lotNo);
                if (dataStock != null)
@@ -2842,6 +3027,21 @@
                }
                #endregion
                #region
                //插入入库日志
                var _log = new LogWorkShop
                {
                    Type = "0",//类型,0:入库 1:出库
                    PalletNo = palletNo,
                    BoxNo = "",
                    LotNo = lotNo,
                    SkuNo = sd1.SkuNo,
                    SkuName = sd1.SkuName,
                    Qty = qty
                };
                //添加库存箱码明细
                Db.Insertable(_log).ExecuteCommand();
                #endregion
                // 更改托盘使用状态
                var sqlStr = $"update SysPallets set Status = '1' where PalletNo = '{palletNo}';";
                ////添加托盘记录表数据
@@ -2862,13 +3062,6 @@
        }
        #endregion
        // 获取单据列表
        public List<ArrivalNoticeDto> GetArrivalNotices(ArrivalNoticeVm model)
        {
@@ -2903,11 +3096,6 @@
                throw ex;
            }
        }
        // 根据箱码或托盘号获取箱支信息   liudl 
        public List<BoxInfoDto> GetBoxInfos(BoxInfoVm model)
@@ -4256,10 +4444,18 @@
            try
            {
                string strMsg = "";
                var storageLocat = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.LocatNo == locatNo && w.Status == "0" && w.WareHouseNo == "W04");
                var storageLocat = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.LocatNo == locatNo && w.WareHouseNo == "W04");
                if (storageLocat == null)
                {
                    throw new Exception("-1:地码(储位信息)不存在或非空闲状态,请核查!");
                    throw new Exception("-1:地码(储位信息)不存在,请核查!");
                }
                if (storageLocat.Status != "0")
                {
                    var detailInfo = Db.Queryable<DataStockDetail>().First(w => w.IsDel == "0" && w.LocatNo == storageLocat.LocatNo);
                    if (detailInfo != null)
                    {
                        throw new Exception("-1:地码(储位信息)非空闲,请核查!");
                    }
                }
                return strMsg;
@@ -5964,7 +6160,7 @@
                #endregion
                #region 质检请验
                if ((notice.Type == "1" || notice.Type == "4" || notice.Type == "5") && sku.IsInspect != "1")
                if ((notice.Type == "1" || notice.Type == "4" || notice.Type == "5") && sku.IsInspect != "1"  && sku.IsControlled != "1")
                {
                    var qualityRequest = Db.Queryable<BllQualityInspectionRequest>().First(m => m.IsDel == "0" && m.SkuNo == sku.SkuNo && m.LotNo == bind.LotNo && m.SupplierLot == bind.SupplierLot);
                    if (qualityRequest == null)
@@ -6043,9 +6239,12 @@
                {
                    foreach (var item in stockDetail)
                    {
                        if (!string.IsNullOrEmpty(item.WareHouseNo))
                        if (!string.IsNullOrEmpty(item.WareHouseNo) && !string.IsNullOrEmpty(item.AreaNo))
                        {
                            throw new Exception("该托盘未在库外,请核查!");
                            if (item.AreaNo != "B06" && item.AreaNo != "B07" && item.AreaNo != "B09")
                            {
                                throw new Exception("该托盘未在库外,请核查!");
                            }
                        }
                    }
                    iscount = 1; //回流入库
@@ -6053,10 +6252,18 @@
                #endregion
                #region 地码信息(储位信息)
                var storageLocat = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.LocatNo == model.LocatNo && w.Status == "0");
                var storageLocat = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.LocatNo == model.LocatNo);
                if (storageLocat == null)
                {
                    throw new Exception("储位信息不存在或非空闲状态,请核查!");
                    throw new Exception("储位信息不存,请核查!");
                }
                if (storageLocat.Status != "0")
                {
                    var detailInfo=Db.Queryable<DataStockDetail>().First(w => w.IsDel == "0" && w.LocatNo == storageLocat.LocatNo);
                    if (detailInfo != null)
                    {
                        throw new Exception("储位不是空闲状态,请核查!");
                    }
                }
                #endregion
@@ -6482,6 +6689,113 @@
        }
        #endregion
        #region 仓库收货
        /// <summary>
        /// 仓库确认收货
        /// </summary>
        /// <param name="model"></param>
        public void ConfirmTakeOf(string palletNo,int userId)
        {
            try
            {
                #region 验证信息
                if (string.IsNullOrEmpty(palletNo))
                {
                    throw new Exception("托盘条码不能为空!");
                }
                //获取托盘信息
                var pallet = Db.Queryable<SysPallets>().First(w => w.IsDel == "0" && w.PalletNo == palletNo);
                //验证托盘信息是否为空
                if (pallet == null)
                {
                    throw new Exception("托盘信息不存在,请检查!");
                }
                if (pallet.Status == "0")
                {
                    throw new Exception("托盘未使用,请检查!");
                }
                #endregion
                //获取库存明细信息
                var stockDetailList = Db.Queryable<DataStockDetail>().Where(s => s.IsDel == "0" && s.PalletNo == palletNo).ToList();
                //验证库存明细信息是否存在
                if (stockDetailList.Count<=0)
                {
                    throw new Exception("库存明细不存在,请检查库存信息!");
                }
                //开启事务
                Db.BeginTran();
                foreach (var item in stockDetailList)
                {
                    //if (item.AreaNo != "B06" && item.AreaNo != "B07" && item.AreaNo != "B09")
                    //{
                    //    throw new Exception("该托盘非线边回库托盘!");
                    //}
                    //库存总表
                    var stock = Db.Queryable<DataStock>().First(w => w.IsDel == "0" && w.SkuNo == item.SkuNo && w.LotNo == item.LotNo);
                    if (stock == null)
                    {
                        throw new Exception($"未查询到该托盘上物料编码为:{item.SkuNo}的库存信息!");
                    }
                    var boxInfoList = Db.Queryable<DataBoxInfo>().Where(w => w.IsDel == "0" && w.PalletNo == palletNo && w.SkuNo == item.SkuNo && w.LotNo == item.LotNo).ToList();
                    if (boxInfoList.Count > 0)
                    {
                        foreach (var box in boxInfoList)
                        {
                            var bllBox = Db.Queryable<BllBoxInfo>().First(w => w.IsDel == "0" && w.Status != "0" && w.BoxNo == box.BoxNo);
                            if (bllBox != null)
                            {
                                bllBox.Status = "0";
                                bllBox.ASNDetailNo = null;
                                bllBox.BindNo = null;
                                bllBox.PalletNo = "";
                                //更新箱支明细表
                                Db.Updateable(bllBox).ExecuteCommand();
                            }
                        }
                        //删除库存箱码信息
                        Db.Deleteable(boxInfoList).ExecuteCommand();
                    }
                    //删除或修改库存
                    stock.Qty -= (decimal)item.Qty;
                    if (stock.Qty <= 0)
                    {
                        Db.Deleteable(stock).ExecuteCommand();
                    }
                    else
                    {
                        Db.Updateable(stock).ExecuteCommand();
                    }
                    //删除库存明细
                    Db.Deleteable(item).ExecuteCommand();
                    //判断托盘上还有没有其他物料
                    var palletData = Db.Queryable<DataStockDetail>().First(w => w.IsDel == "0" && w.PalletNo == palletNo && w.Id != item.Id);
                    if (palletData == null)
                    {
                        pallet.Status = "0";
                        Db.Updateable(pallet).ExecuteCommand();
                    }
                }
                new OperationASNServer().AddLogOperationAsn("PDA模块", "仓库收货", palletNo, "完成", $"在PDA上完成托盘码为:{palletNo}的仓库收货操作", userId);
                //提交事务
                Db.CommitTran();
            }
            catch (Exception ex)
            {
                //回滚事务
                Db.RollbackTran();
                throw ex;
            }
        }
        #endregion
        #region JC23取样业务接口
        //获取未组托或已组托的箱码级别
@@ -6806,5 +7120,359 @@
        #endregion
        #region 线边标签
        /// <summary>
        /// 根据物料编码、名称获取物料信息
        /// </summary>
        /// <param name="model">编码 名称</param>
        /// <returns>物料详细信息</returns>
        public MaterialsDto GetSkuInfo(GetMaterialsVm model)
        {
            try
            {
                if (string.IsNullOrEmpty(model.SkuNo) && string.IsNullOrEmpty(model.SkuName))
                {
                    throw new Exception("请输入物料编码或物料名称!");
                }
                var skuModels = Db.Queryable<SysMaterials>().Where(m => (m.SkuNo == model.SkuNo || m.SkuName == model.SkuName) && m.IsDel == "0").Select< MaterialsDto>().ToList();
                if (skuModels.Count <= 0)
                {
                    throw new Exception("物料不存在!");
                }
                return skuModels.First();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        /// <summary>
        /// 生成条码标签
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        /// <exception cref="Exception"></exception>
        public List<BllBoxInfo> AddLabels(LabelsVm model)
        {
            try
            {
                if (decimal.TryParse(model.SkuNum, out decimal skuQty))
                {
                    if (skuQty <= 0)
                    {
                        throw new Exception("箱内数量不能小于等于0");
                    }
                }
                else
                {
                    throw new Exception("箱内数量请输入数字!");
                }
                // 验证物料信息是否存在
                var skuModels = Db.Queryable<SysMaterials>().Where(m => (m.SkuNo == model.SkuNo || m.SkuName == model.SkuName) && m.IsDel == "0").Select<MaterialsDto>().ToList();
                if (skuModels.Count <= 0)
                {
                    throw new Exception("物料不存在!");
                }
                #region
                var skuModel = skuModels.First();
                var pack = Db.Queryable<SysPackag>().First(m => m.IsDel == "0" && m.PackagNo == skuModel.PackagNo);
                if (pack == null)
                {
                    throw new Exception("未查询到当前物料的包装信息");
                }
                var packStr = "";
                if (!string.IsNullOrWhiteSpace(pack.L1Name))
                {
                    packStr += pack.L1Num + "/" + pack.L1Name;
                }
                if (!string.IsNullOrWhiteSpace(pack.L2Name))
                {
                    packStr += "-" + pack.L2Num + "/" + pack.L2Name;
                }
                if (!string.IsNullOrWhiteSpace(pack.L3Name))
                {
                    packStr += "-" + pack.L3Num + "/" + pack.L3Name;
                }
                if (!string.IsNullOrWhiteSpace(pack.L4Name))
                {
                    packStr += "-" + pack.L4Num + "/" + pack.L4Name;
                }
                if (!string.IsNullOrWhiteSpace(pack.L5Name))
                {
                    packStr += "-" + pack.L5Num + "/" + pack.L5Name;
                }
                #endregion
                #region 包装查询
                var bNum = 0;//箱物品数量
                var zNum = 0;//支物品数量
                var packLevel = 0;
                if (pack.L2Num.HasValue)
                {
                    if (pack.L2Name != "托")
                    {
                        packLevel = 1;//JC34项目只有一级标签
                        bNum = Convert.ToInt32(pack.L2Num);
                    }
                }
                if (pack.L1Num.HasValue)
                {
                    if (packLevel == 0)
                    {
                        packLevel = 1;
                        bNum = Convert.ToInt32(pack.L1Num);
                    }
                    zNum = Convert.ToInt32(pack.L1Num);
                }
                if (packLevel < 1)//包装等级小于1,按照1级标签打印
                {
                    throw new Exception("包装信息有误,小于一级");
                }
                if (skuQty > bNum * 5)
                {
                    throw new Exception("箱内数量大于包装5倍,不可打印");
                }
                #endregion
                var modelList = new List<BllBoxInfo>();
                var label = Db.Queryable<BllBoxInfo>().Where(m => m.LotNo == model.LotNo && m.SkuNo == model.SkuNo && m.IsDel == "0").ToList();
                Db.BeginTran();
                if (packLevel == 1)
                {
                    #region 一级包装
                    int labelNum = 1;
                    labelNum = int.Parse(Math.Ceiling(skuQty / bNum).ToString());//标签数量
                    #region 获取/生成批次号
                    string maxLotNoStr = ""; //批次号
                    string maxBoxCode = ""; //箱码号
                    maxLotNoStr = model.LotNo;
                    maxBoxCode = label.Where(m => m.LotNo == maxLotNoStr).Max(a => a.BoxNo);
                    #endregion
                    for (int i = 1; i <= labelNum; i++)
                    {
                        decimal boxQty = 0;
                        if (i == labelNum)
                        {
                            // 最后一个条码
                            var s = bNum * (i - 1);
                            if (bNum > skuQty - s)
                            {
                                boxQty = skuQty - s;// 数量
                            }
                            else
                            {
                                boxQty = bNum;// 数量
                            }
                        }
                        else
                        {
                            boxQty = bNum;         // 数量
                        }
                        //获取箱码
                        if (string.IsNullOrWhiteSpace(maxBoxCode))
                        {
                            var str = "B" + maxLotNoStr + "000001"; //批号+ 流水  B 230201 0001  000001
                            maxBoxCode = str;
                        }
                        else
                        {
                            maxBoxCode = maxBoxCode.Substring(0, maxBoxCode.Length - 6) + (int.Parse(maxBoxCode.Substring(maxBoxCode.Length - 6, 6)) + 1).ToString().PadLeft(6, '0');
                        }
                        // 将条码保存到原料条码表
                        var labelModel = new BllBoxInfo()
                        {
                            BoxNo = maxBoxCode,
                            Qty = boxQty,
                            FullQty = bNum,
                            Status = "0",
                            SkuNo = model.SkuNo,
                            SkuName = model.SkuName,
                            LotNo = maxLotNoStr,
                            Standard = skuModel.Standard,
                            PackageStandard = packStr,
                            InspectMark = "0",
                            BitBoxMark = bNum > boxQty ? "1" : "0",
                            InspectStatus = "0",
                            ProductionTime = DateTime.Parse(model.TimeFrom),
                            StoreTime = DateTime.Parse(model.TimeEnd),
                            ExpirationTime = DateTime.Parse(model.TimeEnd),
                            Origin = "WMS生成",
                            CreateUser = (int)model.userId,
                            CreateTime = DateTime.Now,
                        };
                        Db.Insertable(labelModel).ExecuteCommand();
                        modelList.Add(labelModel);
                    }
                    #endregion
                }
                else //(packLevel == 2)
                {
                    #region 二级包装
                    if (skuQty > bNum * 5)
                    {
                        throw new Exception("箱内数量大于包装5倍,不可打印");
                    }
                    var qty2 = skuQty;
                    int labelNum2 = 1; //生产箱条码数量
                    labelNum2 = int.Parse(Math.Ceiling(qty2 / bNum).ToString());
                    var ss = bNum / zNum; //每箱支标签数量
                    var labelNumZ2 = Math.Ceiling((decimal)ss);
                    #region 获取/生成批次号
                    string maxCodestr2 = "";    //批次
                    string maxboxcode2 = "";    //箱码
                    string maxboxcode3 = "";    //支码
                    maxCodestr2 = model.LotNo;
                    maxboxcode2 = label.Where(m => m.LotNo == maxCodestr2).Max(a => a.BoxNo);
                    maxboxcode3 = label.Where(m => m.LotNo == maxCodestr2).Max(a => a.BoxNo3);//支号
                    #endregion
                    for (int i = 1; i <= labelNum2; i++)//箱码标签
                    {
                        //箱内数量
                        decimal boxQty = 0;
                        if (i == labelNum2)
                        {
                            // 最后一个条码
                            var s = bNum * (i - 1);
                            if (bNum > qty2 - s)
                            {
                                boxQty = qty2 - s;// 数量
                            }
                            else
                            {
                                boxQty = bNum;// 数量
                            }
                        }
                        else
                        {
                            boxQty = bNum;                                                         // 数量
                        }
                        //获取箱码
                        if (string.IsNullOrWhiteSpace(maxboxcode2))
                        {
                            maxboxcode2 = "B" + maxCodestr2 + "000001"; // 箱号     批号+第几箱
                        }
                        else
                        {
                            maxboxcode2 = maxboxcode2.Substring(0, 11) + (int.Parse(maxboxcode2.Substring(11, 6)) + 1).ToString().PadLeft(6, '0');
                        }
                        //获取箱内支标签数量
                        if (i == labelNum2)
                        {
                            var isGo2 = false;
                            var sl = 0;
                            for (int j = 1; j <= labelNumZ2; j++)
                            {
                                if (isGo2)
                                {
                                    break;
                                }
                                var s = bNum * (i - 1);
                                var s2 = zNum * (j - 1);
                                if (zNum >= qty2 - s - s2)
                                {
                                    isGo2 = true;
                                }
                                sl++;
                            }
                            labelNumZ2 = sl;
                        }
                        for (int j = 1; j <= labelNumZ2; j++)//最小单位标签
                        {
                            decimal d = zNum;
                            if (i == labelNum2)
                            {
                                var s = bNum * (i - 1);
                                var s2 = zNum * (j - 1);
                                if (zNum >= qty2 - s - s2)
                                {
                                    d = qty2 - s - s2;    // 数量
                                }
                            }
                            if (string.IsNullOrWhiteSpace(maxboxcode3))
                            {
                                maxboxcode3 = "Z" + maxCodestr2 + "0001"; // 支号     批号+第几箱
                            }
                            else
                            {
                                maxboxcode3 = maxboxcode3.Substring(0, 11) + (int.Parse(maxboxcode3.Substring(11, 4)) + 1).ToString().PadLeft(4, '0');
                            }
                            // 将条码保存到原料条码表
                            var labelModel = new BllBoxInfo()
                            {
                                BoxNo = maxboxcode2,
                                BoxNo3 = maxboxcode3,
                                Qty = d,
                                FullQty = bNum,
                                Status = "0",
                                SkuNo = model.SkuNo,
                                SkuName = skuModel.SkuName,
                                LotNo = maxCodestr2,
                                Standard = skuModel.Standard,
                                PackageStandard = packStr,
                                InspectMark = "0",
                                BitBoxMark = bNum > boxQty ? "1" : "0",
                                InspectStatus = "0",
                                ProductionTime = DateTime.Parse(model.TimeFrom),
                                StoreTime = DateTime.Parse(model.TimeEnd),
                                ExpirationTime = DateTime.Parse(model.TimeEnd),
                                Origin = "WMS生成",
                                CreateUser = (int)model.userId,
                                CreateTime = DateTime.Now,
                            };
                            Db.Insertable(labelModel).ExecuteCommand();
                            modelList.Add(labelModel);
                        }
                    }
                    #endregion
                }
                Db.CommitTran();
                return modelList;
            }
            catch (Exception ex)
            {
                Db.RollbackTran();
                throw new Exception(ex.Message);
            }
        }
        #endregion
    }
}