wxw
6 天以前 096ccbee5905d5119e57a929fc19f49f9d5b6618
Wms/WMS.BLL/BllPdaServer/PdaSoServer.cs
@@ -42,7 +42,7 @@
        /// <param name="boxNo"></param>
        /// <param name="palletNoNew"></param>
        /// <param name="userId"></param>
        public async Task SoSetPinPick34(string soNo, string soDetailId, string palletNo, string boxNo , string palletNoNew, int userId)
        public async Task SoSetPinPick34(string soNo, string soDetailId, string palletNo, string boxNo, string palletNoNew, int userId)
        {
            Db.BeginTran();
            try
@@ -122,31 +122,45 @@
                bool isNew = false;
                var pinStockDetail = Db.Queryable<DataStockDetail>().First(m => m.IsDel == "0" && m.PalletNo == palletNoNew && m.SkuNo == stockDetail.SkuNo && m.LotNo == stockDetail.LotNo);
                if (pinStockDetail != null)
                if (pinStockDetail != null)
                {
                    if (palletNo != palletNoNew)//非整托拣货                                                
                    {
                        var pinStockDetails = Db.Queryable<DataStockDetail>().Where(m => m.IsDel == "0" && m.PalletNo == palletNoNew && m.Id!= pinStockDetail.Id).ToList();
                        if (pinStockDetails.Count(m=>m.SONo != notice.SONo) > 0)
                        var pinStockDetails = Db.Queryable<DataStockDetail>().Where(m => m.IsDel == "0" && m.PalletNo == palletNoNew && m.Id != pinStockDetail.Id).ToList();
                        //if (pinStockDetails.Count(m => m.SONo != notice.SONo) > 0)
                        //{
                        //    throw Oops.Bah("拼托托盘上只能放同一个出库单下的物料!");
                        //}
                        //只允许绑定同一个出库单下的物料
                        if (pinStockDetails.GroupBy(e => e.SONo).Count() > 0 && pinStockDetails.Count(m => m.SONo != notice.SONo) > 0)
                        {
                            throw Oops.Bah("拼托托盘上只能放同一个出库单下的物料!");
                        }
                    }
                    sdId = pinStockDetail.Id;
                }
                else
                {
                    isNew = true;
                    var newPalletInfo = await Db.Queryable<SysPallets>().FirstAsync(m => m.IsDel == "0" && m.PalletNo == palletNoNew && m.Status == "0");
                    var newPalletInfo = await Db.Queryable<SysPallets>().FirstAsync(m => m.IsDel == "0" && m.PalletNo == palletNoNew);//&& m.Status == "0"
                    if (newPalletInfo == null)
                    {
                        var pinStockDetails = Db.Queryable<DataStockDetail>().Where(m => m.IsDel == "0" && m.PalletNo == palletNoNew &&(m.SkuNo != stockDetail.SkuNo || m.LotNo != stockDetail.LotNo)).ToList();
                        if (pinStockDetails.Count(m => m.SONo != notice.SONo) > 0)
                        throw Oops.Bah("新托盘信息不存在!");
                    }
                    if (newPalletInfo.Status == "0")
                    {
                        var pinStockDetails = Db.Queryable<DataStockDetail>().Where(m => m.IsDel == "0" && m.PalletNo == palletNoNew && (m.SkuNo != stockDetail.SkuNo || m.LotNo != stockDetail.LotNo)).ToList();
                        //if (pinStockDetails.Count(m => m.SONo != notice.SONo) > 0)
                        //{
                        //    throw Oops.Bah("一个托盘只能接受一个出库单拼托!");
                        //}
                        //只允许绑定同一个出库单下的物料
                        if (pinStockDetails.GroupBy(e => e.SONo).Count() > 0 && pinStockDetails.Count(m => m.SONo != notice.SONo) > 0)
                        {
                            throw Oops.Bah("新托盘信息不存在或已被使用!");
                            throw Oops.Bah("拼托托盘上只能放同一个出库单下的物料!");
                        }
                    }
                    else
@@ -155,9 +169,9 @@
                        newPalletInfo.Status = "1";
                        await Db.Updateable(newPalletInfo).ExecuteCommandAsync();
                    }
                }
                var sd = new DataStockDetail();
                if (isNew)
                {
@@ -230,10 +244,10 @@
                        {
                            throw Oops.Bah($"当前{item.BoxNo}已拣货完成,请勿重复拣货");
                        }
                        if (item.SkuNo != allot.SkuNo || item.LotNo != allot.LotNo)
                        {
                            throw Oops.Bah("当前托盘上有其他不同物料批次,拣货失败");
                        }
                        //if (item.SkuNo != allot.SkuNo || item.LotNo != allot.LotNo)
                        //{
                        //    throw Oops.Bah("当前托盘上有其他不同物料批次,拣货失败");
                        //}
                        //添加拣货明细
                        var completeDetail = new BllCompleteDetail()
                        {
@@ -303,6 +317,19 @@
                    }
                    else
                    {
                        var locateStr = stockDetail.LocatNo;
                        //更改储位状态为空储位
                        var locate = Db.Queryable<SysStorageLocat>().First(m => m.IsDel == "0" && m.LocatNo == locateStr);
                        if (locate != null)
                        {
                            locate.Status = "0";
                            Db.Updateable(locate).ExecuteCommand();
                        }
                        stockDetail.WareHouseNo = "";
                        stockDetail.RoadwayNo = "";
                        stockDetail.AreaNo = "";
                        stockDetail.LocatNo = "";
                        stockDetail.SONo = soNo;
                        stockDetail.UDF5 = "1";
                        await Db.Updateable(stockDetail).ExecuteCommandAsync();
@@ -330,9 +357,9 @@
                    }
                    boxInfos = boxInfo.ToList();
                    var comDetailList = await Db.Queryable<BllCompleteDetail>().Where(m => m.IsDel == "0" && m.ExportAllotId == allot.Id && m.PalletNo == palletNo).ToListAsync();
                    //整箱拣货
                    if (boxInfo.Any(m => m.PalletNo != palletNo))
                    {
                        throw Oops.Bah("该托盘与箱码没有绑定关系");
@@ -342,7 +369,7 @@
                    //{
                    //    throw Oops.Bah("拣货数量不能大于箱内剩余待拣数量");
                    //}
                    foreach (var item in boxInfos)
                    {
                        if (comDetailList.Any(m => m.BoxNo == item.BoxNo))
@@ -350,7 +377,7 @@
                            throw Oops.Bah($"当前{item.BoxNo}已拣货完成,请勿重复拣货");
                        }
                    }
                    var comList = new List<BllCompleteDetail>();
                    foreach (var item in boxInfos)
@@ -386,20 +413,20 @@
                            item.BindNo = null;//托盘绑定号
                            item.PalletNo = palletNoNew;
                        }
                        item.Status = "5";//箱支状态,0:未组托  1:已组托 2:已入库 3:已出库 4:已分配 5:已拣货
                        await Db.Updateable(item).ExecuteCommandAsync();
                        pickQty += item.Qty;
                    }
                    await Db.Insertable(comList).ExecuteCommandAsync();
                    //修改出库分配信息
                    allot.CompleteQty += pickQty;
                    allot.Status = allot.Qty <= allot.CompleteQty ? "5" : "3";
                    allot.UpdateTime = DateTime.Now;
                    await Db.Updateable(allot).ExecuteCommandAsync();
                    //删除或修改库存明细
@@ -429,28 +456,32 @@
                        var locateStr = stockDetail.LocatNo;
                        await Db.Deleteable(stockDetail).ExecuteCommandAsync();
                        //改变托盘状态
                        var pallet = await Db.Queryable<SysPallets>().FirstAsync(m => m.PalletNo == palletNo && m.IsDel == "0");
                        if (pallet == null)
                        var detailOther = Db.Queryable<DataStockDetail>().Where(w => w.IsDel == "0" && w.PalletNo == stockDetail.PalletNo && w.Id != stockDetail.Id).ToList();
                        if (detailOther.Count <= 0)
                        {
                            throw Oops.Bah("未在托盘表中查询到托盘信息");
                        }
                        pallet.Status = "0";
                        await Db.Updateable(pallet).ExecuteCommandAsync();
                            //改变托盘状态
                            var pallet = await Db.Queryable<SysPallets>().FirstAsync(m => m.PalletNo == palletNo && m.IsDel == "0");
                            if (pallet == null)
                            {
                                throw Oops.Bah("未在托盘表中查询到托盘信息");
                            }
                            pallet.Status = "0";
                            await Db.Updateable(pallet).ExecuteCommandAsync();
                        //更改储位状态为空储位
                        var locate = Db.Queryable<SysStorageLocat>().First(m => m.IsDel == "0" && m.LocatNo == locateStr);
                        if (locate != null)
                        {
                            locate.Status = "0";
                            Db.Updateable(locate).ExecuteCommand();
                            //更改储位状态为空储位
                            var locate = Db.Queryable<SysStorageLocat>().First(m => m.IsDel == "0" && m.LocatNo == locateStr);
                            if (locate != null)
                            {
                                locate.Status = "0";
                                Db.Updateable(locate).ExecuteCommand();
                            }
                        }
                    }
                    else
                    {
                        await Db.Updateable(stockDetail).ExecuteCommandAsync();
                    }
                    //修改出库单明细拣货数量
                    noticeDetail.CompleteQty += pickQty;
                    await Db.Updateable(noticeDetail).ExecuteCommandAsync();
@@ -579,7 +610,7 @@
                #region 拼托信息
                bool isNew = false;
                var pinStockDetail = await Db.Queryable<DataStockDetail>().FirstAsync(m => m.IsDel == "0" && m.PalletNo == palletNoNew && m.SkuNo== stockDetail.SkuNo && m.LotNo == stockDetail.LotNo);
                var pinStockDetail = await Db.Queryable<DataStockDetail>().FirstAsync(m => m.IsDel == "0" && m.PalletNo == palletNoNew && m.SkuNo == stockDetail.SkuNo && m.LotNo == stockDetail.LotNo);
                if (pinStockDetail != null)
                {
                    if (palletNo != palletNoNew)//非整托拣货
@@ -788,8 +819,8 @@
                    await Db.Updateable(pallet).ExecuteCommandAsync();
                    //更改储位状态为空储位
                    var locate = Db.Queryable<SysStorageLocat>().First(m=>m.IsDel == "0" && m.LocatNo == locateStr);
                    if (locate!=null)
                    var locate = Db.Queryable<SysStorageLocat>().First(m => m.IsDel == "0" && m.LocatNo == locateStr);
                    if (locate != null)
                    {
                        locate.Status = "0";
                        Db.Updateable(locate).ExecuteCommand();
@@ -1508,7 +1539,7 @@
                //库存明细
                var stockDetail = await Db.Queryable<DataStockDetail>()
                    .FirstAsync(m => m.IsDel == "0" && m.PalletNo == palletNo
                    .FirstAsync(m => m.IsDel == "0" && m.PalletNo == palletNo
                    && m.SkuNo == boxInfos.First().SkuNo && m.LotNo == boxInfos.First().LotNo);
                if (stockDetail == null)
                {
@@ -1519,7 +1550,7 @@
                string skuName = boxInfos.First().SkuName;
                // 验证是否车间线边仓库
                var areaList = new List<string>() { "B06", "B07", "B09" };
                var areaList = new List<string>() { "B06", "B07", "B09", "B24" };
                if (!areaList.Contains(stockDetail.AreaNo))
                {
                    throw Oops.Bah("托盘不是车间托盘!");
@@ -1563,9 +1594,9 @@
                else
                {
                    await Db.Updateable(stockDetail).ExecuteCommandAsync();
                }
                }
                stock.Qty -= pickQty;
                //stock.LockQty -= pickQty;
                stock.LockQty -= pickQty;
                if (stock.Qty <= 0)
                {
                    await Db.Deleteable(stock).ExecuteCommandAsync();
@@ -1606,7 +1637,7 @@
                //添加操作日志记录
                var k = new OperationSOServer().AddLogOperationSo("PDA模块", "车间出库",
                var k = new OperationSOServer().AddLogOperationSo("PDA模块", "车间出库",
                    boxNo, "出库", $"在PDA上对箱号为:{boxNo}的托盘码为:{palletNo}的拣货操作", userId);
                Db.CommitTran();
            }
@@ -1622,7 +1653,7 @@
        }
        // 车间Pda拣货-数量
        public async Task ChejianPickNum(PdaSoVm model, int userId)
        public async Task ChejianPickNum(PdaSoVm model, int userId)
        {
            Db.BeginTran();
            try
@@ -1643,10 +1674,10 @@
                {
                    throw Oops.Bah("物料数量不可为null");
                }
                else
                else
                {
                    skuNum = decimal.Parse(model.PickQty);
                    if (skuNum <= 0)
                    if (skuNum <= 0)
                    {
                        throw Oops.Bah("物料数量应大于0!");
                    }
@@ -1658,9 +1689,9 @@
                {
                    throw Oops.Bah("物料不存在,请检查物料编码是否拯却!");
                }
                else
                else
                {
                    if (skuModel.IsPasteCode != "0")
                    if (skuModel.IsPasteCode != "0")
                    {
                        throw Oops.Bah("该物料为贴标物料,请到标签页面拣货!");
                    }
@@ -1670,14 +1701,14 @@
                //库存明细
                var stockDetail = await Db.Queryable<DataStockDetail>()
                    .FirstAsync(m => m.IsDel == "0" && m.PalletNo == model.PalletNo
                    && m.SkuNo == model.SkuNo  && m.LotNo == model.LotNo);
                    && m.SkuNo == model.SkuNo && m.LotNo == model.LotNo);
                if (stockDetail == null)
                {
                    throw Oops.Bah("未查询到该托盘上货物的库存明细信息!");
                }
                // 验证是否车间线边仓库
                var areaList = new List<string>() { "B06", "B07", "B09" };
                var areaList = new List<string>() { "B06", "B07", "B09", "B24" };
                if (!areaList.Contains(stockDetail.AreaNo))
                {
                    throw Oops.Bah("托盘不是车间托盘!");
@@ -1758,14 +1789,13 @@
                #endregion
                //添加操作日志记录
                var k = new OperationSOServer().AddLogOperationSo("PDA模块", "车间出库",
                    skuModel.SkuName, "拣货", $"在PDA车间出库页上对::{skuModel.SkuName}的物料进行拣货操作", userId);
                var k = new OperationSOServer().AddLogOperationSo("PDA模块", "车间出库", skuModel.SkuName, "拣货", $"在PDA车间出库页上对:{skuModel.SkuName}的物料进行拣货操作", userId);
                Db.CommitTran();
            }
            catch (AppFriendlyException e)
            {
                Db.RollbackTran();
            }
            //catch (AppFriendlyException e)
            //{
            //    Db.RollbackTran();
            //}
            catch (Exception e)
            {
                Db.RollbackTran();
@@ -1849,11 +1879,12 @@
            //}
            if (type == "1")//平库出库获取单据
            {
                var allotList = await Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && m.Status == "1" && m.PalletNo == palletNo).Select(m => m.SONo).Distinct().Where(m => !string.IsNullOrWhiteSpace(m)).ToListAsync();
                var allotList = await Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && m.Status == "1" && m.PalletNo == palletNo).OrderByDescending(m => m.SONo).Select(m => m.SONo).Distinct().Where(m => !string.IsNullOrWhiteSpace(m)).ToListAsync();
                return allotList;
            }
            var noticeList = Db.Queryable<BllExportNotice>().Where(w => w.IsDel == "0" && (w.Status == "3" || w.Status == "4")).Select(s => s.SONo).ToList();
            //获取状态为待拣货或者部分拣货的出库单
            var allotList2 = await Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && (m.Status == "2" || m.Status == "3" || m.Status == "5") && m.PalletNo == palletNo).Select(m => m.SONo).Distinct().Where(m => !string.IsNullOrWhiteSpace(m)).ToListAsync();
            var allotList2 = await Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && (m.Status == "2" || m.Status == "3" || m.Status == "5") && m.PalletNo == palletNo && noticeList.Contains(m.SONo)).OrderByDescending(m => m.SONo).Select(m => m.SONo).Distinct().Where(m => !string.IsNullOrWhiteSpace(m)).ToListAsync();
            //var allotList = Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && m.PalletNo == palletNo).Select(m => m.SONo).Distinct().Where(m => !string.IsNullOrWhiteSpace(m)).ToList();
            //获取出库单据不为待拣货 执行完毕 订单关闭 等待执行的单据
@@ -1869,18 +1900,18 @@
            if (string.IsNullOrWhiteSpace(soNo))//判断托盘是否为空
            {
                throw Oops.Bah("出库单为空,请选择出库单");
            }
            }
            if (string.IsNullOrWhiteSpace(soDetailId))
            {
                throw Oops.Bah("出库明细为空,请选择物料-批次");
            }
            var allotList = await Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && m.Status == "0" && m.SONo == soNo && m.SODetailNo == int.Parse(soDetailId)).Select(m => m.PalletNo).Distinct().Where(m => !string.IsNullOrWhiteSpace(m)).ToListAsync();
            return allotList;
        }
        //获取托盘中含有的执行中的单据
@@ -1888,7 +1919,7 @@
        {
            if (type == "1")//平库出库获取单据
            {
                var allotList = await Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && (m.Status == "1" || m.Status =="0")).Select(m => m.SONo).Distinct().Where(m => !string.IsNullOrWhiteSpace(m)).ToListAsync();
                var allotList = await Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && (m.Status == "1" || m.Status == "0")).Select(m => m.SONo).Distinct().Where(m => !string.IsNullOrWhiteSpace(m)).ToListAsync();
                return allotList;
            }
            //获取状态为待拣货或者部分拣货的出库单
@@ -1910,7 +1941,7 @@
            }
            //获取状态为待拣货或者部分拣货的出库单
            var allotList = Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && m.SONo == soNo && (m.Status == "0" || m.Status == "1"));
            var list = await allotList.GroupBy(m => new { m.SODetailNo, m.SkuNo, m.SkuName, m.LotNo }).Select(m => new DetailIdSkuLotNo()
            {
                SoDetailId = m.SODetailNo,
@@ -1964,7 +1995,7 @@
            {
                OutModel = data.OutMode,
                Standard = data.Standard,
                PickQty = data.Qty,
                PickQty = data.Qty - data.CompleteQty,
                PickedQty = data.CompleteQty
            };
            return data2;
@@ -1978,10 +2009,16 @@
            {
                throw Oops.Bah("未查询到出库单的明细");
            }
            var notice = await Db.Queryable<BllExportNotice>().FirstAsync(m => m.SONo == detail.SONo && m.IsDel == "0");
            if (notice == null)
            {
                throw Oops.Bah("未查询到出库单信息");
            }
            var data = new OutPdaInfo()
            {
                PlanQty = detail.Qty,
                FinishQty = detail.CompleteQty
                FinishQty = detail.CompleteQty,
                OrderCode = notice.OrderCode,
            };
            return data;
        }
@@ -2101,7 +2138,7 @@
        /// <param name="boxNo"></param>
        /// <returns></returns>
        /// <exception cref="Exception"></exception>
        public decimal CheckBoxForPick(string palletNo ,string boxNo)
        public decimal CheckBoxForPick(string palletNo, string boxNo)
        {
            try
            {
@@ -2112,23 +2149,26 @@
                }
                if (string.IsNullOrEmpty(boxNo))
                {
                    throw new Exception("标签条码不可为空!");
                    var boxInfo = Db.Queryable<DataBoxInfo>().Where(w => w.IsDel == "0" && w.PalletNo == palletNo).ToList();
                    boxNum = boxInfo.Sum(s => s.Qty);
                }
                var boxInfo = Db.Queryable<DataBoxInfo>().Where(w => w.IsDel == "0" && w.BoxNo == boxNo && w.PalletNo == palletNo).ToList();
                if (boxInfo.Count <= 0)
                else
                {
                    boxInfo = Db.Queryable<DataBoxInfo>().Where(w => w.IsDel == "0" && w.BoxNo2 == boxNo && w.PalletNo == palletNo).ToList();
                    var boxInfo = Db.Queryable<DataBoxInfo>().Where(w => w.IsDel == "0" && w.BoxNo == boxNo && w.PalletNo == palletNo).ToList();
                    if (boxInfo.Count <= 0)
                    {
                        boxInfo = Db.Queryable<DataBoxInfo>().Where(w => w.IsDel == "0" && w.BoxNo3 == boxNo && w.PalletNo == palletNo).ToList();
                        boxInfo = Db.Queryable<DataBoxInfo>().Where(w => w.IsDel == "0" && w.BoxNo2 == boxNo && w.PalletNo == palletNo).ToList();
                        if (boxInfo.Count <= 0)
                        {
                            boxInfo = Db.Queryable<DataBoxInfo>().Where(w => w.IsDel == "0" && w.BoxNo3 == boxNo && w.PalletNo == palletNo).ToList();
                        }
                    }
                    if (boxInfo == null || boxInfo.Count <= 0)
                    {
                        throw new Exception("标签条码未在该托盘内!");
                    }
                    boxNum = boxInfo.Sum(s => s.Qty);
                }
                if (boxInfo == null || boxInfo.Count <= 0)
                {
                    throw new Exception("标签条码未在该托盘内!");
                }
                boxNum = boxInfo.Sum(s => s.Qty);
                return boxNum;
            }
            catch (Exception ex)
@@ -2359,7 +2399,7 @@
                        pallet.Status = "0";
                        await Db.Updateable(pallet).ExecuteCommandAsync();
                    }
                    //修改出库单明细拣货数量
                    noticeDetail.CompleteQty += pickQty;
                    await Db.Updateable(noticeDetail).ExecuteCommandAsync();
@@ -3026,7 +3066,7 @@
                                await Db.Updateable(item).ExecuteCommandAsync();
                            }
                            pickQty += decimal.Parse(pickQty1);
                        }
                        }
                    }
                    //改变库内箱码是否零箱信息
                    if (biaoShi == "1" || biaoShi == "2")
@@ -3137,6 +3177,475 @@
                                    wave.UpdateUser = userId;
                                    wave.UpdateTime = DateTime.Now;
                                    await Db.Updateable(wave).ExecuteCommandAsync();
                                }
                            }
                        }
                    }
                }
                //添加操作日志记录
                var k = new OperationSOServer().AddLogOperationSo("PDA模块", "拣货出库", soNo, "拣货", $"在PDA上对出库单号为:{soNo}的托盘码为:{palletNo}的拣货操作", userId);
                Db.CommitTran();
            }
            //catch (AppFriendlyException e)
            //{
            //    Db.RollbackTran();
            //}
            catch (Exception e)
            {
                Db.RollbackTran();
                throw new Exception(e.Message);
            }
        }
        /// <summary>
        /// 成品出库pda拣货-JC34
        /// </summary>
        /// <param name="soNo"></param>
        /// <param name="soDetailId"></param>
        /// <param name="palletNo"></param>
        /// <param name="boxNoList"></param>
        /// <param name="userId"></param>
        /// <returns></returns>
        /// <exception cref="Exception"></exception>
        public async Task SoSetPickCode34(string soNo, string soDetailId, string palletNo, List<string> boxNoList, int userId)
        {
            try
            {
                #region 判断
                if (string.IsNullOrWhiteSpace(soNo))
                {
                    throw Oops.Bah("出库单据不能为空");
                }
                if (string.IsNullOrWhiteSpace(soDetailId))
                {
                    throw Oops.Bah("出库物料-批次不能为空");
                }
                if (string.IsNullOrWhiteSpace(palletNo))
                {
                    throw Oops.Bah("托盘码不能为空");
                }
                //开启事务
                Db.BeginTran();
                //出库单
                var notice = await Db.Queryable<BllExportNotice>().FirstAsync(m => m.IsDel == "0" && m.SONo == soNo);
                if (notice == null)
                {
                    throw Oops.Bah("未查询到该出库单的信息");
                }
                if (notice.Status != "3")
                {
                    throw Oops.Bah("出库单的状态不是正在执行,不能拣货");
                }
                //出库单明细
                var noticeDetail = await Db.Queryable<BllExportNoticeDetail>()
                    .FirstAsync(m => m.IsDel == "0" && m.Id == int.Parse(soDetailId));
                if (noticeDetail == null)
                {
                    throw Oops.Bah("未查询到该出库单明细的信息");
                }
                //出库分配信息
                var allot = await Db.Queryable<BllExportAllot>().FirstAsync(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 Oops.Bah("未查询到该托盘的分配信息");
                }
                //剩余拣货数量(待拣减去已拣)
                var needQty = allot.Qty - allot.CompleteQty;
                //库存明细
                var stockDetail = await Db.Queryable<DataStockDetail>().FirstAsync(m => m.IsDel == "0" && m.Id == allot.StockId);
                if (stockDetail == null)
                {
                    throw Oops.Bah("未查询到该托盘分配的库存明细信息!");
                }
                //库存总表
                var stock = await Db.Queryable<DataStock>().FirstAsync(a => a.IsDel == "0" && a.SkuNo == stockDetail.SkuNo && a.LotNo == stockDetail.LotNo);
                if (stock == null)
                {
                    throw Oops.Bah("未查询到该托盘分配的库存信息!");
                }
                #endregion
                if (boxNoList == null || boxNoList.Count <= 0)//整托拣货
                {
                    List<DataBoxInfo> boxInfos;
                    var boxInfo = Db.Queryable<DataBoxInfo>().Where(m => m.IsDel == "0" && m.PalletNo == palletNo && m.SkuNo == stockDetail.SkuNo && m.LotNo == stockDetail.LotNo);//找到托盘上所有箱码
                    boxInfos = await boxInfo.ToListAsync();
                    if (boxInfo.Count() <= 0)
                    {
                        throw Oops.Bah("该托盘上没有可拣货的箱子");
                    }
                    var boxQty = await boxInfo.GroupBy(m => m.PalletNo).Select(m => SqlFunc.AggregateSum(m.Qty)).ToListAsync();
                    if (boxQty[0] > needQty)
                    {
                        throw Oops.Bah("拣货数量不能大于箱内剩余待拣数量");
                    }
                    decimal pickQty = 0;//拣货的数量
                    var comDetailList = await Db.Queryable<BllCompleteDetail>().Where(m => m.IsDel == "0" && m.ExportAllotId == allot.Id && m.PalletNo == palletNo).ToListAsync();
                    var comList = new List<BllCompleteDetail>();
                    foreach (var item in boxInfos)
                    {
                        if (comDetailList.Any(m => m.BoxNo3 == item.BoxNo3) && item.BoxNo3 != null)
                        {
                            throw Oops.Bah($"当前{item.BoxNo}中{item.BoxNo3}已拣货完成,请勿重复拣货");
                        }
                        if (item.SkuNo != allot.SkuNo || item.LotNo != allot.LotNo)
                        {
                            throw Oops.Bah("当前托盘上有其他不同物料批次,拣货失败");
                        }
                        //添加拣货明细
                        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);
                        //删除库存箱码明细
                        await Db.Deleteable(item).ExecuteCommandAsync();
                        pickQty += item.Qty;
                    }
                    //添加拣货明细
                    await Db.Insertable(comList).ExecuteCommandAsync();
                    //修改出库分配信息
                    allot.CompleteQty += pickQty;
                    allot.Status = allot.Qty <= allot.CompleteQty ? "5" : "3";
                    allot.UpdateTime = DateTime.Now;
                    await Db.Updateable(allot).ExecuteCommandAsync();
                    //删除库存明细
                    await Db.Deleteable(stockDetail).ExecuteCommandAsync();
                    //删除或修改库存
                    stock.Qty -= pickQty;
                    stock.LockQty -= pickQty;
                    if (stock.LockQty < 0)
                    {
                        stock.LockQty = 0;
                    }
                    if (stock.Qty <= 0)
                    {
                        await Db.Deleteable(stock).ExecuteCommandAsync();
                    }
                    else
                    {
                        await Db.Updateable(stock).ExecuteCommandAsync();
                    }
                    //判断托盘上还有没有其他物料
                    var palletData = Db.Queryable<DataStockDetail>().First(w => w.IsDel == "0" && w.PalletNo == palletNo && w.Id != stockDetail.Id);
                    if (palletData == null)
                    {
                        //改变托盘状态为:未使用
                        var pallet = Db.Queryable<SysPallets>().First(m => m.PalletNo == palletNo && m.IsDel == "0");
                        if (pallet == null)
                        {
                            throw Oops.Bah("未在托盘表中查询到托盘信息");
                        }
                        pallet.Status = "0";
                        await Db.Updateable(pallet).ExecuteCommandAsync();
                    }
                    //修改出库单明细拣货数量
                    noticeDetail.CompleteQty += pickQty;
                    await Db.Updateable(noticeDetail).ExecuteCommandAsync();
                    var num = await Db.Queryable<BllExportNoticeDetail>()
                        .CountAsync(m => m.IsDel == "0" && m.SONo == soNo && m.CompleteQty < m.Qty);
                    if (num <= 0)
                    {
                        notice.Status = "4"; //更改为执行完成
                        //修改出库单信息
                        await Db.Updateable(notice).ExecuteCommandAsync();
                        if (notice.IsWave == "1")
                        {
                            var waveNum = await Db.Queryable<BllExportNotice>().CountAsync(m => m.IsDel == "0" && m.WaveNo == notice.WaveNo && m.Status != "4");
                            if (waveNum == 0)
                            {
                                var wave = await Db.Queryable<BllWaveMage>().FirstAsync(m => m.IsDel == "0" && m.WaveNo == notice.WaveNo);
                                if (wave != null)
                                {
                                    wave.Status = "4";
                                    wave.UpdateUser = userId;
                                    wave.UpdateTime = DateTime.Now;
                                    await Db.Updateable(wave).ExecuteCommandAsync();
                                }
                            }
                        }
                    }
                }
                else
                {
                    foreach (var boxNo in boxNoList)
                    {
                        var biaoShi = "0";//0:整箱拣货、1:整盒拣货、 2:散支拣货
                        List<DataBoxInfo> boxInfos;
                        var boxInfo = Db.Queryable<DataBoxInfo>().Where(m => m.IsDel == "0" && m.BoxNo == boxNo);
                        if (await boxInfo.CountAsync() == 0)
                        {
                            biaoShi = "1";
                            boxInfo = Db.Queryable<DataBoxInfo>().Where(m => m.IsDel == "0" && m.BoxNo2 == boxNo);
                            if (await boxInfo.CountAsync() == 0)
                            {
                                biaoShi = "2";
                                boxInfo = Db.Queryable<DataBoxInfo>().Where(m => m.IsDel == "0" && m.BoxNo3 == boxNo);
                                if (await boxInfo.CountAsync() == 0)
                                {
                                    throw Oops.Bah("未查询到该箱码及追溯码的信息");
                                }
                            }
                        }
                        boxInfos = await boxInfo.ToListAsync();
                        if (boxInfos[0].SkuNo != allot.SkuNo || boxInfos[0].LotNo != allot.LotNo)
                        {
                            throw Oops.Bah("箱码物料批次和选择物料批次不一致!");
                        }
                        var comDetailList = Db.Queryable<BllCompleteDetail>().Where(m => m.IsDel == "0" && m.ExportAllotId == allot.Id && m.PalletNo == palletNo).ToList();
                        if (biaoShi == "2") //散支拣货
                        {
                            boxInfos = boxInfos.Where(m => m.BoxNo3 == boxNo).ToList();
                            if (boxInfos.Count() == 0)
                            {
                                throw Oops.Bah("未查询到该箱码及追溯码的信息");
                            }
                            if (boxInfos.Count() > 1)
                            {
                                throw Oops.Bah("该追溯支码的信息大于1条,信息错误,请核实!");
                            }
                            if (boxInfos.Any(m => m.PalletNo != palletNo))
                            {
                                throw Oops.Bah("该托盘与箱码没有绑定关系");
                            }
                            var boxQty = boxInfos.First().Qty;
                            //if (boxQty > needQty)
                            //{
                            //    throw Oops.Bah("拣货数量不能大于剩余待拣数量");
                            //}
                            foreach (var item in boxInfos)
                            {
                                if (comDetailList.Any(m => m.BoxNo3 == item.BoxNo3))
                                {
                                    throw Oops.Bah($"当前{item.BoxNo}中{item.BoxNo3}已拣货完成,请勿重复拣货");
                                }
                            }
                        }
                        else if (biaoShi == "1")//整盒拣货
                        {
                            if (boxInfo.Count() == 0)
                            {
                                throw Oops.Bah("未查询到该盒码的信息");
                            }
                            if (boxInfo.Any(m => m.PalletNo != palletNo))
                            {
                                throw Oops.Bah("该托盘与盒码没有绑定关系");
                            }
                            var boxQty = await boxInfo.GroupBy(m => m.BoxNo2).Select(m => SqlFunc.AggregateSum(m.Qty)).ToListAsync();
                            //if (boxQty[0] > needQty)
                            //{
                            //    throw Oops.Bah("拣货数量不能大于箱内剩余待拣数量");
                            //}
                            foreach (var item in boxInfos)
                            {
                                if (comDetailList.Any(m => m.BoxNo3 == item.BoxNo3))
                                {
                                    throw Oops.Bah($"当前{item.BoxNo}中{item.BoxNo3}已拣货完成,请勿重复拣货");
                                }
                            }
                        }
                        else //整箱拣货
                        {
                            if (boxInfo.Count() == 0)
                            {
                                throw Oops.Bah("未查询到该箱码的信息");
                            }
                            if (boxInfo.Any(m => m.PalletNo != palletNo))
                            {
                                throw Oops.Bah("该托盘与箱码没有绑定关系");
                            }
                            var boxQty = await boxInfo.GroupBy(m => m.BoxNo).Select(m => SqlFunc.AggregateSum(m.Qty)).ToListAsync();
                            //if (boxQty[0] > needQty)
                            //{
                            //    throw Oops.Bah("拣货数量不能大于箱内剩余待拣数量");
                            //}
                            foreach (var item in boxInfos)
                            {
                                if (comDetailList.Any(m => m.BoxNo == item.BoxNo))
                                {
                                    throw Oops.Bah($"当前{item.BoxNo}已拣货完成,请勿重复拣货");
                                }
                            }
                        }
                        decimal pickQty = 0;//拣货的数量
                        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 = item.Qty,
                                CreateUser = userId
                            };
                            comList.Add(completeDetail);
                            if (biaoShi != "3")
                            {
                                //删除库存箱码明细
                                await Db.Deleteable(item).ExecuteCommandAsync();
                                pickQty += item.Qty;
                            }
                        }
                        //改变库内箱码是否零箱信息
                        if (biaoShi == "1" || biaoShi == "2")
                        {
                            var boxSurplusList = new List<DataBoxInfo>();
                            if (biaoShi == "1")
                            {
                                boxSurplusList = boxInfo.Where(m => m.BoxNo2 != boxNo).ToList();
                            }
                            else
                            {
                                boxSurplusList = boxInfo.Where(m => m.BoxNo3 != boxNo).ToList();
                            }
                            foreach (var item in boxSurplusList)
                            {
                                item.BitBoxMark = "1";
                                await Db.Updateable(item).ExecuteCommandAsync();
                            }
                        }
                        await Db.Insertable(comList).ExecuteCommandAsync();
                        //修改出库分配信息
                        allot.CompleteQty += pickQty;
                        allot.Status = allot.Qty <= allot.CompleteQty ? "5" : "3";
                        allot.UpdateTime = DateTime.Now;
                        if (allot.Status == "5")
                        {
                            //判断该托盘是否还存在物料 存在改为待回库 待回库完成后改为已完成
                        }
                        await Db.Updateable(allot).ExecuteCommandAsync();
                        //删除或修改库存明细
                        stockDetail.BitPalletMark = "1";//修改为零托标识
                        stockDetail.Qty -= pickQty;
                        stockDetail.LockQty -= pickQty;
                        if (stockDetail.LockQty < 0)
                        {
                            stockDetail.LockQty = 0;
                        }
                        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)
                        {
                            await Db.Deleteable(stockDetail).ExecuteCommandAsync();
                        }
                        else
                        {
                            await Db.Updateable(stockDetail).ExecuteCommandAsync();
                        }
                        stock.Qty -= pickQty;
                        stock.LockQty -= pickQty;
                        if (stock.LockQty < 0)
                        {
                            stock.LockQty = 0;
                        }
                        if (stock.Qty <= 0)
                        {
                            await Db.Deleteable(stock).ExecuteCommandAsync();
                        }
                        else
                        {
                            await Db.Updateable(stock).ExecuteCommandAsync();
                        }
                        var num2 = await Db.Queryable<DataStockDetail>().CountAsync(m => m.IsDel == "0" && m.PalletNo == palletNo);
                        if (num2 <= 0)
                        {
                            //改变托盘状态
                            var pallet = await Db.Queryable<SysPallets>().FirstAsync(m => m.PalletNo == palletNo && m.IsDel == "0");
                            if (pallet == null)
                            {
                                throw Oops.Bah("未在托盘表中查询到托盘信息");
                            }
                            pallet.Status = "0";
                            await Db.Updateable(pallet).ExecuteCommandAsync();
                        }
                        //修改出库单明细拣货数量
                        noticeDetail.CompleteQty += pickQty;
                        await Db.Updateable(noticeDetail).ExecuteCommandAsync();
                        var num = await Db.Queryable<BllExportNoticeDetail>()
                            .CountAsync(m => m.IsDel == "0" && m.SONo == soNo && m.CompleteQty < m.Qty);
                        if (num <= 0)
                        {
                            notice.Status = "4"; //更改为执行完成
                                                 //修改出库单信息
                            await Db.Updateable(notice).ExecuteCommandAsync();
                            if (notice.IsWave == "1")
                            {
                                var waveNum = await Db.Queryable<BllExportNotice>()
                                    .CountAsync(m => m.IsDel == "0" && m.WaveNo == notice.WaveNo && m.Status != "4");
                                if (waveNum == 0)
                                {
                                    var wave = await Db.Queryable<BllWaveMage>().FirstAsync(m => m.IsDel == "0" && m.WaveNo == notice.WaveNo);
                                    if (wave != null)
                                    {
                                        wave.Status = "4";
                                        wave.UpdateUser = userId;
                                        wave.UpdateTime = DateTime.Now;
                                        await Db.Updateable(wave).ExecuteCommandAsync();
                                    }
                                }
                            }
                        }
@@ -3301,7 +3810,7 @@
                else
                {
                    stockDetail.Status = "0";
                }
                }
                if (stockDetail.Qty <= 0)
                {
                    await Db.Deleteable(stockDetail).ExecuteCommandAsync();
@@ -3529,7 +4038,7 @@
                    {
                        endroad = new AllotLocation().RoadwayToStationNum(locat.RoadwayNo, model.OutMode);
                    }
                    outDtoList.Add(new OutCommandDto()
                    {
                        TaskNo = exTask.TaskNo, // 任务号
@@ -3614,8 +4123,8 @@
            var info = Db.Queryable<BllExportAllot>()
                .LeftJoin<DataStockDetail>((a, b) => a.PalletNo == b.PalletNo)
                .Where(a=>a.IsDel == "0" && (a.Status == "0"||a.Status =="1") && a.SONo == soNo)
                .GroupBy((a,b) => new { a.SkuNo, a.SkuName, a.LotNo}).Select((a,b) => new BoxInfo()
                .Where(a => a.IsDel == "0" && (a.Status == "0" || a.Status == "1") && a.SONo == soNo)
                .GroupBy((a, b) => new { a.SkuNo, a.SkuName, a.LotNo }).Select((a, b) => new BoxInfo()
                {
                    SkuNo = a.SkuNo,
                    SkuName = a.SkuName,
@@ -3640,15 +4149,15 @@
        }
        //获取平库单据中托盘位置信息
        public async Task<List<BoxInfo>> GetPingKuLocationInfo(string soNo,string skuno,string lotno)
        public async Task<List<BoxInfo>> GetPingKuLocationInfo(string soNo, string skuno, string lotno)
        {
            var info = Db.Queryable<BllExportAllot>()
                .LeftJoin<DataStockDetail>((a, b) => a.PalletNo == b.PalletNo)
                .LeftJoin<SysWareHouse>((a,b,c)=>b.WareHouseNo == c.WareHouseNo)
                .LeftJoin<SysStorageArea>((a,b,c,d)=>b.AreaNo == d.AreaNo)
                .LeftJoin<SysWareHouse>((a, b, c) => b.WareHouseNo == c.WareHouseNo)
                .LeftJoin<SysStorageArea>((a, b, c, d) => b.AreaNo == d.AreaNo)
                .Where(a => a.IsDel == "0" && (a.Status == "0" || a.Status == "1") && a.SONo == soNo && a.SkuNo == skuno && a.LotNo == lotno)
                .GroupBy((a, b,c,d) => new { a.PalletNo, b.LocatNo,c.WareHouseName,d.AreaName }).Select((a, b,c,d) => new BoxInfo()
                .GroupBy((a, b, c, d) => new { a.PalletNo, b.LocatNo, c.WareHouseName, d.AreaName }).Select((a, b, c, d) => new BoxInfo()
                {
                    PalletNo = a.PalletNo,
                    LocatNo = b.LocatNo,
@@ -3868,7 +4377,7 @@
        }
        //取样出库拣货(标签)
        public async Task SampleSoSetPick(string soType, string soNo, string soDetailId, string palletNo, string boxNo, string boxNo3,
        public async Task SampleSoSetPick(string soType, string soNo, string soDetailId, string palletNo, string boxNo, string boxNo3,
            string pickQty1, string asnNo, int userId)
        {
            Db.BeginTran();