chengsc
2024-10-20 f8957ba7f0ade842553bd37254cf31da639a1925
Wms/WMS.BLL/BllPdaServer/PdaSoServer.cs
@@ -18,6 +18,8 @@
using WMS.BLL.LogServer;
using WMS.DAL;
using WMS.Entity.LogEntity;
using Model.ModelDto.SysDto;
using Model.ModelDto.BllSoDto;
namespace WMS.BLL.BllPdaServer
{
@@ -386,7 +388,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("追溯条码和拣货数量不能同时输入");
                }
@@ -518,6 +520,7 @@
                    Db.Updateable(pallet).ExecuteCommand();
                    //修改出库单明细拣货数量
                    noticeDetail.CompleteQty += pickQty;
                    noticeDetail.Status = "2";
                    Db.Updateable(noticeDetail).ExecuteCommand();
                    var num = Db.Queryable<BllExportNoticeDetail>()
@@ -525,7 +528,10 @@
                    if (num <= 0)
                    {
                        notice.Status = "4"; //更改为执行完成
                        noticeDetail.Status = "3";
                        Db.Updateable(noticeDetail).ExecuteCommand();
                    }
                    //修改出库单信息
                    Db.Updateable(notice).ExecuteCommand();
                }
@@ -533,7 +539,7 @@
                {
                    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("未查询到该箱码及追溯码的信息");
@@ -574,18 +580,18 @@
                        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("该箱码内存在支码不能进行数量拣货");
                        }
                        decimal boxQty = boxInfo.First().Qty;
                        if (Convert.ToInt32(pickQty1) > boxQty)
                        if (Convert.ToDecimal(pickQty1) > boxQty)
                        {
                            throw new Exception("拣货数量不能大于箱内数量");
                        }
                        if (Convert.ToInt32(pickQty1) > needQty)
                        if (Convert.ToDecimal(pickQty1) > needQty)
                        {
                            throw new Exception("拣货数量不能大于剩余待拣数量");
                        }
@@ -639,7 +645,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
                        };
@@ -647,24 +653,28 @@
                        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")
@@ -737,6 +747,7 @@
                    }
                    //修改出库单明细拣货数量
                    noticeDetail.CompleteQty += pickQty;
                    noticeDetail.Status = "2";
                    Db.Updateable(noticeDetail).ExecuteCommand();
                    var num = Db.Queryable<BllExportNoticeDetail>()
@@ -744,6 +755,9 @@
                    if (num <= 0)
                    {
                        notice.Status = "4"; //更改为执行完成
                        noticeDetail.Status = "3";
                        Db.Updateable(noticeDetail).ExecuteCommand();
                    }
                    //修改出库单信息
                    Db.Updateable(notice).ExecuteCommand();
@@ -807,7 +821,7 @@
                }
                //剩余拣货数量(待拣减去已拣)
                var needQty = allot.Qty - allot.CompleteQty;
                if (int.Parse(PickQty) > needQty)
                if (decimal.Parse(PickQty) > needQty)
                {
                    throw new Exception("拣货数量不能大于托内剩余待拣数量");
                }
@@ -870,7 +884,7 @@
                }
                else if (isComplete == 1)
                {
                    complete.CompleteQty += int.Parse(PickQty);
                    complete.CompleteQty += decimal.Parse(PickQty);
                    complete.UpdateUser = userId;
                    complete.UpdateTime = Db.GetDate();
@@ -878,7 +892,7 @@
                }
                //修改出库分配信息
                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();
@@ -887,8 +901,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";
@@ -911,8 +925,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();
@@ -938,6 +952,7 @@
                //修改出库单明细拣货数量
                noticeDetail.CompleteQty += int.Parse(PickQty);
                noticeDetail.Status = "2";
                Db.Updateable(noticeDetail).ExecuteCommand();
                var num = Db.Queryable<BllExportNoticeDetail>()
@@ -945,6 +960,8 @@
                if (num <= 0)
                {
                    notice.Status = "4"; //更改为执行完成
                    noticeDetail.Status = "3";
                    Db.Updateable(noticeDetail).ExecuteCommand();
                }
                //修改出库单信息
                Db.Updateable(notice).ExecuteCommand();
@@ -973,7 +990,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();
                //获取库存明细是否小于等于该垛数
@@ -997,132 +1016,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
@@ -1153,7 +1696,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 "";
@@ -1165,6 +1708,768 @@
                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);
            }
        }
        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;
        }
        //获取平库托盘信息
@@ -1228,7 +2533,7 @@
                if (result.WareHouseNo != "W02")//W02:零箱库
                {
                    throw new Exception("该托盘未在零箱库,请检查!");
                    throw new Exception("该托盘未在平库内,请检查!");
                }
                #endregion
@@ -1240,9 +2545,9 @@
                {
                    throw new Exception("未获取到对应储位信息,请检查!");
                }
                if (locat.Status != "1")
                if (locat.Status != "3")
                {
                    throw new Exception("当前储位不是有物品,请检查!");
                    throw new Exception("当前储位不是出库中,请检查!");
                }
                #endregion
@@ -1433,7 +2738,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("追溯条码和拣货数量不能同时输入");
                    }
@@ -1608,7 +2913,7 @@
                        }
                        biaoShi = "1";
                    }
                    else if (!string.IsNullOrEmpty(pickQty1) && int.Parse(pickQty1) > 0)//数量拣货
                    else if (!string.IsNullOrEmpty(pickQty1) && decimal.Parse(pickQty1) > 0)//数量拣货
                    {
                        if (boxInfo.Count() > 1)
                        {
@@ -1667,7 +2972,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
@@ -1681,20 +2986,20 @@
                        }
                        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;
                    }
@@ -1774,7 +3079,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("追溯条码和拣货数量不能同时输入");
                    }
@@ -1862,18 +3167,18 @@
                        }
                        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("该箱码内存在支码不能进行数量拣货");
                        }
                        decimal boxQty = boxInfo.First().Qty;
                        if (Convert.ToInt32(pickQty1) > boxQty)
                        if (Convert.ToDecimal(pickQty1) > boxQty)
                        {
                            throw new Exception("拣货数量不能大于箱内数量");
                        }
                        if (Convert.ToInt32(pickQty1) > needQty)
                        if (Convert.ToDecimal(pickQty1) > needQty)
                        {
                            throw new Exception("拣货数量不能大于剩余待拣数量");
                        }
@@ -1930,7 +3235,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
                        };
@@ -1938,24 +3243,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")
@@ -2049,6 +3357,7 @@
                throw new Exception(e.Message);
            }
        }
        //取样出库拣货(无标签)
        public void SampleSoSetQtyPick(string soType, string soNo, string soDetailId, string palletNo, string PickQty, string asnNo, int userId)
@@ -2233,7 +3542,7 @@
                            SkuName = allot2.SkuName,
                            Standard = allot2.Standard,
                            PalletNo = palletNo,
                            CompleteQty = int.Parse(PickQty),
                            CompleteQty = decimal.Parse(PickQty),
                            InspectMark = "1",
                            CreateUser = userId
@@ -2245,7 +3554,7 @@
                    }
                    else if (isComplete == 1)
                    {
                        complete.CompleteQty += int.Parse(PickQty);
                        complete.CompleteQty += decimal.Parse(PickQty);
                        complete.UpdateUser = userId;
                        complete.UpdateTime = Db.GetDate();
@@ -2255,8 +3564,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;
@@ -2264,7 +3573,7 @@
                    //删除或修改库存明细
                    stockDetail.BitPalletMark = "1";//修改为零托标识
                    stockDetail.InspectMark = "1";//修改为抽检托标识
                    stockDetail.Qty -= int.Parse(PickQty);
                    stockDetail.Qty -= decimal.Parse(PickQty);
                    if (stockDetail.Qty == stockDetail.LockQty && stockDetail.Qty != 0)
                    {
                        stockDetail.Status = "2";
@@ -2312,10 +3621,10 @@
                    }
                    //修改出库单明细拣货数量
                    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();
@@ -2364,7 +3673,7 @@
                    }
                    //剩余拣货数量(待拣减去已拣)
                    var needQty = allot.Qty - allot.CompleteQty;
                    if (int.Parse(PickQty) > needQty)
                    if (decimal.Parse(PickQty) > needQty)
                    {
                        throw new Exception("拣货数量不能大于托内剩余待拣数量");
                    }
@@ -2414,7 +3723,7 @@
                            SkuName = allot.SkuName,
                            Standard = allot.Standard,
                            PalletNo = palletNo,
                            CompleteQty = int.Parse(PickQty),
                            CompleteQty = decimal.Parse(PickQty),
                            CreateUser = userId,
                            CreateTime = Db.GetDate(),
@@ -2426,7 +3735,7 @@
                    }
                    else if (isComplete == 1)
                    {
                        complete.CompleteQty += int.Parse(PickQty);
                        complete.CompleteQty += decimal.Parse(PickQty);
                        complete.UpdateUser = userId;
                        complete.UpdateTime = Db.GetDate();
@@ -2436,7 +3745,7 @@
                    //修改出库分配信息
                    allot.CompleteQty += int.Parse(PickQty);
                    allot.CompleteQty += decimal.Parse(PickQty);
                    allot.Status = allot.Qty == allot.CompleteQty ? "5" : "3";
                    allot.UpdateTime = DateTime.Now;
@@ -2446,8 +3755,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";
@@ -2470,8 +3779,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();
@@ -2496,7 +3805,7 @@
                    }
                    //修改出库单明细拣货数量
                    noticeDetail.CompleteQty += int.Parse(PickQty);
                    noticeDetail.CompleteQty += decimal.Parse(PickQty);
                    Db.Updateable(noticeDetail).ExecuteCommand();
                    var num = Db.Queryable<BllExportNoticeDetail>()
@@ -2553,7 +3862,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("追溯条码和拣货数量不能同时输入");
                }
@@ -2575,10 +3884,14 @@
                {
                    throw new Exception("未查询到该出库单的信息");
                }
                if (notice.Status != "3")
                if (notice.Type != "1" && notice.Type != "2" && notice.Type != "3")
                {
                    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));
@@ -2786,6 +4099,7 @@
                   
                    //修改出库单明细拣货数量
                    noticeDetail.CompleteQty += pickQty;
                    noticeDetail.Status = "2";
                    Db.Updateable(noticeDetail).ExecuteCommand();
                    var num = Db.Queryable<BllExportNoticeDetail>()
@@ -2793,6 +4107,8 @@
                    if (num <= 0)
                    {
                        notice.Status = "4"; //更改为执行完成
                        noticeDetail.Status = "3";
                        Db.Updateable(noticeDetail).ExecuteCommand();
                    }
                    //修改出库单信息
                    Db.Updateable(notice).ExecuteCommand();
@@ -2801,7 +4117,7 @@
                {
                    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("未查询到该箱码及追溯码的信息");
@@ -2842,7 +4158,7 @@
                        biaoShi = "1";
                    }
                    else if (!string.IsNullOrEmpty(pickQty1) && int.Parse(pickQty1) > 0)//数量拣货
                    else if (!string.IsNullOrEmpty(pickQty1) && decimal.Parse(pickQty1) > 0)//数量拣货
                    {
                        if (boxInfo.Count() > 1)
                        {
@@ -2906,7 +4222,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
                        };
@@ -2938,7 +4254,9 @@
                        }
                        else//数量拣货
                        {
                            if (int.Parse(pickQty1) == item.Qty)
                            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;
@@ -2949,12 +4267,56 @@
                            }
                            else
                            {
                                item.Qty -= int.Parse(pickQty1);
                                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";//零箱标识
                                Db.Updateable(item).ExecuteCommand();
                                if (item.Qty<=0)
                                {
                                    Db.Deleteable(item).ExecuteCommand();
                                }
                                else
                                {
                                    Db.Updateable(item).ExecuteCommand();
                                }
                            }
                            pickQty += int.Parse(pickQty1);
                            pickQty += decimal.Parse(pickQty1);
                        }
                    }
                    //改变库内箱码是否零箱信息
@@ -3018,6 +4380,7 @@
                    }
                    //修改出库单明细拣货数量
                    noticeDetail.CompleteQty += pickQty;
                    noticeDetail.Status = "2";
                    Db.Updateable(noticeDetail).ExecuteCommand();
                    var num = Db.Queryable<BllExportNoticeDetail>()
@@ -3025,15 +4388,21 @@
                    if (num <= 0)
                    {
                        notice.Status = "4"; //更改为执行完成
                        noticeDetail.Status = "3";
                        Db.Updateable(noticeDetail).ExecuteCommand();
                    }
                    //修改出库单信息
                    Db.Updateable(notice).ExecuteCommand();
                }
                if (isNew)
                {
                    sd.Qty = pickQty;
                    sd.LockQty = pickQty;
                    var sd2 = Db.Queryable<DataStockDetail>().First(m=>m.Id == sdId);
                    sd2.Qty = pickQty;
                    sd2.LockQty = pickQty;
                    Db.Updateable(sd2).ExecuteCommand();
                }
                else
                {
@@ -3117,7 +4486,7 @@
                }
                //剩余拣货数量(待拣减去已拣)
                var needQty = allot.Qty - allot.CompleteQty;
                if (int.Parse(PickQty) > needQty)
                if (decimal.Parse(PickQty) > needQty)
                {
                    throw new Exception("拣货数量不能大于托内剩余待拣数量");
                }
@@ -3136,7 +4505,7 @@
                }
                if (palletNo == palletNoNew)//原托盘与新托盘一致
                {
                    if (int.Parse(PickQty) != stockDetail.Qty)
                    if (decimal.Parse(PickQty) != stockDetail.Qty)
                    {
                        throw new Exception("原托盘与新托盘一致,需要把托盘上所有数量拣货");
                    }
@@ -3185,8 +4554,8 @@
                    sd.SkuName = stockDetail.SkuName;
                    sd.Standard = stockDetail.Standard;
                    sd.Qty = int.Parse(PickQty);
                    sd.LockQty = int.Parse(PickQty);
                    sd.Qty = decimal.Parse(PickQty);
                    sd.LockQty = decimal.Parse(PickQty);
                    sd.FrozenQty = 0;
                    sd.InspectQty = 0;
@@ -3229,8 +4598,8 @@
                    if (palletNo != palletNoNew)
                    {
                        //修改拼托托盘库存明细
                        pinStockDetail.Qty += int.Parse(PickQty);
                        pinStockDetail.LockQty += int.Parse(PickQty);
                        pinStockDetail.Qty += decimal.Parse(PickQty);
                        pinStockDetail.LockQty += decimal.Parse(PickQty);
                        Db.Updateable(pinStockDetail).ExecuteCommand();
                    }
                    else
@@ -3274,7 +4643,7 @@
                        SkuName = allot.SkuName,
                        Standard = allot.Standard,
                        PalletNo = palletNo,
                        CompleteQty = int.Parse(PickQty),
                        CompleteQty = decimal.Parse(PickQty),
                        CreateUser = userId,
                        CreateTime = Db.GetDate(),
@@ -3286,7 +4655,7 @@
                }
                else if (isComplete == 1)
                {
                    complete.CompleteQty += int.Parse(PickQty);
                    complete.CompleteQty += decimal.Parse(PickQty);
                    complete.UpdateUser = userId;
                    complete.UpdateTime = Db.GetDate();
@@ -3294,7 +4663,7 @@
                }
                //修改出库分配信息
                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();
@@ -3305,8 +4674,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";
@@ -3348,7 +4717,8 @@
                }
                //修改出库单明细拣货数量
                noticeDetail.CompleteQty += int.Parse(PickQty);
                noticeDetail.CompleteQty += decimal.Parse(PickQty);
                noticeDetail.Status = "2";
                Db.Updateable(noticeDetail).ExecuteCommand();
                var num = Db.Queryable<BllExportNoticeDetail>()
@@ -3356,6 +4726,8 @@
                if (num <= 0)
                {
                    notice.Status = "4"; //更改为执行完成
                    noticeDetail.Status = "3";
                    Db.Updateable(noticeDetail).ExecuteCommand();
                }
                //修改出库单信息
                Db.Updateable(notice).ExecuteCommand();