hwh
2024-07-15 fdabf96e523065218de594c25eb13da5f4eac852
Wms/WMS.BLL/BllCheckServer/WarehouseOutsidePalletsServer.cs
@@ -4,6 +4,8 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using Utility;
using WMS.BLL.LogServer;
using WMS.DAL;
using WMS.Entity.BllAsnEntity;
@@ -18,8 +20,10 @@
    public class WarehouseOutsidePalletsServer : DbHelper<DataStockDetail>, IWarehouseOutsidePalletsServer
    {
        private static readonly SqlSugarScope Db = DataContext.Db;
        public WarehouseOutsidePalletsServer() : base(Db)
        private readonly UserManager _userManager;
        public WarehouseOutsidePalletsServer(UserManager userManager) : base(Db)
        {
            _userManager = userManager;
        }
        /// <summary>
@@ -30,196 +34,158 @@
        /// <param name="lotNo">批次</param>
        /// <param name="palletNo">托盘号</param>
        /// <returns></returns>
        public List<MateDataStockDto> GetPalletsOutside(string skuNo, string skuName, string lotNo, string palletNo, int page, int limit, out int count)
        public async Task<List<MateDataStockDto>> GetPalletsOutside(string skuNo, string skuName, string lotNo, string palletNo, int page, int limit, RefAsync<int> count)
        {
            string sqlCount = "SELECT DISTINCT COUNT(DataStockDetail.ID) " +
                "FROM DataStockDetail " +
                "where IsDel = 0 and isnull(LocatNo,'') = '' and isnull(WareHouseNo,'') = '' ";
            string str = "select Id,LotNo,LotText,SupplierLot,SkuNo,SkuName,Standard,Qty,LockQty,FrozenQty,PalletNo," +
                "Status,InspectMark,BitPalletMark,InspectStatus " +
                "from DataStockDetail " +
                "where IsDel = 0 and isnull(LocatNo,'') = '' and isnull(WareHouseNo,'') = ''";
            //判断物料号是否为空
            if (!string.IsNullOrEmpty(skuNo))
            {
                str += $" and SkuNo like '%{skuNo}%'";
            }
            //判断物料名称是否为空
            if (!string.IsNullOrEmpty(skuName))
            {
                str += $" and SkuName like '%{skuName}%'";
            }
            //判断批次是否为空
            if (!string.IsNullOrEmpty(lotNo))
            {
                str += $" and LotNo like '%{lotNo}%'";
            }
            //判断托盘号是否为空
            if (!string.IsNullOrEmpty(palletNo))
            {
                str += $" and PalletNo like '%{palletNo}%'";
            }
            //排序
            str += " order by LotNo,SkuNo,PalletNo";
            if (page == 0)
            {
                page = 1;
            }
            str += $" offset {((page - 1) * limit)} rows fetch next {limit} rows only;";
            List<MateDataStockDto> mateDataStockDtos = Db.Ado.SqlQuery<MateDataStockDto>(str);
            var com = new Common();
            count = com.GetRowCount(sqlCount);
            return mateDataStockDtos;
            var list = await Db.Queryable<DataStockDetail>()
                              .Where(a => a.IsDel == "0" && SqlFunc.IsNullOrEmpty(a.LocatNo) && SqlFunc.IsNullOrEmpty(a.WareHouseNo))
                              .WhereIF(!string.IsNullOrEmpty(skuNo), a => a.SkuNo.Contains(skuNo))
                              .WhereIF(!string.IsNullOrEmpty(skuName), a => a.SkuName.Contains(skuName))
                              .WhereIF(!string.IsNullOrEmpty(lotNo), a => a.LotNo.Contains(lotNo))
                              .WhereIF(!string.IsNullOrEmpty(palletNo), a => a.PalletNo.Contains(palletNo))
                              .OrderBy(a => new { a.LotNo, a.SkuNo, a.PalletNo })
                              .Select<MateDataStockDto>()
                              .ToPageListAsync(page, limit, count);
            return list;
        }
        //保存指定的储位
        public void SaveAppointSlot(int stockDetailId, int locateId, int userId)
        public async Task SaveAppointSlot(int stockDetailId, int locateId)
        {
            //库存明细信息
            var stockDetail = await Db.Queryable<DataStockDetail>().FirstAsync(m => m.IsDel == "0" && m.Id == stockDetailId);
            if (stockDetail == null)
            {
                throw Oops.Bah("未查询到库存库外托盘的信息");
            }
            if (!string.IsNullOrWhiteSpace(stockDetail.LocatNo))
            {
                throw Oops.Bah("该托盘已在储位上,不能指定储位,请核实!");
            }
            //储位
            var locate = await Db.Queryable<SysStorageLocat>().FirstAsync(m => m.IsDel == "0" && m.Id == locateId);
            if (locate == null)
            {
                throw Oops.Bah("未查询到储位的信息");
            }
            if (locate.Status != "0" || locate.Flag != "0")
            {
                throw Oops.Bah("该储位状态不是空储位或标志不是正常的");
            }
            var logTask = await Db.Queryable<LogTask>().FirstAsync(m => m.IsDel == "0" && m.Type == "0" && m.PalletNo == stockDetail.PalletNo && m.Status == "1");
            if (logTask != null)
            {
                throw Oops.Bah("当前托盘已有正在执行的任务,请核实查看");
            }
            //若是深度1的 则判断深度2是否为空储位
            if (locate.Depth == "01")
            {
                var locateDepth = await Db.Queryable<SysStorageLocat>().FirstAsync(a => a.IsDel == "0" && a.Row == locate.Row && a.Column == locate.Column && a.Layer == locate.Layer && a.Depth == "02");
                if (locateDepth != null)
                {
                    if (locateDepth.Status != "1")
                    {
                        throw Oops.Bah("该储位深度2不是有物品,不可绑定");
                    }
                }
            }
            //判断是否为深度2的 若为深度2 则获取深度1储位 判断是否为空储位
            if (locate.Depth == "02")
            {
                var locateDepth = await Db.Queryable<SysStorageLocat>().FirstAsync(a => a.IsDel == "0" && a.Row == locate.Row && a.Column == locate.Column && a.Layer == locate.Layer && a.Depth == "01");
                if (locateDepth.Status != "0" || locateDepth.Flag == "2")
                {
                    throw Oops.Bah("该储位深度1不是空储位或标志不是正常的");
                }
            }
            // 获取此托盘的任务号
            var taskModel = await Db.Queryable<LogTask>().FirstAsync(m => m.IsDel == "0" && m.PalletNo == stockDetail.PalletNo && m.IsSuccess == 0 && m.Status == "0");
            Db.BeginTran();
            try
            {
                //库存明细信息
                var stockDetail = Db.Queryable<DataStockDetail>().First(m => m.IsDel == "0" && m.Id == stockDetailId);
                if (stockDetail == null)
                var time = DateTime.Now;
                var taskNo = string.Empty;
                if (taskModel == null)          // 之前未指定托盘
                {
                    throw new Exception("未查询到库存库外托盘的信息");
                }
                if (!string.IsNullOrWhiteSpace(stockDetail.LocatNo))
                {
                    throw new Exception("该托盘已在储位上,不能指定储位,请核实!");
                }
                //储位
                var locate = Db.Queryable<SysStorageLocat>().First(m => m.IsDel == "0" && m.Id == locateId);
                if (locate == null)
                {
                    throw new Exception("未查询到储位的信息");
                }
                if (locate.Status != "0" || locate.Flag != "0")
                {
                    throw new Exception("该储位状态不是空储位或标志不是正常的");
                }
                var logTask = Db.Queryable<LogTask>().First(m => m.IsDel == "0" && m.Type == "0" && m.PalletNo == stockDetail.PalletNo && m.Status == "1");
                if (logTask != null)
                {
                    throw new Exception("当前托盘已有正在执行的任务,请核实查看");
                }
                //若是深度1的 则判断深度2是否为空储位
                if (locate.Depth == "01")
                {
                    var locateDepth = Db.Queryable<SysStorageLocat>().First(a => a.IsDel == "0" && a.Row == locate.Row && a.Column == locate.Column && a.Layer == locate.Layer && a.Depth == "02");
                    if (locateDepth != null)
                    // 添加入库日志记录
                    taskNo = new Common().GetMaxNo("TK");
                    var task = new LogTask    //入库任务
                    {
                        if (locateDepth.Status != "1")
                        TaskNo = taskNo,
                        Sender = "WMS",
                        Receiver = "WCS",
                        IsSuccess = 0, //是否下发成功 0失败 1成功
                        SendDate = time,  //发送时间
                        BackDate = time,  //返回时间
                        StartRoadway = "",            // 起始巷道
                        StartLocat = "",//起始位置
                        EndLocat = locate.LocatNo,//目标位置
                        EndRoadway = locate.RoadwayNo,  // 目标巷道
                        PalletNo = stockDetail.PalletNo,//托盘码
                        IsSend = 1,//是否可再次下发
                        IsCancel = 1,//是否可取消
                        IsFinish = 1,//是否可完成
                        Type = "0",//任务类型 0 入库任务 1 出库任务  2 移库任务
                        Status = "0",//任务状态0:等待执行1正在执行2执行完成
                        OrderType = "0",//0 入库单 1 出库单  2 盘点单  3 移库单
                        Msg = "入库口到=>>" + locate.LocatNo + "储位的入库任务", //关键信息
                    };
                    await Db.Insertable(task).ExecuteCommandAsync();
                    locate.Status = "2";
                    await Db.Updateable(locate).ExecuteCommandAsync();
                }
                else                           // 已指定过托盘需变更
                {
                    // 获取上次指定的储位地址
                    var locateOld = await Db.Queryable<SysStorageLocat>().FirstAsync(m => m.IsDel == "0" && m.LocatNo == taskModel.EndLocat);
                    if (locateOld != null)
                    {
                        if (locateOld.LocatNo == locate.LocatNo) // 判断当前指定的地址和上次的是否一致,若一致不做更改
                        {
                            throw new Exception("该储位深度2不是有物品,不可绑定");
                            throw new Exception("已指定相同储位地址");
                        }
                        else // 若不一致 释放上次指定的储位地址
                        {
                            locateOld.Status = "0";
                            await Db.Updateable(locateOld).ExecuteCommandAsync();
                        }
                    }
                    locate.Status = "2";
                    await Db.Updateable(locate).ExecuteCommandAsync();
                    // 更新任务号指定地址信息
                    taskModel.EndLocat = locate.LocatNo;//目标储位
                    taskModel.EndRoadway = locate.RoadwayNo;//目标巷道
                    await Db.Updateable(taskModel).ExecuteCommandAsync();
                    taskNo = taskModel.TaskNo;
                }
                //判断是否为深度2的 若为深度2 则获取深度1储位 判断是否为空储位
                if (locate.Depth == "02")
                // 更新组盘表巷道地址和储位地址
                var bindModel = await Db.Queryable<BllPalletBind>().FirstAsync(m => m.IsDel == "0"
                && m.PalletNo == stockDetail.PalletNo && m.ASNDetailNo == stockDetail.ASNDetailNo && m.ASNNo == stockDetail.ASNNo);
                if (string.IsNullOrWhiteSpace(bindModel.TaskNo) || bindModel.TaskNo == taskNo)
                {
                    var locateDepth = Db.Queryable<SysStorageLocat>().First(a => a.IsDel == "0" && a.Row == locate.Row && a.Column == locate.Column && a.Layer == locate.Layer && a.Depth == "01");
                    if (locateDepth.Status != "0" || locateDepth.Flag == "2")
                    {
                        throw new Exception("该储位深度1不是空储位或标志不是正常的");
                    }
                    bindModel.TaskNo = taskNo;
                    bindModel.WareHouseNo = locate.WareHouseNo;
                    bindModel.RoadwayNo = locate.RoadwayNo;
                    bindModel.LocatNo = locate.LocatNo;
                    await Db.Updateable(bindModel).ExecuteCommandAsync();
                }
                // 获取此托盘的任务号
                var taskModel = Db.Queryable<LogTask>().First(m=>m.IsDel=="0" && m.PalletNo == stockDetail.PalletNo && m.IsSuccess ==0 && m.Status =="0");
                Db.BeginTran();
                try
                {
                    var time = DateTime.Now;
                    var taskNo = string.Empty;
                    if (taskModel == null)          // 之前未指定托盘
                    {
                        // 添加入库日志记录
                        taskNo = new Common().GetMaxNo("TK");
                        var task = new LogTask    //入库任务
                        {
                            TaskNo = taskNo,
                            Sender = "WMS",
                            Receiver = "WCS",
                            IsSuccess = 0, //是否下发成功 0失败 1成功
                            SendDate = time,  //发送时间
                            BackDate = time,  //返回时间
                            StartRoadway = "",            // 起始巷道
                            StartLocat = "",//起始位置
                            EndLocat = locate.LocatNo,//目标位置
                            EndRoadway = locate.RoadwayNo,  // 目标巷道
                            PalletNo = stockDetail.PalletNo,//托盘码
                            IsSend = 1,//是否可再次下发
                            IsCancel = 1,//是否可取消
                            IsFinish = 1,//是否可完成
                            Type = "0",//任务类型 0 入库任务 1 出库任务  2 移库任务
                            Status = "0",//任务状态0:等待执行1正在执行2执行完成
                            OrderType = "0",//0 入库单 1 出库单  2 盘点单  3 移库单
                            Msg = "入库口到=>>" + locate.LocatNo + "储位的入库任务", //关键信息
                        };
                        Db.Insertable(task).ExecuteCommand();
                        locate.Status = "2";
                        Db.Updateable(locate).ExecuteCommand();
                    }
                    else                           // 已指定过托盘需变更
                    {
                        // 获取上次指定的储位地址
                        var locateOld = Db.Queryable<SysStorageLocat>().First(m => m.IsDel == "0" && m.LocatNo == taskModel.EndLocat);
                        if (locateOld != null)
                        {
                            if (locateOld.LocatNo == locate.LocatNo) // 判断当前指定的地址和上次的是否一致,若一致不做更改
                            {
                                throw new Exception("已指定相同储位地址");
                            }
                            else // 若不一致 释放上次指定的储位地址
                            {
                                locateOld.Status = "0";
                                Db.Updateable(locateOld).ExecuteCommand();
                            }
                        }
                        locate.Status = "2";
                        Db.Updateable(locate).ExecuteCommand();
                        // 更新任务号指定地址信息
                        taskModel.EndLocat = locate.LocatNo;//目标储位
                        taskModel.EndRoadway = locate.RoadwayNo;//目标巷道
                        Db.Updateable(taskModel).ExecuteCommand();
                        taskNo = taskModel.TaskNo;
                    }
                    // 更新组盘表巷道地址和储位地址
                    var bindModel = Db.Queryable<BllPalletBind>().First(m => m.IsDel == "0"
                    && m.PalletNo == stockDetail.PalletNo && m.ASNDetailNo == stockDetail.ASNDetailNo && m.ASNNo == stockDetail.ASNNo);
                    if (string.IsNullOrWhiteSpace(bindModel.TaskNo) || bindModel.TaskNo == taskNo)
                    {
                        bindModel.TaskNo = taskNo;
                        bindModel.WareHouseNo = locate.WareHouseNo;
                        bindModel.RoadwayNo = locate.RoadwayNo;
                        bindModel.LocatNo = locate.LocatNo;
                        Db.Updateable(bindModel).ExecuteCommand();
                    }
                    // 插入操作日志
                    new OperationASNServer().AddLogOperationAsn("库内作业", "库外托盘", stockDetail.PalletNo, "编辑",
                            $"指定了储位:{locate.LocatNo}、单据号:{stockDetail.ASNNo}、托盘码:{stockDetail.PalletNo}的信息", userId);
                    //提交事务
                    Db.CommitTran();
                }
                catch (Exception e)
                {
                    Db.RollbackTran();
                    throw new Exception(e.Message);
                }
                // 插入操作日志
                new OperationASNServer().AddLogOperationAsn("库内作业", "库外托盘", stockDetail.PalletNo, "编辑",
                        $"指定了储位:{locate.LocatNo}、单据号:{stockDetail.ASNNo}、托盘码:{stockDetail.PalletNo}的信息", _userManager.UserId);
                //提交事务
                Db.CommitTran();
            }
            catch (Exception e)
            {
                Db.RollbackTran();
                throw new Exception(e.Message);
            }
        }