Administrator
2024-03-20 84d3536c00c9a77f5713eb2213c1723349d70ee7
Wms/WMS.BLL/BllPdaServer/PdaSoServer.cs
@@ -341,7 +341,6 @@
            {
                throw new Exception(e.Message);
            }
            throw new NotImplementedException();
        }
        //出库pda拣货
@@ -410,6 +409,7 @@
                    throw new Exception("未查询到该托盘分配的库存信息!");
                }
                #endregion
                if (string.IsNullOrWhiteSpace(boxNo))//整托拣货
                {
                    List<DataBoxInfo> boxInfos;
@@ -470,6 +470,7 @@
                    //修改出库分配信息
                    allot.CompleteQty += pickQty;
                    allot.Status = allot.Qty == allot.CompleteQty ? "5" : "3";
                    allot.UpdateTime = DateTime.Now;
                    Db.Updateable(allot).ExecuteCommand();
                    //删除库存明细
                    Db.Deleteable(stockDetail).ExecuteCommand();
@@ -515,6 +516,8 @@
                        throw new Exception("未查询到该箱码及追溯码的信息");
                    }
                    boxInfos = boxInfo.ToList();
                    var comDetailList = Db.Queryable<BllCompleteDetail>().Where(m => m.IsDel == "0" && m.ExportAllotId == allot.Id && m.PalletNo == palletNo).ToList();
                    if (!string.IsNullOrWhiteSpace(boxNo3)) //散支拣货
                    {
                        boxInfos = boxInfos.Where(m => m.BoxNo3 == boxNo3).ToList();
@@ -536,6 +539,14 @@
                        if (boxQty > needQty)
                        {
                            throw new Exception("拣货数量不能大于剩余待拣数量");
                        }
                        foreach (var item in boxInfos)
                        {
                            if (biaoShi != "2" && comDetailList.Any(m => m.BoxNo3 == item.BoxNo3))
                            {
                                throw new Exception($"当前{item.BoxNo}中{item.BoxNo3}已拣货完成,请勿重复拣货");
                            }
                        }
                        biaoShi = "1";
@@ -573,16 +584,20 @@
                        {
                            throw new Exception("拣货数量不能大于箱内剩余待拣数量");
                        }
                        foreach (var item in boxInfos)
                        {
                            if (biaoShi != "2" && comDetailList.Any(m => m.BoxNo == item.BoxNo))
                            {
                                throw new Exception($"当前{item.BoxNo}已拣货完成,请勿重复拣货");
                            }
                        }
                    }
                    var pickQty = 0;//拣货的数量
                    var comDetailList = Db.Queryable<BllCompleteDetail>().Where(m => m.IsDel == "0" && m.ExportAllotId == allot.Id && m.PalletNo == palletNo).ToList();
                    var comList = new List<BllCompleteDetail>();
                    foreach (var item in boxInfos)
                    {
                        if (biaoShi != "2" && comDetailList.Any(m => m.BoxNo3 == item.BoxNo3))
                        {
                            throw new Exception($"当前{item.BoxNo}中{item.BoxNo3}已拣货完成,请勿重复拣货");
                        }
                        //添加拣货明细
                        var completeDetail = new BllCompleteDetail()
                        {
@@ -643,6 +658,7 @@
                    //修改出库分配信息
                    allot.CompleteQty += pickQty;
                    allot.Status = allot.Qty == allot.CompleteQty ? "5" : "3";
                    allot.UpdateTime = DateTime.Now;
                    if (allot.Status == "5")
                    {
                        //判断该托盘是否还存在物料 存在改为待回库 待回库完成后改为已完成
@@ -842,6 +858,7 @@
                //修改出库分配信息
                allot.CompleteQty += int.Parse(PickQty);
                allot.Status = allot.Qty == allot.CompleteQty ? "5" : "3";
                allot.UpdateTime = DateTime.Now;
                Db.Updateable(allot).ExecuteCommand();
                int isDel = 0;
@@ -1314,6 +1331,7 @@
                }
                else
                {
                    //判断当前托盘是否是在平库或库外
                    type = "1";//库前取样
                }
                return type;
@@ -1350,6 +1368,1887 @@
            }
        }
        //取样出库拣货(标签)
        public void SampleSoSetPick(string soType,string soNo, string soDetailId, string palletNo, string boxNo, string boxNo3, string pickQty1, string asnNo, int userId)
        {
            Db.BeginTran();
            try
            {
                if (string.IsNullOrWhiteSpace(soType))
                {
                    throw new Exception("取样标识不能为空");
                }
                //soType: 0库内取样,有出库单及分配信息; 1库前取样,反向添加出库单及分配信息
                if (soType == "1")
                {
                    #region 判断
                    if (string.IsNullOrWhiteSpace(asnNo))
                    {
                        throw new Exception("入库单不能为空");
                    }
                    if (string.IsNullOrWhiteSpace(palletNo))
                    {
                        throw new Exception("托盘码不能为空");
                    }
                    if (!string.IsNullOrEmpty(boxNo3) && !string.IsNullOrEmpty(pickQty1) && int.Parse(pickQty1) > 0)
                    {
                        throw new Exception("追溯条码和拣货数量不能同时输入");
                    }
                    //先判断是否是库外取样托盘
                    var allot = Db.Queryable<BllExportAllot>().First(m =>
                        m.IsDel == "0" && m.PalletNo == palletNo && m.Status != "5" && m.Status != "6");
                    if (allot != null)
                    {
                        throw new Exception("当前托盘不属于库前取样");
                    }
                    //库存明细
                    var stockDetail = Db.Queryable<DataStockDetail>().First(m => m.IsDel == "0" && m.ASNNo == asnNo && m.PalletNo == palletNo);
                    if (stockDetail == null)
                    {
                        throw new Exception("未查询到该托盘的库存明细信息!");
                    }
                    var sku = Db.Queryable<SysMaterials>().First(m=>m.IsDel == "0" && m.SkuNo == stockDetail.SkuNo);
                    if (sku == null)
                    {
                        throw new Exception("未查询到当前托盘上的物料信息");
                    }
                    //库存总表
                    var stock = Db.Queryable<DataStock>().First(a => a.IsDel == "0" && a.SkuNo == stockDetail.SkuNo && a.LotNo == stockDetail.LotNo);
                    if (stock == null)
                    {
                        throw new Exception("未查询到该托盘分配的库存信息!");
                    }
                    //出库单
                    var notice = Db.Queryable<BllExportNotice>().First(m => m.IsDel == "0" && m.AsnSampleNo == asnNo);
                    //创建出库单
                    if (notice == null ||  notice.Status == "6")
                    {
                        var billNo = "";
                        var bl = true;
                        do
                        {
                            //获取自增单据号
                            billNo = new Common().GetMaxNo("SO");
                            var no = billNo;
                            bl = Db.Queryable<BllExportNotice>().Any(m => m.SONo == no);
                        } while (bl);
                        var addNotice = new BllExportNotice()
                        {
                            SONo = billNo,
                            Type = "3",
                            Status = "4",
                            Origin = "WMS",
                            AsnSampleNo = asnNo,
                            IsWave = "0",
                            WaveNo = "",
                            IsDespatch = "0",
                            CompleteTime = DateTime.Now,
                            CreateUser = userId,
                        };
                        var n = Db.Insertable(addNotice).ExecuteReturnEntity();
                        notice = n;
                    }
                    //创建出库单明细
                    var noticeDetail = Db.Queryable<BllExportNoticeDetail>().First(m => m.IsDel == "0" && m.SONo == notice.SONo && m.SkuNo == stockDetail.SkuNo && m.LotNo.Contains(stockDetail.LotNo));
                    if (noticeDetail == null)
                    {
                        var addNoticeDetail = new BllExportNoticeDetail()
                        {
                            SONo = notice.SONo,
                            SkuNo = sku.SkuNo,
                            SkuName = sku.SkuName,
                            Standard = sku.Standard,
                            LotNo = stockDetail.LotNo,
                            LotText = "",
                            Qty = 0,
                            AllotQty = 0,
                            FactQty = 0,
                            CompleteQty = 0,
                            PackagNo = sku.PackagNo,
                            Price = sku.Price,
                            //Money = string.IsNullOrWhiteSpace(sku.Price.ToString()) ? null : sku.Price * pickQty,
                            IsBale = "",
                            IsBelt = "",
                            SupplierLot = stock.SupplierLot,
                            IsWave = "0",
                            WaveNo = "",
                            IsIssueLotNo = "0",
                            Status = "3",
                            CreateUser = userId,
                        };
                        var m = Db.Insertable(addNoticeDetail).ExecuteReturnEntity();
                        noticeDetail = m;
                    }
                    //出库分配信息
                    var allot2 = Db.Queryable<BllExportAllot>().First(m => m.IsDel == "0" && m.Status == "5" && m.SONo == notice.SONo && m.PalletNo == palletNo);
                    if (allot2 == null)
                    {
                        //添加分配表信息
                        var addAllot = new BllExportAllot
                        {
                            SONo = notice.SONo,
                            WaveNo = "",
                            SODetailNo = noticeDetail.Id,
                            StockId = stockDetail.Id,
                            LotNo = stockDetail.LotNo,
                            LotText = stockDetail.LotText,
                            SupplierLot = stockDetail.SupplierLot,
                            SkuNo = sku.SkuNo,
                            SkuName = sku.SkuName,
                            Standard = sku.Standard,
                            PalletNo = palletNo,
                            IsBale = "0" , //是否裹包
                            IsBelt = "0" , //是否打带
                            Qty = 0,
                            CompleteQty = 0,
                            Status = "5",
                            LogisticsId = notice.LogisticsId,
                            IsAdvance = "0",
                            OutMode = "",//出库口
                            CreateUser = userId,
                            UpdateTime = DateTime.Now
                        };
                        var fp = Db.Insertable(addAllot).ExecuteReturnEntity();
                        allot2 = fp;
                    }
                    #endregion
                    //判断是散支拣货还是数量拣货
                    var biaoShi = "0";//0:整箱拣货、1:散支拣货、2:数量拣货
                    List<DataBoxInfo> boxInfos;
                    var boxInfo = Db.Queryable<DataBoxInfo>().Where(m => m.IsDel == "0" && m.BoxNo == boxNo);
                    if (boxInfo.Count() == 0)
                    {
                        throw new Exception("未查询到该箱码及追溯码的信息");
                    }
                    boxInfos = boxInfo.ToList();
                    if (!string.IsNullOrWhiteSpace(boxNo3)) //散支拣货
                    {
                        boxInfos = boxInfos.Where(m => m.BoxNo3 == boxNo3).ToList();
                        if (boxInfos.Count() == 0)
                        {
                            throw new Exception("未查询到该箱码及追溯码的信息");
                        }
                        if (boxInfos.Count() > 1)
                        {
                            throw new Exception("该追溯支码的信息大于1条,信息错误,请核实!");
                        }
                        if (boxInfos.Any(m => m.PalletNo != palletNo))
                        {
                            throw new Exception("该托盘与箱码没有绑定关系");
                        }
                        biaoShi = "1";
                    }
                    else if (!string.IsNullOrEmpty(pickQty1) && int.Parse(pickQty1) > 0)//数量拣货
                    {
                        if (boxInfo.Count() > 1)
                        {
                            throw new Exception("该箱码内存在支码不能进行数量拣货");
                        }
                        int boxQty = boxInfo.First().Qty;
                        if (Convert.ToInt32(pickQty1) > boxQty)
                        {
                            throw new Exception("拣货数量不能大于箱内数量");
                        }
                        biaoShi = "2";
                    }
                    else //整箱拣货
                    {
                        if (boxInfo.Count() == 0)
                        {
                            throw new Exception("未查询到该箱码的信息");
                        }
                        if (boxInfo.Any(m => m.PalletNo != palletNo))
                        {
                            throw new Exception("该托盘与箱码没有绑定关系");
                        }
                    }
                    var pickQty = 0;//拣货的数量
                    var comDetailList = Db.Queryable<BllCompleteDetail>().Where(m => m.IsDel == "0" && m.ExportAllotId == allot2.Id && m.PalletNo == palletNo).ToList();
                    var comList = new List<BllCompleteDetail>();
                    foreach (var item in boxInfos)
                    {
                        if (biaoShi != "2" && comDetailList.Any(m => m.BoxNo3 == item.BoxNo3))
                        {
                            throw new Exception($"当前{item.BoxNo}中{item.BoxNo3}已拣货完成,请勿重复拣货");
                        }
                        //添加拣货明细
                        var completeDetail = new BllCompleteDetail()
                        {
                            SONo = notice.SONo,
                            SODetailNo = noticeDetail.Id,
                            ExportAllotId = allot2.Id,
                            StockId = allot2.StockId,
                            BoxNo = item.BoxNo,
                            BoxNo2 = item.BoxNo2,
                            BoxNo3 = item.BoxNo3,
                            LotNo = allot2.LotNo,
                            LotText = allot2.LotText,
                            SupplierLot = allot2.SupplierLot,
                            SkuNo = allot2.SkuNo,
                            SkuName = allot2.SkuName,
                            Standard = allot2.Standard,
                            PalletNo = palletNo,
                            CompleteQty = biaoShi == "2" ? int.Parse(pickQty1) : item.Qty,
                            InspectMark = "1",
                            CreateUser = userId
                        };
                        comList.Add(completeDetail);
                        if (biaoShi != "2")
                        {
                            //删除库存箱码明细
                            Db.Deleteable(item).ExecuteCommand();
                        }
                        else//数量拣货
                        {
                            if (int.Parse(pickQty1) == item.Qty)
                            {
                                //删除库存箱码明细
                                Db.Deleteable(item).ExecuteCommand();
                            }
                            else
                            {
                                item.Qty -= int.Parse(pickQty1);
                                item.BitBoxMark = "1";//零箱标识
                                item.InspectMark = "1";//抽检箱标识
                                Db.Updateable(item).ExecuteCommand();
                            }
                        }
                        pickQty += biaoShi == "2" ? int.Parse(pickQty1) : item.Qty;
                    }
                    //改变库内箱码是否零箱信息
                    if (biaoShi == "1")
                    {
                        var boxSurplusList = boxInfo.Where(m => m.BoxNo3 != boxNo3).ToList();
                        foreach (var item in boxSurplusList)
                        {
                            item.BitBoxMark = "1";
                            item.InspectMark = "1";
                            Db.Updateable(item).ExecuteCommand();
                        }
                    }
                    Db.Insertable(comList).ExecuteCommand();
                    //修改出库分配信息
                    allot2.Qty += pickQty;
                    allot2.CompleteQty += pickQty;
                    Db.Updateable(allot2).ExecuteCommand();
                    //删除或修改库存明细
                    stockDetail.BitPalletMark = "1";//修改为零托标识
                    stockDetail.Qty -= pickQty;
                    if (stockDetail.Qty <= 0)
                    {
                        Db.Deleteable(stockDetail).ExecuteCommand();
                    }
                    else
                    {
                        Db.Updateable(stockDetail).ExecuteCommand();
                    }
                    stock.Qty -= pickQty;
                    if (stock.Qty <= 0)
                    {
                        Db.Deleteable(stock).ExecuteCommand();
                    }
                    else
                    {
                        Db.Updateable(stock).ExecuteCommand();
                    }
                    var num2 = Db.Queryable<DataStockDetail>().Count(m => m.IsDel == "0" && m.PalletNo == palletNo);
                    if (num2 <= 0)
                    {
                        //改变托盘状态
                        var pallet = Db.Queryable<SysPallets>().First(m => m.PalletNo == palletNo && m.IsDel == "0");
                        if (pallet == null)
                        {
                            throw new Exception("未在托盘表中查询到托盘信息");
                        }
                        pallet.Status = "0";
                        Db.Updateable(pallet).ExecuteCommand();
                    }
                    //修改出库单明细拣货数量
                    noticeDetail.Qty += pickQty;
                    noticeDetail.AllotQty += pickQty;
                    noticeDetail.FactQty += pickQty;
                    noticeDetail.CompleteQty += pickQty;
                    noticeDetail.Money = string.IsNullOrWhiteSpace(sku.Price.ToString()) ? null : sku.Price * noticeDetail.Qty;
                    Db.Updateable(noticeDetail).ExecuteCommand();
                }
                else if(soType == "0")
                {
                    #region 判断
                    if (string.IsNullOrWhiteSpace(soNo))
                    {
                        throw new Exception("出库单据不能为空");
                    }
                    if (string.IsNullOrWhiteSpace(soDetailId))
                    {
                        throw new Exception("出库物料-批次不能为空");
                    }
                    if (string.IsNullOrWhiteSpace(palletNo))
                    {
                        throw new Exception("托盘码不能为空");
                    }
                    if (!string.IsNullOrEmpty(boxNo3) && !string.IsNullOrEmpty(pickQty1) && int.Parse(pickQty1) > 0)
                    {
                        throw new Exception("追溯条码和拣货数量不能同时输入");
                    }
                    //出库单
                    var notice = Db.Queryable<BllExportNotice>().First(m => m.IsDel == "0" && m.SONo == soNo);
                    if (notice == null)
                    {
                        throw new Exception("未查询到该出库单的信息");
                    }
                    if (notice.Status != "3")
                    {
                        throw new Exception("出库单的状态不是正在执行,不能拣货");
                    }
                    //出库单明细
                    var noticeDetail = Db.Queryable<BllExportNoticeDetail>()
                        .First(m => m.IsDel == "0" && m.Id == int.Parse(soDetailId));
                    if (noticeDetail == null)
                    {
                        throw new Exception("未查询到该出库单明细的信息");
                    }
                    //出库分配信息
                    var allot = Db.Queryable<BllExportAllot>().First(m =>
                        m.IsDel == "0" && (m.Status == "2" || m.Status == "3") && m.SONo == soNo &&
                        m.SODetailNo == int.Parse(soDetailId) && m.PalletNo == palletNo);
                    if (allot == null)
                    {
                        throw new Exception("未查询到该托盘的分配信息");
                    }
                    //剩余拣货数量(待拣减去已拣)
                    var needQty = allot.Qty - allot.CompleteQty;
                    //库存明细
                    var stockDetail = Db.Queryable<DataStockDetail>().First(m => m.IsDel == "0" && m.Id == allot.StockId);
                    if (stockDetail == null)
                    {
                        throw new Exception("未查询到该托盘分配的库存明细信息!");
                    }
                    //库存总表
                    var stock = Db.Queryable<DataStock>().First(a => a.IsDel == "0" && a.SkuNo == stockDetail.SkuNo && a.LotNo == stockDetail.LotNo);
                    if (stock == null)
                    {
                        throw new Exception("未查询到该托盘分配的库存信息!");
                    }
                    #endregion
                    var biaoShi = "0";//0:整箱拣货、1:散支拣货、2:数量拣货
                    List<DataBoxInfo> boxInfos;
                    var boxInfo = Db.Queryable<DataBoxInfo>().Where(m => m.IsDel == "0" && m.BoxNo == boxNo);
                    if (boxInfo.Count() == 0)
                    {
                        throw new Exception("未查询到该箱码及追溯码的信息");
                    }
                    boxInfos = boxInfo.ToList();
                    if (!string.IsNullOrWhiteSpace(boxNo3)) //散支拣货
                    {
                        boxInfos = boxInfos.Where(m => m.BoxNo3 == boxNo3).ToList();
                        if (boxInfos.Count() == 0)
                        {
                            throw new Exception("未查询到该箱码及追溯码的信息");
                        }
                        if (boxInfos.Count() > 1)
                        {
                            throw new Exception("该追溯支码的信息大于1条,信息错误,请核实!");
                        }
                        if (boxInfos.Any(m => m.PalletNo != palletNo))
                        {
                            throw new Exception("该托盘与箱码没有绑定关系");
                        }
                        var boxQty = boxInfos.First().Qty;
                        if (boxQty > needQty)
                        {
                            throw new Exception("拣货数量不能大于剩余待拣数量");
                        }
                        biaoShi = "1";
                    }
                    else if (!string.IsNullOrEmpty(pickQty1) && int.Parse(pickQty1) > 0)//数量拣货
                    {
                        if (boxInfo.Count() > 1)
                        {
                            throw new Exception("该箱码内存在支码不能进行数量拣货");
                        }
                        int boxQty = boxInfo.First().Qty;
                        if (Convert.ToInt32(pickQty1) > boxQty)
                        {
                            throw new Exception("拣货数量不能大于箱内数量");
                        }
                        if (Convert.ToInt32(pickQty1) > needQty)
                        {
                            throw new Exception("拣货数量不能大于剩余待拣数量");
                        }
                        biaoShi = "2";
                    }
                    else //整箱拣货
                    {
                        if (boxInfo.Count() == 0)
                        {
                            throw new Exception("未查询到该箱码的信息");
                        }
                        if (boxInfo.Any(m => m.PalletNo != palletNo))
                        {
                            throw new Exception("该托盘与箱码没有绑定关系");
                        }
                        var boxQty = boxInfo.GroupBy(m => m.BoxNo).Select(m => SqlFunc.AggregateSum(m.Qty)).ToList();
                        if (boxQty[0] > needQty)
                        {
                            throw new Exception("拣货数量不能大于箱内剩余待拣数量");
                        }
                    }
                    var pickQty = 0;//拣货的数量
                    var comDetailList = Db.Queryable<BllCompleteDetail>().Where(m => m.IsDel == "0" && m.ExportAllotId == allot.Id && m.PalletNo == palletNo).ToList();
                    var comList = new List<BllCompleteDetail>();
                    foreach (var item in boxInfos)
                    {
                        if (biaoShi != "2" && comDetailList.Any(m => m.BoxNo3 == item.BoxNo3))
                        {
                            throw new Exception($"当前{item.BoxNo}中{item.BoxNo3}已拣货完成,请勿重复拣货");
                        }
                        //添加拣货明细
                        var completeDetail = new BllCompleteDetail()
                        {
                            SONo = soNo,
                            SODetailNo = int.Parse(soDetailId),
                            ExportAllotId = allot.Id,
                            StockId = allot.StockId,
                            BoxNo = item.BoxNo,
                            BoxNo2 = item.BoxNo2,
                            BoxNo3 = item.BoxNo3,
                            LotNo = allot.LotNo,
                            LotText = allot.LotText,
                            SupplierLot = allot.SupplierLot,
                            SkuNo = allot.SkuNo,
                            SkuName = allot.SkuName,
                            Standard = allot.Standard,
                            PalletNo = palletNo,
                            CompleteQty = biaoShi == "2" ? int.Parse(pickQty1) : item.Qty,
                            CreateUser = userId
                        };
                        comList.Add(completeDetail);
                        if (biaoShi != "2")
                        {
                            //删除库存箱码明细
                            Db.Deleteable(item).ExecuteCommand();
                        }
                        else//数量拣货
                        {
                            if (int.Parse(pickQty1) == item.Qty)
                            {
                                //删除库存箱码明细
                                Db.Deleteable(item).ExecuteCommand();
                            }
                            else
                            {
                                item.Qty -= int.Parse(pickQty1);
                                item.BitBoxMark = "1";//零箱标识
                                Db.Updateable(item).ExecuteCommand();
                            }
                        }
                        pickQty += item.Qty;
                    }
                    //改变库内箱码是否零箱信息
                    if (biaoShi == "1")
                    {
                        var boxSurplusList = boxInfo.Where(m => m.BoxNo3 != boxNo3).ToList();
                        foreach (var item in boxSurplusList)
                        {
                            item.BitBoxMark = "1";
                            Db.Updateable(item).ExecuteCommand();
                        }
                    }
                    Db.Insertable(comList).ExecuteCommand();
                    //修改出库分配信息
                    allot.CompleteQty += pickQty;
                    allot.Status = allot.Qty == allot.CompleteQty ? "5" : "3";
                    allot.UpdateTime = DateTime.Now;
                    if (allot.Status == "5")
                    {
                        //判断该托盘是否还存在物料 存在改为待回库 待回库完成后改为已完成
                    }
                    Db.Updateable(allot).ExecuteCommand();
                    //删除或修改库存明细
                    stockDetail.BitPalletMark = "1";//修改为零托标识
                    stockDetail.Qty -= pickQty;
                    stockDetail.LockQty -= pickQty;
                    if (stockDetail.Qty == stockDetail.LockQty)
                    {
                        stockDetail.Status = "2";
                    }
                    else if (stockDetail.Qty > stockDetail.LockQty && stockDetail.LockQty > 0)
                    {
                        stockDetail.Status = "1";
                    }
                    else
                    {
                        stockDetail.Status = "0";
                    }
                    if (stockDetail.Qty <= 0)
                    {
                        Db.Deleteable(stockDetail).ExecuteCommand();
                    }
                    else
                    {
                        Db.Updateable(stockDetail).ExecuteCommand();
                    }
                    stock.Qty -= pickQty;
                    stock.LockQty -= pickQty;
                    if (stock.Qty <= 0)
                    {
                        Db.Deleteable(stock).ExecuteCommand();
                    }
                    else
                    {
                        Db.Updateable(stock).ExecuteCommand();
                    }
                    var num2 = Db.Queryable<DataStockDetail>().Count(m => m.IsDel == "0" && m.PalletNo == palletNo);
                    if (num2 <= 0)
                    {
                        //改变托盘状态
                        var pallet = Db.Queryable<SysPallets>().First(m => m.PalletNo == palletNo && m.IsDel == "0");
                        if (pallet == null)
                        {
                            throw new Exception("未在托盘表中查询到托盘信息");
                        }
                        pallet.Status = "0";
                        Db.Updateable(pallet).ExecuteCommand();
                    }
                    //修改出库单明细拣货数量
                    noticeDetail.CompleteQty += pickQty;
                    Db.Updateable(noticeDetail).ExecuteCommand();
                    var num = Db.Queryable<BllExportNoticeDetail>()
                        .Count(m => m.IsDel == "0" && m.SONo == soNo && m.CompleteQty < m.Qty);
                    if (num <= 0)
                    {
                        notice.Status = "4"; //更改为执行完成
                    }
                    //修改出库单信息
                    Db.Updateable(notice).ExecuteCommand();
                }
                //添加操作日志记录
                var k = new OperationSOServer().AddLogOperationSo("PDA模块", "拣货出库", soNo, "拣货", $"在PDA上对出库单号为:{soNo}的托盘码为:{palletNo}的拣货操作", userId);
                Db.CommitTran();
            }
            catch (Exception e)
            {
                Db.RollbackTran();
                throw new Exception(e.Message);
            }
        }
        //取样出库拣货(无标签)
        public void SampleSoSetQtyPick(string soType, string soNo, string soDetailId, string palletNo, string PickQty, string asnNo, int userId)
        {
            Db.BeginTran();
            try
            {
                if (string.IsNullOrWhiteSpace(soType))
                {
                    throw new Exception("取样标识不能为空");
                }
                if (soType == "1")
                {
                    if (string.IsNullOrWhiteSpace(asnNo))
                    {
                        throw new Exception("入库单据不能为空");
                    }
                    if (string.IsNullOrWhiteSpace(palletNo))
                    {
                        throw new Exception("托盘码不能为空");
                    }
                    //先判断是否是库外取样托盘
                    var allot = Db.Queryable<BllExportAllot>().First(m =>
                        m.IsDel == "0" && m.PalletNo == palletNo && m.Status != "5" && m.Status != "6");
                    if (allot != null)
                    {
                        throw new Exception("当前托盘不属于库前取样");
                    }
                    //库存明细
                    var stockDetail = Db.Queryable<DataStockDetail>().First(m => m.IsDel == "0" && m.ASNNo == asnNo && m.PalletNo == palletNo);
                    if (stockDetail == null)
                    {
                        throw new Exception("未查询到该托盘的库存明细信息!");
                    }
                    var sku = Db.Queryable<SysMaterials>().First(m => m.IsDel == "0" && m.SkuNo == stockDetail.SkuNo);
                    if (sku == null)
                    {
                        throw new Exception("未查询到当前托盘上的物料信息");
                    }
                    //库存总表
                    var stock = Db.Queryable<DataStock>().First(a => a.IsDel == "0" && a.SkuNo == stockDetail.SkuNo && a.LotNo == stockDetail.LotNo);
                    if (stock == null)
                    {
                        throw new Exception("未查询到该托盘分配的库存信息!");
                    }
                    //出库单
                    var notice = Db.Queryable<BllExportNotice>().First(m => m.IsDel == "0" && m.AsnSampleNo == asnNo);
                    //创建出库单
                    if (notice == null || notice.Status == "6")
                    {
                        var billNo = "";
                        var bl = true;
                        do
                        {
                            //获取自增单据号
                            billNo = new Common().GetMaxNo("SO");
                            var no = billNo;
                            bl = Db.Queryable<BllExportNotice>().Any(m => m.SONo == no);
                        } while (bl);
                        var addNotice = new BllExportNotice()
                        {
                            SONo = billNo,
                            Type = "3",
                            Status = "4",
                            Origin = "WMS",
                            AsnSampleNo = asnNo,
                            IsWave = "0",
                            WaveNo = "",
                            IsDespatch = "0",
                            CompleteTime = DateTime.Now,
                            CreateUser = userId,
                        };
                        var n = Db.Insertable(addNotice).ExecuteReturnEntity();
                        notice = n;
                    }
                    //创建出库单明细
                    var noticeDetail = Db.Queryable<BllExportNoticeDetail>().First(m => m.IsDel == "0" && m.SONo == notice.SONo && m.SkuNo == stockDetail.SkuNo && m.LotNo.Contains(stockDetail.LotNo));
                    if (noticeDetail == null)
                    {
                        var addNoticeDetail = new BllExportNoticeDetail()
                        {
                            SONo = notice.SONo,
                            SkuNo = sku.SkuNo,
                            SkuName = sku.SkuName,
                            Standard = sku.Standard,
                            LotNo = stockDetail.LotNo,
                            LotText = "",
                            Qty = 0,
                            AllotQty = 0,
                            FactQty = 0,
                            CompleteQty = 0,
                            PackagNo = sku.PackagNo,
                            Price = sku.Price,
                            //Money = string.IsNullOrWhiteSpace(sku.Price.ToString()) ? null : sku.Price * pickQty,
                            IsBale = "",
                            IsBelt = "",
                            SupplierLot = stock.SupplierLot,
                            IsWave = "0",
                            WaveNo = "",
                            IsIssueLotNo = "0",
                            Status = "3",
                            CreateUser = userId,
                        };
                        var m = Db.Insertable(addNoticeDetail).ExecuteReturnEntity();
                        noticeDetail = m;
                    }
                    //出库分配信息
                    var allot2 = Db.Queryable<BllExportAllot>().First(m => m.IsDel == "0" && m.Status == "5" && m.SONo == notice.SONo && m.PalletNo == palletNo);
                    if (allot2 == null)
                    {
                        //添加分配表信息
                        var addAllot = new BllExportAllot
                        {
                            SONo = notice.SONo,
                            WaveNo = "",
                            SODetailNo = noticeDetail.Id,
                            StockId = stockDetail.Id,
                            LotNo = stockDetail.LotNo,
                            LotText = stockDetail.LotText,
                            SupplierLot = stockDetail.SupplierLot,
                            SkuNo = sku.SkuNo,
                            SkuName = sku.SkuName,
                            Standard = sku.Standard,
                            PalletNo = palletNo,
                            IsBale = "0", //是否裹包
                            IsBelt = "0", //是否打带
                            Qty = 0,
                            CompleteQty = 0,
                            Status = "5",
                            LogisticsId = notice.LogisticsId,
                            IsAdvance = "0",
                            OutMode = "",//出库口
                            CreateUser = userId,
                            UpdateTime = DateTime.Now
                        };
                        var fp = Db.Insertable(addAllot).ExecuteReturnEntity();
                        allot2 = fp;
                    }
                    //获取当前托盘拣货明细
                    var complete = Db.Queryable<BllCompleteDetail>().First(a => a.IsDel == "0" && a.PalletNo == palletNo && a.SONo == notice.SONo && a.ExportAllotId == allot2.Id && a.StockId == stockDetail.Id);
                    //判读是否存在拣货明细
                    int isComplete = 0;
                    if (complete != null)
                    {
                        isComplete = 1;
                    }
                    var comList = new List<BllCompleteDetail>();
                    //判断是否存在拣货明细
                    if (isComplete == 0)
                    {
                        //添加拣货明细
                        var completeDetail = new BllCompleteDetail()
                        {
                            SONo = notice.SONo,
                            SODetailNo = noticeDetail.Id,
                            ExportAllotId = allot2.Id,
                            StockId = allot2.StockId,
                            BoxNo = "",
                            BoxNo2 = "",
                            BoxNo3 = "",
                            LotNo = allot2.LotNo,
                            LotText = allot2.LotText,
                            SupplierLot = allot2.SupplierLot,
                            SkuNo = allot2.SkuNo,
                            SkuName = allot2.SkuName,
                            Standard = allot2.Standard,
                            PalletNo = palletNo,
                            CompleteQty = int.Parse(PickQty) ,
                            InspectMark = "1",
                            CreateUser = userId
                        };
                        comList.Add(completeDetail);
                        //添加拣货明细
                        Db.Insertable(comList).ExecuteCommand();
                    }
                    else if (isComplete == 1)
                    {
                        complete.CompleteQty += int.Parse(PickQty);
                        complete.UpdateUser = userId;
                        complete.UpdateTime = Db.GetDate();
                        Db.Updateable(complete).ExecuteCommand();
                    }
                    //修改出库分配信息
                    allot2.Qty += int.Parse(PickQty);
                    allot2.CompleteQty += int.Parse(PickQty);
                    Db.Updateable(allot2).ExecuteCommand();
                    int isDel = 0;
                    //删除或修改库存明细
                    stockDetail.BitPalletMark = "1";//修改为零托标识
                    stockDetail.InspectMark = "1";//修改为抽检托标识
                    stockDetail.Qty -= int.Parse(PickQty);
                    if (stockDetail.Qty == stockDetail.LockQty&& stockDetail.Qty != 0)
                    {
                        stockDetail.Status = "2";
                    }
                    else if (stockDetail.Qty > stockDetail.LockQty && stockDetail.LockQty > 0)
                    {
                        stockDetail.Status = "1";
                    }
                    else
                    {
                        stockDetail.Status = "0";
                    }
                    if (stockDetail.Qty <= 0)
                    {
                        Db.Deleteable(stockDetail).ExecuteCommand();
                    }
                    else
                    {
                        isDel = 1;
                        Db.Updateable(stockDetail).ExecuteCommand();
                    }
                    //删除或修改库存
                    stock.Qty -= int.Parse(PickQty);
                    if (stock.Qty <= 0)
                    {
                        Db.Deleteable(stock).ExecuteCommand();
                    }
                    else
                    {
                        Db.Updateable(stock).ExecuteCommand();
                    }
                    //改变托盘状态为:未使用
                    var pallet = Db.Queryable<SysPallets>().First(m => m.PalletNo == palletNo && m.IsDel == "0");
                    if (pallet == null)
                    {
                        throw new Exception("未在托盘表中查询到托盘信息");
                    }
                    //判断托盘上物料是否拣货完毕
                    if (isDel == 0)
                    {
                        pallet.Status = "0";
                        Db.Updateable(pallet).ExecuteCommand();
                    }
                    //修改出库单明细拣货数量
                    noticeDetail.Qty += int.Parse(PickQty);
                    noticeDetail.AllotQty += int.Parse(PickQty);
                    noticeDetail.FactQty += int.Parse(PickQty);
                    noticeDetail.CompleteQty += int.Parse(PickQty);
                    noticeDetail.Money = string.IsNullOrWhiteSpace(sku.Price.ToString()) ? null : sku.Price * noticeDetail.Qty;
                    Db.Updateable(noticeDetail).ExecuteCommand();
                }
                else if (soType == "0")
                {
                    #region 判断
                    if (string.IsNullOrWhiteSpace(soNo))
                    {
                        throw new Exception("出库单据不能为空");
                    }
                    //if (string.IsNullOrWhiteSpace(soDetailId))
                    //{
                    //    throw new Exception("出库物料-批次不能为空");
                    //}
                    if (string.IsNullOrWhiteSpace(palletNo))
                    {
                        throw new Exception("托盘码不能为空");
                    }
                    //出库单
                    var notice = Db.Queryable<BllExportNotice>().First(m => m.IsDel == "0" && m.SONo == soNo);
                    if (notice == null)
                    {
                        throw new Exception("未查询到该出库单的信息");
                    }
                    if (notice.Status != "3")
                    {
                        throw new Exception("出库单的状态不是正在执行,不能拣货");
                    }
                    //出库单明细
                    var noticeDetail = Db.Queryable<BllExportNoticeDetail>()
                        .First(m => m.IsDel == "0" && m.Id == int.Parse(soDetailId));
                    if (noticeDetail == null)
                    {
                        throw new Exception("未查询到该出库单明细的信息");
                    }
                    //出库分配信息
                    var allot = Db.Queryable<BllExportAllot>().First(m =>
                        m.IsDel == "0" && (m.Status == "2" || m.Status == "3") && m.SONo == soNo &&
                        m.SODetailNo == int.Parse(soDetailId) && m.PalletNo == palletNo);
                    if (allot == null)
                    {
                        throw new Exception("未查询到该托盘的分配信息");
                    }
                    //剩余拣货数量(待拣减去已拣)
                    var needQty = allot.Qty - allot.CompleteQty;
                    if (int.Parse(PickQty) > needQty)
                    {
                        throw new Exception("拣货数量不能大于托内剩余待拣数量");
                    }
                    //库存明细
                    var stockDetail = Db.Queryable<DataStockDetail>().First(m => m.IsDel == "0" && m.Id == allot.StockId);
                    if (stockDetail == null)
                    {
                        throw new Exception("未查询到该托盘分配的库存明细信息!");
                    }
                    //库存总表
                    var stock = Db.Queryable<DataStock>().First(a => a.IsDel == "0" && a.SkuNo == stockDetail.SkuNo && a.LotNo == stockDetail.LotNo);
                    if (stock == null)
                    {
                        throw new Exception("未查询到该托盘分配的库存信息!");
                    }
                    #endregion
                    //获取当前托盘拣货明细
                    var complete = Db.Queryable<BllCompleteDetail>().First(a => a.IsDel == "0" && a.PalletNo == palletNo && a.SONo == notice.SONo && a.SODetailNo == noticeDetail.Id && a.ExportAllotId == allot.Id && a.StockId == stockDetail.Id);
                    //判读是否存在拣货明细
                    int isComplete = 0;
                    if (complete != null)
                    {
                        isComplete = 1;
                    }
                    var comList = new List<BllCompleteDetail>();
                    //判断是否存在拣货明细
                    if (isComplete == 0)
                    {
                        //添加拣货明细
                        var completeDetail = new BllCompleteDetail()
                        {
                            SONo = soNo,
                            SODetailNo = int.Parse(soDetailId),
                            ExportAllotId = allot.Id,
                            StockId = allot.StockId,
                            BoxNo = "",
                            BoxNo2 = "",
                            BoxNo3 = "",
                            LotNo = allot.LotNo,
                            LotText = allot.LotText,
                            SupplierLot = allot.SupplierLot,
                            SkuNo = allot.SkuNo,
                            SkuName = allot.SkuName,
                            Standard = allot.Standard,
                            PalletNo = palletNo,
                            CompleteQty = int.Parse(PickQty),
                            CreateUser = userId,
                            CreateTime = Db.GetDate(),
                        };
                        comList.Add(completeDetail);
                        //添加拣货明细
                        Db.Insertable(comList).ExecuteCommand();
                    }
                    else if (isComplete == 1)
                    {
                        complete.CompleteQty += int.Parse(PickQty);
                        complete.UpdateUser = userId;
                        complete.UpdateTime = Db.GetDate();
                        Db.Updateable(complete).ExecuteCommand();
                    }
                    //修改出库分配信息
                    allot.CompleteQty += int.Parse(PickQty);
                    allot.Status = allot.Qty == allot.CompleteQty ? "5" : "3";
                    allot.UpdateTime = DateTime.Now;
                    Db.Updateable(allot).ExecuteCommand();
                    int isDel = 0;
                    //删除或修改库存明细
                    stockDetail.BitPalletMark = "1";//修改为零托标识
                    stockDetail.Qty -= int.Parse(PickQty);
                    stockDetail.LockQty -= int.Parse(PickQty);
                    if (stockDetail.Qty == stockDetail.LockQty)
                    {
                        stockDetail.Status = "2";
                    }
                    else if (stockDetail.Qty > stockDetail.LockQty && stockDetail.LockQty > 0)
                    {
                        stockDetail.Status = "1";
                    }
                    else
                    {
                        stockDetail.Status = "0";
                    }
                    if (stockDetail.Qty <= 0)
                    {
                        Db.Deleteable(stockDetail).ExecuteCommand();
                    }
                    else
                    {
                        isDel = 1;
                        Db.Updateable(stockDetail).ExecuteCommand();
                    }
                    //删除或修改库存
                    stock.Qty -= int.Parse(PickQty);
                    stock.LockQty -= int.Parse(PickQty);
                    if (stock.Qty <= 0)
                    {
                        Db.Deleteable(stock).ExecuteCommand();
                    }
                    else
                    {
                        Db.Updateable(stock).ExecuteCommand();
                    }
                    //改变托盘状态为:未使用
                    var pallet = Db.Queryable<SysPallets>().First(m => m.PalletNo == palletNo && m.IsDel == "0");
                    if (pallet == null)
                    {
                        throw new Exception("未在托盘表中查询到托盘信息");
                    }
                    //判断托盘上物料是否拣货完毕
                    if (isDel == 0)
                    {
                        pallet.Status = "0";
                        Db.Updateable(pallet).ExecuteCommand();
                    }
                    //修改出库单明细拣货数量
                    noticeDetail.CompleteQty += int.Parse(PickQty);
                    Db.Updateable(noticeDetail).ExecuteCommand();
                    var num = Db.Queryable<BllExportNoticeDetail>()
                        .Count(m => m.IsDel == "0" && m.SONo == soNo && m.CompleteQty < m.Qty);
                    if (num <= 0)
                    {
                        notice.Status = "4"; //更改为执行完成
                    }
                    //修改出库单信息
                    Db.Updateable(notice).ExecuteCommand();
                }
                //添加操作日志记录
                var k = new OperationSOServer().AddLogOperationSo("PDA模块", "拣货出库", soNo, "拣货", $"在PDA上对出库单号为:{soNo}的托盘码为:{palletNo}的拣货操作", userId);
                Db.CommitTran();
            }
            catch (Exception e)
            {
                Db.RollbackTran();
                throw new Exception(e.Message);
            }
        }
        #region 拣货拼托
        /// <summary>
        /// 拼托出库pda拣货-标签
        /// </summary>
        /// <param name="soNo"></param>
        /// <param name="soDetailId"></param>
        /// <param name="palletNo"></param>
        /// <param name="boxNo"></param>
        /// <param name="boxNo3"></param>
        /// <param name="pickQty1"></param>
        /// <param name="palletNoNew"></param>
        /// <param name="userId"></param>
        public void SoSetPinPick(string soNo, string soDetailId, string palletNo, string boxNo, string boxNo3, string pickQty1,string palletNoNew,int userId)
        {
            Db.BeginTran();
            try
            {
                var nowDate = DateTime.Now;//当前时间
                #region 判断
                if (string.IsNullOrWhiteSpace(soNo))
                {
                    throw new Exception("出库单据不能为空");
                }
                if (string.IsNullOrWhiteSpace(soDetailId))
                {
                    throw new Exception("出库物料-批次不能为空");
                }
                if (string.IsNullOrWhiteSpace(palletNo))
                {
                    throw new Exception("托盘码不能为空");
                }
                if (!string.IsNullOrEmpty(boxNo3) && !string.IsNullOrEmpty(pickQty1) && int.Parse(pickQty1) > 0)
                {
                    throw new Exception("追溯条码和拣货数量不能同时输入");
                }
                if (string.IsNullOrWhiteSpace(palletNoNew))
                {
                    throw new Exception("新托盘码不能为空");
                }
                //出库单
                var notice = Db.Queryable<BllExportNotice>().First(m => m.IsDel == "0" && m.SONo == soNo);
                if (notice == null)
                {
                    throw new Exception("未查询到该出库单的信息");
                }
                if (notice.Status != "3")
                {
                    throw new Exception("出库单的状态不是正在执行,不能拣货");
                }
                //出库单明细
                var noticeDetail = Db.Queryable<BllExportNoticeDetail>()
                    .First(m => m.IsDel == "0" && m.Id == int.Parse(soDetailId));
                if (noticeDetail == null)
                {
                    throw new Exception("未查询到该出库单明细的信息");
                }
                //出库分配信息
                var allot = Db.Queryable<BllExportAllot>().First(m =>
                    m.IsDel == "0" && (m.Status == "2" || m.Status == "3") && m.SONo == soNo &&
                    m.SODetailNo == int.Parse(soDetailId) && m.PalletNo == palletNo);
                if (allot == null)
                {
                    throw new Exception("未查询到该托盘的分配信息");
                }
                //剩余拣货数量(待拣减去已拣)
                var needQty = allot.Qty - allot.CompleteQty;
                //库存明细
                var stockDetail = Db.Queryable<DataStockDetail>().First(m => m.IsDel == "0" && m.Id == allot.StockId);
                if (stockDetail == null)
                {
                    throw new Exception("未查询到该托盘分配的库存明细信息!");
                }
                //库存总表
                var stock = Db.Queryable<DataStock>().First(a => a.IsDel == "0" && a.SkuNo == stockDetail.SkuNo && a.LotNo == stockDetail.LotNo);
                if (stock == null)
                {
                    throw new Exception("未查询到该托盘分配的库存信息!");
                }
                #endregion
                #region 拼托信息
                var sdId = 0;
                bool isNew = false;
                var pinStockDetail = Db.Queryable<DataStockDetail>().First(m => m.IsDel == "0" && m.PalletNo == palletNoNew);
                if (pinStockDetail != null)
                {
                    if (pinStockDetail.SONo != notice.SONo)
                    {
                        throw new Exception("拼托托盘上只能放同一个出库单下的物料!");
                    }
                    if (pinStockDetail.SkuName != stockDetail.SkuName || pinStockDetail.LotNo != stockDetail.LotNo)
                    {
                        isNew = true;
                    }
                    sdId = pinStockDetail.Id;
                }
                else
                {
                    isNew = true;
                    var newPalletInfo = Db.Queryable<SysPallets>().First(m => m.IsDel == "0" && m.PalletNo == palletNoNew && m.Status=="0");
                    if (newPalletInfo == null)
                    {
                        throw new Exception("新托盘信息不存在或已被使用!");
                    }
                    //修改新托盘状态
                    newPalletInfo.Status = "1";
                    Db.Updateable(newPalletInfo).ExecuteCommand();
                }
                var sd = new DataStockDetail();
                if (isNew)
                {
                    sd.LotNo = stockDetail.LotNo;
                    sd.LotText = stockDetail.LotText;
                    sd.SupplierLot = stockDetail.SupplierLot;
                    sd.SkuNo = stockDetail.SkuNo;
                    sd.SkuName = stockDetail.SkuName;
                    sd.Standard = stockDetail.Standard;
                    sd.FrozenQty = 0;
                    sd.InspectQty = 0;
                    sd.ASNNo = "";
                    sd.ASNDetailNo = null;
                    sd.SONo = soNo;//出库单号
                    sd.WareHouseNo = "";
                    sd.RoadwayNo = "";
                    sd.AreaNo = "";
                    sd.LocatNo = "";
                    sd.PalletNo = palletNoNew;
                    sd.PalletNo2 = "";
                    sd.PalletNo3 = "";
                    //PalletType = item.PalletType,
                    sd.CompleteTime = nowDate;
                    sd.ProductionTime = stockDetail.ProductionTime;
                    sd.ExpirationTime = stockDetail.ExpirationTime;
                    sd.Status = "2";//状态,已分配
                    sd.InspectMark = stockDetail.InspectMark;
                    sd.InspectStatus = stockDetail.InspectStatus;
                    sd.BitPalletMark = "0";
                    sd.PackagNo = noticeDetail.PackagNo;
                    sd.IsBale = stockDetail.IsBale;
                    sd.IsBelt = stockDetail.IsBelt;
                    sd.Demo = stockDetail.Demo;
                    sd.OwnerName = stockDetail.OwnerName;
                    sd.OwnerNo = stockDetail.OwnerNo;
                    sd.SupplierName = stockDetail.SupplierName;
                    sd.SupplierNo = stockDetail.SupplierNo;
                    sd.IsDel = "0";
                    sd.CreateUser = userId;
                    sd.CreateTime = nowDate;
                    //新增拼托库存明细信息
                    sdId = Db.Insertable(sd).ExecuteReturnIdentity();
                }
                #endregion
                var pickQty = 0;//拣货的数量
                if (string.IsNullOrWhiteSpace(boxNo))//整托拣货
                {
                    List<DataBoxInfo> boxInfos;
                    var boxInfo = Db.Queryable<DataBoxInfo>().Where(m => m.IsDel == "0" && m.PalletNo == palletNo);//找到托盘上所有箱码
                    boxInfos = boxInfo.ToList();
                    if (boxInfo.Count() <= 0)
                    {
                        throw new Exception("该托盘上没有可拣货的箱子");
                    }
                    var boxQty = boxInfo.GroupBy(m => m.PalletNo).Select(m => SqlFunc.AggregateSum(m.Qty)).ToList();
                    if (boxQty[0] > needQty)
                    {
                        throw new Exception("拣货数量不能大于箱内剩余待拣数量");
                    }
                    var comDetailList = Db.Queryable<BllCompleteDetail>().Where(m => m.IsDel == "0" && m.ExportAllotId == allot.Id && m.PalletNo == palletNo).ToList();
                    var comList = new List<BllCompleteDetail>();
                    foreach (var item in boxInfos)
                    {
                        if (comDetailList.Any(m => m.BoxNo3 == item.BoxNo3))
                        {
                            throw new Exception($"当前{item.BoxNo}中{item.BoxNo3}已拣货完成,请勿重复拣货");
                        }
                        if (item.SkuNo != allot.SkuNo || item.LotNo != allot.LotNo)
                        {
                            throw new Exception("当前托盘上有其他不同物料批次,拣货失败");
                        }
                        //添加拣货明细
                        var completeDetail = new BllCompleteDetail()
                        {
                            SONo = soNo,
                            SODetailNo = int.Parse(soDetailId),
                            ExportAllotId = allot.Id,
                            StockId = allot.StockId,
                            BoxNo = item.BoxNo,
                            BoxNo2 = item.BoxNo2,
                            BoxNo3 = item.BoxNo3,
                            LotNo = allot.LotNo,
                            LotText = allot.LotText,
                            SupplierLot = allot.SupplierLot,
                            SkuNo = allot.SkuNo,
                            SkuName = allot.SkuName,
                            Standard = allot.Standard,
                            PalletNo = palletNo,
                            CompleteQty = item.Qty,
                            CreateUser = userId
                        };
                        comList.Add(completeDetail);
                        //修改库存箱码明细
                        item.StockDetailId = sdId;
                        item.BindNo = null;//托盘绑定号
                        item.PalletNo = palletNoNew;
                        Db.Updateable(item).ExecuteCommand();
                        pickQty += item.Qty;
                    }
                    //添加拣货明细
                    Db.Insertable(comList).ExecuteCommand();
                    //修改出库分配信息
                    allot.CompleteQty += pickQty;
                    allot.Status = allot.Qty == allot.CompleteQty ? "5" : "3";
                    allot.UpdateTime = DateTime.Now;
                    Db.Updateable(allot).ExecuteCommand();
                    //删除原托盘库存明细
                    Db.Deleteable(stockDetail).ExecuteCommand();
                    //改变托盘状态为:未使用
                    var pallet = Db.Queryable<SysPallets>().First(m => m.PalletNo == palletNo && m.IsDel == "0");
                    if (pallet == null)
                    {
                        throw new Exception("未在托盘表中查询到托盘信息");
                    }
                    pallet.Status = "0";
                    Db.Updateable(pallet).ExecuteCommand();
                    //修改出库单明细拣货数量
                    noticeDetail.CompleteQty += pickQty;
                    Db.Updateable(noticeDetail).ExecuteCommand();
                    var num = Db.Queryable<BllExportNoticeDetail>()
                        .Count(m => m.IsDel == "0" && m.SONo == soNo && m.CompleteQty < m.Qty);
                    if (num <= 0)
                    {
                        notice.Status = "4"; //更改为执行完成
                    }
                    //修改出库单信息
                    Db.Updateable(notice).ExecuteCommand();
                }
                else
                {
                    var biaoShi = "0";//0:整箱拣货、1:散支拣货、2:数量拣货
                    List<DataBoxInfo> boxInfos;
                    var boxInfo = Db.Queryable<DataBoxInfo>().Where(m => m.IsDel == "0" && m.BoxNo == boxNo);
                    if (boxInfo.Count() == 0)
                    {
                        throw new Exception("未查询到该箱码及追溯码的信息");
                    }
                    boxInfos = boxInfo.ToList();
                    var comDetailList = Db.Queryable<BllCompleteDetail>().Where(m => m.IsDel == "0" && m.ExportAllotId == allot.Id && m.PalletNo == palletNo).ToList();
                    if (!string.IsNullOrWhiteSpace(boxNo3)) //散支拣货
                    {
                        boxInfos = boxInfos.Where(m => m.BoxNo3 == boxNo3).ToList();
                        if (boxInfos.Count() == 0)
                        {
                            throw new Exception("未查询到该箱码及追溯码的信息");
                        }
                        if (boxInfos.Count() > 1)
                        {
                            throw new Exception("该追溯支码的信息大于1条,信息错误,请核实!");
                        }
                        if (boxInfos.Any(m => m.PalletNo != palletNo))
                        {
                            throw new Exception("该托盘与箱码没有绑定关系");
                        }
                        var boxQty = boxInfos.First().Qty;
                        if (boxQty > needQty)
                        {
                            throw new Exception("拣货数量不能大于剩余待拣数量");
                        }
                        foreach (var item in boxInfos)
                        {
                            if (biaoShi != "2" && comDetailList.Any(m => m.BoxNo3 == item.BoxNo3))
                            {
                                throw new Exception($"当前{item.BoxNo}中{item.BoxNo3}已拣货完成,请勿重复拣货");
                            }
                        }
                        biaoShi = "1";
                    }
                    else if (!string.IsNullOrEmpty(pickQty1) && int.Parse(pickQty1) > 0)//数量拣货
                    {
                        if (boxInfo.Count() > 1)
                        {
                            throw new Exception("该箱码内存在支码不能进行数量拣货");
                        }
                        int boxQty = boxInfo.First().Qty;
                        if (Convert.ToInt32(pickQty1) > boxQty)
                        {
                            throw new Exception("拣货数量不能大于箱内数量");
                        }
                        if (Convert.ToInt32(pickQty1) > needQty)
                        {
                            throw new Exception("拣货数量不能大于剩余待拣数量");
                        }
                        biaoShi = "2";
                    }
                    else //整箱拣货
                    {
                        if (boxInfo.Count() == 0)
                        {
                            throw new Exception("未查询到该箱码的信息");
                        }
                        if (boxInfo.Any(m => m.PalletNo != palletNo))
                        {
                            throw new Exception("该托盘与箱码没有绑定关系");
                        }
                        var boxQty = boxInfo.GroupBy(m => m.BoxNo).Select(m => SqlFunc.AggregateSum(m.Qty)).ToList();
                        if (boxQty[0] > needQty)
                        {
                            throw new Exception("拣货数量不能大于箱内剩余待拣数量");
                        }
                        foreach (var item in boxInfos)
                        {
                            if (biaoShi != "2" && comDetailList.Any(m => m.BoxNo == item.BoxNo))
                            {
                                throw new Exception($"当前{item.BoxNo}已拣货完成,请勿重复拣货");
                            }
                        }
                    }
                    var comList = new List<BllCompleteDetail>();
                    foreach (var item in boxInfos)
                    {
                        //添加拣货明细
                        var completeDetail = new BllCompleteDetail()
                        {
                            SONo = soNo,
                            SODetailNo = int.Parse(soDetailId),
                            ExportAllotId = allot.Id,
                            StockId = allot.StockId,
                            BoxNo = item.BoxNo,
                            BoxNo2 = item.BoxNo2,
                            BoxNo3 = item.BoxNo3,
                            LotNo = allot.LotNo,
                            LotText = allot.LotText,
                            SupplierLot = allot.SupplierLot,
                            SkuNo = allot.SkuNo,
                            SkuName = allot.SkuName,
                            Standard = allot.Standard,
                            PalletNo = palletNo,
                            CompleteQty = biaoShi == "2" ? int.Parse(pickQty1) : item.Qty,
                            CreateUser = userId
                        };
                        comList.Add(completeDetail);
                        if (biaoShi == "0")//整箱拣货
                        {
                            //修改库存箱码明细
                            item.StockDetailId = sdId;
                            item.BindNo = null;//托盘绑定号
                            item.PalletNo = palletNoNew;
                            Db.Updateable(item).ExecuteCommand();
                            pickQty += item.Qty;
                        }
                        else if (biaoShi == "1")//散支拣货
                        {
                            //修改库存箱码明细
                            item.StockDetailId = sdId;
                            item.BindNo = null;//托盘绑定号
                            item.PalletNo = palletNoNew;
                            item.BoxNo = item.BoxNo3;//将支码赋给箱码
                            item.BitBoxMark = "1";
                            Db.Updateable(item).ExecuteCommand();
                            pickQty += item.Qty;
                        }
                        else//数量拣货
                        {
                            if (int.Parse(pickQty1) == item.Qty)
                            {
                                //修改库存箱码明细
                                item.StockDetailId = sdId;
                                item.BindNo = null;//托盘绑定号
                                item.PalletNo = palletNoNew;
                                Db.Updateable(item).ExecuteCommand();
                            }
                            else
                            {
                                item.Qty -= int.Parse(pickQty1);
                                item.BitBoxMark = "1";//零箱标识
                                Db.Updateable(item).ExecuteCommand();
                            }
                            pickQty += int.Parse(pickQty1);
                        }
                    }
                    //改变库内箱码是否零箱信息
                    if (biaoShi == "1")
                    {
                        var boxSurplusList = boxInfo.Where(m => m.BoxNo3 != boxNo3).ToList();
                        foreach (var item in boxSurplusList)
                        {
                            item.BitBoxMark = "1";
                            Db.Updateable(item).ExecuteCommand();
                        }
                    }
                    Db.Insertable(comList).ExecuteCommand();
                    //修改出库分配信息
                    allot.CompleteQty += pickQty;
                    allot.Status = allot.Qty == allot.CompleteQty ? "5" : "3";
                    allot.UpdateTime = DateTime.Now;
                    if (allot.Status == "5")
                    {
                        //判断该托盘是否还存在物料 存在改为待回库 待回库完成后改为已完成
                    }
                    Db.Updateable(allot).ExecuteCommand();
                    //删除或修改库存明细
                    stockDetail.BitPalletMark = "1";//修改为零托标识
                    stockDetail.Qty -= pickQty;
                    stockDetail.LockQty -= pickQty;
                    if (stockDetail.Qty == stockDetail.LockQty)
                    {
                        stockDetail.Status = "2";
                    }
                    else if (stockDetail.Qty > stockDetail.LockQty && stockDetail.LockQty > 0)
                    {
                        stockDetail.Status = "1";
                    }
                    else
                    {
                        stockDetail.Status = "0";
                    }
                    if (stockDetail.Qty <= 0)
                    {
                        Db.Deleteable(stockDetail).ExecuteCommand();
                    }
                    else
                    {
                        Db.Updateable(stockDetail).ExecuteCommand();
                    }
                    var num2 = Db.Queryable<DataStockDetail>().Count(m => m.IsDel == "0" && m.PalletNo == palletNo);
                    if (num2 <= 0)
                    {
                        //改变托盘状态
                        var pallet = Db.Queryable<SysPallets>().First(m => m.PalletNo == palletNo && m.IsDel == "0");
                        if (pallet == null)
                        {
                            throw new Exception("未在托盘表中查询到托盘信息");
                        }
                        pallet.Status = "0";
                        Db.Updateable(pallet).ExecuteCommand();
                    }
                    //修改出库单明细拣货数量
                    noticeDetail.CompleteQty += pickQty;
                    Db.Updateable(noticeDetail).ExecuteCommand();
                    var num = Db.Queryable<BllExportNoticeDetail>()
                        .Count(m => m.IsDel == "0" && m.SONo == soNo && m.CompleteQty < m.Qty);
                    if (num <= 0)
                    {
                        notice.Status = "4"; //更改为执行完成
                    }
                    //修改出库单信息
                    Db.Updateable(notice).ExecuteCommand();
                }
                if (isNew)
                {
                    sd.Qty = pickQty;
                    sd.LockQty = pickQty;
                }
                else
                {
                    //修改拼托托盘库存明细
                    pinStockDetail.Qty += pickQty;
                    pinStockDetail.LockQty += pickQty;
                    Db.Updateable(pinStockDetail).ExecuteCommand();
                }
                //添加操作日志记录
                var k = new OperationSOServer().AddLogOperationSo("PDA模块", "拣货拼托", soNo, "拣货", $"在PDA上对出库单号为:{soNo}的原托盘码为:{palletNo},新托盘码为:{palletNoNew}的拣货拼托操作", userId);
                Db.CommitTran();
            }
            catch (Exception e)
            {
                Db.RollbackTran();
                throw new Exception(e.Message);
            }
        }
        /// <summary>
        /// 拼托出库pda拣货-数量
        /// </summary>
        /// <param name="soNo"></param>
        /// <param name="soDetailId"></param>
        /// <param name="palletNo"></param>
        /// <param name="PickQty"></param>
        /// <param name="palletNoNew"></param>
        /// <param name="userId"></param>
        public void SoSetQtyPinPick(string soNo, string soDetailId, string palletNo, string PickQty,string palletNoNew, int userId)
        {
            Db.BeginTran();
            try
            {
                var nowDate = DateTime.Now;//当前时间
                #region 判断
                if (string.IsNullOrWhiteSpace(soNo))
                {
                    throw new Exception("出库单据不能为空");
                }
                //if (string.IsNullOrWhiteSpace(soDetailId))
                //{
                //    throw new Exception("出库物料-批次不能为空");
                //}
                if (string.IsNullOrWhiteSpace(palletNo))
                {
                    throw new Exception("托盘码不能为空");
                }
                if (string.IsNullOrWhiteSpace(palletNoNew))
                {
                    throw new Exception("新托盘码不能为空");
                }
                //出库单
                var notice = Db.Queryable<BllExportNotice>().First(m => m.IsDel == "0" && m.SONo == soNo);
                if (notice == null)
                {
                    throw new Exception("未查询到该出库单的信息");
                }
                if (notice.Status != "3")
                {
                    throw new Exception("出库单的状态不是正在执行,不能拣货");
                }
                //出库单明细
                var noticeDetail = Db.Queryable<BllExportNoticeDetail>()
                    .First(m => m.IsDel == "0" && m.Id == int.Parse(soDetailId));
                if (noticeDetail == null)
                {
                    throw new Exception("未查询到该出库单明细的信息");
                }
                //出库分配信息
                var allot = Db.Queryable<BllExportAllot>().First(m =>
                    m.IsDel == "0" && (m.Status == "2" || m.Status == "3") && m.SONo == soNo &&
                    m.SODetailNo == int.Parse(soDetailId) && m.PalletNo == palletNo);
                if (allot == null)
                {
                    throw new Exception("未查询到该托盘的分配信息");
                }
                //剩余拣货数量(待拣减去已拣)
                var needQty = allot.Qty - allot.CompleteQty;
                if (int.Parse(PickQty) > needQty)
                {
                    throw new Exception("拣货数量不能大于托内剩余待拣数量");
                }
                //库存明细
                var stockDetail = Db.Queryable<DataStockDetail>().First(m => m.IsDel == "0" && m.Id == allot.StockId);
                if (stockDetail == null)
                {
                    throw new Exception("未查询到该托盘分配的库存明细信息!");
                }
                //库存总表
                var stock = Db.Queryable<DataStock>().First(a => a.IsDel == "0" && a.SkuNo == stockDetail.SkuNo && a.LotNo == stockDetail.LotNo);
                if (stock == null)
                {
                    throw new Exception("未查询到该托盘分配的库存信息!");
                }
                #endregion
                #region 拼托信息
                bool isNew = false;
                var pinStockDetail = Db.Queryable<DataStockDetail>().First(m => m.IsDel == "0" && m.PalletNo == palletNoNew);
                if (pinStockDetail != null)
                {
                    if (pinStockDetail.SONo != notice.SONo)
                    {
                        throw new Exception("拼托托盘上只能放同一个出库单下的物料!");
                    }
                    if (pinStockDetail.SkuName != stockDetail.SkuName || pinStockDetail.LotNo != stockDetail.LotNo)
                    {
                        isNew = true;
                    }
                }
                else
                {
                    isNew = true;
                    var newPalletInfo = Db.Queryable<SysPallets>().First(m => m.IsDel == "0" && m.PalletNo == palletNoNew && m.Status == "0");
                    if (newPalletInfo == null)
                    {
                        throw new Exception("新托盘信息不存在或已被使用!");
                    }
                    //修改新托盘状态
                    newPalletInfo.Status = "1";
                    Db.Updateable(newPalletInfo).ExecuteCommand();
                }
                if (isNew)
                {
                    var sd = new DataStockDetail();
                    sd.LotNo = stockDetail.LotNo;
                    sd.LotText = stockDetail.LotText;
                    sd.SupplierLot = stockDetail.SupplierLot;
                    sd.SkuNo = stockDetail.SkuNo;
                    sd.SkuName = stockDetail.SkuName;
                    sd.Standard = stockDetail.Standard;
                    sd.Qty = int.Parse(PickQty);
                    sd.LockQty = int.Parse(PickQty);
                    sd.FrozenQty = 0;
                    sd.InspectQty = 0;
                    sd.ASNNo = "";
                    sd.ASNDetailNo = null;
                    sd.SONo = soNo;//出库单号
                    sd.WareHouseNo = "";
                    sd.RoadwayNo = "";
                    sd.AreaNo = "";
                    sd.LocatNo = "";
                    sd.PalletNo = palletNoNew;
                    sd.PalletNo2 = "";
                    sd.PalletNo3 = "";
                    //PalletType = item.PalletType,
                    sd.CompleteTime = nowDate;
                    sd.ProductionTime = stockDetail.ProductionTime;
                    sd.ExpirationTime = stockDetail.ExpirationTime;
                    sd.Status = "2";//状态,已分配
                    sd.InspectMark = stockDetail.InspectMark;
                    sd.InspectStatus = stockDetail.InspectStatus;
                    sd.BitPalletMark = "0";
                    sd.PackagNo = noticeDetail.PackagNo;
                    sd.IsBale = stockDetail.IsBale;
                    sd.IsBelt = stockDetail.IsBelt;
                    sd.Demo = stockDetail.Demo;
                    sd.OwnerName = stockDetail.OwnerName;
                    sd.OwnerNo = stockDetail.OwnerNo;
                    sd.SupplierName = stockDetail.SupplierName;
                    sd.SupplierNo = stockDetail.SupplierNo;
                    sd.IsDel = "0";
                    sd.CreateUser = userId;
                    sd.CreateTime = nowDate;
                    //新增拼托库存明细信息
                    Db.Insertable(sd).ExecuteReturnIdentity();
                }
                else
                {
                    //修改拼托托盘库存明细
                    pinStockDetail.Qty += int.Parse(PickQty);
                    pinStockDetail.LockQty += int.Parse(PickQty);
                    Db.Updateable(pinStockDetail).ExecuteCommand();
                }
                #endregion
                //获取当前托盘拣货明细
                var complete = Db.Queryable<BllCompleteDetail>().First(a => a.IsDel == "0" && a.PalletNo == palletNo && a.SONo == notice.SONo && a.SODetailNo == noticeDetail.Id && a.ExportAllotId == allot.Id && a.StockId == stockDetail.Id);
                //判读是否存在拣货明细
                int isComplete = 0;
                if (complete != null)
                {
                    isComplete = 1;
                }
                var comList = new List<BllCompleteDetail>();
                //判断是否存在拣货明细
                if (isComplete == 0)
                {
                    //添加拣货明细
                    var completeDetail = new BllCompleteDetail()
                    {
                        SONo = soNo,
                        SODetailNo = int.Parse(soDetailId),
                        ExportAllotId = allot.Id,
                        StockId = allot.StockId,
                        BoxNo = "",
                        BoxNo2 = "",
                        BoxNo3 = "",
                        LotNo = allot.LotNo,
                        LotText = allot.LotText,
                        SupplierLot = allot.SupplierLot,
                        SkuNo = allot.SkuNo,
                        SkuName = allot.SkuName,
                        Standard = allot.Standard,
                        PalletNo = palletNo,
                        CompleteQty = int.Parse(PickQty),
                        CreateUser = userId,
                        CreateTime = Db.GetDate(),
                    };
                    comList.Add(completeDetail);
                    //添加拣货明细
                    Db.Insertable(comList).ExecuteCommand();
                }
                else if (isComplete == 1)
                {
                    complete.CompleteQty += int.Parse(PickQty);
                    complete.UpdateUser = userId;
                    complete.UpdateTime = Db.GetDate();
                    Db.Updateable(complete).ExecuteCommand();
                }
                //修改出库分配信息
                allot.CompleteQty += int.Parse(PickQty);
                allot.Status = allot.Qty == allot.CompleteQty ? "5" : "3";
                allot.UpdateTime = DateTime.Now;
                Db.Updateable(allot).ExecuteCommand();
                int isDel = 0;
                //删除或修改库存明细
                stockDetail.BitPalletMark = "1";//修改为零托标识
                stockDetail.Qty -= int.Parse(PickQty);
                stockDetail.LockQty -= int.Parse(PickQty);
                if (stockDetail.Qty == stockDetail.LockQty)
                {
                    stockDetail.Status = "2";
                }
                else if (stockDetail.Qty > stockDetail.LockQty && stockDetail.LockQty > 0)
                {
                    stockDetail.Status = "1";
                }
                else
                {
                    stockDetail.Status = "0";
                }
                if (stockDetail.Qty <= 0)
                {
                    Db.Deleteable(stockDetail).ExecuteCommand();
                }
                else
                {
                    isDel = 1;
                    Db.Updateable(stockDetail).ExecuteCommand();
                }
                //判断托盘上物料是否拣货完毕
                if (isDel == 0)
                {
                    //改变托盘状态为:未使用
                    var pallet = Db.Queryable<SysPallets>().First(m => m.PalletNo == palletNo && m.IsDel == "0");
                    if (pallet == null)
                    {
                        throw new Exception("未在托盘表中查询到托盘信息");
                    }
                    pallet.Status = "0";
                    Db.Updateable(pallet).ExecuteCommand();
                }
                //修改出库单明细拣货数量
                noticeDetail.CompleteQty += int.Parse(PickQty);
                Db.Updateable(noticeDetail).ExecuteCommand();
                var num = Db.Queryable<BllExportNoticeDetail>()
                    .Count(m => m.IsDel == "0" && m.SONo == soNo && m.CompleteQty < m.Qty);
                if (num <= 0)
                {
                    notice.Status = "4"; //更改为执行完成
                }
                //修改出库单信息
                Db.Updateable(notice).ExecuteCommand();
                //添加操作日志记录
                var k = new OperationSOServer().AddLogOperationSo("PDA模块", "拣货拼托", soNo, "拣货", $"在PDA上对出库单号为:{soNo}的托盘码为:{palletNo},新托盘码为:{palletNoNew}的拣货操作", userId);
                Db.CommitTran();
            }
            catch (Exception e)
            {
                Db.RollbackTran();
                throw new Exception(e.Message);
            }
        }
        #endregion
    }
}