test
9 小时以前 98e221d6dc26183efab868ee5f11a65d5791304e
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
{
@@ -305,26 +306,26 @@
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public SoResInfo ErpAddExportNotice(SoInfo model)
        public SoResInfo ErpAddExportNotice(SendSoVm model)
        {
            try
            {
                if (string.IsNullOrEmpty(model.SoType))
                if (string.IsNullOrEmpty(model.orderType))
                {
                    throw new Exception("单据类型不可为空!");
                }
                if (string.IsNullOrEmpty(model.OrderCode))
                if (string.IsNullOrEmpty(model.orderNo))
                {
                    throw new Exception("系统单号不可为空!");
                    throw new Exception("出库单号不可为空!");
                }
                if (model.SoDetails.Count <= 0)
                if (model.orderDetailList.Count <= 0)
                {
                    throw new Exception("出库单明细不可为空!");
                }
                //返回信息
                SoResInfo result = new SoResInfo();
                var skuNos = model.SoDetails.Select(a => a.SkuNo).Distinct().ToList();
                var skuNos = model.orderDetailList.Select(a => a.skuNo).Distinct().ToList();
                //根据物料号获取物料信息
                var skuList = Db.Queryable<SysMaterials>().Where(a => skuNos.Contains(a.SkuNo) && a.IsDel == "0").ToList();
                //获取库存明细
@@ -333,23 +334,24 @@
                var stockList = Db.Queryable<DataStock>().Where(s => skuNos.Contains(s.SkuNo) && (s.Qty - s.FrozenQty - s.LockQty) > 0).ToList();
                string CustomerName = string.Empty;
                if (!string.IsNullOrEmpty(model.Customer))
                if (!string.IsNullOrEmpty(model.customerNo))
                {
                    //客户信息
                    var customer = Db.Queryable<SysCustomer>().First(m => m.IsDel == "0" && m.CustomerNo == model.Customer);
                    if (customer == null)
                    var customer = Db.Queryable<SysCustomer>().First(m => m.IsDel == "0" && m.CustomerNo == model.customerNo);
                    if (customer != null)
                    {
                        throw new Exception("客户信息不存在!");
                        //throw new Exception("客户信息不存在!");
                        CustomerName = customer.CustomerName;
                    }
                    CustomerName = customer.CustomerName;
                }
                //承运商信息
                var logistics = Db.Queryable<SysLogisticsInfo>().First(m => m.IsDel == "0" && m.CarrierName == model.LogisticsNo);
                int? logisticsId = null;
                if (logistics != null)
                {
                    logisticsId = logistics.Id;
                }
                //承运商信息
                //var logistics = Db.Queryable<SysLogisticsInfo>().First(m => m.IsDel == "0" && m.CarrierName == model.LogisticsNo);
                //int? logisticsId = null;
                //if (logistics != null)
                //{
                //    logisticsId = logistics.Id;
                //}
                var billNo = "";
                var bl = true;
                do
@@ -366,52 +368,64 @@
                try
                {
                    var list = new List<BllExportNoticeDetail>();
                    var houseNo = string.Empty;
                    //添加出库单
                    foreach (var d in model.SoDetails)
                    foreach (var d in model.orderDetailList)
                    {
                        if (d.Qty < 1)
                        if (!string.IsNullOrEmpty(houseNo))
                        {
                            if (houseNo != d.wareHouseNo)
                            {
                                throw new Exception("同个出库单下明细列表发出仓库不一致!");
                            }
                        }
                        else
                        {
                            houseNo = d.wareHouseNo;
                        }
                        if (d.skuQty < 1)
                        {
                            throw new Exception("出库数量必须大于0");
                        }
                        var sku = skuList.FirstOrDefault(a => a.SkuNo == d.SkuNo);
                        var sku = skuList.FirstOrDefault(a => a.SkuNo == d.skuNo);
                        if (sku == null)
                        {
                            throw new Exception($"物料信息中未查询到出库物料信息:{d.SkuNo}");
                            throw new Exception($"物料信息中未查询到出库物料信息:{d.skuNo}");
                        }
                        //0:成品出库、1:领料出库、3:物料取样出库、4:不合格品出库、6:代储出库、7:其他出库、 ///2:抽检出库、5:中间品出库、8:寄存出库
                        if (model.SoType == "0" || model.SoType == "3" || model.SoType == "4" || model.SoType == "7")
                        if (model.orderType == "0" || model.orderType == "3" || model.orderType == "4" || model.orderType == "7")
                        {
                            if (string.IsNullOrWhiteSpace(d.LotNo))
                            if (string.IsNullOrWhiteSpace(d.lotNo))
                            {
                                throw new Exception("批次不可为空!");
                            }
                        }
                        }
                        //库存明细
                        List<DataStockDetail> stockDetails;
                        //指定批次
                        if (!string.IsNullOrWhiteSpace(d.LotNo))
                        if (!string.IsNullOrWhiteSpace(d.lotNo))
                        {
                            stockDetails = stockDetailList.Where(s => s.SkuNo == d.SkuNo && s.LotNo == d.LotNo).ToList();
                            stockDetails = stockDetailList.Where(s => s.SkuNo == d.skuNo && s.LotNo == d.lotNo).ToList();
                            if (stockDetails.Count < 1)
                            {
                                throw new Exception($"库存中未查询到出库物料信息:{d.SkuNo}");
                                throw new Exception($"库存中未查询到出库物料信息:{d.skuNo}");
                            }
                            //判断数量
                            var qty = stockDetails.Sum(s => s.Qty - s.FrozenQty - s.LockQty);
                            if (d.Qty > qty)
                            if (d.skuQty > qty)
                            {
                                throw new Exception($"总库存中出库物料信息:{d.SkuNo}、{d.LotNo} 库存数量不足");
                                throw new Exception($"总库存中出库物料信息:{d.skuNo}、{d.lotNo} 库存数量不足");
                            }
                            //库存信息
                            var stockInfo = stockList.First(w => w.SkuNo == d.SkuNo && w.LotNo == d.LotNo);
                            var stockInfo = stockList.First(w => w.SkuNo == d.skuNo && w.LotNo == d.lotNo);
                            if (stockInfo == null)
                            {
                                throw new Exception($"总库存中未查询到出库物料信息:{d.SkuNo}");
                                throw new Exception($"总库存中未查询到出库物料信息:{d.skuNo}");
                            }
                            //判断总库存数量
                            if (d.Qty > stockInfo.Qty - stockInfo.FrozenQty - stockInfo.LockQty)
                            if (d.skuQty > stockInfo.Qty - stockInfo.FrozenQty - stockInfo.LockQty)
                            {
                                throw new Exception($"总库存中出库物料信息:{d.SkuNo}、{d.LotNo} 库存数量不足");
                                throw new Exception($"总库存中出库物料信息:{d.skuNo}、{d.lotNo} 库存数量不足");
                            }
                            //添加出库单明细
                            var noticeDetail = new BllExportNoticeDetail()
@@ -420,36 +434,36 @@
                                SkuNo = sku.SkuNo,
                                SkuName = sku.SkuName,
                                Standard = sku.Standard,
                                LotNo = d.LotNo,
                                LotNo = d.lotNo,
                                LotText = stockInfo.LotText,
                                Qty = d.Qty,
                                Qty = d.skuQty,
                                AllotQty = 0,
                                FactQty = 0,
                                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.skuQty,
                                IsBale = "",
                                IsBelt = "",
                                SupplierLot = stockInfo.SupplierLot,
                                IsWave = "0",
                                WaveNo = "",
                                IsIssueLotNo = string.IsNullOrWhiteSpace(d.LotNo) ? "0" : "1",
                                IsMixBox = d.IsMixBox,
                                IsIssueLotNo = string.IsNullOrWhiteSpace(d.lotNo) ? "0" : "1",
                                IsMixBox = "0",
                                OrderDetailCode = d.OrderDetailCode,
                                OrderDetailCode = d.lineNo,
                                CreateUser = 0,
                            };
                            list.Add(noticeDetail);
                            //更新库存锁定数量
                            stockInfo.LockQty += d.Qty;
                            stockInfo.LockQty += d.skuQty;
                            var i = Db.Updateable(stockInfo).UpdateColumns(it => new { it.LockQty }).ExecuteCommand();
                            SoDetailInfo soDetail = new SoDetailInfo();
                            soDetail.OrderDetailCode = d.OrderDetailCode;
                            soDetail.LockQty = d.Qty;
                            soDetail.LotNo = d.LotNo;
                            soDetail.OrderDetailCode = d.lineNo;
                            soDetail.LockQty = d.skuQty;
                            soDetail.LotNo = d.lotNo;
                            soDetailList.Add(soDetail);
                        }
@@ -458,12 +472,12 @@
                            Dictionary<int, decimal> dic = new Dictionary<int, decimal>();
                            decimal q1 = 0;
                            //首先查询当前这种物料批次号为空的
                            stockDetails = stockDetailList.Where(s => s.SkuNo == d.SkuNo && string.IsNullOrWhiteSpace(s.LotNo)).ToList();
                            stockDetails = stockDetailList.Where(s => s.SkuNo == d.skuNo && string.IsNullOrWhiteSpace(s.LotNo)).ToList();
                            if (stockDetails.Count > 0)
                            {
                                q1 = (decimal)stockDetails.Sum(s => s.Qty - s.FrozenQty - s.LockQty);
                                //库存信息
                                var stockInfo = stockList.FirstOrDefault(w => w.SkuNo == d.SkuNo && string.IsNullOrWhiteSpace(w.LotNo));
                                var stockInfo = stockList.FirstOrDefault(w => w.SkuNo == d.skuNo && string.IsNullOrWhiteSpace(w.LotNo));
                                if (stockInfo != null)
                                {
                                    var q2 = stockInfo.Qty - stockInfo.FrozenQty - stockInfo.LockQty;
@@ -471,29 +485,29 @@
                                    {
                                        q1 = q2;
                                    }
                                    if (d.Qty > q1)
                                    if (d.skuQty > q1)
                                    {
                                        dic.Add(stockInfo.Id, q1);
                                    }
                                    else
                                    {
                                        dic.Add(stockInfo.Id, d.Qty);
                                        dic.Add(stockInfo.Id, d.skuQty);
                                    }
                                }
                            }
                            //如果批次号为空的数量不够,根据批次先进先出原则查找其它批次的
                            if (d.Qty > q1)
                            if (d.skuQty > q1)
                            {
                                stockDetails = stockDetailList.Where(m => m.SkuNo == d.SkuNo && !string.IsNullOrWhiteSpace(m.LotNo)).OrderBy(s => s.LotNo).ToList();
                                stockDetails = stockDetailList.Where(m => m.SkuNo == d.skuNo && !string.IsNullOrWhiteSpace(m.LotNo)).OrderBy(s => s.LotNo).ToList();
                                foreach (var demo in stockDetails)
                                {
                                    if (q1 >= d.Qty)
                                    if (q1 >= d.skuQty)
                                    {
                                        break;
                                    }
                                    var q2 = demo.Qty - demo.FrozenQty - demo.LockQty;
                                    //库存信息
                                    var stockInfo = stockList.FirstOrDefault(w => w.SkuNo == d.SkuNo && w.LotNo == demo.LotNo);
                                    var stockInfo = stockList.FirstOrDefault(w => w.SkuNo == d.skuNo && w.LotNo == demo.LotNo);
                                    if (stockInfo == null)
                                    {
                                        continue;
@@ -508,21 +522,21 @@
                                    {
                                        q2 = q3;
                                    }
                                    if (q2 > d.Qty - q1)
                                    {
                                    if (q2 > d.skuQty - q1)
                                    {
                                        if (!dic.ContainsKey(stockInfo.Id))
                                        {
                                            dic.Add(stockInfo.Id, d.Qty - q1);
                                            dic.Add(stockInfo.Id, d.skuQty - q1);
                                        }
                                        else
                                        {
                                            //更新值
                                            dic[stockInfo.Id] += d.Qty - q1;
                                            dic[stockInfo.Id] += d.skuQty - q1;
                                        }
                                        q1 += d.Qty - q1;
                                        q1 += d.skuQty - q1;
                                    }
                                    else
                                    {
                                    {
                                        if (!dic.ContainsKey(stockInfo.Id))
                                        {
                                            dic.Add(stockInfo.Id, (decimal)q2);
@@ -536,9 +550,9 @@
                                    }
                                }
                            }
                            if (d.Qty > q1)
                            if (d.skuQty > q1)
                            {
                                throw new Exception($"总库存中出库物料信息:{d.SkuNo} 库存数量不足");
                                throw new Exception($"总库存中出库物料信息:{d.skuNo} 库存数量不足");
                            }
                            foreach (var s in dic)
                            {
@@ -546,7 +560,7 @@
                                var item = new BllExportNoticeDetail()
                                {
                                    SONo = billNo,
                                    OrderDetailCode = d.OrderDetailCode,
                                    OrderDetailCode = d.lineNo,
                                    SkuNo = sku.SkuNo,
                                    SkuName = sku.SkuName,
                                    Standard = sku.Standard,
@@ -558,14 +572,14 @@
                                    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.skuQty,
                                    IsBale = "",
                                    IsBelt = "",
                                    SupplierLot = st.SupplierLot,
                                    IsWave = "0",
                                    WaveNo = "",
                                    IsIssueLotNo = string.IsNullOrWhiteSpace(d.LotNo) ? "0" : "1",
                                    IsMixBox = d.IsMixBox,
                                    IsIssueLotNo = string.IsNullOrWhiteSpace(d.lotNo) ? "0" : "1",
                                    IsMixBox = "0",
                                    CreateUser = 0,
                                };
@@ -575,7 +589,7 @@
                                var i = Db.Updateable(st).UpdateColumns(it => new { it.LockQty }).ExecuteCommand();
                                SoDetailInfo soDetail = new SoDetailInfo();
                                soDetail.OrderDetailCode = d.OrderDetailCode;
                                soDetail.OrderDetailCode = d.lineNo;
                                soDetail.LockQty = s.Value;
                                soDetail.LotNo = st.LotNo;
@@ -586,19 +600,38 @@
                    var notice = new BllExportNotice()
                    {
                        SONo = billNo,
                        OrderCode=model.OrderCode,
                        Type = model.SoType,
                        OrderCode = model.orderNo,
                        Type = model.orderType,
                        Status = "0",
                        Origin = "WMS",
                        CustomerNo = model.Customer,
                        Origin = "SAP",
                        CustomerNo = model.customerNo,
                        CustomerName = CustomerName,
                        LogisticsId = logisticsId,
                        LogisticsId = null,//logisticsId,
                        IsWave = "0",
                        WaveNo = "",
                        IsDespatch = "0",
                        CreateUser = 0,
                    };
                    if (houseNo == "1000" || houseNo == "1001" || houseNo == "2000" || houseNo == "2002" || houseNo == "2003" || houseNo == "2004")
                    {
                        notice.WareHouseNo = "W02";
                    }
                    else if (houseNo == "4000")
                    {
                        notice.WareHouseNo = "W01";
                    }
                    else
                    {
                        // 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();
@@ -630,7 +663,7 @@
        }
        //回传出库单
        public bool FinishSo(int id, string url, int userId)
        public bool FinishSo(int id, string url, string url2, int userId)
        {
            try
            {
@@ -652,34 +685,83 @@
                {
                    throw new Exception("复核失败,复核人员和关闭订单人员不能相同!");
                }
                var list = new List<SoDetail>();
                foreach (var d in detail)
                if (notice.Type == "2")//抽检出库
                {
                    var item = new SoDetail()
                    var list = new List<SendSampleSku>();
                    foreach (var d in detail)
                    {
                        SkuNo = d.SkuNo,
                        LotNo = d.LotNo,
                        Qty = (decimal)d.CompleteQty
                    };
                    list.Add(item);
                }
                var soInfo = new SoInfo()
                {
                    OrderCode = notice.OrderCode,
                    SoDetails = list
                };
                #region 通过接口发送至erp
                //系统对接后放开
                /*var jsonData = JsonConvert.SerializeObject(soInfo);
                        var item = new SendSampleSku()
                        {
                            skuNo = d.SkuNo,
                            skuName = d.SkuName,
                            lotNo = d.LotNo,
                            skuQty = Convert.ToDecimal(d.CompleteQty)
                        };
                        list.Add(item);
                    }
                    SendSampleVm sendSampleVm = new SendSampleVm();
                    sendSampleVm.pallDataList = list;
                var response = HttpHelper.DoPost(url, jsonData, "出库单完成上传", "ERP");
                var obj = JsonConvert.DeserializeObject<ErpModel>(response);//解析返回数据
                if (obj.Success != 0)
                    SapSampleVm sapSampleVm = new SapSampleVm();
                    sapSampleVm.data = sendSampleVm;
                    #region 通过接口发送至erp
                    //系统对接后放开
                    /*var jsonData = JsonConvert.SerializeObject(sapSampleVm);
                    var response = HttpHelper.DoPost(url2, jsonData, "抽检出库完成上传", "ERP");
                    var obj = JsonConvert.DeserializeObject<ErpModel>(response);//解析返回数据
                    if (obj.Success != 0)
                    {
                        throw new Exception("上传失败" + obj.Message);
                    }*/
                    #endregion
                }
                else
                {
                    throw new Exception("上传失败" + obj.Message);
                }*/
                #endregion
                    var list = new List<BackSoDetail>();
                    foreach (var d in detail)
                    {
                        var mater = Db.Queryable<SysMaterials>().First(w => w.IsDel == "0" && w.SkuNo == d.SkuNo);
                        if (mater == null)
                        {
                            throw new Exception($"复核失败,物料编码:{d.SkuNo}的物料信息不存在");
                        }
                        var item = new BackSoDetail()
                        {
                            POSNR = d.OrderDetailCode,
                            MATNR = d.SkuNo,
                            CHARG = d.LotNo,
                            LFIMG = d.CompleteQty.ToString(),
                            MEINS = mater.UnitNo,
                            HSDAT = "",
                            VFDAT = ""
                        };
                        list.Add(item);
                    }
                    var soInfo = new BackSoVm()
                    {
                        ZUUID = Guid.NewGuid().ToString(),
                        VBELN = notice.OrderCode,
                        WERKS = notice.CustomerNo,
                        LFART = notice.Type,
                        WADAT_IST = Convert.ToDateTime(notice.CompleteTime).ToString("yyyy-MM-dd"),
                        ITEM = list
                    };
                    #region 通过接口发送至erp
                    //系统对接后放开
                    var jsonData = JsonConvert.SerializeObject(soInfo);
                    var response = HttpHelper.DoPost(url, jsonData, "出库单完成上传", "ERP");
                    var obj = JsonConvert.DeserializeObject<ErpModel>(response);//解析返回数据
                    if (obj.Success != 0)
                    {
                        throw new Exception("上传失败" + obj.Message);
                    }
                    #endregion
                }
                notice.Status = "6";
                notice.CheckTime = DateTime.Now;
@@ -694,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("未查询到此工单号");
@@ -722,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("此投料口有其它单据物料叫料信息");
@@ -753,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();
@@ -781,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);
@@ -790,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();
                }
@@ -806,7 +888,7 @@
                    Db.RollbackTran();
                    throw new Exception(e.Message);
                }
                return true;
            }
            catch (Exception e)
@@ -846,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,
@@ -906,7 +988,7 @@
                switch (type)//0:原料 1:包材 2:成品 3:耗材 4:半成品
                {
                    case "0"://成品出库
                        if (house !="W01")
                        if (house != "W01")
                        {
                            throw new Exception("成品出库只能选择成品库");
                        }
@@ -1014,7 +1096,7 @@
                    skuList = skuList.Where(m => m.SkuNo == "100088").ToList();
                }
                skuStrList = skuList.Select(m => m.SkuNo).ToList();
                var areaStr = new List<string>() { "B02", "B05", "B08" };
                var areaStr = new List<string>() { "B06", "B07", "B09" };
                var stockRst = new StockServer();
                var stockDetailRst = new StockDetailServer();
                Expression<Func<DataStockDetail, bool>> item = Expressionable.Create<DataStockDetail>()
@@ -1105,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("仓库与出库物料不符");
                        }
@@ -1874,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))
@@ -1998,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 == "W01")
                   .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");
@@ -2038,6 +2120,12 @@
                if (detailGroup.Count > 1)
                {
                    throw new Exception($"未在库内查询到该托盘信息");
                }
                var locatStart = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.LocatNo == outMode && w.Status == "0");
                if (locatStart == null)
                {
                    throw new Exception($"目标储位不存在或非空闲,请检查");
                }
@@ -2151,14 +2239,16 @@
                    outDtoList.Add(new OutCommandDto()
                    {
                        TaskNo = exTask.TaskNo, // 任务号
                        TaskType = "1",// 任务类型 (出库)
                        PalletNo = palletNo,//托盘号
                        StartLocate = locate.LocatNo, // 起始位置
                        StartRoadway = locate.RoadwayNo,
                        EndLocate = outMode, // 目标位置 
                        TaskNo = exTask.TaskNo, // 任务号
                        TaskType = "1",// 任务类型 (出库)
                        OutMode = outMode,  //目标地址
                        Order = 1
                        Order = 999,
                        Type = PLCTypeEnum.AGV
                    });
                    #endregion
@@ -2179,6 +2269,8 @@
                    Db.Updateable(locate).ExecuteCommand();
                    locatStart.Status = "2";//要入库的储位改变状态 正在入库
                    Db.Updateable(locate).ExecuteCommand();
                    #endregion
                    //添加操作日志记录
@@ -2222,6 +2314,264 @@
                    }
                    return outDtoList;
                }
                catch (Exception e)
                {
                    Db.RollbackTran();
                    throw new Exception(e.Message);
                }
                #endregion
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
        }
        /// <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)
                {
@@ -2425,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)
@@ -2976,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("未查询到出库单信息");
@@ -3034,7 +3384,7 @@
                    foreach (var item in list)
                    {
                        var outModeLocate = "";
                        if (outMode == "1")
                        if (outMode == "17")
                        {
                            if (i < outLocatelist1.Count)
                            {
@@ -3043,11 +3393,11 @@
                            else
                            {
                                var j = i % outLocatelist1.Count;
                                outModeLocate = outLocatelist1[j].LocatNo;
                            }
                        }
                        else if(outMode == "2")
                        else if (outMode == "18")
                        {
                            if (i < outLocatelist1.Count)
                            {
@@ -3060,9 +3410,13 @@
                                outModeLocate = outLocatelist2[j].LocatNo;
                            }
                        }
                        else
                        {
                            throw new Exception("出库口工位异常");
                        }
                        var taskNoStr = "";
                        // 储位号
                        var locateNo = outStockDetail.First(m => m.PalletNo == item.PalletNo).LocatNo;
@@ -3105,7 +3459,7 @@
                            }
                            flagList.Add(0);
                            continue;
                        }
                        var locate = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == locateNo && m.IsDel == "0");//当前出库的储位信息
@@ -3126,7 +3480,7 @@
                        if (locate.Status == "1") //有物品
                        {
                            #region 添加出库任务
                            var taskNo = new Common().GetMaxNo("TK");
                            var exTask = new LogTask    //出库任务
                            {
@@ -3158,13 +3512,13 @@
                                StartLocate = locate.LocatNo, // 起始位置
                                StartRoadway = locate.RoadwayNo,//其实巷道
                                EndLocate = outModeLocate, // 目标位置 
                                Order = 999,
                                Type  = PLCTypeEnum.AGV
                                Type = PLCTypeEnum.AGV
                            });
                            taskNoStr = exTask.TaskNo;
                            #endregion
                            #region 改变数据
@@ -3252,7 +3606,7 @@
                            flagList.Add(1);
                        }
                    }
                    //添加操作日志记录
                    var k = new OperationSOServer().AddLogOperationSo("出库作业", "出库单据", soNo, "出库", $"点击出库按钮出库单号为:{soNo}的出库单", userId);
                    Db.CommitTran();
@@ -3300,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)
                            //{
@@ -3367,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");
                //包装表
@@ -3376,12 +3730,13 @@
                try
                {
                    List<LogTask> logTaskList = new List<LogTask>();//此次出库任务集合,为应对同托盘不同物料出库
                    //循环分配的信息生成出库任务
                    foreach (var item in list)
                    {
                        var taskNoStr = "";
                        string toLocation = string.Empty;//目标位置
                        // 储位号
                        var locateNo = outStockDetail.First(m => m.PalletNo == item.PalletNo).LocatNo;
@@ -3390,11 +3745,11 @@
                        //判断托盘是否在库内
                        if (string.IsNullOrWhiteSpace(locateNo)) //库外
                        {
                            if (notice.Type == "0")
                            {
                                flagList.Add(5);
                                continue;
                            }
                            //if (notice.Type == "0")
                            //{
                            //    flagList.Add(5);
                            //    continue;
                            //}
                            //判断托盘是否在入库中
                            var imBl = com.GetImTask(item.PalletNo);
                            if (imBl != null)
@@ -3432,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);
@@ -3447,11 +3802,9 @@
                        #endregion
                        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);
@@ -3473,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);
@@ -3515,15 +3868,15 @@
                                                Type = "2",//任务类型 0 入库任务 1 出库任务  2 移库任务
                                                Status = "0",//任务状态0:等待执行1正在执行2执行完成
                                                OrderType = "1",//0 入库单 1 出库单  2 盘点单  3 移库单
                                                Msg = "从" + locate.LocatNo + "到" + toLocation + "的出库任务", //关键信息
                                                Msg = "从" + locate.LocatNo + "到" + moveAddress + "的移库任务", //关键信息
                                            };
                                            Db.Insertable(ykTask).ExecuteCommand();
                                            logTaskList.Add(ykTask);
                                            outDto1.Add(new OutCommandDto()
                                            {
                                                PalletNo = item.PalletNo,//托盘号
                                                StartLocate = locate.LocatNo, // 起始位置
                                                PalletNo = ykTask.PalletNo,//托盘号
                                                StartLocate = ykTask.StartLocat, // 起始位置
                                                StartRoadway = locate.RoadwayNo,//其实巷道
                                                EndLocate = moveAddress,//outMode, // 目标位置 
                                                TaskNo = ykTaskNo, // 任务号
@@ -3531,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);
@@ -3553,7 +3906,7 @@
                                }
                            }
                            #region 添加出库任务
                            var taskNo = new Common().GetMaxNo("TK");
                            var exTask = new LogTask    //出库任务
                            {
@@ -3563,7 +3916,7 @@
                                IsSuccess = 0, //是否下发成功 0失败 1成功
                                StartLocat = locate.LocatNo,//起始位置
                                EndLocat = toLocation,//outMode,//目标位置
                                EndLocat = outMode,//outMode,//目标位置
                                PalletNo = item.PalletNo,//托盘码
                                IsSend = 1,//是否可再次下发
                                IsCancel = 1,//是否可取消
@@ -3571,11 +3924,11 @@
                                Type = "1",//任务类型 0 入库任务 1 出库任务  2 移库任务
                                Status = "0",//任务状态0:等待执行1正在执行2执行完成
                                OrderType = "1",//0 入库单 1 出库单  2 盘点单  3 移库单
                                Msg = "从" + locate.LocatNo + "到" + toLocation + "的出库任务", //关键信息
                                Msg = "从" + locate.LocatNo + "到" + outMode + "的出库任务", //关键信息
                            };
                            Db.Insertable(exTask).ExecuteCommand();
                            logTaskList.Add(exTask);
                            var endroad = allot.RoadwayToStationNum(locate.RoadwayNo, toLocation);
                            var endroad = allot.RoadwayToStationNum(locate.RoadwayNo, outMode);
                            outDto1.Add(new OutCommandDto()
                            {
                                PalletNo = item.PalletNo,//托盘号
@@ -3591,7 +3944,7 @@
                            });
                            taskNoStr = exTask.TaskNo;
                            #endregion
                            #region 改变数据
@@ -3715,23 +4068,23 @@
                        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<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)
                        {
@@ -3765,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)
            {
                //储位小于通道口   倒序
@@ -3837,7 +4190,7 @@
            {
                return nowAddress;
            }
            return nowAddress;
        }
@@ -3860,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);
@@ -3891,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>
@@ -4102,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;
@@ -4117,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)
@@ -4132,11 +4499,11 @@
                    location = slotModel[slotModel.Count - 1].LocatNo;
                }
                bl = true;
            }
            return bl;
        }
@@ -4151,7 +4518,7 @@
            public string LocatNo { get; set; }
            public int Column { get; set; }
            public string AisleOne { get; set; }
        }
        /// <summary>
@@ -4230,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")
@@ -4251,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);
@@ -4335,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;
@@ -4352,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)
                        {
@@ -4369,7 +4736,7 @@
                        }
                        Db.Updateable(stockDetail).ExecuteCommand();
                    }
                    #endregion
@@ -4396,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("任务状态不是正在执行,请核实");
                }
@@ -4410,7 +4777,7 @@
                {
                    throw new Exception("没有查询到起始储位信息");
                }
                if (locate.WareHouseNo!="W04")
                if (locate.WareHouseNo != "W04")
                {
                    throw new Exception("起始储位不是平库储位,请核实");
                }
@@ -4435,7 +4802,7 @@
            }
        }
        #endregion
        #endregion
@@ -4457,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("当前出库单已生成备料任务,无需重复点击");
                }
@@ -4469,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();
@@ -4481,7 +4848,7 @@
                throw new Exception(e.Message);
            }
        }
        // JC23 备料定时任务开始 领料单备料下发出库(调用wcs接口给他库位地址)
        public List<OutCommandDto> BeiLiaoIssueOutHouse(string url)
        {
@@ -4575,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();
@@ -4602,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();
@@ -4991,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;
@@ -5004,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)
                        {
                            //添加下发任务的信息
@@ -5029,12 +5396,12 @@
                            //item2.Status = "1";
                            //Db.Updateable(item2).ExecuteCommand();
                        }
                        //return outlist;
                    }
                }
                if (outlist.Count>0)
                if (outlist.Count > 0)
                {
                    //将任务发送至AGV
                    // 正式运行程序放开
@@ -5053,8 +5420,8 @@
                        //if (wcsModel.StatusCode == 0)
                        //{
                        //    //更改任务的发送返回时间//
                           new TaskServer().EditTaskIssueOk(list2, time1, time2);
                        new TaskServer().EditTaskIssueOk(list2, time1, time2);
                        //}
                        //if (wcsModel.StatusCode == -1)
                        //{
@@ -5067,7 +5434,7 @@
                        throw new Exception(ex.Message);
                    }
                }
                return null;
            }
            catch (Exception e)
@@ -5092,7 +5459,7 @@
                {
                    throw new Exception("当前任务已完成");
                }
                Db.BeginTran();
                //库存中当前托盘的信息
                var stockDetail = Db.Queryable<DataStockDetail>().Where(m => m.PalletNo == task.PalletNo).ToList();
@@ -5130,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();
@@ -5172,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();
                                }
@@ -5229,7 +5596,7 @@
                                //删除库存箱码明细
                                Db.Deleteable(item2).ExecuteCommand();
                            }
                            if (comList.Count>0)
                            if (comList.Count > 0)
                            {
                                Db.Insertable(comList).ExecuteCommand();
                            }
@@ -5258,9 +5625,9 @@
                            #endregion
                            #region 出库流水(更改状态)
                            allot.Status = "5";
                            if (stockInfoList.Count == 0)
                            {
                                allot.CompleteQty += item.LockQty;
@@ -5274,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;
@@ -5289,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
@@ -5314,7 +5681,7 @@
                                }
                            }
                        }
                        item.LocatNo = locate2.LocatNo;//储位更改(改为空)
                        item.WareHouseNo = locate2.WareHouseNo;//所属仓库更改(改为空)
                        item.RoadwayNo = locate2.RoadwayNo;//所属巷道更改(改为空)
@@ -5688,7 +6055,7 @@
                                                    OutMode = toLocation,  //目标地址
                                                    Order = 1,
                                                });
                                                #endregion
@@ -5778,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();
@@ -5822,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
@@ -5913,7 +6280,7 @@
                throw new Exception(e.Message);
            }
        }
        //重新下发出库任务
        public OutCommandDto AgainSendSoTask(string taskNo, int userId, string url)
        {
@@ -6236,7 +6603,7 @@
        }
        #endregion
        /// <summary>
        /// 判断出库是否需要拆箱
@@ -6355,7 +6722,7 @@
                {
                    sqlPub += $"AND tb1.IsDespatch = '{isDespatch}' ";
                }
                if (logisticsId != null)
                if (logisticsId != null)
                {
                    sqlPub += $"AND tb1.LogisticsId = '{logisticsId}' ";
                }