Pda/View/AsnSetting/productEnterQuantity.html | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
Pda/View/AsnSetting/requestRuku.html | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
Wms/Model/InterFaceModel/HttpModel.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
Wms/WMS.BLL/BllAsnServer/PalletBindServer.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
Wms/WMS.BLL/BllPdaServer/PdaAsnServer.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
Wms/WMS.BLL/Logic/AllotLocation.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
Wms/WMS.Entity/SysEntity/SysMaterials.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
Wms/WMS.IBLL/IBllAsnServer/IPalletBindServer.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
Wms/Wms/Controllers/DownApiController.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
Wms/Wms/Controllers/PdaAsnController.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
Pda/View/AsnSetting/productEnterQuantity.html
@@ -265,7 +265,7 @@ </div> <!-- 无码 --> <div id="content2"> <div id="zongDiv" class="layout-bill-info" style="height: 255px;"> <div id="zongDiv2" class="layout-bill-info" style="height: 255px;"> <form class="layui-form" id="form2" action=""> <div id="" class="layui-form-item layout-dropdownlist"> <label class="layui-form-label" lang>入库单:</label> Pda/View/AsnSetting/requestRuku.html
New file @@ -0,0 +1,344 @@ <!DOCTYPE html> <html> <head> <meta name="viewport" content="user-scalable=0,width=device-width,initial-scale=1.0" /> <meta charset="UTF-8" /> <!-- <meta name="viewport" content="width=device-width, initial-scale=0.665, minimum-scale=0.5, maximum-scale=1, user-scalable=no" /> --> <!-- <meta name="viewport" content="width=device-width, initial-scale=0.665" /> --> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Boxline PDA</title> <link rel="stylesheet" href="/layui/css/layui.css" /> <link rel="stylesheet" href="/css/style.css" /> <script src="/js/adaptive.js"></script> <link rel="stylesheet" href="/css/my.css" /> <style type="text/css"> .layout-bill-info { height: auto; /* background-color: #009E94; */ } .btn-ok-blue { border: none; color: #FFFFFF; background-color: #0a93e3; width: 48%; height: 36px; border-radius: 5px; } .btn-ok-red { border: none; color: #FFFFFF; background-color: #9f1707; width: 48%; height: 36px; border-radius: 5px; } .btn-ok-blue:active { opacity: 0.8; } .btn-ok-red:active { opacity: 0.8; } .foot-container { text-align: center; /* background-color: #007DDB; */ } .layout-tbl-input .layui-form-label { width: 21%; } .layout-tbl-input .layui-input-block { width: 79%; margin-left: 21%; } </style> <link rel="stylesheet" href="/css/adapter.css" /> </head> <body> <div id="" class="main-content"> <div id="" class="layout-title"> <table border="" cellspacing="" cellpadding=""> <tr> <td class="img-back"><a href="../index.html"><img src="/assets/back.jpg"></a></td> <td class="title-text" lang>申请入库</td> <td class="title-menu-icon"><img id="menuImg" src="/assets/menu.jpg"></td> </tr> </table> </div> <div id="" class="layout-sub-content"> <div id="menuList" class="menu"> <ul class="" style="text-align: center;"> <li><a href="../index.html" lang>主页</a></li> <li><a href="../login.html" lang>重新登录</a></li> </ul> </div> <div id="" class="layout-bill-info"> <form class="layui-form" action="" style="height: auto;"> <div id="" class="layui-form-item layout-input"> <label class="layui-form-label" lang>托盘条码:</label> <div class="layui-input-block"> <input id="PalletNo" type="text" lay-verify="stock" lang langholder placeholder="请扫描托盘条码" autocomplete="off" class="layui-input"> </div> </div> <!-- <table class="layout-tbl-input" border="" cellspacing="" cellpadding=""> <tr> <td colspan="2"> <div id="" class="layui-form-item layout-boxinfo"> <label class="layui-form-label" lang>状态:</label> <div class="layui-input-block"> <input id="Status" type="text" disabled placeholder="" autocomplete="off" class="layui-input"> </div> </div> </td> </tr> <tr> <td colspan="2"> <div id="" class="layui-form-item layout-boxinfo"> <label class="layui-form-label" lang>物料:</label> <div class="layui-input-block"> <input id="SkuNo" type="text" disabled placeholder="" autocomplete="off" class="layui-input"> </div> </div> </td> </tr> <tr> <td colspan="2"> <div id="" class="layui-form-item layout-boxinfo"> <label class="layui-form-label" lang>批次号:</label> <div class="layui-input-block"> <input id="LotNo" type="text" disabled placeholder="" autocomplete="off" class="layui-input"> </div> </div> </td> </tr> <tr> <td> <div id="" class="layui-form-item layout-boxinfo"> <label class="layui-form-label" lang style="width: 48%;">所属巷道:</label> <div class="layui-input-block" style="width: 52%; margin-left: 48%;"> <input id="RoadwayNo" type="text" disabled placeholder="" autocomplete="off" class="layui-input"> </div> </div> </td> <td> <div id="" class="layui-form-item layout-boxinfo"> <label class="layui-form-label" lang style="width: 48%;">储位地址:</label> <div class="layui-input-block" style="width: 52%; margin-left: 48%;"> <input id="LocatNo" type="text" disabled placeholder="" autocomplete="off" class="layui-input"> </div> </div> </td> </tr> <tr> <td colspan="2"> <div id="" class="layui-form-item layout-boxinfo"> <label class="layui-form-label" lang>小车当前位置:</label> <div class="layui-input-block"> <input id="AgvInfo" type="text" disabled placeholder="" autocomplete="off" class="layui-input"> </div> </div> </td> </tr> </table> --> </form> <div id="" style="text-align: center;"> <!-- <button class="btn-ok-blue" type="button" lay-submit lay-filter="requestRoadway">申请巷道</button> --> <button class="btn-ok-red" type="button" lay-submit lay-filter="requestLocat">申请储位</button> </div> </div> </div> </div> <script src="/js/jquery-3.5.1.min.js"></script> <script src="/layui/layui.js"></script> <script src="/js/public.js"></script> <script src="/js/language.js"></script> <script src="/js/jquery.cookie.js"></script> <script> layui.use(['form', 'jquery'], function () { var form = layui.form initLanguage() setLanguage() //当托盘条码输入框失去焦点时,检查一下托盘状态 $("#PalletNo").blur(function () { checkPalletStat() }) $("#PalletNo").keydown(function (e) { if (e.keyCode === 13) { //检查托盘状态 checkPalletStat(); } }); //检查托盘状态 function checkPalletStat() { if ($("#PalletNo").val() == "") { return } var param1 = { "PalletNo": $("#PalletNo").val() } //获取托盘上架信息 sendData(IP + "/PdaAsn/IsEnablePalletNo", param1, 'post', function (res) { if (res.code == 0) { //成功 } else { //不成功 layer.msg(res.msg, { icon: 2, time: 2000 //2秒关闭(如果不配置,默认是3秒) }, function () { }); return } }); } //申请巷道 form.on('submit(requestRoadway)', function (data) { if (!$("#PalletNo").val()) { layer.msg('请扫描托盘条码', { icon: 2, time: 2000 //2秒关闭(如果不配置,默认是3秒) }); return; } var param = { PalletNo: $("#PalletNo").val(), HouseNo:"W01" } sendData(IP + "/PdaAsn/RequestRoadWay", param, 'post', function (res) { if (res.code == 0) { //成功 layer.msg(res.msg, { icon: 1, time: 2500 //2秒关闭(如果不配置,默认是3秒) }, function () { var statusVal=''; if(res.data.Status=="0"){ statusVal='等待上架'; }else if(res.data.Status=="1"){ statusVal='正在上架'; }else if(res.data.Status=="2"){ statusVal='上架完成'; }else if(res.data.Status=="3"){ statusVal='已取消'; }else{ statusVal='未上架'; } $("#Status").val(statusVal); $("#SkuNo").val(res.data.SkuNo+"-"+res.data.SkuName); $("#LotNo").val(res.data.LotNo); $("#RoadwayNo").val(res.data.RoadwayNo); $("#LocatNo").val(res.data.LocatNo); }); } else { //不成功 layer.msg(res.msg, { icon: 2, time: 2000 //2秒关闭(如果不配置,默认是3秒) }, function () { //回调 clearTable(); }); } }); return false; //阻止表单跳转。如果需要表单跳转,去掉这段即可。 }); //申请储位 form.on('submit(requestLocat)', function (data) { if (!$("#PalletNo").val()) { layer.msg('请扫描托盘条码', { icon: 2, time: 2000 //2秒关闭(如果不配置,默认是3秒) }); return; } var param = { PalletNo: $("#PalletNo").val(), HouseNo:"W01" } sendData(IP + "/DownApi/RequestLocation", param, 'post', function (res) { if (res.code == 0) { //成功 layer.msg(res.msg, { icon: 1, time: 2500 //2秒关闭(如果不配置,默认是3秒) }, function () { var statusVal=''; if(res.data.Status=="0"){ statusVal='等待上架'; }else if(res.data.Status=="1"){ statusVal='正在上架'; }else if(res.data.Status=="2"){ statusVal='上架完成'; }else if(res.data.Status=="3"){ statusVal='已取消'; }else{ statusVal='未上架'; } $("#Status").val(statusVal); $("#SkuNo").val(res.data.SkuNo+"-"+res.data.SkuName); $("#LotNo").val(res.data.LotNo); $("#RoadwayNo").val(res.data.RoadwayNo); $("#LocatNo").val(res.data.LocatNo); }); } else { //不成功 layer.msg(res.msg, { icon: 2, time: 2000 //2秒关闭(如果不配置,默认是3秒) }, function () { //回调 clearTable(); }); } }); return false; //阻止表单跳转。如果需要表单跳转,去掉这段即可。 }); function clearTable() { $("#Status").val(''); $("#SkuNo").val(''); $("#LotNo").val(''); $("#RoadwayNo").val(''); $("#LocatNo").val(''); } form.verify({ stock: [/^[\S]{8}$/, '托盘条码必须为六位字符'] }); $("#menuImg").click(function (e) { e.stopPropagation() if ($("#menuList").is(":hidden")) { $("#menuList").show() } else { $("#menuList").hide() } }) $('body').click(function () { // //console.log("body") $("#menuList").hide() }) }) </script> </body> </html> Wms/Model/InterFaceModel/HttpModel.cs
@@ -4,6 +4,24 @@ namespace Model.InterFaceModel { /// <summary> /// 外部接口/前端返回参数 /// </summary> public class HttpReturnModel { /// <summary> /// 状态码 0 成功 -1失败 /// </summary> public string Success { get; set; } /// <summary> /// 消息提示 /// </summary> public string Message { get; set; } public object Data { get; set; } } #region ERP接口实体类 /// <summary> /// 发送接收erp接口参数的model Wms/WMS.BLL/BllAsnServer/PalletBindServer.cs
@@ -597,7 +597,15 @@ #endregion #region 组托收货 #region 组托收货 JC34 /// <summary> /// 组托收货列表 /// </summary> /// <param name="model"></param> /// <param name="count"></param> /// <returns></returns> /// <exception cref="Exception"></exception> public List<PalletBindDto> GetPalletBindList(PalletBindVm model, out int count) { try @@ -688,7 +696,12 @@ } } /// <summary> /// 明细列表 /// </summary> /// <param name="model"></param> /// <param name="count"></param> /// <returns></returns> public List<BoxInfoDto> GetBoxInfoList(BoxInfoVm model, out int count) { try @@ -807,7 +820,12 @@ return data; } //删除托盘绑定信息 /// <summary> /// 删除托盘绑定信息 /// </summary> /// <param name="id"></param> /// <param name="userId"></param> /// <exception cref="Exception"></exception> public void DelPalletBind(int id, int userId) { try @@ -1113,7 +1131,13 @@ throw new Exception(e.Message); } } //删除绑定的箱码信息 /// <summary> /// 删除绑定的箱码信息 /// </summary> /// <param name="boxNo"></param> /// <param name="userId"></param> /// <exception cref="Exception"></exception> public void DelBindBoxInfo(string boxNo, int userId) { try @@ -1260,7 +1284,13 @@ } } //托盘绑定撤销申请 /// <summary> /// 托盘绑定撤销申请 /// </summary> /// <param name="id"></param> /// <param name="reason"></param> /// <param name="userId"></param> /// <exception cref="Exception"></exception> public void CancelPalletBind(int id, string reason, int userId) { try @@ -1349,6 +1379,473 @@ catch (Exception e) { throw new Exception(e.Message); } } /// <summary> /// 申请储位 (立体库) /// </summary> /// <param name="palletNo"></param> /// <param name="houseNo"></param> /// <param name="roadwayNo"></param> /// <returns></returns> /// <exception cref="Exception"></exception> public OutCommandDto RequestLocation(string palletNo, string houseNo) { try { //验证托盘条码是否为空 if (string.IsNullOrEmpty(palletNo)) { throw new Exception("请输入要申请的托盘条码"); } //验证所属仓库是否为空 if (string.IsNullOrEmpty(houseNo)) { throw new Exception("请选择所属仓库"); } //验证是否为平库入库 var houseType = Db.Queryable<SysWareHouse>().First(a => a.WareHouseNo == houseNo);//获取仓库类型 //验证是否为立体库入库 if (houseType.Type != "1") { throw new Exception("仓库类型错误,请选择立体库仓库"); } OutCommandDto comDto;//返回wcs的入库命令 var isHaveLocateNo = false; //托盘绑定信息中是否已有指定储位 var stock = Db.Queryable<SysPallets>().First(a => a.PalletNo == palletNo);//托盘信息 //判断托盘条码是否有效 if (stock == null) throw new Exception("托盘条码不受WMS管理,不可入库!"); #region //查询托盘绑定信息(状态为等待入库的) var palletBindList = Db.Queryable<BllPalletBind>().Where(m => m.IsDel == "0" && m.PalletNo == palletNo && (m.Status == "0" || m.Status == "1")).ToList(); var haveLocate = palletBindList.FirstOrDefault(m => !string.IsNullOrWhiteSpace(m.LocatNo)); var skuList = Db.Queryable<SysMaterials>().Where(m => m.IsDel == "0").ToList(); //物料类别信息 var skuCategoryList = Db.Queryable<SysMaterialCategory>().Where(m => m.IsDel == "0").ToList(); var skuNo = ""; //入库物料 var isAddTask = true; //是否添加新任务 var oldTaskNo = ""; //旧任务号 var stockDetail = Db.Queryable<DataStockDetail>().Where(m => m.PalletNo == palletNo).ToList(); //验证物料是否有成品 foreach (var item in stockDetail) { var skuItem = skuList.First(m => m.SkuNo == item.SkuNo); if (skuItem.Type == "2") { throw new Exception("成品物料请入成品库"); } } if (palletBindList.Count >= 1) //正常入库 { var palletBind = palletBindList.FirstOrDefault(m => m.Status == "1"); if (palletBind != null) { var beingTask = Db.Queryable<LogTask>().First(m => m.IsDel == "0" && m.TaskNo == palletBind.TaskNo); if (beingTask == null) { throw new Exception("该托盘正在入库,但未查询到任务信息"); } if (!string.IsNullOrWhiteSpace(beingTask.EndLocat)) { comDto = new OutCommandDto() { PalletNo = palletNo,//托盘号 StartRoadway = beingTask.StartRoadway, // 起始巷道 StartLocate = "", // 起始位置 EndLocate = beingTask.EndLocat, // 目标位置 EndRoadway = beingTask.EndRoadway, // 目标巷道 TaskNo = beingTask.TaskNo, // 任务号 TaskType = "0",// 任务类型 (出库) OutMode = "", //目标地址 Order = 1 }; if (beingTask.IsSuccess == 0) { beingTask.IsSuccess = 1; Db.Updateable(beingTask).ExecuteCommand(); } return comDto; } else { //if (string.IsNullOrWhiteSpace(roadwayNo)) //{ // roadwayNo = beingTask.EndRoadway; //} isAddTask = false; oldTaskNo = beingTask.TaskNo; } } if (haveLocate != null) { isHaveLocateNo = true; //已有指定储位 } if (palletBindList.First().Type == "0") //物料托入库 { //判断是否绑定单据及单据状态是否正常 foreach (var item in palletBindList) { var notice = Db.Queryable<BllArrivalNotice>().First(m => m.IsDel == "0" && m.ASNNo == item.ASNNo); if (notice == null) { throw new Exception("托盘存在物料未绑定入库单,不可入库!"); } if (notice.Status == "3") { throw new Exception($"入库单{item.ASNNo}已关闭,不可入库!"); } } //获取物料存放区域 var noticeDetail = Db.Queryable<BllArrivalNoticeDetail>().First(m => m.IsDel == "0" && m.Id == palletBindList.First().ASNDetailNo); if (noticeDetail == null) { throw new Exception("托盘存在物料未绑定入库单明细,不可入库"); } skuNo = noticeDetail.SkuNo; } else if (palletBindList.First().Type == "1")//空托盘 { skuNo = "100099"; } } else //回流入库 { if (stockDetail.Count == 0) { throw new Exception($"{palletNo}托盘条码不具有箱码信息,不可入库!"); } if (stockDetail.Count(m => !string.IsNullOrWhiteSpace(m.LocatNo)) > 0) { throw new Exception("当前托盘已在库内,请核实"); } skuNo = stockDetail.First().SkuNo; var beingTask = Db.Queryable<LogTask>().First(m => m.IsDel == "0" && (m.Status == "0" || m.Status == "1") && m.PalletNo == palletNo && m.Type == "0"); if (beingTask != null) { if (!string.IsNullOrWhiteSpace(beingTask.EndLocat)) { comDto = new OutCommandDto() { PalletNo = palletNo,//托盘号 StartRoadway = beingTask.StartRoadway, // 起始巷道 StartLocate = "", // 起始位置 EndLocate = beingTask.EndLocat, // 目标位置 EndRoadway = beingTask.EndRoadway, // 目标巷道 TaskNo = beingTask.TaskNo, // 任务号 TaskType = "0",// 任务类型 (出库) OutMode = "", //目标地址 Order = 1 }; if (beingTask.IsSuccess == 0) { beingTask.IsSuccess = 1; beingTask.Status = "1"; Db.Updateable(beingTask).ExecuteCommand(); } return comDto; } else { //if (string.IsNullOrWhiteSpace(roadwayNo)) //{ // roadwayNo = beingTask.EndRoadway; //} isAddTask = false; oldTaskNo = beingTask.TaskNo; } } //获取对应回库规则 var function = Db.Queryable<SysFunSetting>().First(a => a.IsDel == "0" && a.FunSetName == "托盘回库验证" && a.IsEnable == "NO"); #region 托盘回库规则 if (function != null) { //拣货完成后允许托盘回库 if (function.SetValue == "CompletePick") { var allot = Db.Queryable<BllExportAllot>().First(a => a.IsDel == "0" && a.LotNo == stockDetail[0].LotNo && a.PalletNo == palletNo && a.SkuNo == stockDetail[0].SkuNo); //验证拣货明细是否存在 if (allot != null) { //验证当前托盘拣货信息是否已完成 if (allot.Status != "5") { throw new Exception("当前托盘拣货信息未完成,请完成后回库!"); } } } } #endregion } var allotLocate = new AllotLocation(); #region 申请储位 SysStorageLocat locate; if (isHaveLocateNo) //指定储位 { locate = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == haveLocate.LocatNo); } else { var sku = skuList.FirstOrDefault(m => m.SkuNo == skuNo); if (sku == null) { throw new Exception("物料信息中未查询到入库单明细包含的物料信息,不可入库"); } //判断物料是否含有类别信息 if (string.IsNullOrWhiteSpace(sku.CategoryNo)) { throw new Exception($"物料:{sku.SkuNo}未查询到类别信息"); } var skuCategory = skuCategoryList.FirstOrDefault(m => m.CategoryNo == sku.CategoryNo); if (skuCategory == null) { throw new Exception($"未在类别信息中查询到物料:{sku.SkuNo}包含的类别"); } var areaStr = skuCategory.AreaNo.Split(","); var areaList = new List<string>(); foreach (var item in areaStr) { areaList.Add(item); } locate = allotLocate.GetSuiTableLocate(houseNo, areaList, ""); } #endregion Db.BeginTran(); try { if (isAddTask) // 正常入库 { //添加巷道使用记录 var log = new SysRoadwayUseLog { RoadwayNo = locate.RoadwayNo, WareHouseNo = houseNo, Row = 0, Column = 0, Layer = 0, }; Db.Insertable(log).ExecuteCommand(); var taskNo = new Common().GetMaxNo("TK"); var exTask = new LogTask //入库任务 { TaskNo = taskNo, Sender = "WMS", Receiver = "WCS", IsSuccess = 1, //是否下发成功 0失败 1成功 SendDate = DateTime.Now, //发送时间 BackDate = DateTime.Now, //返回时间 StartRoadway = "", // 起始巷道 StartLocat = "",//起始位置 EndLocat = locate.LocatNo,//目标位置 EndRoadway = locate.RoadwayNo, // 目标巷道 PalletNo = palletNo,//托盘码 IsSend = 1,//是否可再次下发 IsCancel = 1,//是否可取消 IsFinish = 1,//是否可完成 Type = "0",//任务类型 0 入库任务 1 出库任务 2 移库任务 Status = "1",//任务状态0:等待执行1正在执行2执行完成 OrderType = "0",//0 入库单 1 出库单 2 盘点单 3 移库单 Msg = "入库口到=>>" + locate.LocatNo + "的入库任务", //关键信息 }; Db.Insertable(exTask).ExecuteCommand(); var asnNo = ""; // 添加托盘绑定表托盘入库任务号 liudl foreach (DataStockDetail stockModel in stockDetail) { var bindModel = Db.Queryable<BllPalletBind>().First(m => m.IsDel == "0" && m.Status == "2" && m.PalletNo == stockModel.PalletNo && m.ASNNo == stockModel.ASNNo && m.ASNDetailNo == stockModel.ASNDetailNo); if (bindModel != null && string.IsNullOrWhiteSpace(bindModel.TaskNo)) { bindModel.TaskNo = taskNo; bindModel.WareHouseNo = locate.WareHouseNo; bindModel.RoadwayNo = locate.RoadwayNo; bindModel.LocatNo = locate.LocatNo; Db.Updateable(bindModel).ExecuteCommand(); asnNo = stockModel.ASNNo; } } foreach (DataStockDetail stockModel in stockDetail) { //添加托盘上架记录 var upShelf = new BllPalletUpShelf() { TaskNo = exTask.TaskNo, TraceNo = asnNo, PalletNo = palletNo, SkuNo = stockModel.SkuNo, SkuName = stockModel.SkuName, LotNo = stockModel.LotNo, Status = "1", WareHouseNo = houseNo, RoadwayNo = locate.RoadwayNo, AreaNo = locate.AreaNo, LocatNo = locate.LocatNo, CreateUser = 0, }; Db.Insertable(upShelf).ExecuteCommand(); } oldTaskNo = taskNo; } else { var oldTask = Db.Queryable<LogTask>().First(m => m.IsDel == "0" && m.TaskNo == oldTaskNo); oldTask.EndLocat = locate.LocatNo; oldTask.EndRoadway = locate.RoadwayNo; if (oldTask.IsSuccess == 0) { oldTask.IsSuccess = 1; oldTask.Status = "1"; } Db.Updateable(oldTask).ExecuteCommand(); var bindModelList = Db.Queryable<BllPalletBind>().Where(m => m.IsDel == "0" && m.Status == "2" && m.PalletNo == oldTask.PalletNo && m.TaskNo == oldTaskNo).ToList(); foreach (var bindModel in bindModelList) { if (string.IsNullOrWhiteSpace(bindModel.LocatNo)) { bindModel.TaskNo = oldTask.TaskNo; bindModel.WareHouseNo = locate.WareHouseNo; bindModel.RoadwayNo = locate.RoadwayNo; bindModel.LocatNo = locate.LocatNo; Db.Updateable(bindModel).ExecuteCommand(); } } //更改上架信息 var upShelfList = Db.Queryable<BllPalletUpShelf>().Where(m => m.IsDel == "0" && m.TaskNo == oldTask.TaskNo && m.PalletNo == palletNo).ToList(); foreach (var upShelf in upShelfList) { upShelf.WareHouseNo = locate.WareHouseNo; upShelf.RoadwayNo = locate.RoadwayNo; upShelf.LocatNo = locate.LocatNo; upShelf.Status = "1"; Db.Updateable(upShelf).ExecuteCommand(); } } locate.Status = "2"; Db.Updateable(locate).ExecuteCommand(); if (palletBindList.Count >= 1) { foreach (var item in palletBindList) { item.Status = "1"; item.WareHouseNo = locate.WareHouseNo; item.RoadwayNo = locate.RoadwayNo; item.LocatNo = locate.LocatNo; item.TaskNo = oldTaskNo; } Db.Updateable(palletBindList).ExecuteCommand(); } Db.CommitTran(); comDto = new OutCommandDto() { PalletNo = palletNo,//托盘号 StartRoadway = "", StartLocate = "", // 起始位置 EndLocate = locate.LocatNo, // 目标位置 EndRoadway = locate.RoadwayNo, // 目标巷道 TaskNo = oldTaskNo, // 任务号 TaskType = "0",// 任务类型 (出库) OutMode = "", //目标地址 Order = 1 }; } catch (Exception ex) { Db.RollbackTran(); throw new Exception(ex.Message); } #endregion return comDto; } catch (Exception e) { throw new Exception(e.Message); } } /// <summary> /// 下发入库申请储位任务(下发==》AGV小车) /// </summary> /// <param name="model"></param> /// <returns></returns> public void IssueAsnTask(OutCommandDto model,string url) { try { // 将任务发送至AGV 正式运行程序放开 var jsonData = JsonConvert.SerializeObject(model); string response = ""; try { var time1 = DateTime.Now;//发送时间 .ToString("yyyy-MM-dd HH:mm:ss") //response = HttpHelper.DoPost(url, jsonData, "下发给AGV叫料出库命令", "AGV"); 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); //} //if (wcsModel.StatusCode == -1) //{ // new TaskServer().EditTaskIssueNo(list2, time1, time2, wcsModel.Msg); // throw new Exception(wcsModel.Msg); //} } catch (Exception ex) { throw new Exception(ex.Message); } } catch (Exception) { throw; } } @@ -1902,7 +2399,7 @@ } /// <summary> /// 申请巷道 /// 申请巷道 (立体库) /// </summary> /// <param name="palletNo"></param> /// <param name="houseNo"></param> @@ -1925,10 +2422,10 @@ } //验证是否为平库入库 var houseType = Db.Queryable<SysWareHouse>().First(a => a.WareHouseNo == houseNo);//获取仓库类型 //验证是否为平库入库 if (houseType.Type == "2") //验证是否为立体库入库 if (houseType.Type != "1") { throw new Exception("平库请使用PDA手持进行平库入库"); throw new Exception("仓库类型错误,请选择立体库仓库"); } var stock = Db.Queryable<SysPallets>().First(a => a.PalletNo == palletNo);//托盘信息 @@ -1940,8 +2437,7 @@ #endregion OutCommandDto comDto;//返回wcs的入库命令 var isHaveLocateNo = false; // 是否已有指定储位 OutCommandDto comDto;//返回wcs的入库命令 #region //查询托盘绑定信息(状态为等待入库的) @@ -1956,7 +2452,7 @@ var skuNo = ""; //入库物料 var isAddTask = true; //是否添加新任务 var oldTaskNo = ""; //旧任务号 var isHaveLocateNo = false; var stockDetail = Db.Queryable<DataStockDetail>().Where(m => m.PalletNo == palletNo).ToList(); if (palletBindList.Count >= 1) //正常入库 { Wms/WMS.BLL/BllPdaServer/PdaAsnServer.cs
@@ -1187,10 +1187,10 @@ { throw new Exception("该托盘已有储位信息,请核实!"); } if (stockDetail != null && (stockDetail.SkuNo != detail.SkuNo || stockDetail.LotNo != model.LotNo)) { throw new Exception("该托盘在库存已有其它物料批次信息,请核实!"); } //if (stockDetail != null && (stockDetail.SkuNo != detail.SkuNo || stockDetail.LotNo != model.LotNo)) //{ // throw new Exception("该托盘在库存已有其它物料批次信息,请核实!"); //} #endregion @@ -1589,13 +1589,11 @@ { try { var item = Expressionable.Create<BllArrivalNoticeDetail>() .AndIF(true, it => it.IsDel == "0") .ToExpression();//注意 这一句 不能少 var modelList = Db.Queryable<BllArrivalNoticeDetail>().Where(item) .LeftJoin<BllArrivalNotice>((tb1, tb2) => tb1.ASNNo == tb2.ASNNo && tb2.IsDel == "0" && (tb1.Status == "0" || tb1.Status == "1")) .LeftJoin<SysMaterials>((tb1, tb2, tb3) => tb1.SkuNo == tb3.SkuNo && tb3.IsDel == "0" && tb3.IsPasteCode == "1") var modelList = Db.Queryable<BllArrivalNoticeDetail>() .LeftJoin<BllArrivalNotice>((tb1, tb2) => tb1.ASNNo == tb2.ASNNo ) .LeftJoin<SysMaterials>((tb1, tb2, tb3) => tb1.SkuNo == tb3.SkuNo ) .Where((tb1, tb2, tb3) => tb1.IsDel == "0" && tb2.IsDel == "0" && (tb2.Status == "0" || tb2.Status == "1") && tb3.IsDel == "0" && tb3.IsPasteCode == "1") .Select((tb1, tb2, tb3) => tb1.ASNNo).Distinct().ToList(); return modelList; @@ -1613,13 +1611,11 @@ { try { var item = Expressionable.Create<BllArrivalNoticeDetail>() .AndIF(true, it => it.IsDel == "0") .ToExpression();//注意 这一句 不能少 var modelList = Db.Queryable<BllArrivalNoticeDetail>().Where(item) .LeftJoin<BllArrivalNotice>((tb1, tb2) => tb1.ASNNo == tb2.ASNNo && tb2.IsDel == "0" && (tb2.Status == "0" || tb2.Status == "1")) .LeftJoin<SysMaterials>((tb1, tb2, tb3) => tb1.SkuNo == tb3.SkuNo && tb3.IsDel == "0" && tb3.IsPasteCode == "0") var modelList = Db.Queryable<BllArrivalNoticeDetail>() .LeftJoin<BllArrivalNotice>((tb1, tb2) => tb1.ASNNo == tb2.ASNNo ) .LeftJoin<SysMaterials>((tb1, tb2, tb3) => tb1.SkuNo == tb3.SkuNo ) .Where((tb1, tb2, tb3) => tb1.IsDel == "0" && tb2.IsDel == "0" && (tb2.Status == "0" || tb2.Status == "1") && tb3.IsDel == "0" && tb3.IsPasteCode == "0") .Select((tb1, tb2, tb3) => tb1.ASNNo).Distinct().ToList(); return modelList; @@ -1859,6 +1855,49 @@ } } /// <summary> /// 验证托盘是否存在 /// </summary> /// <param name="palletNo">托盘号</param> /// <returns>"":可使用 -1:不可使用(原因)</returns> public string IsEnablePalletNo(string palletNo) { string sqlMsg = ""; string sqlString = string.Empty; try { sqlString = $"select * from SysPallets where PalletNo = '{palletNo}' and isdel = '0';"; var models = Db.Ado.SqlQuery<PalletBindVm>(sqlString); if (models.Count > 1) { sqlMsg = "-1:存在重复托盘号,请检查!"; return sqlMsg; } if (models.Count > 0) { if (models[0].Status == "1") { sqlString = $"select count(id) from DataStockDetail where PalletNo = '{palletNo}' and isnull(LocatNo,'') != '' and isdel = '0';"; int rowNum = Db.Ado.GetInt(sqlString); if (rowNum > 0) { sqlMsg = "-1:托盘使用中,此托盘应在库内请核实!"; } } } else { sqlMsg = "-1:托盘号不存在!"; } return sqlMsg; } catch (Exception ex) { throw ex; } } #endregion @@ -1906,49 +1945,7 @@ /// <summary> /// 验证托盘是否存在 /// </summary> /// <param name="palletNo">托盘号</param> /// <returns>"":可使用 -1:不可使用(原因)</returns> public string IsEnablePalletNo(string palletNo) { string sqlMsg = ""; string sqlString = string.Empty; try { sqlString = $"select * from SysPallets where PalletNo = '{palletNo}' and isdel = '0';"; var models = Db.Ado.SqlQuery<PalletBindVm>(sqlString); if (models.Count > 1) { sqlMsg = "-1:存在重复托盘号,请检查!"; return sqlMsg; } if (models.Count > 0) { if (models[0].Status == "1") { sqlString = $"select count(id) from DataStockDetail where PalletNo = '{palletNo}' and isnull(LocatNo,'') != '' and isdel = '0';"; int rowNum = Db.Ado.GetInt(sqlString); if (rowNum > 0) { sqlMsg = "-1:托盘使用中,此托盘应在库内请核实!"; } } } else { sqlMsg = "-1:托盘号不存在!"; } return sqlMsg; } catch (Exception ex) { throw ex; } } // 根据箱码或托盘号获取箱支信息 liudl public List<BoxInfoDto> GetBoxInfos(BoxInfoVm model) Wms/WMS.BLL/Logic/AllotLocation.cs
@@ -239,7 +239,7 @@ //查询该巷道并且标志为正常的的储位 roadwayList.Add(roadway); var locate = GetLocateByRoadways(roadwayList,areaList,true); var locate = GetLocateByRoadways(roadwayList,areaList,true,houseNo); if (locate == null) { throw new Exception($"{roadwayNo}巷道没有合适的空储位"); @@ -251,38 +251,10 @@ { var roadwayList = db.Queryable<SysStorageRoadway>().Where(m => m.WareHouseNo == houseNo && m.Status == "0" && roadList.Contains(m.RoadwayNo)).OrderBy(m => new { m.Priority, m.RoadwayNo }).ToList(); var locate = GetLocateByRoadways(roadwayList,areaList); var locate = GetLocateByRoadways(roadwayList,areaList,false, houseNo); if (locate == null) { throw new Exception($"{houseNo}仓库已启用的巷道中没有合适的空储位"); } return locate; } //指定巷道 case "密集库" when !string.IsNullOrWhiteSpace(roadwayNo): { var roadwayList = new List<SysStorageRoadway>(); var roadway = db.Queryable<SysStorageRoadway>().First(m => m.RoadwayNo == roadwayNo); if (roadway == null) { throw new Exception($"未查询到{roadwayNo}巷道信息"); } if (!roadList.Contains(roadwayNo)) { throw new Exception("当前物料存放区域未在指定巷道中"); } if (roadway.Status == "1") { throw new Exception($"{roadwayNo}巷道已停用"); } //查询该巷道并且标志为正常的的储位 roadwayList.Add(roadway); var locate = GetLocateByRoadways(roadwayList, areaList, true); if (locate == null) { throw new Exception($"{roadwayNo}巷道没有合适的空储位"); } return locate; } @@ -313,7 +285,7 @@ /// <param name="areaList">区域集合</param> /// <param name="isRoadway">是否指定巷道</param> /// <returns></returns> private SysStorageLocat GetLocateByRoadways(List<SysStorageRoadway> roadways,List<string> areaList,bool isRoadway = false) private SysStorageLocat GetLocateByRoadways(List<SysStorageRoadway> roadways,List<string> areaList,bool isRoadway = false ,string houseNo = "W01") { try { @@ -378,14 +350,14 @@ SysStorageLocat locate = null; // 储位信息 //SysStorageLocat log = db.Ado.SqlQuerySingle<SysStorageLocat>("select * from SysStorageLocat where LocatNo = (select Top(1) LocatNo from BllPalletBind order by CreateTime desc)"); //巷道最后一次使用记录 SysRoadwayUseLog log= db.Ado.SqlQuerySingle<SysRoadwayUseLog>("select Top(1) * from SysRoadwayUseLog where IsDel=0 order by CreateTime desc"); //巷道最后一次使用记录 SysRoadwayUseLog log= db.Ado.SqlQuerySingle<SysRoadwayUseLog>($"select Top(1) * from SysRoadwayUseLog where IsDel=0 and WareHouseNo ='{houseNo}' order by CreateTime desc"); //巷道最后一次使用记录 if (laneAllot == 0)//跳巷道平均分配 { //如果同级巷道有多条则查上次位置日志 if (roadways.Count > 1) { log = db.Queryable<SysRoadwayUseLog>().OrderByDescending(l => l.Id).First(); log = db.Queryable<SysRoadwayUseLog>().Where(m=>m.WareHouseNo == houseNo).OrderByDescending(l => l.Id).First(); } //取各巷道所有排第一个合适位 foreach (var l in roadways) Wms/WMS.Entity/SysEntity/SysMaterials.cs
@@ -31,7 +31,7 @@ public string AuditStatusNo { get; set; } /// <summary> /// 类型 /// 类型 0原料 1包材 2成品 3耗材 4中间品 /// </summary> public string Type { get; set; } Wms/WMS.IBLL/IBllAsnServer/IPalletBindServer.cs
@@ -81,6 +81,20 @@ #endregion /// <summary> /// 申请储位 /// </summary> /// <param name="palletNo"></param> /// <param name="houseNo"></param> /// <returns></returns> OutCommandDto RequestLocation(string palletNo, string houseNo); /// <summary> /// 下发入库申请储位任务(下发==》AGV小车) /// </summary> /// <param name="model"></param> /// <param name="url"></param> void IssueAsnTask(OutCommandDto model, string url); /// <summary> /// 申请巷道 /// </summary> /// <param name="palletNo">托盘号</param> Wms/Wms/Controllers/DownApiController.cs
@@ -290,6 +290,45 @@ } } /// <summary> /// PDA 人工申请储位 (立体库) /// </summary> /// <param name="model">入库单信息</param> /// <returns></returns> [AllowAnonymous] [HttpPost] public IActionResult RequestLocation(RequestLocate model) { //获取当前登录的用户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 = "未获取到当前操作人信息" }); } try { var list = _asnPalletBindSvc.RequestLocation(model.PalletNo, model.HouseNo); _asnPalletBindSvc.IssueAsnTask(list, _config.ErpHost+ _config.AsnFinishUrl);//agv路径 new OperationASNServer().AddLogOperationAsn("入库作业", "入库日志", model.PalletNo, "申请储位", $"申请储位托盘号:{model.PalletNo}的成功信息", int.Parse(userId)); return Ok(new HttpReturnModel { Success = "0", Message = "申请储位成功", Data = list }); } catch (Exception e) { new OperationASNServer().AddLogOperationAsn("入库作业", "入库日志", model.PalletNo, "申请储位", $"申请储位托盘号:{model.PalletNo}的失败信息", int.Parse(userId)); return Ok(new ErpModel { Success = -1, Message = e.Message }); } } /// <summary> /// 申请巷道 @@ -335,7 +374,7 @@ /// <returns></returns> [AllowAnonymous] [HttpPost] public IActionResult RequestLocation(RequestLocate model) public IActionResult RequestMiJiLocation(RequestLocate model) { //获取当前登录的用户ID Wms/Wms/Controllers/PdaAsnController.cs
@@ -1,13 +1,19 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Model.InterFaceModel; using Model.ModelDto.BllAsnDto; using Model.ModelDto.DataDto; using Model.ModelVm; using Model.ModelVm.BllAsnVm; using Model.ModelVm.PdaVm; using Newtonsoft.Json; using System; using System.Security.Claims; using Utility; using Utility.Tools; using WMS.BLL.LogServer; using WMS.Entity.BllAsnEntity; using WMS.Entity.DataEntity; using WMS.IBLL.IPdaServer; namespace Wms.Controllers @@ -33,8 +39,6 @@ /// 绑定托盘 /// </summary> /// <param name="model"></param> /// <returns></returns> /// <returns></returns> /// <returns></returns> [HttpPost] [UnitOfWork] @@ -94,33 +98,6 @@ var models = _PdaAsnSvc.GetNoPasteAsnNoStrList(); return Ok(new { code = 0, msg = "入库单信息", data = models }); } catch (Exception e) { return Ok(new { code = 1, msg = e.Message }); } } /// <summary> /// 判断托盘是否可用 /// </summary> /// <param name="model">PalletNo:托盘条码</param> /// <returns></returns> [HttpPost] public IActionResult IsEnablePalletNo(PalletBindVm model) { try { var strMsg = _PdaAsnSvc.IsEnablePalletNo(model.PalletNo); if (strMsg == "") { return Ok(new { code = 0, msg = "托盘可用!" }); } else { return Ok(new { code = 1, msg = strMsg }); } } catch (Exception e) { @@ -208,10 +185,36 @@ } } /// <summary> /// 判断托盘是否可用 公用方法 /// </summary> /// <param name="model">PalletNo:托盘条码</param> /// <returns></returns> [HttpPost] public IActionResult IsEnablePalletNo(PalletBindVm model) { try { var strMsg = _PdaAsnSvc.IsEnablePalletNo(model.PalletNo); //---------------------------------------------组托收货页面---------------------------------------------------------------------- if (strMsg == "") { return Ok(new { code = 0, msg = "托盘可用!" }); } else { return Ok(new { code = 1, msg = strMsg }); } } catch (Exception e) { return Ok(new { code = 1, msg = e.Message }); } } //---------------------------------------------申请入库页面---------------------------------------------------------------------- #endregion