chengsc
2025-01-18 76b08b437e41cb6a3118c87636bc1777a110185a
Wms/WMS.BLL/BllSoServer/ExportNoticeServer.cs
@@ -24,6 +24,12 @@
using WMS.IBLL.IBllSoServer;
using Model.ModelVm;
using System.Runtime.Intrinsics.X86;
using WMS.Entity.BllAsnEntity;
using Model.ModelDto;
using WMS.BLL.BllPdaServer;
using WMS.IBLL.IPdaServer;
using System.DirectoryServices.Protocols;
using Model.ModelDto.SysDto;
namespace WMS.BLL.BllSoServer
{
@@ -41,7 +47,7 @@
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public bool ErpAddExportNotice(SoInfo model)
        public void HttpAddExportNotice(SoInfo model)
        {
            try
            {
@@ -49,11 +55,11 @@
                {
                    throw new Exception("单据类型不可为空!");
                }
                if (string.IsNullOrEmpty(model.Customer))
                {
                    throw new Exception("客户不可为空!");
                }
                if (string.IsNullOrEmpty(model.OrderCode))
                //if (string.IsNullOrEmpty(model.Customer))
                //{
                //    throw new Exception("客户不可为空!");
                //}
                if (string.IsNullOrEmpty(model.OrderNo))
                {
                    throw new Exception("系统单号不可为空!");
                }
@@ -68,10 +74,10 @@
                //客户信息
                var customer = Db.Queryable<SysCustomer>().First(m => m.IsDel == "0" && m.CustomerNo == model.Customer);
                if (customer == null)
                {
                    throw new Exception("客户不可为空!");
                }
                //if (customer == null)
                //{
                //    throw new Exception("客户不可为空!");
                //}
                var logistics = Db.Queryable<SysLogisticsInfo>().First(m => m.IsDel == "0" && m.CarrierName == model.LogisticsNo);
                int? logisticsId = null;
                if (logistics != null)
@@ -127,8 +133,9 @@
                            }
                            if (qty > d.Qty - q1)
                            {
                                q1 += d.Qty - q1;
                                dic.Add(stocks.First().Id, d.Qty - q1);
                                q1 += d.Qty - q1;
                            }
                            else
                            {
@@ -139,8 +146,8 @@
                        }
                        else
                        {
                            stocks = stockList.Where(m=> m.SkuNo == d.SkuNo && !string.IsNullOrWhiteSpace(m.LotNo)).OrderBy(s => s.LotNo).ToList();
                            stocks = stockList.Where(m => m.SkuNo == d.SkuNo && !string.IsNullOrWhiteSpace(m.LotNo)).OrderBy(s => s.LotNo).ToList();
                            foreach (var demo in stocks)
                            {
                                if (q1 >= d.Qty)
@@ -148,20 +155,21 @@
                                    continue;
                                }
                                var q2 = demo.Qty - demo.LockQty - demo.FrozenQty;
                                if (q2 > d.Qty - q1)
                                if (q2 >= d.Qty - q1)
                                {
                                    q1 += d.Qty - q1;
                                    dic.Add(demo.Id, d.Qty - q1);
                                    q1 += d.Qty - q1;
                                }
                                else
                                {
                                    q1 += q2;
                                    dic.Add(demo.Id,q2);
                                    dic.Add(demo.Id, q2);
                                }
                            }
                            if (d.Qty >= q1)
                            if (d.Qty > q1)
                            {
                                stocks = stockList.Where(s => s.SkuNo == d.SkuNo && string.IsNullOrWhiteSpace(s.LotNo)).ToList();
                                if (stocks.Count == 0)
@@ -169,10 +177,11 @@
                                    throw new Exception($"总库存中出库物料信息:{d.SkuNo}库存数量不足");
                                }
                                var q2 = stocks.First().Qty - stocks.First().LockQty - stocks.First().FrozenQty;
                                if (q2 > d.Qty - q1)
                                if (q2 >= d.Qty - q1)
                                {
                                    q1 += d.Qty - q1;
                                    dic.Add(stocks.First().Id, d.Qty - q1);
                                    q1 += d.Qty - q1;
                                }
                                else
                                {
@@ -185,7 +194,7 @@
                                throw new Exception($"总库存中出库物料信息:{d.SkuNo} 库存数量不足");
                            }
                        }
                        foreach (var s in dic)
                        {
                            var st = stockList.First(a => a.Id == s.Key);
@@ -214,21 +223,22 @@
                                CreateUser = 0,
                            };
                            list.Add(item);
                            st.LockQty += s.Value;//锁定数量
                            var i = Db.Updateable(st).UpdateColumns(it => new { it.LockQty })
                                .ExecuteCommand();
                        }
                    }
                    var notice = new BllExportNotice()
                    {
                        SONo = billNo,
                        Type = model.SoType,
                        Status = "0",
                        Origin = "WMS",
                        CustomerNo = model.Customer,
                        CustomerName = customer.CustomerName,
                        Origin = model.Origin,
                        OrderCode = model.OrderNo,
                        //CustomerNo = model.Customer,
                        //CustomerName = customer.CustomerName,
                        LogisticsId = logisticsId,
                        IsWave = "0",
                        WaveNo = "",
@@ -242,12 +252,10 @@
                    if (n <= 0 || m <= 0)
                    {
                        Db.RollbackTran();
                        return false;
                        throw new Exception("入库单或明细添加保存失败");
                    }
                    Db.CommitTran();
                    return true;
                }
                catch (Exception ex)
                {
@@ -259,16 +267,27 @@
            }
            catch (Exception ex)
            {
                Db.RollbackTran();
                throw new Exception(ex.Message);
            }
        }
        //回传出库单
        public bool FinishSo(int id, string url, int userId)
        public bool FinishSo(int id, string url, string userNo, string pwd, int userId)
        {
            try
            {
                var loginPwd = Md5Tools.CalcMd5(pwd);
                var date = Db.Queryable<SysUserInfor>().First(m => m.IsDel == "0" && m.UserName == userNo && m.PassWord == loginPwd);
                if (date == null) //账号密码是否正确
                {
                    throw new Exception("账号密码不正确或没有此账号");
                }
                if (date.Status != "0") //当前账号是否正常启用
                {
                    throw new Exception("当前账号非启用状态");
                }
                var notice = Db.Queryable<BllExportNotice>().First(m => m.Id == id && m.IsDel == "0");
                if (notice == null)
                {
@@ -283,7 +302,7 @@
                {
                    throw new Exception("未查询到单据明细信息");
                }
                if (userId == notice.UpdateUser)
                if (date.Id == notice.UpdateUser)
                {
                    throw new Exception("复核失败,复核人员和关闭订单人员不能相同!");
                }
@@ -300,7 +319,7 @@
                }
                var soInfo = new SoInfo()
                {
                    OrderCode = notice.OrderCode,
                    OrderNo = notice.OrderCode,
                    SoDetails = list
                };
                #region 通过接口发送至erp
@@ -318,10 +337,10 @@
                notice.Status = "6";
                notice.CheckTime = DateTime.Now;
                notice.CheckUser = userId;
                notice.CheckUser = date.Id;
                Db.Updateable(notice).ExecuteCommand();
                new OperationSOServer().AddLogOperationSo("出库作业", "出库单据", notice.SONo, "复核", $"复核了单据号为{notice.SONo}的单据信息", userId);
                new OperationSOServer().AddLogOperationSo("出库作业", "出库单据", notice.SONo, "复核", $"{date.RealName}复核了单据号为{notice.SONo}的单据信息", userId);
                return true;
            }
            catch (Exception e)
@@ -363,31 +382,31 @@
                    .LeftJoin<SysUserInfor>((a, b, c, d, e) => a.CheckUser == e.Id)
                    .Select((a, b, c, d, e) => new ExportNoticeDto()
                    {
                        Id = a.Id,
                        SONo = a.SONo,
                        Type = a.Type,
                        Status = a.Status,
                        Origin = a.Origin,
                        CustomerNo = a.CustomerNo,
                        CustomerName = a.CustomerName,
                        LotNo = a.LotNo,
                        LotText = a.LotText,
                        SupplierLot = a.SupplierLot,
                        LogisticsId = a.LogisticsId,
                        //Id = a.Id,
                        //SONo = a.SONo,
                        //Type = a.Type,
                        //Status = a.Status,
                        //Origin = a.Origin,
                        //CustomerNo = a.CustomerNo,
                        //CustomerName = a.CustomerName,
                        //LotNo = a.LotNo,
                        //LotText = a.LotText,
                        //SupplierLot = a.SupplierLot,
                        //LogisticsId = a.LogisticsId,
                        LogisticsName = b.CarrierName,
                        IsWave = a.IsWave,
                        WaveNo = a.WaveNo,
                        IsDespatch = a.IsDespatch,
                        Demo = a.Demo,
                        //IsWave = a.IsWave,
                        //WaveNo = a.WaveNo,
                        //IsDespatch = a.IsDespatch,
                        //Demo = a.Demo,
                        CreateUserName = c.RealName,
                        UpdateUserName = c.RealName,
                        CreateTime = a.CreateTime,
                        UpdateTime = a.UpdateTime,
                        //CreateTime = a.CreateTime,
                        //UpdateTime = a.UpdateTime,
                        CheckUserName = e.RealName,
                        CheckTime = a.CheckTime
                    })
                        //CheckTime = a.CheckTime
                    },true)
                    .OrderByDescending(a => a.CreateTime)
                    .ToOffsetPage(page, limit, ref total);
                count = total;
@@ -436,7 +455,7 @@
                        inspectStatus = "0";
                        break;
                    case "4"://不合格品出库
                        skuType = "(0,1,2,3)";
                        skuType = "(0,1,2,3,4)";
                        inspectStatus = "2";
                        break;
                    case "5"://中间品出库
@@ -444,8 +463,8 @@
                        inspectStatus = "0,1";
                        break;
                    case "6"://代储出库
                        skuType = "(0,1,2,3)";
                        inspectStatus = "0,1";
                        skuType = "(0,1,2,3,4)";
                        inspectStatus = "0,1,2";
                        break;
                    case "8"://寄存出库
                        skuType = "(0,1,2,3)";
@@ -462,7 +481,7 @@
                    throw new Exception("未查到对应出库类型的物料");
                }
                if (type!="8")
                if (type != "8")
                {
                    skuList = skuList.Where(m => m != "100088").ToList();
                }
@@ -478,6 +497,7 @@
                    .AndIF(!string.IsNullOrWhiteSpace(inspectStatus), it => inspectStatus.Contains(it.InspectStatus))
                    .And(m => skuList.Contains(m.SkuNo))
                    .AndIF(type == "6", m => m.OwnerNo == ownerNo)//代储出库需要关联货主
                    .AndIF(type != "6", m=> string.IsNullOrWhiteSpace(m.OwnerNo))
                    .AndIF(!string.IsNullOrWhiteSpace(msg), it => (it.SkuNo.Contains(msg) || it.SkuName.Contains(msg) || it.LotNo.Contains(msg)))
                    .And(it => (it.Qty - it.LockQty - it.FrozenQty) > 0)
                    .And(it => (it.Status == "0" || it.Status == "1"))
@@ -506,7 +526,8 @@
                    SkuName = it.SkuName,
                    LotNo = it.LotNo,
                    Standard = it.Standard,
                    Qty = type == "4" ? it.Qty : it.Qty - it.LockQty - it.FrozenQty
                    //Qty = type == "4" ? it.Qty : it.Qty - it.LockQty - it.FrozenQty,
                    Qty = it.Qty - it.LockQty - it.FrozenQty,
                }).ToList();
@@ -580,7 +601,7 @@
                    //添加出库单
                    foreach (var d in model.Detail)
                    {
                        if (d.Qty < 1)
                        if (d.Qty <=0)
                        {
                            throw new Exception("出库数量必须大于0");
                        }
@@ -644,7 +665,7 @@
                            //}
                            //if (d.Qty >= q1)
                            //{
                                stocks = stockList.Where(s => s.SkuNo == d.SkuNo && string.IsNullOrWhiteSpace(s.LotNo)).ToList();
                            stocks = stockList.Where(s => s.SkuNo == d.SkuNo && string.IsNullOrWhiteSpace(s.LotNo)).ToList();
                            //    if (stocks.Count == 0)
                            //    {
                            //        throw new Exception($"总库存中出库物料信息:{d.SkuNo}库存数量不足");
@@ -666,7 +687,7 @@
                            //    throw new Exception($"总库存中出库物料信息:{d.SkuNo} 库存数量不足");
                            //}
                        }
                        var item = new BllExportNoticeDetail()
                        {
                            SONo = billNo,
@@ -693,7 +714,7 @@
                        };
                        list.Add(item);
                        stocks.First().LockQty += d.Qty;//锁定数量
                        var i = Db.Updateable(stocks.First()).UpdateColumns(it => new { it.LockQty })
                            .ExecuteCommand();
@@ -1232,9 +1253,9 @@
                {
                    throw new Exception("未查询到出库单据信息");
                }
                if (notice.Status != "4")
                if (notice.Status != "4" && notice.Status != "3")
                {
                    throw new Exception("参数异常,请检查状态是否为执行完成或订单关闭");
                    throw new Exception("参数异常,请检查状态是否为正在执行或执行完成");
                }
                //总库存信息
                var stockList = Db.Queryable<DataStock>().ToList();
@@ -1255,64 +1276,67 @@
                    foreach (var d in noticeDetail)
                    {
                        //更改库存明细锁定数量
                        //var orders = dataContext.WmsExportOrder.Where(o => o.ExportDetailId == d.Id
                        //                && o.ExportExecuteFlag != "4" && o.ExportExecuteFlag == "3" && o.pickingType == 0).ToList();
                        //foreach (var o in orders)
                        //{
                        //    if (o.ExportQuantity > o.PickedNum) //判断拣货是否已拣完
                        //    {
                        //        var pq = dataContext.WmsStockTray.Where(t => t.StockGoodId == o.ExportGoodsCode && t.StockStockCode == o.ExportStockCode);
                        //        if (string.IsNullOrWhiteSpace(o.ExportLotNo))
                        //        {
                        //            pq = pq.Where(t => t.StockLotNo == null || t.StockLotNo == "");
                        //        }
                        //        else
                        //        {
                        //            pq = pq.Where(t => t.StockLotNo == o.ExportLotNo);
                        //        }
                        //        var pallet = pq.FirstOrDefault();
                        //        //库存托盘信息锁定数量还原为未锁定
                        //        if (pq != null)
                        //        {
                        //            pallet.LockQuantity -= o.ExportQuantity.Value - o.PickedNum;
                        //            pallet.StockQuantity += o.ExportQuantity.Value - o.PickedNum;
                        //        }
                        //    }
                        //}
                        if (d.Qty != d.CompleteQty)
                        if (notice.Type == "0")//成品出库
                        {
                            throw new Exception("当前单据明细中计划数量与拣货数量不符,请核实");
                        }
                        #region 库存表减去锁定数量与总数量(PDA拣货的时候已经减去数量了)
                        /*var sq = stocks.Where(s => s.SkuNo == d.SkuNo);
                        if (!string.IsNullOrWhiteSpace(d.LotNo))
                        {
                            sq = sq.Where(s => s.LotNo == d.LotNo);
                        }
                        else
                        {
                            sq = sq.Where(s => string.IsNullOrWhiteSpace(s.LotNo));
                        }
                        var st = sq.FirstOrDefault();
                        if (st != null)
                        {
                            if (d.CompleteQty <= d.Qty)
                            if (d.Qty != d.CompleteQty)
                            {
                                st.Qty += d.Qty - d.CompleteQty.Value;
                                throw new Exception("当前单据明细中计划数量与拣货数量不符,请核实");
                            }
                        }
                        if (d.Qty < d.CompleteQty)
                        {
                            //更改库存明细锁定数量
                            var allotList = Db.Queryable<BllExportAllot>().Where(o => o.SODetailNo == d.Id && o.Status == "3" && o.IsDel == "0").ToList();
                            foreach (var o in allotList)
                            {
                                if (o.Qty > o.CompleteQty) //判断拣货是否已拣完
                                {
                                    var pq = Db.Queryable<DataStockDetail>().Where(t => t.IsDel == "0" && t.Id == o.StockId && t.SkuNo == o.SkuNo);
                                    if (string.IsNullOrWhiteSpace(o.LotNo))
                                    {
                                        pq = pq.Where(t => string.IsNullOrWhiteSpace(t.LotNo));
                                    }
                                    else
                                    {
                                        pq = pq.Where(t => t.LotNo == o.LotNo);
                                    }
                                    var pallet = pq.First();
                                    //库存托盘信息锁定数量还原为未锁定
                                    if (pq != null)
                                    {
                                        //pallet.Qty -= o.CompleteQty.Value - o.Qty;
                                        pallet.LockQty -= o.Qty - o.CompleteQty.Value;
                                        Db.Updateable(pallet).UpdateColumns(it => new { it.LockQty }).ExecuteCommand();
                                    }
                                }
                            }
                            #region 库存表减去锁定数量与总数量(PDA拣货的时候已经减去数量了)
                            var sq = stocks.Where(s => s.SkuNo == d.SkuNo);
                            if (!string.IsNullOrWhiteSpace(d.LotNo))
                            {
                                sq = sq.Where(s => s.LotNo == d.LotNo);
                            }
                            else
                            {
                                st.Qty -= d.CompleteQty.Value - d.Qty;
                                sq = sq.Where(s => string.IsNullOrWhiteSpace(s.LotNo));
                            }
                            st.LockQty -= d.Qty;
                            st.Qty -= d.Qty;
                            //修改总库存表
                            Db.Updateable(st).UpdateColumns(it => new { it.Qty, it.LockQty }).ExecuteCommand();
                        }*/
                        #endregion
                            if (notice.Type == "6")//代储
                            {
                                sq = sq.Where(s => s.OwnerNo == notice.CustomerNo);
                            }
                            var st = sq.FirstOrDefault();
                            if (st != null)
                            {
                                st.LockQty -= d.Qty - d.CompleteQty.Value;
                                //修改总库存表
                                Db.Updateable(st).UpdateColumns(it => new { it.LockQty }).ExecuteCommand();
                            }
                            #endregion
                        }
                    }
                    //添加操作日志记录
                    var k = new OperationSOServer().AddLogOperationSo("出库作业", "出库单据", notice.SONo, "关单", $"关闭了单据号为{notice.SONo}的单据信息", userId);
@@ -1743,7 +1767,7 @@
                            if (unstackingMode2 == "0")//机器人拆垛
                            {
                                toLocation = loadingAddre;//装车口
                                toLocation = "009";//机器人拆垛统一发送到009工位,由PLC自动分配拆垛位
                            }
                            else //PDA拆垛
                            {
@@ -2162,6 +2186,10 @@
                    {
                        str += "3.要出库的托盘正在入库、";
                    }
                    if (string.IsNullOrWhiteSpace(str))
                    {
                        str += "托盘可执行,无需下发出库任务";
                    }
                    if (outDto1.Count > 0)
                    {
                        // 正式运行程序放开
@@ -2171,23 +2199,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<WcsModel>(response);
                            if (wcsModel.StatusCode == 0)
                            {
                                //更改任务的发送返回时间//
                                new TaskServer().EditTaskIssueOk(list2, time1, time2);
                                str += "下发成功";
                            }
                            if (wcsModel.StatusCode == -1)
                            {
                                new TaskServer().EditTaskIssueNo(list2, time1, time2, wcsModel.Msg);
                                throw new Exception(wcsModel.Msg);
                            }
                        }
                        catch (Exception ex)
                        {
@@ -2213,16 +2241,24 @@
            }
        }
        //wcs返回的成功信号(出库成功)
        public void ExportSuccess(string taskNo, int userId)
        //wcs返回的成功信号(出库成功)
        public void ExportSuccess(string taskNo, int userId,string url)
        {
            try
            {
                //出库任务号更改,如果由PLC出库,则PLC回传任务号为:任务号+实际出库口
                var TtaskNo = taskNo;
                var outLine = "";
                if (userId == 0)
                {
                    TtaskNo = taskNo.Substring(0, taskNo.Length - 3);
                    outLine = taskNo.Substring(taskNo.Length - 3, 3);
                }
                //当前任务信息
                var task = Db.Queryable<LogTask>().First(m => m.TaskNo == taskNo && m.IsDel == "0");
                var task = Db.Queryable<LogTask>().First(m => m.TaskNo == TtaskNo && m.IsDel == "0");
                if (task == null)
                {
                    throw new Exception($"未查询到任务号为:‘{taskNo}’的任务信息");
                    throw new Exception($"未查询到任务号为:‘{TtaskNo}’的任务信息");
                }
                if (task.Status == "2")
                {
@@ -2338,7 +2374,7 @@
                        Db.Updateable(item).ExecuteCommand();
                    }
                    //出库流水(更改状态)
                    var allot = Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && (m.TaskNo == taskNo || (m.Status == "1" && m.PalletNo == task.PalletNo))).ToList();
                    var allot = Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && (m.TaskNo == TtaskNo || (m.Status == "1" && m.PalletNo == task.PalletNo))).ToList();
                    foreach (var item in allot)
                    {
@@ -2357,7 +2393,114 @@
                    if (userId != 0)
                    {
                        //添加操作日志记录
                        var k = new OperationSOServer().AddLogOperationSo("出库作业", "出库日志", taskNo, "完成", $"点击完成按钮、完成任务号为:{taskNo}的任务", userId);
                        var k = new OperationSOServer().AddLogOperationSo("出库作业", "出库日志", TtaskNo, "完成", $"点击完成按钮、完成任务号为:{TtaskNo}的任务", userId);
                    }
                    if (outLine != "")
                    {
                        #region 分配出库目的位
                        string positionStart = outLine, positionEnd = "" ,type ="D00";
                        var type1 = Db.Queryable<BllExportNotice>().Where(m => m.SONo == allot.First().SONo && m.IsDel == "0" && m.Status == "3").First();
                        if (type1 == null)
                        {
                            var locateno = Db.Queryable<SysStorageLocat>().Where(m => m.AreaNo == "B13").ToList();
                            type = "D02" ; //空托盘垛出库
                             if (outLine == "443")//西侧出库
                            {
                                positionEnd = locateno.First(m => m.LocatNo.Substring(3, 2) == "01" && m.LocatNo.Substring(3, 2) == "02" && m.LocatNo.Substring(3, 2) == "03" &&
                                m.Status == "0" && m.Flag == "0").LocatNo;
                            }
                            else if (outLine == "440")  //东侧出库
                            {
                                positionEnd = locateno.First(m => m.LocatNo.Substring(4, 2) == "04" && m.LocatNo.Substring(4, 2) == "05" && m.LocatNo.Substring(4, 2) == "06" &&
                                m.Status == "0" && m.Flag == "0").LocatNo; //东侧房间库位
                            }
                            else  //1楼空托盘出库不调用AGV
                            {
                                Db.CommitTran();
                                return;
                            }
                        }
                        if (type1.Type == "1" && (type1.Type == "5" || (positionStart == "440" && positionStart == "440")))  //3楼领料出库 /3L中间品出库
                        {
                            var locateno = Db.Queryable<SysStorageLocat>().Where(m => m.AreaNo == "B11").ToList();
                            if (outLine == "443")//西侧出库
                            {
                                positionEnd = locateno.First(m => m.LocatNo.Substring(3, 2) == "01"&& m.LocatNo.Substring(4, 2) == "02" && m.Status == "0" && m.Flag == "0").LocatNo; //西侧房间库位
                            }
                            else  if(outLine == "440")  //东侧出库
                            {
                                positionEnd = locateno.First(m => m.LocatNo.Substring(3, 2) == "03" && m.LocatNo.Substring(4, 2) == "04" && m.LocatNo.Substring(4, 2) == "05" &&
                                m.LocatNo.Substring(4, 2) == "06" && m.LocatNo.Substring(3, 2) == "07" && m.Status == "0" && m.Flag == "0").LocatNo; //东侧房间库位
                            }
                        }
                        else if (type1.Type == "2" && type1.Type == "3") //抽检出库 /取样出库
                        {
                            positionEnd = Db.Queryable<SysStorageLocat>().First(m => m.AreaNo == "B04" && m.Status == "0" && m.Flag == "0").LocatNo;
                        }
                        else if (type1.Type == "4")//不合格品出库
                        {
                            positionEnd = Db.Queryable<SysStorageLocat>().First(m => m.AreaNo == "B03" && m.Status == "0" && m.Flag == "0").LocatNo;
                        }
                        else //其他单据类型都存放发货缓存区
                        {
                            positionEnd = Db.Queryable<SysStorageLocat>().First(m => m.AreaNo == "B02" && m.Status == "0" && m.Flag == "0").LocatNo;
                        }
                        #endregion
                        #region AGV调用
                        var storageLocatEnd = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.LocatNo == positionEnd && w.Flag == "0" && w.Status == "0");
                        if (storageLocatEnd == null)
                        {
                            throw new Exception("生成的AGV任务目的地址不正确");
                        }
                        List<AgvSchedulingTask> agvTaskList = new List<AgvSchedulingTask>();
                        object[] position = new object[2];
                        position[0] = new
                        {
                            positionCode = positionStart,
                            type = "00"
                        };
                        position[1] = new
                        {
                            positionCode = positionEnd,
                            type = "00"
                        };
                        AgvSchedulingTask agvTask = new AgvSchedulingTask();
                        Random r = new Random();
                        long ran = DateTime.Now.Ticks;
                        agvTask.ReqCode = ran.ToString();
                        //agvTask.ReqCode = TtaskNo;         //agv请求编号,需要随机生成  (最大32位)
                        agvTask.TaskCode = TtaskNo;         //任务号
                        agvTask.TaskTyp = type;           //搬运类型
                        agvTask.PositionCodePath = position;      //起始和目的位集合
                        agvTask.CtnrTyp = "1";            //容器类型,值为1
                        if (type == "D02")
                        {
                            agvTask.CtnrNum = "10";     //叠托任务需要下发空托盘数量
                        }
                        agvTaskList.Add(agvTask);
                        string str = "";
                        var list2 = agvTaskList.Select(m => m.TaskCode).ToList();
                        var jsonData = JsonConvert.SerializeObject(agvTaskList);
                        jsonData = jsonData.Substring(1, jsonData.Length - 1);
                        jsonData = jsonData.Substring(0, jsonData.Length - 1);
                        var response = HttpHelper.DoPost(url, jsonData, "下发给AGV转运命令", "AGV");
                        var agvModel = JsonConvert.DeserializeObject<OutCommanAgvDto>(response);
                        if (agvModel.Code != "0")
                        {
                            //记录log
                            var logStr = $@".\log\AGV\任务反馈" + DateTime.Now.ToString("yyyyMMdd") + ".txt";
                            jsonData = JsonConvert.SerializeObject(agvModel);
                            LogFile.SaveLogToFile($"AGV任务反馈执行通知:( {jsonData} ),", logStr);
                        }
                        #endregion
                    }
                    Db.CommitTran();
                }
@@ -2378,7 +2521,7 @@
        /// </summary>
        /// <param name="taskNo">任务号</param>
        /// <param name="userId">操作人</param>
        /// <exception cref="Exception"></exception>
        /// <exception cref="Exception"></exception>
        public void RelocationSuccess(string taskNo, int userId)
        {
            try
@@ -2454,7 +2597,7 @@
        //重新下发出库任务
        public OutCommandDto AgainSendSoTask(string taskNo, int userId, string url)
        public OutCommandDto AgainSendSoTask(string taskNo, string Receiver, int userId, string url)
        {
            try
            {
@@ -2505,22 +2648,42 @@
                {
                    //程序正式发布后放开
                    var time1 = DateTime.Now;//发送时间 .ToString("yyyy-MM-dd HH:mm:ss")
                    var response = HttpHelper.DoPost(url, jsonData, "下发给WCS出库命令", "WCS");
                    var response = HttpHelper.DoPost(url, jsonData, Receiver == "WCS" ? "下发给WCS出库命令" : "下发给AGV出库命令", "WCS");
                    var time2 = DateTime.Now;//返回时间 .ToString("yyyy-MM-dd HH:mm:ss")
                    ////解析返回数据
                    var wcsModel = JsonConvert.DeserializeObject<WcsModel>(response);
                    if (wcsModel.StatusCode == 0)
                    if (Receiver == "WCS")
                    {
                        //更改任务的发送返回时间//
                        new TaskServer().EditTaskIssueOk(list, time1, time2);
                        ////解析返回数据
                        var wcsModel = JsonConvert.DeserializeObject<WcsModel>(response);
                        if (wcsModel.StatusCode == 0)
                        {
                            //更改任务的发送返回时间//
                            new TaskServer().EditTaskIssueOk(list, time1, time2);
                        }
                        if (wcsModel.StatusCode == -1)
                        {
                            new TaskServer().EditTaskIssueNo(list, time1, time2, wcsModel.Msg);
                            throw new Exception($"wcs返回状态异常:{wcsModel.Msg}");
                        }
                    }
                    if (wcsModel.StatusCode == -1)
                    else if (Receiver == "AGV")
                    {
                        new TaskServer().EditTaskIssueNo(list, time1, time2, wcsModel.Msg);
                        throw new Exception($"wcs返回状态异常:{wcsModel.Msg}");
                        ////解析返回数据
                        var agvModel = JsonConvert.DeserializeObject<OutCommanAgvDto>(response);
                        if (agvModel.Code == "0")
                        {
                            //更改任务的发送返回时间//
                            new TaskServer().EditTaskIssueOk(list, time1, time2);
                        }
                        if (agvModel.Code == "1")
                        {
                            new TaskServer().EditTaskIssueNo(list, time1, time2, agvModel.Message);
                            throw new Exception($"agv返回状态异常:{agvModel.Message}");
                        }
                    }
                }
                catch (Exception ex)
                {
@@ -2548,6 +2711,38 @@
                    {
                        throw new Exception("未查询到任务信息");
                    }
                    //获取对应库位信息
                    var startlocat = Db.Queryable<SysStorageLocat>().First(a => a.IsDel == "0" && a.WareHouseNo == "W01" && a.LocatNo == task.StartLocat);
                    if (startlocat == null)
                    {
                        throw new Exception("未查询到储位信息");
                    }
                    startlocat.Status = "0";//修改分配信息状态
                    //获取储位信息
                    var locat = Db.Queryable<SysStorageLocat>().First(a => a.IsDel == "0" && a.WareHouseNo == "W01" && a.LocatNo == task.StartLocat);
                    //获取移库任d务对应目标储位信息
                    SysStorageLocat endlocat = new SysStorageLocat();
                    if (task.Type == "2")
                    {
                        endlocat = Db.Queryable<SysStorageLocat>().First(a => a.IsDel == "0" && a.WareHouseNo == "W01" && a.LocatNo == task.EndLocat);
                        if (endlocat == null)
                        {
                            throw new Exception("未查询到目标储位信息");
                        }
                    }
                    if (locat == null)
                    {
                        Db.RollbackTran();
                        throw new Exception("未查询到储位信息,请核实!");
                    }
                    locat.Status = "1"; //有物品
                    Db.Updateable(locat).ExecuteCommand();
                    if (endlocat != null)
                    {
                        endlocat.Status = "0"; //空储位 0
                        Db.Updateable(endlocat).ExecuteCommand();
                    }
                    //修改任务 
                    task.IsSuccess = 1;
                    task.IsSend = 0;
@@ -2571,31 +2766,6 @@
                        noticeDetail.FactQty -= item.Qty; //修改出库单明细的下架数量
                        Db.Updateable(noticeDetail).ExecuteCommand();
                        //获取储位信息
                        var locat = Db.Queryable<SysStorageLocat>().First(a => a.IsDel == "0" && a.WareHouseNo == "W01" && a.LocatNo == task.StartLocat);
                        //获取移库任务对应目标储位信息
                        SysStorageLocat endlocat = new SysStorageLocat();
                        if (task.Type == "2")
                        {
                            endlocat = Db.Queryable<SysStorageLocat>().First(a => a.IsDel == "0" && a.WareHouseNo == "W03" && a.LocatNo == task.EndLocat);
                            if (endlocat == null)
                            {
                                throw new Exception("未查询到目标储位信息");
                            }
                        }
                        if (locat == null)
                        {
                            Db.RollbackTran();
                            throw new Exception("未查询到储位信息,请核实!");
                        }
                        locat.Status = "1"; //有物品
                        Db.Updateable(locat).ExecuteCommand();
                        if (endlocat != null)
                        {
                            endlocat.Status = "0"; //空储位 0
                            Db.Updateable(endlocat).ExecuteCommand();
                        }
                        if (noticeDetail.FactQty == 0)
                        {
@@ -2717,7 +2887,15 @@
                    // 出库总表  状态改为部分分配
                    var noticeModel = Db.Queryable<BllExportNotice>().First(m => m.SONo == noticeDetailModel.SONo && m.IsDel == "0");
                    noticeModel.Status = "1";
                    if (noticeDetailModel.AllotQty<=0)
                    {
                        noticeModel.Status = "0";
                    }
                    else
                    {
                        noticeModel.Status = "1";
                    }
                    Db.Updateable(noticeModel).ExecuteCommand();
                    // 库存明细表 状态修改为异常锁定 锁定数量修改为托盘上数量
@@ -2731,7 +2909,7 @@
                    // 库存总表 锁定数量=当前锁定数量 +  (库存明细托盘上数量-库存明细托盘上已锁定的数量)
                    var stockModel = Db.Queryable<DataStock>().First(m => m.LotNo == stockDetailModel.LotNo && m.SkuNo == stockDetailModel.SkuNo && m.IsDel == "0");
                    stockModel.LockQty = stockModel.LockQty + (int)(stockDetailModel.Qty - lockQty);
                    stockModel.LockQty = stockModel.LockQty + (decimal)(stockDetailModel.Qty - lockQty);
                    Db.Updateable(stockModel).ExecuteCommand();
                    // 拣货明细表 删除
@@ -2838,7 +3016,7 @@
                        }
                        else
                        {
                            stockDetail = stockDetail.Where(m => m.SkuNo == detail.SkuNo && m.IsDel == "0").ToList(); //&& string.IsNullOrWhiteSpace(m.LotNo)
                            stockDetail = stockDetail.Where(m => m.SkuNo == detail.SkuNo && m.IsDel == "0" && string.IsNullOrWhiteSpace(m.LotNo)).ToList(); //
                        }
                        if (stockDetail.Count < 1)
@@ -2846,11 +3024,11 @@
                            throw new Exception("库存不足,无可出库库存");
                        }
                        //0:成品出库、1:领料出库、2:抽检出库、3:物料取样出库、4:不合格品出库、5:中间品出库、6:代储出库、7:其他出库、8:寄存出库
                        if (notice.Type == "0" || notice.Type == "1" )//成品、原辅料出库
                        if (notice.Type == "0" || notice.Type == "1")//成品、原辅料出库
                        {
                            stockDetail = stockDetail.Where(m => m.InspectStatus == "1").ToList();
                        }
                        else if (notice.Type == "3" )//取样出库
                        else if (notice.Type == "3")//取样出库
                        {
                            stockDetail = stockDetail.Where(m => m.InspectStatus == "0").ToList();
                        }
@@ -2861,46 +3039,48 @@
                        else if (notice.Type == "4")//不合格出库
                        {
                            stockDetail = stockDetail.Where(m => m.InspectStatus == "2").ToList();
                        }
                        }
                        #region 包装信息
                        var pack = packList.FirstOrDefault(p => p.PackagNo == detail.PackagNo);
                        if (pack == null)
                        {
                            throw new Exception("未查询到物料包装");
                        }
                        var pNum = 0;//托盘物品数量
                        var bNum = 0;//箱物品数量
                        if (pack.L5Num.HasValue)
                        if (pack != null)
                        {
                            pNum = Convert.ToInt32(pack.L5Num);
                            bNum = Convert.ToInt32(pack.L4Num);
                            //throw new Exception("未查询到物料包装");
                            if (pack.L5Num.HasValue)
                            {
                                pNum = Convert.ToInt32(pack.L5Num);
                                bNum = Convert.ToInt32(pack.L4Num);
                            }
                            else if (pack.L4Num.HasValue)
                            {
                                pNum = Convert.ToInt32(pack.L4Num);
                                bNum = Convert.ToInt32(pack.L3Num);
                            }
                            else if (pack.L3Num.HasValue)
                            {
                                pNum = Convert.ToInt32(pack.L3Num);
                                bNum = Convert.ToInt32(pack.L2Num);
                            }
                            else if (pack.L2Num.HasValue)
                            {
                                pNum = Convert.ToInt32(pack.L2Num);
                                bNum = Convert.ToInt32(pack.L1Num);
                            }
                            else if (pack.L1Num.HasValue)
                            {
                                pNum = Convert.ToInt32(pack.L1Num);
                                bNum = Convert.ToInt32(pack.L1Num);
                            }
                        }
                        else if (pack.L4Num.HasValue)
                        {
                            pNum = Convert.ToInt32(pack.L4Num);
                            bNum = Convert.ToInt32(pack.L3Num);
                        }
                        else if (pack.L3Num.HasValue)
                        {
                            pNum = Convert.ToInt32(pack.L3Num);
                            bNum = Convert.ToInt32(pack.L2Num);
                        }
                        else if (pack.L2Num.HasValue)
                        {
                            pNum = Convert.ToInt32(pack.L2Num);
                            bNum = Convert.ToInt32(pack.L1Num);
                        }
                        else if (pack.L1Num.HasValue)
                        {
                            pNum = Convert.ToInt32(pack.L1Num);
                            bNum = Convert.ToInt32(pack.L1Num);
                        }
                        if (pNum == 0)
                        {
                            throw new Exception("未查询到物料包装托箱关系信息");
                        }
                        //if (pNum == 0)
                        //{
                        //    throw new Exception("未查询到物料包装托箱关系信息");
                        //}
                        #endregion
                        //取合适库存商品
                        Dictionary<int, decimal> stockQtyDic = new Dictionary<int, decimal>();//托出库物品数
@@ -3115,7 +3295,7 @@
                        //    {
                        //        d.LotNo = "";
                        //    }
                        //}
                    }
                    notice.Status = "0";
@@ -3185,26 +3365,63 @@
                {
                    throw new Exception("获取失败,未找到指定出库单!");
                }
                if (detail.Status != "0" && detail.Status != "1" && detail.AllotQty >= detail.Qty)
                {
                    throw new Exception("获取失败,出库单状态不是等待执行或分配中!");
                }
                if (detail.AllotQty >= detail.Qty)
                {
                    throw new Exception("获取失败,出库单已分配完成!");
                }
                var notice = Db.Queryable<BllExportNotice>().First(a => a.SONo == detail.SONo);
                if (notice == null)
                {
                    throw new Exception("获取失败,未找到指定出库单!");
                }
                if (notice.Status == "3" && detail.AllotQty >= detail.Qty || notice.Status == "4" || notice.Status == "5")
                if (notice.Type != "1" && notice.Type != "2" && notice.Type != "3")
                {
                    throw new Exception("获取失败,出库单状态不允许!");
                    if (detail.Status != "0" && detail.Status != "1" && detail.AllotQty >= detail.Qty)
                    {
                        throw new Exception("获取失败,出库单状态不是等待执行或分配中!");
                    }
                    if (detail.AllotQty >= detail.Qty)
                    {
                        throw new Exception("获取失败,出库单已分配完成!");
                    }
                    if (notice.Status == "3" && detail.AllotQty >= detail.Qty || notice.Status == "4" || notice.Status == "5")
                    {
                        throw new Exception("获取失败,出库单状态不允许!");
                    }
                }
                string inspectStatus = string.Empty;
                switch (notice.Type)//0:原料 1:包材 2:成品 3:耗材 4:半成品
                {
                    case "0"://成品出库
                        inspectStatus = "1";
                        break;
                    case "1"://领料出库
                        inspectStatus = "1";
                        break;
                    case "2"://抽检出库
                        inspectStatus = "0,1,2";
                        break;
                    case "3"://物料取样出库
                        inspectStatus = "0";
                        break;
                    case "4"://不合格品出库
                        inspectStatus = "2";
                        break;
                    case "5"://中间品出库
                        inspectStatus = "1";
                        break;
                    case "6"://代储出库
                        inspectStatus = "0,1,2";
                        break;
                    case "8"://寄存出库
                        inspectStatus = "0,1";
                        break;
                    default: //其它出库
                        inspectStatus = "0,1";
                        break;
                }
                #endregion
                Expression<Func<DataStockDetail, bool>> item = Expressionable.Create<DataStockDetail>()
                    .AndIF(!string.IsNullOrWhiteSpace(inspectStatus), m => inspectStatus.Contains(m.InspectStatus))
                    .AndIF(!string.IsNullOrWhiteSpace(houseNo), m => m.WareHouseNo == houseNo)
                    .AndIF(!string.IsNullOrWhiteSpace(roadwayNo), m => m.RoadwayNo == roadwayNo)
                    .AndIF(!string.IsNullOrWhiteSpace(locateNo), m => m.LocatNo == locateNo)
@@ -3252,29 +3469,36 @@
                {
                    throw new Exception("操作失败,未找到指定出库单详情!");
                }
                if (detail.AllotQty >= detail.Qty || (detail.Status != "0" && detail.Status != "1"))
                {
                    throw new Exception("操作失败,出库单已分配完成!");
                }
                var notice = Db.Queryable<BllExportNotice>().First(a => a.IsDel == "0" && a.SONo == detail.SONo);
                if (notice == null)
                {
                    throw new Exception("操作失败,未找到指定出库单!");
                }
                if (notice.Status == "3" && detail.AllotQty >= detail.Qty || notice.Status == "4" || notice.Status == "5")
                if (notice.Type != "1" && notice.Type != "2" && notice.Type !="3")
                {
                    throw new Exception("操作失败,出库单已分配完成!");
                    if (detail.AllotQty >= detail.Qty || (detail.Status != "0" && detail.Status != "1"))
                    {
                        throw new Exception("操作失败,出库单已分配完成!");
                    }
                    if (notice.Status == "3" && detail.AllotQty >= detail.Qty || notice.Status == "4" || notice.Status == "5")
                    {
                        throw new Exception("操作失败,出库单已分配完成!");
                    }
                    //单据明细需要的出库数量
                    var needQty = detail.Qty - detail.AllotQty;
                    //分配的出库数量
                    var outQty = model.StockList.Select(s => s.Qty).ToList().Sum();
                    if (outQty < needQty)
                    {
                        throw new Exception("操作失败,出库数量不能大于计划数量!");
                    }
                }
                #endregion
                //单据明细需要的出库数量
                var needQty = detail.Qty - detail.AllotQty;
                //分配的出库数量
                var outQty = model.StockList.Select(s => s.Qty).ToList().Sum();
                if (outQty != needQty)
                {
                    throw new Exception("操作失败,出库数量与计划数量不一致!");
                }
                var stockIds = model.StockList.Select(a => a.StockId).ToList();
                //库存明细
                var stockList = Db.Queryable<DataStockDetail>().Where(a => stockIds.Contains(a.Id)).ToList();
@@ -3283,10 +3507,10 @@
                var allots = Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && m.SODetailNo == detail.Id && m.Status == "0").ToList();
                //库存总表
                //var stockz = Db.Queryable<DataStock>().First(d => d.IsDel == "0" && d.SkuNo == detail.SkuNo && d.LotNo == detail.LotNo);
                var stockz = Db.Queryable<DataStock>().First(d => d.IsDel == "0" && d.SkuNo == detail.SkuNo && d.LotNo == detail.LotNo);
                var allotList = new List<BllExportAllot>();
                var outQtys = 0;
                decimal outQtys = 0;
                foreach (var st in model.StockList)
                {
                    var stock = stockList.First(a => a.Id == st.StockId);
@@ -3320,7 +3544,7 @@
                            IsBelt = stock.IsBelt,
                            Qty = st.Qty,
                            CompleteQty = 0,
                            Status = "0",
                            Status = notice.Status == "4"? "2":"0",
                            LogisticsId = notice.LogisticsId,
                            IsAdvance = "0",
                            OutMode = "",//出库口
@@ -3335,15 +3559,16 @@
                        bl.Qty += st.Qty;
                        Db.Updateable(bl).ExecuteCommand();
                    }
                    //库存明细
                    stock.LockQty += st.Qty;
                    stock.Status = stock.LockQty == stock.Qty ? "2" : "1";
                    //库存总表
                    //stockz.LockQty += st.Qty;
                    //Db.Updateable(stockz).ExecuteCommand();
                    if (detail.AllotQty+ st.Qty > detail.Qty)
                    {
                        //库存总表
                        stockz.LockQty += (decimal)detail.AllotQty + st.Qty - detail.Qty;
                        Db.Updateable(stockz).ExecuteCommand();
                    }
                    Db.Updateable(stock).UpdateColumns(it => new { it.LockQty, it.Status }).ExecuteCommand();
                    outQtys += st.Qty;
@@ -3369,7 +3594,7 @@
                    foreach (var item in detailList)
                    {
                        totalQty += item.Qty;
                        totalAllotQty += Convert.ToInt32(item.AllotQty);
                        totalAllotQty += Convert.ToDecimal(item.AllotQty);
                    }
                    if (totalAllotQty >= totalQty)
@@ -3525,5 +3750,266 @@
            return nowAddress;
        }
        /// <summary>
        /// 获取拆垛托盘拆垛信息
        /// </summary>
        /// <param name="model">拆垛托盘号和WCS任务号</param>
        /// <returns>拆垛托盘信息</returns>
        public RequestBoxInfoCheck BoxInfoCheckWcs (BoxInfoCheck model)
        {
            try
            {
                // 判断当前任务状态  Status 1:正在执行 3:异常结束
                var taskModel = Db.Queryable<LogTask>().First(m => m.TaskNo == model.TaskNo && m.IsDel == "0" && m.Status == "1");
                if (taskModel == null)
                {
                    throw new Exception("此任务不存在或任务状态已变更!");
                }
                // 验证托盘分配信息
                var palletBindModel = Db.Queryable<BllExportAllot>().First(m => m.PalletNo == model.PalletNo && m.TaskNo == model.TaskNo && m.IsDel == "0" && m.Status == "1");
                if (palletBindModel != null)
                {
                    throw new Exception("未找到当前托盘分配任务信息!");
                }
                //计算当前当前托盘上箱数和拆垛箱数
                var storcklist = Db.Queryable<DataStockDetail>().First(m => m.PalletNo == palletBindModel.PalletNo && m.SkuNo == palletBindModel.SkuNo && m.LotNo == palletBindModel.LotNo);
                string level = "1";
                int qty = 0, qtycount = 0;
                var packlist = Db.Queryable<SysPackag>().First(m => m.PackagNo == palletBindModel.SkuNo && m.IsDel == "0");
                if (packlist.L2Name == "箱")
                {
                    level = "2";
                }
                switch (level)
                {
                    case "1":
                        qty = (int)(palletBindModel.Qty / packlist.L1Num);
                        qtycount = (int)(storcklist.Qty / packlist.L1Num);
                        break;
                    case "2":
                        qty = (int)(palletBindModel.Qty / packlist.L2Num);
                        qtycount = (int)(storcklist.Qty / packlist.L2Num);
                        break;
                }
                var list = new RequestBoxInfoCheck
                {
                    PalletNo = model.PalletNo,
                    TaskNo = model.TaskNo,
                    SkuNo = palletBindModel.SkuNo,
                    SkuName  = palletBindModel.SkuName,
                    LotNo = palletBindModel.LotNo,
                    OrderNo = palletBindModel.SONo,
                    Standard = palletBindModel.Standard,
                    Qty = qty,//拆垛箱数
                    QtyCount = qtycount   //托盘上箱数
                };
                return list;
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
        }
        /// <summary>
        /// 拆垛分拣主扫箱码出库
        /// </summary>
        /// <param name="model">箱号</param>
        /// <returns>出库分拣口</returns>
        public string BoxInfoExportWcs(string boxno)
        {
            try
            {
                if (string.IsNullOrWhiteSpace(boxno))
                {
                    throw new Exception("主扫分拣箱码为空");
                }
                //箱码所在拆垛拣货信息
                var boxModel = Db.Queryable<DataBoxInfo>().First(m=>m.BoxNo == boxno);
                if (boxModel == null)
                {
                    throw new Exception("未查询到该箱码的信息");
                }
                //出库分配信息
                var allot = Db.Queryable<BllExportAllot>().First(m =>
                    m.IsDel == "0" && (m.Status == "2" || m.Status == "3") && m.PalletNo == boxModel.PalletNo);
                if (allot == null)
                {
                    throw new Exception("未查询到该托盘的分配信息");
                }
                //出库单
                var notice = Db.Queryable<BllExportNotice>().First(m => m.IsDel == "0" && m.SONo == allot.SONo);
                if (notice == null)
                {
                    throw new Exception("未查询到该出库单的信息");
                }
                //出库单明细
                var noticeDetail = Db.Queryable<BllExportNoticeDetail>()
                    .First(m => m.IsDel == "0" && m.Id == allot.SODetailNo);
                if (noticeDetail == null)
                {
                    throw new Exception("未查询到该出库单明细的信息");
                }
                //剩余拣货数量(待拣减去已拣)
                var needQty = allot.Qty - allot.CompleteQty;
                //库存明细
                var stockDetail = Db.Queryable<DataStockDetail>().First(m => m.IsDel == "0" && m.Id == allot.StockId);
                if (stockDetail == null)
                {
                    throw new Exception("未查询到该托盘分配的库存明细信息!");
                }
                //库存总表
                var stock = Db.Queryable<DataStock>().First(a => a.IsDel == "0" && a.SkuNo == stockDetail.SkuNo && a.LotNo == stockDetail.LotNo);
                if (stock == null)
                {
                    throw new Exception("未查询到该托盘分配的库存信息!");
                }
                List<DataBoxInfo> boxInfos;
                var boxInfo = Db.Queryable<DataBoxInfo>().Where(m => m.IsDel == "0" && m.BoxNo == boxno && m.StockDetailId == stockDetail.Id);
                if (boxInfo.Count() == 0)
                {
                    throw new Exception("未查询到该箱码及追溯码的信息");
                }
                boxInfos = boxInfo.ToList();
                var comDetailList = Db.Queryable<BllCompleteDetail>().Where(m => m.IsDel == "0" && m.ExportAllotId == allot.Id && m.PalletNo == boxModel.PalletNo).ToList();
                if (boxInfo.Count() == 0)
                {
                    throw new Exception("未查询到该箱码的信息");
                }
                if (boxInfo.Any(m => m.PalletNo != boxModel.PalletNo))
                {
                    throw new Exception("该托盘与箱码没有绑定关系");
                }
                var boxQty = boxInfo.GroupBy(m => m.BoxNo).Select(m => SqlFunc.AggregateSum(m.Qty)).ToList();
                if (boxQty[0] > needQty)
                {
                    throw new Exception("拣货数量不能大于箱内剩余待拣数量");
                }
                decimal pickQty = 0;//拣货的数量
                var comList = new List<BllCompleteDetail>();
                foreach (var item in boxInfos)
                {
                    //添加拣货明细
                    var completeDetail = new BllCompleteDetail()
                    {
                        SONo = allot.SONo,
                        SODetailNo = allot.SODetailNo,
                        ExportAllotId = allot.Id,
                        StockId = allot.StockId,
                        BoxNo = item.BoxNo,
                        BoxNo2 = item.BoxNo2,
                        BoxNo3 = item.BoxNo3,
                        LotNo = allot.LotNo,
                        LotText = allot.LotText,
                        SupplierLot = allot.SupplierLot,
                        SkuNo = allot.SkuNo,
                        SkuName = allot.SkuName,
                        Standard = allot.Standard,
                        PalletNo = boxModel.PalletNo,
                        CompleteQty = item.Qty,
                    };
                    comList.Add(completeDetail);
                    pickQty += item.Qty;
                    //删除库存箱码明细
                    Db.Deleteable(item).ExecuteCommand();
                }
                Db.Insertable(comList).ExecuteCommand();
                //修改出库分配信息
                allot.CompleteQty += pickQty;
                allot.Status = allot.Qty == allot.CompleteQty ? "5" : "3";
                allot.UpdateTime = DateTime.Now;
                if (allot.Status == "5")
                {
                    //判断该托盘是否还存在物料 存在改为待回库 待回库完成后改为已完成
                }
                Db.Updateable(allot).ExecuteCommand();
                //删除或修改库存明细
                stockDetail.BitPalletMark = "1";//修改为零托标识
                stockDetail.Qty -= pickQty;
                stockDetail.LockQty -= pickQty;
                if (stockDetail.Qty == stockDetail.LockQty)
                {
                    stockDetail.Status = "2";
                }
                else if (stockDetail.Qty > stockDetail.LockQty && stockDetail.LockQty > 0)
                {
                    stockDetail.Status = "1";
                }
                else
                {
                    stockDetail.Status = "0";
                }
                if (stockDetail.Qty <= 0)
                {
                    Db.Deleteable(stockDetail).ExecuteCommand();
                }
                else
                {
                    Db.Updateable(stockDetail).ExecuteCommand();
                }
                stock.Qty -= pickQty;
                stock.LockQty -= pickQty;
                if (stock.Qty <= 0)
                {
                    Db.Deleteable(stock).ExecuteCommand();
                }
                else
                {
                    Db.Updateable(stock).ExecuteCommand();
                }
                var num2 = Db.Queryable<DataStockDetail>().Count(m => m.IsDel == "0" && m.PalletNo == boxModel.PalletNo);
                if (num2 <= 0)
                {
                    //改变托盘状态
                    var pallet = Db.Queryable<SysPallets>().First(m => m.PalletNo == boxModel.PalletNo && m.IsDel == "0");
                    if (pallet == null)
                    {
                        throw new Exception("未在托盘表中查询到托盘信息");
                    }
                    pallet.Status = "0";
                    Db.Updateable(pallet).ExecuteCommand();
                }
                //修改出库单明细拣货数量
                noticeDetail.CompleteQty += pickQty;
                noticeDetail.Status = "2";
                Db.Updateable(noticeDetail).ExecuteCommand();
                var num = Db.Queryable<BllExportNoticeDetail>()
                    .Count(m => m.IsDel == "0" && m.SONo == allot.SONo && m.CompleteQty < m.Qty);
                if (num <= 0)
                {
                    notice.Status = "4"; //更改为执行完成
                    noticeDetail.Status = "3";
                    Db.Updateable(noticeDetail).ExecuteCommand();
                }
                //修改出库单信息
                Db.Updateable(notice).ExecuteCommand();
                return allot.LoadingAddre;
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
        }
    }
}