Demo
2024-03-16 7f4b5fb7a89052f1fbd2e00b34e60e1b55f73ab3
Wms/WMS.BLL/BllSoServer/ExportNoticeServer.cs
@@ -141,6 +141,7 @@
                            SupplierLot = stocks.First().SupplierLot,
                            IsWave = "0",
                            WaveNo = "",
                            IsIssueLotNo = string.IsNullOrWhiteSpace(d.LotNo)? "0":"1",
                            CreateUser = 0,
                        };
@@ -199,15 +200,23 @@
        {
            try
            {
                var notice = Db.Queryable<BllExportNotice>().First(m => m.Id == id&& m.IsDel == "0");
                var notice = Db.Queryable<BllExportNotice>().First(m => m.Id == id && m.IsDel == "0");
                if (notice == null)
                {
                    throw new Exception("未查询到单据信息");
                }
                if (notice.Status != "5")
                {
                    throw new Exception("复核失败,单据非关闭状态");
                }
                var detail = Db.Queryable<BllExportNoticeDetail>().Where(m => m.SONo == notice.SONo && m.IsDel == "0").ToList();
                if (detail.Count == 0)
                {
                    throw new Exception("未查询到单据明细信息");
                }
                if (userId == notice.UpdateUser)
                {
                    throw new Exception("复核失败,复核人员和关闭订单人员不能相同!");
                }
                var list = new List<SoDetail>();
                foreach (var d in detail)
@@ -216,7 +225,7 @@
                    {
                        SkuNo = d.SkuNo,
                        LotNo = d.LotNo,
                        Qty = int.Parse(d.CompleteQty.ToString())
                        Qty = (decimal)d.CompleteQty
                    };
                    list.Add(item);
                }
@@ -225,21 +234,25 @@
                    OrderCode = notice.OrderCode,
                    SoDetails = list
                };
                // 通过接口发送至erp
                var jsonData = JsonConvert.SerializeObject(soInfo);
                #region 通过接口发送至erp
                //系统对接后放开
                /*var jsonData = JsonConvert.SerializeObject(soInfo);
                var response = HttpHelper.DoPost(url, jsonData, "出库单完成上传", "ERP");
                //解析返回数据
                var obj = JsonConvert.DeserializeObject<ErpModel>(response);
                var obj = JsonConvert.DeserializeObject<ErpModel>(response);//解析返回数据
                if (obj.Success != 0)
                {
                    throw new Exception("上传失败" + obj.Message);
                }
                }*/
                #endregion
                notice.Status = "6";
                notice.UpdateTime = DateTime.Now;
                notice.UpdateUser = userId;
                notice.CheckTime = DateTime.Now;
                notice.CheckUser = userId;
                Db.Updateable(notice).ExecuteCommand();
                new OperationSOServer().AddLogOperationSo("出库作业", "出库单据", notice.SONo, "复核", $"复核了单据号为{notice.SONo}的单据信息", userId);
                return true;
            }
            catch (Exception e)
@@ -278,7 +291,8 @@
                    .LeftJoin<SysLogisticsInfo>((a, b) => a.LogisticsId == b.Id)
                    .LeftJoin<SysUserInfor>((a, b, c) => a.CreateUser == c.Id)
                    .LeftJoin<SysUserInfor>((a, b, c, d) => a.CreateUser == d.Id)
                    .Select((a, b, c, d) => new ExportNoticeDto()
                    .LeftJoin<SysUserInfor>((a, b, c, d, e) => a.CheckUser == e.Id)
                    .Select((a, b, c, d, e) => new ExportNoticeDto()
                    {
                        Id = a.Id,
                        SONo = a.SONo,
@@ -295,12 +309,15 @@
                        IsWave = a.IsWave,
                        WaveNo = a.WaveNo,
                        IsDespatch = a.IsDespatch,
                        Demo=a.Demo,
                        Demo = a.Demo,
                        CreateUserName = c.RealName,
                        UpdateUserName = c.RealName,
                        CreateTime = a.CreateTime,
                        UpdateTime = a.UpdateTime
                        UpdateTime = a.UpdateTime,
                        CheckUserName = e.RealName,
                        CheckTime = a.CheckTime
                    })
                    .OrderByDescending(a => a.CreateTime)
                    .ToOffsetPage(page, limit, ref total);
@@ -314,53 +331,84 @@
            }
        }
        public List<ExStockInfoDto> GetStockGroupList(string type, string msg)
        public List<ExStockInfoDto> GetStockGroupList(string type, string ownerNo, string msg)
        {
            try
            {
                if (string.IsNullOrEmpty(type))
                {
                    throw new Exception("请选择出库单类型");
                }
                if (type == "6" && string.IsNullOrEmpty(ownerNo))
                {
                    throw new Exception("代储单据请选择货主");
                }
                var plnList = new List<string>() { "100099" };
                var skuList = new List<string>();
                var sku = Db.Queryable<SysMaterials>().Where(m => m.IsDel == "0" && !plnList.Contains(m.SkuNo)); //排除空托盘的物料集合
                var inspectStatus = "1";//库存内物料的质检状态
                var skuTypeC = new List<string>() { "0" };//标准
                var skuTypeY = new List<string>() { "1" };//非标
                if (type == "0" || type == "2") //标准
                string skuType = string.Empty;
                string inspectStatus = string.Empty;
                switch (type)//0:原料 1:包材 2:成品 3:耗材 4:半成品
                {
                    inspectStatus = "0";
                    //if (type == "0") //成品
                    //{
                    skuList = sku.Where(m => inspectStatus==m.IsControlled).Select(m => m.SkuNo).ToList();
                    //}
                    //if (type == "1") //原料
                    //{
                    //    skuList = sku.Where(m => skuTypeY.Contains(m.Type)).Select(m => m.SkuNo).ToList();
                    //}
                    case "0"://成品出库
                        skuType = "(2)";
                        inspectStatus = "1";
                        break;
                    case "1"://领料出库
                        skuType = "(0,1,3)";
                        inspectStatus = "1";
                        break;
                    case "2"://抽检出库
                        skuType = "(0,1,2,3)";
                        inspectStatus = "0,1,2";
                        break;
                    case "3"://物料取样出库
                        skuType = "(0,1,2,3)";
                        inspectStatus = "0";
                        break;
                    case "4"://不合格品出库
                        skuType = "(0,1,2,3)";
                        inspectStatus = "2";
                        break;
                    case "5"://中间品出库
                        skuType = "(4)";
                        inspectStatus = "0,1";
                        break;
                    case "6"://代储出库
                        skuType = "(0,1,2,3)";
                        inspectStatus = "0,1";
                        break;
                    case "8"://寄存出库
                        skuType = "(0,1,2,3)";
                        inspectStatus = "0,1";
                        break;
                    default: //其它出库
                        skuType = "(0,1,2,3,4)";
                        inspectStatus = "0,1";
                        break;
                }
                else if (type == "1" || type == "3") //非标
                skuList = sku.Where(m => skuType.Contains(m.Type)).Select(m => m.SkuNo).ToList();
                if (skuList == null)
                {
                    inspectStatus = "1";
                    //if (type == "2") //成品
                    //{
                    skuList = sku.Where(m => inspectStatus==m.IsControlled).Select(m => m.SkuNo).ToList();
                    //}
                    throw new Exception("未查到对应出库类型的物料");
                }
                    //if (type == "3") //原料
                    //{
                    //    skuList = sku.Where(m => skuTypeY.Contains(m.Type)).Select(m => m.SkuNo).ToList();
                    //}
                if (type!="8")
                {
                    skuList = skuList.Where(m => m != "100088").ToList();
                }
                else
                {
                    throw new Exception("单据状态有误");
                    skuList = skuList.Where(m => m == "100088").ToList();
                }
                //skuList = sku.Select(m => m.SkuNo).ToList();
                var stockRst = new StockServer();
                var stockDetailRst = new StockDetailServer();
                Expression<Func<DataStockDetail, bool>> item = Expressionable.Create<DataStockDetail>()
                    //.And(it => it.WareHouseNo == wareHouseNo)
                    .And(it => it.InspectStatus == "1")
                    .AndIF(!string.IsNullOrWhiteSpace(inspectStatus), it => inspectStatus.Contains(it.InspectStatus))
                    .And(m => skuList.Contains(m.SkuNo))
                    .AndIF(type == "6", m => m.OwnerNo == ownerNo)//代储出库需要关联货主
                    .AndIF(!string.IsNullOrWhiteSpace(msg), it => (it.SkuNo.Contains(msg) || it.SkuName.Contains(msg) || it.LotNo.Contains(msg)))
                    .And(it => (it.Qty - it.LockQty - it.FrozenQty) > 0)
                    .And(it => (it.Status == "0" || it.Status == "1"))
@@ -389,7 +437,7 @@
                    SkuName = it.SkuName,
                    LotNo = it.LotNo,
                    Standard = it.Standard,
                    Qty =  type == "4" ? it.Qty : it.Qty - it.LockQty - it.FrozenQty
                    Qty = type == "4" ? it.Qty : it.Qty - it.LockQty - it.FrozenQty
                }).ToList();
@@ -440,7 +488,7 @@
                var skuNos = model.Detail.Select(a => a.SkuNo).Distinct().ToList();
                //根据物料号获取物料信息、库存明细中获取批次描述供货批次等
                var skuList = Db.Queryable<SysMaterials>().Where(a => skuNos.Contains(a.SkuNo) && a.IsDel == "0").ToList();
                var stockList = Db.Queryable<DataStock>().Where(s => skuNos.Contains(s.SkuNo) && (s.Qty-s.FrozenQty-s.LockQty) > 0).ToList();
                var stockList = Db.Queryable<DataStock>().Where(s => skuNos.Contains(s.SkuNo) && (s.Qty - s.FrozenQty - s.LockQty) > 0).ToList();
                //var palletList = contextDb.Queryable<DataStockDetail>().Where(s => skuNos.Contains(s.SkuNo) && (s.Qty - s.FrozenQty - s.LockQty) > 0).ToList();
                //客户信息
                var customer = Db.Queryable<SysCustomer>().Where(m => m.IsDel == "0" && m.CustomerNo == model.CustomerNo).ToList();
@@ -512,12 +560,12 @@
                            CompleteQty = 0,
                            PackagNo = sku.PackagNo,
                            Price = sku.Price,
                            Money = string.IsNullOrWhiteSpace(sku.Price.ToString()) ? null : sku.Price*d.Qty,
                            Money = string.IsNullOrWhiteSpace(sku.Price.ToString()) ? null : sku.Price * d.Qty,
                            IsBale = d.IsBale,
                            IsBelt = d.IsBelt,
                            SupplierLot = stocks.First().SupplierLot,
                            IsWave = "0",
                            WaveNo= "",
                            WaveNo = "",
                            CreateUser = userId,
                        };
@@ -539,7 +587,7 @@
                        LogisticsId = model.LogisticsId,
                        IsWave = "0",
                        WaveNo = "",
                        IsDespatch="0",
                        IsDespatch = "0",
                        CreateUser = userId,
                    };
@@ -611,7 +659,7 @@
                    var stockCount = 0.00m; //st.StockQuantity.Value
                    if (s != null)
                    {
                        stockCount = s.Qty-s.FrozenQty-s.LockQty+d.Qty;
                        stockCount = s.Qty - s.FrozenQty - s.LockQty + d.Qty;
                    }
                    var dm = new SelectStockSkuDto()
@@ -786,7 +834,7 @@
                        }
                        else if (old.Qty != d.Qty || old.IsBale != d.IsBale || old.IsBelt != d.IsBelt)
                        {
                            if (d.Qty > (stock.Qty-stock.FrozenQty-stock.LockQty) + old.Qty)
                            if (d.Qty > (stock.Qty - stock.FrozenQty - stock.LockQty) + old.Qty)
                            {
                                throw new Exception("物品库存数量不足");
                            }
@@ -1102,8 +1150,8 @@
                    .AndIF(!string.IsNullOrWhiteSpace(skuName), m => m.SkuName.Contains(skuName.Trim()))
                    .AndIF(!string.IsNullOrWhiteSpace(palletNo), m => m.PalletNo.Contains(palletNo.Trim()))
                    .AndIF(!string.IsNullOrWhiteSpace(lotNo), m => m.LotNo.Contains(lotNo.Trim()))
                    .AndIF(!string.IsNullOrWhiteSpace(inspectMark), m => m.InspectMark==inspectMark)
                    .AndIF(!string.IsNullOrWhiteSpace(bitPalletMark), m => m.BitPalletMark== bitPalletMark)
                    .AndIF(!string.IsNullOrWhiteSpace(inspectMark), m => m.InspectMark == inspectMark)
                    .AndIF(!string.IsNullOrWhiteSpace(bitPalletMark), m => m.BitPalletMark == bitPalletMark)
                    .And(m => !string.IsNullOrWhiteSpace(m.WareHouseNo))
                    .And(a => a.Status == "0")
                    .And(a => a.WareHouseNo == "W01")
@@ -1135,7 +1183,7 @@
                var outDtoList = new List<OutCommandDto>(); //出库数据的集合 
                str = "";
                var stockDetailList = Db.Queryable<DataStockDetail>().Where(m => m.PalletNo == palletNo && m.IsDel == "0").ToList();
                if (stockDetailList.Count == 0)
                {
                    throw new Exception($"未在库内查询到该托盘信息");
@@ -1150,7 +1198,7 @@
                }
                //判断托盘库存信息分组后是否大于1条
                var detailGroup = stockDetailList.GroupBy(m => new { m.SkuNo, m.PalletNo, m.WareHouseNo, m.LocatNo }).ToList();
                if (detailGroup.Count>1)
                if (detailGroup.Count > 1)
                {
                    throw new Exception($"未在库内查询到该托盘信息");
                }
@@ -1233,7 +1281,7 @@
                        throw new Exception($"当前托盘所在的储位已损坏,不能出库,请核实");
                    }
                    if (locate.Status !="1")
                    if (locate.Status != "1")
                    {
                        throw new Exception($"当前托盘所在的储位状态不是有物品,不能出库,请核实");
                    }
@@ -1289,10 +1337,10 @@
                        Db.Updateable(de).ExecuteCommand();
                        Db.Updateable(stocka).ExecuteCommand();
                    }
                    locate.Status = "3"; //要出库的储位改变状态 正在出库
                    Db.Updateable(locate).ExecuteCommand();
                    #endregion
@@ -1360,13 +1408,15 @@
        #region 下发出库、出库完成、重新下发任务、取消任务、异常处理
        // 下发出库(调用cs接口给他库位地址)
        public List<OutCommandDto> IssueOutHouse(string soNo, string outMode, int userId, string url, out string str)
        public List<OutCommandDto> IssueOutHouse(string soNo, string unstackingMode, string outMode, string loadingAddre, int userId, string url, out string str)
        {
            try
            {
                #region 集合 
                var outDtoList = new List<OutCommandDto>(); //出库数据的集合
                var outDto1 = new List<OutCommandDto>(); //先出库数据的集合(深度为1的储位)
                var outDto2 = new List<OutCommandDto>(); //后出库数据的集合(深度为2的储位)
                var moveDto = new List<OutCommandDto>(); //要移库数据的集合
                //记录错误信息的集合 
                var flagList = new List<int>();//1:当前要出库的储位正在移出、2 出库的托盘储位信息错误(在储位表中未查询到)、3储位损坏不能出库、4 要出库的托盘正在入库
@@ -1390,6 +1440,10 @@
                var outLpnList = list.Select(m => m.PalletNo).ToList();
                //要出库的明细集合
                var outStockDetail = Db.Queryable<DataStockDetail>().Where(m => m.IsDel == "0" && outLpnList.Contains(m.PalletNo)).ToList();
                //物料编码表
                var skuList = Db.Queryable<SysMaterials>().Where(w => w.IsDel == "0");
                //包装表
                var packagList = Db.Queryable<SysPackag>().Where(w => w.IsDel == "0");
                Db.BeginTran();
                try
                {
@@ -1397,6 +1451,57 @@
                    //循环分配的信息生成出库任务
                    foreach (var item in list)
                    {
                        var taskNoStr = "";
                        string toLocation = string.Empty;//目标位置
                        string unstackingMode2 = unstackingMode;//拆垛方式,0:机器人拆垛 1:PDA拆垛
                        #region 判断是否需要拆箱
                        if (notice.Type == "0")//成品出库
                        {
                            string isChai = "0";//是否需要拆箱,0:否 1:是
                            var skuInfo = skuList.First(w => w.SkuNo == item.SkuNo);
                            if (skuInfo == null)
                            {
                                throw new Exception("物料信息不存在!");
                            }
                            var packagInfo = packagList.First(w => w.PackagNo == skuInfo.PackagNo);
                            if (packagInfo == null)
                            {
                                throw new Exception("包装信息不存在!");
                            }
                            if (packagInfo.L2Name == "箱")
                            {
                                if (item.Qty % (decimal)packagInfo.L2Num != 0)//能整除说明不用拆箱,不能整除说明需要拆箱
                                {
                                    isChai = "1";
                                    unstackingMode2 = "1";//需要拆箱需走PDA拆垛
                                }
                            }
                            if (isChai == "0")
                            {
                                var boxInfo = Db.Queryable<DataBoxInfo>().Where(w => w.IsDel == "0" && w.PalletNo == item.PalletNo && w.BitBoxMark == "1").ToList();
                                if (boxInfo != null)//托盘上有零箱需要拆箱
                                {
                                    isChai = "1";
                                    unstackingMode2 = "1";//需要拆箱需走PDA拆垛
                                }
                            }
                            if (unstackingMode2 == "0")//机器人拆垛
                            {
                                toLocation = loadingAddre;//装车口
                            }
                            else //PDA拆垛
                            {
                                toLocation = outMode;//出库口
                            }
                        }
                        else
                        {
                            unstackingMode2 = "1";//非成品出库走PDA拆垛
                            toLocation = outMode;//出库口
                        }
                        #endregion
                        // 储位号
                        var locateNo = outStockDetail.First(m => m.PalletNo == item.PalletNo).LocatNo;
@@ -1486,40 +1591,211 @@
                        if (locate.Status == "1") //有物品
                        {
                            #region 添加出库任务
                            var taskNo = new Common().GetMaxNo("TK");
                            var exTask = new LogTask    //出库任务
                            if (locate.Depth == "01") //深度为1
                            {
                                TaskNo = taskNo,
                                Sender = "WMS",
                                Receiver = "WCS",
                                IsSuccess = 0, //是否下发成功 0失败 1成功
                                var taskNo = new Common().GetMaxNo("TK");
                                var exTask = new LogTask    //出库任务
                                {
                                    TaskNo = taskNo,
                                    Sender = "WMS",
                                    Receiver = "WCS",
                                    IsSuccess = 0, //是否下发成功 0失败 1成功
                                StartLocat = locate.LocatNo,//起始位置
                                EndLocat = outMode,//目标位置
                                PalletNo = item.PalletNo,//托盘码
                                IsSend = 1,//是否可再次下发
                                IsCancel = 1,//是否可取消
                                IsFinish = 1,//是否可完成
                                Type = "1",//任务类型 0 入库任务 1 出库任务  2 移库任务
                                Status = "0",//任务状态0:等待执行1正在执行2执行完成
                                OrderType = "1",//0 入库单 1 出库单  2 盘点单  3 移库单
                                Msg = "从" + locate.LocatNo + "到" + outMode + "的出库任务", //关键信息
                            };
                            Db.Insertable(exTask).ExecuteCommand();
                            logTaskList.Add(exTask);
                                    StartLocat = locate.LocatNo,//起始位置
                                    EndLocat = toLocation,//outMode,//目标位置
                                    PalletNo = item.PalletNo,//托盘码
                                    IsSend = 1,//是否可再次下发
                                    IsCancel = 1,//是否可取消
                                    IsFinish = 1,//是否可完成
                                    Type = "1",//任务类型 0 入库任务 1 出库任务  2 移库任务
                                    Status = "0",//任务状态0:等待执行1正在执行2执行完成
                                    OrderType = "1",//0 入库单 1 出库单  2 盘点单  3 移库单
                                    Msg = "从" + locate.LocatNo + "到" + toLocation + "的出库任务", //关键信息
                                };
                                Db.Insertable(exTask).ExecuteCommand();
                                logTaskList.Add(exTask);
                            outDtoList.Add(new OutCommandDto()
                                outDto1.Add(new OutCommandDto()
                                {
                                    PalletNo = item.PalletNo,//托盘号
                                    StartLocate = locate.LocatNo, // 起始位置
                                    StartRoadway = locate.RoadwayNo,//其实巷道
                                    EndLocate = toLocation,//outMode, // 目标位置
                                    TaskNo = exTask.TaskNo, // 任务号
                                    TaskType = "1",// 任务类型 (出库)
                                    OutMode = "",  //目标地址
                                    Order = 1
                                });
                            }
                            else if (locate.Depth == "02") //深度为2
                            {
                                PalletNo = item.PalletNo,//托盘号
                                StartLocate = locate.LocatNo, // 起始位置
                                StartRoadway = locate.RoadwayNo,//其实巷道
                                EndLocate = outMode, // 目标位置
                                TaskNo = exTask.TaskNo, // 任务号
                                TaskType = "1",// 任务类型 (出库)
                                OutMode = "",  //目标地址
                                Order = 1
                            });
                                //获取出库深度为2储位前面的储位信息
                                var slotBefore = com.GetLocateNoDepth1(locate.WareHouseNo, locate.LocatNo);
                                if (slotBefore.Status == "1") //前面的储位有货物、进行移库操作
                                {
                                    //要出库深度为2的储位前面的储位中货物是否要出库
                                    var isout = outStockDetail.Count(m => m.LocatNo == slotBefore.LocatNo);
                                    if (isout <= 0) //进行移库
                                    {
                                        //去库存表中找到储位对应的托盘码操作
                                        var stockNew = Db.Queryable<DataStockDetail>().First(m => m.LocatNo == slotBefore.LocatNo);
                                        if (stockNew == null)
                                        {
                                            var slotChange = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == slotBefore.LocatNo);
                                            slotChange.Status = "0";
                                            Db.Updateable(slotChange).ExecuteCommand();
                                        }
                                        else
                                        {
                                            //获取移库的库位
                                            var newSlot = MoveAddress(slotBefore.LocatNo, slotBefore.RoadwayNo, item.SkuNo);
                                            //当前移库库位的储位信息
                                            var locatey = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == newSlot && m.IsDel == "0");
                                            if (!string.IsNullOrEmpty(newSlot))
                                            {
                                                #region 添加出库时发生的移库任务
                                                var exYkTaskNo = new Common().GetMaxNo("TK");
                                                var exYkTask = new LogTask    //出库时产生移库任务
                                                {
                                                    TaskNo = exYkTaskNo,
                                                    Sender = "WMS",
                                                    Receiver = "WCS",
                                                    IsSuccess = 0, //是否下发成功 0失败 1成功
                                                    StartLocat = stockNew.LocatNo,//起始位置
                                                    EndLocat = newSlot,//目标位置
                                                    PalletNo = stockNew.PalletNo,//托盘码
                                                    IsSend = 1,//是否可再次下发
                                                    IsCancel = 1,//是否可取消
                                                    IsFinish = 1,//是否可完成
                                                    Type = "2",//任务类型 0 入库任务 1 出库任务  2 移库任务
                                                    Status = "0",//任务状态0:等待执行1正在执行2执行完成
                                                    OrderType = "1",//0 入库单 1 出库单  2 盘点单  3 移库单
                                                    Msg = stockNew.LocatNo + " ==>> " + newSlot + "的移库任务",
                                                };
                                                Db.Insertable(exYkTask).ExecuteCommand();
                                                moveDto.Add(new OutCommandDto()
                                                {
                                                    StartRoadway = slotBefore.RoadwayNo, //起始巷道
                                                    PalletNo = stockNew.PalletNo,//托盘号
                                                    StartLocate = stockNew.LocatNo, // 起始位置
                                                    EndLocate = newSlot, // 目标位置
                                                    EndRoadway = locatey.RoadwayNo, // 目标巷道
                                                    TaskNo = exYkTask.TaskNo, // 任务号
                                                    TaskType = "2",// 任务类型 (移库)
                                                    OutMode = "",  //目标地址
                                                    Order = 1,
                                                });
                                                #endregion
                                                #region 改变储位装填
                                                var slotChange = Db.Queryable<SysStorageLocat>().First(m => m.Id == slotBefore.Id);
                                                var slotChange2 = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == newSlot);
                                                slotChange.Status = "5"; //改变状态(正在移出)
                                                slotChange2.Status = "4"; // 改变状态(正在移入)
                                                Db.Updateable(slotChange).ExecuteCommand();
                                                Db.Updateable(slotChange2).ExecuteCommand();
                                                #endregion
                                            }
                                            else
                                            {
                                                #region 添加出库任务
                                                var exYkTaskNo1 = new Common().GetMaxNo("TK");
                                                var exYkTask1 = new LogTask    //出库移库没有库位了进行出库任务
                                                {
                                                    TaskNo = exYkTaskNo1,
                                                    Sender = "WMS",
                                                    Receiver = "WCS",
                                                    IsSuccess = 0, //是否下发成功 0失败 1成功
                                                    StartLocat = stockNew.LocatNo,//起始位置
                                                    EndLocat = "",//目标位置
                                                    PalletNo = stockNew.PalletNo,//托盘码
                                                    IsSend = 1,//是否可再次下发
                                                    IsCancel = 1,//是否可取消
                                                    IsFinish = 1,//是否可完成
                                                    Type = "1",//任务类型 0 入库任务 1 出库任务  2 移库任务
                                                    Status = "0",//任务状态0:等待执行1正在执行2执行完成
                                                    OrderType = "1",//0 入库单 1 出库单  2 盘点单  3 移库单
                                                    Msg = locate.LocatNo + "的出库任务"
                                                };
                                                Db.Insertable(exYkTask1).ExecuteCommand();
                                                outDto1.Add(new OutCommandDto()
                                                {
                                                    StartRoadway = slotBefore.RoadwayNo, //起始巷道
                                                    PalletNo = stockNew.PalletNo,//托盘号
                                                    StartLocate = stockNew.LocatNo, // 起始位置
                                                    EndLocate = "", // 目标位置
                                                    EndRoadway = "", // 目标巷道
                                                    TaskNo = exYkTask1.TaskNo, // 任务号
                                                    TaskType = "1",// 任务类型 (出库)
                                                    OutMode = "",  //目标地址
                                                    Order = 1,
                                                });
                                                #endregion
                                                #region MyRegion
                                                var slotChange = Db.Queryable<SysStorageLocat>().First(m => m.Id == slotBefore.Id);
                                                slotChange.Status = "3"; //改变状态(正在出库)
                                                Db.Updateable(slotChange).ExecuteCommand();
                                                #endregion
                                            }
                                        }
                                    }
                                }
                                else if (slotBefore.Status == "2" || slotBefore.Status == "4") //前面储位状态是入库中或者移入中
                                {
                                    flagList.Add(5);
                                    continue;
                                }
                                #region 添加出库任务
                                var taskNo1 = new Common().GetMaxNo("TK");
                                var exTask1 = new LogTask    //出库任务
                                {
                                    TaskNo = taskNo1,
                                    Sender = "WMS",
                                    Receiver = "WCS",
                                    IsSuccess = 0, //是否下发成功 0失败 1成功
                                    StartLocat = locate.LocatNo,//起始位置
                                    EndLocat = "",//目标位置
                                    PalletNo = item.PalletNo,//托盘码
                                    IsSend = 1,//是否可再次下发
                                    IsCancel = 1,//是否可取消
                                    IsFinish = 1,//是否可完成
                                    Type = "1",//任务类型 0 入库任务 1 出库任务  2 移库任务
                                    Status = "0",//任务状态0:等待执行1正在执行2执行完成
                                    OrderType = "1",//0 入库单 1 出库单  2 盘点单  3 移库单
                                    Msg = locate.LocatNo + "的出库任务"
                                };
                                Db.Insertable(exTask1).ExecuteCommand();
                                outDto2.Add(new OutCommandDto()
                                {
                                    StartRoadway = locate.RoadwayNo, //起始巷道
                                    PalletNo = item.PalletNo,//托盘号
                                    StartLocate = locate.LocatNo, // 起始位置
                                    EndLocate = "", // 目标位置
                                    EndRoadway = locate.RoadwayNo, //目标巷道
                                    TaskNo = exTask1.TaskNo, // 任务号
                                    TaskType = "1",// 任务类型 (出库)
                                    OutMode = "",  //目标地址
                                    Order = 1,
                                });
                                taskNoStr = exTask1.TaskNo;
                                #endregion
                            }
                            #endregion
                            #region 改变数据
@@ -1546,11 +1822,12 @@
                            locate.Status = "3"; //要出库的储位改变状态 正在出库
                            Db.Updateable(locate).ExecuteCommand();
                            item.TaskNo = exTask.TaskNo; // 出库分配信息中更新任务号
                            item.TaskNo = taskNoStr; // 出库分配信息中更新任务号
                            item.Status = "1"; // 出库分配信息状态改为正在执行 
                            item.OutMode = outMode;//出库口
                            item.UnstackingMode = unstackingMode2;//拆垛方式
                            item.OutMode = unstackingMode2 == "1" ? outMode : "";//出库口
                            item.LoadingAddre = unstackingMode2 == "0" ? loadingAddre : "";//装车口
                            Db.Updateable(item).ExecuteCommand();
                            #endregion
@@ -1580,7 +1857,7 @@
                                    }
                                }
                            }
                            var taskNo = Db.Queryable<LogTask>().First(m => m.OrderType =="1"&& m.TaskNo != item.TaskNo && m.Status == "1" && m.PalletNo==item.PalletNo);
                            var taskNo = Db.Queryable<LogTask>().First(m => m.OrderType == "1" && m.TaskNo != item.TaskNo && m.Status == "1" && m.PalletNo == item.PalletNo);
                            if (taskNo == null)
                            {
                                taskNo = logTaskList.First(m => m.PalletNo == item.PalletNo);//当前有同托盘不同物料出库
@@ -1591,7 +1868,8 @@
                            }
                            item.TaskNo = taskNo.TaskNo;
                            item.Status = "1"; // 出库分配信息状态改为正在执行 
                            item.OutMode = taskNo.EndLocat;
                            item.OutMode = unstackingMode2 == "1" ? taskNo.EndLocat : "";//出库口
                            item.LoadingAddre = unstackingMode2 == "0" ? taskNo.EndLocat : "";//装车口
                            Db.Updateable(item).ExecuteCommand();
                            flagList.Add(0);
                            #endregion
@@ -1627,32 +1905,32 @@
                    {
                        str += "3.要出库的托盘正在入库、";
                    }
                    if (outDtoList.Count > 0)
                    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
                        {
                            var time1 = DateTime.Now;//发送时间 .ToString("yyyy-MM-dd HH:mm:ss")
                            response = HttpHelper.DoPost(url, jsonData, "下发给WCS出库命令", "WCS");
                            var time2 = DateTime.Now;//返回时间 .ToString("yyyy-MM-dd HH:mm:ss")
                            //var time1 = DateTime.Now;//发送时间 .ToString("yyyy-MM-dd HH:mm:ss")
                            //response = HttpHelper.DoPost(url, jsonData, "下发给WCS出库命令", "WCS");
                            //var time2 = DateTime.Now;//返回时间 .ToString("yyyy-MM-dd HH:mm:ss")
                            ////解析返回数据
                            var wcsModel = JsonConvert.DeserializeObject<WcsModel>(response);
                            if (wcsModel.StatusCode == 0)
                            {
                                //更改任务的发送返回时间//
                                new TaskServer().EditTaskIssueOk(list2, time1, time2);
                                str += "下发成功";
                            }
                            if (wcsModel.StatusCode == -1)
                            {
                                new TaskServer().EditTaskIssueNo(list2, time1, time2, wcsModel.Msg);
                                throw new Exception(wcsModel.Msg);
                            }
                            //////解析返回数据
                            //var wcsModel = JsonConvert.DeserializeObject<WcsModel>(response);
                            //if (wcsModel.StatusCode == 0)
                            //{
                            //    //更改任务的发送返回时间//
                            //    new TaskServer().EditTaskIssueOk(list2, time1, time2);
                            //    str += "下发成功";
                            //}
                            //if (wcsModel.StatusCode == -1)
                            //{
                            //    new TaskServer().EditTaskIssueNo(list2, time1, time2, wcsModel.Msg);
                            //    throw new Exception(wcsModel.Msg);
                            //}
                        }
                        catch (Exception ex)
                        {
@@ -1661,7 +1939,7 @@
                    }
                    return outDtoList;
                    return outDto1;
                }
                catch (Exception e)
                {
@@ -1714,7 +1992,7 @@
                    }
                    foreach (var item in stockDetail)
                    {
                        if (item.SkuNo== "100099")//判断是否是空托出库
                        if (item.SkuNo == "100099")//判断是否是空托出库
                        {
                            //判断总库存是否为0,如果为0删除 否则减去数量
                            var stock = Db.Queryable<DataStock>().First(m => m.SkuNo == "100099");
@@ -1838,6 +2116,86 @@
            }
        }
        /// <summary>
        /// wcs返回的成功信号(移库成功)
        /// </summary>
        /// <param name="taskNo">任务号</param>
        /// <param name="userId">操作人</param>
        /// <exception cref="Exception"></exception>
        public void RelocationSuccess(string taskNo, int userId)
        {
            try
            {
                //当前任务信息
                var task = Db.Queryable<LogTask>().First(m => m.TaskNo == taskNo && m.IsDel == "0");
                if (task == null)
                {
                    throw new Exception($"未查询到任务号为:‘{taskNo}’的任务信息");
                }
                if (task.Status == "2")
                {
                    throw new Exception("当前任务已完成");
                }
                Db.BeginTran();
                //库存中当前托盘的信息
                var stockDetail = Db.Queryable<DataStockDetail>().Where(m => m.PalletNo == task.PalletNo).ToList();
                //当前任务中的目标储位信息
                //当前任务中的原储位
                var locate = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == task.StartLocat);
                if (locate == null)
                {
                    throw new Exception($"WMS系统中没有该{task.StartLocat}储位对应的信息");
                }
                var locate2 = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == task.EndLocat);
                if (locate2 == null)
                {
                    throw new Exception($"WMS系统中没有该{task.EndLocat}储位对应的信息");
                }
                try
                {
                    task.Status = "2";//任务状态
                    task.IsSend = 0;
                    task.IsCancel = 0;
                    task.IsFinish = 0;
                    task.FinishDate = DateTime.Now;//完成时间
                    Db.Updateable(task).ExecuteCommand();
                    #region 修改储位状态
                    //原储位改为空储位 0
                    locate.Status = "0";
                    Db.Updateable(locate).ExecuteCommand();
                    //目标储位改为有货物 1
                    locate2.Status = "1";
                    Db.Updateable(locate2).ExecuteCommand();
                    foreach (var item in stockDetail)
                    {
                        item.WareHouseNo = locate2.WareHouseNo;
                        item.AreaNo = locate2.AreaNo;
                        item.RoadwayNo = locate2.RoadwayNo;
                        item.LocatNo = locate2.LocatNo;
                    }
                    Db.Updateable(stockDetail).ExecuteCommand();
                    #endregion
                    Db.CommitTran();
                }
                catch (Exception ex)
                {
                    Db.RollbackTran();
                    throw new Exception(ex.Message);
                }
            }
            catch (Exception ex)
            {
                throw new Exception("完成反馈失败:" + ex.Message);
            }
        }
        //重新下发出库任务
        public OutCommandDto AgainSendSoTask(string taskNo, int userId, string url)
        {
@@ -1959,7 +2317,16 @@
                        //获取储位信息
                        var locat = Db.Queryable<SysStorageLocat>().First(a => a.IsDel == "0" && a.WareHouseNo == "W01" && a.LocatNo == task.StartLocat);
                        //获取移库任务对应目标储位信息
                        SysStorageLocat endlocat = new SysStorageLocat();
                        if (task.Type == "2")
                        {
                            endlocat = Db.Queryable<SysStorageLocat>().First(a => a.IsDel == "0" && a.WareHouseNo == "W03" && a.LocatNo == task.EndLocat);
                            if (endlocat == null)
                            {
                                throw new Exception("未查询到目标储位信息");
                            }
                        }
                        if (locat == null)
                        {
                            Db.RollbackTran();
@@ -1967,11 +2334,16 @@
                        }
                        locat.Status = "1"; //有物品
                        Db.Updateable(locat).ExecuteCommand();
                        if (endlocat != null)
                        {
                            endlocat.Status = "0"; //空储位 0
                            Db.Updateable(endlocat).ExecuteCommand();
                        }
                        if (noticeDetail.FactQty == 0)
                        {
                            var noticeDetail2 = Db.Queryable<BllExportNoticeDetail>().Where(m => m.IsDel == "0" && m.SONo == item.SONo && m.Id != noticeDetail.Id).ToList();
                            var num = noticeDetail2.Count(m => m.FactQty>0);
                            var num = noticeDetail2.Count(m => m.FactQty > 0);
                            //判断出库单的所有明细是否都为0;如果为0变更出库单状态为已分配
                            if (num == 0)
                            {
@@ -1997,7 +2369,7 @@
                            //修改库存明细
                            stockDetail.LockQty -= stockDetail.Qty; //锁定数量
                            stockDetail.Status = "0"; //库存状态 0:待分配
                            //修改库存总表
                            datastock.LockQty -= (int)stockDetail.Qty; //锁定数量
@@ -2015,13 +2387,13 @@
                            Db.Updateable(locate).ExecuteCommand();
                        }
                    }
                    else
                    {
                        Db.Updateable(allot).ExecuteCommand();
                    }
                    //添加操作日志记录
                    var k = new OperationSOServer().AddLogOperationSo("出库作业", "出库日志", taskNo, "取消", $"点击取消按钮、取消了任务号为:{taskNo}的任务", (int)userId);
                    Db.CommitTran();
@@ -2048,7 +2420,7 @@
            try
            {
                // 判断当前任务状态  Status 1:正在执行 3:异常结束
                var taskModel = Db.Queryable<LogTask>().First(m => m.TaskNo == model.TaskNo && m.IsDel == "0" &&  m.Status == "1");
                var taskModel = Db.Queryable<LogTask>().First(m => m.TaskNo == model.TaskNo && m.IsDel == "0" && m.Status == "1");
                if (taskModel == null)
                {
                    throw new Exception("此任务不存在或任务状态已变更!");
@@ -2155,7 +2527,7 @@
                }
                if (notice.Status != "0" && notice.Status != "1")
                {
                    throw new Exception("参数异常,请检查状态是否为等待执行或部分分配或来源是否是WMS");
                    throw new Exception("参数异常,请检查状态是否为等待执行或部分分配;");
                }
                //出库单明细
                var detailList = Db.Queryable<BllExportNoticeDetail>().Where(m => m.IsDel == "0" && m.SONo == soNo && (m.AllotQty - m.Qty) <= 0).ToList();
@@ -2190,32 +2562,50 @@
                        //判断单号是否指定批次
                        if (!string.IsNullOrWhiteSpace(detail.LotNo))
                        {
                            stockDetail = stockDetail.Where(m => m.SkuNo == detail.SkuNo && m.LotNo == detail.LotNo && m.IsDel == "0").ToList();
                            if (detail.LotNo.Contains(";"))
                            {
                                var lotNoList = detail.LotNo.Split(";");
                                var lotNoList2 = new List<string>();
                                foreach (var lotNoItem in lotNoList)
                                {
                                    lotNoList2.Add(lotNoItem);
                                }
                                stockDetail = stockDetail.Where(m => m.SkuNo == detail.SkuNo && lotNoList2.Contains(m.LotNo) && m.IsDel == "0").ToList();
                            }
                            else
                            {
                                stockDetail = stockDetail.Where(m => m.SkuNo == detail.SkuNo && m.LotNo == detail.LotNo && m.IsDel == "0").ToList();
                            }
                        }
                        else
                        {
                            stockDetail = stockDetail.Where(m => m.SkuNo == detail.SkuNo && string.IsNullOrWhiteSpace(m.LotNo) && m.IsDel == "0").ToList();
                            stockDetail = stockDetail.Where(m => m.SkuNo == detail.SkuNo && m.IsDel == "0").ToList(); //&& string.IsNullOrWhiteSpace(m.LotNo)
                        }
                        if (stockDetail.Count < 1)
                        {
                            throw new Exception("库存不足,无可出库库存");
                        }
                        //0:成品出库、1:领料出库、2:抽检出库、3:物料取样出库、4:不合格品出库、5:中间品出库、6:代储出库、7:其他出库、8:寄存出库
                        if (notice.Type == "0" || notice.Type == "1" )//成品、原辅料出库
                        {
                            stockDetail = stockDetail.Where(m => m.InspectStatus == "1").ToList();
                        }
                        else if (notice.Type == "3" )//取样出库
                        {
                            stockDetail = stockDetail.Where(m => m.InspectStatus == "0").ToList();
                        }
                        else if (notice.Type == "5" || notice.Type == "6" || notice.Type == "7" || notice.Type == "8")
                        {
                            stockDetail = stockDetail.Where(m => m.InspectStatus == "0" || m.InspectStatus == "1").ToList();
                        }
                        else if (notice.Type == "4")//不合格出库
                        {
                            stockDetail = stockDetail.Where(m => m.InspectStatus == "2").ToList();
                        }
                        //if (notice.Type == "0" || notice.Type == "1")//成品、原辅料出库
                        //{
                        stockDetail = stockDetail.Where(m => m.InspectStatus == "1").ToList();
                        //}
                        //else if (notice.Type == "2" || notice.Type == "3")//成品、原辅料出库(不合格)
                        //{
                        //    stockDetail = stockDetail.Where(m => m.InspectStatus == "2").ToList();
                        //}
                        //else if (notice.Type == "4")//取样出库
                        //{
                        //    stockDetail = stockDetail.Where(m => m.InspectStatus == "0").ToList();
                        //}
                        //将库存明细按深度进行排序 深度1在前 深度2在后
                        //stockDetail = stockDetail.OrderBy(d => int.Parse(d.LocatNo.Substring(6, 2))).ToList();
                        #region 包装信息
                        var pack = packList.FirstOrDefault(p => p.PackagNo == detail.PackagNo);
@@ -2256,11 +2646,11 @@
                        }
                        #endregion
                        //取合适库存商品
                        Dictionary<int, int> stockQtyDic = new Dictionary<int, int>();//托出库物品数
                        Dictionary<int, decimal> stockQtyDic = new Dictionary<int, decimal>();//托出库物品数
                        Dictionary<string, int> zxQtyDic = new Dictionary<string, int>();//托出整箱数
                        //分配货物
                        //assign.AllocatePallets(stocks, pNum, bNum, needQty, stockQtyDic, zxQtyDic);
                        int qty = assign.AllotPallets(stockDetail, int.Parse(needQty.ToString()), pNum, bNum, stockQtyDic);
                        var qty = assign.AllotPallets(stockDetail, decimal.Parse(needQty.ToString()), pNum, bNum, stockQtyDic);
                        foreach (var sc in stockQtyDic)
                        {
@@ -2307,6 +2697,22 @@
                            }
                            var sd = Db.Updateable(s).UpdateColumns(it => new { it.LockQty, it.Status }).ExecuteCommand();
                            if (notice.Type == "1" || notice.Type == "5" || notice.Type == "6" || notice.Type == "7" || notice.Type == "8")//1:领料出库、
                            {
                                if (string.IsNullOrWhiteSpace(detail.LotNo))
                                {
                                    detail.LotNo = s.LotNo;
                                }
                                else
                                {
                                    if (!detail.LotNo.Contains(s.LotNo))
                                    {
                                        detail.LotNo += ";" + s.LotNo;
                                    }
                                }
                            }
                        }
                        detail.AllotQty += qty;
                        detail.UpdateUser = userId;
@@ -2445,6 +2851,15 @@
                        d.Status = "0";
                        d.UpdateUser = userId;
                        d.UpdateTime = DateTime.Now;
                        if (notice.Type == "1" || notice.Type == "5" || notice.Type == "6" || notice.Type == "7" || notice.Type == "8")//1:领料出库、
                        {
                            if (d.IsIssueLotNo != "1")
                            {
                                d.LotNo = "";
                            }
                        }
                    }
                    notice.Status = "0";
                    notice.UpdateUser = userId;
@@ -2526,7 +2941,7 @@
                {
                    throw new Exception("获取失败,未找到指定出库单!");
                }
                if (notice.Status == "3"  && detail.AllotQty >= detail.Qty || notice.Status == "4" || notice.Status == "5")
                if (notice.Status == "3" && detail.AllotQty >= detail.Qty || notice.Status == "4" || notice.Status == "5")
                {
                    throw new Exception("获取失败,出库单状态不允许!");
                }
@@ -2541,7 +2956,7 @@
                        m => m.SkuNo.Contains(msg.Trim())
                             || m.SkuName.Contains(msg.Trim())
                             || m.LocatNo.Contains(msg.Trim()))
                    .And(m => m.IsDel == "0" && m.SkuNo == detail.SkuNo && m.LotNo == detail.LotNo &&(m.Status == "0" || m.Status == "1"))
                    .And(m => m.IsDel == "0" && m.SkuNo == detail.SkuNo && m.LotNo == detail.LotNo && (m.Status == "0" || m.Status == "1"))
                    .ToExpression();//注意 这一句 不能少
                var list = Db.Queryable<DataStockDetail>().Where(item).Select(a => new StockDetailDto
@@ -2557,6 +2972,7 @@
                    LocatNo = a.LocatNo,
                    RoadwayNo = a.RoadwayNo,
                    PalletNo = a.PalletNo,
                    Demo = a.Demo,
                }).ToList();
                return list;
@@ -2583,7 +2999,7 @@
                {
                    throw new Exception("操作失败,出库单已分配完成!");
                }
                var notice = Db.Queryable<BllExportNotice>().First(a => a.IsDel =="0" && a.SONo == detail.SONo);
                var notice = Db.Queryable<BllExportNotice>().First(a => a.IsDel == "0" && a.SONo == detail.SONo);
                if (notice == null)
                {
                    throw new Exception("操作失败,未找到指定出库单!");
@@ -2606,6 +3022,8 @@
                //库存明细
                var stockList = Db.Queryable<DataStockDetail>().Where(a => stockIds.Contains(a.Id)).ToList();
                //分配信息
                var allots = Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && m.SODetailNo == detail.Id && m.Status == "0").ToList();
                //库存总表
                //var stockz = Db.Queryable<DataStock>().First(d => d.IsDel == "0" && d.SkuNo == detail.SkuNo && d.LotNo == detail.LotNo);
@@ -2619,37 +3037,48 @@
                    {
                        throw new Exception("操作失败,部分储位库存异常!");
                    }
                    if (st.Qty > (stock.Qty-stock.LockQty-stock.FrozenQty -stock.InspectQty))
                    if (st.Qty > (stock.Qty - stock.LockQty - stock.FrozenQty))     // 输入的数量 -  托盘上可用的数量(托盘上数量-锁定的数量-冻结的数量)
                    {
                        throw new Exception("操作失败,出库数量超出库存数量!");
                    }
                    //添加分配表信息
                    var allot = new BllExportAllot
                    {
                        SONo = notice.SONo,
                        WaveNo = "",
                        SODetailNo = detail.Id,
                        StockId = st.StockId,
                        LotNo = stock.LotNo,
                        LotText = stock.LotText,
                        SupplierLot = stock.SupplierLot,
                        SkuNo = stock.SkuNo,
                        SkuName = stock.SkuName,
                        Standard = stock.Standard,
                        PalletNo = stock.PalletNo,
                        IsBale = stock.IsBale,
                        IsBelt = stock.IsBelt,
                        Qty = st.Qty,
                        CompleteQty = 0,
                        Status = "0",
                        LogisticsId = notice.LogisticsId,
                        IsAdvance = "0",
                        OutMode = "",//出库口
                        CreateUser = userId,
                        CreateTime = DateTime.Now
                    };
                    allotList.Add(allot);
                    var bl = allots.FirstOrDefault(m => m.StockId == st.StockId);
                    if (bl == null)
                    {
                        //添加分配表信息
                        var allot = new BllExportAllot
                        {
                            SONo = notice.SONo,
                            WaveNo = "",
                            SODetailNo = detail.Id,
                            StockId = st.StockId,
                            LotNo = stock.LotNo,
                            LotText = stock.LotText,
                            SupplierLot = stock.SupplierLot,
                            SkuNo = stock.SkuNo,
                            SkuName = stock.SkuName,
                            Standard = stock.Standard,
                            PalletNo = stock.PalletNo,
                            IsBale = stock.IsBale,
                            IsBelt = stock.IsBelt,
                            Qty = st.Qty,
                            CompleteQty = 0,
                            Status = "0",
                            LogisticsId = notice.LogisticsId,
                            IsAdvance = "0",
                            OutMode = "",//出库口
                            CreateUser = userId,
                            CreateTime = DateTime.Now
                        };
                        allotList.Add(allot);
                    }
                    else
                    {
                        bl.Qty += st.Qty;
                        Db.Updateable(bl).ExecuteCommand();
                    }
                    //库存明细
                    stock.LockQty += st.Qty;
                    stock.Status = stock.LockQty == stock.Qty ? "2" : "1";
@@ -2678,8 +3107,8 @@
                //修改出库单状态 
                if (notice.Status == "0" || notice.Status == "1")
                {
                    int totalQty = 0;
                    int totalAllotQty = 0;
                    decimal totalQty = 0;
                    decimal totalAllotQty = 0;
                    foreach (var item in detailList)
                    {
                        totalQty += item.Qty;
@@ -2690,7 +3119,7 @@
                    {
                        notice.Status = "2";//证明分配数量大于等于出库数量  修改为已分配
                    }
                    else if (totalAllotQty< totalQty  && totalAllotQty>0)
                    else if (totalAllotQty < totalQty && totalAllotQty > 0)
                    {
                        notice.Status = "1";//证明分配数量小于等于出库数量  修改为部分分配
                    }
@@ -2711,5 +3140,133 @@
        #endregion
        /// <summary>
        /// 判断出库是否需要拆箱
        /// </summary>
        /// <param name="soNo"></param>
        /// <returns></returns>
        public string IsNeedUnpack(string soNo)
        {
            string result = "0";//是否需要拆箱,0:否  1:是
            if (string.IsNullOrEmpty(soNo))
            {
                throw new Exception("未找到对应出库单!");
            }
            try
            {
                var notice = Db.Queryable<BllExportNotice>().First(w => w.IsDel == "0" && w.SONo == soNo);
                if (notice == null)
                {
                    throw new Exception("未找到对应出库单!");
                }
                //物料编码表
                var skuList = Db.Queryable<SysMaterials>().Where(w => w.IsDel == "0");
                //包装表
                var packagList = Db.Queryable<SysPackag>().Where(w => w.IsDel == "0");
                //出库分配信息
                var allotList = Db.Queryable<BllExportAllot>().Where(w => w.IsDel == "0" && w.SONo == soNo).ToList();
                foreach (var item in allotList)
                {
                    var skuInfo = skuList.First(w => w.SkuNo == item.SkuNo);
                    if (skuInfo == null)
                    {
                        throw new Exception("物料信息不存在!");
                    }
                    var packagInfo = packagList.First(w => w.PackagNo == skuInfo.PackagNo);
                    if (packagInfo == null)
                    {
                        throw new Exception("包装信息不存在!");
                    }
                    if (packagInfo.L2Name == "箱")
                    {
                        if (item.Qty % (decimal)packagInfo.L2Num != 0)//能整除说明不用拆箱,不能整除说明需要拆箱
                        {
                            result = "1";//需要拆箱
                            break;
                        }
                    }
                    var boxInfo = Db.Queryable<DataBoxInfo>().Where(w => w.IsDel == "0" && w.PalletNo == item.PalletNo && w.BitBoxMark == "1").ToList();
                    if (boxInfo != null)//托盘上有零箱需要拆箱
                    {
                        result = "1";//需要拆箱
                        break;
                    }
                }
                return result;
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }
        /// <summary>
        /// 获取移库目标库位
        /// </summary>
        /// <param name="oldAddress">需要移动的库位地址</param>
        /// <param name="roadWay">巷道</param>
        /// <param name="skuNo">物料编码</param>
        /// <returns>目标库位地址 为"" 直接下发两次出库指令</returns>
        public string MoveAddress(string oldAddress, string roadWay, string skuNo)//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 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 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;
        }
    }
}