zhaowc
2025-02-28 157abc191c34e57c1b958ae74fc3de6518ca8a30
Wms/WMS.BLL/BllPdaServer/PdaSoServer.cs
@@ -18,6 +18,9 @@
using WMS.BLL.LogServer;
using WMS.DAL;
using WMS.Entity.LogEntity;
using Model.ModelDto.SysDto;
using Model.ModelDto.BllSoDto;
using System.Security.Policy;
namespace WMS.BLL.BllPdaServer
{
@@ -66,6 +69,11 @@
                if (string.IsNullOrWhiteSpace(palletNo))//判断托盘是否为空
                {
                    throw new Exception("托盘码为空,请输入托盘码");
                }
                var palletInfo = Db.Queryable<DataStockDetail>().First(w => w.IsDel == "0" && w.PalletNo == palletNo);
                if (!string.IsNullOrEmpty(palletInfo.WareHouseNo) && type != "1")
                {
                    throw new Exception("该托盘还未出库");
                }
                if (type == "1")//平库出库获取单据
                {
@@ -242,7 +250,19 @@
                        {
                            foreach (var demo in list)
                            {
                                var com = comInfo.FirstOrDefault(m => m.IsDel == "0" && m.BoxNo3 == demo.BoxNo);
                                //if (!string.IsNullOrWhiteSpace(boxNo3))
                                //{
                                //    var com = comInfo.FirstOrDefault(m => m.IsDel == "0" && m.BoxNo3 == demo.BoxNo);
                                //}
                                //else if (!string.IsNullOrWhiteSpace(boxNo))
                                //{
                                //    if (expr)
                                //    {
                                //    }
                                //}
                                var com = comInfo.FirstOrDefault(m => m.IsDel == "0" && m.BoxNo3 != null && m.BoxNo3 == demo.BoxNo);
                                if (com != null)
                                {
                                    demo.PickedQty = com.CompleteQty;
@@ -296,24 +316,30 @@
                {
                    throw new Exception($"{palletNo}托盘上存在箱码信息,无法在数量拣货进行操作!");
                }
                //出库单明细
                var noticeDetail = Db.Queryable<BllExportNoticeDetail>().First(a => a.Id == int.Parse(soDetailId) && a.IsDel == "0");
                if (noticeDetail == null)
                BllExportAllot allot = null;
                if (!string.IsNullOrWhiteSpace(soDetailId))
                {
                    throw new Exception($"未查询到对应出库单明细信息,请核实!");
                    //出库单明细
                    var noticeDetail = Db.Queryable<BllExportNoticeDetail>().First(a => a.Id == int.Parse(soDetailId) && a.IsDel == "0");
                    if (noticeDetail == null)
                    {
                        throw new Exception($"未查询到对应出库单明细信息,请核实!");
                    }
                    //出库单总单
                    var notice = Db.Queryable<BllExportNotice>().First(a => a.IsDel == "0" && a.SONo == noticeDetail.SONo);
                    if (notice == null)
                    {
                        throw new Exception($"未查询到对应出库单总单信息,请核实!");
                    }
                    //分配信息
                    allot = Db.Queryable<BllExportAllot>().First(a => a.IsDel == "0" && a.SONo == notice.SONo && a.SODetailNo == noticeDetail.Id && a.PalletNo == palletNo && (a.Status == "2" || a.Status == "3"));
                    if (allot == null)
                    {
                        throw new Exception($"未查询到对应分配信息,请核实!");
                    }
                }
                //出库单总单
                var notice = Db.Queryable<BllExportNotice>().First(a => a.IsDel == "0" && a.SONo == noticeDetail.SONo);
                if (notice == null)
                {
                    throw new Exception($"未查询到对应出库单总单信息,请核实!");
                }
                //分配信息
                var allot = Db.Queryable<BllExportAllot>().First(a => a.IsDel == "0" && a.SONo == notice.SONo && a.SODetailNo == noticeDetail.Id && a.PalletNo == palletNo && a.Status == "2" || a.Status == "3");
                if (allot == null)
                {
                    throw new Exception($"未查询到对应分配信息,请核实!");
                }
                //库存明细
                var detail = Db.Queryable<DataStockDetail>().First(a => a.IsDel == "0" && a.PalletNo == palletNo);
                if (detail == null)
@@ -329,8 +355,8 @@
                {
                    SkuNo = detail.SkuNo,
                    BoxNo = detail.SkuNo,
                    Qty = (int)allot.Qty,
                    PickedQty = (int)allot.CompleteQty,
                    Qty = allot == null ? (int)(detail.Qty - detail.LockQty) : (int)allot.Qty,
                    PickedQty = allot == null ? 0 : (int)allot.CompleteQty,
                };
                pdaInfo.Add(info);
@@ -363,7 +389,7 @@
                {
                    throw new Exception("托盘码不能为空");
                }
                if (!string.IsNullOrEmpty(boxNo3) && !string.IsNullOrEmpty(pickQty1) && int.Parse(pickQty1) > 0)
                if (!string.IsNullOrEmpty(boxNo3) && !string.IsNullOrEmpty(pickQty1) && decimal.Parse(pickQty1) > 0)
                {
                    throw new Exception("追溯条码和拣货数量不能同时输入");
                }
@@ -374,9 +400,21 @@
                {
                    throw new Exception("未查询到该出库单的信息");
                }
                if (notice.Status != "3")
                var type1 = new List<string>() { "0", "4" }; //拣货不可多出 成品出库、不合格品出库
                var type2 = new List<string>() { "1", "2", "3", "5", "6", "7", "8" };//拣货可多出 领料出库、抽检出库、物料取样出库、中间品出库、代储出库、其他出库、寄存出库
                if (type1.Contains(notice.Type))
                {
                    throw new Exception("出库单的状态不是正在执行,不能拣货");
                    if (notice.Status != "3")
                    {
                        throw new Exception("出库单的状态不是正在执行,不能拣货");
                    }
                }
                if (type2.Contains(notice.Type))
                {
                    if (notice.Status != "3" && notice.Status != "4")
                    {
                        throw new Exception("出库单的状态不是正在执行或执行完成,不能拣货");
                    }
                }
                //出库单明细
                var noticeDetail = Db.Queryable<BllExportNoticeDetail>()
@@ -409,6 +447,7 @@
                    throw new Exception("未查询到该托盘分配的库存信息!");
                }
                #endregion
                if (string.IsNullOrWhiteSpace(boxNo))//整托拣货
                {
                    List<DataBoxInfo> boxInfos;
@@ -423,12 +462,12 @@
                    {
                        throw new Exception("拣货数量不能大于箱内剩余待拣数量");
                    }
                    var pickQty = 0;//拣货的数量
                    decimal 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 (comDetailList.Any(m => m.BoxNo3 == item.BoxNo3))
                        if (comDetailList.Any(m => m.BoxNo3 == item.BoxNo3) && item.BoxNo3 != null)
                        {
                            throw new Exception($"当前{item.BoxNo}中{item.BoxNo3}已拣货完成,请勿重复拣货");
                        }
@@ -494,6 +533,7 @@
                    Db.Updateable(pallet).ExecuteCommand();
                    //修改出库单明细拣货数量
                    noticeDetail.CompleteQty += pickQty;
                    noticeDetail.Status = "2";
                    Db.Updateable(noticeDetail).ExecuteCommand();
                    var num = Db.Queryable<BllExportNoticeDetail>()
@@ -501,7 +541,10 @@
                    if (num <= 0)
                    {
                        notice.Status = "4"; //更改为执行完成
                        noticeDetail.Status = "3";
                        Db.Updateable(noticeDetail).ExecuteCommand();
                    }
                    //修改出库单信息
                    Db.Updateable(notice).ExecuteCommand();
                }
@@ -509,12 +552,14 @@
                {
                    var biaoShi = "0";//0:整箱拣货、1:散支拣货、2:数量拣货
                    List<DataBoxInfo> boxInfos;
                    var boxInfo = Db.Queryable<DataBoxInfo>().Where(m => m.IsDel == "0" && m.BoxNo == boxNo);
                    var boxInfo = Db.Queryable<DataBoxInfo>().Where(m => m.IsDel == "0" && m.BoxNo == boxNo && m.StockDetailId == stockDetail.Id);
                    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();
@@ -538,20 +583,28 @@
                            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)//数量拣货
                    else if (!string.IsNullOrEmpty(pickQty1) && decimal.Parse(pickQty1) > 0)//数量拣货
                    {
                        if (boxInfo.Count() > 1)
                        {
                            throw new Exception("该箱码内存在支码不能进行数量拣货");
                        }
                        int boxQty = boxInfo.First().Qty;
                        if (Convert.ToInt32(pickQty1) > boxQty)
                        decimal boxQty = boxInfo.First().Qty;
                        if (Convert.ToDecimal(pickQty1) > boxQty)
                        {
                            throw new Exception("拣货数量不能大于箱内数量");
                        }
                        if (Convert.ToInt32(pickQty1) > needQty)
                        if (Convert.ToDecimal(pickQty1) > needQty)
                        {
                            throw new Exception("拣货数量不能大于剩余待拣数量");
                        }
@@ -573,16 +626,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();
                    decimal pickQty = 0;//拣货的数量
                    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()
                        {
@@ -601,7 +658,7 @@
                            SkuName = allot.SkuName,
                            Standard = allot.Standard,
                            PalletNo = palletNo,
                            CompleteQty = biaoShi == "2" ? int.Parse(pickQty1) : item.Qty,
                            CompleteQty = biaoShi == "2" ? decimal.Parse(pickQty1) : item.Qty,
                            CreateUser = userId
                        };
@@ -609,24 +666,28 @@
                        if (biaoShi != "2")
                        {
                            pickQty += item.Qty;
                            //删除库存箱码明细
                            Db.Deleteable(item).ExecuteCommand();
                            Db.Deleteable(item).ExecuteCommand();
                        }
                        else//数量拣货
                        {
                            if (int.Parse(pickQty1) == item.Qty)
                            if (decimal.Parse(pickQty1) == item.Qty)
                            {
                                pickQty += item.Qty;
                                //删除库存箱码明细
                                Db.Deleteable(item).ExecuteCommand();
                            }
                            else
                            {
                                item.Qty -= int.Parse(pickQty1);
                                pickQty += decimal.Parse(pickQty1);
                                item.Qty -= decimal.Parse(pickQty1);
                                item.BitBoxMark = "1";//零箱标识
                                Db.Updateable(item).ExecuteCommand();
                            }
                        }
                        pickQty += item.Qty;
                    }
                    //改变库内箱码是否零箱信息
                    if (biaoShi == "1")
@@ -699,6 +760,7 @@
                    }
                    //修改出库单明细拣货数量
                    noticeDetail.CompleteQty += pickQty;
                    noticeDetail.Status = "2";
                    Db.Updateable(noticeDetail).ExecuteCommand();
                    var num = Db.Queryable<BllExportNoticeDetail>()
@@ -706,6 +768,9 @@
                    if (num <= 0)
                    {
                        notice.Status = "4"; //更改为执行完成
                        noticeDetail.Status = "3";
                        Db.Updateable(noticeDetail).ExecuteCommand();
                    }
                    //修改出库单信息
                    Db.Updateable(notice).ExecuteCommand();
@@ -769,7 +834,7 @@
                }
                //剩余拣货数量(待拣减去已拣)
                var needQty = allot.Qty - allot.CompleteQty;
                if (int.Parse(PickQty) > needQty)
                if (decimal.Parse(PickQty) > needQty)
                {
                    throw new Exception("拣货数量不能大于托内剩余待拣数量");
                }
@@ -799,6 +864,7 @@
                var comList = new List<BllCompleteDetail>();
                //判断是否存在拣货明细
                isComplete = 0;// 所有无箱码或一级箱码拣货时,拣货明细应重新插入数据(体现多次拣货流程记录)
                if (isComplete == 0)
                {
                    //添加拣货明细
@@ -831,17 +897,15 @@
                }
                else if (isComplete == 1)
                {
                    complete.CompleteQty += int.Parse(PickQty);
                    complete.CompleteQty += decimal.Parse(PickQty);
                    complete.UpdateUser = userId;
                    complete.UpdateTime = Db.GetDate();
                    Db.Updateable(complete).ExecuteCommand();
                }
                //修改出库分配信息
                allot.CompleteQty += int.Parse(PickQty);
                allot.CompleteQty += decimal.Parse(PickQty);
                allot.Status = allot.Qty == allot.CompleteQty ? "5" : "3";
                allot.UpdateTime = DateTime.Now;
                Db.Updateable(allot).ExecuteCommand();
@@ -850,8 +914,8 @@
                //删除或修改库存明细
                stockDetail.BitPalletMark = "1";//修改为零托标识
                stockDetail.Qty -= int.Parse(PickQty);
                stockDetail.LockQty -= int.Parse(PickQty);
                stockDetail.Qty -= decimal.Parse(PickQty);
                stockDetail.LockQty -= decimal.Parse(PickQty);
                if (stockDetail.Qty == stockDetail.LockQty)
                {
                    stockDetail.Status = "2";
@@ -874,8 +938,8 @@
                    Db.Updateable(stockDetail).ExecuteCommand();
                }
                //删除或修改库存
                stock.Qty -= int.Parse(PickQty);
                stock.LockQty -= int.Parse(PickQty);
                stock.Qty -= decimal.Parse(PickQty);
                stock.LockQty -= decimal.Parse(PickQty);
                if (stock.Qty <= 0)
                {
                    Db.Deleteable(stock).ExecuteCommand();
@@ -898,9 +962,10 @@
                    pallet.Status = "0";
                    Db.Updateable(pallet).ExecuteCommand();
                }
                //修改出库单明细拣货数量
                noticeDetail.CompleteQty += int.Parse(PickQty);
                noticeDetail.Status = "2";
                Db.Updateable(noticeDetail).ExecuteCommand();
                var num = Db.Queryable<BllExportNoticeDetail>()
@@ -908,6 +973,8 @@
                if (num <= 0)
                {
                    notice.Status = "4"; //更改为执行完成
                    noticeDetail.Status = "3";
                    Db.Updateable(noticeDetail).ExecuteCommand();
                }
                //修改出库单信息
                Db.Updateable(notice).ExecuteCommand();
@@ -936,7 +1003,9 @@
            try
            {
                string strMsg = "";
                var outDtoList = new List<OutCommandDto>(); //出库数据的集合
                var outDto1 = new List<OutCommandDto>(); //先出库数据的集合(深度为1的储位)
                var outDto2 = new List<OutCommandDto>(); //后出库数据的集合(深度为2的储位)
                var moveDto = new List<OutCommandDto>(); //要移库数据的集合
                //获取当前时间
                DateTime serverTime = Db.GetDate();
                //获取库存明细是否小于等于该垛数
@@ -960,132 +1029,656 @@
                    return strMsg;
                }
                int i = 0;
                var com = new Common();
                Db.BeginTran();
                //遍历库存信息 
                foreach (var s in stockDetail)
                {
                    //if (outDto1.Contains(m=>m.PalletNo == s.PalletNo) >0)
                    //{
                    //    continue;
                    //}
                    //获取储位信息
                    var locat = Db.Queryable<SysStorageLocat>().First(l => l.LocatNo == s.LocatNo && l.IsDel == "0" && l.WareHouseNo == "W01");
                    if (locat != null)
                    if(locat == null)
                    {
                        if (locat.Status != "1")
                        {
                            continue;
                        }
                        //更改储位状态为出库中
                        locat.Status = "3"; //3 出库中
                        locat.UpdateTime = serverTime; //修改时间
                        locat.UpdateUser = userId; //修改人
                        //修改储位信息
                        Db.Updateable(locat).ExecuteCommand();
                        continue;
                    }
                    //增加库存锁定数量
                    //stock.AllotQty +=
                    stock.LockQty += (int)s.Qty; //锁定数量
                    stock.UpdateTime = serverTime; //修改时间
                    stock.UpdateUser = userId; //修改人
                    //修改库存总表信息
                    Db.Updateable(stock).ExecuteCommand();
                    //增加库存明细锁定数量
                    //s.AllotQty +=
                    s.LockQty += (int)s.Qty; //锁定数量
                    s.UpdateTime = serverTime; //修改时间
                    s.UpdateUser = userId; //修改人
                    s.Status = "2"; //2 已分配
                    //修改库存明细信息
                    Db.Updateable(s).ExecuteCommand();
                    #region 分配
                    //添加分配表信息
                    var allot = new BllExportAllot
                    ////更改储位状态为出库中
                    //locat.Status = "3"; //3 出库中
                    //locat.UpdateTime = serverTime; //修改时间
                    //locat.UpdateUser = userId; //修改人
                    ////修改储位信息
                    //Db.Updateable(locat).ExecuteCommand();
                    if (locat.Status == "1")
                    {
                        SONo = "",
                        WaveNo = "",
                        SODetailNo = 0,
                        StockId = s.Id,
                        LotNo = "",
                        LotText = "",
                        SupplierLot = "",
                        SkuNo = s.SkuNo,
                        SkuName = s.SkuName,
                        Standard = s.Standard,
                        PalletNo = s.PalletNo,
                        IsBale = "0", //是否裹包
                        IsBelt = "0", //是否打带
                        if (locat.Depth == "01") //深度为1
                        {
                            #region 改变库存
                        //BoxexQty = s.Qty,
                        Qty = (int)s.Qty,
                        CompleteQty = 0,
                        Status = "1",
                        LogisticsId = 0,
                        IsAdvance = "0",
                        OutMode = model.OutMode,//出库口
                            //增加库存锁定数量
                            stock.LockQty += (int)s.Qty; //锁定数量
                            stock.UpdateTime = serverTime; //修改时间
                            stock.UpdateUser = userId; //修改人
                            Db.Updateable(stock).ExecuteCommand();//修改库存总表信息
                        CreateUser = userId,
                        CreateTime = DateTime.Now
                    };
                    Db.Insertable(allot).ExecuteCommand();
                            //增加库存明细锁定数量
                            s.LockQty += (int)s.Qty; //锁定数量
                            s.UpdateTime = serverTime; //修改时间
                            s.UpdateUser = userId; //修改人
                            s.Status = "2"; //2 已分配
                            Db.Updateable(s).ExecuteCommand();//修改库存明细信息
                    #endregion
                            #endregion
                    #region 添加出库任务信息
                            #region 分配
                    var taskNo = new Common().GetMaxNo("TK");
                    var exTask = new LogTask    //出库任务
                            //添加分配表信息
                            var allot = new BllExportAllot
                            {
                                SONo = "",
                                WaveNo = "",
                                SODetailNo = 0,
                                StockId = s.Id,
                                LotNo = "",
                                LotText = "",
                                SupplierLot = "",
                                SkuNo = s.SkuNo,
                                SkuName = s.SkuName,
                                Standard = s.Standard,
                                PalletNo = s.PalletNo,
                                IsBale = "0", //是否裹包
                                IsBelt = "0", //是否打带
                                //BoxexQty = s.Qty,
                                Qty = (int)s.Qty,
                                CompleteQty = 0,
                                Status = "1",
                                LogisticsId = 0,
                                IsAdvance = "0",
                                OutMode = model.OutMode,//出库口
                                CreateUser = userId,
                                CreateTime = DateTime.Now
                            };
                            Db.Insertable(allot).ExecuteCommand();
                            #endregion
                            #region 添加出库任务信息
                            var taskNo = new Common().GetMaxNo("TK");
                            var exTask = new LogTask    //出库任务
                            {
                                TaskNo = taskNo,
                                Sender = "WMS",
                                Receiver = "PDA",
                                IsSuccess = 1, //是否下发成功 0失败 1成功
                                StartLocat = locat == null ? "" : s.LocatNo,//起始位置
                                EndLocat = model.OutMode,//目标位置
                                PalletNo = s.PalletNo,//托盘码
                                IsSend = 1,//是否可再次下发
                                IsCancel = 1,//是否可取消
                                IsFinish = 1,//是否可完成
                                Type = "1",//任务类型 0 入库任务 1 出库任务  2 移库任务
                                Status = "1",//任务状态0:等待执行1正在执行2执行完成
                                OrderType = "1",//0 入库单 1 出库单  2 盘点单  3 移库单
                                CreateTime = serverTime, //创建时间
                                CreateUser = userId, //创建人
                                Msg = "Pda空托从" + locat == null ? "" : s.LocatNo + "到" + model.OutMode + "的出库任务", //关键信息
                                                                                                                 //FinishDate = serverTime, //完成时间
                            };
                            outDto1.Add(new OutCommandDto()
                            {
                                PalletNo = exTask.PalletNo,//托盘号
                                StartLocate = exTask.StartLocat, // 起始位置
                                StartRoadway = locat.RoadwayNo, //所属巷道
                                EndLocate = model.OutMode, // 目标位置
                                TaskNo = exTask.TaskNo, // 任务号
                                TaskType = "1",// 任务类型 (出库)
                                OutMode = model.OutMode,  //目标地址
                                Order = 1
                            });
                            Db.Insertable(exTask).ExecuteCommand();
                            #endregion
                            #region 储位状态变更
                            //更改储位状态为出库中
                            locat.Status = "3"; //3 出库中
                            Db.Updateable(locat).ExecuteCommand();//修改储位信息
                            #endregion
                        }
                        else if (locat.Depth == "02") //深度为2
                        {
                            //获取出库深度为2储位前面的储位信息
                            var sql2 = $@"select * from SysStorageLocat where  WareHouseNo = '{locat.WareHouseNo}' and row = {locat.Row} and [Column] = {locat.Column} and Layer = {locat.Layer} and Depth = '01'; ";
                            var slotBefore = Db.Ado.SqlQuery<SysStorageLocat>(sql2).First();
                            if (slotBefore == null)
                            {
                                #region 改变库存
                                //增加库存锁定数量
                                stock.LockQty += (int)s.Qty; //锁定数量
                                stock.UpdateTime = serverTime; //修改时间
                                stock.UpdateUser = userId; //修改人
                                Db.Updateable(stock).ExecuteCommand();//修改库存总表信息
                                //增加库存明细锁定数量
                                s.LockQty += (int)s.Qty; //锁定数量
                                s.UpdateTime = serverTime; //修改时间
                                s.UpdateUser = userId; //修改人
                                s.Status = "2"; //2 已分配
                                Db.Updateable(s).ExecuteCommand();//修改库存明细信息
                                #endregion
                                #region 分配
                                //添加分配表信息
                                var allot = new BllExportAllot
                                {
                                    SONo = "",
                                    WaveNo = "",
                                    SODetailNo = 0,
                                    StockId = s.Id,
                                    LotNo = "",
                                    LotText = "",
                                    SupplierLot = "",
                                    SkuNo = s.SkuNo,
                                    SkuName = s.SkuName,
                                    Standard = s.Standard,
                                    PalletNo = s.PalletNo,
                                    IsBale = "0", //是否裹包
                                    IsBelt = "0", //是否打带
                                    //BoxexQty = s.Qty,
                                    Qty = (int)s.Qty,
                                    CompleteQty = 0,
                                    Status = "1",
                                    LogisticsId = 0,
                                    IsAdvance = "0",
                                    OutMode = model.OutMode,//出库口
                                    CreateUser = userId,
                                    CreateTime = DateTime.Now
                                };
                                Db.Insertable(allot).ExecuteCommand();
                                #endregion
                                #region 添加出库任务信息
                                var taskNo = new Common().GetMaxNo("TK");
                                var exTask = new LogTask    //出库任务
                                {
                                    TaskNo = taskNo,
                                    Sender = "WMS",
                                    Receiver = "PDA",
                                    IsSuccess = 1, //是否下发成功 0失败 1成功
                                    StartLocat = locat == null ? "" : s.LocatNo,//起始位置
                                    EndLocat = model.OutMode,//目标位置
                                    PalletNo = s.PalletNo,//托盘码
                                    IsSend = 1,//是否可再次下发
                                    IsCancel = 1,//是否可取消
                                    IsFinish = 1,//是否可完成
                                    Type = "1",//任务类型 0 入库任务 1 出库任务  2 移库任务
                                    Status = "1",//任务状态0:等待执行1正在执行2执行完成
                                    OrderType = "1",//0 入库单 1 出库单  2 盘点单  3 移库单
                                    CreateTime = serverTime, //创建时间
                                    CreateUser = userId, //创建人
                                    Msg = "Pda空托从" + locat == null ? "" : s.LocatNo + "到" + model.OutMode + "的出库任务", //关键信息
                                                                                                                     //FinishDate = serverTime, //完成时间
                                };
                                outDto1.Add(new OutCommandDto()
                                {
                                    PalletNo = exTask.PalletNo,//托盘号
                                    StartLocate = exTask.StartLocat, // 起始位置
                                    StartRoadway = locat.RoadwayNo, //所属巷道
                                    EndLocate = model.OutMode, // 目标位置
                                    TaskNo = exTask.TaskNo, // 任务号
                                    TaskType = "1",// 任务类型 (出库)
                                    OutMode = model.OutMode,  //目标地址
                                    Order = 1
                                });
                                Db.Insertable(exTask).ExecuteCommand();
                                #endregion
                                #region 储位状态变更
                                //更改储位状态为出库中
                                locat.Status = "3"; //3 出库中
                                Db.Updateable(locat).ExecuteCommand();//修改储位信息
                                #endregion
                            }
                            else
                            {
                                //判断储位状态
                                if (slotBefore.Status == "0")
                                {
                                    #region 改变库存
                                    //增加库存锁定数量
                                    stock.LockQty += (int)s.Qty; //锁定数量
                                    stock.UpdateTime = serverTime; //修改时间
                                    stock.UpdateUser = userId; //修改人
                                    Db.Updateable(stock).ExecuteCommand();//修改库存总表信息
                                    //增加库存明细锁定数量
                                    s.LockQty += (int)s.Qty; //锁定数量
                                    s.UpdateTime = serverTime; //修改时间
                                    s.UpdateUser = userId; //修改人
                                    s.Status = "2"; //2 已分配
                                    Db.Updateable(s).ExecuteCommand();//修改库存明细信息
                                    #endregion
                                    #region 分配
                                    //添加分配表信息
                                    var allot = new BllExportAllot
                                    {
                                        SONo = "",
                                        WaveNo = "",
                                        SODetailNo = 0,
                                        StockId = s.Id,
                                        LotNo = "",
                                        LotText = "",
                                        SupplierLot = "",
                                        SkuNo = s.SkuNo,
                                        SkuName = s.SkuName,
                                        Standard = s.Standard,
                                        PalletNo = s.PalletNo,
                                        IsBale = "0", //是否裹包
                                        IsBelt = "0", //是否打带
                                        //BoxexQty = s.Qty,
                                        Qty = (int)s.Qty,
                                        CompleteQty = 0,
                                        Status = "1",
                                        LogisticsId = 0,
                                        IsAdvance = "0",
                                        OutMode = model.OutMode,//出库口
                                        CreateUser = userId,
                                        CreateTime = DateTime.Now
                                    };
                                    Db.Insertable(allot).ExecuteCommand();
                                    #endregion
                                    #region 添加出库任务信息
                                    var taskNo = new Common().GetMaxNo("TK");
                                    var exTask = new LogTask    //出库任务
                                    {
                                        TaskNo = taskNo,
                                        Sender = "WMS",
                                        Receiver = "PDA",
                                        IsSuccess = 1, //是否下发成功 0失败 1成功
                                        StartLocat = locat == null ? "" : s.LocatNo,//起始位置
                                        EndLocat = model.OutMode,//目标位置
                                        PalletNo = s.PalletNo,//托盘码
                                        IsSend = 1,//是否可再次下发
                                        IsCancel = 1,//是否可取消
                                        IsFinish = 1,//是否可完成
                                        Type = "1",//任务类型 0 入库任务 1 出库任务  2 移库任务
                                        Status = "1",//任务状态0:等待执行1正在执行2执行完成
                                        OrderType = "1",//0 入库单 1 出库单  2 盘点单  3 移库单
                                        CreateTime = serverTime, //创建时间
                                        CreateUser = userId, //创建人
                                        Msg = "Pda空托从" + locat == null ? "" : s.LocatNo + "到" + model.OutMode + "的出库任务", //关键信息
                                                                                                                         //FinishDate = serverTime, //完成时间
                                    };
                                    outDto1.Add(new OutCommandDto()
                                    {
                                        PalletNo = exTask.PalletNo,//托盘号
                                        StartLocate = exTask.StartLocat, // 起始位置
                                        StartRoadway = locat.RoadwayNo, //所属巷道
                                        EndLocate = model.OutMode, // 目标位置
                                        TaskNo = exTask.TaskNo, // 任务号
                                        TaskType = "1",// 任务类型 (出库)
                                        OutMode = model.OutMode,  //目标地址
                                        Order = 1
                                    });
                                    Db.Insertable(exTask).ExecuteCommand();
                                    #endregion
                                    #region 储位状态变更
                                    //更改储位状态为出库中
                                    locat.Status = "3"; //3 出库中
                                    Db.Updateable(locat).ExecuteCommand();//修改储位信息
                                    #endregion
                                }
                                else if(slotBefore.Status == "1")
                                {
                                    //判断托盘上物料
                                    var pallSku = Db.Queryable<DataStockDetail>().First(m=>m.SkuNo == "100099" && m.LocatNo == slotBefore.LocatNo);
                                    if (pallSku == null) //移库
                                    {
                                        #region 分配
                                        ////添加分配表信息
                                        //var allot = new BllExportAllot
                                        //{
                                        //    SONo = "",
                                        //    WaveNo = "",
                                        //    SODetailNo = 0,
                                        //    StockId = s.Id,
                                        //    LotNo = "",
                                        //    LotText = "",
                                        //    SupplierLot = "",
                                        //    SkuNo = s.SkuNo,
                                        //    SkuName = s.SkuName,
                                        //    Standard = s.Standard,
                                        //    PalletNo = s.PalletNo,
                                        //    IsBale = "0", //是否裹包
                                        //    IsBelt = "0", //是否打带
                                        //    //BoxexQty = s.Qty,
                                        //    Qty = (int)s.Qty,
                                        //    CompleteQty = 0,
                                        //    Status = "1",
                                        //    LogisticsId = 0,
                                        //    IsAdvance = "0",
                                        //    OutMode = model.OutMode,//出库口
                                        //    CreateUser = userId,
                                        //    CreateTime = DateTime.Now
                                        //};
                                        //Db.Insertable(allot).ExecuteCommand();
                                        #endregion
                                        #region 添加移库任务信息
                                        var stkModel = Db.Queryable<DataStockDetail>().First(m => m.LocatNo == slotBefore.LocatNo);
                                        string PalletNo = "LN000000";   // 默认演示托盘
                                        string SkuNo = "";
                                        if (stkModel != null)
                                        {
                                            PalletNo = stkModel.PalletNo;
                                            SkuNo = stkModel.SkuNo;
                                        }
                                        //获取移库的库位
                                        var newSlot = MoveAddress(slotBefore.LocatNo, slotBefore.RoadwayNo, SkuNo, slotBefore.AreaNo);
                                        if (string.IsNullOrWhiteSpace(newSlot))
                                        {
                                            continue;
                                        }
                                        var taskNo = new Common().GetMaxNo("TK");
                                        var exTask = new LogTask    //出库任务
                                        {
                                            TaskNo = taskNo,
                                            Sender = "WMS",
                                            Receiver = "PDA",
                                            IsSuccess = 1, //是否下发成功 0失败 1成功
                                            StartLocat = slotBefore.LocatNo,//起始位置
                                            EndLocat = newSlot,//目标位置
                                            PalletNo = PalletNo,//托盘码
                                            IsSend = 1,//是否可再次下发
                                            IsCancel = 1,//是否可取消
                                            IsFinish = 1,//是否可完成
                                            Type = "2",//任务类型 0 入库任务 1 出库任务  2 移库任务
                                            Status = "1",//任务状态0:等待执行1正在执行2执行完成
                                            OrderType = "1",//0 入库单 1 出库单  2 盘点单  3 移库单
                                            CreateTime = serverTime, //创建时间
                                            CreateUser = userId, //创建人
                                            Msg = "Pda空托从" + locat == null ? "" : slotBefore.LocatNo + "到" + newSlot + "的移库任务", //关键信息
                                                                                                                             //FinishDate = serverTime, //完成时间
                                        };
                                        moveDto.Add(new OutCommandDto()
                                        {
                                            PalletNo = exTask.PalletNo,//托盘号
                                            StartLocate = exTask.StartLocat, // 起始位置
                                            StartRoadway = locat.RoadwayNo, //所属巷道
                                            EndLocate = exTask.EndLocat, // 目标位置
                                            TaskNo = exTask.TaskNo, // 任务号
                                            TaskType = "2",// 任务类型 (移库)
                                            OutMode = "",  //目标地址
                                            Order = 1
                                        });
                                        Db.Insertable(exTask).ExecuteCommand();
                                        #endregion
                                        #region 储位状态变更
                                        //更改储位状态为移出中
                                        slotBefore.Status = "5"; //5 移出中
                                        Db.Updateable(slotBefore).ExecuteCommand();//修改储位信息
                                        var newSlot2 = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == newSlot && m.IsDel == "0");
                                        if (newSlot2!= null)
                                        {
                                            newSlot2.Status = "4";//移入中
                                            Db.Updateable(newSlot2).ExecuteCommand();//修改储位信息
                                        }
                                        #endregion
                                    }
                                    else  //出库
                                    {
                                        #region 改变库存
                                        //增加库存锁定数量
                                        stock.LockQty += (int)pallSku.Qty; //锁定数量
                                        stock.UpdateTime = serverTime; //修改时间
                                        stock.UpdateUser = userId; //修改人
                                        Db.Updateable(stock).ExecuteCommand();//修改库存总表信息
                                        //增加库存明细锁定数量
                                        pallSku.LockQty += (int)pallSku.Qty; //锁定数量
                                        pallSku.UpdateTime = serverTime; //修改时间
                                        pallSku.UpdateUser = userId; //修改人
                                        pallSku.Status = "2"; //2 已分配
                                        Db.Updateable(pallSku).ExecuteCommand();//修改库存明细信息
                                        #endregion
                                        #region 分配
                                        //添加分配表信息
                                        var allot = new BllExportAllot
                                        {
                                            SONo = "",
                                            WaveNo = "",
                                            SODetailNo = 0,
                                            StockId = pallSku.Id,
                                            LotNo = "",
                                            LotText = "",
                                            SupplierLot = "",
                                            SkuNo = pallSku.SkuNo,
                                            SkuName = pallSku.SkuName,
                                            Standard = pallSku.Standard,
                                            PalletNo = pallSku.PalletNo,
                                            IsBale = "0", //是否裹包
                                            IsBelt = "0", //是否打带
                                            //BoxexQty = s.Qty,
                                            Qty = (int)pallSku.Qty,
                                            CompleteQty = 0,
                                            Status = "1",
                                            LogisticsId = 0,
                                            IsAdvance = "0",
                                            OutMode = model.OutMode,//出库口
                                            CreateUser = userId,
                                            CreateTime = DateTime.Now
                                        };
                                        Db.Insertable(allot).ExecuteCommand();
                                        #endregion
                                        #region 添加出库任务信息
                                        var taskNo = new Common().GetMaxNo("TK");
                                        var exTask = new LogTask    //出库任务
                                        {
                                            TaskNo = taskNo,
                                            Sender = "WMS",
                                            Receiver = "PDA",
                                            IsSuccess = 1, //是否下发成功 0失败 1成功
                                            StartLocat = locat == null ? "" : pallSku.LocatNo,//起始位置
                                            EndLocat = model.OutMode,//目标位置
                                            PalletNo = pallSku.PalletNo,//托盘码
                                            IsSend = 1,//是否可再次下发
                                            IsCancel = 1,//是否可取消
                                            IsFinish = 1,//是否可完成
                                            Type = "1",//任务类型 0 入库任务 1 出库任务  2 移库任务
                                            Status = "1",//任务状态0:等待执行1正在执行2执行完成
                                            OrderType = "1",//0 入库单 1 出库单  2 盘点单  3 移库单
                                            CreateTime = serverTime, //创建时间
                                            CreateUser = userId, //创建人
                                            Msg = "Pda空托从" + locat == null ? "" : pallSku.LocatNo + "到" + model.OutMode + "的出库任务", //关键信息
                                                                                                                             //FinishDate = serverTime, //完成时间
                                        };
                                        outDto2.Add(new OutCommandDto()
                                        {
                                            PalletNo = exTask.PalletNo,//托盘号
                                            StartLocate = exTask.StartLocat, // 起始位置
                                            StartRoadway = locat.RoadwayNo, //所属巷道
                                            EndLocate = model.OutMode, // 目标位置
                                            TaskNo = exTask.TaskNo, // 任务号
                                            TaskType = "1",// 任务类型 (出库)
                                            OutMode = model.OutMode,  //目标地址
                                            Order = 1
                                        });
                                        Db.Insertable(exTask).ExecuteCommand();
                                        #endregion
                                        #region 储位状态变更
                                        //更改储位状态为出库中
                                        slotBefore.Status = "3"; //3 出库中
                                        Db.Updateable(slotBefore).ExecuteCommand();//修改储位信息
                                        #endregion
                                    }
                                    if (int.Parse(model.Num) == outDto1.Count + outDto2.Count)
                                    {
                                        break;//需求垛数已达到 可以出库了
                                    }
                                    else
                                    {
                                        #region 改变库存
                                        //增加库存锁定数量
                                        stock.LockQty += (int)s.Qty; //锁定数量
                                        stock.UpdateTime = serverTime; //修改时间
                                        stock.UpdateUser = userId; //修改人
                                        Db.Updateable(stock).ExecuteCommand();//修改库存总表信息
                                        //增加库存明细锁定数量
                                        s.LockQty += (int)s.Qty; //锁定数量
                                        s.UpdateTime = serverTime; //修改时间
                                        s.UpdateUser = userId; //修改人
                                        s.Status = "2"; //2 已分配
                                        Db.Updateable(s).ExecuteCommand();//修改库存明细信息
                                        #endregion
                                        #region 分配
                                        //添加分配表信息
                                        var allot = new BllExportAllot
                                        {
                                            SONo = "",
                                            WaveNo = "",
                                            SODetailNo = 0,
                                            StockId = s.Id,
                                            LotNo = "",
                                            LotText = "",
                                            SupplierLot = "",
                                            SkuNo = s.SkuNo,
                                            SkuName = s.SkuName,
                                            Standard = s.Standard,
                                            PalletNo = s.PalletNo,
                                            IsBale = "0", //是否裹包
                                            IsBelt = "0", //是否打带
                                            //BoxexQty = s.Qty,
                                            Qty = (int)s.Qty,
                                            CompleteQty = 0,
                                            Status = "1",
                                            LogisticsId = 0,
                                            IsAdvance = "0",
                                            OutMode = model.OutMode,//出库口
                                            CreateUser = userId,
                                            CreateTime = DateTime.Now
                                        };
                                        Db.Insertable(allot).ExecuteCommand();
                                        #endregion
                                        #region 添加出库任务信息
                                        var taskNo = new Common().GetMaxNo("TK");
                                        var exTask = new LogTask    //出库任务
                                        {
                                            TaskNo = taskNo,
                                            Sender = "WMS",
                                            Receiver = "PDA",
                                            IsSuccess = 1, //是否下发成功 0失败 1成功
                                            StartLocat = locat == null ? "" : s.LocatNo,//起始位置
                                            EndLocat = model.OutMode,//目标位置
                                            PalletNo = s.PalletNo,//托盘码
                                            IsSend = 1,//是否可再次下发
                                            IsCancel = 1,//是否可取消
                                            IsFinish = 1,//是否可完成
                                            Type = "1",//任务类型 0 入库任务 1 出库任务  2 移库任务
                                            Status = "1",//任务状态0:等待执行1正在执行2执行完成
                                            OrderType = "1",//0 入库单 1 出库单  2 盘点单  3 移库单
                                            CreateTime = serverTime, //创建时间
                                            CreateUser = userId, //创建人
                                            Msg = "Pda空托从" + locat == null ? "" : s.LocatNo + "到" + model.OutMode + "的出库任务", //关键信息
                                                                                                                             //FinishDate = serverTime, //完成时间
                                        };
                                        outDto2.Add(new OutCommandDto()
                                        {
                                            PalletNo = exTask.PalletNo,//托盘号
                                            StartLocate = exTask.StartLocat, // 起始位置
                                            StartRoadway = locat.RoadwayNo, //所属巷道
                                            EndLocate = model.OutMode, // 目标位置
                                            TaskNo = exTask.TaskNo, // 任务号
                                            TaskType = "1",// 任务类型 (出库)
                                            OutMode = model.OutMode,  //目标地址
                                            Order = 1
                                        });
                                        Db.Insertable(exTask).ExecuteCommand();
                                        #endregion
                                        #region 储位状态变更
                                        //更改储位状态为出库中
                                        locat.Status = "3"; //3 出库中
                                        Db.Updateable(locat).ExecuteCommand();//修改储位信息
                                        #endregion
                                    }
                                }
                            }
                        }
                    }
                    if (int.Parse(model.Num) == outDto1.Count+ outDto2.Count)
                    {
                        TaskNo = taskNo,
                        Sender = "WMS",
                        Receiver = "PDA",
                        IsSuccess = 1, //是否下发成功 0失败 1成功
                        StartLocat = locat == null ? "零箱库" : s.LocatNo,//起始位置
                        EndLocat = model.OutMode,//目标位置
                        PalletNo = s.PalletNo,//托盘码
                        IsSend = 1,//是否可再次下发
                        IsCancel = 1,//是否可取消
                        IsFinish = 1,//是否可完成
                        Type = "1",//任务类型 0 入库任务 1 出库任务  2 移库任务
                        Status = "1",//任务状态0:等待执行1正在执行2执行完成
                        OrderType = "1",//0 入库单 1 出库单  2 盘点单  3 移库单
                        CreateTime = serverTime, //创建时间
                        CreateUser = userId, //创建人
                        Msg = "Pda空托从" + locat == null ? "零箱库" : s.LocatNo + "到" + model.OutMode + "的出库任务", //关键信息
                        //FinishDate = serverTime, //完成时间
                    };
                    outDtoList.Add(new OutCommandDto()
                    {
                        PalletNo = exTask.PalletNo,//托盘号
                        StartLocate = exTask.StartLocat, // 起始位置
                        StartRoadway = locat.RoadwayNo, //所属巷道
                        EndLocate = "", // 目标位置
                        TaskNo = exTask.TaskNo, // 任务号
                        TaskType = "1",// 任务类型 (出库)
                        OutMode = model.OutMode,  //目标地址
                        Order = 1
                    });
                    Db.Insertable(exTask).ExecuteCommand();
                    #endregion
                    i += 1;
                    if (i == int.Parse(model.Num))
                    {
                        //需求垛数已达到 可以出库了
                        break;
                        break;//需求垛数已达到 可以出库了
                    }
                }
                if (outDtoList.Count > 0)
                outDto1.AddRange(moveDto);
                outDto1.AddRange(outDto2);
                if (outDto1.Count > 0)
                {
                    // 正式运行程序放开
                    var list2 = outDtoList.Select(m => m.TaskNo).ToList();
                    var jsonData = JsonConvert.SerializeObject(outDtoList);
                    var list2 = outDto1.Select(m => m.TaskNo).ToList();
                    var jsonData = JsonConvert.SerializeObject(outDto1);
                    string response = "";
                    try
@@ -1116,7 +1709,7 @@
                }
                //添加操作日志记录
                var k = new OperationSOServer().AddLogOperationSo("PDA模块", "空托出库", i + "", "下发", $"用PDA下发了 {i} 个空托垛", userId);
                var k = new OperationSOServer().AddLogOperationSo("PDA模块", "空托出库", int.Parse(model.Num) + "", "下发", $"用PDA下发了 {int.Parse(model.Num)} 个空托垛", userId);
                Db.CommitTran();
                return "";
@@ -1128,6 +1721,915 @@
                throw new Exception(e.Message);
            }
        }
        /// <summary>
        /// WCS申请空托出库
        /// </summary>
        /// <param name="model"> </param>
        /// <param name="userId"> </param>
        /// <param name="url"> </param>
        /// <returns></returns>
        /// <exception cref="Exception"></exception>
        public List<OutCommandDto> IssuePlnOutHouseWcs(OutModePalletVm model, int userId)
        {
            try
            {
                string strMsg = "";
                var outDto1 = new List<OutCommandDto>(); //先出库数据的集合(深度为1的储位)
                var outDto2 = new List<OutCommandDto>(); //后出库数据的集合(深度为2的储位)
                var moveDto = new List<OutCommandDto>(); //要移库数据的集合
                //获取当前时间
                DateTime serverTime = Db.GetDate();
                //获取库存明细是否小于等于该垛数
                string str = "select * from DataStockDetail where IsDel = '0' and SkuNo = '100099' and Status = '0' ";
                var stockDetail = Db.Ado.SqlQuery<DataStockDetail>(str);
                if (stockDetail.Count > 0)
                {
                    //判断是否大于需要垛数
                    if (stockDetail.Count < int.Parse(model.Num))
                    {
                        throw new Exception("需要垛数大于库存垛数,请重新输入!");
                    }
                }
                //获取库存总表信息
                var stock = Db.Queryable<DataStock>().First(s => s.IsDel == "0" && s.SkuNo == "100099");
                //验证库存总表是否为空
                if (stock == null)
                {
                    throw new Exception("库存信息不存在,请核查!");
                }
                var com = new Common();
                Db.BeginTran();
                //遍历库存信息
                foreach (var s in stockDetail)
                {
                    //if (outDto1.Contains(m=>m.PalletNo == s.PalletNo) >0)
                    //{
                    //    continue;
                    //}
                    //获取储位信息
                    var locat = Db.Queryable<SysStorageLocat>().First(l => l.LocatNo == s.LocatNo && l.IsDel == "0" && l.WareHouseNo == "W01");
                    if (locat == null)
                    {
                        continue;
                    }
                    ////更改储位状态为出库中
                    //locat.Status = "3"; //   1 有物品
                    //locat.UpdateTime = serverTime; //修改时间
                    //locat.UpdateUser = userId; //修改人
                    ////修改储位信息
                    //Db.Updateable(locat).ExecuteCommand();
                    if (locat.Status == "1")
                    {
                        if (locat.Depth == "01") //深度为1
                        {
                            #region 改变库存
                            //增加库存锁定数量
                            stock.LockQty += (int)s.Qty; //锁定数量
                            stock.UpdateTime = serverTime; //修改时间
                            stock.UpdateUser = 0; //修改人
                            Db.Updateable(stock).ExecuteCommand();//修改库存总表信息
                            //增加库存明细锁定数量
                            s.LockQty += (int)s.Qty; //锁定数量
                            s.UpdateTime = serverTime; //修改时间
                            s.UpdateUser = userId; //修改人
                            s.Status = "2"; //2 已分配
                            Db.Updateable(s).ExecuteCommand();//修改库存明细信息
                            #endregion
                            #region 分配
                            //添加分配表信息
                            var allot = new BllExportAllot
                            {
                                SONo = "",
                                WaveNo = "",
                                SODetailNo = 0,
                                StockId = s.Id,
                                LotNo = "",
                                LotText = "",
                                SupplierLot = "",
                                SkuNo = s.SkuNo,
                                SkuName = s.SkuName,
                                Standard = s.Standard,
                                PalletNo = s.PalletNo,
                                IsBale = "0", //是否裹包
                                IsBelt = "0", //是否打带
                                //BoxexQty = s.Qty,
                                Qty = (int)s.Qty,
                                CompleteQty = 0,
                                Status = "1",
                                LogisticsId = 0,
                                IsAdvance = "0",
                                OutMode = model.OutMode,//出库口
                                CreateUser = userId,
                                CreateTime = DateTime.Now
                            };
                            Db.Insertable(allot).ExecuteCommand();
                            #endregion
                            #region 添加出库任务信息
                            var taskNo = new Common().GetMaxNo("TK");
                            var exTask = new LogTask    //出库任务
                            {
                                TaskNo = taskNo,
                                Sender = "WMS",
                                Receiver = "WCS",
                                IsSuccess = 1, //是否下发成功 0失败 1成功
                                StartLocat = locat == null ? "" : s.LocatNo,//起始位置
                                EndLocat = model.OutMode,//目标位置
                                PalletNo = s.PalletNo,//托盘码
                                IsSend = 1,//是否可再次下发
                                IsCancel = 1,//是否可取消
                                IsFinish = 1,//是否可完成
                                Type = "1",//任务类型 0 入库任务 1 出库任务  2 移库任务
                                Status = "1",//任务状态0:等待执行1正在执行2执行完成
                                OrderType = "1",//0 入库单 1 出库单  2 盘点单  3 移库单
                                CreateTime = serverTime, //创建时间
                                CreateUser = userId, //创建人
                                Msg = "WCS空托从" + locat == null ? "" : s.LocatNo + "到" + model.OutMode + "的出库任务", //关键信息
                                                                                                                 //FinishDate = serverTime, //完成时间
                            };
                            outDto1.Add(new OutCommandDto()
                            {
                                PalletNo = exTask.PalletNo,//托盘号
                                StartLocate = exTask.StartLocat, // 起始位置
                                StartRoadway = locat.RoadwayNo, //所属巷道
                                EndLocate = model.OutMode, // 目标位置
                                TaskNo = exTask.TaskNo, // 任务号
                                TaskType = "1",// 任务类型 (出库)
                                OutMode = model.OutMode,  //目标地址
                                Order = 1
                            });
                            Db.Insertable(exTask).ExecuteCommand();
                            #endregion
                            #region 储位状态变更
                            //更改储位状态为出库中
                            locat.Status = "3"; //3 出库中
                            Db.Updateable(locat).ExecuteCommand();//修改储位信息
                            #endregion
                        }
                        else if (locat.Depth == "02") //深度为2
                        {
                            //获取出库深度为2储位前面的储位信息
                            var sql2 = $@"select * from SysStorageLocat where  WareHouseNo = '{locat.WareHouseNo}' and row = {locat.Row} and [Column] = {locat.Column} and Layer = {locat.Layer} and Depth = '01'; ";
                            var slotBefore = Db.Ado.SqlQuery<SysStorageLocat>(sql2).First();
                            if (slotBefore == null)
                            {
                                #region 改变库存
                                //增加库存锁定数量
                                stock.LockQty += (int)s.Qty; //锁定数量
                                stock.UpdateTime = serverTime; //修改时间
                                //stock.UpdateUser = userId; //修改人
                                Db.Updateable(stock).ExecuteCommand();//修改库存总表信息
                                //增加库存明细锁定数量
                                s.LockQty += (int)s.Qty; //锁定数量
                                s.UpdateTime = serverTime; //修改时间
                                s.UpdateUser = userId; //修改人
                                s.Status = "2"; //2 已分配
                                Db.Updateable(s).ExecuteCommand();//修改库存明细信息
                                #endregion
                                #region 分配
                                //添加分配表信息
                                var allot = new BllExportAllot
                                {
                                    SONo = "",
                                    WaveNo = "",
                                    SODetailNo = 0,
                                    StockId = s.Id,
                                    LotNo = "",
                                    LotText = "",
                                    SupplierLot = "",
                                    SkuNo = s.SkuNo,
                                    SkuName = s.SkuName,
                                    Standard = s.Standard,
                                    PalletNo = s.PalletNo,
                                    IsBale = "0", //是否裹包
                                    IsBelt = "0", //是否打带
                                    //BoxexQty = s.Qty,
                                    Qty = (int)s.Qty,
                                    CompleteQty = 0,
                                    Status = "1",
                                    LogisticsId = 0,
                                    IsAdvance = "0",
                                    OutMode = model.OutMode,//出库口
                                    CreateUser = userId,
                                    CreateTime = DateTime.Now
                                };
                                Db.Insertable(allot).ExecuteCommand();
                                #endregion
                                #region 添加出库任务信息
                                var taskNo = new Common().GetMaxNo("TK");
                                var exTask = new LogTask    //出库任务
                                {
                                    TaskNo = taskNo,
                                    Sender = "WMS",
                                    Receiver = "WCS",
                                    IsSuccess = 1, //是否下发成功 0失败 1成功
                                    StartLocat = locat == null ? "" : s.LocatNo,//起始位置
                                    EndLocat = model.OutMode,//目标位置
                                    PalletNo = s.PalletNo,//托盘码
                                    IsSend = 1,//是否可再次下发
                                    IsCancel = 1,//是否可取消
                                    IsFinish = 1,//是否可完成
                                    Type = "1",//任务类型 0 入库任务 1 出库任务  2 移库任务
                                    Status = "1",//任务状态0:等待执行1正在执行2执行完成
                                    OrderType = "1",//0 入库单 1 出库单  2 盘点单  3 移库单
                                    CreateTime = serverTime, //创建时间
                                    CreateUser = userId, //创建人
                                    Msg = "WCS空托从" + locat == null ? "" : s.LocatNo + "到" + model.OutMode + "的出库任务", //关键信息
                                                                                                                     //FinishDate = serverTime, //完成时间
                                };
                                outDto1.Add(new OutCommandDto()
                                {
                                    PalletNo = exTask.PalletNo,//托盘号
                                    StartLocate = exTask.StartLocat, // 起始位置
                                    StartRoadway = locat.RoadwayNo, //所属巷道
                                    EndLocate = model.OutMode, // 目标位置
                                    TaskNo = exTask.TaskNo, // 任务号
                                    TaskType = "1",// 任务类型 (出库)
                                    OutMode = model.OutMode,  //目标地址
                                    Order = 1
                                });
                                Db.Insertable(exTask).ExecuteCommand();
                                #endregion
                                #region 储位状态变更
                                //更改储位状态为出库中
                                locat.Status = "3"; //3 出库中
                                Db.Updateable(locat).ExecuteCommand();//修改储位信息
                                #endregion
                            }
                            else
                            {
                                //判断储位状态
                                if (slotBefore.Status == "0")
                                {
                                    #region 改变库存
                                    //增加库存锁定数量
                                    stock.LockQty += (int)s.Qty; //锁定数量
                                    stock.UpdateTime = serverTime; //修改时间
                                    //stock.UpdateUser = userId; //修改人
                                    Db.Updateable(stock).ExecuteCommand();//修改库存总表信息
                                    //增加库存明细锁定数量
                                    s.LockQty += (int)s.Qty; //锁定数量
                                    s.UpdateTime = serverTime; //修改时间
                                    s.UpdateUser = userId; //修改人
                                    s.Status = "2"; //2 已分配
                                    Db.Updateable(s).ExecuteCommand();//修改库存明细信息
                                    #endregion
                                    #region 分配
                                    //添加分配表信息
                                    var allot = new BllExportAllot
                                    {
                                        SONo = "",
                                        WaveNo = "",
                                        SODetailNo = 0,
                                        StockId = s.Id,
                                        LotNo = "",
                                        LotText = "",
                                        SupplierLot = "",
                                        SkuNo = s.SkuNo,
                                        SkuName = s.SkuName,
                                        Standard = s.Standard,
                                        PalletNo = s.PalletNo,
                                        IsBale = "0", //是否裹包
                                        IsBelt = "0", //是否打带
                                        //BoxexQty = s.Qty,
                                        Qty = (int)s.Qty,
                                        CompleteQty = 0,
                                        Status = "1",
                                        LogisticsId = 0,
                                        IsAdvance = "0",
                                        OutMode = model.OutMode,//出库口
                                        CreateUser = userId,
                                        CreateTime = DateTime.Now
                                    };
                                    Db.Insertable(allot).ExecuteCommand();
                                    #endregion
                                    #region 添加出库任务信息
                                    var taskNo = new Common().GetMaxNo("TK");
                                    var exTask = new LogTask    //出库任务
                                    {
                                        TaskNo = taskNo,
                                        Sender = "WMS",
                                        Receiver = "WCS",
                                        IsSuccess = 1, //是否下发成功 0失败 1成功
                                        StartLocat = locat == null ? "" : s.LocatNo,//起始位置
                                        EndLocat = model.OutMode,//目标位置
                                        PalletNo = s.PalletNo,//托盘码
                                        IsSend = 1,//是否可再次下发
                                        IsCancel = 1,//是否可取消
                                        IsFinish = 1,//是否可完成
                                        Type = "1",//任务类型 0 入库任务 1 出库任务  2 移库任务
                                        Status = "1",//任务状态0:等待执行1正在执行2执行完成
                                        OrderType = "1",//0 入库单 1 出库单  2 盘点单  3 移库单
                                        CreateTime = serverTime, //创建时间
                                        CreateUser = userId, //创建人
                                        Msg = "WCS空托从" + locat == null ? "" : s.LocatNo + "到" + model.OutMode + "的出库任务", //关键信息
                                                                                                                         //FinishDate = serverTime, //完成时间
                                    };
                                    outDto1.Add(new OutCommandDto()
                                    {
                                        PalletNo = exTask.PalletNo,//托盘号
                                        StartLocate = exTask.StartLocat, // 起始位置
                                        StartRoadway = locat.RoadwayNo, //所属巷道
                                        EndLocate = model.OutMode, // 目标位置
                                        TaskNo = exTask.TaskNo, // 任务号
                                        TaskType = "1",// 任务类型 (出库)
                                        OutMode = model.OutMode,  //目标地址
                                        Order = 1
                                    });
                                    Db.Insertable(exTask).ExecuteCommand();
                                    #endregion
                                    #region 储位状态变更
                                    //更改储位状态为出库中
                                    locat.Status = "3"; //3 出库中
                                    Db.Updateable(locat).ExecuteCommand();//修改储位信息
                                    #endregion
                                }
                                else if (slotBefore.Status == "1")
                                {
                                    //判断托盘上物料
                                    var pallSku = Db.Queryable<DataStockDetail>().First(m => m.SkuNo == "100099" && m.LocatNo == slotBefore.LocatNo);
                                    if (pallSku == null) //移库
                                    {
                                        #region 分配
                                        //添加分配表信息
                                        var allot = new BllExportAllot
                                        {
                                            SONo = "",
                                            WaveNo = "",
                                            SODetailNo = 0,
                                            StockId = s.Id,
                                            LotNo = "",
                                            LotText = "",
                                            SupplierLot = "",
                                            SkuNo = s.SkuNo,
                                            SkuName = s.SkuName,
                                            Standard = s.Standard,
                                            PalletNo = s.PalletNo,
                                            IsBale = "0", //是否裹包
                                            IsBelt = "0", //是否打带
                                            //BoxexQty = s.Qty,
                                            Qty = (int)s.Qty,
                                            CompleteQty = 0,
                                            Status = "1",
                                            LogisticsId = 0,
                                            IsAdvance = "0",
                                            OutMode = model.OutMode,//出库口
                                            CreateUser = userId,
                                            CreateTime = DateTime.Now
                                        };
                                        Db.Insertable(allot).ExecuteCommand();
                                        #endregion
                                        #region 添加移库任务信息
                                        var stkModel = Db.Queryable<DataStockDetail>().First(m=>m.LocatNo == slotBefore.LocatNo);
                                        string PalletNo = "LN000000";   // 默认演示托盘
                                        string SkuNo = "";
                                        if (stkModel != null)
                                        {
                                            PalletNo = stkModel.PalletNo;
                                            SkuNo= stkModel.SkuNo;
                                        }
                                        //获取移库的库位
                                        var newSlot = MoveAddress(slotBefore.LocatNo, slotBefore.RoadwayNo, SkuNo, slotBefore.AreaNo);
                                        var taskNo = new Common().GetMaxNo("TK");
                                        var exTask = new LogTask    // 移库任务
                                        {
                                            TaskNo = taskNo,
                                            Sender = "WMS",
                                            Receiver = "WCS",
                                            IsSuccess = 1, //是否下发成功 0失败 1成功
                                            StartLocat = slotBefore.LocatNo,//起始位置
                                            EndLocat = newSlot,//目标位置
                                            PalletNo = PalletNo,//托盘码
                                            IsSend = 1,//是否可再次下发
                                            IsCancel = 1,//是否可取消
                                            IsFinish = 1,//是否可完成
                                            Type = "2",//任务类型 0 入库任务 1 出库任务  2 移库任务
                                            Status = "1",//任务状态0:等待执行1正在执行2执行完成
                                            OrderType = "1",//0 入库单 1 出库单  2 盘点单  3 移库单
                                            CreateTime = serverTime, //创建时间
                                            CreateUser = userId, //创建人
                                            Msg = "WCS空托从" + locat == null ? "" : s.LocatNo + "到" + newSlot + "的移库任务", //关键信息
                                                                                                                             //FinishDate = serverTime, //完成时间
                                        };
                                        moveDto.Add(new OutCommandDto()
                                        {
                                            PalletNo = exTask.PalletNo,//托盘号
                                            StartLocate = exTask.StartLocat, // 起始位置
                                            StartRoadway = locat.RoadwayNo, //所属巷道
                                            EndLocate = exTask.EndLocat, // 目标位置
                                            TaskNo = exTask.TaskNo, // 任务号
                                            TaskType = "2",// 任务类型 (出库)
                                            OutMode = "",  //目标地址
                                            Order = 1
                                        });
                                        Db.Insertable(exTask).ExecuteCommand();
                                        #endregion
                                        #region 储位状态变更
                                        //更改储位状态为移出中
                                        slotBefore.Status = "5"; //5 移出中
                                        Db.Updateable(slotBefore).ExecuteCommand();//修改储位信息
                                        #endregion
                                    }
                                    else  //出库
                                    {
                                        #region 改变库存
                                        //增加库存锁定数量
                                        stock.LockQty += (int)s.Qty; //锁定数量
                                        stock.UpdateTime = serverTime; //修改时间
                                        //stock.UpdateUser = userId; //修改人
                                        Db.Updateable(stock).ExecuteCommand();//修改库存总表信息
                                        //增加库存明细锁定数量
                                        s.LockQty += (int)s.Qty; //锁定数量
                                        s.UpdateTime = serverTime; //修改时间
                                        s.UpdateUser = userId; //修改人
                                        s.Status = "2"; //2 已分配
                                        Db.Updateable(s).ExecuteCommand();//修改库存明细信息
                                        #endregion
                                        #region 分配
                                        //添加分配表信息
                                        var allot = new BllExportAllot
                                        {
                                            SONo = "",
                                            WaveNo = "",
                                            SODetailNo = 0,
                                            StockId = s.Id,
                                            LotNo = "",
                                            LotText = "",
                                            SupplierLot = "",
                                            SkuNo = s.SkuNo,
                                            SkuName = s.SkuName,
                                            Standard = s.Standard,
                                            PalletNo = s.PalletNo,
                                            IsBale = "0", //是否裹包
                                            IsBelt = "0", //是否打带
                                            //BoxexQty = s.Qty,
                                            Qty = (int)s.Qty,
                                            CompleteQty = 0,
                                            Status = "1",
                                            LogisticsId = 0,
                                            IsAdvance = "0",
                                            OutMode = model.OutMode,//出库口
                                            CreateUser = userId,
                                            CreateTime = DateTime.Now
                                        };
                                        Db.Insertable(allot).ExecuteCommand();
                                        #endregion
                                        #region 添加出库任务信息
                                        var taskNo = new Common().GetMaxNo("TK");
                                        var exTask = new LogTask    //出库任务
                                        {
                                            TaskNo = taskNo,
                                            Sender = "WMS",
                                            Receiver = "WCS",
                                            IsSuccess = 1, //是否下发成功 0失败 1成功
                                            StartLocat = locat == null ? "" : s.LocatNo,//起始位置
                                            EndLocat = model.OutMode,//目标位置
                                            PalletNo = s.PalletNo,//托盘码
                                            IsSend = 1,//是否可再次下发
                                            IsCancel = 1,//是否可取消
                                            IsFinish = 1,//是否可完成
                                            Type = "1",//任务类型 0 入库任务 1 出库任务  2 移库任务
                                            Status = "1",//任务状态0:等待执行1正在执行2执行完成
                                            OrderType = "1",//0 入库单 1 出库单  2 盘点单  3 移库单
                                            CreateTime = serverTime, //创建时间
                                            CreateUser = userId, //创建人
                                            Msg = "WCS空托从" + locat == null ? "" : s.LocatNo + "到" + model.OutMode + "的出库任务", //关键信息
                                                                                                                             //FinishDate = serverTime, //完成时间
                                        };
                                        outDto2.Add(new OutCommandDto()
                                        {
                                            PalletNo = exTask.PalletNo,//托盘号
                                            StartLocate = exTask.StartLocat, // 起始位置
                                            StartRoadway = locat.RoadwayNo, //所属巷道
                                            EndLocate = model.OutMode, // 目标位置
                                            TaskNo = exTask.TaskNo, // 任务号
                                            TaskType = "1",// 任务类型 (出库)
                                            OutMode = model.OutMode,  //目标地址
                                            Order = 1
                                        });
                                        Db.Insertable(exTask).ExecuteCommand();
                                        #endregion
                                        #region 储位状态变更
                                        //更改储位状态为出库中
                                        slotBefore.Status = "3"; //3 出库中
                                        Db.Updateable(slotBefore).ExecuteCommand();//修改储位信息
                                        #endregion
                                    }
                                    if (int.Parse(model.Num) == outDto1.Count + outDto2.Count)
                                    {
                                        break;//需求垛数已达到 可以出库了
                                    }
                                    else
                                    {
                                        #region 改变库存
                                        //增加库存锁定数量
                                        stock.LockQty += (int)s.Qty; //锁定数量
                                        stock.UpdateTime = serverTime; //修改时间
                                        //stock.UpdateUser = userId; //修改人
                                        Db.Updateable(stock).ExecuteCommand();//修改库存总表信息
                                        //增加库存明细锁定数量
                                        s.LockQty += (int)s.Qty; //锁定数量
                                        s.UpdateTime = serverTime; //修改时间
                                        s.UpdateUser = userId; //修改人
                                        s.Status = "2"; //2 已分配
                                        Db.Updateable(s).ExecuteCommand();//修改库存明细信息
                                        #endregion
                                        #region 分配
                                        //添加分配表信息
                                        var allot = new BllExportAllot
                                        {
                                            SONo = "",
                                            WaveNo = "",
                                            SODetailNo = 0,
                                            StockId = s.Id,
                                            LotNo = "",
                                            LotText = "",
                                            SupplierLot = "",
                                            SkuNo = s.SkuNo,
                                            SkuName = s.SkuName,
                                            Standard = s.Standard,
                                            PalletNo = s.PalletNo,
                                            IsBale = "0", //是否裹包
                                            IsBelt = "0", //是否打带
                                            //BoxexQty = s.Qty,
                                            Qty = (int)s.Qty,
                                            CompleteQty = 0,
                                            Status = "1",
                                            LogisticsId = 0,
                                            IsAdvance = "0",
                                            OutMode = model.OutMode,//出库口
                                            CreateUser = userId,
                                            CreateTime = DateTime.Now
                                        };
                                        Db.Insertable(allot).ExecuteCommand();
                                        #endregion
                                        #region 添加出库任务信息
                                        var taskNo = new Common().GetMaxNo("TK");
                                        var exTask = new LogTask    //出库任务
                                        {
                                            TaskNo = taskNo,
                                            Sender = "WMS",
                                            Receiver = "WCS",
                                            IsSuccess = 1, //是否下发成功 0失败 1成功
                                            StartLocat = locat == null ? "" : s.LocatNo,//起始位置
                                            EndLocat = model.OutMode,//目标位置
                                            PalletNo = s.PalletNo,//托盘码
                                            IsSend = 1,//是否可再次下发
                                            IsCancel = 1,//是否可取消
                                            IsFinish = 1,//是否可完成
                                            Type = "1",//任务类型 0 入库任务 1 出库任务  2 移库任务
                                            Status = "1",//任务状态0:等待执行1正在执行2执行完成
                                            OrderType = "1",//0 入库单 1 出库单  2 盘点单  3 移库单
                                            CreateTime = serverTime, //创建时间
                                            CreateUser = userId, //创建人
                                            Msg = "WCS空托从" + locat == null ? "" : s.LocatNo + "到" + model.OutMode + "的出库任务", //关键信息
                                                                                                                             //FinishDate = serverTime, //完成时间
                                        };
                                        outDto2.Add(new OutCommandDto()
                                        {
                                            PalletNo = exTask.PalletNo,//托盘号
                                            StartLocate = exTask.StartLocat, // 起始位置
                                            StartRoadway = locat.RoadwayNo, //所属巷道
                                            EndLocate = model.OutMode, // 目标位置
                                            TaskNo = exTask.TaskNo, // 任务号
                                            TaskType = "1",// 任务类型 (出库)
                                            OutMode = model.OutMode,  //目标地址
                                            Order = 1
                                        });
                                        Db.Insertable(exTask).ExecuteCommand();
                                        #endregion
                                        #region 储位状态变更
                                        //更改储位状态为出库中
                                        locat.Status = "3"; //3 出库中
                                        Db.Updateable(locat).ExecuteCommand();//修改储位信息
                                        #endregion
                                    }
                                }
                            }
                        }
                    }
                    if (int.Parse(model.Num) == outDto1.Count + outDto2.Count)
                    {
                        break;//需求垛数已达到 可以出库了
                    }
                }
                outDto1.AddRange(moveDto);
                outDto1.AddRange(outDto2);
                if (outDto1.Count <= 0)
                {
                    throw new Exception("暂无出库任务,请核查!");
                }
                //添加操作日志记录
                var k = new OperationSOServer().AddLogOperationSo("PDA模块", "空托出库", int.Parse(model.Num) + "", "下发", $"WCS下发了 {int.Parse(model.Num)} 个空托垛", userId);
                Db.CommitTran();
                return outDto1;
            }
            catch (Exception e)
            {
                Db.RollbackTran();
                throw new Exception(e.Message);
            }
        }
        /// <summary>
        /// WMS申请拣货空托
        /// </summary>
        /// <param name="model"> </param>
        /// <param name="userId"> </param>
        /// <param name="url"> </param>
        /// <returns></returns>
        /// <exception cref="Exception"></exception>
        public string IssuePlnCehckHouseWcs(CheckModePalletVm model, int userId, string url)
        {
            try
            {
                string StartLocate = "" ,EndLocate = "";
                Db.BeginTran();
                if (model.OutMode == "001") //西侧拣货位叫空托盘
                {
                    var xLocate = Db.Queryable<SysStorageLocat>().First(w => w.Status == "1" && (w.LocatNo == "B13010101" || w.LocatNo == "B13020101" || w.LocatNo == "B13030101"));
                    if (xLocate == null)
                    {
                        throw new Exception("没有可用的空托盘");
                    }
                    StartLocate = Db.Queryable<SysStorageLocat>().First(w => w.Status == "1" && (w.LocatNo == "B13010101" || w.LocatNo == "B13020101" || w.LocatNo == "B13030101")).LocatNo;
                    EndLocate = "B15010101";
                }
                else//东侧拣货位叫空托盘
                {
                    var dLocate = Db.Queryable<SysStorageLocat>().First(w => w.Status == "1" && (w.LocatNo == "B13030101" || w.LocatNo == "B13040101" || w.LocatNo == "B13050101"));
                    if (dLocate == null)
                    {
                        throw new Exception("没有可用的空托盘");
                    }
                    StartLocate = Db.Queryable<SysStorageLocat>().First(w => w.Status == "1" && (w.LocatNo == "B13030101" || w.LocatNo == "B13040101" || w.LocatNo == "B13050101")).LocatNo;
                    EndLocate = "B15020101";
                }
                //添加出库任务
                var taskNo = new Common().GetMaxNo("TK");
                var exTask = new LogTask
                {
                    TaskNo = taskNo,
                    Sender = "WMS",
                    Receiver = "AGV",
                    IsSuccess = 0, //是否下发成功 0失败 1成功
                    StartLocat = StartLocate,//起始位置
                    EndLocat = EndLocate,//目标位置
                    PalletNo = "",//托盘码
                    Msg = string.Format("转运任务:{0}=>>{1}", StartLocate, EndLocate),
                    IsSend = 1,//是否可再次下发
                    IsCancel = 1,//是否可取消
                    IsFinish = 1,//是否可完成
                    Type = "2",//任务类型 0 入库任务 1 出库任务  2 移库任务
                    Status = "0",//任务状态0:等待执行1正在执行2执行完成
                    OrderType = "3",//0 入库单 1 出库单  2 盘点单  3 移库单
                    CreateTime = DateTime.Now
                };
                Db.Insertable(exTask).ExecuteCommand();
                var storageLocatEnd = Db.Queryable<SysStorageLocat>().First(w => w.LocatNo == EndLocate);
                //修改目标储位地址状态
                if (storageLocatEnd != null)
                {
                    storageLocatEnd.Status = "4";//0:空储位 1:有物品 2:入库中 3:出库中 4:移入中 5:移出中
                    Db.Updateable(storageLocatEnd).ExecuteCommand();
                }
                #region 呼叫小车代码
                var endlono = EndLocate;
                string tasktype = "D01";
                //点到点指令集合
                object[] position = new object[2];
                position[0] = new
                {
                    positionCode = StartLocate,
                    type = "00"
                };
                position[1] = new
                {
                    positionCode = endlono,
                    type = "00"
                };
                List<AgvSchedulingTask> agvTaskList = new List<AgvSchedulingTask>();
                AgvSchedulingTask agvTask = new AgvSchedulingTask();
                Random r = new Random();
                long ran = DateTime.Now.Ticks;
                agvTask.ReqCode = ran.ToString();
                agvTask.TaskCode = taskNo;
                agvTask.TaskTyp = tasktype;
                agvTask.PositionCodePath = position;
                agvTask.CtnrTyp = "1";
                agvTaskList.Add(agvTask);
                string str = "";
                var list2 = agvTaskList.Select(m => m.TaskCode).ToList();
                var jsonData = JsonConvert.SerializeObject(agvTaskList);
                jsonData = jsonData.Substring(1, jsonData.Length - 1);
                jsonData = jsonData.Substring(0, jsonData.Length - 1);
                string response = "";
                try
                {
                    var time1 = DateTime.Now;//发送时间 .ToString("yyyy-MM-dd HH:mm:ss")
                    response = HttpHelper.DoPost(url, jsonData, "下发给AGV转运命令", "AGV");
                    var time2 = DateTime.Now;//返回时间 .ToString("yyyy-MM-dd HH:mm:ss")
                    //////解析返回数据
                    var agvModel = JsonConvert.DeserializeObject<OutCommanAgvDto>(response);
                    if (agvModel.Code == "0")
                    {
                        //更改任务的发送返回时间//
                        new TaskServer().EditTaskIssueOk(list2, time1, time2);
                        str += "下发成功";
                    }
                    if (agvModel.Code == "1")
                    {
                        new TaskServer().EditTaskIssueNo(list2, time1, time2, agvModel.Message);
                        throw new Exception(agvModel.Message);
                    }
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
                #endregion
                //添加操作日志记录
                var k = new OperationCrServer().AddLogOperationCr("PDA模块", "AGV转运", "", "移库", $"PDA呼叫小车拆空托盘拣货", userId);
                Db.CommitTran();
                return "";
            }
            catch (Exception e)
            {
                Db.RollbackTran();
                throw new Exception(e.Message);
            }
        }
        public string MoveAddress(string oldAddress, string roadWay, string skuNo,string areaNo="")//01020201  排-列-层-深度
        {
            string nowAddress = "";
            var category = new SysMaterialCategory();
            if (!string.IsNullOrEmpty(skuNo))
            {
                //根据物料编码获取对应区域
                var skuCategoryNo = Db.Queryable<SysMaterials>().Where(a => a.IsDel == "0" && a.SkuNo == skuNo).Select(a => a.CategoryNo).First();
                category = Db.Queryable<SysMaterialCategory>().First(a => a.IsDel == "0" && a.CategoryNo == skuCategoryNo);
                areaNo = category.AreaNo;
            }
            else
            {
                //todo 待验证
                category = Db.Queryable<SysMaterialCategory>().First(a => a.IsDel == "0" && a.AreaNo == areaNo);
            }
            // 获取移库目标储位
            var row = int.Parse(oldAddress.Substring(0, 2));
            var lie = int.Parse(oldAddress.Substring(2, 2));
            var ceng = int.Parse(oldAddress.Substring(4, 2));
            var sqlString = $@"select LocatNo,[Row],[Column],Layer, (ABS(Row-{row}) + ABS([Column]-{lie}) + ABS(Layer-{ceng}))  as distNum from SysStorageLocat where Flag = '0' and Status = '0' and Depth = '02' and RoadwayNo = '{roadWay}' and AreaNo in ('{areaNo}') order by distNum;";
            var addressModels = Db.Ado.SqlQuery<AddressCls>(sqlString).ToList();
            if (addressModels.Count > 0)   // 判断同巷道内排空库位
            {
                var listLocaete = new List<string>();
                foreach (var item in addressModels)
                {
                    // 目标内库位对应的外库位
                    string addressee = item.LocatNo.Substring(0, 6) + "01";
                    // 判断目标库位的外库位是否存在货物   (正常情况下正在移入情况不存在,因为移库先移入里面,后移入外面)
                    //SlotStatus 0: 空储位 1:有货  2:正在入库  3:正在出库   4:正在移入  5:正在移出
                    sqlString = $"select count(*) from SysStorageLocat where LocatNo = '{addressee}' and Status = '0' and Flag in ('0','1') ; ";
                    var rowNum = Db.Ado.SqlQuery<int>(sqlString).First();
                    if (rowNum == 0)
                    {
                        continue;
                    }
                    else
                    {
                        nowAddress = item.LocatNo;
                        break;
                    }
                }
            }
            if (nowAddress == "")
            {
                // 判断同巷道外排空库位
                sqlString = $@"select LocatNo,[Row],[Column],Layer, (ABS(Row-{row}) + ABS([Column]-{lie}) + ABS(Layer-{ceng}))  as distNum
                                from SysStorageLocat
                                where Flag = '0' and Status = '0' and Depth = '01' and RoadwayNo = '{roadWay}' and AreaNo  in '{category}'
                                order by distNum;";
                var adderModeling = Db.Ado.SqlQuery<AddressCls>(sqlString).ToList();
                if (adderModeling.Count > 0)
                {
                    nowAddress = adderModeling[0].LocatNo;
                }
                else
                {
                    // 库内不存在空储位
                    nowAddress = "";
                }
            }
            return nowAddress;
        }
        //获取平库托盘信息
@@ -1191,7 +2693,21 @@
                if (result.WareHouseNo != "W02")//W02:零箱库
                {
                    throw new Exception("该托盘未在零箱库,请检查!");
                    throw new Exception("该托盘未在平库内,请检查!");
                }
                #endregion
                #region 验证储位状态是否正常
                var locat = Db.Queryable<SysStorageLocat>().First(a=>a.IsDel == "0" && a.LocatNo == result.LocatNo);
                if (locat == null)
                {
                    throw new Exception("未获取到对应储位信息,请检查!");
                }
                if (locat.Status != "3")
                {
                    throw new Exception("当前储位不是出库中,请检查!");
                }
                #endregion
@@ -1247,6 +2763,10 @@
                        item.AreaNo = "";//所属区域更改(改为空)
                        Db.Updateable(item).ExecuteCommand();
                    }
                    //变更储位状态
                    locat.Status = "0";//储位更改(改为空储位)
                    Db.Updateable(locat).ExecuteCommand();
                    //出库流水(更改状态)
                    var allot = Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && m.Status == "1" && m.PalletNo == palletNo && m.SONo == soNo).ToList();
@@ -1293,25 +2813,25 @@
            {
                var type = "";
                var detail = Db.Queryable<DataStockDetail>().First(m => m.IsDel == "0" && m.PalletNo == palletNo);
                if (detail== null)
                if (detail == null)
                {
                    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)
                if (allot != null)
                {
                    var soNo = Db.Queryable<BllExportNotice>()
                        .First(m => m.IsDel == "0" && m.SONo == allot.SONo);
                    if (soNo == null)
                    {
                        throw new Exception("未找到托盘上出库单据信息");
                    }
                    }
                    if (soNo.Type != "3")
                    {
                        throw new Exception("该托盘不是取样托盘");
                    }
                    }
                    type = "0";//库内取样
                }
                else
@@ -1354,7 +2874,7 @@
        }
        //取样出库拣货(标签)
        public void SampleSoSetPick(string soType,string soNo, string soDetailId, string palletNo, string boxNo, string boxNo3, string pickQty1, string asnNo, int userId)
        public void SampleSoSetPick(string soType, string soNo, string soDetailId, string palletNo, string boxNo, string boxNo3, string pickQty1, string asnNo, int userId)
        {
            Db.BeginTran();
            try
@@ -1363,7 +2883,7 @@
                {
                    throw new Exception("取样标识不能为空");
                }
                //soType: 0库内取样,有出库单及分配信息; 1库前取样,反向添加出库单及分配信息
                if (soType == "1")
                {
@@ -1373,12 +2893,12 @@
                    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)
                    if (!string.IsNullOrEmpty(boxNo3) && !string.IsNullOrEmpty(pickQty1) && decimal.Parse(pickQty1) > 0)
                    {
                        throw new Exception("追溯条码和拣货数量不能同时输入");
                    }
@@ -1398,7 +2918,7 @@
                        throw new Exception("未查询到该托盘的库存明细信息!");
                    }
                    var sku = Db.Queryable<SysMaterials>().First(m=>m.IsDel == "0" && m.SkuNo == stockDetail.SkuNo);
                    var sku = Db.Queryable<SysMaterials>().First(m => m.IsDel == "0" && m.SkuNo == stockDetail.SkuNo);
                    if (sku == null)
                    {
                        throw new Exception("未查询到当前托盘上的物料信息");
@@ -1413,7 +2933,7 @@
                    //出库单
                    var notice = Db.Queryable<BllExportNotice>().First(m => m.IsDel == "0" && m.AsnSampleNo == asnNo);
                    //创建出库单
                    if (notice == null ||  notice.Status == "6")
                    if (notice == null || notice.Status == "6")
                    {
                        var billNo = "";
                        var bl = true;
@@ -1425,7 +2945,7 @@
                            bl = Db.Queryable<BllExportNotice>().Any(m => m.SONo == no);
                        } while (bl);
                        var addNotice = new BllExportNotice()
                        {
                            SONo = billNo,
@@ -1437,7 +2957,7 @@
                            WaveNo = "",
                            IsDespatch = "0",
                            CompleteTime = DateTime.Now,
                            CreateUser = userId,
                            CreateUser = userId,
                        };
                        var n = Db.Insertable(addNotice).ExecuteReturnEntity();
@@ -1471,7 +2991,7 @@
                            IsIssueLotNo = "0",
                            Status = "3",
                            CreateUser = userId,
                        };
                        var m = Db.Insertable(addNoticeDetail).ExecuteReturnEntity();
                        noticeDetail = m;
@@ -1494,8 +3014,8 @@
                            SkuName = sku.SkuName,
                            Standard = sku.Standard,
                            PalletNo = palletNo,
                            IsBale = "0" , //是否裹包
                            IsBelt = "0" , //是否打带
                            IsBale = "0", //是否裹包
                            IsBelt = "0", //是否打带
                            Qty = 0,
                            CompleteQty = 0,
@@ -1512,7 +3032,7 @@
                        var fp = Db.Insertable(addAllot).ExecuteReturnEntity();
                        allot2 = fp;
                    }
                    #endregion
@@ -1526,7 +3046,7 @@
                        throw new Exception("未查询到该箱码及追溯码的信息");
                    }
                    boxInfos = boxInfo.ToList();
                    var comDetailList = Db.Queryable<BllCompleteDetail>().Where(m => m.IsDel == "0" && m.ExportAllotId == allot2.Id && m.PalletNo == palletNo).ToList();
                    if (!string.IsNullOrWhiteSpace(boxNo3)) //散支拣货
                    {
                        boxInfos = boxInfos.Where(m => m.BoxNo3 == boxNo3).ToList();
@@ -1544,16 +3064,22 @@
                        {
                            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)//数量拣货
                    else if (!string.IsNullOrEmpty(pickQty1) && decimal.Parse(pickQty1) > 0)//数量拣货
                    {
                        if (boxInfo.Count() > 1)
                        {
                            throw new Exception("该箱码内存在支码不能进行数量拣货");
                        }
                        int boxQty = boxInfo.First().Qty;
                        decimal boxQty = boxInfo.First().Qty;
                        if (Convert.ToInt32(pickQty1) > boxQty)
                        {
                            throw new Exception("拣货数量不能大于箱内数量");
@@ -1571,17 +3097,23 @@
                        {
                            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 == allot2.Id && m.PalletNo == palletNo).ToList();
                    decimal pickQty = 0;//拣货的数量
                    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}已拣货完成,请勿重复拣货");
                        }
                        //if (biaoShi != "2" && comDetailList.Any(m => m.BoxNo3 == item.BoxNo3))
                        //{
                        //    throw new Exception($"当前{item.BoxNo}中{item.BoxNo3}已拣货完成,请勿重复拣货");
                        //}
                        //添加拣货明细
                        var completeDetail = new BllCompleteDetail()
                        {
@@ -1600,7 +3132,7 @@
                            SkuName = allot2.SkuName,
                            Standard = allot2.Standard,
                            PalletNo = palletNo,
                            CompleteQty = biaoShi == "2" ? int.Parse(pickQty1) : item.Qty,
                            CompleteQty = biaoShi == "2" ? decimal.Parse(pickQty1) : item.Qty,
                            InspectMark = "1",
                            CreateUser = userId
@@ -1614,22 +3146,22 @@
                        }
                        else//数量拣货
                        {
                            if (int.Parse(pickQty1) == item.Qty)
                            if (decimal.Parse(pickQty1) == item.Qty)
                            {
                                //删除库存箱码明细
                                Db.Deleteable(item).ExecuteCommand();
                            }
                            else
                            {
                                item.Qty -= int.Parse(pickQty1);
                                item.Qty -= decimal.Parse(pickQty1);
                                item.BitBoxMark = "1";//零箱标识
                                item.InspectMark = "1";//抽检箱标识
                                Db.Updateable(item).ExecuteCommand();
                            }
                        }
                        pickQty += biaoShi == "2" ? int.Parse(pickQty1) : item.Qty;
                        pickQty += biaoShi == "2" ? decimal.Parse(pickQty1) : item.Qty;
                    }
                    //改变库内箱码是否零箱信息
                    if (biaoShi == "1")
@@ -1646,13 +3178,13 @@
                    Db.Insertable(comList).ExecuteCommand();
                    //修改出库分配信息
                    allot2.Qty += pickQty;
                    allot2.CompleteQty += pickQty;
                    allot2.CompleteQty += pickQty;
                    Db.Updateable(allot2).ExecuteCommand();
                    //删除或修改库存明细
                    stockDetail.BitPalletMark = "1";//修改为零托标识
                    stockDetail.Qty -= pickQty;
                    if (stockDetail.Qty <= 0)
                    {
                        Db.Deleteable(stockDetail).ExecuteCommand();
@@ -1691,7 +3223,7 @@
                    Db.Updateable(noticeDetail).ExecuteCommand();
                }
                else if(soType == "0")
                else if (soType == "0")
                {
                    #region 判断
@@ -1707,7 +3239,7 @@
                    {
                        throw new Exception("托盘码不能为空");
                    }
                    if (!string.IsNullOrEmpty(boxNo3) && !string.IsNullOrEmpty(pickQty1) && int.Parse(pickQty1) > 0)
                    if (!string.IsNullOrEmpty(boxNo3) && !string.IsNullOrEmpty(pickQty1) && decimal.Parse(pickQty1) > 0)
                    {
                        throw new Exception("追溯条码和拣货数量不能同时输入");
                    }
@@ -1763,6 +3295,7 @@
                        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();
@@ -1785,21 +3318,27 @@
                        {
                            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)//数量拣货
                    else if (!string.IsNullOrEmpty(pickQty1) && decimal.Parse(pickQty1) > 0)//数量拣货
                    {
                        if (boxInfo.Count() > 1)
                        {
                            throw new Exception("该箱码内存在支码不能进行数量拣货");
                        }
                        int boxQty = boxInfo.First().Qty;
                        if (Convert.ToInt32(pickQty1) > boxQty)
                        decimal boxQty = boxInfo.First().Qty;
                        if (Convert.ToDecimal(pickQty1) > boxQty)
                        {
                            throw new Exception("拣货数量不能大于箱内数量");
                        }
                        if (Convert.ToInt32(pickQty1) > needQty)
                        if (Convert.ToDecimal(pickQty1) > needQty)
                        {
                            throw new Exception("拣货数量不能大于剩余待拣数量");
                        }
@@ -1821,16 +3360,23 @@
                        {
                            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();
                    decimal pickQty = 0;//拣货的数量
                    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}已拣货完成,请勿重复拣货");
                        }
                        //if (biaoShi != "2" && comDetailList.Any(m => m.BoxNo3 == item.BoxNo3))
                        //{
                        //    throw new Exception($"当前{item.BoxNo}中{item.BoxNo3}已拣货完成,请勿重复拣货");
                        //}
                        //添加拣货明细
                        var completeDetail = new BllCompleteDetail()
                        {
@@ -1849,7 +3395,7 @@
                            SkuName = allot.SkuName,
                            Standard = allot.Standard,
                            PalletNo = palletNo,
                            CompleteQty = biaoShi == "2" ? int.Parse(pickQty1) : item.Qty,
                            CompleteQty = biaoShi == "2" ? decimal.Parse(pickQty1) : item.Qty,
                            CreateUser = userId
                        };
@@ -1857,24 +3403,27 @@
                        if (biaoShi != "2")
                        {
                            pickQty += item.Qty;
                            //删除库存箱码明细
                            Db.Deleteable(item).ExecuteCommand();
                        }
                        else//数量拣货
                        {
                            if (int.Parse(pickQty1) == item.Qty)
                            if (decimal.Parse(pickQty1) == item.Qty)
                            {
                                pickQty += item.Qty;
                                //删除库存箱码明细
                                Db.Deleteable(item).ExecuteCommand();
                            }
                            else
                            {
                                item.Qty -= int.Parse(pickQty1);
                                pickQty += decimal.Parse(pickQty1);
                                item.Qty -= decimal.Parse(pickQty1);
                                item.BitBoxMark = "1";//零箱标识
                                Db.Updateable(item).ExecuteCommand();
                            }
                        }
                        pickQty += item.Qty;
                    }
                    //改变库内箱码是否零箱信息
                    if (biaoShi == "1")
@@ -1968,6 +3517,7 @@
                throw new Exception(e.Message);
            }
        }
        //取样出库拣货(无标签)
        public void SampleSoSetQtyPick(string soType, string soNo, string soDetailId, string palletNo, string PickQty, string asnNo, int userId)
@@ -2152,7 +3702,7 @@
                            SkuName = allot2.SkuName,
                            Standard = allot2.Standard,
                            PalletNo = palletNo,
                            CompleteQty = int.Parse(PickQty) ,
                            CompleteQty = decimal.Parse(PickQty),
                            InspectMark = "1",
                            CreateUser = userId
@@ -2164,7 +3714,7 @@
                    }
                    else if (isComplete == 1)
                    {
                        complete.CompleteQty += int.Parse(PickQty);
                        complete.CompleteQty += decimal.Parse(PickQty);
                        complete.UpdateUser = userId;
                        complete.UpdateTime = Db.GetDate();
@@ -2174,8 +3724,8 @@
                    //修改出库分配信息
                    allot2.Qty += int.Parse(PickQty);
                    allot2.CompleteQty += int.Parse(PickQty);
                    allot2.Qty += decimal.Parse(PickQty);
                    allot2.CompleteQty += decimal.Parse(PickQty);
                    Db.Updateable(allot2).ExecuteCommand();
                    int isDel = 0;
@@ -2183,8 +3733,8 @@
                    //删除或修改库存明细
                    stockDetail.BitPalletMark = "1";//修改为零托标识
                    stockDetail.InspectMark = "1";//修改为抽检托标识
                    stockDetail.Qty -= int.Parse(PickQty);
                    if (stockDetail.Qty == stockDetail.LockQty&& stockDetail.Qty != 0)
                    stockDetail.Qty -= decimal.Parse(PickQty);
                    if (stockDetail.Qty == stockDetail.LockQty && stockDetail.Qty != 0)
                    {
                        stockDetail.Status = "2";
                    }
@@ -2231,13 +3781,13 @@
                    }
                    //修改出库单明细拣货数量
                    noticeDetail.Qty += int.Parse(PickQty);
                    noticeDetail.AllotQty += int.Parse(PickQty);
                    noticeDetail.FactQty += int.Parse(PickQty);
                    noticeDetail.CompleteQty += int.Parse(PickQty);
                    noticeDetail.Qty += decimal.Parse(PickQty);
                    noticeDetail.AllotQty += decimal.Parse(PickQty);
                    noticeDetail.FactQty += decimal.Parse(PickQty);
                    noticeDetail.CompleteQty += decimal.Parse(PickQty);
                    noticeDetail.Money = string.IsNullOrWhiteSpace(sku.Price.ToString()) ? null : sku.Price * noticeDetail.Qty;
                    Db.Updateable(noticeDetail).ExecuteCommand();
                }
                else if (soType == "0")
                {
@@ -2283,7 +3833,7 @@
                    }
                    //剩余拣货数量(待拣减去已拣)
                    var needQty = allot.Qty - allot.CompleteQty;
                    if (int.Parse(PickQty) > needQty)
                    if (decimal.Parse(PickQty) > needQty)
                    {
                        throw new Exception("拣货数量不能大于托内剩余待拣数量");
                    }
@@ -2333,7 +3883,7 @@
                            SkuName = allot.SkuName,
                            Standard = allot.Standard,
                            PalletNo = palletNo,
                            CompleteQty = int.Parse(PickQty),
                            CompleteQty = decimal.Parse(PickQty),
                            CreateUser = userId,
                            CreateTime = Db.GetDate(),
@@ -2345,7 +3895,7 @@
                    }
                    else if (isComplete == 1)
                    {
                        complete.CompleteQty += int.Parse(PickQty);
                        complete.CompleteQty += decimal.Parse(PickQty);
                        complete.UpdateUser = userId;
                        complete.UpdateTime = Db.GetDate();
@@ -2355,7 +3905,7 @@
                    //修改出库分配信息
                    allot.CompleteQty += int.Parse(PickQty);
                    allot.CompleteQty += decimal.Parse(PickQty);
                    allot.Status = allot.Qty == allot.CompleteQty ? "5" : "3";
                    allot.UpdateTime = DateTime.Now;
@@ -2365,8 +3915,8 @@
                    //删除或修改库存明细
                    stockDetail.BitPalletMark = "1";//修改为零托标识
                    stockDetail.Qty -= int.Parse(PickQty);
                    stockDetail.LockQty -= int.Parse(PickQty);
                    stockDetail.Qty -= decimal.Parse(PickQty);
                    stockDetail.LockQty -= decimal.Parse(PickQty);
                    if (stockDetail.Qty == stockDetail.LockQty)
                    {
                        stockDetail.Status = "2";
@@ -2389,8 +3939,8 @@
                        Db.Updateable(stockDetail).ExecuteCommand();
                    }
                    //删除或修改库存
                    stock.Qty -= int.Parse(PickQty);
                    stock.LockQty -= int.Parse(PickQty);
                    stock.Qty -= decimal.Parse(PickQty);
                    stock.LockQty -= decimal.Parse(PickQty);
                    if (stock.Qty <= 0)
                    {
                        Db.Deleteable(stock).ExecuteCommand();
@@ -2415,7 +3965,7 @@
                    }
                    //修改出库单明细拣货数量
                    noticeDetail.CompleteQty += int.Parse(PickQty);
                    noticeDetail.CompleteQty += decimal.Parse(PickQty);
                    Db.Updateable(noticeDetail).ExecuteCommand();
                    var num = Db.Queryable<BllExportNoticeDetail>()
@@ -2439,5 +3989,919 @@
                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) && decimal.Parse(pickQty1) > 0)
                {
                    throw new Exception("追溯条码和拣货数量不能同时输入");
                }
                if (string.IsNullOrWhiteSpace(palletNoNew))
                {
                    throw new Exception("新托盘码不能为空");
                }
                if (palletNo == palletNoNew)//原托盘与新托盘一致
                {
                    if (!string.IsNullOrEmpty(boxNo))
                    {
                        throw new Exception("原托盘与新托盘一致,请选择整托出库");
                    }
                }
                //出库单
                var notice = Db.Queryable<BllExportNotice>().First(m => m.IsDel == "0" && m.SONo == soNo);
                if (notice == null)
                {
                    throw new Exception("未查询到该出库单的信息");
                }
                if (notice.Type != "1" && notice.Type != "2" && notice.Type != "3")
                {
                    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 (palletNo != palletNoNew)//非整托拣货
                    {
                        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
                decimal 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);
                        if (palletNo != palletNoNew)
                        {
                            item.StockDetailId = sdId;
                            item.BindNo = null;//托盘绑定号
                            item.PalletNo = palletNoNew;
                        }
                        item.Status = "5";//箱支状态,0:未组托  1:已组托 2:已入库 3:已出库 4:已分配 5:已拣货
                        //修改库存箱码明细
                        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();
                    if (palletNo != palletNoNew)
                    {
                        //删除原托盘库存明细
                        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();
                    }
                    else
                    {
                        stockDetail.SONo = soNo;
                        Db.Updateable(stockDetail).ExecuteCommand();
                    }
                    //修改出库单明细拣货数量
                    noticeDetail.CompleteQty += pickQty;
                    noticeDetail.Status = "2";
                    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"; //更改为执行完成
                        noticeDetail.Status = "3";
                        Db.Updateable(noticeDetail).ExecuteCommand();
                    }
                    //修改出库单信息
                    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 && m.StockDetailId == stockDetail.Id);
                    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) && decimal.Parse(pickQty1) > 0)//数量拣货
                    {
                        if (boxInfo.Count() > 1)
                        {
                            throw new Exception("该箱码内存在支码不能进行数量拣货");
                        }
                        decimal boxQty = boxInfo.First().Qty;
                        if (decimal.Parse(pickQty1) > boxQty)
                        {
                            throw new Exception("拣货数量不能大于箱内数量");
                        }
                        if (decimal.Parse(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" ? decimal.Parse(pickQty1) : item.Qty,
                            CreateUser = userId
                        };
                        comList.Add(completeDetail);
                        if (biaoShi == "0")//整箱拣货
                        {
                            //修改库存箱码明细
                            item.StockDetailId = sdId;
                            item.BindNo = null;//托盘绑定号
                            item.PalletNo = palletNoNew;
                            item.Status = "5";//箱支状态,0:未组托  1:已组托 2:已入库 3:已出库 4:已分配 5:已拣货
                            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";//零箱标记
                            item.Status = "5";//箱支状态,0:未组托  1:已组托 2:已入库 3:已出库 4:已分配 5:已拣货
                            Db.Updateable(item).ExecuteCommand();
                            pickQty += item.Qty;
                        }
                        else//数量拣货
                        {
                            var boxInfo2 = Db.Queryable<DataBoxInfo>().First(m => m.IsDel == "0" && m.BoxNo == boxNo && m.StockDetailId == sdId);
                            if (decimal.Parse(pickQty1) == item.Qty)
                            {
                                //修改库存箱码明细
                                item.StockDetailId = sdId;
                                item.BindNo = null;//托盘绑定号
                                item.PalletNo = palletNoNew;
                                item.Status = "5";//箱支状态,0:未组托  1:已组托 2:已入库 3:已出库 4:已分配 5:已拣货
                                Db.Updateable(item).ExecuteCommand();
                            }
                            else
                            {
                                if (boxInfo2 == null)
                                {
                                    var dataBoxInfo = new DataBoxInfo()
                                    {
                                        StockDetailId = sdId,
                                        BindNo = item.BindNo,
                                        BoxNo = item.BoxNo,
                                        BoxNo2 = item.BoxNo2,
                                        BoxNo3 = item.BoxNo3,
                                        PalletNo = item.PalletNo,
                                        PalletNo2 = item.PalletNo2,
                                        PalletNo3 = item.PalletNo3,
                                        Qty = decimal.Parse(pickQty1),
                                        FullQty = item.FullQty,
                                        Status = "5",
                                        LotNo = item.LotNo,
                                        LotText = item.LotText,
                                        SkuNo = item.SkuNo,
                                        SkuName = item.SkuName,
                                        Standard = item.Standard,
                                        ProductionTime = item.ProductionTime,
                                        SupplierLot = item.SupplierLot,
                                        InspectMark = item.InspectMark,
                                        BitBoxMark = "1",
                                        InspectStatus = item.InspectStatus,
                                        InspectTime = item.InspectTime,
                                    };
                                    Db.Insertable(dataBoxInfo).ExecuteCommand();
                                }
                                else
                                {
                                    boxInfo2.Qty += decimal.Parse(pickQty1);
                                    item.BitBoxMark = boxInfo2.Qty>= boxInfo2.FullQty? "0":"1" ;//零箱标识
                                    Db.Updateable(boxInfo2).ExecuteCommand();
                                }
                                item.Qty -= decimal.Parse(pickQty1);
                                item.BitBoxMark = "1";//零箱标识
                                if (item.Qty<=0)
                                {
                                    Db.Deleteable(item).ExecuteCommand();
                                }
                                else
                                {
                                    Db.Updateable(item).ExecuteCommand();
                                }
                            }
                            pickQty += decimal.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;
                    noticeDetail.Status = "2";
                    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"; //更改为执行完成
                        noticeDetail.Status = "3";
                        Db.Updateable(noticeDetail).ExecuteCommand();
                    }
                    //修改出库单信息
                    Db.Updateable(notice).ExecuteCommand();
                }
                if (isNew)
                {
                    var sd2 = Db.Queryable<DataStockDetail>().First(m=>m.Id == sdId);
                    sd2.Qty = pickQty;
                    sd2.LockQty = pickQty;
                    Db.Updateable(sd2).ExecuteCommand();
                }
                else
                {
                    if (palletNo != palletNoNew)
                    {
                        //修改拼托托盘库存明细
                        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 (decimal.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("未查询到该托盘分配的库存信息!");
                }
                if (palletNo == palletNoNew)//原托盘与新托盘一致
                {
                    if (decimal.Parse(PickQty) != stockDetail.Qty)
                    {
                        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 (palletNo != palletNoNew)//非整托拣货
                    {
                        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 = decimal.Parse(PickQty);
                    sd.LockQty = decimal.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
                {
                    if (palletNo != palletNoNew)
                    {
                        //修改拼托托盘库存明细
                        pinStockDetail.Qty += decimal.Parse(PickQty);
                        pinStockDetail.LockQty += decimal.Parse(PickQty);
                        Db.Updateable(pinStockDetail).ExecuteCommand();
                    }
                    else
                    {
                        pinStockDetail.SONo = soNo;
                        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>();
                //判断是否存在拣货明细
                isComplete = 0;//所有无箱码或一级箱码拣货时,拣货明细应重新插入数据(体现多次拣货流程记录)
                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 = decimal.Parse(PickQty),
                        CreateUser = userId,
                        CreateTime = Db.GetDate(),
                    };
                    comList.Add(completeDetail);
                    //添加拣货明细
                    Db.Insertable(comList).ExecuteCommand();
                }
                else if (isComplete == 1)
                {
                    complete.CompleteQty += decimal.Parse(PickQty);
                    complete.UpdateUser = userId;
                    complete.UpdateTime = Db.GetDate();
                    Db.Updateable(complete).ExecuteCommand();
                }
                //修改出库分配信息
                allot.CompleteQty += decimal.Parse(PickQty);
                allot.Status = allot.Qty == allot.CompleteQty ? "5" : "3";
                allot.UpdateTime = DateTime.Now;
                Db.Updateable(allot).ExecuteCommand();
                int isDel = 0;
                if (palletNo != palletNoNew)
                {
                    //删除或修改库存明细
                    stockDetail.BitPalletMark = "1";//修改为零托标识
                    stockDetail.Qty -= decimal.Parse(PickQty);
                    stockDetail.LockQty -= decimal.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();
                    }
                }
                else
                {
                    isDel = 1;
                }
                //判断托盘上物料是否拣货完毕
                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 += decimal.Parse(PickQty);
                noticeDetail.Status = "2";
                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"; //更改为执行完成
                    noticeDetail.Status = "3";
                    Db.Updateable(noticeDetail).ExecuteCommand();
                }
                //修改出库单信息
                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
    }
}