wxw
2024-08-13 adb69643f9f8fef29f2f20f51ee8faff97583ad2
Wms/WMS.BLL/BllPdaServer/PdaCrServer.cs
@@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Model.ModelDto.BllCheckDto;
using Model.ModelDto.PdaDto;
using SqlSugar;
@@ -27,410 +28,376 @@
        #region 盘点
        //获取盘库单正在执行单号
        public List<string> GetStockCheckNoList(string palletNo)
        public async Task<List<string>> GetStockCheckNoList(string palletNo)
        {
            try
            List<string> list;
            if (!string.IsNullOrWhiteSpace(palletNo))
            {
                List<string> list;
                if (!string.IsNullOrWhiteSpace(palletNo))
                {
                    list = Db.Queryable<BllStockCheckDetail>().Where(m => m.IsDel == "0" && m.PalletNo == palletNo && m.Status == 2).Select(m => m.CRNo).Distinct().ToList();
                }
                else
                {
                    list = Db.Queryable<BllStockCheck>().Where(m => m.IsDel == "0" && m.Status == 1).Select(m => m.CRNo)
                        .Distinct().ToList();
                }
                return list;
                list = await Db.Queryable<BllStockCheckDetail>().Where(m => m.IsDel == "0" && m.PalletNo == palletNo && m.Status == 2).Select(m => m.CRNo).Distinct().ToListAsync();
            }
            catch (Exception e)
            else
            {
                throw new Exception(e.Message);
                list = await Db.Queryable<BllStockCheck>().Where(m => m.IsDel == "0" && m.Status == 1).Select(m => m.CRNo)
                    .Distinct().ToListAsync();
            }
            return list;
        }
        //获取盘点明细物料批次信息
        public List<StockCheckDetailDto> GetStockCheckDetailList(string crNo, string palletNo)
        public async Task<List<StockCheckDetailDto>> GetStockCheckDetailList(string crNo, string palletNo)
        {
            try
            if (string.IsNullOrWhiteSpace(crNo))
            {
                if (string.IsNullOrWhiteSpace(crNo))
                {
                    throw new Exception("盘点单据不能为空");
                }
                var list = Db.Queryable<BllStockCheckDetail>().Where(m => m.IsDel == "0" && m.CRNo == crNo);
                if (!string.IsNullOrWhiteSpace(palletNo))
                {
                    list = list.Where(m => m.PalletNo == palletNo);
                }
                var data = list.GroupBy(m => new { m.SkuNo, m.SkuName, m.LotNo }).Select(m => new StockCheckDetailDto()
                {
                    SkuNo = m.SkuNo,
                    SkuName = m.SkuName,
                    LotNo = m.LotNo
                }).ToList();
                return data;
                throw Oops.Bah("盘点单据不能为空");
            }
            catch (Exception e)
            var list = Db.Queryable<BllStockCheckDetail>().Where(m => m.IsDel == "0" && m.CRNo == crNo);
            if (!string.IsNullOrWhiteSpace(palletNo))
            {
                throw new Exception(e.Message);
                list = list.Where(m => m.PalletNo == palletNo);
            }
            var data = await list.GroupBy(m => new { m.SkuNo, m.SkuName, m.LotNo }).Select(m => new StockCheckDetailDto()
            {
                SkuNo = m.SkuNo,
                SkuName = m.SkuName,
                LotNo = m.LotNo
            }).ToListAsync();
            return data;
        }
        //获取要盘点的箱码信息(盘点记录中数据)
        public List<StockCheckLogDto> GetStockCheckLogList(string crNo, string crDetail, string palletNo, string boxNo, string isContinue)
        public async Task<List<StockCheckLogDto>> GetStockCheckLogList(string crNo, string crDetail, string palletNo, string boxNo, string isContinue)
        {
            try
            if (string.IsNullOrWhiteSpace(crNo))
            {
                if (string.IsNullOrWhiteSpace(crNo))
                {
                    throw new Exception("盘点单据不能为空");
                }
                if (string.IsNullOrWhiteSpace(crDetail))
                {
                    throw new Exception("物料批次不能为空");
                }
                if (string.IsNullOrWhiteSpace(palletNo))
                {
                    throw new Exception("托盘码不能为空");
                }
                throw Oops.Bah("盘点单据不能为空");
            }
            if (string.IsNullOrWhiteSpace(crDetail))
            {
                throw Oops.Bah("物料批次不能为空");
            }
            if (string.IsNullOrWhiteSpace(palletNo))
            {
                throw Oops.Bah("托盘码不能为空");
            }
                var detail = crDetail.Split("-");
                var sku = detail[0];
                //判断是否为无码物料
                var skuinfo = Db.Queryable<SysMaterials>().First(m => m.IsDel == "0" && m.SkuNo == sku);
                //判断是否存在物料消息
                if (skuinfo == null)
            var detail = crDetail.Split("-");
            var sku = detail[0];
            //判断是否为无码物料
            var skuinfo = await Db.Queryable<SysMaterials>().FirstAsync(m => m.IsDel == "0" && m.SkuNo == sku);
            //判断是否存在物料消息
            if (skuinfo == null)
            {
                throw Oops.Bah("托盘码不能为空");
            }
            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);
            //if (deList.Count() == 0)
            //{
            //    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);
            }
            List<StockCheckLogDto> data = new List<StockCheckLogDto>();
            //判断是否为无码物料
            if (isQtySku == 1)
            {
                //获取库存信息
                var stockDetail = Db.Queryable<DataStockDetail>().First(a => a.IsDel == "0" && a.Status == "3" && a.SkuNo == sku && a.PalletNo == palletNo);
                var model = new StockCheckLogDto()
                {
                    throw new Exception("托盘码不能为空");
                }
                int isQtySku = 0;
                if (skuinfo.Type == "4" && isContinue == "1")
                    PalletNo = palletNo,
                    SkuNo = sku,
                    Qty = stockDetail.Qty,
                    CheckResult = 4,
                };
                data.Add(model);
            }
            else
            {
                data = await list.Select(m => new StockCheckLogDto()
                {
                    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);
                //if (deList.Count() == 0)
                //{
                //    throw new Exception("未查询到托盘上的盘点物料批次信息");
                //}
                list = list.Where(m => m.SkuNo == sku && m.LotNo == lotNo && m.PalletNo == palletNo);
                    BoxNo = m.BoxNo,
                    BoxNo3 = m.BoxNo3,
                    SkuNo = m.SkuNo,
                    SkuName = m.SkuName,
                    LotNo = m.LotNo,
                    Qty = m.Qty,
                    CheckResult = m.CheckResult,
                }).ToListAsync();
            }
            return data;
        }
        public async Task CrSetCheck(string crNo, string crDetail, string palletNo, string boxNo, string boxNo3, string result, decimal? qty, string isContinue, int userId)
        {
            if (string.IsNullOrWhiteSpace(crNo))
            {
                throw Oops.Bah("盘点单据不能为空");
            }
            if (string.IsNullOrWhiteSpace(crDetail))
            {
                throw Oops.Bah("物料批次不能为空");
            }
            if (string.IsNullOrWhiteSpace(palletNo))
            {
                throw Oops.Bah("托盘码不能为空");
            }
            //箱码为空  是整托要盘点的都正常
            var detail = crDetail.Split("-");
            var sku = detail[0];
            var lotNo = detail[1];
            //盘点明细
            var checkDetail = await Db.Queryable<BllStockCheckDetail>().FirstAsync(m =>
                m.IsDel == "0" && m.CRNo == crNo && m.PalletNo == palletNo && m.SkuNo == sku && m.LotNo == lotNo);
            if (checkDetail == null)
            {
                throw Oops.Bah("未查询到未盘点的盘点明细信息");
            }
            var modSku = await Db.Queryable<SysMaterials>().Where(s => s.SkuNo == sku).FirstAsync();
            if (modSku.IsPasteCode == "1" && isContinue == "1")
            {
                throw Oops.Bah("贴标物料不允许数量盘点");
            }
            else if (modSku.IsPasteCode == "0" && isContinue == "0")
            {
                throw Oops.Bah("不贴标物料请使用数量盘点");
            }
            //盘点记录
            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))
                {
                    list = list.Where(m => m.BoxNo == boxNo);
                    checkLog = checkLog.Where(m => m.BoxNo == boxNo);
                }
                List<StockCheckLogDto> data = new List<StockCheckLogDto>();
                //判断是否为无码物料
                if (isQtySku == 1)
                if (!string.IsNullOrWhiteSpace(boxNo3))
                {
                    //获取库存信息
                    var stockDetail = Db.Queryable<DataStockDetail>().First(a => a.IsDel == "0" && a.Status == "3" && a.SkuNo == sku && a.PalletNo == palletNo);
                    checkLog = checkLog.Where(m => m.BoxNo3 == boxNo3);
                }
                    var model = new StockCheckLogDto()
                if (await checkLog.CountAsync() == 0 && isContinue == "0")
                {
                    throw Oops.Bah("未查询到未盘点的箱支信息");
                }
                var list = await checkLog.ToListAsync();
                var num = 0;
                foreach (var l in list)
                {
                    if (l.CheckResult != null)
                    {
                        continue;
                    }
                    l.RealQty = l.Qty;
                    l.CheckResult = 0;
                    l.CheckDate = time;
                    l.CheckUserId = userId;
                    num += Convert.ToInt32(l.Qty);
                }
                if (checkDetail.RealQty == null)
                {
                    checkDetail.RealQty = 0;
                }
                checkDetail.RealQty += num;
                checkDetail.CheckResult = 0;
                //if (checkDetail.CheckResult == null || checkDetail.CheckResult == 0)
                //{
                //    checkDetail.CheckResult = 0;
                //}
                await Db.Updateable(checkDetail).ExecuteCommandAsync();
                await Db.Updateable(list).ExecuteCommandAsync();
            }
            //盘亏
            else if (result == "1")
            {
                if (!string.IsNullOrWhiteSpace(boxNo))
                {
                    checkLog = checkLog.Where(m => m.BoxNo == boxNo);
                }
                if (!string.IsNullOrWhiteSpace(boxNo3))
                {
                    checkLog = checkLog.Where(m => m.BoxNo3 == boxNo3);
                }
                if (checkLog.Count() == 0 && isContinue == "0")
                {
                    throw Oops.Bah("未查询到箱支信息");
                }
                //
                if (isContinue == "1")
                {
                    if (qty == null || qty <= 0)
                    {
                        throw Oops.Bah("数量盘点时、盘亏数量不能为空且需大于0");
                    }
                }
                var list = checkLog.ToList();
                var num = 0;
                foreach (var l in list)
                {
                    l.RealQty = 0;
                    l.CheckResult = 1;
                    l.CheckDate = time;
                    l.CheckUserId = userId;
                    num -= Convert.ToInt32(l.RealQty);
                }
                if (checkDetail.RealQty == null)
                {
                    checkDetail.RealQty = 0;
                }
                checkDetail.RealQty += num;
                if (isContinue == "1")
                {
                    checkDetail.RealQty = qty;
                }
                checkDetail.CheckResult = 1;
                var checkInfo = await Db.Queryable<BllStockCheckLog>().FirstAsync(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;
                await Db.Updateable(checkInfo).ExecuteCommandAsync();
                await Db.Updateable(checkDetail).ExecuteCommandAsync();
                await Db.Updateable(list).ExecuteCommandAsync();
            }
            //盘盈
            else if (result == "2")
            {
                if (isContinue == "0")
                {
                    if (string.IsNullOrWhiteSpace(boxNo) || string.IsNullOrWhiteSpace(boxNo3))
                    {
                        throw Oops.Bah("盘盈时箱码与支码不能为空");
                    }
                }
                if (qty == null || qty <= 0)
                {
                    throw Oops.Bah("盘盈时数量不能为空且需大于0");
                }
                if (isContinue == "0")
                {
                    var count = await Db.Queryable<DataBoxInfo>()
                    .CountAsync(m => m.IsDel == "0" && m.BoxNo == boxNo && m.BoxNo3 == boxNo3);
                    var count2 = await Db.Queryable<BllStockCheckLog>()
                        .CountAsync(m => m.IsDel == "0" && m.BoxNo == boxNo && m.BoxNo3 == boxNo3);
                    if (count > 0 || count2 > 0)
                    {
                        throw Oops.Bah("当前库存中已存在该箱支信息");
                    }
                }
                BllStockCheckLog crLog = new BllStockCheckLog();
                if (isContinue == "0")
                {
                    crLog = new BllStockCheckLog()
                    {
                        CRNo = crNo,
                        PalletNo = palletNo,
                        SkuNo = sku,
                        Qty = stockDetail.Qty,
                        CheckResult = 4,
                        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,
                        CreateUser = userId,
                        CreateTime = time
                    };
                    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)
            {
                throw new Exception(e.Message);
            }
        }
        public void CrSetCheck(string crNo, string crDetail, string palletNo, string boxNo, string boxNo3, string result, decimal? qty, string isContinue, int userId)
        {
            try
            {
                if (string.IsNullOrWhiteSpace(crNo))
                {
                    throw Oops.Bah("盘点单据不能为空");
                }
                if (string.IsNullOrWhiteSpace(crDetail))
                {
                    throw Oops.Bah("物料批次不能为空");
                }
                if (string.IsNullOrWhiteSpace(palletNo))
                {
                    throw Oops.Bah("托盘码不能为空");
                }
                //箱码为空  是整托要盘点的都正常
                var detail = crDetail.Split("-");
                var sku = detail[0];
                var lotNo = detail[1];
                //盘点明细
                var checkDetail = Db.Queryable<BllStockCheckDetail>().First(m =>
                    m.IsDel == "0" && m.CRNo == crNo && m.PalletNo == palletNo && m.SkuNo == sku && m.LotNo == lotNo);
                if (checkDetail == null)
                {
                    throw Oops.Bah("未查询到未盘点的盘点明细信息");
                }
                var modSku = Db.Queryable<SysMaterials>().Where(s => s.SkuNo == sku).First();
                if (modSku.IsPasteCode == "1" && isContinue == "1")
                {
                    throw Oops.Bah("贴标物料不允许数量盘点");
                }
                else if (modSku.IsPasteCode == "0" && isContinue == "0")
                {
                    throw Oops.Bah("不贴标物料请使用数量盘点");
                }
                //盘点记录
                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))
                    {
                        checkLog = checkLog.Where(m => m.BoxNo == boxNo);
                    }
                    if (!string.IsNullOrWhiteSpace(boxNo3))
                    {
                        checkLog = checkLog.Where(m => m.BoxNo3 == boxNo3);
                    }
                    if (checkLog.Count() == 0 && isContinue == "0")
                    {
                        throw Oops.Bah("未查询到未盘点的箱支信息");
                    }
                    var list = checkLog.ToList();
                    var num = 0;
                    foreach (var l in list)
                    {
                        if (l.CheckResult != null)
                        {
                            continue;
                        }
                        l.RealQty = l.Qty;
                        l.CheckResult = 0;
                        l.CheckDate = time;
                        l.CheckUserId = userId;
                        num += Convert.ToInt32(l.Qty);
                    }
                    if (checkDetail.RealQty == null)
                    {
                        checkDetail.RealQty = 0;
                    }
                    checkDetail.RealQty += num;
                    checkDetail.CheckResult = 0;
                    //if (checkDetail.CheckResult == null || checkDetail.CheckResult == 0)
                    //{
                    //    checkDetail.CheckResult = 0;
                    //}
                    Db.Updateable(checkDetail).ExecuteCommand();
                    Db.Updateable(list).ExecuteCommand();
                }
                //盘亏
                else if (result == "1")
                {
                    if (!string.IsNullOrWhiteSpace(boxNo))
                    {
                        checkLog = checkLog.Where(m => m.BoxNo == boxNo);
                    }
                    if (!string.IsNullOrWhiteSpace(boxNo3))
                    {
                        checkLog = checkLog.Where(m => m.BoxNo3 == boxNo3);
                    }
                    if (checkLog.Count() == 0 && isContinue == "0")
                    {
                        throw Oops.Bah("未查询到箱支信息");
                    }
                    //
                    if (isContinue == "1")
                    {
                        if (qty == null || qty <= 0)
                        {
                            throw Oops.Bah("数量盘点时、盘亏数量不能为空且需大于0");
                        }
                    }
                    var list = checkLog.ToList();
                    var num = 0;
                    foreach (var l in list)
                    {
                        l.RealQty = 0;
                        l.CheckResult = 1;
                        l.CheckDate = time;
                        l.CheckUserId = userId;
                        num -= Convert.ToInt32(l.RealQty);
                    }
                    if (checkDetail.RealQty == null)
                    {
                        checkDetail.RealQty = 0;
                    }
                    checkDetail.RealQty += num;
                    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);
                    var checkInfo = await Db.Queryable<BllStockCheckLog>().FirstAsync(m =>
                m.IsDel == "0" && m.CRNo == crNo && m.PalletNo == palletNo && m.SkuNo == sku && m.LotNo == lotNo);
                    checkInfo.RealQty = qty;
                    checkInfo.CheckResult = 1;
                    checkInfo.CheckResult = 2;
                    checkInfo.CheckUserId = userId;
                    checkInfo.CheckDate = time;
                    checkInfo.UpdateUser = userId;
                    checkInfo.UpdateTime = time;
                    Db.Updateable(checkInfo).ExecuteCommand();
                    Db.Updateable(checkDetail).ExecuteCommand();
                    Db.Updateable(list).ExecuteCommand();
                    await Db.Updateable(checkInfo).ExecuteCommandAsync();
                }
                //盘盈
                else if (result == "2")
                if (checkDetail.RealQty == null && isContinue == "0")
                {
                    if (isContinue == "0")
                    {
                        if (string.IsNullOrWhiteSpace(boxNo) || string.IsNullOrWhiteSpace(boxNo3))
                        {
                            throw Oops.Bah("盘盈时箱码与支码不能为空");
                        }
                    }
                    if (qty == null || qty <= 0)
                    {
                        throw Oops.Bah("盘盈时数量不能为空且需大于0");
                    }
                    if (isContinue == "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)
                        {
                            throw Oops.Bah("当前库存中已存在该箱支信息");
                        }
                    }
                    BllStockCheckLog crLog = new BllStockCheckLog();
                    if (isContinue == "0")
                    {
                        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,
                            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;
                    if (isContinue == "1")
                    {
                        checkDetail.RealQty = qty;
                    }
                    checkDetail.CheckResult = 2;
                    Db.Updateable(checkDetail).ExecuteCommand();
                    if (isContinue == "0")
                    {
                        Db.Insertable(crLog).ExecuteCommand();
                    }
                    checkDetail.RealQty = 0;
                }
                else
                checkDetail.RealQty += qty;
                if (isContinue == "1")
                {
                    Db.RollbackTran();
                    throw Oops.Bah("盘点结果不符,请核实!");
                    checkDetail.RealQty = qty;
                }
                var checkLogNum = Db.Queryable<BllStockCheckLog>().Where(m => m.IsDel == "0" && m.CRNo == crNo && m.PalletNo == palletNo && m.SkuNo == sku && m.LotNo == lotNo);
                if (checkLogNum.Count(m => m.CheckResult == null) == 0)
                checkDetail.CheckResult = 2;
                await Db.Updateable(checkDetail).ExecuteCommandAsync();
                if (isContinue == "0")
                {
                    var checkDe = Db.Queryable<BllStockCheckDetail>().First(m =>
                        m.IsDel == "0" && m.CRNo == crNo && m.PalletNo == palletNo && m.SkuNo == sku && m.LotNo == lotNo);
                    checkDe.Status = 3;
                    Db.Updateable(checkDe).ExecuteCommand();
                    var checkDeNum = Db.Queryable<BllStockCheckDetail>().Count(m =>
                        m.IsDel == "0" && m.CRNo == crNo && m.Status != 3 && m.Id != checkDe.Id);
                    if (checkDeNum == 0)
                    {
                        var check = Db.Queryable<BllStockCheck>().First(m => m.CRNo == crNo && m.IsDel == "0");
                        check.Status = 2;
                        check.CompleteDate = DateTime.Now;
                        Db.Updateable(check).ExecuteCommand();
                    }
                    await Db.Insertable(crLog).ExecuteCommandAsync();
                }
                Db.CommitTran();
            }
            catch (Exception e)
            else
            {
                Db.RollbackTran();
                throw new Exception(e.Message);
                throw Oops.Bah("盘点结果不符,请核实!");
            }
            var checkLogNum = Db.Queryable<BllStockCheckLog>().Where(m => m.IsDel == "0" && m.CRNo == crNo && m.PalletNo == palletNo && m.SkuNo == sku && m.LotNo == lotNo);
            if (await checkLogNum.CountAsync(m => m.CheckResult == null) == 0)
            {
                var checkDe = await Db.Queryable<BllStockCheckDetail>().FirstAsync(m =>
                    m.IsDel == "0" && m.CRNo == crNo && m.PalletNo == palletNo && m.SkuNo == sku && m.LotNo == lotNo);
                checkDe.Status = 3;
                await Db.Updateable(checkDe).ExecuteCommandAsync();
                var checkDeNum = await Db.Queryable<BllStockCheckDetail>().CountAsync(m =>
                    m.IsDel == "0" && m.CRNo == crNo && m.Status != 3 && m.Id != checkDe.Id);
                if (checkDeNum == 0)
                {
                    var check = await Db.Queryable<BllStockCheck>().FirstAsync(m => m.CRNo == crNo && m.IsDel == "0");
                    check.Status = 2;
                    check.CompleteDate = DateTime.Now;
                    await Db.Updateable(check).ExecuteCommandAsync();
                }
            }
        }
@@ -444,29 +411,13 @@
        /// <param name="locatNo">储位编号</param>
        /// <param name="palletNo">托盘号</param> 
        /// <returns></returns>
        public List<DataStockDetail> GetStockQueryList(string locatNo, string palletNo)
        public async Task<List<DataStockDetail>> GetStockQueryList(string locatNo, string palletNo)
        {
            string str = "select LocatNo,PalletNo,SkuName,SkuNo,Standard,LotNo,Qty,LockQty,FrozenQty,InspectQty from DataStockDetail Where IsDel = @isdel";
            //判断储位编号是否为空
            if (!string.IsNullOrEmpty(locatNo))
            {
                str += " and LocatNo like @locatno";
            }
            //判断托盘号是否为空
            if (!string.IsNullOrEmpty(palletNo))
            {
                str += " and PalletNo like @palletno";
            }
            return await Db.Queryable<DataStockDetail>()
                     .Where(s => s.IsDel == "0" && s.LocatNo.Contains(locatNo) && s.PalletNo.Contains(palletNo))
                     .OrderBy(s => new { s.LotNo, s.LocatNo, s.PalletNo })
                     .ToListAsync();
            //排序
            str += " order by LotNo,LocatNo,PalletNo";
            List<DataStockDetail> stockList = Db.Ado.SqlQuery<DataStockDetail>(str, new
            {
                isdel = "0", //是否删除
                locatno = "%" + locatNo + "%", //储位编号
                palletno = "%" + palletNo + "%", //托盘号
            });
            return stockList;
        }
        #endregion
@@ -474,238 +425,145 @@
        #region 托盘变更(托盘解绑绑定)
        //根据托盘号获取箱码和箱内数量
        public List<PdaPalletNoCheckDto> GetDataDetailList(string palletNo)
        public async Task<List<PdaPalletNoCheckDto>> GetDataDetailList(string palletNo)
        {
            try
            if (string.IsNullOrWhiteSpace(palletNo))
            {
                if (string.IsNullOrWhiteSpace(palletNo))
                throw Oops.Bah("托盘号不能为空");
            }
            var detail = await Db.Queryable<DataStockDetail>().Where(m => m.IsDel == "0" && m.PalletNo == palletNo).Select(m => m.Id).ToListAsync();
            var info = await Db.Queryable<DataBoxInfo>().Where(m => m.IsDel == "0" && detail.Contains(m.StockDetailId))
                .GroupBy(m => m.BoxNo).Select(a => new PdaPalletNoCheckDto
                {
                    throw new Exception("托盘号不能为空");
                }
                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
                    {
                        BoxNo = a.BoxNo,
                        Qty = SqlFunc.AggregateSum(a.Qty)
                    }).ToList();
                return info;
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
                    BoxNo = a.BoxNo,
                    Qty = SqlFunc.AggregateSum(a.Qty)
                }).ToListAsync();
            return info;
        }
        //根据箱码获取物料、批次、数量等信息
        public PdaPalletNoCheckDto GetBoxInfoByBox(string boxNo)
        public async Task<PdaPalletNoCheckDto> GetBoxInfoByBox(string boxNo)
        {
            try
            if (string.IsNullOrWhiteSpace(boxNo))
            {
                if (string.IsNullOrWhiteSpace(boxNo))
                {
                    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
                    {
                        BoxNo = a.BoxNo,
                        SkuNo = a.SkuNo,
                        SkuName = a.SkuName,
                        LotNo = a.LotNo,
                        Qty = SqlFunc.AggregateSum(a.Qty)
                    }).ToList();
                if (info.Count > 1)
                {
                    throw new Exception("当前箱码查询出多条物料或批次信息,请核实");
                }
                return info.FirstOrDefault();
                throw Oops.Bah("箱码不能为空");
            }
            catch (Exception e)
            var info = await 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
                {
                    BoxNo = a.BoxNo,
                    SkuNo = a.SkuNo,
                    SkuName = a.SkuName,
                    LotNo = a.LotNo,
                    Qty = SqlFunc.AggregateSum(a.Qty)
                }).ToListAsync();
            if (info.Count > 1)
            {
                throw new Exception(e.Message);
                throw Oops.Bah("当前箱码查询出多条物料或批次信息,请核实");
            }
            return info.FirstOrDefault();
        }
        //解绑原托盘绑定新托盘
        public void SaveUnbind(string palletNo, string boxNo, string palletNoNew, int userId)
        public async Task SaveUnbind(string palletNo, string boxNo, string palletNoNew, int userId)
        {
            try
            if (string.IsNullOrWhiteSpace(palletNo) || string.IsNullOrWhiteSpace(palletNoNew))
            {
                if (string.IsNullOrWhiteSpace(palletNo) || string.IsNullOrWhiteSpace(palletNoNew))
                throw Oops.Bah("新旧托盘号不能为空");
            }
            if (palletNo == palletNoNew)
            {
                throw Oops.Bah("新旧托盘号不能为相同");
            }
            //库存箱支信息
            var infos = Db.Queryable<DataBoxInfo>().Where(m => m.IsDel == "0" && m.PalletNo == palletNo);//整托变更
            if (!string.IsNullOrWhiteSpace(boxNo))
            {
                //按箱变更
                infos = infos.Where(m => m.IsDel == "0" && m.BoxNo == boxNo);
            }
            List<DataBoxInfo> infosList = await infos.ToListAsync();
            if (infosList.Count <= 0)
            {
                throw Oops.Bah("原托盘上未查到箱支明细,请核实");
            }
            //库存明细id
            var infoIds = await infos.GroupBy(m => m.StockDetailId).Select(a => a.StockDetailId).ToListAsync();
            if (infoIds.Count == 0)
            {
                throw Oops.Bah("未查询到当前箱码信息,请核实");
            }
            var comTime = DateTime.Now;
            //新托盘库存明细
            bool newPalletHaveGoods = false;//新托盘上是否有物品
            string pallWareHouseNo = string.Empty;//新托盘所在的位置(库外/平库)
            var stockDetailList = await Db.Queryable<DataStockDetail>().Where(m => m.IsDel == "0" && m.PalletNo == palletNoNew).ToListAsync();
            if (stockDetailList != null && stockDetailList.Count() > 0)
            {
                newPalletHaveGoods = true;
                pallWareHouseNo = stockDetailList[0].WareHouseNo;
                if (!string.IsNullOrEmpty(stockDetailList[0].LocatNo))
                {
                    throw new Exception("新旧托盘号不能为空");
                    throw Oops.Bah("新托盘在立库内不允许变更,请核实");
                }
                if (palletNo == palletNoNew)
                #region 验证是否允许立库同托盘不同物料入库或同托盘同物料不同批次入库
                var box = await Db.Queryable<DataBoxInfo>().FirstAsync(m => m.IsDel == "0" && m.PalletNo == palletNoNew && m.BitBoxMark == "0");
                if (box != null)
                {
                    throw new Exception("新旧托盘号不能为相同");
                }
                //库存箱支信息
                var infos = Db.Queryable<DataBoxInfo>().Where(m => m.IsDel == "0" && m.PalletNo == palletNo);//整托变更
                if (!string.IsNullOrWhiteSpace(boxNo))
                {
                    //按箱变更
                    infos = infos.Where(m => m.IsDel == "0" && m.BoxNo == boxNo);
                }
                List<DataBoxInfo> infosList = infos.ToList();
                if (infosList.Count <= 0)
                {
                    throw new Exception("原托盘上未查到箱支明细,请核实");
                }
                //库存明细id
                var infoIds = infos.GroupBy(m => m.StockDetailId).Select(a => a.StockDetailId).ToList();
                if (infoIds.Count == 0)
                {
                    throw new Exception("未查询到当前箱码信息,请核实");
                }
                //开启事务
                Db.BeginTran();
                var comTime = DateTime.Now;
                //新托盘库存明细
                bool newPalletHaveGoods = false;//新托盘上是否有物品
                string pallWareHouseNo = string.Empty;//新托盘所在的位置(库外/平库)
                var stockDetailList = Db.Queryable<DataStockDetail>().Where(m => m.IsDel == "0" && m.PalletNo == palletNoNew).ToList();
                if (stockDetailList != null && stockDetailList.Count() > 0)
                {
                    newPalletHaveGoods = true;
                    pallWareHouseNo = stockDetailList[0].WareHouseNo;
                    if (!string.IsNullOrEmpty(stockDetailList[0].LocatNo))
                    foreach (var item in infosList)
                    {
                        throw new Exception("新托盘在立库内不允许变更,请核实");
                    }
                    #region 验证是否允许立库同托盘不同物料入库或同托盘同物料不同批次入库
                    var box = Db.Queryable<DataBoxInfo>().First(m => m.IsDel == "0" && m.PalletNo == palletNoNew && m.BitBoxMark == "0");
                    if (box != null)
                    {
                        foreach (var item in infosList)
                        if (box.SkuNo != item.SkuNo || box.LotNo != item.LotNo)
                        {
                            if (box.SkuNo != item.SkuNo || box.LotNo != item.LotNo)
                            var funSetting = await Db.Queryable<SysFunSetting>().FirstAsync(a => a.IsDel == "0" && a.FunSetNo == "Fun045");
                            if (funSetting == null || funSetting.IsEnable == "OFF")
                            {
                                var funSetting = Db.Queryable<SysFunSetting>().First(a => a.IsDel == "0" && a.FunSetNo == "Fun045");
                                if (funSetting == null || funSetting.IsEnable == "OFF")
                                {
                                    throw new Exception($"不允许立库同托盘不同物料入库或同托盘不同批次入库!");
                                }
                                throw Oops.Bah($"不允许立库同托盘不同物料入库或同托盘不同批次入库!");
                            }
                        }
                    }
                    #endregion
                }
                if (!newPalletHaveGoods)//新托盘上没有物品
                #endregion
            }
            if (!newPalletHaveGoods)//新托盘上没有物品
            {
                var pallet = await Db.Queryable<SysPallets>().FirstAsync(m => m.IsDel == "0" && m.PalletNo == palletNoNew);
                if (pallet == null)
                {
                    var pallet = Db.Queryable<SysPallets>().First(m => m.IsDel == "0" && m.PalletNo == palletNoNew);
                    if (pallet == null)
                    {
                        throw new Exception("未查询到新托盘号信息");
                    }
                    if (pallet.Status == "0")
                    {
                        pallet.Status = "1";//将新托盘状态修改为已使用
                        Db.Updateable(pallet).ExecuteCommand();
                    }
                    else
                    {
                        throw new Exception("新托盘号状态不是未使用");
                    }
                    throw Oops.Bah("未查询到新托盘号信息");
                }
                foreach (var infoIdItem in infoIds)
                if (pallet.Status == "0")
                {
                    var infosList2 = infosList.Where(w => w.StockDetailId == infoIdItem).ToList();
                    //原托盘库存明细
                    var stockDetail1 = Db.Queryable<DataStockDetail>().First(m => m.IsDel == "0" && m.PalletNo == palletNo && m.Id == infoIdItem);
                    if (stockDetail1 == null)
                    {
                        throw new Exception("未在原托盘上查询到箱码信息,请核实");
                    }
                    if (!string.IsNullOrEmpty(stockDetail1.LocatNo))
                    {
                        throw new Exception("原托盘在立库内不允许变更,请核实");
                    }
                    var stockDetail2 = stockDetailList.FirstOrDefault(w => w.SkuNo == stockDetail1.SkuNo && w.LotNo == stockDetail1.LotNo);
                    pallet.Status = "1";//将新托盘状态修改为已使用
                    await Db.Updateable(pallet).ExecuteCommandAsync();
                }
                else
                {
                    throw Oops.Bah("新托盘号状态不是未使用");
                }
            }
            foreach (var infoIdItem in infoIds)
            {
                var infosList2 = infosList.Where(w => w.StockDetailId == infoIdItem).ToList();
                //原托盘库存明细
                var stockDetail1 = await Db.Queryable<DataStockDetail>().FirstAsync(m => m.IsDel == "0" && m.PalletNo == palletNo && m.Id == infoIdItem);
                if (stockDetail1 == null)
                {
                    throw Oops.Bah("未在原托盘上查询到箱码信息,请核实");
                }
                if (!string.IsNullOrEmpty(stockDetail1.LocatNo))
                {
                    throw Oops.Bah("原托盘在立库内不允许变更,请核实");
                }
                var stockDetail2 = stockDetailList.FirstOrDefault(w => w.SkuNo == stockDetail1.SkuNo && w.LotNo == stockDetail1.LotNo);
                    var stId = 0;
                    if (stockDetail2 == null) //添加-新托盘上没有同物料同批次物品
                var stId = 0;
                if (stockDetail2 == null) //添加-新托盘上没有同物料同批次物品
                {
                    //新托盘添加库存明细
                    var detail = new DataStockDetail()
                    {
                        //新托盘添加库存明细
                        var detail = new DataStockDetail()
                        {
                            LotNo = stockDetail1.LotNo,
                            LotText = stockDetail1.LotText,
                            SupplierLot = stockDetail1.SupplierLot,
                            SkuNo = stockDetail1.SkuNo,
                            SkuName = stockDetail1.SkuName,
                            Standard = stockDetail1.Standard,
                            Qty = infosList2.Sum(m => m.Qty),
                            LockQty = 0,
                            FrozenQty = 0,
                            InspectQty = 0,
                            ASNNo = stockDetail1.ASNNo,
                            ASNDetailNo = stockDetail1.ASNDetailNo,
                            WareHouseNo = pallWareHouseNo,
                            RoadwayNo = "",
                            AreaNo = "",
                            LocatNo = stockDetail1.LocatNo,
                            PalletNo = palletNoNew,//新托盘号
                            PalletNo2 = "",
                            PalletNo3 = "",
                            CompleteTime = comTime,
                            ProductionTime = stockDetail1.ProductionTime,
                            ExpirationTime = stockDetail1.ExpirationTime,
                            Status = "0",
                            InspectMark = stockDetail1.InspectMark,
                            InspectStatus = stockDetail1.InspectStatus,
                            BitPalletMark = stockDetail1.BitPalletMark,
                            PackagNo = stockDetail1.PackagNo,
                            IsBale = "0",
                            IsBelt = "0",
                            IsDel = "0",
                            CreateUser = userId,
                            CreateTime = DateTime.Now
                        };
                        stId = Db.Insertable(detail).ExecuteReturnIdentity();
                    }
                    else //修改-新托盘有物品
                    {
                        stockDetail2.Qty += infosList2.Sum(m => m.Qty);//新托盘增加库存
                        Db.Updateable(stockDetail2).ExecuteCommand();
                        stId = stockDetail2.Id;
                    }
                    //修改库存
                    stockDetail1.Qty -= infosList2.Sum(m => m.Qty);
                    stockDetail1.BitPalletMark = "1";//是否零托 0:否 1:是
                    if (stockDetail1.Qty == 0)
                    {
                        Db.Deleteable(stockDetail1).ExecuteCommand();//删除原托盘库存明细
                        //判原托盘还有没有货物
                        var stockDetail3 = Db.Queryable<DataStockDetail>().Where(m => m.IsDel == "0" && m.PalletNo == palletNo && m.Id != infoIds.First()).ToList();
                        if (stockDetail3 == null || stockDetail3.Count <= 0)
                        {
                            var pallet = Db.Queryable<SysPallets>().First(m => m.IsDel == "0" && m.PalletNo == palletNo);
                            pallet.Status = "0";//原托盘没有货物后将状态修改为未使用
                            Db.Updateable(pallet).ExecuteCommand();
                        }
                    }
                    else
                    {
                        Db.Updateable(stockDetail1).ExecuteCommand();//修改原托盘库存明细
                    }
                    foreach (var item in infosList2)
                    {
                        //修改库存箱码明细
                        item.StockDetailId = stId;
                        item.BindNo = null;
                        item.PalletNo = palletNoNew;
                        Db.Updateable(item).ExecuteCommand();
                    }
                    //添加托盘解绑绑定记录
                    var unBind = new BllPalletUnbind()
                    {
                        UpbindPalletNo = palletNo,
                        BindPalletNo = palletNoNew,
                        LotNo = stockDetail1.LotNo,
                        LotText = stockDetail1.LotText,
                        SupplierLot = stockDetail1.SupplierLot,
@@ -713,32 +571,99 @@
                        SkuName = stockDetail1.SkuName,
                        Standard = stockDetail1.Standard,
                        Qty = infosList2.Sum(m => m.Qty),
                        PalletNo2 = stockDetail1.PalletNo2,
                        PalletNo3 = stockDetail1.PalletNo3,
                        BoxNo = boxNo,
                        InspectNo = "",
                        LockQty = 0,
                        FrozenQty = 0,
                        InspectQty = 0,
                        ASNNo = stockDetail1.ASNNo,
                        ASNDetailNo = stockDetail1.ASNDetailNo,
                        WareHouseNo = pallWareHouseNo,
                        RoadwayNo = "",
                        AreaNo = "",
                        LocatNo = stockDetail1.LocatNo,
                        PalletNo = palletNoNew,//新托盘号
                        PalletNo2 = "",
                        PalletNo3 = "",
                        CompleteTime = comTime,
                        ProductionTime = stockDetail1.ProductionTime,
                        ExpirationTime = stockDetail1.ExpirationTime,
                        Status = "0",
                        InspectMark = stockDetail1.InspectMark,
                        InspectStatus = stockDetail1.InspectStatus,
                        BitPalletMark = stockDetail1.BitPalletMark,
                        PackagNo = stockDetail1.PackagNo,
                        IsBale = "0",
                        IsBelt = "0",
                        IsDel = "0",
                        CreateTime = comTime,
                        CreateUser = userId
                        CreateUser = userId,
                        CreateTime = DateTime.Now
                    };
                    Db.Insertable(unBind).ExecuteCommand();
                    stId = await Db.Insertable(detail).ExecuteReturnIdentityAsync();
                }
                //添加操作日志
                if (string.IsNullOrEmpty(boxNo))
                else //修改-新托盘有物品
                {
                    boxNo = "全部";
                    stockDetail2.Qty += infosList2.Sum(m => m.Qty);//新托盘增加库存
                    await Db.Updateable(stockDetail2).ExecuteCommandAsync();
                    stId = stockDetail2.Id;
                }
                new OperationCrServer().AddLogOperationCr("库内作业", "操作日志", boxNo, "编辑", $"托盘变更:原托盘码:{palletNo}上的箱码{boxNo}解绑,绑定到新托盘{palletNoNew}上", userId);
                //提交事务
                Db.CommitTran();
                //修改库存
                stockDetail1.Qty -= infosList2.Sum(m => m.Qty);
                stockDetail1.BitPalletMark = "1";//是否零托 0:否 1:是
                if (stockDetail1.Qty == 0)
                {
                    await Db.Deleteable(stockDetail1).ExecuteCommandAsync();//删除原托盘库存明细
                                                                            //判原托盘还有没有货物
                    var stockDetail3 = await Db.Queryable<DataStockDetail>().Where(m => m.IsDel == "0" && m.PalletNo == palletNo && m.Id != infoIds.First()).ToListAsync();
                    if (stockDetail3 == null || stockDetail3.Count <= 0)
                    {
                        var pallet = Db.Queryable<SysPallets>().First(m => m.IsDel == "0" && m.PalletNo == palletNo);
                        pallet.Status = "0";//原托盘没有货物后将状态修改为未使用
                        await Db.Updateable(pallet).ExecuteCommandAsync();
                    }
                }
                else
                {
                    await Db.Updateable(stockDetail1).ExecuteCommandAsync();//修改原托盘库存明细
                }
                foreach (var item in infosList2)
                {
                    //修改库存箱码明细
                    item.StockDetailId = stId;
                    item.BindNo = null;
                    item.PalletNo = palletNoNew;
                    await Db.Updateable(item).ExecuteCommandAsync();
                }
                //添加托盘解绑绑定记录
                var unBind = new BllPalletUnbind()
                {
                    UpbindPalletNo = palletNo,
                    BindPalletNo = palletNoNew,
                    LotNo = stockDetail1.LotNo,
                    LotText = stockDetail1.LotText,
                    SupplierLot = stockDetail1.SupplierLot,
                    SkuNo = stockDetail1.SkuNo,
                    SkuName = stockDetail1.SkuName,
                    Standard = stockDetail1.Standard,
                    Qty = infosList2.Sum(m => m.Qty),
                    PalletNo2 = stockDetail1.PalletNo2,
                    PalletNo3 = stockDetail1.PalletNo3,
                    BoxNo = boxNo,
                    InspectNo = "",
                    InspectStatus = stockDetail1.InspectStatus,
                    IsDel = "0",
                    CreateTime = comTime,
                    CreateUser = userId
                };
                await Db.Insertable(unBind).ExecuteCommandAsync();
            }
            catch (Exception e)
            //添加操作日志
            if (string.IsNullOrEmpty(boxNo))
            {
                Db.RollbackTran();
                throw new Exception(e.Message);
                boxNo = "全部";
            }
            new OperationCrServer().AddLogOperationCr("库内作业", "操作日志", boxNo, "编辑", $"托盘变更:原托盘码:{palletNo}上的箱码{boxNo}解绑,绑定到新托盘{palletNoNew}上", userId);
        }
        #endregion
@@ -749,29 +674,22 @@
        /// </summary>
        /// <param name="palletNo"></param>
        /// <returns></returns>
        public string GetPalletLocatNo(string palletNo)
        public async Task<string> GetPalletLocatNo(string palletNo)
        {
            try
            var models = await Db.Queryable<DataStockDetail>().FirstAsync(w => w.IsDel == "0" && w.PalletNo == palletNo);
            if (models == null)
            {
                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("该托盘未在平库内,请检查!");
                }
                return models.LocatNo;
                throw Oops.Bah("托盘库存信息不存在,请检查!");
            }
            catch (Exception ex)
            if (string.IsNullOrEmpty(models.LocatNo))
            {
                throw new Exception(ex.Message);
                throw Oops.Bah("托盘储位信息不存在,请检查!");
            }
            if (models.WareHouseNo != "W02")
            {
                throw Oops.Bah("该托盘未在平库内,请检查!");
            }
            return models.LocatNo;
        }
        /// <summary>
@@ -779,109 +697,79 @@
        /// </summary>
        /// <param name="palletNo"></param>
        /// <returns></returns>
        public List<SysStorageArea> GetStorageArea(string palletNo)
        public async Task<List<SysStorageArea>> GetStorageArea(string palletNo)
        {
            try
            var storageArea = new List<SysStorageArea>();
            if (string.IsNullOrEmpty(palletNo))
            {
                var storageArea = new List<SysStorageArea>();
                if (string.IsNullOrEmpty(palletNo))
                storageArea = await Db.Queryable<SysStorageArea>().Where(w => w.IsDel == "0" && w.Status == "0" && w.WareHouseNo == "W02").OrderBy(o => o.AreaNo).ToListAsync();
            }
            else
            {
                var models = await Db.Queryable<DataStockDetail>().FirstAsync(w => w.IsDel == "0" && w.PalletNo == palletNo);
                if (models == null)
                {
                    storageArea = Db.Queryable<SysStorageArea>().Where(w => w.IsDel == "0" && w.Status == "0" && w.WareHouseNo == "W02").OrderBy(o => o.AreaNo).ToList();
                    throw Oops.Bah("托盘库存信息不存在,请检查!");
                }
                if (string.IsNullOrEmpty(models.LocatNo))
                {
                    throw Oops.Bah("托盘储位信息不存在,请检查!");
                }
                if (models.WareHouseNo != "W02")
                {
                    throw Oops.Bah("该托盘未在平库内,请检查!");
                }
                var storageLocat = await Db.Queryable<SysStorageLocat>().FirstAsync(w => w.IsDel == "0" && w.LocatNo == models.LocatNo);
                if (storageLocat == null)
                {
                    throw Oops.Bah("储位信息不存在,请检查!");
                }
                if (storageLocat.AreaNo.Contains("B0"))
                {
                    storageArea = await Db.Queryable<SysStorageArea>().Where(w => w.IsDel == "0" && w.Status == "0" && w.AreaNo.Contains("B0") && w.WareHouseNo == "W02").OrderBy(o => o.AreaNo).ToListAsync();
                }
                else
                {
                    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();
                    }
                    storageArea = await Db.Queryable<SysStorageArea>().Where(w => w.IsDel == "0" && w.Status == "0" && w.AreaNo.Contains("B1") && w.WareHouseNo == "W02").OrderBy(o => o.AreaNo).ToListAsync();
                }
                return storageArea;
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            return storageArea;
        }
        /// <summary>
        /// 获取已分配的出库单据
        /// </summary>
        /// <returns></returns>
        public List<string> GetRunSoNoticeList()
        public async Task<List<string>> GetRunSoNoticeList()
        {
            try
            {
                var allotList = Db.Queryable<BllExportNotice>().Where(m => m.IsDel == "0" && m.Status == "2").Select(m => m.SONo).Distinct().ToList();
                return allotList;
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            return await Db.Queryable<BllExportNotice>().Where(m => m.IsDel == "0" && m.Status == "2").Select(m => m.SONo).Distinct().ToListAsync();
        }
        /// <summary>
        /// 根据托盘号获取托盘上物料信息
        /// </summary>
        /// <param name="palletNo"></param>
        /// <returns></returns>
        public List<DataStockDetail> GetSkuInfoByPalletNo(string palletNo)
        public async Task<List<DataStockDetail>> GetSkuInfoByPalletNo(string palletNo)
        {
            try
            if (string.IsNullOrEmpty(palletNo))
            {
                if (string.IsNullOrEmpty(palletNo))
                {
                    throw new Exception("请扫描托盘条码!");
                }
                var skuInfoList = Db.Queryable<DataStockDetail>().Where(m => m.IsDel == "0" && m.PalletNo == palletNo).ToList();
                return skuInfoList;
                throw Oops.Bah("请扫描托盘条码!");
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            return await Db.Queryable<DataStockDetail>().Where(m => m.IsDel == "0" && m.PalletNo == palletNo).ToListAsync();
        }
        /// <summary>
        /// 根据出库单号获取分配的托盘信息
        /// </summary>
        /// <param name="soNo"></param>
        /// <returns></returns>
        public List<string> GetPalletNoListBySoNo(string soNo)
        public async Task<List<string>> GetPalletNoListBySoNo(string soNo)
        {
            try
            if (string.IsNullOrEmpty(soNo))
            {
                if (string.IsNullOrEmpty(soNo))
                {
                    throw new Exception("请选择出库单号!");
                }
                var palletNoList = Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && m.SONo == soNo).Select(m => m.PalletNo).Distinct().ToList();
                return palletNoList;
                throw Oops.Bah("请选择出库单号!");
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            var palletNoList = await Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && m.SONo == soNo).Select(m => m.PalletNo).Distinct().ToListAsync();
            return palletNoList;
        }
        /// <summary>
@@ -890,79 +778,215 @@
        /// <param name="palletNo"></param>
        /// <param name="areaNo"></param>
        /// <param name="ruku"></param>
        public void AgvTransport(string palletNo, string areaNo, string ruku, int userId)
        public async Task AgvTransport(string palletNo, string areaNo, string ruku, int userId)
        {
            if (string.IsNullOrEmpty(palletNo))
            {
                throw new Exception("请扫描托盘条码!");
                throw Oops.Bah("请扫描托盘条码!");
            }
            if (string.IsNullOrEmpty(areaNo) && string.IsNullOrEmpty(ruku))
            {
                throw new Exception("请选择目标区域或入库口!");
                throw Oops.Bah("请选择目标区域或入库口!");
            }
            if (!string.IsNullOrEmpty(areaNo) && !string.IsNullOrEmpty(ruku))
            {
                throw new Exception("目标区域和入库口不能同时选择!");
                throw Oops.Bah("目标区域和入库口不能同时选择!");
            }
            try
            {
                string EndLocat = string.Empty;//目标位置
            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)
            var log = await Db.Queryable<LogTask>().FirstAsync(w => w.IsDel == "0" && w.PalletNo == palletNo && (w.Status == "0" || w.Status == "1"));
            if (log != null)
            {
                throw Oops.Bah("该托盘已有小车等待执行或正在执行的任务!");
            }
            var stockDetail = await Db.Queryable<DataStockDetail>().FirstAsync(w => w.IsDel == "0" && w.PalletNo == palletNo);
            if (stockDetail == null)
            {
                throw Oops.Bah("托盘上物料库存明细信息不存在,请检查!");
            }
            if (!string.IsNullOrEmpty(areaNo))
            {
                var storageArea = await Db.Queryable<SysStorageArea>().FirstAsync(w => w.IsDel == "0" && w.AreaNo == areaNo);
                if (storageArea == null)
                {
                    throw new Exception("该托盘已有小车等待执行或正在执行的任务!");
                    throw Oops.Bah("所选区域信息不存在,请检查!");
                }
                var stockDetail = Db.Queryable<DataStockDetail>().First(w => w.IsDel == "0" && w.PalletNo == palletNo);
                if (stockDetail == null)
                EndLocat = await GetLocat(areaNo, stockDetail.SkuNo, stockDetail.LotNo, palletNo);
            }
            else
            {
                EndLocat = ruku;
            }
            var stock = await Db.Queryable<DataStock>().FirstAsync(w => w.IsDel == "0" && w.SkuNo == stockDetail.SkuNo && w.LotNo == stockDetail.LotNo);
            if (stock == null)
            {
                throw Oops.Bah("托盘上物料库存信息不存在,请检查!");
            }
            if (string.IsNullOrEmpty(stockDetail.LocatNo))
            {
                throw Oops.Bah("托盘储位信息不存在,请检查!");
            }
            if (stockDetail.WareHouseNo != "W02")
            {
                throw Oops.Bah("该托盘未在平库内,请检查!");
            }
            //起始储位信息
            var storageLocat = await Db.Queryable<SysStorageLocat>().FirstAsync(w => w.IsDel == "0" && w.LocatNo == stockDetail.LocatNo);
            if (storageLocat == null)
            {
                throw Oops.Bah("储位信息不存在,请检查!");
            }
            //目标储位信息
            var storageLocatEnd = new SysStorageLocat();
            if (!string.IsNullOrEmpty(areaNo))
            {
                storageLocatEnd = await Db.Queryable<SysStorageLocat>().FirstAsync(w => w.IsDel == "0" && w.LocatNo == EndLocat && w.Flag == "0" && w.Status == "0");
                if (storageLocatEnd == null)
                {
                    throw new Exception("托盘上物料库存明细信息不存在,请检查!");
                    throw Oops.Bah("目标储位信息不存在,请检查!");
                }
                if (!string.IsNullOrEmpty(areaNo))
            }
            //添加出库任务
            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
            };
            await Db.Insertable(exTask).ExecuteCommandAsync();
            //修改库存明细信息
            stockDetail.Status = "4";//移库锁定
            stockDetail.LockQty = stockDetail.Qty;//锁定库存数量
            await Db.Updateable(stockDetail).ExecuteCommandAsync();
            //修改库存信息
            stock.LockQty += (decimal)stockDetail.Qty;
            await Db.Updateable(stock).ExecuteCommandAsync();
            //修改起始储位地址状态
            storageLocat.Status = "5";//0:空储位 1:有物品 2:入库中 3:出库中 4:移入中 5:移出中
            await Db.Updateable(storageLocat).ExecuteCommandAsync();
            //修改目标储位地址状态
            if (storageLocatEnd != null)
            {
                storageLocatEnd.Status = "4";//0:空储位 1:有物品 2:入库中 3:出库中 4:移入中 5:移出中
                await Db.Updateable(storageLocatEnd).ExecuteCommandAsync();
            }
            //添加操作日志记录
            var k = new OperationCrServer().AddLogOperationCr("PDA模块", "AGV转运", palletNo, "移库", $"PDA呼叫小车对托盘号:{palletNo}发起转运", userId);
            #region 呼叫小车代码
            #endregion
        }
        /// <summary>
        /// agv转运呼叫小车取货
        /// </summary>
        /// <param name="soNo"></param>
        /// <param name="palletNo"></param>
        /// <param name="areaNo"></param>
        /// <param name="userId"></param>
        public async Task AgvTransport2(string soNo, string palletNo, string areaNo, int userId)
        {
            if (string.IsNullOrEmpty(soNo))
            {
                throw Oops.Bah("请选择出库单据!");
            }
            if (string.IsNullOrEmpty(areaNo))
            {
                throw Oops.Bah("请选择目标区域!");
            }
            //出库单信息
            var notice = await Db.Queryable<BllExportNotice>().FirstAsync(w => w.IsDel == "0" && w.SONo == soNo);
            if (notice == null)
            {
                throw Oops.Bah("出库单据信息不存在,请检查!");
            }
            //目标区域信息
            var storageArea = await Db.Queryable<SysStorageArea>().FirstAsync(w => w.IsDel == "0" && w.AreaNo == areaNo);
            if (storageArea == null)
            {
                throw Oops.Bah("所选区域信息不存在,请检查!");
            }
            List<DataStockDetail> stockDetailList = new List<DataStockDetail>();//需要的托盘明细
            if (!string.IsNullOrEmpty(palletNo))//单托盘叫货
            {
                stockDetailList = await Db.Queryable<DataStockDetail>().Where(w => w.IsDel == "0" && w.PalletNo == palletNo).ToListAsync();
            }
            else//整个出库单叫货
            {
                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();
            }
            if (stockDetailList.Count <= 0)
            {
                throw Oops.Bah("托盘明细不存在,请检查!");
            }
            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;//已分配的储位
            foreach (var item in stockDetailList)
            {
                //任务信息
                var logInfo = await log.FirstAsync(w => w.PalletNo == item.PalletNo);
                if (logInfo != null)
                {
                    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);
                    throw Oops.Bah($"托盘号:{item.PalletNo}已有小车等待执行或正在执行的任务!");
                }
                if (string.IsNullOrEmpty(item.LocatNo))
                {
                    throw Oops.Bah($"托盘号:{item.PalletNo}的储位信息不存在,请检查!");
                }
                if (item.WareHouseNo != "W02")
                {
                    throw Oops.Bah($"托盘号:{item.PalletNo}未在平库内,请检查!");
                }
                //起始储位信息
                var storageLocatBegin = await storageLocat.FirstAsync(w => w.LocatNo == item.LocatNo);
                if (storageLocat == null)
                {
                    throw Oops.Bah($"托盘号:{item.PalletNo}所在的储位信息不存在,请检查!");
                }
                //获取目标储位
                EndLocat = await GetLocat(areaNo, item.SkuNo, item.LotNo, palletNo);
                if (string.IsNullOrEmpty(EndLocat))
                {
                    throw Oops.Bah("分配目标储位失败,请检查!");
                }
                if (string.IsNullOrEmpty(hasLocatNoList))
                {
                    hasLocatNoList = EndLocat;
                }
                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))
                {
                    throw new Exception("托盘储位信息不存在,请检查!");
                }
                if (stockDetail.WareHouseNo != "W02")
                {
                    throw new Exception("该托盘未在平库内,请检查!");
                }
                //起始储位信息
                var storageLocat = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.LocatNo == stockDetail.LocatNo);
                if (storageLocat == null)
                {
                    throw new Exception("储位信息不存在,请检查!");
                    hasLocatNoList = hasLocatNoList + "," + EndLocat;
                }
                //目标储位信息
                var storageLocatEnd = new SysStorageLocat();
                if (!string.IsNullOrEmpty(areaNo))
                var storageLocatEnd = storageLocat.First(w => w.LocatNo == EndLocat && w.Flag == "0" && w.Status == "0");
                if (storageLocatEnd == null)
                {
                    storageLocatEnd = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.LocatNo == EndLocat && w.Flag == "0" && w.Status == "0");
                    if (storageLocatEnd == null)
                    {
                        throw new Exception("目标储位信息不存在,请检查!");
                    }
                    throw Oops.Bah("目标储位信息不存在,请检查!");
                }
                //开启事务
                Db.BeginTran();
                //添加出库任务
                var taskNo = new Common().GetMaxNo("TK");
@@ -972,11 +996,10 @@
                    Sender = "WMS",
                    Receiver = "AGV",
                    IsSuccess = 0, //是否下发成功 0失败 1成功
                    StartLocat = stockDetail.LocatNo,//起始位置
                    Msg = string.Format("转运任务:{0}=>>{1}", item.LocatNo, EndLocat),
                    StartLocat = item.LocatNo,//起始位置
                    EndLocat = EndLocat,//目标位置
                    PalletNo = palletNo,//托盘码
                    Msg = string.Format("转运任务:{0}=>>{1}", stockDetail.LocatNo, EndLocat),
                    IsSend = 1,//是否可再次下发
                    IsCancel = 1,//是否可取消
                    IsFinish = 1,//是否可完成
@@ -986,199 +1009,39 @@
                    CreateTime = DateTime.Now
                };
                Db.Insertable(exTask).ExecuteCommand();
                await Db.Insertable(exTask).ExecuteCommandAsync();
                //修改库存明细信息
                stockDetail.Status = "4";//移库锁定
                stockDetail.LockQty = stockDetail.Qty;//锁定库存数量
                Db.Updateable(stockDetail).ExecuteCommand();
                //修改库存信息
                stock.LockQty += (decimal)stockDetail.Qty;
                Db.Updateable(stock).ExecuteCommand();
                item.Status = "4";//移库锁定
                item.LockQty = item.Qty;//锁定库存数量
                await Db.Updateable(item).ExecuteCommandAsync();
                //修改起始储位地址状态
                storageLocat.Status = "5";//0:空储位 1:有物品 2:入库中 3:出库中 4:移入中 5:移出中
                Db.Updateable(storageLocat).ExecuteCommand();
                storageLocatBegin.Status = "5";//0:空储位 1:有物品 2:入库中 3:出库中 4:移入中 5:移出中
                await Db.Updateable(storageLocatBegin).ExecuteCommandAsync();
                //修改目标储位地址状态
                if (storageLocatEnd != null)
                {
                    storageLocatEnd.Status = "4";//0:空储位 1:有物品 2:入库中 3:出库中 4:移入中 5:移出中
                    Db.Updateable(storageLocatEnd).ExecuteCommand();
                }
                storageLocatEnd.Status = "4";//0:空储位 1:有物品 2:入库中 3:出库中 4:移入中 5:移出中
                await Db.Updateable(storageLocatEnd).ExecuteCommandAsync();
                var stockInfo = await stock.FirstAsync(w => w.SkuNo == item.SkuNo && w.LotNo == item.LotNo);
                //修改库存信息
                stockInfo.LockQty += (decimal)item.Qty;//锁定数量
                await Db.Updateable(stockInfo).ExecuteCommandAsync();
            }
            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);
                //提交事务
                Db.CommitTran();
                #region 呼叫小车代码
                #endregion
            }
            catch (Exception ex)
            {
                Db.RollbackTran();
                throw new Exception(ex.Message);
            }
        }
        /// <summary>
        /// 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)
        {
            if (string.IsNullOrEmpty(soNo))
            {
                throw new Exception("请选择出库单据!");
            }
            if (string.IsNullOrEmpty(areaNo))
            {
                throw new Exception("请选择目标区域!");
            }
            try
            {
                //开启事务
                Db.BeginTran();
                //出库单信息
                var notice = Db.Queryable<BllExportNotice>().First(w => w.IsDel == "0" && w.SONo == soNo);
                if (notice == null)
                {
                    throw new Exception("出库单据信息不存在,请检查!");
                }
                //目标区域信息
                var storageArea = Db.Queryable<SysStorageArea>().First(w => w.IsDel == "0" && w.AreaNo == areaNo);
                if (storageArea == null)
                {
                    throw new Exception("所选区域信息不存在,请检查!");
                }
                List<DataStockDetail> stockDetailList = new List<DataStockDetail>();//需要的托盘明细
                if (!string.IsNullOrEmpty(palletNo))//单托盘叫货
                {
                    stockDetailList = Db.Queryable<DataStockDetail>().Where(w => w.IsDel == "0" && w.PalletNo == palletNo).ToList();
                }
                else//整个出库单叫货
                {
                    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();
                }
                if (stockDetailList.Count <= 0)
                {
                    throw new Exception("托盘明细不存在,请检查!");
                }
                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;//已分配的储位
                foreach (var item in stockDetailList)
                {
                    //任务信息
                    var logInfo = log.First(w => w.PalletNo == item.PalletNo);
                    if (logInfo != null)
                    {
                        throw new Exception($"托盘号:{item.PalletNo}已有小车等待执行或正在执行的任务!");
                    }
                    if (string.IsNullOrEmpty(item.LocatNo))
                    {
                        throw new Exception($"托盘号:{item.PalletNo}的储位信息不存在,请检查!");
                    }
                    if (item.WareHouseNo != "W02")
                    {
                        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("目标储位信息不存在,请检查!");
                    }
            #region 呼叫小车代码
                    //添加出库任务
                    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 = 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();
                    //修改库存明细信息
                    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();
                    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);
                }
                //提交事务
                Db.CommitTran();
                #region 呼叫小车代码
                #endregion
            }
            catch (Exception ex)
            {
                Db.RollbackTran();
                throw new Exception(ex.Message);
            }
            #endregion
        }
        /// <summary>
        /// 根据区域分配储位
@@ -1187,43 +1050,36 @@
        /// <param name="skuNo"></param>
        /// <param name="lotNo"></param>
        /// <returns></returns>
        private string GetLocat(string areaNo, string skuNo, string lotNo, string palletNo, string hasLocatNoList = "")
        private async Task<string> GetLocat(string areaNo, string skuNo, string lotNo, string palletNo, string hasLocatNoList = "")
        {
            try
            string endLocat = string.Empty;//目标储位
                                           //当然区域所有储位信息
            var storageLocatList = await Db.Queryable<SysStorageLocat>().Where(w => w.WareHouseNo == "W02" && w.AreaNo == areaNo).ToListAsync();
            //同区域同批次物料的储位信息
            List<string> locatList = await 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().ToListAsync();
            foreach (var item in locatList)
            {
                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 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 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)
                {
                    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;
                    }
                    endLocat = locatInfo2.LocatNo;
                }
                return endLocat;
            }
            catch (Exception ex)
            if (string.IsNullOrEmpty(endLocat))
            {
                throw new Exception(ex.Message);
                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;
        }
        #endregion