hwh
2024-08-08 90ca6b5d5483cbc1c7140ba5d88b956bb0689de9
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,39 +28,28 @@
        #region 盘点
        //获取盘库单正在执行单号
        public List<string> GetStockCheckNoList(string palletNo)
        {
            try
        public async Task<List<string>> GetStockCheckNoList(string 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();
                list = await Db.Queryable<BllStockCheckDetail>().Where(m => m.IsDel == "0" && m.PalletNo == palletNo && m.Status == 2).Select(m => m.CRNo).Distinct().ToListAsync();
                }
                else
                {
                    list = Db.Queryable<BllStockCheck>().Where(m => m.IsDel == "0" && m.Status == 1).Select(m => m.CRNo)
                        .Distinct().ToList();
                list = await Db.Queryable<BllStockCheck>().Where(m => m.IsDel == "0" && m.Status == 1).Select(m => m.CRNo)
                    .Distinct().ToListAsync();
                }
                return list;
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
        }
        //获取盘点明细物料批次信息
        public List<StockCheckDetailDto> GetStockCheckDetailList(string crNo, string palletNo)
        {
            try
        public async Task<List<StockCheckDetailDto>> GetStockCheckDetailList(string crNo, string palletNo)
            {
                if (string.IsNullOrWhiteSpace(crNo))
                {
                    throw new Exception("盘点单据不能为空");
                throw Oops.Bah("盘点单据不能为空");
                }
                var list = Db.Queryable<BllStockCheckDetail>().Where(m => m.IsDel == "0" && m.CRNo == crNo);
@@ -69,48 +59,40 @@
                    list = list.Where(m => m.PalletNo == palletNo);
                }
                var data = list.GroupBy(m => new { m.SkuNo, m.SkuName, m.LotNo }).Select(m => new StockCheckDetailDto()
            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
                }).ToList();
            }).ToListAsync();
                return data;
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
        }
        //获取要盘点的箱码信息(盘点记录中数据)
        public List<StockCheckLogDto> GetStockCheckLogList(string crNo, string crDetail, string palletNo, string boxNo, string isContinue)
        {
            try
        public async Task<List<StockCheckLogDto>> GetStockCheckLogList(string crNo, string crDetail, string palletNo, string boxNo, string isContinue)
            {
                if (string.IsNullOrWhiteSpace(crNo))
                {
                    throw new Exception("盘点单据不能为空");
                throw Oops.Bah("盘点单据不能为空");
                }
                if (string.IsNullOrWhiteSpace(crDetail))
                {
                    throw new Exception("物料批次不能为空");
                throw Oops.Bah("物料批次不能为空");
                }
                if (string.IsNullOrWhiteSpace(palletNo))
                {
                    throw new Exception("托盘码不能为空");
                throw Oops.Bah("托盘码不能为空");
                }
                var detail = crDetail.Split("-");
                var sku = detail[0];
                //判断是否为无码物料
                var skuinfo = Db.Queryable<SysMaterials>().First(m => m.IsDel == "0" && m.SkuNo == sku);
            var skuinfo = await Db.Queryable<SysMaterials>().FirstAsync(m => m.IsDel == "0" && m.SkuNo == sku);
                //判断是否存在物料消息
                if (skuinfo == null)
                {
                    throw new Exception("托盘码不能为空");
                throw Oops.Bah("托盘码不能为空");
                }
                int isQtySku = 0;
                if (skuinfo.Type == "4" && isContinue == "1")
@@ -149,7 +131,7 @@
                }
                else
                {
                    data = list.Select(m => new StockCheckLogDto()
                data = await list.Select(m => new StockCheckLogDto()
                    {
                        BoxNo = m.BoxNo,
                        BoxNo3 = m.BoxNo3,
@@ -159,22 +141,15 @@
                        Qty = m.Qty,
                        CheckResult = m.CheckResult,
                    }).ToList();
                }).ToListAsync();
                }
                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
        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))
                {
@@ -193,13 +168,13 @@
                var sku = detail[0];
                var lotNo = detail[1];
                //盘点明细
                var checkDetail = Db.Queryable<BllStockCheckDetail>().First(m =>
            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 = Db.Queryable<SysMaterials>().Where(s => s.SkuNo == sku).First();
            var modSku = await Db.Queryable<SysMaterials>().Where(s => s.SkuNo == sku).FirstAsync();
                if (modSku.IsPasteCode == "1" && isContinue == "1")
                {
                    throw Oops.Bah("贴标物料不允许数量盘点");
@@ -224,12 +199,12 @@
                        checkLog = checkLog.Where(m => m.BoxNo3 == boxNo3);
                    }
                    if (checkLog.Count() == 0 && isContinue == "0")
                if (await checkLog.CountAsync() == 0 && isContinue == "0")
                    {
                        throw Oops.Bah("未查询到未盘点的箱支信息");
                    }
                    var list = checkLog.ToList();
                var list = await checkLog.ToListAsync();
                    var num = 0;
                    foreach (var l in list)
                    {
@@ -255,8 +230,8 @@
                    //{
                    //    checkDetail.CheckResult = 0;
                    //}
                    Db.Updateable(checkDetail).ExecuteCommand();
                    Db.Updateable(list).ExecuteCommand();
                await Db.Updateable(checkDetail).ExecuteCommandAsync();
                await Db.Updateable(list).ExecuteCommandAsync();
                }
                //盘亏
                else if (result == "1")
@@ -305,7 +280,7 @@
                        checkDetail.RealQty = qty;
                    }
                    checkDetail.CheckResult = 1;
                    var checkInfo = Db.Queryable<BllStockCheckLog>().First(m =>
                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;
@@ -315,9 +290,9 @@
                    checkInfo.UpdateUser = userId;
                    checkInfo.UpdateTime = time;
                    Db.Updateable(checkInfo).ExecuteCommand();
                    Db.Updateable(checkDetail).ExecuteCommand();
                    Db.Updateable(list).ExecuteCommand();
                await Db.Updateable(checkInfo).ExecuteCommandAsync();
                await Db.Updateable(checkDetail).ExecuteCommandAsync();
                await Db.Updateable(list).ExecuteCommandAsync();
                }
                //盘盈
                else if (result == "2")
@@ -335,10 +310,10 @@
                    }
                    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);
                    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("当前库存中已存在该箱支信息");
@@ -373,7 +348,7 @@
                    }
                    else
                    {
                        var checkInfo = Db.Queryable<BllStockCheckLog>().First(m =>
                    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 = 2;
@@ -383,7 +358,7 @@
                        checkInfo.UpdateUser = userId;
                        checkInfo.UpdateTime = time;
                        Db.Updateable(checkInfo).ExecuteCommand();
                    await Db.Updateable(checkInfo).ExecuteCommandAsync();
                    }
                    if (checkDetail.RealQty == null && isContinue == "0")
@@ -396,41 +371,33 @@
                        checkDetail.RealQty = qty;
                    }
                    checkDetail.CheckResult = 2;
                    Db.Updateable(checkDetail).ExecuteCommand();
                await Db.Updateable(checkDetail).ExecuteCommandAsync();
                    if (isContinue == "0")
                    {
                        Db.Insertable(crLog).ExecuteCommand();
                    await Db.Insertable(crLog).ExecuteCommandAsync();
                    }
                }
                else
                {
                    Db.RollbackTran();
                    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 (checkLogNum.Count(m => m.CheckResult == null) == 0)
            if (await checkLogNum.CountAsync(m => m.CheckResult == null) == 0)
                {
                    var checkDe = Db.Queryable<BllStockCheckDetail>().First(m =>
                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;
                    Db.Updateable(checkDe).ExecuteCommand();
                    var checkDeNum = Db.Queryable<BllStockCheckDetail>().Count(m =>
                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 = Db.Queryable<BllStockCheck>().First(m => m.CRNo == crNo && m.IsDel == "0");
                    var check = await Db.Queryable<BllStockCheck>().FirstAsync(m => m.CRNo == crNo && m.IsDel == "0");
                        check.Status = 2;
                        check.CompleteDate = DateTime.Now;
                        Db.Updateable(check).ExecuteCommand();
                    await Db.Updateable(check).ExecuteCommandAsync();
                    }
                }
                Db.CommitTran();
            }
            catch (Exception e)
            {
                Db.RollbackTran();
                throw new Exception(e.Message);
            }
        }
@@ -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,40 +425,31 @@
        #region 托盘变更(托盘解绑绑定)
        //根据托盘号获取箱码和箱内数量
        public List<PdaPalletNoCheckDto> GetDataDetailList(string palletNo)
        {
            try
        public async Task<List<PdaPalletNoCheckDto>> GetDataDetailList(string palletNo)
            {
                if (string.IsNullOrWhiteSpace(palletNo))
                {
                    throw new Exception("托盘号不能为空");
                throw Oops.Bah("托盘号不能为空");
                }
                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))
            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
                    {
                        BoxNo = a.BoxNo,
                        Qty = SqlFunc.AggregateSum(a.Qty)
                    }).ToList();
                }).ToListAsync();
                return info;
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
        }
        //根据箱码获取物料、批次、数量等信息
        public PdaPalletNoCheckDto GetBoxInfoByBox(string boxNo)
        {
            try
        public async Task<PdaPalletNoCheckDto> GetBoxInfoByBox(string boxNo)
            {
                if (string.IsNullOrWhiteSpace(boxNo))
                {
                    throw new Exception("箱码不能为空");
                throw Oops.Bah("箱码不能为空");
                }
                var info = Db.Queryable<DataBoxInfo>().Where(m => m.IsDel == "0" && m.BoxNo == boxNo)
            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,
@@ -515,32 +457,25 @@
                        SkuName = a.SkuName,
                        LotNo = a.LotNo,
                        Qty = SqlFunc.AggregateSum(a.Qty)
                    }).ToList();
                }).ToListAsync();
                if (info.Count > 1)
                {
                    throw new Exception("当前箱码查询出多条物料或批次信息,请核实");
                throw Oops.Bah("当前箱码查询出多条物料或批次信息,请核实");
                }
                return info.FirstOrDefault();
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
        }
        //解绑原托盘绑定新托盘
        public void SaveUnbind(string palletNo, string boxNo, string palletNoNew, int userId)
        {
            try
        public async Task SaveUnbind(string palletNo, string boxNo, string palletNoNew, int userId)
            {
                if (string.IsNullOrWhiteSpace(palletNo) || string.IsNullOrWhiteSpace(palletNoNew))
                {
                    throw new Exception("新旧托盘号不能为空");
                throw Oops.Bah("新旧托盘号不能为空");
                }
                if (palletNo == palletNoNew)
                {
                    throw new Exception("新旧托盘号不能为相同");
                throw Oops.Bah("新旧托盘号不能为相同");
                }
                //库存箱支信息
                var infos = Db.Queryable<DataBoxInfo>().Where(m => m.IsDel == "0" && m.PalletNo == palletNo);//整托变更
@@ -549,44 +484,42 @@
                    //按箱变更
                    infos = infos.Where(m => m.IsDel == "0" && m.BoxNo == boxNo);
                }
                List<DataBoxInfo> infosList = infos.ToList();
            List<DataBoxInfo> infosList = await infos.ToListAsync();
                if (infosList.Count <= 0)
                {
                    throw new Exception("原托盘上未查到箱支明细,请核实");
                throw Oops.Bah("原托盘上未查到箱支明细,请核实");
                }
                //库存明细id
                var infoIds = infos.GroupBy(m => m.StockDetailId).Select(a => a.StockDetailId).ToList();
            var infoIds = await infos.GroupBy(m => m.StockDetailId).Select(a => a.StockDetailId).ToListAsync();
                if (infoIds.Count == 0)
                {
                    throw new Exception("未查询到当前箱码信息,请核实");
                throw Oops.Bah("未查询到当前箱码信息,请核实");
                }
                //开启事务
                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();
            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("新托盘在立库内不允许变更,请核实");
                    }
                    #region 验证是否允许立库同托盘不同物料入库或同托盘同物料不同批次入库
                    var box = Db.Queryable<DataBoxInfo>().First(m => m.IsDel == "0" && m.PalletNo == palletNoNew && m.BitBoxMark == "0");
                var box = await Db.Queryable<DataBoxInfo>().FirstAsync(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)
                            {
                                var funSetting = Db.Queryable<SysFunSetting>().First(a => a.IsDel == "0" && a.FunSetNo == "Fun045");
                            var funSetting = await Db.Queryable<SysFunSetting>().FirstAsync(a => a.IsDel == "0" && a.FunSetNo == "Fun045");
                                if (funSetting == null || funSetting.IsEnable == "OFF")
                                {
                                    throw new Exception($"不允许立库同托盘不同物料入库或同托盘不同批次入库!");
                                throw Oops.Bah($"不允许立库同托盘不同物料入库或同托盘不同批次入库!");
                                }
                            }
                        }
@@ -595,33 +528,33 @@
                }
                if (!newPalletHaveGoods)//新托盘上没有物品
                {
                    var pallet = Db.Queryable<SysPallets>().First(m => m.IsDel == "0" && m.PalletNo == palletNoNew);
                var pallet = await Db.Queryable<SysPallets>().FirstAsync(m => m.IsDel == "0" && m.PalletNo == palletNoNew);
                    if (pallet == null)
                    {
                        throw new Exception("未查询到新托盘号信息");
                    throw Oops.Bah("未查询到新托盘号信息");
                    }
                    if (pallet.Status == "0")
                    {
                        pallet.Status = "1";//将新托盘状态修改为已使用
                        Db.Updateable(pallet).ExecuteCommand();
                    await Db.Updateable(pallet).ExecuteCommandAsync();
                    }
                    else
                    {
                        throw new Exception("新托盘号状态不是未使用");
                    throw Oops.Bah("新托盘号状态不是未使用");
                    }
                }
                foreach (var infoIdItem in infoIds)
                {
                    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);
                var stockDetail1 = await Db.Queryable<DataStockDetail>().FirstAsync(m => m.IsDel == "0" && m.PalletNo == palletNo && m.Id == infoIdItem);
                    if (stockDetail1 == null)
                    {
                        throw new Exception("未在原托盘上查询到箱码信息,请核实");
                    throw Oops.Bah("未在原托盘上查询到箱码信息,请核实");
                    }
                    if (!string.IsNullOrEmpty(stockDetail1.LocatNo))
                    {
                        throw new Exception("原托盘在立库内不允许变更,请核实");
                    throw Oops.Bah("原托盘在立库内不允许变更,请核实");
                    }
                    var stockDetail2 = stockDetailList.FirstOrDefault(w => w.SkuNo == stockDetail1.SkuNo && w.LotNo == stockDetail1.LotNo);
@@ -666,12 +599,12 @@
                            CreateUser = userId,
                            CreateTime = DateTime.Now
                        };
                        stId = Db.Insertable(detail).ExecuteReturnIdentity();
                    stId = await Db.Insertable(detail).ExecuteReturnIdentityAsync();
                    }
                    else //修改-新托盘有物品
                    {
                        stockDetail2.Qty += infosList2.Sum(m => m.Qty);//新托盘增加库存
                        Db.Updateable(stockDetail2).ExecuteCommand();
                    await Db.Updateable(stockDetail2).ExecuteCommandAsync();
                        stId = stockDetail2.Id;
                    }
                    //修改库存
@@ -679,19 +612,19 @@
                    stockDetail1.BitPalletMark = "1";//是否零托 0:否 1:是
                    if (stockDetail1.Qty == 0)
                    {
                        Db.Deleteable(stockDetail1).ExecuteCommand();//删除原托盘库存明细
                    await Db.Deleteable(stockDetail1).ExecuteCommandAsync();//删除原托盘库存明细
                        //判原托盘还有没有货物
                        var stockDetail3 = Db.Queryable<DataStockDetail>().Where(m => m.IsDel == "0" && m.PalletNo == palletNo && m.Id != infoIds.First()).ToList();
                    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";//原托盘没有货物后将状态修改为未使用
                            Db.Updateable(pallet).ExecuteCommand();
                        await Db.Updateable(pallet).ExecuteCommandAsync();
                        }
                    }
                    else
                    {
                        Db.Updateable(stockDetail1).ExecuteCommand();//修改原托盘库存明细
                    await Db.Updateable(stockDetail1).ExecuteCommandAsync();//修改原托盘库存明细
                    }
                    foreach (var item in infosList2)
                    {
@@ -699,7 +632,7 @@
                        item.StockDetailId = stId;
                        item.BindNo = null;
                        item.PalletNo = palletNoNew;
                        Db.Updateable(item).ExecuteCommand();
                    await Db.Updateable(item).ExecuteCommandAsync();
                    }
                    //添加托盘解绑绑定记录
                    var unBind = new BllPalletUnbind()
@@ -723,7 +656,7 @@
                        CreateTime = comTime,
                        CreateUser = userId
                    };
                    Db.Insertable(unBind).ExecuteCommand();
                await Db.Insertable(unBind).ExecuteCommandAsync();
                }
                //添加操作日志
                if (string.IsNullOrEmpty(boxNo))
@@ -731,14 +664,6 @@
                    boxNo = "全部";
                }
                new OperationCrServer().AddLogOperationCr("库内作业", "操作日志", boxNo, "编辑", $"托盘变更:原托盘码:{palletNo}上的箱码{boxNo}解绑,绑定到新托盘{palletNoNew}上", userId);
                //提交事务
                Db.CommitTran();
            }
            catch (Exception e)
            {
                Db.RollbackTran();
                throw new Exception(e.Message);
            }
        }
        #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 = Db.Queryable<DataStockDetail>().First(w => w.IsDel == "0" && w.PalletNo == palletNo);
            var models = await Db.Queryable<DataStockDetail>().FirstAsync(w => w.IsDel == "0" && w.PalletNo == palletNo);
                if (models == null)
                {
                    throw new Exception("托盘库存信息不存在,请检查!");
                throw Oops.Bah("托盘库存信息不存在,请检查!");
                }
                if (string.IsNullOrEmpty(models.LocatNo))
                {
                    throw new Exception("托盘储位信息不存在,请检查!");
                throw Oops.Bah("托盘储位信息不存在,请检查!");
                }
                if (models.WareHouseNo != "W02")
                {
                    throw new Exception("该托盘未在平库内,请检查!");
                throw Oops.Bah("该托盘未在平库内,请检查!");
                }
                return models.LocatNo;
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }
        /// <summary>
@@ -779,109 +697,79 @@
        /// </summary>
        /// <param name="palletNo"></param>
        /// <returns></returns>
        public List<SysStorageArea> GetStorageArea(string palletNo)
        {
            try
        public async Task<List<SysStorageArea>> GetStorageArea(string palletNo)
            {
                var storageArea = new List<SysStorageArea>();
                if (string.IsNullOrEmpty(palletNo))
                {
                    storageArea = Db.Queryable<SysStorageArea>().Where(w => w.IsDel == "0" && w.Status == "0" && w.WareHouseNo == "W02").OrderBy(o => o.AreaNo).ToList();
                storageArea = await Db.Queryable<SysStorageArea>().Where(w => w.IsDel == "0" && w.Status == "0" && w.WareHouseNo == "W02").OrderBy(o => o.AreaNo).ToListAsync();
                }
                else
                {
                    var models = Db.Queryable<DataStockDetail>().First(w => w.IsDel == "0" && w.PalletNo == palletNo);
                var models = await Db.Queryable<DataStockDetail>().FirstAsync(w => w.IsDel == "0" && w.PalletNo == palletNo);
                    if (models == null)
                    {
                        throw new Exception("托盘库存信息不存在,请检查!");
                    throw Oops.Bah("托盘库存信息不存在,请检查!");
                    }
                    if (string.IsNullOrEmpty(models.LocatNo))
                    {
                        throw new Exception("托盘储位信息不存在,请检查!");
                    throw Oops.Bah("托盘储位信息不存在,请检查!");
                    }
                    if (models.WareHouseNo != "W02")
                    {
                        throw new Exception("该托盘未在平库内,请检查!");
                    throw Oops.Bah("该托盘未在平库内,请检查!");
                    }
                    var storageLocat = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.LocatNo == models.LocatNo);
                var storageLocat = await Db.Queryable<SysStorageLocat>().FirstAsync(w => w.IsDel == "0" && w.LocatNo == models.LocatNo);
                    if (storageLocat == null)
                    {
                        throw new Exception("储位信息不存在,请检查!");
                    throw Oops.Bah("储位信息不存在,请检查!");
                    }
                    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();
                    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
                    {
                        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);
            }
        }
        /// <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)
        {
            try
        public async Task<List<DataStockDetail>> GetSkuInfoByPalletNo(string palletNo)
            {
                if (string.IsNullOrEmpty(palletNo))
                {
                    throw new Exception("请扫描托盘条码!");
                throw Oops.Bah("请扫描托盘条码!");
                }
                var skuInfoList = Db.Queryable<DataStockDetail>().Where(m => m.IsDel == "0" && m.PalletNo == palletNo).ToList();
                return skuInfoList;
            }
            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)
        {
            try
        public async Task<List<string>> GetPalletNoListBySoNo(string soNo)
            {
                if (string.IsNullOrEmpty(soNo))
                {
                    throw new Exception("请选择出库单号!");
                throw Oops.Bah("请选择出库单号!");
                }
                var palletNoList = Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && m.SONo == soNo).Select(m => m.PalletNo).Distinct().ToList();
            var palletNoList = await Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && m.SONo == soNo).Select(m => m.PalletNo).Distinct().ToListAsync();
                return palletNoList;
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }
        /// <summary>
@@ -890,79 +778,74 @@
        /// <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;//目标位置                
                var log = Db.Queryable<LogTask>().First(w => w.IsDel == "0" && w.PalletNo == palletNo && (w.Status == "0" || w.Status == "1"));
            var log = await Db.Queryable<LogTask>().FirstAsync(w => w.IsDel == "0" && w.PalletNo == palletNo && (w.Status == "0" || w.Status == "1"));
                if (log != null)
                {
                    throw new Exception("该托盘已有小车等待执行或正在执行的任务!");
                throw Oops.Bah("该托盘已有小车等待执行或正在执行的任务!");
                }
                var stockDetail = Db.Queryable<DataStockDetail>().First(w => w.IsDel == "0" && w.PalletNo == palletNo);
            var stockDetail = await Db.Queryable<DataStockDetail>().FirstAsync(w => w.IsDel == "0" && w.PalletNo == palletNo);
                if (stockDetail == null)
                {
                    throw new Exception("托盘上物料库存明细信息不存在,请检查!");
                throw Oops.Bah("托盘上物料库存明细信息不存在,请检查!");
                }
                if (!string.IsNullOrEmpty(areaNo))
                {
                    var storageArea = Db.Queryable<SysStorageArea>().First(w => w.IsDel == "0" && w.AreaNo == areaNo);
                var storageArea = await Db.Queryable<SysStorageArea>().FirstAsync(w => w.IsDel == "0" && w.AreaNo == areaNo);
                    if (storageArea == null)
                    {
                        throw new Exception("所选区域信息不存在,请检查!");
                    throw Oops.Bah("所选区域信息不存在,请检查!");
                    }
                    EndLocat = GetLocat(areaNo, stockDetail.SkuNo, stockDetail.LotNo, palletNo);
                EndLocat = await 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);
            var stock = await Db.Queryable<DataStock>().FirstAsync(w => w.IsDel == "0" && w.SkuNo == stockDetail.SkuNo && w.LotNo == stockDetail.LotNo);
                if (stock == null)
                {
                    throw new Exception("托盘上物料库存信息不存在,请检查!");
                throw Oops.Bah("托盘上物料库存信息不存在,请检查!");
                }
                if (string.IsNullOrEmpty(stockDetail.LocatNo))
                {
                    throw new Exception("托盘储位信息不存在,请检查!");
                throw Oops.Bah("托盘储位信息不存在,请检查!");
                }
                if (stockDetail.WareHouseNo != "W02")
                {
                    throw new Exception("该托盘未在平库内,请检查!");
                throw Oops.Bah("该托盘未在平库内,请检查!");
                }
                //起始储位信息
                var storageLocat = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.LocatNo == stockDetail.LocatNo);
            var storageLocat = await Db.Queryable<SysStorageLocat>().FirstAsync(w => w.IsDel == "0" && w.LocatNo == stockDetail.LocatNo);
                if (storageLocat == null)
                {
                    throw new Exception("储位信息不存在,请检查!");
                throw Oops.Bah("储位信息不存在,请检查!");
                }
                //目标储位信息
                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");
                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("目标储位信息不存在,请检查!");
                    }
                }
                //开启事务
                Db.BeginTran();
                //添加出库任务
                var taskNo = new Common().GetMaxNo("TK");
@@ -986,40 +869,32 @@
                    CreateTime = DateTime.Now
                };
                Db.Insertable(exTask).ExecuteCommand();
            await Db.Insertable(exTask).ExecuteCommandAsync();
                //修改库存明细信息
                stockDetail.Status = "4";//移库锁定
                stockDetail.LockQty = stockDetail.Qty;//锁定库存数量
                Db.Updateable(stockDetail).ExecuteCommand();
            await Db.Updateable(stockDetail).ExecuteCommandAsync();
                //修改库存信息
                stock.LockQty += (decimal)stockDetail.Qty;
                Db.Updateable(stock).ExecuteCommand();
            await Db.Updateable(stock).ExecuteCommandAsync();
                //修改起始储位地址状态
                storageLocat.Status = "5";//0:空储位 1:有物品 2:入库中 3:出库中 4:移入中 5:移出中 
                Db.Updateable(storageLocat).ExecuteCommand();
            await Db.Updateable(storageLocat).ExecuteCommandAsync();
                //修改目标储位地址状态
                if (storageLocatEnd != null)
                {
                    storageLocatEnd.Status = "4";//0:空储位 1:有物品 2:入库中 3:出库中 4:移入中 5:移出中 
                    Db.Updateable(storageLocatEnd).ExecuteCommand();
                await Db.Updateable(storageLocatEnd).ExecuteCommandAsync();
                }
                //添加操作日志记录
                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转运呼叫小车取货
@@ -1028,36 +903,32 @@
        /// <param name="palletNo"></param>
        /// <param name="areaNo"></param>
        /// <param name="userId"></param>
        public void AgvTransport2(string soNo, string palletNo, string areaNo, int userId)
        public async Task AgvTransport2(string soNo, string palletNo, string areaNo, int userId)
        {
            if (string.IsNullOrEmpty(soNo))
            {
                throw new Exception("请选择出库单据!");
                throw Oops.Bah("请选择出库单据!");
            }
            if (string.IsNullOrEmpty(areaNo))
            {
                throw new Exception("请选择目标区域!");
                throw Oops.Bah("请选择目标区域!");
            }
            try
            {
                //开启事务
                Db.BeginTran();
                //出库单信息
                var notice = Db.Queryable<BllExportNotice>().First(w => w.IsDel == "0" && w.SONo == soNo);
            var notice = await Db.Queryable<BllExportNotice>().FirstAsync(w => w.IsDel == "0" && w.SONo == soNo);
                if (notice == null)
                {
                    throw new Exception("出库单据信息不存在,请检查!");
                throw Oops.Bah("出库单据信息不存在,请检查!");
                }
                //目标区域信息
                var storageArea = Db.Queryable<SysStorageArea>().First(w => w.IsDel == "0" && w.AreaNo == areaNo);
            var storageArea = await Db.Queryable<SysStorageArea>().FirstAsync(w => w.IsDel == "0" && w.AreaNo == areaNo);
                if (storageArea == null)
                {
                    throw new Exception("所选区域信息不存在,请检查!");
                throw Oops.Bah("所选区域信息不存在,请检查!");
                }
                List<DataStockDetail> stockDetailList = new List<DataStockDetail>();//需要的托盘明细
                if (!string.IsNullOrEmpty(palletNo))//单托盘叫货
                {
                    stockDetailList = Db.Queryable<DataStockDetail>().Where(w => w.IsDel == "0" && w.PalletNo == palletNo).ToList();
                stockDetailList = await Db.Queryable<DataStockDetail>().Where(w => w.IsDel == "0" && w.PalletNo == palletNo).ToListAsync();
                }
                else//整个出库单叫货
                {
@@ -1066,7 +937,7 @@
                }
                if (stockDetailList.Count <= 0)
                {
                    throw new Exception("托盘明细不存在,请检查!");
                throw Oops.Bah("托盘明细不存在,请检查!");
                }
                var log = Db.Queryable<LogTask>().Where(w => w.IsDel == "0" && (w.Status == "0" || w.Status == "1"));//任务表
@@ -1077,30 +948,30 @@
                foreach (var item in stockDetailList)
                {
                    //任务信息
                    var logInfo = log.First(w => w.PalletNo == item.PalletNo);
                var logInfo = await log.FirstAsync(w => w.PalletNo == item.PalletNo);
                    if (logInfo != null)
                    {
                        throw new Exception($"托盘号:{item.PalletNo}已有小车等待执行或正在执行的任务!");
                    throw Oops.Bah($"托盘号:{item.PalletNo}已有小车等待执行或正在执行的任务!");
                    }
                    if (string.IsNullOrEmpty(item.LocatNo))
                    {
                        throw new Exception($"托盘号:{item.PalletNo}的储位信息不存在,请检查!");
                    throw Oops.Bah($"托盘号:{item.PalletNo}的储位信息不存在,请检查!");
                    }
                    if (item.WareHouseNo != "W02")
                    {
                        throw new Exception($"托盘号:{item.PalletNo}未在平库内,请检查!");
                    throw Oops.Bah($"托盘号:{item.PalletNo}未在平库内,请检查!");
                    }
                    //起始储位信息
                    var storageLocatBegin = storageLocat.First(w => w.LocatNo == item.LocatNo);
                var storageLocatBegin = await storageLocat.FirstAsync(w => w.LocatNo == item.LocatNo);
                    if (storageLocat == null)
                    {
                        throw new Exception($"托盘号:{item.PalletNo}所在的储位信息不存在,请检查!");
                    throw Oops.Bah($"托盘号:{item.PalletNo}所在的储位信息不存在,请检查!");
                    }
                    //获取目标储位
                    EndLocat = GetLocat(areaNo, item.SkuNo, item.LotNo, palletNo);
                EndLocat = await GetLocat(areaNo, item.SkuNo, item.LotNo, palletNo);
                    if (string.IsNullOrEmpty(EndLocat))
                    {
                        throw new Exception("分配目标储位失败,请检查!");
                    throw Oops.Bah("分配目标储位失败,请检查!");
                    }
                    if (string.IsNullOrEmpty(hasLocatNoList))
                    {
@@ -1114,7 +985,7 @@
                    var storageLocatEnd = storageLocat.First(w => w.LocatNo == EndLocat && w.Flag == "0" && w.Status == "0");
                    if (storageLocatEnd == null)
                    {
                        throw new Exception("目标储位信息不存在,请检查!");
                    throw Oops.Bah("目标储位信息不存在,请检查!");
                    }
                    //添加出库任务
@@ -1138,24 +1009,24 @@
                        CreateTime = DateTime.Now
                    };
                    Db.Insertable(exTask).ExecuteCommand();
                await Db.Insertable(exTask).ExecuteCommandAsync();
                    //修改库存明细信息
                    item.Status = "4";//移库锁定
                    item.LockQty = item.Qty;//锁定库存数量
                    Db.Updateable(item).ExecuteCommand();
                await Db.Updateable(item).ExecuteCommandAsync();
                    //修改起始储位地址状态
                    storageLocatBegin.Status = "5";//0:空储位 1:有物品 2:入库中 3:出库中 4:移入中 5:移出中 
                    Db.Updateable(storageLocatBegin).ExecuteCommand();
                await Db.Updateable(storageLocatBegin).ExecuteCommandAsync();
                    //修改目标储位地址状态
                    storageLocatEnd.Status = "4";//0:空储位 1:有物品 2:入库中 3:出库中 4:移入中 5:移出中 
                    Db.Updateable(storageLocatEnd).ExecuteCommand();
                await Db.Updateable(storageLocatEnd).ExecuteCommandAsync();
                    var stockInfo = stock.First(w => w.SkuNo == item.SkuNo && w.LotNo == item.LotNo);
                var stockInfo = await stock.FirstAsync(w => w.SkuNo == item.SkuNo && w.LotNo == item.LotNo);
                    //修改库存信息
                    stockInfo.LockQty += (decimal)item.Qty;//锁定数量
                    Db.Updateable(stockInfo).ExecuteCommand();
                await Db.Updateable(stockInfo).ExecuteCommandAsync();
                }
                if (string.IsNullOrEmpty(palletNo))
                {
@@ -1167,18 +1038,10 @@
                    //添加操作日志记录
                    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>
        /// 根据区域分配储位
@@ -1187,16 +1050,14 @@
        /// <param name="skuNo"></param>
        /// <param name="lotNo"></param>
        /// <returns></returns>
        private string GetLocat(string areaNo, string skuNo, string lotNo, string palletNo, string hasLocatNoList = "")
        {
            try
        private async Task<string> GetLocat(string areaNo, string skuNo, string lotNo, string palletNo, string hasLocatNoList = "")
            {
                string endLocat = string.Empty;//目标储位
                //当然区域所有储位信息
                var storageLocatList = Db.Queryable<SysStorageLocat>().Where(w => w.WareHouseNo == "W02" && w.AreaNo == areaNo).ToList();
            var storageLocatList = await Db.Queryable<SysStorageLocat>().Where(w => w.WareHouseNo == "W02" && w.AreaNo == areaNo).ToListAsync();
                //同区域同批次物料的储位信息
                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();
            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)
                {
                    var locatInfo = storageLocatList.Where(w => w.LocatNo == item).First();
@@ -1219,11 +1080,6 @@
                    }
                }
                return endLocat;
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }
        #endregion