hwh
2024-07-17 cfe19c291c3c8362372c60a10f1d5a11927639f8
Merge branch 'hwh'
5个文件已修改
450 ■■■■■ 已修改文件
HTML/views/HouseWithinSetting/StockCheck.html 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.BLL/BllCheckServer/StockCheckServer.cs 355 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.Entity/LogEntity/LogTask.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.IBLL/IBllCheckServer/IStockCheckServer.cs 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Wms/Controllers/DownApiController.cs 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HTML/views/HouseWithinSetting/StockCheck.html
@@ -1,11 +1,13 @@
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>盘点单据列表</title>
        <meta name="renderer" content="webkit">
        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
        <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
    <meta name="viewport"
        content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
        <link rel="stylesheet" href="../../layuiadmin/layui/css/layui.css" media="all">
        <link rel="stylesheet" href="../../layuiadmin/style/admin.css" media="all"> 
        <link rel="stylesheet" href="../../css/public.css" media="all">
@@ -14,9 +16,11 @@
                top: auto;
                bottom: 29px;
            }
            .layui-table-tool{
                padding-left: 5px;
            }
            /* 表格下拉小箭头隐藏 */
            .layui-table-grid-down { 
                display: none; 
@@ -33,6 +37,7 @@
            });
          </script>
    </head>
    <body  id="body">
        <div class="layui-fluid" style="padding-bottom: 0;">
            <div class="layui-card">
@@ -67,8 +72,8 @@
                        <div class="layui-inline">
                            <label class="layui-form-label" style="width: 60px;">物品编码</label>
                            <div class="layui-input-inline">
                                <input type="text" id="SkuNo" name="SkuNo" placeholder="物品编码"
                                    autocomplete="off" class="layui-input">
                            <input type="text" id="SkuNo" name="SkuNo" placeholder="物品编码" autocomplete="off"
                                class="layui-input">
                            </div>
                        </div>
                        <div class="layui-inline">
@@ -122,7 +127,8 @@
                        <div class="layui-inline" id="divEditDemo" style="display: none; padding-top: 10px;">
                            <label class="layui-form-label">备注</label>
                            <div class="layui-input-inline" style="width: 300px;height: 100%;">
                                <textarea placeholder="请输入内容" id="NoticeDemo" name="NoticeDemo" class="layui-textarea"></textarea>
                            <textarea placeholder="请输入内容" id="NoticeDemo" name="NoticeDemo"
                                class="layui-textarea"></textarea>
                            </div>
                        </div>
                    </div>
@@ -163,6 +169,9 @@
                                            </a>`;                                   
                                }
                                if(d.Status == 0 || d.Status == 1){
                                    html += `<a class="layui-btn layui-btn-xs checkOut" lay-event="vision">
                                        <i class="layui-icon layui-icon-ok"></i>视觉盘点
                                    </a>`;
                                    html += `<a class="layui-btn layui-btn-xs checkOut" lay-event="outbound"> 
                                        <i class="layui-icon layui-icon-ok"></i>出库
                                    </a>`;
@@ -773,6 +782,46 @@
                                }
                            }
                        }); 
                } else if (obj.event === 'vision') {
                    layer.confirm('确定视觉盘点', function () {
                        if (isChongFu == true) {
                            isChongFu = false;
                            var param = {
                                crNo: data.CrNo
                            };
                            sendData(IP + "/DownApi/CheckVision", param, 'get', function (res) {
                                console.log(res);
                                if (res.code == 0) { //成功
                                    layer.msg(res.msg, {
                                        icon: 1,
                                        time: 3000 //1秒关闭(如果不配置,默认是3秒)
                                    }, function () {
                                        refreshTable();
                                        isChongFu = true;
                                    });
                                } else { //不成功
                                    layer.msg(res.msg, {
                                        icon: 2,
                                        time: 3000 //2秒关闭(如果不配置,默认是3秒)
                                    }, function () {
                                        refreshTable();
                                        isChongFu = true;
                                    });
                                }
                                layer.close(index);
                            });
                        } else {
                            layer.msg("请勿重复点击", {
                                icon: 2,
                                time: 2000 //2秒关闭(如果不配置,默认是3秒)
                            }, function () {
                                isChongFu = true
                            });
                        }
                    }, function () {
                    });
                    }else if(obj.event === 'editDemo'){//编辑备注
                        $('#NoticeDemo').val(data.Demo);
                        layer.open({
@@ -843,4 +892,5 @@
            });
        </script>
    </body>
</html>
Wms/WMS.BLL/BllCheckServer/StockCheckServer.cs
@@ -909,7 +909,7 @@
            {
                throw Oops.Bah("需配置盘点方式");
            }
            var list = await Db.Queryable<BllStockCheckDetail>().Where(a => a.IsDel == "0" && a.CRNo == crNo && a.Status == 0).ToListAsync();
            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("当前盘点单据无需要下发的托盘");
@@ -921,6 +921,10 @@
                    throw Oops.Bah("已有正在出库或待盘点的数据,请完成盘点后再出库");
                }
                list = new List<BllStockCheckDetail>() { list.FirstOrDefault() };
            }
            else
            {
                list = list.Where(s => s.Status == 0).ToList();
            }
            #region 
            //要出库的托盘集合
@@ -1182,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)
            {
@@ -1223,6 +1227,351 @@
            #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)
        {
Wms/WMS.Entity/LogEntity/LogTask.cs
@@ -128,7 +128,7 @@
        public int? IsFinish {get;set;}
        /// <summary>
        /// Desc:单据类型 0 入库单 1 出库单  2 盘点单  3 移库单
        /// Desc:单据类型 0 入库单 1 出库单  2 盘点单  3 移库单 4视觉盘点
        /// Default:
        /// Nullable:True
        /// </summary>           
Wms/WMS.IBLL/IBllCheckServer/IStockCheckServer.cs
@@ -104,6 +104,14 @@
        /// <param name="str"></param>
        /// <returns></returns>
        Task<List<OutCommandDto>> CheckOutHouse(string crNo, string outMode, string url, string str);
        /// <summary>
        /// 视觉盘点
        /// </summary>
        /// <param name="crNo"></param>
        /// <param name="url"></param>
        /// <param name="str"></param>
        /// <returns></returns>
        Task<List<OutCommandDto>> CheckVision(string crNo, string url, string str);
        /// <summary>
        /// 盘点出库完成
Wms/Wms/Controllers/DownApiController.cs
@@ -194,7 +194,34 @@
            return Ok(new { code = 0, msg = str, data = list });
        }
        /// <summary>
        /// 指令下发(视觉盘点)
        /// </summary>
        /// <param name="crNo"></param>
        /// <param name="outMode"></param>
        /// <returns></returns>
        [Authorize]
        [HttpGet]
        [UnitOfWork]
        public async Task<IActionResult> CheckVision(string crNo)
        {
            //获取当前登录的用户ID
            var claimsIdentity = this.User.Identity as ClaimsIdentity;
            if (claimsIdentity == null)
            {
                return Ok(new { code = 1, msg = "未获取到当前操作人信息" });
            }
            var userId = claimsIdentity.FindFirst(ClaimTypes.Name)?.Value;
            if (string.IsNullOrWhiteSpace(userId))
            {
                return Ok(new { code = 1, msg = "未获取到当前操作人信息" });
            }
            string str = "";
            var list = await _crCheckSvc.CheckVision(crNo, _config.WcsHost + _config.IssueComApiUrl, str);
            return Ok(new { code = 0, msg = str, data = list });
        }
        /// <summary>
        /// 重新下发盘点任务
        /// </summary>