HTML/views/ASNSetting/LabelPrint.html
@@ -70,9 +70,9 @@ </tr> <tr> <td>物料代码</td> <td id="SkuNo"></td> <td>数 量</td> <td id="qty"></td> <td colspan="3" id="SkuNo"></td> <!-- <td>数 量</td> <td id="qty"></td> --> </tr> <tr> <td>有效期至</td> HTML/views/HouseWithinSetting/CRLogTask.html
@@ -50,6 +50,7 @@ <option value="2">执行完成</option> <option value="3">异常结束</option> <option value="4">已取消</option> <option value="5">等待确认</option> </select> </div> </div> @@ -203,6 +204,8 @@ html = `<button class="layui-btn layui-btn-radius layui-btn-warm layui-btn-xs">异常结束</button>`; } else if(d.Status=='4') { html = `<button class="layui-btn layui-btn-radius layui-btn-warm layui-btn-xs">已取消</button>`; } else if(d.Status=='5') { html = `<button class="layui-btn layui-btn-radius layui-btn-warm layui-btn-xs">等待确认</button>`; } else { } HTML/views/SOSetting/ExportNotice.html
@@ -1272,8 +1272,12 @@ area: ['1200px', '90%'], }); } else if (obj.event === 'outKu') { $("#PickingArea").val(''); outFunction(data.SONo); //if(data.WareHouseName =="成品库"){ outFunction(data.SONo); // }else{ // outFunction2(data.SONo) // } } else if (obj.event === 'beiLiaoOutKu') { if (orderType != "1") { @@ -1395,20 +1399,11 @@ area: ['350px', '285px'], btn: ['确定', '取消'], yes: function (index, layero) { var pa = $('#PickingArea').val(); console.log(pa) if (isChongFu == true) { isChongFu = false; if (pa == null) { layer.msg("请勿重复点击", { icon: 2, time: 2000 //2秒关闭(如果不配置,默认是3秒) }); return; } console.log($("#PickingArea").val()) if ($("#PickingArea").val() == '') { if ($("#PickingArea").val() == '' || $('#PickingArea').val() == null) { layer.msg("请选择出库口", { icon: 2, time: 2000 //2秒关闭(如果不配置,默认是3秒) @@ -1419,7 +1414,7 @@ var param = { soNo: soNo, //unstackingMode: $('#UnstackWay').val(), outMode: pa, outMode: $("#PickingArea").val(), //loadingAddre: $('#LoadingArea').val() }; console.log(param); @@ -1454,6 +1449,47 @@ } }); } //不选择出库口的弹窗方法 function outFunction2(soNo) { layer.confirm('确定当前单据出库吗?', function (index) { if (isChongFu == true) { isChongFu = false; var param = { soNo: soNo, }; console.log(param); sendData(IP + "/DownApi/IssueOutHouse", 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 beiLiaoOutFunction(soNo) { HTML/views/StatisticalReport/BoxInfor.html
@@ -225,7 +225,21 @@ </div> </div> <script type="text/html" id="buttonTpl"> {{# if(d.Status=='0'){ }} <button class="layui-btn layui-btn-radius layui-btn-danger layui-btn-xs">待分配</button> {{# } else if(d.Status == '1') { }} <button class="layui-btn layui-btn-radius layui-btn-xs">部分分配</button> {{# } else if(d.Status == '2') { }} <button class="layui-btn layui-btn-radius layui-btn-xs">已分配</button> {{# } else if(d.Status == '3') { }} <button class="layui-btn layui-btn-radius layui-btn-xs">盘点锁定</button> {{# } else if(d.Status == '4') { }} <button class="layui-btn layui-btn-radius layui-btn-xs">移库锁定</button> {{# } else if(d.Status == '5') { }} <button class="layui-btn layui-btn-radius layui-btn-xs layui-btn-danger">异常锁定</button> {{# } }} </script> <script type="text/html" id="BoxStatus"> {{# if(d.Status=='0'){ }} <p>未组托</p> @@ -363,6 +377,7 @@ { field: 'LockQty', title: '锁定数量', align: 'center',width: 90, }, { field: 'FrozenQty', title: '冻结数量', align: 'center',width: 90, }, { field: 'Status', title: '库存状态', align: 'center', templet: '#buttonTpl', width: 90, }, { field: 'InspectStatus', templet: '#InspectStatus1', title: '质检状态', align: 'center' ,width: 100,}, { field: 'InspectMark', title: '抽检标记', align: 'center', templet: '#InspectMarkStatus' ,width: 100,}, { field: 'BitPalletMark', title: '零托标记', align: 'center', templet: '#BitPalletMarkStatus',width: 100,}, Pda/View/HouseDataSetting/ConfirmReceipt.html
New file @@ -0,0 +1,177 @@ <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <meta name="viewport" content="user-scalable=0,width=device-width,initial-scale=1.0" /> <!-- <meta name="viewport" content="width=device-width, initial-scale=0.665, minimum-scale=0.5, maximum-scale=2.0, user-scalable=no" /> --> <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" /> <link rel="stylesheet" href="/css/adapter.css" /> <style type="text/css"> .layout-bill-info { height: 255px; } .layout-tbl-submit { margin-top: 10px; } </style> </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">车间收货</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">主页</a></li> <!-- <li><a href="productEnterConfirm.html">入库信息确认</a></li> --> <li><a href="../login.html">重新登录</a></li> </ul> </div> <div id="" class="layout-bill-info"> <form class="layui-form" action=""> <div id="layout-pallet" 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="required" lang langholder placeholder="请扫描托盘条码" autocomplete="off" class="layui-input"> </div> </div> <div id="layout-soNo" class="layui-form-item layout-input"> <label class="layui-form-label">出库单:</label> <div class="layui-input-block"> <input id="SoNo" type="text" disabled lang langholder placeholder="" autocomplete="off" class="layui-input"> </div> </div> <table class="layout-tbl-submit" border="" cellspacing="" cellpadding=""> <tr> <td style="width: 23%;"></td> <td> <button class="layout-btn layout-btn-red" lang type="button" lay-submit lay-filter="formUnbind">收货</button> </td> <td style="width: 33%;"></td> </tr> </table> </form> </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/jquery.cookie.js"></script> <script> layui.use(['form', 'jquery'], function() { var form = layui.form //当托盘条码输入框文本改变时,检查一下托盘状态 $("#palletNo").on('input', function () { if ($("#palletNo").val() == "" || $("#palletNo").val().length < 8) { return } if ($("#palletNo").val().length >= 8) { $("#palletNo").val($("#palletNo").val().substr(-8)) } checkPalletState() }) //检查托盘状态 function checkPalletState() { $('#SoNo').val(''); var param = { "PalletNo": $("#palletNo").val() } synData(IP + "/PdaCr/GetReceiptSoNoByPallet", param, 'post', function (res) { if (res.code == 0) { //成功 $('#SoNo').val(res.data); } else { //不成功 layer.msg(res.msg, { icon: 2, time: 2000 //2秒关闭(如果不配置,默认是3秒) }, function () { }); } }); } var isChongFu = true; form.on('submit(formUnbind)', function(data) { if (!$("#palletNo").val()) { layer.msg('请扫描托盘条码', { icon: 2, time: 2000 //2秒关闭(如果不配置,默认是3秒) }); return; } if (isChongFu == true) { isChongFu = false; var param = { "PalletNo":$("#palletNo").val(), } sendData(IP + "/PdaCr/ConfirmReceipt", param, 'post', function(res) { if (res.code == 0) { //成功 layer.msg("成功", { icon: 1, time: 2000 //2秒关闭(如果不配置,默认是3秒) }, function () { isChongFu = true; }); } else { //不成功 layer.msg(res.msg, { icon: 2, time: 2000 //2秒关闭(如果不配置,默认是3秒) }, function() {isChongFu = true;}); } }); return false; //阻止表单跳转。如果需要表单跳转,去掉这段即可。 }else{ layer.msg("请勿重复点击", { icon: 2, time: 2000 //2秒关闭(如果不配置,默认是3秒) }); } }); // form.verify({ // stock: [/^[\S]{6}$/, '托盘条码必须为六位字符'] // }); $("#menuImg").click(function(e){ //console.log("menuImg") e.stopPropagation() if($("#menuList").is(":hidden")){ $("#menuList").show() }else{ $("#menuList").hide() } }) $('body').click(function(){ // //console.log("body") $("#menuList").hide() }) }) </script> </body> </html> Pda/View/SoSetting/pinTuoOut.html
@@ -1259,7 +1259,7 @@ console.log(2) updateSkuLotNoList2(); updateQtyList2(); // getBar2(); getBar2(); // GetDataInfo(); } @@ -1315,14 +1315,14 @@ for (var i = 0; i < res.data.length; i++) { if (i == 0) { $("#skuLotNo2").append('<option value =' + res.data[i].SoDetailId + ' selected>' + res.data[i].SkuName); if (res.data[i].LotNo == null) { if (res.data[i].LotNo != null) { $("#skuLotNo2").append(" - " + res.data[i].LotNo); } $("#skuLotNo2").append('</option>'); } else { $("#skuLotNo2").append('<option value =' + res.data[i].SoDetailId + '>' + res.data[i].SkuName); if (res.data[i].LotNo == null) { if (res.data[i].LotNo != null) { $("#skuLotNo2").append(" - " + res.data[i].LotNo); } $("#skuLotNo2").append('</option>'); Wms/Model/ModelVm/PdaVm/PdaCrVm.cs
@@ -82,4 +82,10 @@ public decimal DevanQty { get; set; } public string BoxNo { get; set; } } public class PdaReceiptVm { public string PalletNo { get; set; } } } Wms/WMS.BLL/BllAsnServer/ArrivalNoticeServer.cs
@@ -149,6 +149,10 @@ } var labelQty = Db.Queryable<BllBoxInfo>().Where(m => m.IsDel == "0" && m.ASNDetailNo == id).Sum(m => m.Qty + (m.SamplingQty == null? 0: m.SamplingQty)); if (labelQty == null) { labelQty = 0; } var qty = detail.Qty - labelQty; if (qty<0) { Wms/WMS.BLL/BllCheckServer/StockCheckServer.cs
@@ -1686,90 +1686,99 @@ try { //当前任务信息 var task = await Db.Queryable<LogTask>().FirstAsync(m => m.TaskNo == taskNo && m.IsDel == "0"); var task = Db.Queryable<LogTask>().First(m => m.TaskNo == taskNo && m.IsDel == "0"); if (task == null) { throw Oops.Bah($"未查询到任务号为:‘{taskNo}’的任务信息"); throw new Exception($"未查询到任务号为:‘{taskNo}’的任务信息"); } if (task.Status == "2") { throw Oops.Bah("当前任务已完成"); throw new Exception("当前任务已完成"); } Db.BeginTran(); //库存中当前托盘的信息 var stockDetail = await Db.Queryable<DataStockDetail>().Where(m => m.PalletNo == task.PalletNo).ToListAsync(); var locateNo = stockDetail.Select(m => m.LocatNo).Distinct().FirstOrDefault(); //当前任务中的储位信息 var locate = await Db.Queryable<SysStorageLocat>().FirstAsync(m => m.LocatNo == locateNo); //更改任务 task.Status = "2";//任务状态 task.IsSend = 0; task.IsCancel = 0; task.IsFinish = 0; task.FinishDate = DateTime.Now;//完成时间 Db.Updateable(task).ExecuteCommand(); // 更改当前任务中的储位状态(改为0空储位) locate.Status = "0"; Db.Updateable(locate).ExecuteCommand(); //目标储位信息 var endLocate = await Db.Queryable<SysStorageLocat>().FirstAsync(m => m.LocatNo == task.EndLocat); if (endLocate != null) var stockDetail = Db.Queryable<DataStockDetail>().Where(m => m.PalletNo == task.PalletNo).ToList(); //当前任务中的目标储位信息 //当前任务中的原储位 var locate = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == task.StartLocat); if (locate == null) { if (endLocate.Status != "0") throw new Exception($"WMS系统中没有该{task.StartLocat}储位对应的信息"); } var locate2 = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == task.EndLocat); if (locate2 == null) { throw new Exception($"WMS系统中没有该{task.EndLocat}储位对应的信息"); } //平库中储位集合 var pingKuLocate = Db.Queryable<SysStorageLocat>().Where(m => m.WareHouseNo == "W04" && m.IsDel == "0").ToList(); //车间暂存区 var pingKuLocate2 = Db.Queryable<SysStorageLocat>().Where(m => m.WareHouseNo == "W04" && m.IsDel == "0" && (m.AreaNo == "B06" || m.AreaNo == "B07")).ToList(); var pingKuList = pingKuLocate.Select(m => m.LocatNo).ToList(); try { task.Status = "2";//任务状态 //判断起始目标位置都是平库 if (pingKuList.Contains(task.StartLocat) && pingKuList.Contains(task.EndLocat)) { throw Oops.Bah("目标储位状态非空储位"); task.Status = "5"; } } //更改库存明细 foreach (var item in stockDetail) { item.Status = "0";//待分配 item.LockQty = 0;//锁定数量改为0 if (endLocate != null)//有目标储位说明移到其他区域储位 { item.LocatNo = endLocate.LocatNo;//储位更改 item.WareHouseNo = endLocate.WareHouseNo;//所属仓库更改 item.RoadwayNo = endLocate.RoadwayNo;//所属巷道更改 item.AreaNo = endLocate.AreaNo;//所属区域更改 } else//没有目标储位说明移到入库口 { item.LocatNo = "";//储位更改(改为空) item.WareHouseNo = "";//所属仓库更改(改为空) item.RoadwayNo = "";//所属巷道更改(改为空) item.AreaNo = "";//所属区域更改(改为空) } await Db.Updateable(item).ExecuteCommandAsync(); //更改库存总表 var stock = Db.Queryable<DataStock>().First(w => w.IsDel == "0" && w.SkuNo == item.SkuNo && w.LotNo == item.LotNo); stock.LockQty -= (decimal)item.Qty; await Db.Updateable(stock).ExecuteCommandAsync(); } if (endLocate != null) { //更改目标储位状态 endLocate.Status = "1";//有物品 await Db.Updateable(endLocate).ExecuteCommandAsync(); } task.IsSend = 0; task.IsCancel = 0; task.IsFinish = 0; task.FinishDate = DateTime.Now;//完成时间 Db.Updateable(task).ExecuteCommand(); if (_userManager.UserId != 0) { //添加操作日志记录 //var k = new OperationCrServer().AddLogOperationCr("库内作业", "库内日志", taskNo, "完成", $"点击完成按钮、完成任务号为:{taskNo}的任务", userId); await _operation.AddLogOperationCr(new OperationInputVm() #region 修改储位状态 if (!pingKuList.Contains(task.StartLocat)) { ParentName = "库内作业", MenuName = "库内日志", FkNo = taskNo, TypeName = "完成", Msg = $"点击完成按钮、完成任务号为:{taskNo}的任务" }); //原储位改为空储位 0 locate.Status = "0"; Db.Updateable(locate).ExecuteCommand(); } //目标储位改为有货物 1 locate2.Status = "1"; Db.Updateable(locate2).ExecuteCommand(); //判断目标位置如果不是是车间暂存区 并且是平库储位 更改库存位置 if (pingKuLocate2.Count(m=>m.LocatNo == task.EndLocat)<=0 && pingKuList.Contains(task.EndLocat)) { foreach (var item in stockDetail) { item.WareHouseNo = locate2.WareHouseNo; item.AreaNo = locate2.AreaNo; item.RoadwayNo = locate2.RoadwayNo; item.LocatNo = locate2.LocatNo; } Db.Updateable(stockDetail).ExecuteCommand(); } #endregion if (_userManager.UserId != 0) { //添加操作日志记录 //var k = new OperationCrServer().AddLogOperationCr("库内作业", "库内日志", taskNo, "完成", $"点击完成按钮、完成任务号为:{taskNo}的任务", userId); await _operation.AddLogOperationCr(new OperationInputVm() { ParentName = "库内作业", MenuName = "库内日志", FkNo = taskNo, TypeName = "完成", Msg = $"点击完成按钮、完成任务号为:{taskNo}的任务" }); } Db.CommitTran(); } Db.CommitTran(); catch (Exception ex) { Db.RollbackTran(); throw new Exception(ex.Message); } } catch (Exception ex) Wms/WMS.BLL/BllPdaServer/PdaAsnServer.cs
@@ -128,39 +128,8 @@ var pNum = 0;//托盘物品数量 var bNum = 0;//箱码物品数量 if (pack == null) { throw new Exception("获取物料包装信息失败,请核实!"); } if (pack.L5Num.HasValue) { pNum = (int)pack.L5Num; bNum = (int)pack.L4Num; } else if (pack.L4Num.HasValue) { pNum = (int)pack.L4Num; bNum = (int)pack.L3Num; } else if (pack.L3Num.HasValue) { pNum = (int)pack.L3Num; bNum = (int)pack.L2Num; } else if (pack.L2Num.HasValue) { pNum = (int)pack.L2Num; bNum = (int)pack.L1Num; } else if (pack.L1Num.HasValue) { pNum = (int)pack.L1Num; bNum = (int)pack.L1Num; } if (pNum == 0 || bNum == 0) { throw new Exception($"绑定失败,{detail.SkuNo}物品包装未找到!"); } //公共方法获取包装数量 new Common().GetPackQtyInfo(detail.PackagNo, ref pNum, ref bNum); #endregion @@ -1123,6 +1092,7 @@ { try { Db.BeginTran(); #region 判断 //0:成品入库 1:采购入库 3:退货入库 4:车间余料入库 8:生产退料入库 @@ -1197,44 +1167,13 @@ #region 包装 var sku = Db.Queryable<SysMaterials>().First(m => m.IsDel == "0" && m.SkuNo == detail.SkuNo); var pack = Db.Queryable<SysPackag>().First(m => m.IsDel == "0" && m.PackagNo == detail.PackagNo); // liudl 由Sku包装编号变更为入库单明细包装编号 //var pack = Db.Queryable<SysPackag>().First(m => m.IsDel == "0" && m.PackagNo == detail.PackagNo); // liudl 由Sku包装编号变更为入库单明细包装编号 var pNum = 0;//托盘物品数量 var bNum = 0;//箱码物品数量 if (pack == null) { throw new Exception("获取物料包装失败,请核实!"); } if (pack.L5Num.HasValue) { pNum = (int)pack.L5Num; bNum = (int)pack.L4Num; } else if (pack.L4Num.HasValue) { pNum = (int)pack.L4Num; bNum = (int)pack.L3Num; } else if (pack.L3Num.HasValue) { pNum = (int)pack.L3Num; bNum = (int)pack.L2Num; } else if (pack.L2Num.HasValue) { pNum = (int)pack.L2Num; bNum = (int)pack.L1Num; } else if (pack.L1Num.HasValue) { pNum = (int)pack.L1Num; bNum = (int)pack.L1Num; } if (pNum == 0 || bNum == 0) { throw new Exception($"绑定失败,{detail.SkuNo}物品包装未找到!"); } //公共方法获取包装数量 new Common().GetPackQtyInfo(detail.PackagNo, ref pNum, ref bNum); #endregion @@ -1330,10 +1269,16 @@ { tags = "1"; } //验证库存托盘是否有贴标物料 var skuStr = Db.Queryable<SysMaterials>().Where(m => m.IsDel == "0" && m.IsPasteCode == "1").Select(m => m.SkuNo).ToList(); var sdHave = Db.Queryable<DataStockDetail>().Count(m => m.IsDel == "0" && m.PalletNo == model.PalletNo && skuStr.Contains(m.SkuNo)); if (sdHave>0) { throw new Exception("当前托盘含有贴标物料信息,不能组托"); } // 判断库存明细是否已有此托盘信息 var sd1 = Db.Queryable<DataStockDetail>() .First(m => m.IsDel == "0" && m.ASNDetailNo == bind.ASNDetailNo && m.PalletNo == model.PalletNo && m.LotNo == bind.LotNo); .First(m => m.IsDel == "0" && m.ASNDetailNo == bind.ASNDetailNo && m.PalletNo == model.PalletNo && m.SkuNo == detail.SkuNo && m.LotNo == bind.LotNo); var sdId1 = 0; if (sd1 != null) { @@ -1426,8 +1371,6 @@ } #endregion #region 更改组托信息 var isSample = "0";//是否取样 @@ -1497,10 +1440,12 @@ Db.Updateable(notice).ExecuteCommand(); #endregion #region 库存明细 #region 更改库存明细数量 sd1.Qty = bind.Qty; //更改库存明细数量 Db.Updateable(sd1).Where(m => m.Id == sdId1).ExecuteCommand(); #endregion #region 库存 @@ -1574,9 +1519,12 @@ sqlStr += $"insert into LogPalletTrack values('{model.PalletNo}','{model.AsnNo}','组盘','0',getDate(),{userId},NULL,NULL);"; Db.Ado.ExecuteCommand(sqlStr); new OperationASNServer().AddLogOperationAsn("PDA模块", "托盘绑定", model.AsnNo, "添加", $"添加了托盘码为:{model.PalletNo}的组盘信息", userId); Db.CommitTran(); } catch (Exception e) { Db.RollbackTran(); throw new Exception(e.Message); } } Wms/WMS.BLL/BllPdaServer/PdaCrServer.cs
@@ -6,6 +6,7 @@ using System.Threading.Tasks; using Dm; using Model.InterFaceModel; using Model.ModelDto; using Model.ModelDto.BllCheckDto; using Model.ModelDto.PdaDto; using Newtonsoft.Json; @@ -689,7 +690,7 @@ { throw Oops.Bah("托盘储位信息不存在,请检查!"); } if (models.WareHouseNo != "W02") if (models.WareHouseNo != "W04") { throw Oops.Bah("该托盘未在平库内,请检查!"); } @@ -719,7 +720,7 @@ { throw Oops.Bah("托盘储位信息不存在,请检查!"); } if (models.WareHouseNo != "W02") if (models.WareHouseNo != "W04") { throw Oops.Bah("该托盘未在平库内,请检查!"); } @@ -729,14 +730,9 @@ throw Oops.Bah("储位信息不存在,请检查!"); } if (storageLocat.AreaNo.Contains("B0")) { 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 = await Db.Queryable<SysStorageArea>().Where(w => w.IsDel == "0" && w.Status == "0" && w.AreaNo.Contains("B1") && w.WareHouseNo == "W02").OrderBy(o => o.AreaNo).ToListAsync(); } storageArea = await Db.Queryable<SysStorageArea>().Where(w => w.IsDel == "0" && w.Status == "0" && w.AreaNo != storageLocat.AreaNo && w.WareHouseNo == "W04").OrderBy(o => o.AreaNo).ToListAsync(); } return storageArea; } @@ -817,7 +813,7 @@ { throw Oops.Bah("所选区域信息不存在,请检查!"); } EndLocat = await GetLocat(areaNo, stockDetail.SkuNo, stockDetail.LotNo, palletNo); EndLocat = await GetLocat(areaNo); } else { @@ -846,7 +842,7 @@ var storageLocatEnd = new SysStorageLocat(); if (!string.IsNullOrEmpty(areaNo)) { storageLocatEnd = await Db.Queryable<SysStorageLocat>().FirstAsync(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"); if (storageLocatEnd == null) { throw Oops.Bah("目标储位信息不存在,请检查!"); @@ -1019,7 +1015,7 @@ throw Oops.Bah($"托盘号:{item.PalletNo}所在的储位信息不存在,请检查!"); } //获取目标储位 EndLocat = await GetLocat(areaNo, item.SkuNo, item.LotNo, palletNo); EndLocat = await GetLocat(areaNo); if (string.IsNullOrEmpty(EndLocat)) { throw Oops.Bah("分配目标储位失败,请检查!"); @@ -1101,28 +1097,23 @@ /// <param name="skuNo"></param> /// <param name="lotNo"></param> /// <returns></returns> private async Task<string> GetLocat(string areaNo, string skuNo, string lotNo, string palletNo, string hasLocatNoList = "") private async Task<string> GetLocat(string areaNo) { string endLocat = string.Empty;//目标储位 //当然区域所有储位信息 var storageLocatList = await Db.Queryable<SysStorageLocat>().Where(w => w.WareHouseNo == "W02" && w.AreaNo == areaNo).ToListAsync(); //同区域同批次物料的储位信息 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(); //当前区域所有储位信息 var storageLocatList = await Db.Queryable<SysStorageLocat>().Where(w => w.WareHouseNo == "W04" && w.AreaNo == areaNo).ToListAsync(); var locatInfo2 = storageLocatList.Where(w => w.IsDel == "0" && w.Flag == "0" && w.Status == "0") .OrderByDescending(m => m.Layer).OrderByDescending(m => m.Column).OrderByDescending(m => m.Row).First(); var locatInfo2 = storageLocatList.Where(w => w.IsDel == "0" && w.Status == "0" && w.Flag == "0" && w.LocatNo != locatInfo.LocatNo && w.Row == locatInfo.Row && !hasLocatNoList.Contains(w.LocatNo)) .OrderByDescending(o => o.Column).First(); if (locatInfo2 != null) { endLocat = locatInfo2.LocatNo; } if (locatInfo2 != null) { endLocat = locatInfo2.LocatNo; } if (string.IsNullOrEmpty(endLocat)) { var locatInfo3 = storageLocatList.Where(w => w.IsDel == "0" && w.Flag == "0" && w.Status == "0" && !hasLocatNoList.Contains(w.LocatNo)) var locatInfo3 = storageLocatList.Where(w => w.IsDel == "0" && w.Flag == "0") .OrderByDescending(m => m.Layer).OrderByDescending(m => m.Column).OrderByDescending(m => m.Row).First(); if (locatInfo3 != null) @@ -1216,7 +1207,7 @@ } #endregion #region 箱码拆箱贴标 #region 箱码拆箱贴标、人工确认收货 /// <summary> /// 拆箱添加标签 /// </summary> @@ -1252,7 +1243,18 @@ Db.Updateable(boxInfo).ExecuteCommand(); var boxStr = boxInfo.BoxNo.Substring(0, boxInfo.BoxNo.Length - 6);//获取箱码前缀-除后六位流水外 var maxBoxCode = Db.Queryable<BllBoxInfo>().Where(m => m.BoxNo.Contains(boxStr) && m.IsDel == "0" && m.Origin == "WMS生成").Max(a => a.BoxNo); var maxBoxCode1 = Db.Queryable<BllBoxInfo>().Where(m => m.BoxNo.Contains(boxStr) && m.IsDel == "0" && m.Origin == "WMS生成").Max(a => a.BoxNo); var maxBoxCode2 = Db.Queryable<DataBoxInfo>().Where(m => m.BoxNo.Contains(boxStr) && m.IsDel == "0").Max(a => a.BoxNo); //如果结果为0,则说明两个字符串相等; ABC BCE //如果结果小于0,则说明第一个字符串小于第二个字符串; //如果结果大于0,则说明第一个字符串大于第二个字符串。 var maxBoxCode = maxBoxCode1; var bol = String.CompareOrdinal(maxBoxCode1, maxBoxCode2); if (bol<0) { maxBoxCode = maxBoxCode2; } var boxNoNew = maxBoxCode.Substring(0, maxBoxCode.Length - 6) + (int.Parse(maxBoxCode.Substring(maxBoxCode.Length - 6, 6)) + 1).ToString().PadLeft(6, '0'); // 添加新箱码信息 @@ -1296,6 +1298,121 @@ throw new Exception(e.Message); } } public string GetReceiptSoNoByPallet(string palletNo) { try { var stockDetail = Db.Queryable<DataStockDetail>().Where(m => m.PalletNo == palletNo).GroupBy(m=>m.SONo).Select(m=>m.SONo).ToList(); if (stockDetail.Count == 0) { throw new Exception("没有查询到托盘库存信息"); } if (stockDetail.Count != 1) { throw new Exception("库存托盘不是唯一出库单"); } var detail = stockDetail.First(); if (string.IsNullOrWhiteSpace(detail)) { throw new Exception("托盘没有出库单信息"); } var task = Db.Queryable<LogTask>().First(m => m.PalletNo == palletNo && m.IsDel == "0" && m.Status == "5"); if (task == null) { throw new Exception("没有查询到托盘任务信息"); } if (task.Status != "5") { throw new Exception("任务状态不是等待确认"); } return detail; } catch (Exception e) { throw new Exception(e.Message); } } /// <summary> /// 人工确认收货 /// </summary> /// <param name="palletNo"></param> /// <param name="userId"></param> public void ConfirmReceipt(string palletNo, int userId) { try { Db.BeginTran(); var task = Db.Queryable<LogTask>().First(m => m.PalletNo == palletNo && m.IsDel == "0" && m.Status == "5"); if (task == null) { throw new Exception("没有查询到托盘任务信息"); } if (task.Status != "5") { throw new Exception("任务状态不是等待确认"); } //任务状态变更为执行完成 task.Status = "2"; Db.Updateable(task).ExecuteCommand(); var locatList = Db.Queryable<SysStorageLocat>().Where(m=>m.WareHouseNo == "W04" && (m.AreaNo == "B06" || m.AreaNo == "B07") && m.IsDel == "0").ToList(); var locat = locatList.FirstOrDefault(m => m.LocatNo == task.EndLocat); //判断托盘储位是否在车间 if (locat == null) { throw new Exception("储位信息没有在车间工位上"); } locat.Status = "0"; Db.Updateable(locat).ExecuteCommand(); //判断托盘信息 var stockDetail = Db.Queryable<DataStockDetail>().Where(m => m.IsDel == "0" && m.PalletNo == palletNo).ToList(); foreach (var item in stockDetail) { if (item.UDF5 != "1" || string.IsNullOrWhiteSpace(item.SONo)) { continue; } //item.WareHouseNo = ""; //item.RoadwayNo = ""; //item.AreaNo = ""; item.LocatNo = ""; item.PalletNo = ""; item.LockQty = 0; // 锁定数量更为0 item.Status = "0"; // 状态变为待分配 var boxInfo = Db.Queryable<DataBoxInfo>().Where(m => m.StockDetailId == item.Id).ToList(); foreach (var item2 in boxInfo) { item2.Status = "2"; //状态变为已入库 } Db.Updateable(boxInfo).ExecuteCommand(); } Db.Updateable(stockDetail).ExecuteCommand(); //托盘变更状态 var pallet = Db.Queryable<SysPallets>().First(m => m.IsDel == "0" && m.PalletNo == palletNo); if (pallet == null) { throw new Exception("没有查询到托盘信息"); } pallet.Status = "0"; Db.Updateable(pallet).ExecuteCommand(); //添加操作日志 new OperationCrServer().AddLogOperationCr("库内作业", "操作日志", palletNo, "编辑", $"车间收货:{palletNo}托盘收货", userId); Db.CommitTran(); } catch (Exception e) { Db.RollbackTran(); throw new Exception(e.Message); } } #endregion } Wms/WMS.BLL/BllPdaServer/PdaSoServer.cs
@@ -118,20 +118,20 @@ #region 拼托信息 var sdId = 0; bool isNew = false; var pinStockDetail = await Db.Queryable<DataStockDetail>().FirstAsync(m => m.IsDel == "0" && m.PalletNo == palletNoNew); var pinStockDetail = Db.Queryable<DataStockDetail>().First(m => m.IsDel == "0" && m.PalletNo == palletNoNew && m.SkuNo == stockDetail.SkuNo && m.LotNo == stockDetail.LotNo); if (pinStockDetail != null) { if (palletNo != palletNoNew)//非整托拣货 { if (pinStockDetail.SONo != notice.SONo) var pinStockDetails = Db.Queryable<DataStockDetail>().Where(m => m.IsDel == "0" && m.PalletNo == palletNoNew && m.Id!= pinStockDetail.Id).ToList(); if (pinStockDetails.Count(m=>m.SONo != notice.SONo) > 0) { throw Oops.Bah("拼托托盘上只能放同一个出库单下的物料!"); } if (pinStockDetail.SkuName != stockDetail.SkuName || pinStockDetail.LotNo != stockDetail.LotNo) { isNew = true; } } sdId = pinStockDetail.Id; } else @@ -147,6 +147,7 @@ newPalletInfo.Status = "1"; await Db.Updateable(newPalletInfo).ExecuteCommandAsync(); } var sd = new DataStockDetail(); if (isNew) { @@ -189,7 +190,7 @@ sd.IsDel = "0"; sd.CreateUser = userId; sd.CreateTime = nowDate; sd.UDF5 = "1"; //新增拼托库存明细信息 sdId = await Db.Insertable(sd).ExecuteReturnIdentityAsync(); } @@ -269,6 +270,7 @@ if (palletNo != palletNoNew) { var locateStr = stockDetail.LocatNo; //删除原托盘库存明细 await Db.Deleteable(stockDetail).ExecuteCommandAsync(); @@ -280,10 +282,19 @@ } pallet.Status = "0"; await Db.Updateable(pallet).ExecuteCommandAsync(); //更改储位状态为空储位 var locate = Db.Queryable<SysStorageLocat>().First(m => m.IsDel == "0" && m.LocatNo == locateStr); if (locate != null) { locate.Status = "0"; Db.Updateable(locate).ExecuteCommand(); } } else { stockDetail.SONo = soNo; stockDetail.UDF5 = "1"; await Db.Updateable(stockDetail).ExecuteCommandAsync(); } @@ -301,14 +312,13 @@ } else { var biaoShi = "0";//0:整箱拣货、1:散支拣货、2:数量拣货 List<DataBoxInfo> boxInfos; var boxInfo = Db.Queryable<DataBoxInfo>().Where(m => m.IsDel == "0" && m.BoxNo == boxNo); if (await boxInfo.CountAsync() == 0) { throw Oops.Bah("未查询到该箱码的信息"); } boxInfos = boxInfo.ToList(); var comDetailList = await Db.Queryable<BllCompleteDetail>().Where(m => m.IsDel == "0" && m.ExportAllotId == allot.Id && m.PalletNo == palletNo).ToListAsync(); //整箱拣货 @@ -322,7 +332,7 @@ { throw Oops.Bah("拣货数量不能大于箱内剩余待拣数量"); } boxInfos = await boxInfo.ToListAsync(); foreach (var item in boxInfos) { if (comDetailList.Any(m => m.BoxNo == item.BoxNo)) @@ -360,9 +370,13 @@ comList.Add(completeDetail); //修改库存箱码明细 item.StockDetailId = sdId; item.BindNo = null;//托盘绑定号 item.PalletNo = palletNoNew; if (palletNo != palletNoNew) { item.StockDetailId = sdId; item.BindNo = null;//托盘绑定号 item.PalletNo = palletNoNew; } item.Status = "5";//箱支状态,0:未组托 1:已组托 2:已入库 3:已出库 4:已分配 5:已拣货 await Db.Updateable(item).ExecuteCommandAsync(); @@ -382,6 +396,7 @@ stockDetail.BitPalletMark = "1";//修改为零托标识 stockDetail.Qty -= pickQty; stockDetail.LockQty -= pickQty; stockDetail.UDF5 = "1"; if (stockDetail.Qty == stockDetail.LockQty) { stockDetail.Status = "2"; @@ -397,15 +412,9 @@ if (stockDetail.Qty <= 0) { var locateStr = stockDetail.LocatNo; await Db.Deleteable(stockDetail).ExecuteCommandAsync(); } else { await Db.Updateable(stockDetail).ExecuteCommandAsync(); } var num2 = await Db.Queryable<DataStockDetail>().CountAsync(m => m.IsDel == "0" && m.PalletNo == palletNo); if (num2 <= 0) { //改变托盘状态 var pallet = await Db.Queryable<SysPallets>().FirstAsync(m => m.PalletNo == palletNo && m.IsDel == "0"); if (pallet == null) @@ -414,7 +423,20 @@ } pallet.Status = "0"; await Db.Updateable(pallet).ExecuteCommandAsync(); //更改储位状态为空储位 var locate = Db.Queryable<SysStorageLocat>().First(m => m.IsDel == "0" && m.LocatNo == locateStr); if (locate != null) { locate.Status = "0"; Db.Updateable(locate).ExecuteCommand(); } } else { await Db.Updateable(stockDetail).ExecuteCommandAsync(); } //修改出库单明细拣货数量 noticeDetail.CompleteQty += pickQty; await Db.Updateable(noticeDetail).ExecuteCommandAsync(); @@ -542,18 +564,15 @@ #region 拼托信息 bool isNew = false; var pinStockDetail = await Db.Queryable<DataStockDetail>().FirstAsync(m => m.IsDel == "0" && m.PalletNo == palletNoNew); var pinStockDetail = await Db.Queryable<DataStockDetail>().FirstAsync(m => m.IsDel == "0" && m.PalletNo == palletNoNew && m.SkuNo== stockDetail.SkuNo && m.LotNo == stockDetail.LotNo); if (pinStockDetail != null) { if (palletNo != palletNoNew)//非整托拣货 { if (pinStockDetail.SONo != notice.SONo) var pinStockDetails = Db.Queryable<DataStockDetail>().Where(m => m.IsDel == "0" && m.PalletNo == palletNoNew && m.Id != pinStockDetail.Id).ToList(); if (pinStockDetails.Count(m => m.SONo != notice.SONo) > 0) { throw Oops.Bah("拼托托盘上只能放同一个出库单下的物料!"); } if (pinStockDetail.SkuName != stockDetail.SkuName || pinStockDetail.LotNo != stockDetail.LotNo) { isNew = true; } } } @@ -617,6 +636,7 @@ sd.IsDel = "0"; sd.CreateUser = userId; sd.CreateTime = nowDate; sd.UDF5 = "1"; //新增拼托库存明细信息 await Db.Insertable(sd).ExecuteReturnIdentityAsync(); @@ -628,11 +648,13 @@ //修改拼托托盘库存明细 pinStockDetail.Qty += int.Parse(PickQty); pinStockDetail.LockQty += int.Parse(PickQty); pinStockDetail.UDF5 = "1"; await Db.Updateable(pinStockDetail).ExecuteCommandAsync(); } else { pinStockDetail.SONo = soNo; pinStockDetail.UDF5 = "1"; await Db.Updateable(pinStockDetail).ExecuteCommandAsync(); } } @@ -697,7 +719,7 @@ await Db.Updateable(allot).ExecuteCommandAsync(); int isDel = 0; var locateStr = stockDetail.LocatNo; if (palletNo != palletNoNew) { //删除或修改库存明细 @@ -742,6 +764,15 @@ pallet.Status = "0"; await Db.Updateable(pallet).ExecuteCommandAsync(); //更改储位状态为空储位 var locate = Db.Queryable<SysStorageLocat>().First(m=>m.IsDel == "0" && m.LocatNo == locateStr); if (locate!=null) { locate.Status = "0"; Db.Updateable(locate).ExecuteCommand(); } } //修改出库单明细拣货数量 @@ -803,10 +834,10 @@ throw Oops.Bah("托盘码为空,请输入托盘码"); } var palletInfo = await Db.Queryable<DataStockDetail>().FirstAsync(w => w.IsDel == "0" && w.PalletNo == palletNo); if (!string.IsNullOrEmpty(palletInfo.WareHouseNo) && type != "1") { throw Oops.Bah("该托盘还未出库"); } //if (!string.IsNullOrEmpty(palletInfo.WareHouseNo) && type != "1") //{ // throw Oops.Bah("该托盘还未出库"); //} if (type == "1")//平库出库获取单据 { var allotList = await Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && m.Status == "1" && m.PalletNo == palletNo).Select(m => m.SONo).Distinct().Where(m => !string.IsNullOrWhiteSpace(m)).ToListAsync(); Wms/WMS.BLL/BllSoServer/ExportNoticeServer.cs
@@ -29,6 +29,7 @@ using System.Diagnostics; using System.Drawing.Drawing2D; using Model.ModelDto.LogDto; using AutoMapper.Internal; namespace WMS.BLL.BllSoServer { @@ -1016,7 +1017,7 @@ var stockRst = new StockServer(); var stockDetailRst = new StockDetailServer(); Expression<Func<DataStockDetail, bool>> item = Expressionable.Create<DataStockDetail>() .And(it => it.WareHouseNo == house) .And(it => it.WareHouseNo == house || string.IsNullOrWhiteSpace(it.LocatNo)) .AndIF(!string.IsNullOrWhiteSpace(inspectStatus), it => inspectStatus.Contains(it.InspectStatus)) .And(m => skuStrList.Contains(m.SkuNo)) .AndIF(type == "6", m => m.OwnerNo == ownerNo)//代储出库需要关联货主 @@ -1249,7 +1250,7 @@ IsWave = "0", WaveNo = "", IsDespatch = "0", WareHouseNo = model.WareHouseNo, CreateUser = userId, }; @@ -3025,9 +3026,40 @@ try { List<LogTask> logTaskList = new List<LogTask>();//此次出库任务集合,为应对同托盘不同物料出库 var i = 0; var outLocatelist1 = Db.Queryable<SysStorageLocat>().Where(m => m.IsDel == "0" && m.AreaNo == "B02" && m.Flag == "0").ToList(); var outLocatelist2 = Db.Queryable<SysStorageLocat>().Where(m => m.IsDel == "0" && m.AreaNo == "B05" && m.Flag == "0").ToList(); //循环分配的信息生成出库任务 foreach (var item in list) { var outModeLocate = ""; if (outMode == "1") { if (i < outLocatelist1.Count) { outModeLocate = outLocatelist1[i].LocatNo; } else { var j = i % outLocatelist1.Count; outModeLocate = outLocatelist1[j].LocatNo; } } else if(outMode == "2") { if (i < outLocatelist1.Count) { outModeLocate = outLocatelist2[i].LocatNo; } else { var j = i % outLocatelist1.Count; outModeLocate = outLocatelist2[j].LocatNo; } } var taskNoStr = ""; // 储位号 @@ -3050,7 +3082,7 @@ { //如果不在仓库内,当前分配信息直接更新出库完成 item.Status = "2";//状态 item.OutMode = outMode;//出库口 item.OutMode = outModeLocate;//出库口 Db.Updateable(item).ExecuteCommand(); var noticeDetail = Db.Queryable<BllExportNoticeDetail>().First(m => m.IsDel == "0" && m.Id == item.SODetailNo); if (noticeDetail != null) //更新出库单据的下发数量 @@ -3072,6 +3104,7 @@ } flagList.Add(0); continue; } var locate = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == locateNo && m.IsDel == "0");//当前出库的储位信息 @@ -3102,7 +3135,7 @@ IsSuccess = 0, //是否下发成功 0失败 1成功 StartLocat = locate.LocatNo,//起始位置 EndLocat = outMode,//目标位置 EndLocat = outModeLocate,//目标位置 PalletNo = item.PalletNo,//托盘码 IsSend = 1,//是否可再次下发 IsCancel = 1,//是否可取消 @@ -3110,7 +3143,7 @@ Type = "1",//任务类型 0 入库任务 1 出库任务 2 移库任务 Status = "0",//任务状态0:等待执行1正在执行2执行完成 OrderType = "1",//0 入库单 1 出库单 2 盘点单 3 移库单 Msg = "从" + locate.LocatNo + "到" + outMode + "的出库任务", //关键信息 Msg = "从" + locate.LocatNo + "到" + outModeLocate + "的出库任务", //关键信息 }; Db.Insertable(exTask).ExecuteCommand(); logTaskList.Add(exTask); @@ -3120,10 +3153,10 @@ PalletNo = item.PalletNo,//托盘号 StartLocate = locate.LocatNo, // 起始位置 StartRoadway = locate.RoadwayNo,//其实巷道 EndLocate = outMode, // 目标位置 EndLocate = outModeLocate, // 目标位置 TaskNo = exTask.TaskNo, // 任务号 TaskType = "1",// 任务类型 (出库)0入 1出 2移 OutMode = outMode, //出库口 OutMode = outModeLocate, //出库口 Order = 1, //UnstackingMode = "unstackingMode2",//拣货方式 0机器拆托出 1 人工拣货出 @@ -3157,17 +3190,21 @@ } locate.Status = "3"; //要出库的储位改变状态 正在出库 Db.Updateable(locate).ExecuteCommand(); var locate2 = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == outModeLocate && m.IsDel == "0");//当前出库的目标储位信息 locate2.Status = "4"; Db.Updateable(locate2).ExecuteCommand(); item.TaskNo = taskNoStr; // 出库分配信息中更新任务号 item.Status = "1"; // 出库分配信息状态改为正在执行 //item.UnstackingMode = unstackingMode2;//拆垛方式 item.OutMode = outMode;//出库口 item.OutMode = outModeLocate;//出库口 //item.LoadingAddre = unstackingMode2 == "0" ? loadingAddre : "";//装车口 Db.Updateable(item).ExecuteCommand(); #endregion flagList.Add(0); i++; } else if (locate.Status == "3") //出库中 { @@ -4100,7 +4137,6 @@ return bl; } private class addreClass { public string slotCode { get; set; } @@ -4113,6 +4149,289 @@ public string AisleOne { get; set; } } /// <summary> /// wcs返回的成功信号(出库成功) /// </summary> /// <param name="taskNo"></param> /// <param name="userId"></param> /// <exception cref="Exception"></exception> public void ExportSuccess(string taskNo, int userId) { try { //当前任务信息 var task = Db.Queryable<LogTask>().First(m => m.TaskNo == taskNo && m.IsDel == "0"); if (task == null) { throw new Exception($"未查询到任务号为:‘{taskNo}’的任务信息"); } if (task.Status == "2") { throw new Exception("当前任务已完成"); } Db.BeginTran(); //库存中当前托盘的信息 var stockDetail = Db.Queryable<DataStockDetail>().Where(m => m.PalletNo == task.PalletNo).ToList(); var locateNo = stockDetail.Select(m => m.LocatNo).Distinct().FirstOrDefault(); //当前任务中的储位信息 var locate = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == locateNo); try { task.Status = "2";//任务状态 task.IsSend = 0; task.IsCancel = 0; task.IsFinish = 0; task.FinishDate = DateTime.Now;//完成时间 Db.Updateable(task).ExecuteCommand(); if (locate != null) { locate.Status = "0"; // 更改当前任务中的储位状态(改为0空储位) Db.Updateable(locate).ExecuteCommand(); } foreach (var item in stockDetail) { if (item.SkuNo == "100099")//判断是否是空托出库 { //判断总库存是否为0,如果为0删除 否则减去数量 var stock = Db.Queryable<DataStock>().First(m => m.SkuNo == "100099"); if (stock != null) { if (item.LockQty != null) { stock.Qty -= item.LockQty.Value; stock.LockQty -= item.LockQty.Value; Db.Updateable(stock).ExecuteCommand(); } if (stock.Qty == 0) { Db.Deleteable(stock).ExecuteCommand(); } } //托盘状态改为未使用 var sCode = Db.Queryable<SysPallets>().First(m => m.PalletNo == item.PalletNo); if (sCode != null) { sCode.Status = "0"; Db.Updateable(sCode).ExecuteCommand(); } Db.Deleteable(item).ExecuteCommand(); continue; } item.LocatNo = "";//储位更改(改为空) item.WareHouseNo = "";//所属仓库更改(改为空) item.RoadwayNo = "";//所属巷道更改(改为空) item.AreaNo = "";//所属区域更改(改为空) } //出库流水(更改状态) var allot = Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && (m.TaskNo == taskNo || (m.Status == "1" && m.PalletNo == task.PalletNo))).ToList(); var PalletType = "0"; //0:物料托 1:空托盘托 foreach (var item in allot) { if (item.SkuNo == "100099") { item.Status = "5"; item.CompleteQty += stockDetail[0].Qty; PalletType = "1"; } else { item.Status = "2"; } } var endLocateList = Db.Queryable<SysStorageLocat>().Where(m => m.IsDel == "0" && (m.AreaNo == "B02" || m.AreaNo == "B05")).Select(m=>m.LocatNo).ToList(); //判断是否是原辅料出库任务 货架储位=》平库储位 if ( endLocateList.Contains(task.EndLocat) && PalletType == "0") { //修改目标地址状态 var endLocat = Db.Queryable<SysStorageLocat>().First(m => m.IsDel == "0" && m.LocatNo == task.EndLocat); endLocat.Status = "1"; Db.Updateable(endLocat).ExecuteCommand(); foreach (var item in stockDetail) { item.LocatNo = endLocat.LocatNo;//储位更改(改为空) item.WareHouseNo = endLocat.WareHouseNo;//所属仓库更改(改为空) item.RoadwayNo = endLocat.RoadwayNo;//所属巷道更改(改为空) item.AreaNo = endLocat.AreaNo;//所属区域更改(改为空) } } Db.Updateable(stockDetail).ExecuteCommand(); Db.Updateable(allot).ExecuteCommand(); if (userId != 0) { //添加操作日志记录 var k = new OperationSOServer().AddLogOperationSo("出库作业", "出库日志", taskNo, "完成", $"点击完成按钮、完成任务号为:{taskNo}的任务", userId); } Db.CommitTran(); } catch (Exception ex) { Db.RollbackTran(); throw new Exception(ex.Message); } } catch (Exception ex) { throw new Exception("完成反馈失败:" + ex.Message); } } /// <summary> /// wcs返回的成功信号(移库成功) /// </summary> /// <param name="taskNo">任务号</param> /// <param name="userId">操作人</param> /// <exception cref="Exception"></exception> public void RelocationSuccess(string taskNo, int userId) { try { //当前任务信息 var task = Db.Queryable<LogTask>().First(m => m.TaskNo == taskNo && m.IsDel == "0"); if (task == null) { throw new Exception($"未查询到任务号为:‘{taskNo}’的任务信息"); } if (task.Status == "2") { throw new Exception("当前任务已完成"); } Db.BeginTran(); //库存中当前托盘的信息 var stockDetail = Db.Queryable<DataStockDetail>().Where(m => m.PalletNo == task.PalletNo).ToList(); //当前任务中的目标储位信息 //当前任务中的原储位 var locate = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == task.StartLocat); if (locate == null) { throw new Exception($"WMS系统中没有该{task.StartLocat}储位对应的信息"); } var locate2 = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == task.EndLocat); if (locate2 == null) { throw new Exception($"WMS系统中没有该{task.EndLocat}储位对应的信息"); } //平库中储位集合 var pingKuLocate = Db.Queryable<SysStorageLocat>().Where(m => m.WareHouseNo == "W04" && m.IsDel == "0").ToList(); var pingKuList = pingKuLocate.Select(m => m.LocatNo).ToList(); try { task.Status = "5";//任务状态 //判断起始目标位置都是平库 if (pingKuList.Contains(task.StartLocat) && pingKuList.Contains(task.EndLocat)) { task.Status = "2"; } task.IsSend = 0; task.IsCancel = 0; task.IsFinish = 0; task.FinishDate = DateTime.Now;//完成时间 Db.Updateable(task).ExecuteCommand(); #region 修改储位状态 if (!pingKuList.Contains(task.StartLocat)) { //原储位改为空储位 0 locate.Status = "0"; Db.Updateable(locate).ExecuteCommand(); } //目标储位改为有货物 1 locate2.Status = "1"; Db.Updateable(locate2).ExecuteCommand(); //判断起始目标位置都是平库 if ( pingKuList.Contains(task.EndLocat)) { foreach (var item in stockDetail) { item.WareHouseNo = locate2.WareHouseNo; item.AreaNo = locate2.AreaNo; item.RoadwayNo = locate2.RoadwayNo; item.LocatNo = locate2.LocatNo; } Db.Updateable(stockDetail).ExecuteCommand(); } #endregion Db.CommitTran(); } catch (Exception ex) { Db.RollbackTran(); throw new Exception(ex.Message); } } catch (Exception ex) { throw new Exception("完成反馈失败:" + ex.Message); } } /// <summary> /// AGV任务取货完成反馈 /// </summary> /// <param name="taskNo"></param> public void AGVQuHuoSuccess(string taskNo) { try { Db.BeginTran(); var task = Db.Queryable<LogTask>().First(m=>m.IsDel =="0" && m.TaskNo == taskNo); if (task == null) { throw new Exception("没有查询到任务信息"); } if (task.Status!="1") { throw new Exception("任务状态不是正在执行,请核实"); } var locate = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == task.StartLocat && m.IsDel == "0"); if (locate == null) { throw new Exception("没有查询到起始储位信息"); } if (locate.WareHouseNo!="W04") { throw new Exception("起始储位不是平库储位,请核实"); } locate.Status = "0"; //更改储位状态为空储位 Db.Updateable(locate).ExecuteCommand(); //查询出托盘信息 更改库存储位信息 var stockDetail = Db.Queryable<DataStockDetail>().Where(m => m.IsDel == "0" && m.PalletNo == task.PalletNo).ToList(); foreach (var item in stockDetail) { item.WareHouseNo = ""; item.AreaNo = ""; item.RoadwayNo = ""; item.LocatNo = ""; } Db.Updateable(stockDetail).ExecuteCommand(); Db.CommitTran(); } catch (Exception e) { Db.RollbackTran(); throw new Exception(e.Message); } } #endregion #endregion @@ -5599,338 +5918,6 @@ } } //wcs返回的成功信号(出库成功) public void ExportSuccess(string taskNo, int userId) { try { //当前任务信息 var task = Db.Queryable<LogTask>().First(m => m.TaskNo == taskNo && m.IsDel == "0"); if (task == null) { throw new Exception($"未查询到任务号为:‘{taskNo}’的任务信息"); } if (task.Status == "2") { throw new Exception("当前任务已完成"); } Db.BeginTran(); //库存中当前托盘的信息 var stockDetail = Db.Queryable<DataStockDetail>().Where(m => m.PalletNo == task.PalletNo).ToList(); var locateNo = stockDetail.Select(m => m.LocatNo).Distinct().FirstOrDefault(); //当前任务中的储位信息 var locate = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == locateNo); try { task.Status = "2";//任务状态 task.IsSend = 0; task.IsCancel = 0; task.IsFinish = 0; task.FinishDate = DateTime.Now;//完成时间 Db.Updateable(task).ExecuteCommand(); if (locate != null) { locate.Status = "0"; // 更改当前任务中的储位状态(改为0空储位) Db.Updateable(locate).ExecuteCommand(); } foreach (var item in stockDetail) { if (item.SkuNo == "100099")//判断是否是空托出库 { //判断总库存是否为0,如果为0删除 否则减去数量 var stock = Db.Queryable<DataStock>().First(m => m.SkuNo == "100099"); if (stock != null) { if (item.LockQty != null) { stock.Qty -= item.LockQty.Value; stock.LockQty -= item.LockQty.Value; Db.Updateable(stock).ExecuteCommand(); } if (stock.Qty == 0) { Db.Deleteable(stock).ExecuteCommand(); } } //托盘状态改为未使用 var sCode = Db.Queryable<SysPallets>().First(m => m.PalletNo == item.PalletNo); if (sCode != null) { sCode.Status = "0"; Db.Updateable(sCode).ExecuteCommand(); } Db.Deleteable(item).ExecuteCommand(); #region 拣货信息 //var pickQty = 0;//拣货的数量 //var comList = new List<BllCompleteDetail>(); // //添加拣货明细 // var completeDetail = new BllCompleteDetail() // { // SONo = "", // SODetailNo = 0, // ExportAllotId = 0, // StockId = exportAllot.StockId, // BoxNo = item.BoxNo, // BoxNo2 = item.BoxNo2, // BoxNo3 = item.BoxNo3, // LotNo = exportAllot.LotNo, // LotText = exportAllot.LotText, // SupplierLot = exportAllot.SupplierLot, // SkuNo = exportAllot.SkuNo, // SkuName = exportAllot.SkuName, // Standard = exportAllot.Standard, // PalletNo = palletNo, // CompleteQty = item.Qty, // CreateUser = userId // }; // comList.Add(completeDetail); // //删除库存箱码明细 // Db.Deleteable(item).ExecuteCommand(); // pickQty += item.Qty; // exportAllot.Status = "5"; //待回库 : 已完成 // exportAllot.CompleteQty += item.Qty; //拣货数量 // exportAllot.UpdateUser = userId; //修改人 // exportAllot.UpdateTime = serverTime; //修改时间 // Db.Updateable(exportAllot).ExecuteCommand(); // //验证拣货信息是否为已完成 // if (exportAllot.Status == "5") // { // break; // } //Db.Insertable(comList).ExecuteCommand(); #endregion continue; } item.LocatNo = "";//储位更改(改为空) item.WareHouseNo = "";//所属仓库更改(改为空) item.RoadwayNo = "";//所属巷道更改(改为空) item.AreaNo = "";//所属区域更改(改为空) Db.Updateable(item).ExecuteCommand(); } //出库流水(更改状态) var allot = Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && (m.TaskNo == taskNo || (m.Status == "1" && m.PalletNo == task.PalletNo))).ToList(); var PalletType = "0"; //0:物料托 1:空托盘托 var soNo = ""; var sku = ""; foreach (var item in allot) { if (item.SkuNo == "100099") { item.Status = "5"; item.CompleteQty += stockDetail[0].Qty; PalletType = "1"; } else { item.Status = "2"; soNo = item.SONo; sku = item.SkuNo; } } //下发四楼调度AGV的任务 if ((task.EndLocat == "outMode" || task.EndLocat == "outMode") && PalletType == "0") { foreach (var item in allot) { var detail = Db.Queryable<DataStockDetail>().First(m => m.Id == item.StockId); detail.SONo = item.SONo; Db.Updateable(detail).ExecuteCommand(); } var locatePing = new AllotLocation().GetPingLocate(soNo, sku); if (locatePing == null) { throw new Exception("平库未查询到空位置"); } var exTask = new LogTask //出库任务 { TaskNo = new Common().GetMaxNo("TK"), Sender = "WMS", Receiver = "AGV", IsSuccess = 0, //是否下发成功 0失败 1成功 StartLocat = task.EndLocat,//起始位置 EndLocat = locatePing.LocatNo,//outMode,//目标位置 PalletNo = task.PalletNo,//托盘码 IsSend = 1,//是否可再次下发 IsCancel = 1,//是否可取消 IsFinish = 1,//是否可完成 Type = "1",//任务类型 0 入库任务 1 出库任务 2 移库任务 Status = "0",//任务状态0:等待执行1正在执行2执行完成 OrderType = "1",//0 入库单 1 出库单 2 盘点单 3 移库单 Msg = "从" + task.EndLocat + "到" + locatePing.LocatNo + "的出库任务", //关键信息 }; Db.Insertable(exTask).ExecuteCommand(); var outDto = new List<OutCommandDto> { new OutCommandDto() { PalletNo = task.PalletNo,//托盘号 StartLocate = task.EndLocat, // 起始位置 StartRoadway = "",//其实巷道 EndLocate = locatePing.LocatNo,//outMode, // 目标位置 TaskNo = exTask.TaskNo, // 任务号 TaskType = "1",// 任务类型 (出库)0入 1出 2移 OutMode = "", //出库口 Order = 1, //UnstackingMode = unstackingMode2,//拣货方式 0机器拆托出 1 人工拣货出 //CompleteQty = outCount2, //拆的件数 //BoxexQty = outCount, //总件数 } }; // 正式运行程序放开 var list2 = outDto.Select(m => m.TaskNo).ToList(); var jsonData = JsonConvert.SerializeObject(outDto); string response = ""; try { 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); //} //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); } } Db.Updateable(allot).ExecuteCommand(); if (userId != 0) { //添加操作日志记录 var k = new OperationSOServer().AddLogOperationSo("出库作业", "出库日志", taskNo, "完成", $"点击完成按钮、完成任务号为:{taskNo}的任务", userId); } Db.CommitTran(); } catch (Exception ex) { Db.RollbackTran(); throw new Exception(ex.Message); } } catch (Exception ex) { throw new Exception("完成反馈失败:" + ex.Message); } } /// <summary> /// wcs返回的成功信号(移库成功) /// </summary> /// <param name="taskNo">任务号</param> /// <param name="userId">操作人</param> /// <exception cref="Exception"></exception> public void RelocationSuccess(string taskNo, int userId) { try { //当前任务信息 var task = Db.Queryable<LogTask>().First(m => m.TaskNo == taskNo && m.IsDel == "0"); if (task == null) { throw new Exception($"未查询到任务号为:‘{taskNo}’的任务信息"); } if (task.Status == "2") { throw new Exception("当前任务已完成"); } Db.BeginTran(); //库存中当前托盘的信息 var stockDetail = Db.Queryable<DataStockDetail>().Where(m => m.PalletNo == task.PalletNo).ToList(); //当前任务中的目标储位信息 //当前任务中的原储位 var locate = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == task.StartLocat); if (locate == null) { throw new Exception($"WMS系统中没有该{task.StartLocat}储位对应的信息"); } var locate2 = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == task.EndLocat); if (locate2 == null) { throw new Exception($"WMS系统中没有该{task.EndLocat}储位对应的信息"); } try { task.Status = "2";//任务状态 task.IsSend = 0; task.IsCancel = 0; task.IsFinish = 0; task.FinishDate = DateTime.Now;//完成时间 Db.Updateable(task).ExecuteCommand(); #region 修改储位状态 //原储位改为空储位 0 locate.Status = "0"; Db.Updateable(locate).ExecuteCommand(); //目标储位改为有货物 1 locate2.Status = "1"; Db.Updateable(locate2).ExecuteCommand(); foreach (var item in stockDetail) { item.WareHouseNo = locate2.WareHouseNo; item.AreaNo = locate2.AreaNo; item.RoadwayNo = locate2.RoadwayNo; item.LocatNo = locate2.LocatNo; } Db.Updateable(stockDetail).ExecuteCommand(); #endregion Db.CommitTran(); } catch (Exception ex) { Db.RollbackTran(); throw new Exception(ex.Message); } } catch (Exception ex) { throw new Exception("完成反馈失败:" + ex.Message); } } //重新下发出库任务 public OutCommandDto AgainSendSoTask(string taskNo, int userId, string url) { Wms/WMS.Entity/DataEntity/DataBoxInfo.cs
@@ -79,10 +79,10 @@ /// Default: /// Nullable:True /// </summary> public decimal? FullQty {get;set;} public decimal? FullQty {get;set; } /// <summary> /// Desc:状态 /// Desc:状态 0 未组托 1已组托 2 已入库 3 已出库 4 已分配 5 已拣货 /// Default: /// Nullable:True /// </summary> Wms/WMS.Entity/DataEntity/DataStockDetail.cs
@@ -269,6 +269,12 @@ /// Nullable:True /// </summary> public string Demo { get; set; } /// <summary> /// Desc:是否需要收货托盘 1 车间收货 2 仓库收货 /// Default: /// Nullable:True /// </summary> public string UDF5 { get; set; } } } Wms/WMS.Entity/LogEntity/LogTask.cs
@@ -136,7 +136,7 @@ /// <summary> /// Desc:状态 /// Default:0 等待执行 1 正在执行 2 执行完成 3 异常结束 4 已取消 /// Default:0 等待执行 1 正在执行 2 执行完成 3 异常结束 4 已取消 5等待确认 /// Nullable:True /// </summary> public string Status {get;set;} Wms/WMS.IBLL/IBllSoServer/IExportNoticeServer.cs
@@ -195,8 +195,6 @@ /// <returns>下发的指令集合</returns> List<OutCommandDto> IssueOutHouse(string soNo, string unstackingMode, string outMode, string loadingAddre, int userId,string url,out string str); /// <summary> /// wcs返回的成功信号或手动完成(出库成功) /// </summary> @@ -213,6 +211,13 @@ void RelocationSuccess(string taskNo, int userId); /// <summary> /// AGV任务取货完成反馈 /// </summary> /// <param name="taskNo"></param> void AGVQuHuoSuccess(string taskNo); /// <summary> /// 重新下发出库任务 /// </summary> /// <param name="taskNo">任务号</param> Wms/WMS.IBLL/IPdaServer/IPdaCrServer.cs
@@ -156,6 +156,21 @@ #region 箱码拆箱贴标 //箱码拆箱添加标签信息 void AddLableByDevanning(string boxNo,decimal devanQty, int userId); /// <summary> /// 根据收货托盘获取出库单信息 /// </summary> /// <param name="palletNo"></param> string GetReceiptSoNoByPallet(string palletNo); /// <summary> /// 车间收货 /// </summary> /// <param name="palletNo"></param> /// <param name="userId"></param> void ConfirmReceipt(string palletNo, int userId); #endregion Wms/Wms/Controllers/DownApiController.cs
@@ -504,7 +504,7 @@ } break; case "2"://盘库完成任务 if (model.TaskType == "1")//0:入库 1:出库 3:移库 if (model.TaskType == "1")//0:入库 1:出库 2:移库 { _crCheckSvc.CheckSuccess(model.TaskNo, 0); return Ok(new WcsModel { StatusCode = 0, Msg = "盘点出库完成" }); @@ -516,7 +516,7 @@ } break; case "3"://移库完成任务、优化储位 if (model.TaskType == "3") //0:入库 1:出库 3:移库 if (model.TaskType == "3") //0:入库 1:出库 2:移库 { //填写移库完成代码 } @@ -534,6 +534,31 @@ /// <summary> /// WCS反馈AGV任务取货完成 /// </summary> /// <returns></returns> [HttpPost] public IActionResult AGVQuHuoSuccess(ReceiveWcsSignal model) { var logStr = $@".\log\WCS\AGV取货完成反馈" + DateTime.Now.ToString("yyyyMMdd") + ".txt"; try { var jsonData = JsonConvert.SerializeObject(model); LogFile.SaveLogToFile($"AGV取货完成反馈:( {jsonData} ),", logStr); _exNoticeSvc.AGVQuHuoSuccess(model.TaskNo); var data = new HttpReturnModel { Success = "0", Message = "成功" }; LogFile.SaveLogToFile($"AGV取货完成反馈:({JsonConvert.SerializeObject(data)}),", logStr); return Ok(data); } catch (Exception e) { LogFile.SaveLogToFile($"AGV取货完成反馈:( {e.Message} ),", logStr); return Ok(new HttpReturnModel { Success = "-1", Message = e.Message }); } } /// <summary> /// 空取异常 /// </summary> /// <returns></returns> Wms/Wms/Controllers/PdaCrController.cs
@@ -323,5 +323,50 @@ } #endregion #region 确认收货 /// <summary> /// 根据收货托盘获取出库单信息 /// </summary> /// <param name="model"></param> /// <returns></returns> [HttpPost] public IActionResult GetReceiptSoNoByPallet(PdaReceiptVm model) { try { var soNo = _pdaCrSvc.GetReceiptSoNoByPallet(model.PalletNo); return Ok(new { data = soNo, code = 0, msg = "成功" }); } catch (Exception e) { return Ok(new { data = "", code = 1, msg = $"异常:{e.Message}" }); } } /// <summary> /// 确认收货 /// </summary> /// <param name="model"></param> /// <returns></returns> [HttpPost] public IActionResult ConfirmReceipt(PdaReceiptVm model) { try { _pdaCrSvc.ConfirmReceipt(model.PalletNo, _userManager.UserId); return Ok(new { data = "", code = 0, msg = "成功" }); } catch (Exception e) { return Ok(new { data = "", code = 1, msg = $"异常:{e.Message}" }); } } #endregion } }