IPC-610
2024-12-03 2f0120d0c10ac24603936911ee5812d4e71d2740
Wms/WMS.BLL/BllPdaServer/PdaCrServer.cs
@@ -1,16 +1,26 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Policy;
using System.Text;
using System.Threading.Tasks;
using Model.InterFaceModel;
using Model.ModelDto.BllCheckDto;
using Model.ModelDto.PdaDto;
using Model.ModelDto.SysDto;
using Model.ModelVm;
using Newtonsoft.Json;
using SqlSugar;
using Utility.Tools;
using WMS.BLL.LogServer;
using WMS.BLL.SysServer;
using WMS.DAL;
using WMS.Entity.BllAsnEntity;
using WMS.Entity.BllCheckEntity;
using WMS.Entity.BllSoEntity;
using WMS.Entity.Context;
using WMS.Entity.DataEntity;
using WMS.Entity.LogEntity;
using WMS.Entity.SysEntity;
using WMS.IBLL.IPdaServer;
@@ -83,7 +93,7 @@
        }
        //获取要盘点的箱码信息(盘点记录中数据)
        public List<StockCheckLogDto> GetStockCheckLogList(string crNo, string crDetail, string palletNo, string boxNo)
        public List<StockCheckLogDto> GetStockCheckLogList(string crNo, string crDetail, string palletNo, string boxNo, string isContinue)
        {
            try
            {
@@ -102,6 +112,18 @@
                var detail = crDetail.Split("-");
                var sku = detail[0];
                //判断是否为无码物料
                var skuinfo = Db.Queryable<SysMaterials>().First(m => m.IsDel == "0" && m.SkuNo == sku);
                //判断是否存在物料消息
                if (skuinfo == null)
                {
                    throw new Exception("托盘码不能为空");
                }
                int isQtySku = 0;
                if (skuinfo.Type == "4" && isContinue == "1")
                {
                    isQtySku = 1;
                }
                var lotNo = detail[1];
                var list = Db.Queryable<BllStockCheckLog>().Where(m => m.IsDel == "0" && m.CRNo == crNo);
                //var deList= Db.Queryable<BllStockCheckDetail>().Where(m => m.IsDel == "0" && m.SkuNo == sku && m.LotNo == lotNo && m.PalletNo == palletNo);
@@ -109,25 +131,47 @@
                //{
                //    throw new Exception("未查询到托盘上的盘点物料批次信息");
                //}
                list = list.Where(m => m.SkuNo == sku && m.LotNo == lotNo && m.PalletNo == palletNo);
                if (!string.IsNullOrWhiteSpace(boxNo))
                {
                    list = list.Where(m => m.BoxNo == boxNo);
                }
                var data = list.Select(m => new StockCheckLogDto()
                List<StockCheckLogDto> data = new List<StockCheckLogDto>();
                //判断是否为无码物料
                if (isQtySku == 1)
                {
                    BoxNo = m.BoxNo,
                    BoxNo3 = m.BoxNo3,
                    SkuNo = m.SkuNo,
                    SkuName = m.SkuName,
                    LotNo = m.LotNo,
                    Qty = m.Qty,
                    CheckResult = m.CheckResult,
                    //获取库存信息
                    var stockDetail = Db.Queryable<DataStockDetail>().First(a => a.IsDel == "0" && a.Status == "3" && a.SkuNo == sku && a.PalletNo == palletNo);
                }).ToList();
                    var model = new StockCheckLogDto()
                    {
                        PalletNo = palletNo,
                        SkuNo = sku,
                        Qty = stockDetail.Qty,
                        CheckResult = 4,
                    };
                    data.Add(model);
                }
                else
                {
                    data = list.Select(m => new StockCheckLogDto()
                    {
                        BoxNo = m.BoxNo,
                        BoxNo3 = m.BoxNo3,
                        SkuNo = m.SkuNo,
                        SkuName = m.SkuName,
                        LotNo = m.LotNo,
                        Qty = m.Qty,
                        CheckResult = m.CheckResult,
                    }).ToList();
                }
                return data;
            }
            catch (Exception e)
            {
@@ -135,7 +179,7 @@
            }
        }
        public void CrSetCheck(string crNo, string crDetail, string palletNo, string boxNo, string boxNo3, string result, int? qty, int userId)
        public void CrSetCheck(string crNo, string crDetail, string palletNo, string boxNo, string boxNo3, string result, decimal? qty, string isContinue, int userId)
        {
            try
            {
@@ -165,8 +209,8 @@
                //盘点记录
                var checkLog = Db.Queryable<BllStockCheckLog>().Where(m =>
                    m.IsDel == "0" && m.CRNo == crNo && m.PalletNo == palletNo && m.SkuNo == sku && m.LotNo == lotNo && m.CheckResult == null);
                var time = DateTime.Now;
                //正常
                if (result == "0")
                {
                    if (!string.IsNullOrWhiteSpace(boxNo))
@@ -178,7 +222,7 @@
                        checkLog = checkLog.Where(m => m.BoxNo3 == boxNo3);
                    }
                    if (checkLog.Count() == 0)
                    if (checkLog.Count() == 0 && isContinue == "0")
                    {
                        throw new Exception("未查询到未盘点的箱支信息");
                    }
@@ -189,7 +233,7 @@
                    {
                        if (l.CheckResult != null)
                        {
                           continue;
                            continue;
                        }
                        l.RealQty = l.Qty;
                        l.CheckResult = 0;
@@ -204,6 +248,7 @@
                        checkDetail.RealQty = 0;
                    }
                    checkDetail.RealQty += num;
                    checkDetail.CheckResult = 0;
                    //if (checkDetail.CheckResult == null || checkDetail.CheckResult == 0)
                    //{
                    //    checkDetail.CheckResult = 0;
@@ -211,6 +256,7 @@
                    Db.Updateable(checkDetail).ExecuteCommand();
                    Db.Updateable(list).ExecuteCommand();
                }
                //盘亏
                else if (result == "1")
                {
                    if (!string.IsNullOrWhiteSpace(boxNo))
@@ -222,10 +268,20 @@
                        checkLog = checkLog.Where(m => m.BoxNo3 == boxNo3);
                    }
                    if (checkLog.Count() == 0)
                    if (checkLog.Count() == 0 && isContinue == "0")
                    {
                        throw new Exception("未查询到箱支信息");
                    }
                    //
                    if (isContinue == "1")
                    {
                        if (qty == null || qty <= 0)
                        {
                            throw new Exception("数量盘点时、盘亏数量不能为空且需大于0");
                        }
                    }
                    var list = checkLog.ToList();
                    var num = 0;
@@ -242,64 +298,111 @@
                        checkDetail.RealQty = 0;
                    }
                    checkDetail.RealQty += num;
                    //checkDetail.CheckResult = 1;
                    if (isContinue == "1")
                    {
                        checkDetail.RealQty = qty;
                    }
                    checkDetail.CheckResult = 1;
                    var checkInfo = Db.Queryable<BllStockCheckLog>().First(m =>
                    m.IsDel == "0" && m.CRNo == crNo && m.PalletNo == palletNo && m.SkuNo == sku && m.LotNo == lotNo);
                    checkInfo.RealQty = qty;
                    checkInfo.CheckResult = 1;
                    checkInfo.CheckUserId = userId;
                    checkInfo.CheckDate = time;
                    checkInfo.UpdateUser = userId;
                    checkInfo.UpdateTime = time;
                    Db.Updateable(checkInfo).ExecuteCommand();
                    Db.Updateable(checkDetail).ExecuteCommand();
                    Db.Updateable(list).ExecuteCommand();
                }
                //盘盈
                else if (result == "2")
                {
                    if (string.IsNullOrWhiteSpace(boxNo) || string.IsNullOrWhiteSpace(boxNo3))
                    if (isContinue == "0")
                    {
                        throw new Exception("盘盈时箱码与支码不能为空");
                        if (string.IsNullOrWhiteSpace(boxNo) || string.IsNullOrWhiteSpace(boxNo3))
                        {
                            throw new Exception("盘盈时箱码与支码不能为空");
                        }
                    }
                    if (qty == null || qty <= 0)
                    {
                        throw new Exception("盘盈时数量不能为空且需大于0");
                    }
                    var count = Db.Queryable<DataBoxInfo>()
                        .Count(m => m.IsDel == "0" && m.BoxNo == boxNo && m.BoxNo3 == boxNo3);
                    var count2 = Db.Queryable<BllStockCheckLog>()
                        .Count(m => m.IsDel == "0" && m.BoxNo == boxNo && m.BoxNo3 == boxNo3);
                    if (count > 0 || count2 > 0)
                    if (isContinue == "0")
                    {
                        throw new Exception("当前库存中已存在该箱支信息");
                        var count = Db.Queryable<DataBoxInfo>()
                        .Count(m => m.IsDel == "0" && m.BoxNo == boxNo && m.BoxNo3 == boxNo3);
                        var count2 = Db.Queryable<BllStockCheckLog>()
                            .Count(m => m.IsDel == "0" && m.BoxNo == boxNo && m.BoxNo3 == boxNo3);
                        if (count > 0 || count2 > 0)
                        {
                            throw new Exception("当前库存中已存在该箱支信息");
                        }
                    }
                    var crLog = new BllStockCheckLog()
                    BllStockCheckLog crLog = new BllStockCheckLog();
                    if (isContinue == "0")
                    {
                        CRNo = crNo,
                        PalletNo = palletNo,
                        BoxNo = boxNo,
                        BoxNo2 = null,
                        BoxNo3 = boxNo3,
                        Qty = qty,
                        SkuNo = checkDetail.SkuNo,
                        SkuName = checkDetail.SkuName,
                        Standard = checkDetail.Standard,
                        LotNo = checkDetail.LotNo,
                        LotText = checkDetail.LotText,
                        SupplierLot = checkDetail.SupplierLot,
                        crLog = new BllStockCheckLog()
                        {
                            CRNo = crNo,
                            PalletNo = palletNo,
                            BoxNo = boxNo,
                            BoxNo2 = null,
                            BoxNo3 = boxNo3,
                            Qty = qty,
                            SkuNo = checkDetail.SkuNo,
                            SkuName = checkDetail.SkuName,
                            Standard = checkDetail.Standard,
                            LotNo = checkDetail.LotNo,
                            LotText = checkDetail.LotText,
                            SupplierLot = checkDetail.SupplierLot,
                        RealQty = qty,
                        CheckResult = 2,
                        CheckDate = time,
                        CheckUserId = userId,
                            RealQty = qty,
                            CheckResult = 2,
                            CheckDate = time,
                            CheckUserId = userId,
                        CreateUser = userId,
                        CreateTime = time
                    };
                    if (checkDetail.RealQty == null)
                            CreateUser = userId,
                            CreateTime = time
                        };
                    }
                    else
                    {
                        var checkInfo = Db.Queryable<BllStockCheckLog>().First(m =>
                    m.IsDel == "0" && m.CRNo == crNo && m.PalletNo == palletNo && m.SkuNo == sku && m.LotNo == lotNo);
                        checkInfo.RealQty = qty;
                        checkInfo.CheckResult = 2;
                        checkInfo.CheckUserId = userId;
                        checkInfo.CheckDate = time;
                        checkInfo.UpdateUser = userId;
                        checkInfo.UpdateTime = time;
                        Db.Updateable(checkInfo).ExecuteCommand();
                    }
                    if (checkDetail.RealQty == null && isContinue == "0")
                    {
                        checkDetail.RealQty = 0;
                    }
                    checkDetail.RealQty += qty;
                    //checkDetail.CheckResult = 1;
                    if (isContinue == "1")
                    {
                        checkDetail.RealQty = qty;
                    }
                    checkDetail.CheckResult = 2;
                    Db.Updateable(checkDetail).ExecuteCommand();
                    Db.Insertable(crLog).ExecuteCommand();
                    if (isContinue == "0")
                    {
                        Db.Insertable(crLog).ExecuteCommand();
                    }
                }
                else
                {
                    Db.RollbackTran();
                    throw new Exception("盘点结果不符,请核实!");
                }
                var checkLogNum = Db.Queryable<BllStockCheckLog>().Where(m => m.IsDel == "0" && m.CRNo == crNo && m.PalletNo == palletNo && m.SkuNo == sku && m.LotNo == lotNo);
@@ -352,7 +455,7 @@
            {
                str += " and PalletNo like @palletno";
            }
            //排序
            str += " order by LotNo,LocatNo,PalletNo";
            List<DataStockDetail> stockList = Db.Ado.SqlQuery<DataStockDetail>(str, new
@@ -377,7 +480,7 @@
                {
                    throw new Exception("托盘号不能为空");
                }
                var detail = Db.Queryable<DataStockDetail>().Where(m => m.IsDel == "0" && m.PalletNo == palletNo).Select(m=>m.Id).ToList();
                var detail = Db.Queryable<DataStockDetail>().Where(m => m.IsDel == "0" && m.PalletNo == palletNo).Select(m => m.Id).ToList();
                var info = Db.Queryable<DataBoxInfo>().Where(m => m.IsDel == "0" && detail.Contains(m.StockDetailId))
                    .GroupBy(m => m.BoxNo).Select(a => new PdaPalletNoCheckDto
                    {
@@ -386,7 +489,7 @@
                    }).ToList();
                return info;
            }
            catch(Exception e)
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
@@ -401,9 +504,9 @@
                {
                    throw new Exception("箱码不能为空");
                }
                var info = Db.Queryable<DataBoxInfo>().Where(m => m.IsDel == "0" && m.BoxNo == boxNo)
                    .GroupBy(m => new{m.BoxNo,m.SkuNo,m.SkuName,m.LotNo}).Select(a => new PdaPalletNoCheckDto
                    .GroupBy(m => new { m.BoxNo, m.SkuNo, m.SkuName, m.LotNo }).Select(a => new PdaPalletNoCheckDto
                    {
                        BoxNo = a.BoxNo,
                        SkuNo = a.SkuNo,
@@ -411,7 +514,7 @@
                        LotNo = a.LotNo,
                        Qty = SqlFunc.AggregateSum(a.Qty)
                    }).ToList();
                if (info.Count>1)
                if (info.Count > 1)
                {
                    throw new Exception("当前箱码查询出多条物料或批次信息,请核实");
                }
@@ -425,7 +528,7 @@
        }
        //解绑原托盘绑定新托盘
        public void SaveUnbind(string palletNo,string boxNo,string palletNoNew,int userId)
        public void SaveUnbind(string palletNo, string boxNo, string palletNoNew, int userId)
        {
            try
            {
@@ -450,7 +553,7 @@
                    throw new Exception("原托盘上未查到箱支明细,请核实");
                }
                //库存明细id
                var infoIds = infos.GroupBy(m => m.StockDetailId).Select(a =>a.StockDetailId).ToList();
                var infoIds = infos.GroupBy(m => m.StockDetailId).Select(a => a.StockDetailId).ToList();
                if (infoIds.Count == 0)
                {
                    throw new Exception("未查询到当前箱码信息,请核实");
@@ -485,7 +588,7 @@
                                }
                            }
                        }
                    }
                    }
                    #endregion
                }
                if (!newPalletHaveGoods)//新托盘上没有物品
@@ -520,7 +623,7 @@
                    }
                    var stockDetail2 = stockDetailList.FirstOrDefault(w => w.SkuNo == stockDetail1.SkuNo && w.LotNo == stockDetail1.LotNo);
                    var stId = 0;
                    var stId = 0;
                    if (stockDetail2 == null) //添加-新托盘上没有同物料同批次物品
                    {
                        //新托盘添加库存明细
@@ -678,32 +781,40 @@
        {
            try
            {
                var models = Db.Queryable<DataStockDetail>().First(w => w.IsDel == "0" && w.PalletNo == palletNo);
                if (models == null)
                {
                    throw new Exception("托盘库存信息不存在,请检查!");
                }
                if (string.IsNullOrEmpty(models.LocatNo))
                {
                    throw new Exception("托盘储位信息不存在,请检查!");
                }
                if (models.WareHouseNo != "W02")
                {
                    throw new Exception("该托盘未在平库内,请检查!");
                }
                var storageLocat = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.LocatNo == models.LocatNo);
                if (storageLocat == null)
                {
                    throw new Exception("储位信息不存在,请检查!");
                }
                var storageArea = new List<SysStorageArea>();
                if (storageLocat.AreaNo.Contains("B0"))
                if (string.IsNullOrEmpty(palletNo))
                {
                    storageArea = Db.Queryable<SysStorageArea>().Where(w => w.AreaNo.Contains("B0")).ToList();
                    storageArea = Db.Queryable<SysStorageArea>().Where(w => w.IsDel == "0" && w.Status == "0" && w.WareHouseNo == "W02").OrderBy(o => o.AreaNo).ToList();
                }
                else
                {
                    storageArea = Db.Queryable<SysStorageArea>().Where(w => w.AreaNo.Contains("B1")).ToList();
                    var models = Db.Queryable<DataStockDetail>().First(w => w.IsDel == "0" && w.PalletNo == palletNo);
                    if (models == null)
                    {
                        throw new Exception("托盘库存信息不存在,请检查!");
                    }
                    if (string.IsNullOrEmpty(models.LocatNo))
                    {
                        throw new Exception("托盘储位信息不存在,请检查!");
                    }
                    if (models.WareHouseNo != "W02")
                    {
                        throw new Exception("该托盘未在平库内,请检查!");
                    }
                    var storageLocat = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.LocatNo == models.LocatNo);
                    if (storageLocat == null)
                    {
                        throw new Exception("储位信息不存在,请检查!");
                    }
                    if (storageLocat.AreaNo.Contains("B0"))
                    {
                        storageArea = Db.Queryable<SysStorageArea>().Where(w => w.IsDel == "0" && w.Status == "0" && w.AreaNo.Contains("B0") && w.WareHouseNo == "W02").OrderBy(o => o.AreaNo).ToList();
                    }
                    else
                    {
                        storageArea = Db.Queryable<SysStorageArea>().Where(w => w.IsDel == "0" && w.Status == "0" && w.AreaNo.Contains("B1") && w.WareHouseNo == "W02").OrderBy(o => o.AreaNo).ToList();
                    }
                }
                return storageArea;
            }
@@ -720,7 +831,7 @@
        {
            try
            {
                var allotList = Db.Queryable<BllExportNotice>().Where(m => m.IsDel == "0" && m.Status == "2").Select(m => m.SONo).Distinct().ToList();
                var allotList = Db.Queryable<BllExportNotice>().Where(m => m.IsDel == "0" && (m.Status == "3" || m.Status == "4")).Select(m => m.SONo).Distinct().ToList();
                return allotList;
            }
            catch (Exception ex)
@@ -772,12 +883,12 @@
        }
        /// <summary>
        /// agv转运呼叫小车-开发未完成待确认
        /// agv转运呼叫小车
        /// </summary>
        /// <param name="palletNo"></param>
        /// <param name="areaNo"></param>
        /// <param name="ruku"></param>
        public void AgvTransport(string palletNo, string areaNo, string ruku, int userId)
        public void AgvTransport(string palletNo, string areaNo, string ruku, int userId, string url)
        {
            if (string.IsNullOrEmpty(palletNo))
            {
@@ -787,12 +898,41 @@
            {
                throw new Exception("请选择目标区域或入库口!");
            }
            if (!string.IsNullOrEmpty(areaNo) && !string.IsNullOrEmpty(ruku))
            {
                throw new Exception("目标区域和入库口不能同时选择!");
            }
            try
            {
                string EndLocat = string.Empty;//目标位置
                var log = Db.Queryable<LogTask>().First(w => w.IsDel == "0" && w.PalletNo == palletNo && (w.Status == "0" || w.Status == "1"));
                if (log != null)
                {
                    throw new Exception("该托盘已有小车等待执行或正在执行的任务!");
                }
                var stockDetail = Db.Queryable<DataStockDetail>().First(w => w.IsDel == "0" && w.PalletNo == palletNo);
                if (stockDetail == null)
                {
                    throw new Exception("托盘库存信息不存在,请检查!");
                    throw new Exception("托盘上物料库存明细信息不存在,请检查!");
                }
                if (!string.IsNullOrEmpty(areaNo))
                {
                    var storageArea = Db.Queryable<SysStorageArea>().First(w => w.IsDel == "0" && w.AreaNo == areaNo);
                    if (storageArea == null)
                    {
                        throw new Exception("所选区域信息不存在,请检查!");
                    }
                    EndLocat = GetLocat(areaNo, stockDetail.SkuNo, stockDetail.LotNo, palletNo);
                }
                else
                {
                    EndLocat = ruku;
                }
                var stock = Db.Queryable<DataStock>().First(w => w.IsDel == "0" && w.SkuNo == stockDetail.SkuNo && w.LotNo == stockDetail.LotNo);
                if (stock == null)
                {
                    throw new Exception("托盘上物料库存信息不存在,请检查!");
                }
                if (string.IsNullOrEmpty(stockDetail.LocatNo))
                {
@@ -802,28 +942,122 @@
                {
                    throw new Exception("该托盘未在平库内,请检查!");
                }
                //起始储位信息
                var storageLocat = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.LocatNo == stockDetail.LocatNo);
                if (storageLocat == null)
                {
                    throw new Exception("储位信息不存在,请检查!");
                }
                //目标储位信息
                var storageLocatEnd = new SysStorageLocat();
                if (!string.IsNullOrEmpty(areaNo))
                {
                    storageLocatEnd = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.LocatNo == EndLocat && w.Flag == "0" && w.Status == "0");
                    if (storageLocatEnd == null)
                    {
                        throw new Exception("目标储位信息不存在,请检查!");
                    }
                }
                //开启事务
                Db.BeginTran();
                //添加出库任务
                var taskNo = new Common().GetMaxNo("TK");
                var exTask = new LogTask
                {
                    TaskNo = taskNo,
                    Sender = "WMS",
                    Receiver = "AGV",
                    IsSuccess = 0, //是否下发成功 0失败 1成功
                    StartLocat = stockDetail.LocatNo,//起始位置
                    EndLocat = EndLocat,//目标位置
                    PalletNo = palletNo,//托盘码
                    Msg = string.Format("转运任务:{0}=>>{1}", stockDetail.LocatNo, EndLocat),
                    IsSend = 1,//是否可再次下发
                    IsCancel = 1,//是否可取消
                    IsFinish = 1,//是否可完成
                    Type = "2",//任务类型 0 入库任务 1 出库任务  2 移库任务
                    Status = "0",//任务状态0:等待执行1正在执行2执行完成
                    OrderType = "3",//0 入库单 1 出库单  2 盘点单  3 移库单
                    CreateTime = DateTime.Now
                };
                Db.Insertable(exTask).ExecuteCommand();
                //修改库存明细信息
                stockDetail.WareHouseNo = "";
                stockDetail.RoadwayNo = "";
                stockDetail.AreaNo = "";
                stockDetail.LocatNo = "";
                stockDetail.Status = "4";//移库锁定
                //stockDetail.LockQty = stockDetail.Qty;//锁定库存数量
                Db.Updateable(stockDetail).ExecuteCommand();
                //修改储位地址状态
                storageLocat.Status = "0";//空储位
                //修改库存信息
                //stock.LockQty += (decimal)stockDetail.Qty;
                //Db.Updateable(stock).ExecuteCommand();
                //修改起始储位地址状态
                storageLocat.Status = "5";//0:空储位 1:有物品 2:入库中 3:出库中 4:移入中 5:移出中
                Db.Updateable(storageLocat).ExecuteCommand();
                //修改目标储位地址状态
                if (storageLocatEnd != null)
                {
                    storageLocatEnd.Status = "4";//0:空储位 1:有物品 2:入库中 3:出库中 4:移入中 5:移出中
                    Db.Updateable(storageLocatEnd).ExecuteCommand();
                }
                //添加操作日志记录
                var k = new OperationCrServer().AddLogOperationCr("PDA模块", "AGV转运", palletNo, "移库", $"PDA呼叫小车对托盘号:{palletNo}发起转运", userId);
                #region 呼叫小车代码
                List<AgvSchedulingTask> agvTaskList = new List<AgvSchedulingTask>();
                AgvSchedulingTask agvTask = new AgvSchedulingTask();
                agvTask.ReqCode = taskNo;
                agvTask.TaskTyp = "F01";
                agvTask.WbCode = "";
                agvTask.PositionCodePath = null;
                agvTask.PodCode = "-1";
                agvTaskList.Add(agvTask);
                var IsTrue = false;
                while (IsTrue == true)
                {
                    // 正式运行程序放开
                    string str = "";
                    var list2 = agvTaskList.Select(m => m.ReqCode).ToList();
                    var jsonData = JsonConvert.SerializeObject(agvTaskList);
                    string response = "";
                    try
                    {
                        var time1 = DateTime.Now;//发送时间 .ToString("yyyy-MM-dd HH:mm:ss")
                        response = HttpHelper.DoPost(url, jsonData, "下发给AGV转运命令", "AGV");
                        var time2 = DateTime.Now;//返回时间 .ToString("yyyy-MM-dd HH:mm:ss")
                        //////解析返回数据
                        var agvModel = JsonConvert.DeserializeObject<OutCommanAgvDto>(response);
                        if (agvModel.Code == "0")
                        {
                            //更改任务的发送返回时间//
                            new TaskServer().EditTaskIssueOk(list2, time1, time2);
                            str += "下发成功";
                            IsTrue = true;
                        }
                        if (agvModel.Code == "1")
                        {
                            new TaskServer().EditTaskIssueNo(list2, time1, time2, agvModel.Message);
                            throw new Exception(agvModel.Message);
                        }
                    }
                    catch (Exception ex)
                    {
                        throw new Exception(ex.Message);
                    }
                }
                #endregion
                //提交事务
                Db.CommitTran();
            }
@@ -834,21 +1068,17 @@
            }
        }
        /// <summary>
        /// agv转运呼叫小车取货-开发未完成待确认
        /// agv转运呼叫小车取货
        /// </summary>
        /// <param name="soNo"></param>
        /// <param name="palletNo"></param>
        /// <param name="areaNo"></param>
        /// <param name="userId"></param>
        public void AgvTransport2(string soNo,string palletNo, string areaNo, int userId)
        public List<string> AgvTransport2(string soNo, string palletNo, string areaNo, int userId, string url)
        {
            if (string.IsNullOrEmpty(soNo))
            {
                throw new Exception("请选择出库单据!");
            }
            if (string.IsNullOrEmpty(palletNo))
            {
                throw new Exception("请扫描托盘条码!");
            }
            if (string.IsNullOrEmpty(areaNo))
            {
@@ -856,51 +1086,408 @@
            }
            try
            {
                //开启事务
                Db.BeginTran();
                List<AgvSchedulingTask> agvTaskList = new List<AgvSchedulingTask>();
                var strList = new List<string>();//错误信息集合  //0 :部分托盘已有小车等待执行或正在执行的任务
                //出库单信息
                var notice = Db.Queryable<BllExportNotice>().First(w => w.IsDel == "0" && w.SONo == soNo);
                if (notice == null)
                {
                    throw new Exception("出库单据信息不存在,请检查!");
                }
                var allot = Db.Queryable<BllExportAllot>().First(w => w.IsDel == "0" && w.SONo == soNo && w.PalletNo == palletNo);
                if (allot == null)
                //目标区域信息
                var storageArea = Db.Queryable<SysStorageArea>().First(w => w.IsDel == "0" && w.AreaNo == areaNo);
                if (storageArea == null)
                {
                    throw new Exception("该托盘出库分配信息不存在,请检查!");
                    throw new Exception("所选区域信息不存在,请检查!");
                }
                var stockDetail = Db.Queryable<DataStockDetail>().First(w => w.IsDel == "0" && w.PalletNo == palletNo);
                if (stockDetail == null)
                List<DataStockDetail> stockDetailList = new List<DataStockDetail>();//需要的托盘明细
                if (!string.IsNullOrEmpty(palletNo))//单托盘叫货
                {
                    throw new Exception("托盘库存信息不存在,请检查!");
                    stockDetailList = Db.Queryable<DataStockDetail>().Where(w => w.IsDel == "0" && w.PalletNo == palletNo).ToList();
                }
                if (string.IsNullOrEmpty(stockDetail.LocatNo))
                else//整个出库单叫货
                {
                    throw new Exception("托盘储位信息不存在,请检查!");
                //    string sqlStr = $"select * from DataStockDetail where PalletNo in (select PalletNo from BllExportAllot where IsDel='0' and SONo='{soNo}')";
                //    stockDetailList = Db.Ado.SqlQuery<DataStockDetail>(sqlStr).ToList();
                    stockDetailList = Db.Queryable<DataStockDetail>().Where(w => w.IsDel == "0" && w.SONo == soNo).ToList();
                }
                if (stockDetail.WareHouseNo != "W02")
                if (stockDetailList.Count <= 0)
                {
                    throw new Exception("该托盘未在平库内,请检查!");
                    throw new Exception("托盘明细不存在,请检查!");
                }
                var storageLocat = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.LocatNo == stockDetail.LocatNo);
                if (storageLocat == null)
                {
                    throw new Exception("储位信息不存在,请检查!");
                }
                //开启事务
                Db.BeginTran();
                //修改库存明细信息
                stockDetail.WareHouseNo = "";
                stockDetail.RoadwayNo = "";
                stockDetail.AreaNo = "";
                stockDetail.LocatNo = "";
                Db.Updateable(stockDetail).ExecuteCommand();
                //修改储位地址状态
                storageLocat.Status = "0";//空储位
                var log = Db.Queryable<LogTask>().Where(w => w.IsDel == "0" && (w.Status == "0" || w.Status == "1"));//任务表
                var storageLocat = Db.Queryable<SysStorageLocat>().Where(w => w.IsDel == "0");//储位表
                var stock = Db.Queryable<DataStock>().Where(w => w.IsDel == "0");//库存总表
                string EndLocat = string.Empty;//目标位置
                string hasLocatNoList = string.Empty;//已分配的储位
                Db.Updateable(storageLocat).ExecuteCommand();
                foreach (var item in stockDetailList)
                {
                    if (string.IsNullOrEmpty(item.LocatNo))
                    {
                        throw new Exception($"托盘号:{item.PalletNo}的储位信息不存在,请检查!");
                    }
                    if (item.WareHouseNo != "W02")
                    {
                        throw new Exception($"托盘号:{item.PalletNo}未在平库内,请检查!");
                    }
                    //任务信息
                    var logInfo = log.First(w => w.PalletNo == item.PalletNo);
                    if (logInfo != null)
                    {
                        if (!strList.Contains("1"))
                        {
                            strList.Add("1");
                        }
                        continue;
                        //throw new Exception($"托盘号:{item.PalletNo}已有小车等待执行或正在执行的任务!");
                    }
                    //起始储位信息
                    var storageLocatBegin = storageLocat.First(w => w.LocatNo == item.LocatNo);
                    if (storageLocat == null)
                    {
                        throw new Exception($"托盘号:{item.PalletNo}所在的储位信息不存在,请检查!");
                    }
                    //获取目标储位
                    EndLocat = GetLocat(areaNo, item.SkuNo, item.LotNo, palletNo);
                    if (string.IsNullOrEmpty(EndLocat))
                    {
                        throw new Exception("分配目标储位失败,请检查!");
                    }
                    if (string.IsNullOrEmpty(hasLocatNoList))
                    {
                        hasLocatNoList = EndLocat;
                    }
                    else
                    {
                        hasLocatNoList = hasLocatNoList + "," + EndLocat;
                    }
                    //目标储位信息
                    var storageLocatEnd = storageLocat.First(w => w.LocatNo == EndLocat && w.Flag == "0" && w.Status == "0");
                    if (storageLocatEnd == null)
                    {
                        throw new Exception("目标储位信息不存在,请检查!");
                    }
                    //添加出库任务
                    var taskNo = new Common().GetMaxNo("TK");
                    var exTask = new LogTask
                    {
                        TaskNo = taskNo,
                        Sender = "WMS",
                        Receiver = "AGV",
                        IsSuccess = 0, //是否下发成功 0失败 1成功
                        Msg = string.Format("转运任务:{0}=>>{1}", item.LocatNo, EndLocat),
                        StartLocat = item.LocatNo,//起始位置
                        EndLocat = EndLocat,//目标位置
                        PalletNo = item.PalletNo,//托盘码
                        IsSend = 1,//是否可再次下发
                        IsCancel = 1,//是否可取消
                        IsFinish = 1,//是否可完成
                        Type = "2",//任务类型 0 入库任务 1 出库任务  2 移库任务
                        Status = "0",//任务状态0:等待执行1正在执行2执行完成
                        OrderType = "3",//0 入库单 1 出库单  2 盘点单  3 移库单
                        CreateTime = DateTime.Now
                    };
                    Db.Insertable(exTask).ExecuteCommand();
                    AgvSchedulingTask agvTask = new AgvSchedulingTask();
                    agvTask.ReqCode = taskNo;
                    agvTask.TaskTyp = "F01";
                    agvTask.WbCode = "";
                    agvTask.PositionCodePath = null;
                    agvTask.PodCode = "-1";
                    agvTaskList.Add(agvTask);
                    //修改库存明细信息
                    item.Status = "4";//移库锁定
                    //item.LockQty = item.Qty;//锁定库存数量
                    Db.Updateable(item).ExecuteCommand();
                    //修改起始储位地址状态
                    storageLocatBegin.Status = "5";//0:空储位 1:有物品 2:入库中 3:出库中 4:移入中 5:移出中
                    Db.Updateable(storageLocatBegin).ExecuteCommand();
                    //修改目标储位地址状态
                    storageLocatEnd.Status = "4";//0:空储位 1:有物品 2:入库中 3:出库中 4:移入中 5:移出中
                    Db.Updateable(storageLocatEnd).ExecuteCommand();
                    if (!strList.Contains("0"))
                    {
                        strList.Add("0");
                    }
                    //var stockInfo = stock.First(w => w.SkuNo == item.SkuNo && w.LotNo == item.LotNo);
                    ////修改库存信息
                    //stockInfo.LockQty += (decimal)item.Qty;//锁定数量
                    //Db.Updateable(stockInfo).ExecuteCommand();
                }
                if (string.IsNullOrEmpty(palletNo))
                {
                    //添加操作日志记录
                    var k = new OperationCrServer().AddLogOperationCr("PDA模块", "AGV转运", palletNo, "移库", $"PDA呼叫小车对出库单:{soNo}下所有托盘发起转运", userId);
                }
                else
                {
                    //添加操作日志记录
                    var k = new OperationCrServer().AddLogOperationCr("PDA模块", "AGV转运", palletNo, "移库", $"PDA呼叫小车对托盘号:{palletNo}发起转运", userId);
                }
                #region 呼叫小车代码
                var IsTrue = false;
                while (IsTrue == true)
                {
                    // 正式运行程序放开
                    string str = "";
                    var list2 = agvTaskList.Select(m => m.ReqCode).ToList();
                    var jsonData = JsonConvert.SerializeObject(agvTaskList);
                    string response = "";
                    try
                    {
                        var time1 = DateTime.Now;//发送时间 .ToString("yyyy-MM-dd HH:mm:ss")
                        response = HttpHelper.DoPost(url, jsonData, "下发给AGV转运取货命令", "AGV");
                        var time2 = DateTime.Now;//返回时间 .ToString("yyyy-MM-dd HH:mm:ss")
                        //////解析返回数据
                        var agvModel = JsonConvert.DeserializeObject<OutCommanAgvDto>(response);
                        if (agvModel.Code == "0")
                        {
                            //更改任务的发送返回时间//
                            new TaskServer().EditTaskIssueOk(list2, time1, time2);
                            str += "下发成功";
                            IsTrue = true;
                        }
                        if (agvModel.Code == "1")
                        {
                            new TaskServer().EditTaskIssueNo(list2, time1, time2, agvModel.Message);
                            throw new Exception(agvModel.Message);
                        }
                    }
                    catch (Exception ex)
                    {
                        throw new Exception(ex.Message);
                    }
                }
                #endregion
                //提交事务
                Db.CommitTran();
                return strList;
            }
            catch (Exception ex)
            {
                Db.RollbackTran();
                throw new Exception(ex.Message);
            }
        }
        /// <summary>
        /// 根据区域分配储位
        /// </summary>
        /// <param name="areaNo"></param>
        /// <param name="skuNo"></param>
        /// <param name="lotNo"></param>
        /// <returns></returns>
        private string GetLocat(string areaNo, string skuNo, string lotNo, string palletNo, string hasLocatNoList = "")
        {
            try
            {
                string endLocat = string.Empty;//目标储位
                                               //当然区域所有储位信息
                var storageLocatList = Db.Queryable<SysStorageLocat>().Where(w => w.WareHouseNo == "W02" && w.AreaNo == areaNo).ToList();
                //同区域同批次物料的储位信息
                List<string> locatList = Db.Queryable<DataStockDetail>().Where(w => w.IsDel == "0" && w.SkuNo == skuNo && w.LotNo == lotNo && w.WareHouseNo == "W02" && w.AreaNo == areaNo && w.PalletNo != palletNo)
                    .OrderByDescending(o => o.LocatNo).Select(s => s.LocatNo).Distinct().ToList();
                foreach (var item in locatList)
                {
                    var locatInfo = storageLocatList.Where(w => w.LocatNo == item).First();
                    var locatInfo2 = storageLocatList.Where(w => w.IsDel == "0" && w.Status == "0" && w.Flag == "0" && w.LocatNo != locatInfo.LocatNo && w.Row == locatInfo.Row && !hasLocatNoList.Contains(w.LocatNo))
                        .OrderByDescending(o => o.Column).First();
                    if (locatInfo2 != null)
                    {
                        endLocat = locatInfo2.LocatNo;
                    }
                }
                if (string.IsNullOrEmpty(endLocat))
                {
                    var locatInfo3 = storageLocatList.Where(w => w.IsDel == "0" && w.Flag == "0" && w.Status == "0" && !hasLocatNoList.Contains(w.LocatNo))
                                .OrderByDescending(m => m.Layer).OrderByDescending(m => m.Column).OrderByDescending(m => m.Row).First();
                    if (locatInfo3 != null)
                    {
                        endLocat = locatInfo3.LocatNo;
                    }
                }
                return endLocat;
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }
        #endregion
        #region 人工转运
        //人工转运
        public void ArtificialTransport(string palletNo, string locatNo, string endLocatNo, string mesTokenUrl, string mesUrl,int userId)
        {
            if (string.IsNullOrEmpty(palletNo))
            {
                throw new Exception("请扫描托盘条码!");
            }
            if (string.IsNullOrEmpty(locatNo))
            {
                throw new Exception("请选择起始地址!");
            }
            if (string.IsNullOrEmpty(endLocatNo))
            {
                throw new Exception("请输入目标地址!");
            }
            try
            {
                #region 判断信息
                var stockDetail = Db.Queryable<DataStockDetail>().Where(w => w.IsDel == "0" && w.PalletNo == palletNo).ToList();
                if (stockDetail.Count == 0)
                {
                    throw new Exception("托盘上物料库存明细信息不存在,请检查!");
                }
                if (string.IsNullOrEmpty(stockDetail.First().LocatNo))
                {
                    throw new Exception("托盘储位信息不存在,请检查!");
                }
                if (stockDetail.First().WareHouseNo != "W02")
                {
                    throw new Exception("该托盘未在平库内,请检查!");
                }
                //起始储位信息
                var storageLocat = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.LocatNo == locatNo);
                if (storageLocat == null)
                {
                    throw new Exception("起始地址储位信息不存在,请检查!");
                }
                //目标储位信息
                var EndLocat = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.LocatNo == endLocatNo);
                if (EndLocat == null)
                {
                    throw new Exception("目标地址储位信息不存在,请检查!");
                }
                #endregion
                //开启事务
                Db.BeginTran();
                //需先判断目标地址前方是否有空储位
                storageLocat.Status = "0"; //更改起始储位
                Db.Updateable(storageLocat).ExecuteCommand();
                EndLocat.Status = "1"; //更改目标储位
                Db.Updateable(storageLocat).ExecuteCommand();
                var data = new List<RequertBeiliaoInfoModel>();
                //更改库存明细
                foreach (var item in stockDetail)
                {
                    item.LocatNo = EndLocat.LocatNo;//储位更改
                    item.WareHouseNo = EndLocat.WareHouseNo;//所属仓库更改
                    item.RoadwayNo = EndLocat.RoadwayNo;//所属巷道更改
                    item.AreaNo = EndLocat.AreaNo;//所属区域更改
                    Db.Updateable(item).ExecuteCommand();
                    if (EndLocat != null && EndLocat.AreaNo == "B12") //是否是3楼缓存区 是:删除库存
                    {
                        if (string.IsNullOrWhiteSpace(item.SONo))
                        {
                            throw new Exception("当前托盘不是拼托出库托盘");
                        }
                        var boxInfo = Db.Queryable<DataBoxInfo>().Where(m => m.IsDel == "0" && m.StockDetailId == item.Id).ToList();
                        if (boxInfo.Count == 0)
                        {
                            throw new Exception("托盘上物料箱码信息不存在,请检查!");
                        }
                        //记录托盘上信息给MES
                        foreach (var item2 in boxInfo) {
                            data.Add(new RequertBeiliaoInfoModel()
                            {
                                no = item2.BoxNo,
                                materiel_no = item.SkuNo,
                                materiel_name = item.SkuName,
                                qty = item.Qty,
                                batch = item.LotNo,
                                producttime = item.ProductionTime,
                                expiry = item.ExpirationTime
                            });
                        }
                        //库存箱码明细删除
                        Db.Deleteable(boxInfo).ExecuteCommand();
                        //删除库存托盘信息
                        Db.Deleteable(item).ExecuteCommand();
                        //更改库存总表
                        var stock = Db.Queryable<DataStock>().First(w => w.IsDel == "0" && w.SkuNo == item.SkuNo && w.LotNo == item.LotNo);
                        stock.LockQty -= (decimal)item.Qty;
                        stock.Qty -= (decimal)item.Qty;
                        Db.Updateable(stock).ExecuteCommand();
                        //更改托盘状态
                        var pallet = Db.Queryable<SysPallets>().First(m => m.IsDel == "0" && m.PalletNo == palletNo);
                        if (pallet != null)
                        {
                            pallet.Status = "0";
                            Db.Updateable(pallet).ExecuteCommand();
                        }
                    }
                }
                if (EndLocat != null && EndLocat.AreaNo == "B12")
                {
                    //获取令牌
                    var token = new Token().GetMesToken(mesTokenUrl);
                    Dictionary<string, string> mesDic = new Dictionary<string, string>()
                    {
                        {"Authorization",token }
                    };
                    var mesData = new RequertBeiliaoModel()
                    {
                        morder_no = stockDetail.First().SONo,
                        pallet = stockDetail.First().PalletNo,
                        layer_no = EndLocat.LocatNo,
                        items = data
                    };
                    var jsonData = JsonConvert.SerializeObject(mesData);
                    //调用接口
                    var response = HttpHelper.DoPost(mesUrl, jsonData, "备料完成运至缓存区反馈至MES", "MES", mesDic);
                    var obj = JsonConvert.DeserializeObject<MesModel>(response);//解析返回数据
                    if (obj.status != "0")
                    {
                        throw new Exception("备料同步MES失败:" + obj.message);
                    }
                }
                //添加操作日志记录
                var k = new OperationCrServer().AddLogOperationCr("PDA模块", "AGV转运", palletNo, "移库", $"PDA呼叫小车对托盘号:{palletNo}发起转运", userId);
                //提交事务
                Db.CommitTran();
            }
@@ -909,6 +1496,116 @@
                Db.RollbackTran();
                throw new Exception(ex.Message);
            }
        }
        #endregion
        #region 箱码查询
        /// <summary>
        /// 箱码查询
        /// </summary>
        /// <param name="boxNo">箱码</param>
        /// <returns></returns>
        public DataBoxDto GetBoxQueryList(string boxNo)
        {
            // 实例化返回类
            DataBoxDto boxModel = new DataBoxDto();
            List<DataBoxInfoDto> list = new List<DataBoxInfoDto>();
            // 根据箱码获取箱信息
            var boxData = Db.Queryable<DataBoxInfo>().Where(m => m.IsDel == "0" && m.BoxNo == boxNo);
            if (boxData.Count() == 0)
            {
                // 根据盒码获取箱信息
                boxData = Db.Queryable<DataBoxInfo>().Where(m => m.IsDel == "0" && m.BoxNo2 == boxNo);
                if (boxData.Count() == 0)
                {
                    boxModel = Db.Queryable<DataBoxInfo>().Where(m => m.IsDel == "0" && m.BoxNo3 == boxNo).Select(it => new DataBoxDto() { Qty = it.Qty }, true).First();
                    return boxModel;
                }
                list = boxData.Select(it => new DataBoxInfoDto()
                {
                    BoxNo2 = it.BoxNo3,
                    Qty2 = it.Qty
                }).ToList();
                boxData = Db.Queryable<DataBoxInfo>().Where(m => m.IsDel == "0" && m.BoxNo2 == boxNo);
                boxModel = boxData.GroupBy(m => new
                {
                    m.BoxNo,
                    m.SkuName,
                    m.SkuNo,
                    m.LotNo,
                    m.SupplierLot,
                    m.InspectStatus
                }).Select(it => new DataBoxDto()
                {
                    BoxNo = it.BoxNo,
                    SkuName = it.SkuName,
                    SkuNo = it.SkuNo,
                    LotNo = it.LotNo,
                    SupplierLot = it.SupplierLot,
                    InspectStatus = it.InspectStatus == "0" ? "待检" : it.InspectStatus == "1" ? "合格":"不合格",
                    Qty = SqlFunc.AggregateSum(it.Qty)
                }).First();
                boxModel.InfoList = list;
                return boxModel;
            }
            else  //箱码内数据
            {
                // 处理多级码
                var num = boxData.Count(m => !string.IsNullOrWhiteSpace(m.BoxNo2));
                if (num > 0)
                {
                    list = boxData.GroupBy(m => new
                    {
                        m.BoxNo2
                    }).Select(it => new DataBoxInfoDto()
                    {
                        BoxNo2 = it.BoxNo2,
                        Qty2 = SqlFunc.AggregateSum(it.Qty)
                    }).ToList();
                }
                else
                {
                    list = boxData.Select(it => new DataBoxInfoDto()
                    {
                        BoxNo2 = SqlFunc.IsNull(it.BoxNo3,""),
                        Qty2 = it.Qty
                    }).ToList();
                }
                // 箱码信息赋值
                boxData = Db.Queryable<DataBoxInfo>().Where(m => m.IsDel == "0" && m.BoxNo == boxNo);
                boxModel = boxData.GroupBy(m => new
                {
                    m.BoxNo,
                    m.SkuName,
                    m.SkuNo,
                    m.LotNo,
                    m.SupplierLot,
                    m.InspectStatus
                }).Select(it => new DataBoxDto()
                {
                    BoxNo = it.BoxNo,
                    SkuName = it.SkuName,
                    SkuNo = it.SkuNo,
                    LotNo = it.LotNo,
                    SupplierLot = it.SupplierLot,
                    InspectStatus = it.InspectStatus == "0" ? "待检" : it.InspectStatus == "1" ? "合格" : "不合格",
                    Qty = SqlFunc.AggregateSum(it.Qty)
                }).First();
                boxModel.InfoList = list;
                return boxModel;
            }
        }
        #endregion