zhaowc
2025-01-20 f2bc08e28dda7022202f07217f6a3c150f818af7
Wms/WMS.BLL/BllPdaServer/PdaSoServer.cs
@@ -388,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("追溯条码和拣货数量不能同时输入");
                }
@@ -399,9 +399,21 @@
                {
                    throw new Exception("未查询到该出库单的信息");
                }
                if (notice.Status != "3")
                var type1 = new List<string>() { "0", "4" }; //拣货不可多出 成品出库、不合格品出库
                var type2 = new List<string>() { "1", "2", "3", "5", "6", "7", "8" };//拣货可多出 领料出库、抽检出库、物料取样出库、中间品出库、代储出库、其他出库、寄存出库
                if (type1.Contains(notice.Type))
                {
                    throw new Exception("出库单的状态不是正在执行,不能拣货");
                    if (notice.Status != "3")
                    {
                        throw new Exception("出库单的状态不是正在执行,不能拣货");
                    }
                }
                if (type2.Contains(notice.Type))
                {
                    if (notice.Status != "3" && notice.Status != "4")
                    {
                        throw new Exception("出库单的状态不是正在执行或执行完成,不能拣货");
                    }
                }
                //出库单明细
                var noticeDetail = Db.Queryable<BllExportNoticeDetail>()
@@ -520,6 +532,7 @@
                    Db.Updateable(pallet).ExecuteCommand();
                    //修改出库单明细拣货数量
                    noticeDetail.CompleteQty += pickQty;
                    noticeDetail.Status = "2";
                    Db.Updateable(noticeDetail).ExecuteCommand();
                    var num = Db.Queryable<BllExportNoticeDetail>()
@@ -527,7 +540,10 @@
                    if (num <= 0)
                    {
                        notice.Status = "4"; //更改为执行完成
                        noticeDetail.Status = "3";
                        Db.Updateable(noticeDetail).ExecuteCommand();
                    }
                    //修改出库单信息
                    Db.Updateable(notice).ExecuteCommand();
                }
@@ -535,7 +551,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("未查询到该箱码及追溯码的信息");
@@ -576,18 +592,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("拣货数量不能大于剩余待拣数量");
                        }
@@ -649,6 +665,7 @@
                        if (biaoShi != "2")
                        {
                            pickQty += item.Qty;
                            //删除库存箱码明细
                            Db.Deleteable(item).ExecuteCommand();
                        }
@@ -656,17 +673,20 @@
                        {
                            if (decimal.Parse(pickQty1) == item.Qty)
                            {
                                pickQty += item.Qty;
                                //删除库存箱码明细
                                Db.Deleteable(item).ExecuteCommand();
                            }
                            else
                            {
                                pickQty += decimal.Parse(pickQty1);
                                item.Qty -= decimal.Parse(pickQty1);
                                item.BitBoxMark = "1";//零箱标识
                                Db.Updateable(item).ExecuteCommand();
                            }
                        }
                        pickQty += item.Qty;
                    }
                    //改变库内箱码是否零箱信息
                    if (biaoShi == "1")
@@ -739,6 +759,7 @@
                    }
                    //修改出库单明细拣货数量
                    noticeDetail.CompleteQty += pickQty;
                    noticeDetail.Status = "2";
                    Db.Updateable(noticeDetail).ExecuteCommand();
                    var num = Db.Queryable<BllExportNoticeDetail>()
@@ -746,6 +767,9 @@
                    if (num <= 0)
                    {
                        notice.Status = "4"; //更改为执行完成
                        noticeDetail.Status = "3";
                        Db.Updateable(noticeDetail).ExecuteCommand();
                    }
                    //修改出库单信息
                    Db.Updateable(notice).ExecuteCommand();
@@ -809,7 +833,7 @@
                }
                //剩余拣货数量(待拣减去已拣)
                var needQty = allot.Qty - allot.CompleteQty;
                if (int.Parse(PickQty) > needQty)
                if (decimal.Parse(PickQty) > needQty)
                {
                    throw new Exception("拣货数量不能大于托内剩余待拣数量");
                }
@@ -872,7 +896,7 @@
                }
                else if (isComplete == 1)
                {
                    complete.CompleteQty += int.Parse(PickQty);
                    complete.CompleteQty += decimal.Parse(PickQty);
                    complete.UpdateUser = userId;
                    complete.UpdateTime = Db.GetDate();
@@ -880,7 +904,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();
@@ -889,8 +913,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";
@@ -913,8 +937,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();
@@ -940,6 +964,7 @@
                //修改出库单明细拣货数量
                noticeDetail.CompleteQty += int.Parse(PickQty);
                noticeDetail.Status = "2";
                Db.Updateable(noticeDetail).ExecuteCommand();
                var num = Db.Queryable<BllExportNoticeDetail>()
@@ -947,6 +972,8 @@
                if (num <= 0)
                {
                    notice.Status = "4"; //更改为执行完成
                    noticeDetail.Status = "3";
                    Db.Updateable(noticeDetail).ExecuteCommand();
                }
                //修改出库单信息
                Db.Updateable(notice).ExecuteCommand();
@@ -1337,40 +1364,53 @@
                                    {
                                        #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", //是否打带
                                        ////添加分配表信息
                                        //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,//出库口
                                        //    //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();
                                        //    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    //出库任务
                                        {
@@ -1379,9 +1419,9 @@
                                            Receiver = "PDA",
                                            IsSuccess = 1, //是否下发成功 0失败 1成功
                                            StartLocat = locat == null ? "" : s.LocatNo,//起始位置
                                            EndLocat = model.OutMode,//目标位置
                                            PalletNo = s.PalletNo,//托盘码
                                            StartLocat = slotBefore.LocatNo,//起始位置
                                            EndLocat = newSlot,//目标位置
                                            PalletNo = PalletNo,//托盘码
                                            IsSend = 1,//是否可再次下发
                                            IsCancel = 1,//是否可取消
                                            IsFinish = 1,//是否可完成
@@ -1390,7 +1430,7 @@
                                            OrderType = "1",//0 入库单 1 出库单  2 盘点单  3 移库单
                                            CreateTime = serverTime, //创建时间
                                            CreateUser = userId, //创建人
                                            Msg = "Pda空托从" + locat == null ? "" : s.LocatNo + "到" + model.OutMode + "的移库任务", //关键信息
                                            Msg = "Pda空托从" + locat == null ? "" : slotBefore.LocatNo + "到" + newSlot + "的移库任务", //关键信息
                                                                                                                             //FinishDate = serverTime, //完成时间
                                        };
                                        moveDto.Add(new OutCommandDto()
@@ -1398,10 +1438,10 @@
                                            PalletNo = exTask.PalletNo,//托盘号
                                            StartLocate = exTask.StartLocat, // 起始位置
                                            StartRoadway = locat.RoadwayNo, //所属巷道
                                            EndLocate = model.OutMode, // 目标位置
                                            EndLocate = exTask.EndLocat, // 目标位置
                                            TaskNo = exTask.TaskNo, // 任务号
                                            TaskType = "2",// 任务类型 (出库)
                                            OutMode = model.OutMode,  //目标地址
                                            TaskType = "2",// 任务类型 (移库)
                                            OutMode = "",  //目标地址
                                            Order = 1
                                        });
                                        Db.Insertable(exTask).ExecuteCommand();
@@ -1412,6 +1452,12 @@
                                        //更改储位状态为移出中
                                        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  //出库
@@ -1419,17 +1465,17 @@
                                        #region 改变库存
                                        //增加库存锁定数量
                                        stock.LockQty += (int)s.Qty; //锁定数量
                                        stock.LockQty += (int)pallSku.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();//修改库存明细信息
                                        pallSku.LockQty += (int)pallSku.Qty; //锁定数量
                                        pallSku.UpdateTime = serverTime; //修改时间
                                        pallSku.UpdateUser = userId; //修改人
                                        pallSku.Status = "2"; //2 已分配
                                        Db.Updateable(pallSku).ExecuteCommand();//修改库存明细信息
                                        #endregion
@@ -1441,19 +1487,19 @@
                                            SONo = "",
                                            WaveNo = "",
                                            SODetailNo = 0,
                                            StockId = s.Id,
                                            StockId = pallSku.Id,
                                            LotNo = "",
                                            LotText = "",
                                            SupplierLot = "",
                                            SkuNo = s.SkuNo,
                                            SkuName = s.SkuName,
                                            Standard = s.Standard,
                                            PalletNo = s.PalletNo,
                                            SkuNo = pallSku.SkuNo,
                                            SkuName = pallSku.SkuName,
                                            Standard = pallSku.Standard,
                                            PalletNo = pallSku.PalletNo,
                                            IsBale = "0", //是否裹包
                                            IsBelt = "0", //是否打带
                                            //BoxexQty = s.Qty,
                                            Qty = (int)s.Qty,
                                            Qty = (int)pallSku.Qty,
                                            CompleteQty = 0,
                                            Status = "1",
                                            LogisticsId = 0,
@@ -1477,9 +1523,9 @@
                                            Receiver = "PDA",
                                            IsSuccess = 1, //是否下发成功 0失败 1成功
                                            StartLocat = locat == null ? "" : s.LocatNo,//起始位置
                                            StartLocat = locat == null ? "" : pallSku.LocatNo,//起始位置
                                            EndLocat = model.OutMode,//目标位置
                                            PalletNo = s.PalletNo,//托盘码
                                            PalletNo = pallSku.PalletNo,//托盘码
                                            IsSend = 1,//是否可再次下发
                                            IsCancel = 1,//是否可取消
                                            IsFinish = 1,//是否可完成
@@ -1488,7 +1534,7 @@
                                            OrderType = "1",//0 入库单 1 出库单  2 盘点单  3 移库单
                                            CreateTime = serverTime, //创建时间
                                            CreateUser = userId, //创建人
                                            Msg = "Pda空托从" + locat == null ? "" : s.LocatNo + "到" + model.OutMode + "的出库任务", //关键信息
                                            Msg = "Pda空托从" + locat == null ? "" : pallSku.LocatNo + "到" + model.OutMode + "的出库任务", //关键信息
                                                                                                                             //FinishDate = serverTime, //完成时间
                                        };
                                        outDto2.Add(new OutCommandDto()
@@ -1676,20 +1722,720 @@
        }
        public string MoveAddress(string oldAddress, string roadWay, string skuNo)//01020201  排-列-层-深度
        /// <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 skuCategoryNo = Db.Queryable<SysMaterials>().Where(a => a.IsDel == "0" && a.SkuNo == skuNo).Select(a => a.CategoryNo).First();
            var category = Db.Queryable<SysMaterialCategory>().First(a => a.IsDel == "0" && a.CategoryNo == skuCategoryNo);
            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 ('{category.AreaNo}') order by distNum;";
            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)   // 判断同巷道内排空库位
@@ -2004,7 +2750,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("追溯条码和拣货数量不能同时输入");
                    }
@@ -2179,7 +2925,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)
                        {
@@ -2345,7 +3091,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("追溯条码和拣货数量不能同时输入");
                    }
@@ -2433,18 +3179,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("拣货数量不能大于剩余待拣数量");
                        }
@@ -2509,6 +3255,7 @@
                        if (biaoShi != "2")
                        {
                            pickQty += item.Qty;
                            //删除库存箱码明细
                            Db.Deleteable(item).ExecuteCommand();
                        }
@@ -2516,17 +3263,19 @@
                        {
                            if (decimal.Parse(pickQty1) == item.Qty)
                            {
                                pickQty += item.Qty;
                                //删除库存箱码明细
                                Db.Deleteable(item).ExecuteCommand();
                            }
                            else
                            {
                                pickQty += decimal.Parse(pickQty1);
                                item.Qty -= decimal.Parse(pickQty1);
                                item.BitBoxMark = "1";//零箱标识
                                Db.Updateable(item).ExecuteCommand();
                            }
                        }
                        pickQty += item.Qty;
                    }
                    //改变库内箱码是否零箱信息
                    if (biaoShi == "1")
@@ -2620,6 +3369,7 @@
                throw new Exception(e.Message);
            }
        }
        //取样出库拣货(无标签)
        public void SampleSoSetQtyPick(string soType, string soNo, string soDetailId, string palletNo, string PickQty, string asnNo, int userId)
@@ -2804,7 +3554,7 @@
                            SkuName = allot2.SkuName,
                            Standard = allot2.Standard,
                            PalletNo = palletNo,
                            CompleteQty = int.Parse(PickQty),
                            CompleteQty = decimal.Parse(PickQty),
                            InspectMark = "1",
                            CreateUser = userId
@@ -2816,7 +3566,7 @@
                    }
                    else if (isComplete == 1)
                    {
                        complete.CompleteQty += int.Parse(PickQty);
                        complete.CompleteQty += decimal.Parse(PickQty);
                        complete.UpdateUser = userId;
                        complete.UpdateTime = Db.GetDate();
@@ -2826,8 +3576,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;
@@ -2835,7 +3585,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";
@@ -2883,10 +3633,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();
@@ -2935,7 +3685,7 @@
                    }
                    //剩余拣货数量(待拣减去已拣)
                    var needQty = allot.Qty - allot.CompleteQty;
                    if (int.Parse(PickQty) > needQty)
                    if (decimal.Parse(PickQty) > needQty)
                    {
                        throw new Exception("拣货数量不能大于托内剩余待拣数量");
                    }
@@ -2985,7 +3735,7 @@
                            SkuName = allot.SkuName,
                            Standard = allot.Standard,
                            PalletNo = palletNo,
                            CompleteQty = int.Parse(PickQty),
                            CompleteQty = decimal.Parse(PickQty),
                            CreateUser = userId,
                            CreateTime = Db.GetDate(),
@@ -2997,7 +3747,7 @@
                    }
                    else if (isComplete == 1)
                    {
                        complete.CompleteQty += int.Parse(PickQty);
                        complete.CompleteQty += decimal.Parse(PickQty);
                        complete.UpdateUser = userId;
                        complete.UpdateTime = Db.GetDate();
@@ -3007,7 +3757,7 @@
                    //修改出库分配信息
                    allot.CompleteQty += int.Parse(PickQty);
                    allot.CompleteQty += decimal.Parse(PickQty);
                    allot.Status = allot.Qty == allot.CompleteQty ? "5" : "3";
                    allot.UpdateTime = DateTime.Now;
@@ -3017,8 +3767,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";
@@ -3041,8 +3791,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();
@@ -3067,7 +3817,7 @@
                    }
                    //修改出库单明细拣货数量
                    noticeDetail.CompleteQty += int.Parse(PickQty);
                    noticeDetail.CompleteQty += decimal.Parse(PickQty);
                    Db.Updateable(noticeDetail).ExecuteCommand();
                    var num = Db.Queryable<BllExportNoticeDetail>()
@@ -3124,7 +3874,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("追溯条码和拣货数量不能同时输入");
                }
@@ -3146,10 +3896,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));
@@ -3186,7 +3940,7 @@
                #region 拼托信息
                var sdId = 0;
                bool isNew = false;
                var pinStockDetail = Db.Queryable<DataStockDetail>().First(m => m.IsDel == "0" && m.PalletNo == palletNoNew && m.SkuNo == allot.SkuNo && m.LotNo == allot.LotNo);
                var pinStockDetail = Db.Queryable<DataStockDetail>().First(m => m.IsDel == "0" && m.PalletNo == palletNoNew);
                if (pinStockDetail != null)
                {
                    if (palletNo != palletNoNew)//非整托拣货
@@ -3357,6 +4111,7 @@
                   
                    //修改出库单明细拣货数量
                    noticeDetail.CompleteQty += pickQty;
                    noticeDetail.Status = "2";
                    Db.Updateable(noticeDetail).ExecuteCommand();
                    var num = Db.Queryable<BllExportNoticeDetail>()
@@ -3364,6 +4119,8 @@
                    if (num <= 0)
                    {
                        notice.Status = "4"; //更改为执行完成
                        noticeDetail.Status = "3";
                        Db.Updateable(noticeDetail).ExecuteCommand();
                    }
                    //修改出库单信息
                    Db.Updateable(notice).ExecuteCommand();
@@ -3372,7 +4129,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("未查询到该箱码及追溯码的信息");
@@ -3413,18 +4170,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 (decimal.Parse(pickQty1) > boxQty)
                        {
                            throw new Exception("拣货数量不能大于箱内数量");
                        }
                        if (Convert.ToInt32(pickQty1) > needQty)
                        if (decimal.Parse(pickQty1) > needQty)
                        {
                            throw new Exception("拣货数量不能大于剩余待拣数量");
                        }
@@ -3509,6 +4266,8 @@
                        }
                        else//数量拣货
                        {
                            var boxInfo2 = Db.Queryable<DataBoxInfo>().First(m => m.IsDel == "0" && m.BoxNo == boxNo && m.StockDetailId == sdId);
                            if (decimal.Parse(pickQty1) == item.Qty)
                            {
                                //修改库存箱码明细
@@ -3520,12 +4279,56 @@
                            }
                            else
                            {
                                if (boxInfo2 == null)
                                {
                                    var dataBoxInfo = new DataBoxInfo()
                                    {
                                        StockDetailId = sdId,
                                        BindNo = item.BindNo,
                                        BoxNo = item.BoxNo,
                                        BoxNo2 = item.BoxNo2,
                                        BoxNo3 = item.BoxNo3,
                                        PalletNo = item.PalletNo,
                                        PalletNo2 = item.PalletNo2,
                                        PalletNo3 = item.PalletNo3,
                                        Qty = decimal.Parse(pickQty1),
                                        FullQty = item.FullQty,
                                        Status = "5",
                                        LotNo = item.LotNo,
                                        LotText = item.LotText,
                                        SkuNo = item.SkuNo,
                                        SkuName = item.SkuName,
                                        Standard = item.Standard,
                                        ProductionTime = item.ProductionTime,
                                        SupplierLot = item.SupplierLot,
                                        InspectMark = item.InspectMark,
                                        BitBoxMark = "1",
                                        InspectStatus = item.InspectStatus,
                                        InspectTime = item.InspectTime,
                                    };
                                    Db.Insertable(dataBoxInfo).ExecuteCommand();
                                }
                                else
                                {
                                    boxInfo2.Qty += decimal.Parse(pickQty1);
                                    item.BitBoxMark = boxInfo2.Qty>= boxInfo2.FullQty? "0":"1" ;//零箱标识
                                    Db.Updateable(boxInfo2).ExecuteCommand();
                                }
                                item.Qty -= decimal.Parse(pickQty1);
                                item.BitBoxMark = "1";//零箱标识
                                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);
                        }
                    }
                    //改变库内箱码是否零箱信息
@@ -3589,6 +4392,7 @@
                    }
                    //修改出库单明细拣货数量
                    noticeDetail.CompleteQty += pickQty;
                    noticeDetail.Status = "2";
                    Db.Updateable(noticeDetail).ExecuteCommand();
                    var num = Db.Queryable<BllExportNoticeDetail>()
@@ -3596,17 +4400,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(sd).ExecuteCommand();
                    Db.Updateable(sd2).ExecuteCommand();
                }
                else
                {
@@ -3690,7 +4498,7 @@
                }
                //剩余拣货数量(待拣减去已拣)
                var needQty = allot.Qty - allot.CompleteQty;
                if (int.Parse(PickQty) > needQty)
                if (decimal.Parse(PickQty) > needQty)
                {
                    throw new Exception("拣货数量不能大于托内剩余待拣数量");
                }
@@ -3709,7 +4517,7 @@
                }
                if (palletNo == palletNoNew)//原托盘与新托盘一致
                {
                    if (int.Parse(PickQty) != stockDetail.Qty)
                    if (decimal.Parse(PickQty) != stockDetail.Qty)
                    {
                        throw new Exception("原托盘与新托盘一致,需要把托盘上所有数量拣货");
                    }
@@ -3758,8 +4566,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;
@@ -3802,8 +4610,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
@@ -3847,7 +4655,7 @@
                        SkuName = allot.SkuName,
                        Standard = allot.Standard,
                        PalletNo = palletNo,
                        CompleteQty = int.Parse(PickQty),
                        CompleteQty = decimal.Parse(PickQty),
                        CreateUser = userId,
                        CreateTime = Db.GetDate(),
@@ -3859,7 +4667,7 @@
                }
                else if (isComplete == 1)
                {
                    complete.CompleteQty += int.Parse(PickQty);
                    complete.CompleteQty += decimal.Parse(PickQty);
                    complete.UpdateUser = userId;
                    complete.UpdateTime = Db.GetDate();
@@ -3867,7 +4675,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();
@@ -3878,8 +4686,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";
@@ -3921,7 +4729,8 @@
                }
                //修改出库单明细拣货数量
                noticeDetail.CompleteQty += int.Parse(PickQty);
                noticeDetail.CompleteQty += decimal.Parse(PickQty);
                noticeDetail.Status = "2";
                Db.Updateable(noticeDetail).ExecuteCommand();
                var num = Db.Queryable<BllExportNoticeDetail>()
@@ -3929,6 +4738,8 @@
                if (num <= 0)
                {
                    notice.Status = "4"; //更改为执行完成
                    noticeDetail.Status = "3";
                    Db.Updateable(noticeDetail).ExecuteCommand();
                }
                //修改出库单信息
                Db.Updateable(notice).ExecuteCommand();