wxw
3 天以前 3f5f0c666d20a58998a7a7cc4fc3047d86a0f5b3
Wms/WMS.BLL/BllSoServer/ExportNoticeServer.cs
@@ -30,6 +30,7 @@
using System.Drawing.Drawing2D;
using Model.ModelDto.LogDto;
using AutoMapper.Internal;
using System.Diagnostics.Contracts;
namespace WMS.BLL.BllSoServer
{
@@ -337,11 +338,11 @@
                {
                    //客户信息
                    var customer = Db.Queryable<SysCustomer>().First(m => m.IsDel == "0" && m.CustomerNo == model.customerNo);
                    if (customer == null)
                    if (customer != null)
                    {
                        throw new Exception("客户信息不存在!");
                        //throw new Exception("客户信息不存在!");
                        CustomerName = customer.CustomerName;
                    }
                    CustomerName = customer.CustomerName;
                }
                //承运商信息
@@ -398,7 +399,7 @@
                            {
                                throw new Exception("批次不可为空!");
                            }
                        }
                        }
                        //库存明细
                        List<DataStockDetail> stockDetails;
                        //指定批次
@@ -522,7 +523,7 @@
                                        q2 = q3;
                                    }
                                    if (q2 > d.skuQty - q1)
                                    {
                                    {
                                        if (!dic.ContainsKey(stockInfo.Id))
                                        {
                                            dic.Add(stockInfo.Id, d.skuQty - q1);
@@ -535,7 +536,7 @@
                                        q1 += d.skuQty - q1;
                                    }
                                    else
                                    {
                                    {
                                        if (!dic.ContainsKey(stockInfo.Id))
                                        {
                                            dic.Add(stockInfo.Id, (decimal)q2);
@@ -599,7 +600,7 @@
                    var notice = new BllExportNotice()
                    {
                        SONo = billNo,
                        OrderCode=model.orderNo,
                        OrderCode = model.orderNo,
                        Type = model.orderType,
                        Status = "0",
                        Origin = "SAP",
@@ -609,22 +610,28 @@
                        IsWave = "0",
                        WaveNo = "",
                        IsDespatch = "0",
                        CreateUser = 0,
                    };
                    if (houseNo == "1000" || houseNo == "1001" || houseNo == "2000")
                    {
                        notice.WareHouseNo = "W01";
                    }
                    else if (houseNo == "2001")
                    if (houseNo == "1000" || houseNo == "1001" || houseNo == "2000" || houseNo == "2002" || houseNo == "2003" || houseNo == "2004")
                    {
                        notice.WareHouseNo = "W02";
                    }
                    else if (houseNo == "4000")
                    {
                        notice.WareHouseNo = "W01";
                    }
                    else
                    {
                        throw new Exception("发出仓库异常");
                        // houseNo抛异常,避免出现非W01,W02的值
                        throw new Exception($"不支持的发出仓库编号:{houseNo},仅支持生成W01和W02仓库的单据");
                    }
                    //额外校验(可选,双重保障)
                    if (notice.WareHouseNo != "W01" && notice.WareHouseNo != "W02")
                    {
                        throw new Exception($"仓库编号异常:{notice.WareHouseNo},仅允许W01和W02");
                    }
                    var n = Db.Insertable<BllExportNotice>(notice).ExecuteCommand();
                    var m = Db.Insertable<BllExportNoticeDetail>(list).ExecuteCommand();
@@ -744,7 +751,7 @@
                    };
                    #region 通过接口发送至erp
                    //系统对接后放开
                    /*var jsonData = JsonConvert.SerializeObject(soInfo);
                    var jsonData = JsonConvert.SerializeObject(soInfo);
                    var response = HttpHelper.DoPost(url, jsonData, "出库单完成上传", "ERP");
@@ -752,7 +759,7 @@
                    if (obj.Success != 0)
                    {
                        throw new Exception("上传失败" + obj.Message);
                    }*/
                    }
                    #endregion
                }
@@ -769,14 +776,14 @@
                throw new Exception(e.Message);
            }
        }
        //生产叫料
        public bool MESProductionCall(ProductionCallVm model)
        {
            try
            {
                //验证是否备料完成
                var notice = Db.Queryable<BllExportNotice>().First(m=>m.IsDel == "0" && m.OrderCode == model.OrderCode);
                var notice = Db.Queryable<BllExportNotice>().First(m => m.IsDel == "0" && m.OrderCode == model.OrderCode);
                if (notice == null)
                {
                    throw new Exception("未查询到此工单号");
@@ -797,7 +804,7 @@
                    throw new Exception("当前单据物料在此投料口叫料信息已收到,无需重复下发");
                }
                //判断当前投料口是否有其它工单投料
                var call2 = Db.Queryable<BllProductionCallTask>().First(m => m.IsDel == "0" && m.PutInLocation == model.PutInLocation && m.OrderCode != model.OrderCode );
                var call2 = Db.Queryable<BllProductionCallTask>().First(m => m.IsDel == "0" && m.PutInLocation == model.PutInLocation && m.OrderCode != model.OrderCode);
                if (call2 != null)
                {
                    throw new Exception("此投料口有其它单据物料叫料信息");
@@ -828,7 +835,7 @@
                    foreach (var pro in proCallList)
                    {
                        foreach (var item in locateList)
                        {
                        {
                            //获取备好料的托盘信息
                            var allotList = Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && m.Status == "2" && m.SONo == notice.SONo && m.SkuNo == pro.SkuNo && !list.Contains(m.Id)).Select(m => m.PalletNo).ToList();
@@ -856,7 +863,7 @@
                            };
                            Db.Insertable(exTask).ExecuteCommand();
                            //更改分配表的任务号列
                            var allot = Db.Queryable<BllExportAllot>().First(m=>m.IsDel == "0" && m.Status =="2" && m.SONo == notice.SONo &&  m.StockId == stockDetail.Id);
                            var allot = Db.Queryable<BllExportAllot>().First(m => m.IsDel == "0" && m.Status == "2" && m.SONo == notice.SONo && m.StockId == stockDetail.Id);
                            allot.TaskNo = taskNo;
                            Db.Updateable(allot).ExecuteCommand();
                            list.Add(allot.Id);
@@ -865,14 +872,14 @@
                            item.PalletNo = stockDetail.PalletNo;
                            Db.Updateable(item).ExecuteCommand();
                            var locate = Db.Queryable<SysStorageLocat>().First(m=>m.LocatNo == stockDetail.LocatNo);
                            var locate = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == stockDetail.LocatNo);
                            locate.Status = "5";
                            Db.Updateable(locate).ExecuteCommand();
                            break;
                        }
                    }
                    Db.CommitTran();
                }
@@ -881,7 +888,7 @@
                    Db.RollbackTran();
                    throw new Exception(e.Message);
                }
                return true;
            }
            catch (Exception e)
@@ -921,8 +928,8 @@
                .LeftJoin<SysUserInfor>((a, b, c) => a.CreateUser == c.Id)
                .LeftJoin<SysUserInfor>((a, b, c, d) => a.CreateUser == d.Id)
                .LeftJoin<SysUserInfor>((a, b, c, d, e) => a.CheckUser == e.Id)
                .LeftJoin<SysWareHouse>((a, b, c, d, e,f) => a.WareHouseNo == f.WareHouseNo)
                .Select((a, b, c, d, e,f) => new ExportNoticeDto()
                .LeftJoin<SysWareHouse>((a, b, c, d, e, f) => a.WareHouseNo == f.WareHouseNo)
                .Select((a, b, c, d, e, f) => new ExportNoticeDto()
                {
                    Id = a.Id,
                    SONo = a.SONo,
@@ -981,7 +988,7 @@
                switch (type)//0:原料 1:包材 2:成品 3:耗材 4:半成品
                {
                    case "0"://成品出库
                        if (house !="W01")
                        if (house != "W01")
                        {
                            throw new Exception("成品出库只能选择成品库");
                        }
@@ -1180,7 +1187,7 @@
                switch (model.WareHouseNo)
                {
                    case "W01"://成品库
                        if (skuList.Any(m=>m.Type !="2"))
                        if (skuList.Any(m => m.Type != "2"))
                        {
                            throw new Exception("仓库与出库物料不符");
                        }
@@ -1949,10 +1956,10 @@
                        //    }
                        //}
                        if (d.Qty != d.CompleteQty)
                        {
                            throw new Exception("当前单据明细中计划数量与拣货数量不符,请核实");
                        }
                        //if (d.Qty != d.CompleteQty)
                        //{
                        //    throw new Exception("当前单据明细中计划数量与拣货数量不符,请核实");
                        //}
                        #region 库存表减去锁定数量与总数量(PDA拣货的时候已经减去数量了)
                        /*var sq = stocks.Where(s => s.SkuNo == d.SkuNo);
                        if (!string.IsNullOrWhiteSpace(d.LotNo))
@@ -2073,7 +2080,7 @@
                   .AndIF(!string.IsNullOrWhiteSpace(model.BitPalletMark), m => m.BitPalletMark == model.BitPalletMark)
                   .And(m => !string.IsNullOrWhiteSpace(m.WareHouseNo))
                   .And(a => a.Status == "0")
                   .And(a => a.WareHouseNo == "W02")
                   .And(a => a.WareHouseNo == "W01" || a.WareHouseNo == "W02")
                   .ToExpression();
            var data = await Db.Queryable<DataStockDetail>().Where(item).OrderBy(m => m.LocatNo).ToPageListAsync(model.Page, model.Limit, count);
            //data.Select(m => m.Status == "0" && m.IsDel == "0");
@@ -2323,6 +2330,264 @@
            }
        }
        /// <summary>
        /// 托盘出库(密集库)
        /// </summary>
        /// <param name="palletNo"></param>
        /// <param name="outMode"></param>
        /// <param name="userId"></param>
        /// <param name="url"></param>
        /// <param name="str"></param>
        /// <returns></returns>
        /// <exception cref="Exception"></exception>
        public List<OutCommandDto> IssuePalletNoOutMk(string palletNo, string outMode, int userId, string url, out string str)
        {
            try
            {
                //判断托盘号是否为空
                if (string.IsNullOrWhiteSpace(palletNo))
                {
                    throw new Exception($"托盘号不能为空,请核实");
                }
                str = "";
                var stockDetailList = Db.Queryable<DataStockDetail>().Where(m => m.PalletNo == palletNo && m.IsDel == "0").ToList();
                if (stockDetailList.Count == 0)
                {
                    throw new Exception($"未在库内查询到该托盘信息");
                }
                var stocka = Db.Queryable<DataStock>().First(a => a.IsDel == "0" && a.SkuNo == stockDetailList[0].SkuNo);
                //验证库存托盘状态
                if (stockDetailList[0].Status != "0")
                {
                    throw new Exception($"当前托盘未处于待分配状态,请核实!");
                }
                //判断托盘库存信息分组后是否大于1条
                var detailGroup = stockDetailList.GroupBy(m => new { m.SkuNo, m.PalletNo, m.WareHouseNo, m.LocatNo }).ToList();
                if (detailGroup.Count > 1)
                {
                    throw new Exception($"未在库内查询到该托盘信息");
                }
                var locatStart = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.LocatNo == stockDetailList[0].LocatNo && w.Status == "1");
                if (locatStart == null)
                {
                    throw new Exception($"起始储位不存在或非空闲,请检查");
                }
                #region 集合
                var outDto1 = new List<OutCommandDto>(); //先出库数据的集合(深度为1的储位)
                var outDto2 = new List<OutCommandDto>(); //后出库数据的集合(深度为2的储位)
                var moveDto = new List<OutCommandDto>(); //要移库数据的集合
                #endregion
                var com = new Common();
                var allot = new AllotLocation();
                #region 集合
                Db.BeginTran();
                try
                {
                    List<LogTask> logTaskList = new List<LogTask>();//此次出库任务集合,为应对同托盘不同物料出库
                    var taskNoStr = "";
                    // 储位号
                    var locateNo = locatStart.LocatNo;
                    List<string> locateListStrs = new List<string>();
                    locateListStrs.Add(locateNo);
                    var row1 = int.Parse(locatStart.LocatNo.Substring(2, 2));
                    var row2 = int.Parse(locatStart.AisleOne.Substring(2, 2));
                    //需要移库的信息
                    var NeedMoveInfo = IsNeedMoveLocate(locatStart, locateListStrs, out int isOut);
                    if (isOut == 1)
                    {
                        //巷道组中有入库或移入的储位,或者是当前储位前有储位未下发成功的任务
                        throw new Exception($"巷道组中有入库或移入的储位,请稍后再试");
                    }
                    if (NeedMoveInfo.Count > 0)//需要移库
                    {
                        //判断库内空储位是否够
                        var okRoad = Db.Queryable<SysStorageRoadway>().Where(m => m.Status == "0" && m.IsDel == "0" && m.WareHouseNo == locatStart.WareHouseNo).Select(m => m.RoadwayNo).ToList();
                        var nullSlotNum = Db.Queryable<SysStorageLocat>().Count(m => m.RoadwayNo != locatStart.RoadwayNo && okRoad.Contains(m.RoadwayNo) && m.Status == "0");
                        //判断空储位的数量是否大于需要移库的数量
                        if (nullSlotNum >= NeedMoveInfo.Count)
                        {
                            foreach (var s in NeedMoveInfo)
                            {
                                //储位列
                                var rows = int.Parse(s.Substring(2, 2));
                                //获取移库储位
                                var moveAddress = GetMiJiMoveAddress(s, locatStart.AisleOne);
                                var tary = Db.Queryable<DataStockDetail>().First(m => m.LocatNo == s);
                                if (string.IsNullOrWhiteSpace(moveAddress)) // 判断是否获取到移库的库位
                                {
                                    throw new Exception($"出库前有货物,需移库但未查询到空储位");
                                }
                                else
                                {
                                    var ykTaskNo = new Common().GetMaxNo("TK");
                                    var ykTask = new LogTask    //出库任务
                                    {
                                        TaskNo = ykTaskNo,
                                        Sender = "WMS",
                                        Receiver = "WCS",
                                        IsSuccess = 0, //是否下发成功 0失败 1成功
                                        StartLocat = s,//起始位置
                                        EndLocat = moveAddress,//outMode,//目标位置
                                        PalletNo = tary.PalletNo,//托盘码
                                        IsSend = 1,//是否可再次下发
                                        IsCancel = 1,//是否可取消
                                        IsFinish = 1,//是否可完成
                                        Type = "2",//任务类型 0 入库任务 1 出库任务  2 移库任务
                                        Status = "0",//任务状态0:等待执行1正在执行2执行完成
                                        OrderType = "1",//0 入库单 1 出库单  2 盘点单  3 移库单
                                        Msg = "从" + s + "到" + moveAddress + "的移库任务", //关键信息
                                    };
                                    Db.Insertable(ykTask).ExecuteCommand();
                                    logTaskList.Add(ykTask);
                                    outDto1.Add(new OutCommandDto()
                                    {
                                        PalletNo = ykTask.PalletNo,//托盘号
                                        StartLocate = ykTask.StartLocat, // 起始位置
                                        StartRoadway = locatStart.RoadwayNo,//其实巷道
                                        EndLocate = moveAddress,//outMode, // 目标位置
                                        TaskNo = ykTaskNo, // 任务号
                                        TaskType = "2",// 任务类型 (出库)0入 1出 2移
                                        Order = Math.Abs(row2 - rows),
                                        Type = PLCTypeEnum.ShuttleCar
                                    });
                                    var slotChange = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == s);
                                    var slotChange2 = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == moveAddress);
                                    slotChange.Status = "5"; //改变状态(正在出库)
                                    slotChange2.Status = "4"; // 改变状态(正在移入)
                                    Db.Updateable(slotChange).ExecuteCommand();
                                    Db.Updateable(slotChange2).ExecuteCommand();
                                }
                            }
                        }
                        else
                        {
                            throw new Exception($"出库前有货物,需移库但空储位不够移库");
                        }
                    }
                    #region 添加出库任务
                    var taskNo = new Common().GetMaxNo("TK");
                    var exTask = new LogTask    //出库任务
                    {
                        TaskNo = taskNo,
                        Sender = "WMS",
                        Receiver = "WCS",
                        IsSuccess = 0, //是否下发成功 0失败 1成功
                        StartLocat = locatStart.LocatNo,//起始位置
                        EndLocat = outMode,//outMode,//目标位置
                        PalletNo = palletNo,//托盘码
                        IsSend = 1,//是否可再次下发
                        IsCancel = 1,//是否可取消
                        IsFinish = 1,//是否可完成
                        Type = "1",//任务类型 0 入库任务 1 出库任务  2 移库任务
                        Status = "0",//任务状态0:等待执行1正在执行2执行完成
                        OrderType = "1",//0 入库单 1 出库单  2 盘点单  3 移库单
                        Msg = "从" + locatStart.LocatNo + "到" + outMode + "的出库任务", //关键信息
                    };
                    Db.Insertable(exTask).ExecuteCommand();
                    logTaskList.Add(exTask);
                    var endroad = allot.RoadwayToStationNum(locatStart.RoadwayNo, outMode);
                    outDto1.Add(new OutCommandDto()
                    {
                        PalletNo = palletNo,//托盘号
                        StartLocate = locatStart.LocatNo, // 起始位置
                        StartRoadway = locatStart.RoadwayNo,//起始巷道
                        EndLocate = outMode,//, // 目标位置
                        EndRoadway = endroad,
                        TaskNo = exTask.TaskNo, // 任务号
                        TaskType = "1",// 任务类型 (出库)0入 1出 2移
                        OutMode = outMode,  //出库口
                        Order = Math.Abs(row2 - row1),
                        Type = PLCTypeEnum.ShuttleCar
                    });
                    taskNoStr = exTask.TaskNo;
                    #endregion
                    #region 改变数据
                    locatStart.Status = "3"; //要出库的储位改变状态 正在出库
                    Db.Updateable(locatStart).ExecuteCommand();
                    #endregion
                    outDto1.AddRange(moveDto);
                    outDto1.AddRange(outDto2);
                    //添加操作日志记录
                    new OperationSOServer().AddLogOperationSo("出库作业", "托盘出库", palletNo, "出库", $"点击出库按钮出库托盘为:{palletNo}", userId);
                    Db.CommitTran();
                    if (outDto1.Count > 0)
                    {
                        // 正式运行程序放开
                        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 wcsModel = JsonConvert.DeserializeObject<WcsModel2>(response);
                            if (wcsModel.code == 200)
                            {
                                //更改任务的发送返回时间//
                                new TaskServer().EditTaskIssueOk(list2, time1, time2);
                                str += "下发成功";
                            }
                            else
                            {
                                new TaskServer().EditTaskIssueNo(list2, time1, time2, wcsModel.message);
                                throw new Exception(wcsModel.message);
                            }
                        }
                        catch (Exception ex)
                        {
                            throw new Exception(ex.Message);
                        }
                    }
                    return outDto1;
                }
                catch (Exception e)
                {
                    Db.RollbackTran();
                    throw new Exception(e.Message);
                }
                #endregion
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
        }
        #endregion
        #region 自动分配、取消分配、获取手动分配的数据源、手动分配
@@ -2510,7 +2775,7 @@
                        Dictionary<int, decimal> stockQtyDic = new Dictionary<int, decimal>();//托出库物品数
                        var qty = 0m;
                        var house = "";
                        //分配货物
                        qty += assign.AllotPallets(stockDetail, needQty, pNum, bNum, stockQtyDic, notice.WareHouseNo);
                        foreach (var sc in stockQtyDic)
@@ -3061,7 +3326,7 @@
        {
            try
            {
                var notcie = Db.Queryable<BllExportNotice>().First(m=>m.IsDel == "0" && m.SONo == soNo);
                var notcie = Db.Queryable<BllExportNotice>().First(m => m.IsDel == "0" && m.SONo == soNo);
                if (notcie == null)
                {
                    throw new Exception("未查询到出库单信息");
@@ -3149,9 +3414,9 @@
                        {
                            throw new Exception("出库口工位异常");
                        }
                        var taskNoStr = "";
                        // 储位号
                        var locateNo = outStockDetail.First(m => m.PalletNo == item.PalletNo).LocatNo;
@@ -3194,7 +3459,7 @@
                            }
                            flagList.Add(0);
                            continue;
                        }
                        var locate = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == locateNo && m.IsDel == "0");//当前出库的储位信息
@@ -3215,7 +3480,7 @@
                        if (locate.Status == "1") //有物品
                        {
                            #region 添加出库任务
                            var taskNo = new Common().GetMaxNo("TK");
                            var exTask = new LogTask    //出库任务
                            {
@@ -3247,13 +3512,13 @@
                                StartLocate = locate.LocatNo, // 起始位置
                                StartRoadway = locate.RoadwayNo,//其实巷道
                                EndLocate = outModeLocate, // 目标位置 
                                Order = 999,
                                Type  = PLCTypeEnum.AGV
                                Type = PLCTypeEnum.AGV
                            });
                            taskNoStr = exTask.TaskNo;
                            #endregion
                            #region 改变数据
@@ -3341,7 +3606,7 @@
                            flagList.Add(1);
                        }
                    }
                    //添加操作日志记录
                    var k = new OperationSOServer().AddLogOperationSo("出库作业", "出库单据", soNo, "出库", $"点击出库按钮出库单号为:{soNo}的出库单", userId);
                    Db.CommitTran();
@@ -3389,8 +3654,8 @@
                            //if (wcsModel.StatusCode == 0)
                            //{
                            //    //更改任务的发送返回时间//
                                new TaskServer().EditTaskIssueOk(list2, time1, time2);
                                str += "下发成功";
                            new TaskServer().EditTaskIssueOk(list2, time1, time2);
                            str += "下发成功";
                            //}
                            //if (wcsModel.StatusCode == -1)
                            //{
@@ -3456,7 +3721,7 @@
                //要出库的明细集合
                var outStockDetail = Db.Queryable<DataStockDetail>().Where(m => m.IsDel == "0" && outLpnList.Contains(m.PalletNo)).ToList();
                //所有要出库的储位集合
                var locateListStrs = outStockDetail.Where(m=> !string.IsNullOrWhiteSpace(m.LocatNo)).Select(m => m.LocatNo).Distinct().ToList();
                var locateListStrs = outStockDetail.Where(m => !string.IsNullOrWhiteSpace(m.LocatNo)).Select(m => m.LocatNo).Distinct().ToList();
                //物料编码表
                var skuList = Db.Queryable<SysMaterials>().Where(w => w.IsDel == "0");
                //包装表
@@ -3465,13 +3730,13 @@
                try
                {
                    List<LogTask> logTaskList = new List<LogTask>();//此次出库任务集合,为应对同托盘不同物料出库
                    //循环分配的信息生成出库任务
                    foreach (var item in list)
                    {
                        var taskNoStr = "";
                        // 储位号
                        var locateNo = outStockDetail.First(m => m.PalletNo == item.PalletNo).LocatNo;
@@ -3522,7 +3787,7 @@
                        }
                        //判断储位
                        var locate = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == locateNo && m.IsDel == "0");//当前出库的储位信息
                        var locate = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == locateNo && m.IsDel == "0" && m.WareHouseNo == "W01");//当前出库的储位信息
                        if (locate == null)
                        {
                            flagList.Add(2);
@@ -3539,7 +3804,7 @@
                        if (locate.Status == "1") //有物品
                        {
                            var row1 = int.Parse(locate.LocatNo.Substring(2,2));
                            var row1 = int.Parse(locate.LocatNo.Substring(2, 2));
                            var row2 = int.Parse(locate.AisleOne.Substring(2, 2));
                            //需要移库的信息 
                            var NeedMoveInfo = IsNeedMoveLocate(locate, locateListStrs, out int isOut);
@@ -3561,7 +3826,7 @@
                                    foreach (var s in NeedMoveInfo)
                                    {
                                        //储位列
                                        var rows = int.Parse(s.Substring(2,2));
                                        var rows = int.Parse(s.Substring(2, 2));
                                        //获取移库储位
                                        var moveAddress = GetMiJiMoveAddress(s, locate.AisleOne);
@@ -3610,8 +3875,8 @@
                                            outDto1.Add(new OutCommandDto()
                                            {
                                                PalletNo = item.PalletNo,//托盘号
                                                StartLocate = locate.LocatNo, // 起始位置
                                                PalletNo = ykTask.PalletNo,//托盘号
                                                StartLocate = ykTask.StartLocat, // 起始位置
                                                StartRoadway = locate.RoadwayNo,//其实巷道
                                                EndLocate = moveAddress,//outMode, // 目标位置 
                                                TaskNo = ykTaskNo, // 任务号
@@ -3619,7 +3884,7 @@
                                                Order = Math.Abs(row2 - rows),
                                                Type = PLCTypeEnum.ShuttleCar
                                            });
                                            });
                                            var slotChange = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == s);
                                            var slotChange2 = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == moveAddress);
@@ -3641,7 +3906,7 @@
                                }
                            }
                            #region 添加出库任务
                            var taskNo = new Common().GetMaxNo("TK");
                            var exTask = new LogTask    //出库任务
                            {
@@ -3679,7 +3944,7 @@
                            });
                            taskNoStr = exTask.TaskNo;
                            #endregion
                            #region 改变数据
@@ -3853,26 +4118,26 @@
        /// <param name="addressList">要出口的储位集合</param>
        /// <param name="isOut">是否出库 1:有未下发的任务在前面</param>
        /// <returns>需要移库的集合(如果为空则不需移库)</returns>
        private List<string> IsNeedMoveLocate(SysStorageLocat lcoate,List<string> locateStrList, out int isOut)
        private List<string> IsNeedMoveLocate(SysStorageLocat lcoate, List<string> locateStrList, out int isOut)
        {
            var nowAddress = new List<string>(); //需要移库的集合
            // 010101 派列层
            //var bol = String.CompareOrdinal(lcoate.LocatNo, lcoate.AisleOne);
            var sArray = lcoate.LocatNo.Substring(4,2);
                                                 // 010101 派列层
                                                 //var bol = String.CompareOrdinal(lcoate.LocatNo, lcoate.AisleOne);
            var sArray = lcoate.LocatNo.Substring(2, 2);
            var row = int.Parse(sArray);//储位列
            var sArray2 = lcoate.AisleOne.Substring(4, 2);
            var sArray2 = lcoate.AisleOne.Substring(2, 2);
            var row2 = int.Parse(sArray2); //通道口列
            isOut = 0;
            var bol = row2 - row > 0;
            //同组的储位集合
            var slotList = Db.Queryable<SysStorageLocat>().Where(m => m.RoadwayNo == lcoate.RoadwayNo).ToList();
            List<string> list;
            if (bol)
            {
                //储位小于通道口   倒序
@@ -3925,7 +4190,7 @@
            {
                return nowAddress;
            }
            return nowAddress;
        }
@@ -3948,7 +4213,7 @@
            // 获取移库目标储位
            //
            var sArray = oldAddress.Substring(4,2);
            var sArray = oldAddress.Substring(4, 2);
            var ceng = int.Parse(sArray);
            //
            var sArray2 = slotOut.Substring(2, 2);
@@ -3979,206 +4244,220 @@
            //根据十字口差值最小的排序
            shiKou3 = shiKou3.OrderBy(m => m.distNum).ToList();
                /**
                //1 移动到最近的空储位,必须回移。
                //根据四向车移动轨迹计算出最近空储位。
                //出库完成后根据批次号 生产日期 出口计算回移储位。
            /**
            //1 移动到最近的空储位,必须回移。
            //根据四向车移动轨迹计算出最近空储位。
            //出库完成后根据批次号 生产日期 出口计算回移储位。
                //2 移动适合存放的组,系统自动计算是否回移。
                //根据批次号 生产日期 出口 物料等计算出移库目标储位
                //出库完成后,判断是否有比当前库位更合适的存储储位,有移动,无不移动。
                */
            //2 移动适合存放的组,系统自动计算是否回移。
            //根据批次号 生产日期 出口 物料等计算出移库目标储位
            //出库完成后,判断是否有比当前库位更合适的存储储位,有移动,无不移动。
            */
                var oldSlot = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == oldAddress);
                if (oldSlot == null)
            var oldSlot = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == oldAddress);
            if (oldSlot == null)
            {
                throw new Exception("未能找到储位信息");
            }
            #region 1不需要回移的
            //后期库存托盘表改了后需要加筛选条件托盘的状态(退货/预拣)
            var tray1 = Db.Queryable<DataStockDetail>().Where(m => m.LocatNo == oldAddress).ToList();
            //根据物料、批次、托盘状态(退货/预拣/暂存等)分组判断
            var d = tray1.GroupBy(m => new { m.SkuNo, m.LotNo, m.PalletTags });
            var location = string.Empty;
            if (d.Any())
            {
                //旧储位同组的储位集合
                var slotList = Db.Queryable<SysStorageLocat>().Where(m => m.RoadwayNo == oldSlot.RoadwayNo).Select(m => m.LocatNo).ToList();
                foreach (var item in d)
                {
                    throw new Exception("未能找到储位信息");
                }
                #region 1不需要回移的
                //后期库存托盘表改了后需要加筛选条件托盘的状态(退货/预拣)
                var tray1 = Db.Queryable<DataStockDetail>().Where(m => m.LocatNo == oldAddress).ToList();
                //根据物料、批次、托盘状态(退货/预拣/暂存等)分组判断
                var d = tray1.GroupBy(m => new { m.SkuNo, m.LotNo, m.PalletTags });
                var location = string.Empty;
                if (d.Any())
                {
                    //旧储位同组的储位集合
                    var slotList = Db.Queryable<SysStorageLocat>().Where(m => m.RoadwayNo == oldSlot.RoadwayNo).Select(m => m.LocatNo).ToList();
                    foreach (var item in d)
                    foreach (var item2 in item)
                    {
                        foreach (var item2 in item)
                        var okLan = Db.Queryable<SysStorageRoadway>().Where(m => m.Status == "0" && m.IsDel == "0" && m.WareHouseNo == item2.WareHouseNo).Select(m => m.RoadwayNo).ToList();
                        //当前托盘所在楼层
                        if (oldSlot.Layer == 1)
                        {
                            var okLan = Db.Queryable<SysStorageRoadway>().Where(m => m.Status == "0" && m.IsDel == "0").Select(m => m.RoadwayNo).ToList();
                            var tray2 = Db.Queryable<DataStockDetail>().Where(m => m.SkuNo == item2.SkuNo
                            okLan = okLan.Where(m => Convert.ToInt32(m.Replace("MR", "")) <= 56).ToList();
                        }
                        else if (oldSlot.Layer == 2)
                        {
                            okLan = okLan.Where(m => Convert.ToInt32(m.Replace("MR", "")) > 56).ToList();
                        }
                        else
                        {
                            throw new Exception("当前托盘所在楼层异常");
                        }
                        var tray2 = Db.Queryable<DataStockDetail>().Where(m => m.SkuNo == item2.SkuNo
                            && m.LotNo == item2.LotNo && !slotList.Contains(m.LocatNo) && m.PalletTags == item2.PalletTags && okLan.Contains(m.RoadwayNo)).ToList();
                            foreach (var s in tray2)
                        foreach (var s in tray2)
                        {
                            if (string.IsNullOrWhiteSpace(s.RoadwayNo))//判断是否在库外,如是跳过
                            {
                                if (string.IsNullOrWhiteSpace(s.RoadwayNo))//判断是否在库外,如是跳过
                                continue;
                            }
                            var lan = Db.Queryable<SysStorageLocat>().Where(m => m.RoadwayNo == s.RoadwayNo).OrderBy(m => m.LocatNo).ToList();
                            //判断是否有入库中、出库中、移入中、移出中
                            if (lan.Count(m => m.Status == "2" || m.Status == "3" || m.Status == "4" || m.Status == "5") > 0)
                            {
                                continue;
                            }
                            if (lan.Count(m => m.Status == "0") > 0)
                            {
                                var bol = GetBecomingLocation(s.RoadwayNo, ref location);
                                if (bol && !string.IsNullOrWhiteSpace(location))
                                {
                                    continue;
                                }
                                var lan = Db.Queryable<SysStorageLocat>().Where(m => m.RoadwayNo == s.RoadwayNo).OrderBy(m => m.LocatNo).ToList();
                                //判断是否有入库中、出库中、移入中、移出中
                                if (lan.Count(m => m.Status == "2" || m.Status == "3" || m.Status == "4" || m.Status == "5") > 0)
                                {
                                    continue;
                                }
                                if (lan.Count(m => m.Status == "0") > 0)
                                {
                                    var bol = GetBecomingLocation(s.RoadwayNo, ref location);
                                    if (bol && !string.IsNullOrWhiteSpace(location))
                                    {
                                        newAddress = location;
                                        return newAddress;
                                    }
                                    newAddress = location;
                                    return newAddress;
                                }
                            }
                        }
                    }
                }
                #endregion
            }
                #region 2需要回移的
            #endregion
                ////如果没有找到合适的储位
                //if (string.IsNullOrWhiteSpace(newAddress))
                //{
                //    foreach (var s in shiKou3)
                //    {
                //        var r = int.Parse(s.slotCode.Substring(0, 2));
                //        var l = int.Parse(s.slotCode.Substring(2, 2));
                //        var c = int.Parse(s.slotCode.Substring(4, 2));
                //        //查询空储位
                //        var sqlString = $@"select LocatNo,Row,Column,Layer,(ABS(Row-{r}) + ABS(Column-{l}) ) as distNum
                //                from SysStorageLocat where (AisleOneRow  = {r} or AisleTwoRow = {r}) and Status in (0) and
                //                 RoadwayNo !='{oldSlot.RoadwayNo}' and RoadwayNo not in(select RoadwayNo from SysStorageRoadway where Status = 1) order by distNum,SlotCode";
            #region 2需要回移的
                //        var addressModels = dataContext.ExecuteQuery<addreClass>(sqlString).ToList();
                //        foreach (var item in addressModels)
                //        {                            、
                //            newAddress = item.slotCode;
                //            var dz = newAddress.Split(new char[] { '-' });
                //            var l1 = dz[1];
                //            var c1 = dz[0];
                //            newLaneWayAddress = $"{c1}-{l1}-{a[2]}";
                //            flags = newLaneWayAddress;
            ////如果没有找到合适的储位
            //if (string.IsNullOrWhiteSpace(newAddress))
            //{
            //    foreach (var s in shiKou3)
            //    {
                //            var slotModel = dataContext.WmsBaseSlot.FirstOrDefault(m => m.SlotCode == item.slotCode);
            //        var r = int.Parse(s.slotCode.Substring(0, 2));
            //        var l = int.Parse(s.slotCode.Substring(2, 2));
            //        var c = int.Parse(s.slotCode.Substring(4, 2));
            //        //查询空储位
            //        var sqlString = $@"select LocatNo,Row,Column,Layer,(ABS(Row-{r}) + ABS(Column-{l}) ) as distNum
            //                from SysStorageLocat where (AisleOneRow  = {r} or AisleTwoRow = {r}) and Status in (0) and
            //                 RoadwayNo !='{oldSlot.RoadwayNo}' and RoadwayNo not in(select RoadwayNo from SysStorageRoadway where Status = 1) order by distNum,SlotCode";
                //            var lan = dataContext.WmsBaseSlot.Where(m => m.SlotLanewayId == slotModel.SlotLanewayId).ToList();
                //            if (slotModel.SlotRow > int.Parse(a[2]))
                //            {
                //                // 取最上面一排
                //                lan = lan.OrderBy(m => m.SlotCode).ToList();
                //                for (int i = 0; i < lan.Count; i++)
                //                {
                //                    var slot = dataContext.WmsBaseSlot.FirstOrDefault(m => m.SlotCode == lan[i].SlotCode);
                //                    if (slot.SlotStatus == 0)
                //                    {
                //                        if (i == lan.Count - 1)
                //                        {
                //                            newAddress = lan[lan.Count - 1].SlotCode;
            //        var addressModels = dataContext.ExecuteQuery<addreClass>(sqlString).ToList();
            //        foreach (var item in addressModels)
            //        {                            、
                //                            break;
                //                        }
                //                        else
                //                        {
                //                            continue;
                //                        }
                //                    }
                //                    else
                //                    {
                //                        newAddress = lan[i - 1].SlotCode;
                //                        break;
                //                    }
                //                }
            //            newAddress = item.slotCode;
            //            var dz = newAddress.Split(new char[] { '-' });
            //            var l1 = dz[1];
            //            var c1 = dz[0];
            //            newLaneWayAddress = $"{c1}-{l1}-{a[2]}";
            //            flags = newLaneWayAddress;
                //            }
                //            else
                //            {
                //                // 取最下面一排
                //                lan = lan.OrderByDescending(m => m.SlotCode).ToList();
                //                for (int i = 0; i < lan.Count; i++)
                //                {
                //                    var slot = dataContext.WmsBaseSlot.FirstOrDefault(m => m.SlotCode == lan[i].SlotCode);
                //                    if (slot.SlotStatus == 0)
                //                    {
                //                        if (i == lan.Count - 1)
                //                        {
                //                            newAddress = lan[lan.Count - 1].SlotCode;
                //                            break;
                //                        }
                //                        else
                //                        {
                //                            continue;
                //                        }
            //            var slotModel = dataContext.WmsBaseSlot.FirstOrDefault(m => m.SlotCode == item.slotCode);
                //                    }
                //                    else
                //                    {
                //                        newAddress = lan[i - 1].SlotCode;
                //                        break;
                //                    }
                //                }
                //            }
                //            //添加回移任务
                //            AddHyTask(oldAddress, newAddress, newLaneWayAddress, oldSlot.SlotLanewayId, slotOut, billCode);
                //            refLanWayId = slotModel.SlotLanewayId;
                //            refLanOutCode = newLaneWayAddress;
                //            //9:锁定储位
                //            var updateSlot = dataContext.WmsBaseSlot.Where(m => m.SlotLanewayId == slotModel.SlotLanewayId).ToList();
                //            var newAddressRow = dataContext.WmsBaseSlot.FirstOrDefault(m => m.SlotCode == newAddress);
                //            if (newAddressRow.SlotRow > int.Parse(a[2]))
                //            {
                //                updateSlot = updateSlot.Where(m => m.SlotRow < newAddressRow.SlotRow && m.SlotRow > int.Parse(a[2])).OrderBy(m => m.SlotCode).ToList();
                //            }
                //            else
                //            {
                //                updateSlot = updateSlot.Where(m => m.SlotRow > newAddressRow.SlotRow && m.SlotRow < int.Parse(a[2])).OrderByDescending(m => m.SlotCode).ToList();
            //            var lan = dataContext.WmsBaseSlot.Where(m => m.SlotLanewayId == slotModel.SlotLanewayId).ToList();
            //            if (slotModel.SlotRow > int.Parse(a[2]))
            //            {
            //                // 取最上面一排
            //                lan = lan.OrderBy(m => m.SlotCode).ToList();
            //                for (int i = 0; i < lan.Count; i++)
            //                {
            //                    var slot = dataContext.WmsBaseSlot.FirstOrDefault(m => m.SlotCode == lan[i].SlotCode);
            //                    if (slot.SlotStatus == 0)
            //                    {
            //                        if (i == lan.Count - 1)
            //                        {
            //                            newAddress = lan[lan.Count - 1].SlotCode;
                //            }
                //            foreach (var source in updateSlot)
                //            {
                //                if (source.SlotCode == newAddress)
                //                {
                //                    continue;
                //                }
                //                if (source.SlotStatus == 0)
                //                {
                //                    source.SlotStatus = 8;
                //                }
                //            }
            //                            break;
            //                        }
            //                        else
            //                        {
            //                            continue;
            //                        }
                //            if (updateSlot.Count <= 0)
                //            {
                //                refLanWayId = "";
                //                refLanOutCode = "";
                //            }
                //            dataContext.SubmitChanges();
                //            return newAddress;
            //                    }
            //                    else
            //                    {
            //                        newAddress = lan[i - 1].SlotCode;
            //                        break;
            //                    }
            //                }
                //        }
            //            }
            //            else
            //            {
            //                // 取最下面一排
            //                lan = lan.OrderByDescending(m => m.SlotCode).ToList();
            //                for (int i = 0; i < lan.Count; i++)
            //                {
            //                    var slot = dataContext.WmsBaseSlot.FirstOrDefault(m => m.SlotCode == lan[i].SlotCode);
            //                    if (slot.SlotStatus == 0)
            //                    {
            //                        if (i == lan.Count - 1)
            //                        {
            //                            newAddress = lan[lan.Count - 1].SlotCode;
            //                            break;
            //                        }
            //                        else
            //                        {
            //                            continue;
            //                        }
                //    }
            //                    }
            //                    else
            //                    {
            //                        newAddress = lan[i - 1].SlotCode;
            //                        break;
            //                    }
            //                }
            //            }
            //            //添加回移任务
            //            AddHyTask(oldAddress, newAddress, newLaneWayAddress, oldSlot.SlotLanewayId, slotOut, billCode);
            //            refLanWayId = slotModel.SlotLanewayId;
            //            refLanOutCode = newLaneWayAddress;
            //            //9:锁定储位
            //            var updateSlot = dataContext.WmsBaseSlot.Where(m => m.SlotLanewayId == slotModel.SlotLanewayId).ToList();
            //            var newAddressRow = dataContext.WmsBaseSlot.FirstOrDefault(m => m.SlotCode == newAddress);
            //            if (newAddressRow.SlotRow > int.Parse(a[2]))
            //            {
            //                updateSlot = updateSlot.Where(m => m.SlotRow < newAddressRow.SlotRow && m.SlotRow > int.Parse(a[2])).OrderBy(m => m.SlotCode).ToList();
            //            }
            //            else
            //            {
            //                updateSlot = updateSlot.Where(m => m.SlotRow > newAddressRow.SlotRow && m.SlotRow < int.Parse(a[2])).OrderByDescending(m => m.SlotCode).ToList();
                //}
            //            }
            //            foreach (var source in updateSlot)
            //            {
            //                if (source.SlotCode == newAddress)
            //                {
            //                    continue;
            //                }
            //                if (source.SlotStatus == 0)
            //                {
            //                    source.SlotStatus = 8;
            //                }
            //            }
                return newAddress;
                #endregion
            //            if (updateSlot.Count <= 0)
            //            {
            //                refLanWayId = "";
            //                refLanOutCode = "";
            //            }
            //            dataContext.SubmitChanges();
            //            return newAddress;
            //        }
            //    }
            //}
            return newAddress;
            #endregion
        }
        /// <summary>
@@ -4190,14 +4469,14 @@
        private bool GetBecomingLocation(string laneWayId, ref string location)
        {
            bool bl = false;
            // 循环判断当前组是否有剩余储位
            string sqlString = string.Empty;
            location = "";
            // 判断储位组是否有空储位   关联库存明细表可防止储位状态不准确避免造成满入异常//not in ('1','2','4','6','7','8')
            sqlString = $"select LocatNo,Column,AisleOne from SysStorageLocat where RoadwayNo = {laneWayId} and Status in ('0') and LocatNo not in (select LocatNo from DataStockDetail where RoadwayNo = { laneWayId}) order by Row;";
            var slotModel =Db.SqlQueryable<LocateInfo>(sqlString).ToList();
            sqlString = $"select LocatNo,[Column],AisleOne from SysStorageLocat where IsDel=0 and WareHouseNo='W01' and RoadwayNo = '{laneWayId}' and Status in ('0') and LocatNo not in (select LocatNo from DataStockDetail where RoadwayNo = '{laneWayId}') order by Row;";
            var slotModel = Db.SqlQueryable<LocateInfo>(sqlString).ToList();
            if (slotModel.Count == 0)
            {
                bl = false;
@@ -4205,7 +4484,7 @@
            else  // 存在空储位
            {
                // 判断当前组合适的储位地址
                var numstr = slotModel[0].AisleOne.Substring(4,2);
                var numstr = slotModel[0].AisleOne.Substring(4, 2);
                int aisleRow = int.Parse(numstr);
                if (slotModel[0].Column > aisleRow)
@@ -4220,11 +4499,11 @@
                    location = slotModel[slotModel.Count - 1].LocatNo;
                }
                bl = true;
            }
            return bl;
        }
@@ -4239,7 +4518,7 @@
            public string LocatNo { get; set; }
            public int Column { get; set; }
            public string AisleOne { get; set; }
        }
        /// <summary>
@@ -4318,12 +4597,12 @@
                        item.WareHouseNo = "";//所属仓库更改(改为空)
                        item.RoadwayNo = "";//所属巷道更改(改为空)
                        item.AreaNo = "";//所属区域更改(改为空)
                    }
                    //出库流水(更改状态)
                    var allot = Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && (m.TaskNo == taskNo || (m.Status == "1" && m.PalletNo == task.PalletNo))).ToList();
                    var PalletType = "0"; //0:物料托  1:空托盘托
                    foreach (var item in allot)
                    {
                        if (item.SkuNo == "100099")
@@ -4339,9 +4618,9 @@
                    }
                    var endLocateList = Db.Queryable<SysStorageLocat>().Where(m => m.IsDel == "0" && (m.AreaNo == "B02" || m.AreaNo == "B05")).Select(m=>m.LocatNo).ToList();
                    var endLocateList = Db.Queryable<SysStorageLocat>().Where(m => m.IsDel == "0" && (m.AreaNo == "B02" || m.AreaNo == "B05")).Select(m => m.LocatNo).ToList();
                    //判断是否是原辅料出库任务  货架储位=》平库储位
                    if ( endLocateList.Contains(task.EndLocat) && PalletType == "0")
                    if (endLocateList.Contains(task.EndLocat) && PalletType == "0")
                    {
                        //修改目标地址状态
                        var endLocat = Db.Queryable<SysStorageLocat>().First(m => m.IsDel == "0" && m.LocatNo == task.EndLocat);
@@ -4423,9 +4702,9 @@
                    ////判断起始目标位置都是平库  
                    //if (pingKuList.Contains(task.StartLocat) && pingKuList.Contains(task.EndLocat))
                    //{
                        task.Status = "2";
                    task.Status = "2";
                    //}
                    task.IsSend = 0;
                    task.IsCancel = 0;
                    task.IsFinish = 0;
@@ -4440,13 +4719,13 @@
                        locate.Status = "0";
                        Db.Updateable(locate).ExecuteCommand();
                    }
                    //目标储位改为有货物 1
                    locate2.Status = "1";
                    Db.Updateable(locate2).ExecuteCommand();
                    //判断起始目标位置都是平库  
                    if ( pingKuList.Contains(task.EndLocat))
                    if (pingKuList.Contains(task.EndLocat))
                    {
                        foreach (var item in stockDetail)
                        {
@@ -4457,7 +4736,7 @@
                        }
                        Db.Updateable(stockDetail).ExecuteCommand();
                    }
                    #endregion
@@ -4484,12 +4763,12 @@
            try
            {
                Db.BeginTran();
                var task = Db.Queryable<LogTask>().First(m=>m.IsDel =="0" && m.TaskNo == taskNo);
                var task = Db.Queryable<LogTask>().First(m => m.IsDel == "0" && m.TaskNo == taskNo);
                if (task == null)
                {
                    throw new Exception("没有查询到任务信息");
                }
                if (task.Status!="1")
                if (task.Status != "1")
                {
                    throw new Exception("任务状态不是正在执行,请核实");
                }
@@ -4498,7 +4777,7 @@
                {
                    throw new Exception("没有查询到起始储位信息");
                }
                if (locate.WareHouseNo!="W04")
                if (locate.WareHouseNo != "W04")
                {
                    throw new Exception("起始储位不是平库储位,请核实");
                }
@@ -4523,7 +4802,7 @@
            }
        }
        #endregion
        #endregion
@@ -4545,7 +4824,7 @@
                    throw new Exception("未查询到出库单信息");
                }
                var task = Db.Queryable<BllExportTimingTask>().Count(m => m.SoNo == soNo);
                if (task>0)
                if (task > 0)
                {
                    throw new Exception("当前出库单已生成备料任务,无需重复点击");
                }
@@ -4557,7 +4836,7 @@
                };
                Db.Insertable(exTask).ExecuteCommand();
                notice.Status = "3";//修改单据状态未正在执行
                notice.UpdateTime = DateTime.Now;
                notice.UpdateTime = DateTime.Now;
                notice.UpdateUser = userId;
                Db.Updateable(notice).ExecuteCommand();
@@ -4569,7 +4848,7 @@
                throw new Exception(e.Message);
            }
        }
        // JC23 备料定时任务开始 领料单备料下发出库(调用wcs接口给他库位地址)
        public List<OutCommandDto> BeiLiaoIssueOutHouse(string url)
        {
@@ -4663,7 +4942,7 @@
                                if (notice.Status == "0" || notice.Status == "1" || notice.Status == "2")
                                {
                                    var detailList = Db.Queryable<BllExportNoticeDetail>().Where(m => m.IsDel == "0" && m.SONo == item.SONo).ToList();
                                    if (detailList.Count(m => m.FactQty>0) > 0)
                                    if (detailList.Count(m => m.FactQty > 0) > 0)
                                    {
                                        notice.Status = "3"; //变更状态为正在执行
                                        Db.Updateable(notice).ExecuteCommand();
@@ -4690,7 +4969,7 @@
                                if (notice.Status == "0" || notice.Status == "1" || notice.Status == "2")
                                {
                                    var detailList = Db.Queryable<BllExportNoticeDetail>().Where(m => m.IsDel == "0" && m.SONo == item.SONo).ToList();
                                    if (detailList.Count(m => m.FactQty>0) > 0)
                                    if (detailList.Count(m => m.FactQty > 0) > 0)
                                    {
                                        notice.Status = "3"; //变更状态为正在执行
                                        Db.Updateable(notice).ExecuteCommand();
@@ -5079,7 +5358,7 @@
            {
                //先查询任务表中要有任务的投料口信息
                var proCallList = Db.Queryable<BllProductionCallTask>().Where(m => m.IsDel == "0").ToList();
                var proLocationList = proCallList.Select(m=>m.PutInLocation).ToList();
                var proLocationList = proCallList.Select(m => m.PutInLocation).ToList();
                if (proCallList.Count == 0)
                {
                    return null;
@@ -5092,12 +5371,12 @@
                {
                    //当前投料口包含的工位
                    var list = locate.Where(m => m.AreaNo == item).ToList();
                    var listStr = locate.Where(m => m.AreaNo == item).Select(m=>m.LocatNo).ToList();
                    var listStr = locate.Where(m => m.AreaNo == item).Select(m => m.LocatNo).ToList();
                    //判断投料口的工位中是否有未下发成功的任务
                    var task = Db.Queryable<LogTask>().Where(m => m.Type == "1" && m.IsSuccess == 0 && m.Status == "0" && listStr.Contains(m.EndLocat) ).OrderBy(m=>m.TaskNo).ToList();
                    if(task.Count > 0)
                    var task = Db.Queryable<LogTask>().Where(m => m.Type == "1" && m.IsSuccess == 0 && m.Status == "0" && listStr.Contains(m.EndLocat)).OrderBy(m => m.TaskNo).ToList();
                    if (task.Count > 0)
                    {
                        foreach (var item2 in task)
                        {
                            //添加下发任务的信息
@@ -5117,12 +5396,12 @@
                            //item2.Status = "1";
                            //Db.Updateable(item2).ExecuteCommand();
                        }
                        //return outlist;
                    }
                }
                if (outlist.Count>0)
                if (outlist.Count > 0)
                {
                    //将任务发送至AGV
                    // 正式运行程序放开
@@ -5141,8 +5420,8 @@
                        //if (wcsModel.StatusCode == 0)
                        //{
                        //    //更改任务的发送返回时间//
                           new TaskServer().EditTaskIssueOk(list2, time1, time2);
                        new TaskServer().EditTaskIssueOk(list2, time1, time2);
                        //}
                        //if (wcsModel.StatusCode == -1)
                        //{
@@ -5155,7 +5434,7 @@
                        throw new Exception(ex.Message);
                    }
                }
                return null;
            }
            catch (Exception e)
@@ -5180,7 +5459,7 @@
                {
                    throw new Exception("当前任务已完成");
                }
                Db.BeginTran();
                //库存中当前托盘的信息
                var stockDetail = Db.Queryable<DataStockDetail>().Where(m => m.PalletNo == task.PalletNo).ToList();
@@ -5218,11 +5497,11 @@
                        var exTime = Db.Queryable<BllProductionCallTask>().First(m => m.IsDel == "0" && m.PutInLocation == locate.AreaNo && m.SkuNo == locate.SkuNo);
                        if (exTime != null)
                        {
                            var notice = Db.Queryable<BllExportNotice>().First(m=>m.IsDel =="0" && m.SONo == exTime.OrderCode);
                            var notice = Db.Queryable<BllExportNotice>().First(m => m.IsDel == "0" && m.SONo == exTime.OrderCode);
                            //获取备好料的托盘信息
                            var taskStr = Db.Queryable<LogTask>().Where(m => m.IsDel == "0" && (m.Status == "0" || m.Status == "1") && m.Receiver == "AGV").Select(m => m.TaskNo).ToList();
                            var allotList = Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && m.Status == "2" && m.SONo == notice.SONo && m.SkuNo == locate.SkuNo && !taskStr.Contains(m.TaskNo)).Select(m => m.PalletNo).ToList();
                            if (allotList.Count >0)
                            if (allotList.Count > 0)
                            {
                                var stockDetail2 = Db.Queryable<DataStockDetail>().Where(m => allotList.Contains(m.PalletNo)).OrderBy(m => m.LocatNo).First();
@@ -5260,7 +5539,7 @@
                            else
                            {
                                var listLocate = Db.Queryable<SysStorageLocat>().Where(m => m.IsDel == "0" && m.AreaNo == locate.AreaNo).ToList();
                                if (listLocate.Count(m=>m.SkuNo == locate.SkuNo && m.Status != "0") == 0)
                                if (listLocate.Count(m => m.SkuNo == locate.SkuNo && m.Status != "0") == 0)
                                {
                                    Db.Deleteable(exTime).ExecuteCommand();
                                }
@@ -5317,7 +5596,7 @@
                                //删除库存箱码明细
                                Db.Deleteable(item2).ExecuteCommand();
                            }
                            if (comList.Count>0)
                            if (comList.Count > 0)
                            {
                                Db.Insertable(comList).ExecuteCommand();
                            }
@@ -5346,9 +5625,9 @@
                            #endregion
                            #region 出库流水(更改状态)
                            allot.Status = "5";
                            if (stockInfoList.Count == 0)
                            {
                                allot.CompleteQty += item.LockQty;
@@ -5362,7 +5641,7 @@
                            #region 出库单及明细
                            var noticeDetail = Db.Queryable<BllExportNoticeDetail>().First(m => m.Id == allot.SODetailNo && m.IsDel == "0");
                            if (stockInfoList.Count == 0)
                            {
                                noticeDetail.CompleteQty += item.LockQty;
@@ -5377,9 +5656,9 @@
                            {
                                var notice = Db.Queryable<BllExportNotice>().First(m => m.IsDel == "0" && m.SONo == noticeDetail.SONo);
                                notice.Status = "4"; //更改为执行完成//修改出库单信息
                                Db.Updateable(notice).ExecuteCommand();
                            }
                            #endregion
@@ -5402,7 +5681,7 @@
                                }
                            }
                        }
                        item.LocatNo = locate2.LocatNo;//储位更改(改为空)
                        item.WareHouseNo = locate2.WareHouseNo;//所属仓库更改(改为空)
                        item.RoadwayNo = locate2.RoadwayNo;//所属巷道更改(改为空)
@@ -5776,7 +6055,7 @@
                                                    OutMode = toLocation,  //目标地址
                                                    Order = 1,
                                                });
                                                #endregion
@@ -5866,7 +6145,7 @@
                            item.TaskNo = taskNoStr; // 出库分配信息中更新任务号
                            item.Status = "1"; // 出库分配信息状态改为正在执行 
                            item.UnstackingMode = unstackingMode2;//拆垛方式
                            item.OutMode =  outMode ;//出库口
                            item.OutMode = outMode;//出库口
                            //item.LoadingAddre = unstackingMode2 == "0" ? loadingAddre : "";//装车口
                            Db.Updateable(item).ExecuteCommand();
@@ -5910,7 +6189,7 @@
                            item.TaskNo = taskNo.TaskNo;
                            item.Status = "1"; // 出库分配信息状态改为正在执行 
                            item.OutMode = item.OutMode;//出库口
                            item.UnstackingMode = unstackingMode2 ;//拆垛模式
                            item.UnstackingMode = unstackingMode2;//拆垛模式
                            Db.Updateable(item).ExecuteCommand();
                            flagList.Add(0);
                            #endregion
@@ -6001,7 +6280,7 @@
                throw new Exception(e.Message);
            }
        }
        //重新下发出库任务
        public OutCommandDto AgainSendSoTask(string taskNo, int userId, string url)
        {
@@ -6324,7 +6603,7 @@
        }
        #endregion
        /// <summary>
        /// 判断出库是否需要拆箱
@@ -6443,7 +6722,7 @@
                {
                    sqlPub += $"AND tb1.IsDespatch = '{isDespatch}' ";
                }
                if (logisticsId != null)
                if (logisticsId != null)
                {
                    sqlPub += $"AND tb1.LogisticsId = '{logisticsId}' ";
                }