hwh
2024-07-17 cfe19c291c3c8362372c60a10f1d5a11927639f8
Wms/WMS.BLL/BllCheckServer/StockCheckServer.cs
@@ -3,6 +3,7 @@
using System.ComponentModel.Design;
using System.Linq;
using System.Linq.Expressions;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Identity;
@@ -340,7 +341,7 @@
                    ParentName = "库内作业",
                    MenuName = "盘点单据",
                    FkNo = model.CrNo,
                    TypeName = "添加",
                    TypeName = "编辑",
                    Msg = $"编辑了单据号为{model.CrNo}的盘点单信息"
                });
                //var k = new OperationCrServer().AddLogOperationCr("库内作业", "盘点单据", model.CrNo, "编辑", $"编辑了单据号为{model.CrNo}的盘点单信息", _userManager.UserId);
@@ -903,10 +904,27 @@
                throw Oops.Bah($"未找到{crNo}盘点单信息");
            }
            //所有要出库的盘点明细信息(等待的信息和待拣货的信息)
            var list = await Db.Queryable<BllStockCheckDetail>().Where(a => a.IsDel == "0" && a.CRNo == crNo && a.Status == 0).ToListAsync();
            var funSetting = Db.Queryable<SysFunSetting>().First(a => a.IsDel == "0" && a.FunSetNo == "InventoryCheckMethod");
            if (funSetting == null || funSetting.IsEnable == "OFF")
            {
                throw Oops.Bah("需配置盘点方式");
            }
            var list = await Db.Queryable<BllStockCheckDetail>().Where(a => a.IsDel == "0" && a.CRNo == crNo && (a.Status == 0 || a.Status == 1 || a.Status == 2)).ToListAsync();
            if (list.Count == 0) //判断是否有需要下发的盘点明细
            {
                throw Oops.Bah("当前盘点单据无需要下发的托盘");
            }
            if (funSetting.SetValue == "once")
            {
                if (list.Any(s => s.Status == 1 || s.Status == 2))
                {
                    throw Oops.Bah("已有正在出库或待盘点的数据,请完成盘点后再出库");
                }
                list = new List<BllStockCheckDetail>() { list.FirstOrDefault() };
            }
            else
            {
                list = list.Where(s => s.Status == 0).ToList();
            }
            #region 
            //要出库的托盘集合
@@ -1168,11 +1186,11 @@
            }
            if (flagList.Count(m => m == 3) > 0)
            {
                str += "4.储位损坏不能出库、";
                str += "3.储位损坏不能出库、";
            }
            if (flagList.Count(m => m == 4) > 0)
            {
                str += "3.要出库的托盘正在入库、";
                str += "4.要出库的托盘正在入库、";
            }
            if (flagList.Count(m => m == 5) > 0)
            {
@@ -1208,7 +1226,352 @@
            return outDtoList;
            #endregion
        }
        /// <summary>
        /// 视觉盘点
        /// </summary>
        /// <param name="crNo"></param>
        /// <param name="url"></param>
        /// <param name="str"></param>
        /// <returns></returns>
        public async Task<List<OutCommandDto>> CheckVision(string crNo, string url, string str)
        {
            #region 集合
            var outDtoList = new List<OutCommandDto>(); //出库数据的集合
                                                        //记录错误信息的集合
            var flagList = new List<int>();//1:当前要出库的储位正在移出、2 出库的托盘储位信息错误(在储位表中未查询到)、3储位损坏不能出库、4 要出库的托盘正在入库
            #endregion
            var com = new Common();
            //assign.IsHavePyTask();
            var notice = await Db.Queryable<BllStockCheck>().FirstAsync(m => m.CRNo == crNo && m.IsDel == "0");
            if (notice == null)
            {
                throw Oops.Bah($"未找到{crNo}盘点单信息");
            }
            //所有要出库的盘点明细信息(等待的信息和待拣货的信息)
            var funSetting = Db.Queryable<SysFunSetting>().First(a => a.IsDel == "0" && a.FunSetNo == "InventoryCheckMethod");
            if (funSetting == null || funSetting.IsEnable == "OFF")
            {
                throw Oops.Bah("需配置盘点方式");
            }
            var list = await Db.Queryable<BllStockCheckDetail>().Where(a => a.IsDel == "0" && a.CRNo == crNo && (a.Status == 0 || a.Status == 1 || a.Status == 2)).ToListAsync();
            if (list.Count == 0) //判断是否有需要下发的盘点明细
            {
                throw Oops.Bah("当前盘点单据无需要下发的托盘");
            }
            if (funSetting.SetValue == "once")
            {
                if (list.Any(s => s.Status == 1 || s.Status == 2))
                {
                    throw Oops.Bah("已有正在出库或待盘点的数据,请完成盘点后再出库");
                }
                list = new List<BllStockCheckDetail>() { list.FirstOrDefault() };
            }
            else
            {
                list = list.Where(s => s.Status == 0).ToList();
            }
            #region
            //要出库的托盘集合
            var outLpnList = list.Select(m => m.PalletNo).Distinct().ToList();
            //要出库的明细集合
            var outStockDetail = await Db.Queryable<DataStockDetail>().Where(m => m.IsDel == "0" && outLpnList.Contains(m.PalletNo)).ToListAsync();
            var outStockBox = await Db.Queryable<DataBoxInfo>().Where(m => m.IsDel == "0" && outLpnList.Contains(m.PalletNo)).ToListAsync();
            //获取物料信息
            var skuNo = await Db.Queryable<SysMaterials>().Where(a => a.IsDel == "0" && a.Type == "4").Select(a => a.SkuNo).ToListAsync();
            var time = DateTime.Now;
            //Db.BeginTran();
            //循环盘点明细的信息生成出库任务
            foreach (var item in list)
            {
                if (item.Status == 0)
                {
                    var logList = new List<BllStockCheckLog>();
                    //判断是否为无码物料
                    if (skuNo.Contains(item.SkuNo))
                    {
                        var de = outStockDetail.First(m => m.IsDel == "0" &&
                        m.SkuNo == item.SkuNo && m.LotNo == item.LotNo && m.PalletNo == item.PalletNo);
                        var checkLog = new BllStockCheckLog()
                        {
                            CRNo = item.CRNo,
                            PalletNo = item.PalletNo,
                            BoxNo = "",
                            BoxNo2 = "",
                            BoxNo3 = "",
                            Qty = (int?)de.Qty,
                            SkuNo = de.SkuNo,
                            SkuName = de.SkuName,
                            Standard = de.Standard,
                            LotNo = de.LotNo,
                            LotText = de.LotText,
                            SupplierLot = de.SupplierLot,
                            CreateUser = _userManager.UserId,
                            CreateTime = time
                        };
                        logList.Add(checkLog);
                    }
                    else
                    {
                        var de = outStockDetail.Where(m =>
                        m.SkuNo == item.SkuNo && m.LotNo == item.LotNo && m.PalletNo == item.PalletNo).Select(m => m.Id).ToList();
                        var bo = outStockBox.Where(m => de.Contains(m.StockDetailId)).ToList();
                        foreach (var b in bo)
                        {
                            var checkLog = new BllStockCheckLog()
                            {
                                CRNo = item.CRNo,
                                PalletNo = item.PalletNo,
                                BoxNo = b.BoxNo,
                                BoxNo2 = b.BoxNo2,
                                BoxNo3 = b.BoxNo3,
                                Qty = b.Qty,
                                SkuNo = b.SkuNo,
                                SkuName = b.SkuName,
                                Standard = b.Standard,
                                LotNo = b.LotNo,
                                LotText = b.LotText,
                                SupplierLot = b.SupplierLot,
                                CreateUser = _userManager.UserId,
                                CreateTime = time
                            };
                            logList.Add(checkLog);
                        }
                    }
                    //生成盘点记录
                    await Db.Insertable(logList).ExecuteCommandAsync();
                }
                // 储位号
                var locateNo = outStockDetail.First(m => m.PalletNo == item.PalletNo && m.SkuNo == item.SkuNo && m.LotNo == item.LotNo).LocatNo;
                #region 判断
                //判断托盘是否在库内
                if (string.IsNullOrWhiteSpace(locateNo))
                {
                    var de = outStockDetail.First(m => m.SkuNo == item.SkuNo && m.LotNo == item.LotNo && m.PalletNo == item.PalletNo);
                    //判断是否是零箱库,当前明细信息直接更新出库完成
                    if (de != null && de.WareHouseNo == "W02")
                    {
                        //盘点明细状态改为待盘点
                        item.Status = 2;
                        await Db.Updateable(item).ExecuteCommandAsync();
                        //盘点信息修改
                        if (notice.Status == 0)
                        {
                            notice.CheckDate = DateTime.Now;
                            notice.Status = 1;
                            notice.UpdateUser = _userManager.UserId;
                            notice.UpdateTime = time;
                            await Db.Updateable(notice).ExecuteCommandAsync();
                        }
                        //库存中当前托盘的信息
                        var stockDetail = await Db.Queryable<DataStockDetail>().Where(m => m.PalletNo == item.PalletNo).ToListAsync();
                        foreach (var s in stockDetail)
                        {
                            s.LocatNo = "";//储位更改(改为空)
                            s.WareHouseNo = "";//所属仓库更改(改为空)
                            s.RoadwayNo = "";//所属巷道更改(改为空)
                            s.AreaNo = "";//所属区域更改(改为空)
                            await Db.Updateable(s).ExecuteCommandAsync();
                        }
                        flagList.Add(5);
                        continue;
                    }
                    //判断托盘是否在入库中
                    var imBl = com.GetImTask(item.PalletNo);
                    if (imBl != null)
                    {
                        flagList.Add(4);
                        continue;
                    }
                    //判断是否是已经出过库又回库(状态为待拣货的 1)
                    if (item.Status == 0)
                    {
                        //如果不在仓库内,当前明细信息直接更新出库完成
                        item.Status = 2;//状态
                        await Db.Updateable(item).ExecuteCommandAsync();
                        if (notice.Status == 0)
                        {
                            notice.CheckDate = DateTime.Now;
                            notice.Status = 1;
                            notice.UpdateUser = _userManager.UserId;
                            notice.UpdateTime = time;
                            await Db.Updateable(notice).ExecuteCommandAsync();
                        }
                    }
                    continue;
                }
                //当前出库的储位信息
                var locate = await Db.Queryable<SysStorageLocat>().FirstAsync(m => m.LocatNo == locateNo && m.IsDel == "0");
                if (locate == null)
                {
                    flagList.Add(2);
                    continue;
                }
                //判断储位标志是否为损坏
                if (locate.Flag == "2")
                {
                    flagList.Add(3);
                    continue;
                }
                #endregion
                if (locate.Status == "1") //有物品
                {
                    #region 添加出库任务
                    var taskNo = new Common().GetMaxNo("TK");
                    //添加出库任务
                    var exTask = new LogTask
                    {
                        TaskNo = taskNo,
                        Sender = "WMS",
                        Receiver = "WCS",
                        IsSuccess = 0, //是否下发成功 0失败 1成功
                        StartLocat = locate.LocatNo,//起始位置
                        //EndLocat = outMode,//目标位置
                        PalletNo = item.PalletNo,//托盘码
                        IsSend = 1,//是否可再次下发
                        IsCancel = 1,//是否可取消
                        IsFinish = 1,//是否可完成
                        Type = "1",//任务类型 0 入库任务 1 出库任务  2 移库任务
                        Status = "0",//任务状态0:等待执行1正在执行2执行完成
                        OrderType = "4",//0 入库单 1 出库单  2 盘点单  3 移库单 4视觉盘点
                        CreateTime = time
                    };
                    await Db.Insertable(exTask).ExecuteCommandAsync();
                    outDtoList.Add(new OutCommandDto()
                    {
                        PalletNo = item.PalletNo,//托盘号
                        StartLocate = locate.LocatNo, // 起始位置
                        StartRoadway = locate.RoadwayNo,
                        EndLocate = "", // 目标位置
                        TaskNo = exTask.TaskNo, // 任务号
                        TaskType = "1",// 任务类型 (出库)
                        OutMode = "",  //目标地址
                        Order = 1
                    });
                    #endregion
                    #region 改变数据
                    if (item.Status == 0)//判断托盘是否下发过
                    {
                        if (notice.Status == 0)
                        {
                            notice.CheckDate = DateTime.Now;
                            notice.Status = 1;
                            notice.UpdateUser = _userManager.UserId;
                            notice.UpdateTime = time;
                            await Db.Updateable(notice).ExecuteCommandAsync();
                        }
                    }
                    locate.Status = "3"; //要出库的储位改变状态 正在出库
                    await Db.Updateable(locate).ExecuteCommandAsync();
                    item.TaskNo = exTask.TaskNo; // 出库分配信息中更新任务号
                    item.Status = 1; // 出库分配信息状态改为正在执行
                    await Db.Updateable(item).ExecuteCommandAsync();
                    #endregion
                    flagList.Add(0);
                }
                else if (locate.Status == "3") //出库中
                {
                    #region 改变数据
                    //判断是否是已经出过库又回库(状态为待拣货的 1)
                    if (item.Status == 0)
                    {
                        if (notice.Status == 0)
                        {
                            notice.CheckDate = DateTime.Now;
                            notice.Status = 1;
                            notice.UpdateUser = _userManager.UserId;
                            notice.UpdateTime = time;
                            await Db.Updateable(notice).ExecuteCommandAsync();
                        }
                    }
                    var taskNo = Db.Queryable<LogTask>().First(m => m.OrderType == "2" && m.TaskNo != item.TaskNo && m.Status == "1" && m.PalletNo == item.PalletNo);
                    item.TaskNo = taskNo.TaskNo;
                    item.Status = 1; // 出库分配信息状态改为正在执行
                    await Db.Updateable(item).ExecuteCommandAsync();
                    #endregion
                }
                else if (locate.Status == "5") //移出中
                {
                    flagList.Add(1);
                }
            }
            //添加操作日志记录
            //var k = new OperationCrServer().AddLogOperationCr("库内作业", "盘点单据", crNo, "出库", $"点击出库按钮盘点单号为:{crNo}的盘点单", userId);
            await _operation.AddLogOperationCr(new OperationInputVm()
            {
                ParentName = "库内作业",
                MenuName = "盘点单据",
                FkNo = crNo,
                TypeName = "出库",
                Msg = $"点击出库按钮盘点单号为:{crNo}的盘点单"
            });
            //Db.CommitTran();
            str = string.Empty;
            if (flagList.Count(m => m == 1) > 0)
            {
                str += "1.当前要出库的储位正在移出、";
            }
            if (flagList.Count(m => m == 2) > 0)
            {
                str += "2.出库的托盘储位信息错误(在储位表中未查询到)、";
            }
            if (flagList.Count(m => m == 3) > 0)
            {
                str += "3.储位损坏不能出库、";
            }
            if (flagList.Count(m => m == 4) > 0)
            {
                str += "4.要出库的托盘正在入库、";
            }
            if (flagList.Count(m => m == 5) > 0)
            {
                str += "5.要出库的托盘在零箱库、";
            }
            if (!string.IsNullOrEmpty(str))
                throw Oops.Bah(str);
            if (outDtoList.Count > 0)
            {
                // 正式运行程序放开
                var list2 = outDtoList.Select(m => m.TaskNo).ToList();
                var jsonData = JsonConvert.SerializeObject(outDtoList);
                string response = "";
                var time1 = DateTime.Now;//发送时间 .ToString("yyyy-MM-dd HH:mm:ss")
                                         //response = HttpHelper.DoPost(url, jsonData, "下发给WCS出库命令", "WCS"); //正式版本放开
                var time2 = DateTime.Now;//返回时间 .ToString("yyyy-MM-dd HH:mm:ss")
                ////解析返回数据
                //var wcsModel = JsonConvert.DeserializeObject<WcsModel>(response);
                //if (wcsModel.StatusCode == 0)
                //{
                //    //更改任务的发送返回时间//
                //    new TaskServer().EditTaskIssueOk(list2, time1, time2);
                //    str += "下发成功";
                //}
                //if (wcsModel.StatusCode == -1)
                //{
                //    new TaskServer().EditTaskIssueNo(list2, time1, time2, wcsModel.Msg);
                //    throw Oops.Bah(wcsModel.Msg);
                //}
            }
            return outDtoList;
            #endregion
        }
        //盘点出库完成
        public async Task CheckSuccess(string taskNo, int userId)
        {