HTML/views/SOSetting/ComBoxInfo.html
@@ -58,6 +58,7 @@ layer = layui.layer; var h1 = GetTableHeight(); var boxNo = getQueryString('BoxNo'); var SONo = getQueryString('SONo'); if (!boxNo) { boxNo = ""; @@ -70,6 +71,7 @@ refreshTable(); function refreshTable() { var param={ SONo: getQueryString('SONo'), BoxNo:getQueryString('BoxNo'), BoxNo3:$("#BoxNo3").val() } @@ -113,6 +115,9 @@ { field: 'PalletNo', title: '托盘条码', align: 'center', width: 110, }, { field: 'BoxNo2', title: '盒码', align: 'center', width: 220, }, { field: 'BoxNo3', title: '支码', align: 'center', width: 220, }, HTML/views/SOSetting/ExportAllot.html
@@ -876,7 +876,7 @@ layer.open({ type: 2, title: '箱支详情信息', content: 'ComBoxInfo.html?BoxNo=' + BoxNo, content: 'ComBoxInfo.html?BoxNo=' + BoxNo+'&SONo='+data.SONo, maxmin: true, area: ['80%', '85%'], btn: ['关闭'], HTML/views/SOSetting/ExportNotice.html
@@ -368,7 +368,7 @@ </a>`; } if( d.Status == '2' || d.Status == '3'){ if( (d.Status == '2' || d.Status == '3') && d.Type=='0'){ html += `<a class="layui-btn layui-btn-normal layui-btn-xs outClass" lay-event="outKu"> <i class="layui-icon layui-icon-ok"></i>出库 </a>`; HTML/views/SOSetting/ExportNoticeAddFrom.html
@@ -403,10 +403,10 @@ var item = { SkuNo: infoOptions.data[i].SkuNo, LotNo: infoOptions.data[i].LotNo, Qty: parseFloat(infoOptions.data[i].Qty), // 保留4位小数精度 Qty: parseFloat(formattedExQty),//parseFloat(infoOptions.data[i].Qty), // 保留4位小数精度 IsBale: infoOptions.data[i].IsBale, IsBelt: infoOptions.data[i].IsBelt, ExQty: parseFloat(formattedExQty), //ExQty: parseFloat(formattedExQty), }; DataList.push(item); HTML/views/SOSetting/PalletNoOut.html
@@ -88,13 +88,7 @@ <div class="layui-input-inline"> <select name="PickingArea" id="PickingArea" lay-search> <option value=""></option> <option value="B020101">一楼-1</option> <option value="B020102">一楼-2</option> <option value="B020103">一楼-3</option> <option value="B020104">一楼-4</option> <option value="B050101">二楼-1</option> <option value="B050102">二楼-2</option> <option value="B050103">二楼-3</option> </select> </div> </div> @@ -405,8 +399,17 @@ //监听数据操作 table.on('tool(LAY-app-content-list)', function(obj) { var data = obj.data; if(obj.event === 'outKu'){ $("#PickingArea").empty(); $("#PickingArea").append('<option value =""></option>'); if(data.WareHouseNo=='W02'){ $("#PickingArea").append('<option value ="B020101">一楼-1</option><option value ="B020102">一楼-2</option><option value ="B020103">一楼-3</option><option value="B020104">一楼-4</option><option value="B050101">二楼-1</option><option value="B050102">二楼-2</option><option value="B050103">二楼-3</option>'); }else if(data.WareHouseNo=='W01'){ $("#PickingArea").append('<option value="17">17工位</option><option value="18">18工位</option>'); } form.render('select'); layer.open({ type: 1, title: '确认出库口', HTML/views/StatisticalReport/InventoryStatistics.html
@@ -149,6 +149,22 @@ placeholder="结束时间"> </div> </div> --> <div class="layui-inline"> <label class="layui-form-label" style="width: 60px;">所属仓库</label> <div class="layui-input-inline"> <select name="WareHouseNo" id="WareHouseNo" lay-filter="getWareHouseNo" lay-search> <option value=""></option> </select> </div> </div> <div class="layui-inline"> <label class="layui-form-label" style="width: 60px;">所属区域</label> <div class="layui-input-inline"> <select name="AreaNo" id="AreaNo" lay-filter="getAreaNo" lay-search> <option value=""></option> </select> </div> </div> <div class="layui-inline sousuo"> <button class="layui-btn layui-btn-sm layuiadmin-btn-list" lay-submit lay-filter="LAY-app-contlist-search"> @@ -306,7 +322,7 @@ var TotalColsSysArr = encodeURIComponent(encodeURIComponent(JSON.stringify(TotalColsArr)))//将表头数据进行url编码 //#endregion //获取总量信息 function refreshTable(SelectType, SkuNo, SkuName, OwnerNo, OwnerName, LotNo, Status, InspectStatus) { function refreshTable(SelectType, SkuNo, SkuName, OwnerNo, OwnerName, LotNo, Status, InspectStatus, WareHouseNo, AreaNo) { //#region 自定义表头 var colsJson var param1 = { @@ -347,6 +363,8 @@ LotNo: LotNo, //批次号 Status: Status, //库存状态 = $("#Status").val(); InspectStatus: InspectStatus, //质检状态 = $("#InspectStatus").val(); WareHouseNo:WareHouseNo, //所属仓库 AreaNo:AreaNo//所属区域 }; sendData(IP + "/Statistical/GetInventoryList", param, 'get', function (res) { console.log(res) @@ -381,7 +399,9 @@ var OwnerName = $("#OwnerName").val(); var Status = $("#Status").val(); var InspectStatus = $("#InspectStatus").val(); refreshTable(SelectType, SkuNo, SkuName, OwnerNo, OwnerName, LotNo, Status, InspectStatus); var WareHouseNo = $("#WareHouseNo").val(); var AreaNo = $("#AreaNo").val(); refreshTable(SelectType, SkuNo, SkuName, OwnerNo, OwnerName, LotNo, Status, InspectStatus, WareHouseNo, AreaNo); }); @@ -414,6 +434,51 @@ }); //获取仓库下拉框信息 sendData(IP + "/Sys/GetWarehouseDic", {}, 'get', function (res) { if (res.code == 0) { //成功 for (var i = 0; i < res.data.length; i++) { $("#WareHouseNo").append('<option value =' + res.data[i].WareHouseNo + '>' + res.data[i].WareHouseNo + '-' + res.data[i].WareHouseName + '</option>'); } form.render('select'); } else { //不成功 layer.msg(res.msg, { icon: 2, time: 2000 //2秒关闭(如果不配置,默认是3秒) }, function () { }); } }); getAR(""); form.on('select(getWareHouseNo)', function (data) { console.log(data); getAR(data.value); }); function getAR(val) { //获取 区域下拉框 sendData(IP + "/Sys/GetStorageAreaByHouseNo?wareHouseNo=" + val, {}, 'get', function (res) { $("#AreaNo").empty(); $("#AreaNo").append('<option value =""></option>'); if (res.code == 0) { //成功 for (var i = 0; i < res.data.length; i++) { $("#AreaNo").append('<option value =' + res.data[i].AreaNo + '>' + res.data[i].AreaNo + '-' + res.data[i].AreaName + '</option>'); } form.render('select'); } else { //不成功 layer.msg('获取区域信息失败', { icon: 2, time: 2000 //2秒关闭(如果不配置,默认是3秒) }, function () { //回调 form.render('select'); }); } }); }; //#region 自定义表头 //自定义表头 active = { Pda/View/SoSetting/productOut.html
@@ -288,7 +288,7 @@ </div> </td> </tr> --> <tr> <!-- <tr> <td> <div class="layui-form-item layout-input" style="margin-top: 6px;"> <label class="layui-form-label lableWidth">追溯条码:</label> @@ -298,15 +298,14 @@ </div> </div> </td> </tr> </tr> --> <tr class="divPickQty1"> <td> <div class="layui-form-item layout-input" style="margin-top: 6px;"> <label class="layui-form-label lableWidth">拣货数量:</label> <div class="layui-input-block"> <input id="pickQty1" type="number" placeholder="请输入拣货数量" autocomplete="off" class="layui-input" oninput="value=value.replace(/^(0+)|[^\d]+/g,'')"> autocomplete="off" class="layui-input"> </div> </div> </td> @@ -971,20 +970,20 @@ }); return; } if (($('#boxNo3').val() != "" && ($('#pickQty1').val() != "" || $('#pickQty1').val() != 0))) { layer.msg("追溯条码和拣货数量不能同时输入!", { icon: 2, time: 2000 //2秒关闭(如果不配置,默认是3秒) }); return; } if ($('#pickQty1').val() != "" && $('#pickQty1').val() > parseInt($('#pickQty').val())) { layer.msg("拣货数量不能大于待拣数量!", { icon: 2, time: 2000 //2秒关闭(如果不配置,默认是3秒) }); return; } // if (($('#boxNo3').val() != "" && ($('#pickQty1').val() != "" || $('#pickQty1').val() != 0))) { // layer.msg("追溯条码和拣货数量不能同时输入!", { // icon: 2, // time: 2000 //2秒关闭(如果不配置,默认是3秒) // }); // return; // } // if ($('#pickQty1').val() != "" && $('#pickQty1').val() > parseInt($('#pickQty').val())) { // layer.msg("拣货数量不能大于待拣数量!", { // icon: 2, // time: 2000 //2秒关闭(如果不配置,默认是3秒) // }); // return; // } } // let boxQty = parseInt($('#boxQty').val()) // let qty = parseInt($('#qty').val()) @@ -1017,7 +1016,7 @@ "SoDetailId": $("#skuLotNo").val(), "PalletNo": $('#palletNo').val(), "BoxNo": $('#boxNo').val(), "BoxNo3": $('#boxNo3').val(), //"BoxNo3": $('#boxNo3').val(), "PickQty": $('#pickQty1').val() } sendData(IP + "/PdaSo/SoSetPick", param, 'post', function (res) { Wms/WMS.BLL/BllAsnServer/ArrivalNoticeServer.cs
@@ -777,10 +777,10 @@ return "-1:入库单状态已变更,不可删除!"; } if (asnModel.Origin != "录入" && asnModel.Origin != "采购单") { return "-1:上游系统下发的单据,不可删除;"; } //if (asnModel.Origin != "录入" && asnModel.Origin != "采购单") //{ // return "-1:上游系统下发的单据,不可删除;"; //} // 删除总单 var editDateTime = DateTime.Now; Wms/WMS.BLL/BllAsnServer/BllBoxInfoServer.cs
@@ -534,8 +534,17 @@ { throw new Exception("未查询到单据明细信息,请核实"); } var skuInfo = Db.Queryable<SysMaterials>().First(w => w.IsDel == "0" && w.SkuNo == asnDetail.SkuNo); if (skuInfo == null) { throw new Exception("未查询到物料信息,请核实"); } if (string.IsNullOrEmpty(skuInfo.PackagNo)) { throw new Exception("未查询到物料的包装信息,请核实"); } var packInfo = Db.Queryable<SysPackag>().First(m => m.IsDel == "0" && m.PackagNo == asnDetail.PackagNo); var packInfo = Db.Queryable<SysPackag>().First(m => m.IsDel == "0" && m.PackagNo == skuInfo.PackagNo); if (packInfo == null) { throw new Exception("未查询到单据明细中的物料包装信息"); @@ -781,7 +790,6 @@ maxBoxCode = maxBoxCode.Substring(0, maxBoxCode.Length-6) + (int.Parse(maxBoxCode.Substring(maxBoxCode.Length - 6, 6)) + 1).ToString().PadLeft(6, '0'); } DateTime? storeTime2 = null; // 将条码保存到原料条码表 var labelModel = new BllBoxInfo() { @@ -801,14 +809,26 @@ BitBoxMark = bNum > boxQty ? "1" : "0", InspectStatus = "0", ProductionTime = DateTime.Parse(productionTime), StoreTime = string.IsNullOrWhiteSpace(storeTime) ? storeTime2 : DateTime.Parse(storeTime ), ExpirationTime = DateTime.Parse(expirationTime), ProductionTime = null, StoreTime = null, ExpirationTime = null, Origin = "WMS生成", CreateUser = userId, CreateTime = DateTime.Now, }; if (!string.IsNullOrEmpty(productionTime)) { labelModel.ProductionTime = DateTime.Parse(productionTime); } if (!string.IsNullOrEmpty(storeTime)) { labelModel.StoreTime = DateTime.Parse(storeTime); } if (!string.IsNullOrEmpty(expirationTime)) { labelModel.ExpirationTime = DateTime.Parse(expirationTime); } Db.Insertable(labelModel).ExecuteCommand(); modelList.Add(labelModel); @@ -953,14 +973,26 @@ BitBoxMark = bNum > boxQty ? "1" : "0", InspectStatus = "0", ProductionTime = DateTime.Parse(productionTime), StoreTime = DateTime.Parse(storeTime), ExpirationTime = DateTime.Parse(expirationTime), ProductionTime = null, StoreTime = null, ExpirationTime = null, Origin = "WMS生成", CreateUser = userId, CreateTime = DateTime.Now, }; if (!string.IsNullOrEmpty(productionTime)) { labelModel.ProductionTime = DateTime.Parse(productionTime); } if (!string.IsNullOrEmpty(storeTime)) { labelModel.StoreTime = DateTime.Parse(storeTime); } if (!string.IsNullOrEmpty(expirationTime)) { labelModel.ExpirationTime = DateTime.Parse(expirationTime); } Db.Insertable(labelModel).ExecuteCommand(); modelList.Add(labelModel); Wms/WMS.BLL/BllPdaServer/PdaAsnServer.cs
@@ -126,11 +126,11 @@ throw new Exception("当前物料及批次与单据无关联,请核实!"); } //判断托盘是否在库外 var stockDetail = Db.Queryable<DataStockDetail>().First(m => m.IsDel == "0" && m.PalletNo == model.PalletNo); if (stockDetail != null && !string.IsNullOrEmpty(stockDetail.WareHouseNo)) { throw new Exception("该托盘已有储位信息,不可组托,请核实!"); } //var stockDetail = Db.Queryable<DataStockDetail>().First(m => m.IsDel == "0" && m.PalletNo == model.PalletNo); //if (stockDetail != null && !string.IsNullOrEmpty(stockDetail.WareHouseNo)) //{ // throw new Exception("该托盘已有储位信息,不可组托,请核实!"); //} #endregion @@ -272,13 +272,13 @@ } // 判断库存明细是否已有此托盘信息 var sd1 = Db.Queryable<DataStockDetail>().First(m => m.IsDel == "0" && m.ASNDetailNo == bind.ASNDetailNo && m.PalletNo == model.PalletNo); var sd1 = Db.Queryable<DataStockDetail>().First(m => m.IsDel == "0" && m.PalletNo == model.PalletNo && m.LotNo == detail.LotNo && m.SkuNo == detail.SkuNo);// && m.ASNDetailNo == bind.ASNDetailNo var sdId1 = 0; if (sd1 != null) { sdId1 = sd1.Id; // 库存已存在 更新数据 sd1.Qty = bind.Qty; sd1.Qty += bind.Qty; sd1.CompleteTime = comTime; sd1.UpdateUser = userId; sd1.UpdateTime = comTime; @@ -286,7 +286,7 @@ Db.Updateable(sd1).ExecuteCommand(); } else { { // 库存不存在 插入数据 sd1 = new DataStockDetail() { @@ -325,6 +325,14 @@ CreateUser = 0, CreateTime = comTime }; var palletData = Db.Queryable<DataStockDetail>().First(w => w.IsDel == "0" && w.PalletNo == sd1.PalletNo && !string.IsNullOrEmpty(w.LocatNo)); if (palletData != null) { sd1.WareHouseNo = palletData.WareHouseNo; sd1.RoadwayNo = palletData.RoadwayNo; sd1.AreaNo = palletData.AreaNo; sd1.LocatNo = palletData.LocatNo; } //维护库存明细货主/供应商信息 //0:成品入库,2:中间品入库,4:车间余料入库,6:代储入库,7:寄存入库 if (notice.Type == "0" || notice.Type == "2" || notice.Type == "4" || notice.Type == "6" || notice.Type == "7") @@ -484,6 +492,10 @@ } detail.UpdateUser = userId; detail.UpdateTime = comTime; if (notice.Type == "4" || notice.Type == "8") { detail.InspectStatus = "1";//车间退料默认检验合格 } //更新入库单明细 Db.Updateable(detail).ExecuteCommand(); @@ -504,7 +516,10 @@ #endregion #region 库存明细 sd1.Qty = bind.Qty; if (sd1.Qty <= 0) { sd1.Qty = bind.Qty; } //更改库存明细数量 Db.Updateable(sd1).Where(m => m.Id == sdId1).ExecuteCommand(); #endregion @@ -1822,7 +1837,7 @@ } } else if (notice.Type == "1" || notice.Type == "4") //采购入库 else if (notice.Type == "1" || notice.Type == "4" || notice.Type == "8") //采购入库 { string sqlString = $@"SELECT ASNNo, @@ -2726,7 +2741,7 @@ ExpirationTime = boxInfoOne.ExpirationTime, Status = "0", InspectMark = boxInfoOne.InspectMark, InspectStatus = sku.IsInspect, InspectStatus = "1",//sku.IsInspect,//从车间入库的质检状态默认合格 BitPalletMark = "1", PackagNo = sku.PackagNo, Wms/WMS.BLL/BllPdaServer/PdaCrServer.cs
@@ -1585,9 +1585,9 @@ } //开启事务 Db.BeginTran(); //库存箱支明细信息 var boxList = Db.Queryable<DataBoxInfo>().Where(w => w.IsDel == "0" && w.BoxNo == boxNo).ToList(); var boxList = Db.Queryable<DataBoxInfo>().Where(w => w.IsDel == "0" && w.BoxNo == boxNo && w.Status == "2").ToList(); if (boxList.Count != 1) { throw new Exception("该箱码信息错误,存在多个此箱码信息"); Wms/WMS.BLL/BllPdaServer/PdaSoServer.cs
@@ -92,7 +92,7 @@ } //出库分配信息 var allot = await Db.Queryable<BllExportAllot>().FirstAsync(m => m.IsDel == "0" && (m.Status == "2" || m.Status == "3") && m.SONo == soNo && m.IsDel == "0" && (m.Status == "2" || m.Status == "3" || m.Status == "5") && m.SONo == soNo && m.SODetailNo == int.Parse(soDetailId) && m.PalletNo == palletNo); if (allot == null) { @@ -322,7 +322,7 @@ else { List<DataBoxInfo> boxInfos; var boxInfo = Db.Queryable<DataBoxInfo>().Where(m => m.IsDel == "0" && m.BoxNo == boxNo); var boxInfo = Db.Queryable<DataBoxInfo>().Where(m => m.IsDel == "0" && m.BoxNo == boxNo && m.Status == "2"); if (await boxInfo.CountAsync() == 0) { throw Oops.Bah("未查询到该箱码的信息"); @@ -1852,7 +1852,7 @@ return allotList; } //获取状态为待拣货或者部分拣货的出库单 var allotList2 = await Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && (m.Status == "2" || m.Status == "3") && m.PalletNo == palletNo).Select(m => m.SONo).Distinct().Where(m => !string.IsNullOrWhiteSpace(m)).ToListAsync(); var allotList2 = await Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && (m.Status == "2" || m.Status == "3" || m.Status == "5") && m.PalletNo == palletNo).Select(m => m.SONo).Distinct().Where(m => !string.IsNullOrWhiteSpace(m)).ToListAsync(); //var allotList = Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && m.PalletNo == palletNo).Select(m => m.SONo).Distinct().Where(m => !string.IsNullOrWhiteSpace(m)).ToList(); //获取出库单据不为待拣货 执行完毕 订单关闭 等待执行的单据 @@ -1927,7 +1927,7 @@ throw Oops.Bah("托盘码为空,请输入托盘码"); } //获取状态为待拣货或者部分拣货的出库单 var allotList = Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && (m.Status == "2" || m.Status == "3") && m.PalletNo == palletNo); var allotList = Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && (m.Status == "2" || m.Status == "3" || m.Status == "5") && m.PalletNo == palletNo); //var allotList = Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && m.SONo == soNo && m.Status != "4" && m.Status != "5"); if (!string.IsNullOrWhiteSpace(soNo)) { @@ -1949,7 +1949,7 @@ //获取出库口、规格、待拣及已拣数量(根据出库单明细ID、托盘号) public async Task<OutPdaInfo> GetOutlets(string soDetailId, string palletNo) { var allotInfo = await Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && m.SODetailNo == int.Parse(soDetailId) && m.PalletNo == palletNo && (m.Status == "2" || m.Status == "3")).ToListAsync(); var allotInfo = await Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && m.SODetailNo == int.Parse(soDetailId) && m.PalletNo == palletNo && (m.Status == "2" || m.Status == "3" || m.Status == "5")).ToListAsync(); if (allotInfo.Count == 0) { throw Oops.Bah($"{palletNo}托盘上未查询到分配信息,请核实"); @@ -2033,7 +2033,7 @@ } if (!string.IsNullOrWhiteSpace(soDetailId)) { var allotInfos = await Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && m.SODetailNo == int.Parse(soDetailId) && m.PalletNo == palletNo && (m.Status == "2" || m.Status == "3")).ToListAsync(); var allotInfos = await Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && m.SODetailNo == int.Parse(soDetailId) && m.PalletNo == palletNo && (m.Status == "2" || m.Status == "3" || m.Status == "5")).ToListAsync(); if (allotInfos.Count == 0) { throw Oops.Bah($"{palletNo}托盘上未查询到分配信息,请核实"); @@ -2603,6 +2603,510 @@ } } /// <summary> /// 出库pda拣货-JC34 /// </summary> /// <param name="soNo"></param> /// <param name="soDetailId"></param> /// <param name="palletNo"></param> /// <param name="boxNo">箱码/盒码/支码</param> /// <param name="pickQty1"></param> /// <param name="userId"></param> /// <returns></returns> /// <exception cref="Exception"></exception> public async Task SoSetPick34(string soNo, string soDetailId, string palletNo, string boxNo, string pickQty1, int userId) { Db.BeginTran(); try { #region 判断 if (string.IsNullOrWhiteSpace(soNo)) { throw Oops.Bah("出库单据不能为空"); } if (string.IsNullOrWhiteSpace(soDetailId)) { throw Oops.Bah("出库物料-批次不能为空"); } if (string.IsNullOrWhiteSpace(palletNo)) { throw Oops.Bah("托盘码不能为空"); } //if (!string.IsNullOrEmpty(boxNo3) && !string.IsNullOrEmpty(pickQty1) && int.Parse(pickQty1) > 0) //{ // throw Oops.Bah("追溯条码和拣货数量不能同时输入"); //} //出库单 var notice = await Db.Queryable<BllExportNotice>().FirstAsync(m => m.IsDel == "0" && m.SONo == soNo); if (notice == null) { throw Oops.Bah("未查询到该出库单的信息"); } if (notice.Status != "3" && notice.Status != "4") { throw Oops.Bah("出库单的状态不是正在执行,不能拣货"); } //出库单明细 var noticeDetail = await Db.Queryable<BllExportNoticeDetail>() .FirstAsync(m => m.IsDel == "0" && m.Id == int.Parse(soDetailId)); if (noticeDetail == null) { throw Oops.Bah("未查询到该出库单明细的信息"); } //出库分配信息 var allot = await Db.Queryable<BllExportAllot>().FirstAsync(m => m.IsDel == "0" && (m.Status == "2" || m.Status == "3" || m.Status == "5") && m.SONo == soNo && m.SODetailNo == int.Parse(soDetailId) && m.PalletNo == palletNo); if (allot == null) { throw Oops.Bah("未查询到该托盘的分配信息"); } //剩余拣货数量(待拣减去已拣) var needQty = allot.Qty - allot.CompleteQty; //库存明细 var stockDetail = await Db.Queryable<DataStockDetail>().FirstAsync(m => m.IsDel == "0" && m.Id == allot.StockId); if (stockDetail == null) { throw Oops.Bah("未查询到该托盘分配的库存明细信息!"); } //库存总表 var stock = await Db.Queryable<DataStock>().FirstAsync(a => a.IsDel == "0" && a.SkuNo == stockDetail.SkuNo && a.LotNo == stockDetail.LotNo); if (stock == null) { throw Oops.Bah("未查询到该托盘分配的库存信息!"); } #endregion if (string.IsNullOrWhiteSpace(boxNo))//整托拣货 { List<DataBoxInfo> boxInfos; var boxInfo = Db.Queryable<DataBoxInfo>().Where(m => m.IsDel == "0" && m.PalletNo == palletNo && m.SkuNo == stockDetail.SkuNo && m.LotNo == stockDetail.LotNo);//找到托盘上所有箱码 boxInfos = await boxInfo.ToListAsync(); if (boxInfo.Count() <= 0) { throw Oops.Bah("该托盘上没有可拣货的箱子"); } var boxQty = await boxInfo.GroupBy(m => m.PalletNo).Select(m => SqlFunc.AggregateSum(m.Qty)).ToListAsync(); if (boxQty[0] > needQty) { throw Oops.Bah("拣货数量不能大于箱内剩余待拣数量"); } decimal pickQty = 0;//拣货的数量 var comDetailList = await Db.Queryable<BllCompleteDetail>().Where(m => m.IsDel == "0" && m.ExportAllotId == allot.Id && m.PalletNo == palletNo).ToListAsync(); var comList = new List<BllCompleteDetail>(); foreach (var item in boxInfos) { if (comDetailList.Any(m => m.BoxNo3 == item.BoxNo3) && item.BoxNo3 != null) { throw Oops.Bah($"当前{item.BoxNo}中{item.BoxNo3}已拣货完成,请勿重复拣货"); } if (item.SkuNo != allot.SkuNo || item.LotNo != allot.LotNo) { throw Oops.Bah("当前托盘上有其他不同物料批次,拣货失败"); } //添加拣货明细 var completeDetail = new BllCompleteDetail() { SONo = soNo, SODetailNo = int.Parse(soDetailId), ExportAllotId = allot.Id, StockId = allot.StockId, BoxNo = item.BoxNo, BoxNo2 = item.BoxNo2, BoxNo3 = item.BoxNo3, LotNo = allot.LotNo, LotText = allot.LotText, SupplierLot = allot.SupplierLot, SkuNo = allot.SkuNo, SkuName = allot.SkuName, Standard = allot.Standard, PalletNo = palletNo, CompleteQty = item.Qty, CreateUser = userId }; comList.Add(completeDetail); //删除库存箱码明细 await Db.Deleteable(item).ExecuteCommandAsync(); pickQty += item.Qty; } //添加拣货明细 await Db.Insertable(comList).ExecuteCommandAsync(); //修改出库分配信息 allot.CompleteQty += pickQty; allot.Status = allot.Qty <= allot.CompleteQty ? "5" : "3"; allot.UpdateTime = DateTime.Now; await Db.Updateable(allot).ExecuteCommandAsync(); //删除库存明细 await Db.Deleteable(stockDetail).ExecuteCommandAsync(); //删除或修改库存 stock.Qty -= pickQty; stock.LockQty -= pickQty; if (stock.LockQty < 0) { stock.LockQty = 0; } if (stock.Qty <= 0) { await Db.Deleteable(stock).ExecuteCommandAsync(); } else { await Db.Updateable(stock).ExecuteCommandAsync(); } //判断托盘上还有没有其他物料 var palletData = Db.Queryable<DataStockDetail>().First(w => w.IsDel == "0" && w.PalletNo == palletNo && w.Id != stockDetail.Id); if (palletData == null) { //改变托盘状态为:未使用 var pallet = Db.Queryable<SysPallets>().First(m => m.PalletNo == palletNo && m.IsDel == "0"); if (pallet == null) { throw Oops.Bah("未在托盘表中查询到托盘信息"); } pallet.Status = "0"; await Db.Updateable(pallet).ExecuteCommandAsync(); } //修改出库单明细拣货数量 noticeDetail.CompleteQty += pickQty; await Db.Updateable(noticeDetail).ExecuteCommandAsync(); var num = await Db.Queryable<BllExportNoticeDetail>() .CountAsync(m => m.IsDel == "0" && m.SONo == soNo && m.CompleteQty < m.Qty); if (num <= 0) { notice.Status = "4"; //更改为执行完成 //修改出库单信息 await Db.Updateable(notice).ExecuteCommandAsync(); if (notice.IsWave == "1") { var waveNum = await Db.Queryable<BllExportNotice>().CountAsync(m => m.IsDel == "0" && m.WaveNo == notice.WaveNo && m.Status != "4"); if (waveNum == 0) { var wave = await Db.Queryable<BllWaveMage>().FirstAsync(m => m.IsDel == "0" && m.WaveNo == notice.WaveNo); if (wave != null) { wave.Status = "4"; wave.UpdateUser = userId; wave.UpdateTime = DateTime.Now; await Db.Updateable(wave).ExecuteCommandAsync(); } } } } } else { var biaoShi = "0";//0:整箱拣货、1:整盒拣货、 2:散支拣货、3:数量拣货 List<DataBoxInfo> boxInfos; var boxInfo = Db.Queryable<DataBoxInfo>().Where(m => m.IsDel == "0" && m.BoxNo == boxNo); if (await boxInfo.CountAsync() == 0) { biaoShi = "1"; boxInfo = Db.Queryable<DataBoxInfo>().Where(m => m.IsDel == "0" && m.BoxNo2 == boxNo); if (await boxInfo.CountAsync() == 0) { biaoShi = "2"; boxInfo = Db.Queryable<DataBoxInfo>().Where(m => m.IsDel == "0" && m.BoxNo3 == boxNo); if (await boxInfo.CountAsync() == 0) { throw Oops.Bah("未查询到该箱码及追溯码的信息"); } } } if (biaoShi == "0" && !string.IsNullOrEmpty(pickQty1) && decimal.Parse(pickQty1) > 0) { biaoShi = "3"; } if (biaoShi == "2" && !string.IsNullOrEmpty(pickQty1) && decimal.Parse(pickQty1) > 0) { throw Oops.Bah("追溯条码和拣货数量不能同时输入"); } boxInfos = await boxInfo.ToListAsync(); var comDetailList = Db.Queryable<BllCompleteDetail>().Where(m => m.IsDel == "0" && m.ExportAllotId == allot.Id && m.PalletNo == palletNo).ToList(); if (biaoShi == "2") //散支拣货 { boxInfos = boxInfos.Where(m => m.BoxNo3 == boxNo).ToList(); if (boxInfos.Count() == 0) { throw Oops.Bah("未查询到该箱码及追溯码的信息"); } if (boxInfos.Count() > 1) { throw Oops.Bah("该追溯支码的信息大于1条,信息错误,请核实!"); } if (boxInfos.Any(m => m.PalletNo != palletNo)) { throw Oops.Bah("该托盘与箱码没有绑定关系"); } var boxQty = boxInfos.First().Qty; //if (boxQty > needQty) //{ // throw Oops.Bah("拣货数量不能大于剩余待拣数量"); //} foreach (var item in boxInfos) { if (comDetailList.Any(m => m.BoxNo3 == item.BoxNo3)) { throw Oops.Bah($"当前{item.BoxNo}中{item.BoxNo3}已拣货完成,请勿重复拣货"); } } } else if (biaoShi == "1")//整盒拣货 { if (boxInfo.Count() == 0) { throw Oops.Bah("未查询到该盒码的信息"); } if (boxInfo.Any(m => m.PalletNo != palletNo)) { throw Oops.Bah("该托盘与盒码没有绑定关系"); } var boxQty = await boxInfo.GroupBy(m => m.BoxNo2).Select(m => SqlFunc.AggregateSum(m.Qty)).ToListAsync(); //if (boxQty[0] > needQty) //{ // throw Oops.Bah("拣货数量不能大于箱内剩余待拣数量"); //} foreach (var item in boxInfos) { if (comDetailList.Any(m => m.BoxNo3 == item.BoxNo3)) { throw Oops.Bah($"当前{item.BoxNo}中{item.BoxNo3}已拣货完成,请勿重复拣货"); } } } else if (biaoShi == "3")//数量拣货 { if (boxInfo.Count() > 1) { throw Oops.Bah("该箱码内存在支码不能进行数量拣货"); } decimal boxQty = boxInfo.First().Qty; if (Convert.ToDecimal(pickQty1) > boxQty) { throw Oops.Bah("拣货数量不能大于箱内数量"); } //if (Convert.ToInt32(pickQty1) > needQty) //{ // throw Oops.Bah("拣货数量不能大于剩余待拣数量"); //} } else //整箱拣货 { if (boxInfo.Count() == 0) { throw Oops.Bah("未查询到该箱码的信息"); } if (boxInfo.Any(m => m.PalletNo != palletNo)) { throw Oops.Bah("该托盘与箱码没有绑定关系"); } var boxQty = await boxInfo.GroupBy(m => m.BoxNo).Select(m => SqlFunc.AggregateSum(m.Qty)).ToListAsync(); //if (boxQty[0] > needQty) //{ // throw Oops.Bah("拣货数量不能大于箱内剩余待拣数量"); //} foreach (var item in boxInfos) { if (comDetailList.Any(m => m.BoxNo == item.BoxNo)) { throw Oops.Bah($"当前{item.BoxNo}已拣货完成,请勿重复拣货"); } } } decimal pickQty = 0;//拣货的数量 var comList = new List<BllCompleteDetail>(); foreach (var item in boxInfos) { //添加拣货明细 var completeDetail = new BllCompleteDetail() { SONo = soNo, SODetailNo = int.Parse(soDetailId), ExportAllotId = allot.Id, StockId = allot.StockId, BoxNo = item.BoxNo, BoxNo2 = item.BoxNo2, BoxNo3 = item.BoxNo3, LotNo = allot.LotNo, LotText = allot.LotText, SupplierLot = allot.SupplierLot, SkuNo = allot.SkuNo, SkuName = allot.SkuName, Standard = allot.Standard, PalletNo = palletNo, CompleteQty = biaoShi == "3" ? decimal.Parse(pickQty1) : item.Qty, CreateUser = userId }; comList.Add(completeDetail); if (biaoShi != "3") { //删除库存箱码明细 await Db.Deleteable(item).ExecuteCommandAsync(); pickQty += item.Qty; } else//数量拣货 { if (decimal.Parse(pickQty1) == item.Qty) { //删除库存箱码明细 await Db.Deleteable(item).ExecuteCommandAsync(); } else { item.Qty -= decimal.Parse(pickQty1); item.BitBoxMark = "1";//零箱标识 await Db.Updateable(item).ExecuteCommandAsync(); } pickQty += decimal.Parse(pickQty1); } } //改变库内箱码是否零箱信息 if (biaoShi == "1" || biaoShi == "2") { var boxSurplusList = new List<DataBoxInfo>(); if (biaoShi == "1") { boxSurplusList = boxInfo.Where(m => m.BoxNo2 != boxNo).ToList(); } else { boxSurplusList = boxInfo.Where(m => m.BoxNo3 != boxNo).ToList(); } foreach (var item in boxSurplusList) { item.BitBoxMark = "1"; await Db.Updateable(item).ExecuteCommandAsync(); } } await Db.Insertable(comList).ExecuteCommandAsync(); //修改出库分配信息 allot.CompleteQty += pickQty; allot.Status = allot.Qty <= allot.CompleteQty ? "5" : "3"; allot.UpdateTime = DateTime.Now; if (allot.Status == "5") { //判断该托盘是否还存在物料 存在改为待回库 待回库完成后改为已完成 } await Db.Updateable(allot).ExecuteCommandAsync(); //删除或修改库存明细 stockDetail.BitPalletMark = "1";//修改为零托标识 stockDetail.Qty -= pickQty; stockDetail.LockQty -= pickQty; if (stockDetail.LockQty < 0) { stockDetail.LockQty = 0; } if (stockDetail.Qty == stockDetail.LockQty) { stockDetail.Status = "2"; } else if (stockDetail.Qty > stockDetail.LockQty && stockDetail.LockQty > 0) { stockDetail.Status = "1"; } else { stockDetail.Status = "0"; } if (stockDetail.Qty <= 0) { await Db.Deleteable(stockDetail).ExecuteCommandAsync(); } else { await Db.Updateable(stockDetail).ExecuteCommandAsync(); } stock.Qty -= pickQty; stock.LockQty -= pickQty; if (stock.LockQty < 0) { stock.LockQty = 0; } if (stock.Qty <= 0) { await Db.Deleteable(stock).ExecuteCommandAsync(); } else { await Db.Updateable(stock).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) { throw Oops.Bah("未在托盘表中查询到托盘信息"); } pallet.Status = "0"; await Db.Updateable(pallet).ExecuteCommandAsync(); } //修改出库单明细拣货数量 noticeDetail.CompleteQty += pickQty; await Db.Updateable(noticeDetail).ExecuteCommandAsync(); var num = await Db.Queryable<BllExportNoticeDetail>() .CountAsync(m => m.IsDel == "0" && m.SONo == soNo && m.CompleteQty < m.Qty); if (num <= 0) { notice.Status = "4"; //更改为执行完成 //修改出库单信息 await Db.Updateable(notice).ExecuteCommandAsync(); if (notice.IsWave == "1") { var waveNum = await Db.Queryable<BllExportNotice>() .CountAsync(m => m.IsDel == "0" && m.WaveNo == notice.WaveNo && m.Status != "4"); if (waveNum == 0) { var wave = await Db.Queryable<BllWaveMage>().FirstAsync(m => m.IsDel == "0" && m.WaveNo == notice.WaveNo); if (wave != null) { wave.Status = "4"; wave.UpdateUser = userId; wave.UpdateTime = DateTime.Now; await Db.Updateable(wave).ExecuteCommandAsync(); } } } } } //添加操作日志记录 var k = new OperationSOServer().AddLogOperationSo("PDA模块", "拣货出库", soNo, "拣货", $"在PDA上对出库单号为:{soNo}的托盘码为:{palletNo}的拣货操作", userId); Db.CommitTran(); } //catch (AppFriendlyException e) //{ // Db.RollbackTran(); //} catch (Exception e) { Db.RollbackTran(); throw new Exception(e.Message); } } //出库pda拣货 public async Task SoSetQtyPick(string soNo, string soDetailId, string palletNo, string PickQty, int userId) { Wms/WMS.BLL/BllSoServer/CompleteDetailServer.cs
@@ -70,11 +70,12 @@ } //查询拣货明细支码详细信息 public List<CompleteDetailDto> GetCompBoxInfoList(string boxNo, string boxNo3) public List<CompleteDetailDto> GetCompBoxInfoList(string sONo, string boxNo, string boxNo3) { try { Expression<Func<BllCompleteDetail, bool>> item = Expressionable.Create<BllCompleteDetail>() .AndIF(!string.IsNullOrWhiteSpace(sONo), it => it.SONo == sONo.Trim()) .AndIF(!string.IsNullOrWhiteSpace(boxNo), it => it.BoxNo == boxNo.Trim()) .AndIF(!string.IsNullOrWhiteSpace(boxNo3), it => it.BoxNo3.Contains(boxNo3.Trim())) .ToExpression(); @@ -90,6 +91,7 @@ ExportAllotId = a.ExportAllotId, BoxNo = a.BoxNo, BoxNo2 = a.BoxNo2, BoxNo3 = a.BoxNo3, LotNo = a.LotNo, LotText = a.LotText, Wms/WMS.BLL/BllSoServer/ExportNoticeServer.cs
@@ -30,6 +30,7 @@ using System.Drawing.Drawing2D; using Model.ModelDto.LogDto; using AutoMapper.Internal; using System.Diagnostics.Contracts; namespace WMS.BLL.BllSoServer { @@ -398,7 +399,7 @@ { throw new Exception("批次不可为空!"); } } } //库存明细 List<DataStockDetail> stockDetails; //指定批次 @@ -522,7 +523,7 @@ q2 = q3; } if (q2 > d.skuQty - q1) { { if (!dic.ContainsKey(stockInfo.Id)) { dic.Add(stockInfo.Id, d.skuQty - q1); @@ -535,7 +536,7 @@ q1 += d.skuQty - q1; } else { { if (!dic.ContainsKey(stockInfo.Id)) { dic.Add(stockInfo.Id, (decimal)q2); @@ -599,7 +600,7 @@ var notice = new BllExportNotice() { SONo = billNo, OrderCode=model.orderNo, OrderCode = model.orderNo, Type = model.orderType, Status = "0", Origin = "SAP", @@ -609,7 +610,7 @@ IsWave = "0", WaveNo = "", IsDespatch = "0", CreateUser = 0, }; if (houseNo == "1000" || houseNo == "1001" || houseNo == "2000" || houseNo == "2002" || houseNo == "2003" || houseNo == "2004") @@ -775,14 +776,14 @@ throw new Exception(e.Message); } } //生产叫料 public bool MESProductionCall(ProductionCallVm model) { try { //验证是否备料完成 var notice = Db.Queryable<BllExportNotice>().First(m=>m.IsDel == "0" && m.OrderCode == model.OrderCode); var notice = Db.Queryable<BllExportNotice>().First(m => m.IsDel == "0" && m.OrderCode == model.OrderCode); if (notice == null) { throw new Exception("未查询到此工单号"); @@ -803,7 +804,7 @@ throw new Exception("当前单据物料在此投料口叫料信息已收到,无需重复下发"); } //判断当前投料口是否有其它工单投料 var call2 = Db.Queryable<BllProductionCallTask>().First(m => m.IsDel == "0" && m.PutInLocation == model.PutInLocation && m.OrderCode != model.OrderCode ); var call2 = Db.Queryable<BllProductionCallTask>().First(m => m.IsDel == "0" && m.PutInLocation == model.PutInLocation && m.OrderCode != model.OrderCode); if (call2 != null) { throw new Exception("此投料口有其它单据物料叫料信息"); @@ -834,7 +835,7 @@ foreach (var pro in proCallList) { foreach (var item in locateList) { { //获取备好料的托盘信息 var allotList = Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && m.Status == "2" && m.SONo == notice.SONo && m.SkuNo == pro.SkuNo && !list.Contains(m.Id)).Select(m => m.PalletNo).ToList(); @@ -862,7 +863,7 @@ }; Db.Insertable(exTask).ExecuteCommand(); //更改分配表的任务号列 var allot = Db.Queryable<BllExportAllot>().First(m=>m.IsDel == "0" && m.Status =="2" && m.SONo == notice.SONo && m.StockId == stockDetail.Id); var allot = Db.Queryable<BllExportAllot>().First(m => m.IsDel == "0" && m.Status == "2" && m.SONo == notice.SONo && m.StockId == stockDetail.Id); allot.TaskNo = taskNo; Db.Updateable(allot).ExecuteCommand(); list.Add(allot.Id); @@ -871,14 +872,14 @@ item.PalletNo = stockDetail.PalletNo; Db.Updateable(item).ExecuteCommand(); var locate = Db.Queryable<SysStorageLocat>().First(m=>m.LocatNo == stockDetail.LocatNo); var locate = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == stockDetail.LocatNo); locate.Status = "5"; Db.Updateable(locate).ExecuteCommand(); break; } } Db.CommitTran(); } @@ -887,7 +888,7 @@ Db.RollbackTran(); throw new Exception(e.Message); } return true; } catch (Exception e) @@ -927,8 +928,8 @@ .LeftJoin<SysUserInfor>((a, b, c) => a.CreateUser == c.Id) .LeftJoin<SysUserInfor>((a, b, c, d) => a.CreateUser == d.Id) .LeftJoin<SysUserInfor>((a, b, c, d, e) => a.CheckUser == e.Id) .LeftJoin<SysWareHouse>((a, b, c, d, e,f) => a.WareHouseNo == f.WareHouseNo) .Select((a, b, c, d, e,f) => new ExportNoticeDto() .LeftJoin<SysWareHouse>((a, b, c, d, e, f) => a.WareHouseNo == f.WareHouseNo) .Select((a, b, c, d, e, f) => new ExportNoticeDto() { Id = a.Id, SONo = a.SONo, @@ -987,7 +988,7 @@ switch (type)//0:原料 1:包材 2:成品 3:耗材 4:半成品 { case "0"://成品出库 if (house !="W01") if (house != "W01") { throw new Exception("成品出库只能选择成品库"); } @@ -1186,7 +1187,7 @@ switch (model.WareHouseNo) { case "W01"://成品库 if (skuList.Any(m=>m.Type !="2")) if (skuList.Any(m => m.Type != "2")) { throw new Exception("仓库与出库物料不符"); } @@ -2079,7 +2080,7 @@ .AndIF(!string.IsNullOrWhiteSpace(model.BitPalletMark), m => m.BitPalletMark == model.BitPalletMark) .And(m => !string.IsNullOrWhiteSpace(m.WareHouseNo)) .And(a => a.Status == "0") .And(a => a.WareHouseNo == "W02") .And(a => a.WareHouseNo == "W01" || a.WareHouseNo == "W02") .ToExpression(); var data = await Db.Queryable<DataStockDetail>().Where(item).OrderBy(m => m.LocatNo).ToPageListAsync(model.Page, model.Limit, count); //data.Select(m => m.Status == "0" && m.IsDel == "0"); @@ -2329,6 +2330,264 @@ } } /// <summary> /// 托盘出库(密集库) /// </summary> /// <param name="palletNo"></param> /// <param name="outMode"></param> /// <param name="userId"></param> /// <param name="url"></param> /// <param name="str"></param> /// <returns></returns> /// <exception cref="Exception"></exception> public List<OutCommandDto> IssuePalletNoOutMk(string palletNo, string outMode, int userId, string url, out string str) { try { //判断托盘号是否为空 if (string.IsNullOrWhiteSpace(palletNo)) { throw new Exception($"托盘号不能为空,请核实"); } str = ""; var stockDetailList = Db.Queryable<DataStockDetail>().Where(m => m.PalletNo == palletNo && m.IsDel == "0").ToList(); if (stockDetailList.Count == 0) { throw new Exception($"未在库内查询到该托盘信息"); } var stocka = Db.Queryable<DataStock>().First(a => a.IsDel == "0" && a.SkuNo == stockDetailList[0].SkuNo); //验证库存托盘状态 if (stockDetailList[0].Status != "0") { throw new Exception($"当前托盘未处于待分配状态,请核实!"); } //判断托盘库存信息分组后是否大于1条 var detailGroup = stockDetailList.GroupBy(m => new { m.SkuNo, m.PalletNo, m.WareHouseNo, m.LocatNo }).ToList(); if (detailGroup.Count > 1) { throw new Exception($"未在库内查询到该托盘信息"); } var locatStart = Db.Queryable<SysStorageLocat>().First(w => w.IsDel == "0" && w.LocatNo == stockDetailList[0].LocatNo && w.Status == "1"); if (locatStart == null) { throw new Exception($"起始储位不存在或非空闲,请检查"); } #region 集合 var outDto1 = new List<OutCommandDto>(); //先出库数据的集合(深度为1的储位) var outDto2 = new List<OutCommandDto>(); //后出库数据的集合(深度为2的储位) var moveDto = new List<OutCommandDto>(); //要移库数据的集合 #endregion var com = new Common(); var allot = new AllotLocation(); #region 集合 Db.BeginTran(); try { List<LogTask> logTaskList = new List<LogTask>();//此次出库任务集合,为应对同托盘不同物料出库 var taskNoStr = ""; // 储位号 var locateNo = locatStart.LocatNo; List<string> locateListStrs = new List<string>(); locateListStrs.Add(locateNo); var row1 = int.Parse(locatStart.LocatNo.Substring(2, 2)); var row2 = int.Parse(locatStart.AisleOne.Substring(2, 2)); //需要移库的信息 var NeedMoveInfo = IsNeedMoveLocate(locatStart, locateListStrs, out int isOut); if (isOut == 1) { //巷道组中有入库或移入的储位,或者是当前储位前有储位未下发成功的任务 throw new Exception($"巷道组中有入库或移入的储位,请稍后再试"); } if (NeedMoveInfo.Count > 0)//需要移库 { //判断库内空储位是否够 var okRoad = Db.Queryable<SysStorageRoadway>().Where(m => m.Status == "0" && m.IsDel == "0" && m.WareHouseNo == locatStart.WareHouseNo).Select(m => m.RoadwayNo).ToList(); var nullSlotNum = Db.Queryable<SysStorageLocat>().Count(m => m.RoadwayNo != locatStart.RoadwayNo && okRoad.Contains(m.RoadwayNo) && m.Status == "0"); //判断空储位的数量是否大于需要移库的数量 if (nullSlotNum >= NeedMoveInfo.Count) { foreach (var s in NeedMoveInfo) { //储位列 var rows = int.Parse(s.Substring(2, 2)); //获取移库储位 var moveAddress = GetMiJiMoveAddress(s, locatStart.AisleOne); var tary = Db.Queryable<DataStockDetail>().First(m => m.LocatNo == s); if (string.IsNullOrWhiteSpace(moveAddress)) // 判断是否获取到移库的库位 { throw new Exception($"出库前有货物,需移库但未查询到空储位"); } else { var ykTaskNo = new Common().GetMaxNo("TK"); var ykTask = new LogTask //出库任务 { TaskNo = ykTaskNo, Sender = "WMS", Receiver = "WCS", IsSuccess = 0, //是否下发成功 0失败 1成功 StartLocat = s,//起始位置 EndLocat = moveAddress,//outMode,//目标位置 PalletNo = tary.PalletNo,//托盘码 IsSend = 1,//是否可再次下发 IsCancel = 1,//是否可取消 IsFinish = 1,//是否可完成 Type = "2",//任务类型 0 入库任务 1 出库任务 2 移库任务 Status = "0",//任务状态0:等待执行1正在执行2执行完成 OrderType = "1",//0 入库单 1 出库单 2 盘点单 3 移库单 Msg = "从" + s + "到" + moveAddress + "的移库任务", //关键信息 }; Db.Insertable(ykTask).ExecuteCommand(); logTaskList.Add(ykTask); outDto1.Add(new OutCommandDto() { PalletNo = ykTask.PalletNo,//托盘号 StartLocate = ykTask.StartLocat, // 起始位置 StartRoadway = locatStart.RoadwayNo,//其实巷道 EndLocate = moveAddress,//outMode, // 目标位置 TaskNo = ykTaskNo, // 任务号 TaskType = "2",// 任务类型 (出库)0入 1出 2移 Order = Math.Abs(row2 - rows), Type = PLCTypeEnum.ShuttleCar }); var slotChange = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == s); var slotChange2 = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == moveAddress); slotChange.Status = "5"; //改变状态(正在出库) slotChange2.Status = "4"; // 改变状态(正在移入) Db.Updateable(slotChange).ExecuteCommand(); Db.Updateable(slotChange2).ExecuteCommand(); } } } else { throw new Exception($"出库前有货物,需移库但空储位不够移库"); } } #region 添加出库任务 var taskNo = new Common().GetMaxNo("TK"); var exTask = new LogTask //出库任务 { TaskNo = taskNo, Sender = "WMS", Receiver = "WCS", IsSuccess = 0, //是否下发成功 0失败 1成功 StartLocat = locatStart.LocatNo,//起始位置 EndLocat = outMode,//outMode,//目标位置 PalletNo = palletNo,//托盘码 IsSend = 1,//是否可再次下发 IsCancel = 1,//是否可取消 IsFinish = 1,//是否可完成 Type = "1",//任务类型 0 入库任务 1 出库任务 2 移库任务 Status = "0",//任务状态0:等待执行1正在执行2执行完成 OrderType = "1",//0 入库单 1 出库单 2 盘点单 3 移库单 Msg = "从" + locatStart.LocatNo + "到" + outMode + "的出库任务", //关键信息 }; Db.Insertable(exTask).ExecuteCommand(); logTaskList.Add(exTask); var endroad = allot.RoadwayToStationNum(locatStart.RoadwayNo, outMode); outDto1.Add(new OutCommandDto() { PalletNo = palletNo,//托盘号 StartLocate = locatStart.LocatNo, // 起始位置 StartRoadway = locatStart.RoadwayNo,//起始巷道 EndLocate = outMode,//, // 目标位置 EndRoadway = endroad, TaskNo = exTask.TaskNo, // 任务号 TaskType = "1",// 任务类型 (出库)0入 1出 2移 OutMode = outMode, //出库口 Order = Math.Abs(row2 - row1), Type = PLCTypeEnum.ShuttleCar }); taskNoStr = exTask.TaskNo; #endregion #region 改变数据 locatStart.Status = "3"; //要出库的储位改变状态 正在出库 Db.Updateable(locatStart).ExecuteCommand(); #endregion outDto1.AddRange(moveDto); outDto1.AddRange(outDto2); //添加操作日志记录 new OperationSOServer().AddLogOperationSo("出库作业", "托盘出库", palletNo, "出库", $"点击出库按钮出库托盘为:{palletNo}", userId); Db.CommitTran(); if (outDto1.Count > 0) { // 正式运行程序放开 var list2 = outDto1.Select(m => m.TaskNo).ToList(); var jsonData = JsonConvert.SerializeObject(outDto1); 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<WcsModel2>(response); if (wcsModel.code == 200) { //更改任务的发送返回时间// new TaskServer().EditTaskIssueOk(list2, time1, time2); str += "下发成功"; } else { new TaskServer().EditTaskIssueNo(list2, time1, time2, wcsModel.message); throw new Exception(wcsModel.message); } } catch (Exception ex) { throw new Exception(ex.Message); } } return outDto1; } catch (Exception e) { Db.RollbackTran(); throw new Exception(e.Message); } #endregion } catch (Exception e) { throw new Exception(e.Message); } } #endregion #region 自动分配、取消分配、获取手动分配的数据源、手动分配 @@ -2516,7 +2775,7 @@ Dictionary<int, decimal> stockQtyDic = new Dictionary<int, decimal>();//托出库物品数 var qty = 0m; var house = ""; //分配货物 qty += assign.AllotPallets(stockDetail, needQty, pNum, bNum, stockQtyDic, notice.WareHouseNo); foreach (var sc in stockQtyDic) @@ -3067,7 +3326,7 @@ { try { var notcie = Db.Queryable<BllExportNotice>().First(m=>m.IsDel == "0" && m.SONo == soNo); var notcie = Db.Queryable<BllExportNotice>().First(m => m.IsDel == "0" && m.SONo == soNo); if (notcie == null) { throw new Exception("未查询到出库单信息"); @@ -3155,9 +3414,9 @@ { throw new Exception("出库口工位异常"); } var taskNoStr = ""; // 储位号 var locateNo = outStockDetail.First(m => m.PalletNo == item.PalletNo).LocatNo; @@ -3200,7 +3459,7 @@ } flagList.Add(0); continue; } var locate = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == locateNo && m.IsDel == "0");//当前出库的储位信息 @@ -3221,7 +3480,7 @@ if (locate.Status == "1") //有物品 { #region 添加出库任务 var taskNo = new Common().GetMaxNo("TK"); var exTask = new LogTask //出库任务 { @@ -3253,13 +3512,13 @@ StartLocate = locate.LocatNo, // 起始位置 StartRoadway = locate.RoadwayNo,//其实巷道 EndLocate = outModeLocate, // 目标位置 Order = 999, Type = PLCTypeEnum.AGV Type = PLCTypeEnum.AGV }); taskNoStr = exTask.TaskNo; #endregion #region 改变数据 @@ -3347,7 +3606,7 @@ flagList.Add(1); } } //添加操作日志记录 var k = new OperationSOServer().AddLogOperationSo("出库作业", "出库单据", soNo, "出库", $"点击出库按钮出库单号为:{soNo}的出库单", userId); Db.CommitTran(); @@ -3395,8 +3654,8 @@ //if (wcsModel.StatusCode == 0) //{ // //更改任务的发送返回时间// new TaskServer().EditTaskIssueOk(list2, time1, time2); str += "下发成功"; new TaskServer().EditTaskIssueOk(list2, time1, time2); str += "下发成功"; //} //if (wcsModel.StatusCode == -1) //{ @@ -3462,7 +3721,7 @@ //要出库的明细集合 var outStockDetail = Db.Queryable<DataStockDetail>().Where(m => m.IsDel == "0" && outLpnList.Contains(m.PalletNo)).ToList(); //所有要出库的储位集合 var locateListStrs = outStockDetail.Where(m=> !string.IsNullOrWhiteSpace(m.LocatNo)).Select(m => m.LocatNo).Distinct().ToList(); var locateListStrs = outStockDetail.Where(m => !string.IsNullOrWhiteSpace(m.LocatNo)).Select(m => m.LocatNo).Distinct().ToList(); //物料编码表 var skuList = Db.Queryable<SysMaterials>().Where(w => w.IsDel == "0"); //包装表 @@ -3471,13 +3730,13 @@ try { List<LogTask> logTaskList = new List<LogTask>();//此次出库任务集合,为应对同托盘不同物料出库 //循环分配的信息生成出库任务 foreach (var item in list) { var taskNoStr = ""; // 储位号 var locateNo = outStockDetail.First(m => m.PalletNo == item.PalletNo).LocatNo; @@ -3528,7 +3787,7 @@ } //判断储位 var locate = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == locateNo && m.IsDel == "0");//当前出库的储位信息 var locate = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == locateNo && m.IsDel == "0" && m.WareHouseNo == "W01");//当前出库的储位信息 if (locate == null) { flagList.Add(2); @@ -3545,7 +3804,7 @@ if (locate.Status == "1") //有物品 { var row1 = int.Parse(locate.LocatNo.Substring(2,2)); var row1 = int.Parse(locate.LocatNo.Substring(2, 2)); var row2 = int.Parse(locate.AisleOne.Substring(2, 2)); //需要移库的信息 var NeedMoveInfo = IsNeedMoveLocate(locate, locateListStrs, out int isOut); @@ -3567,7 +3826,7 @@ foreach (var s in NeedMoveInfo) { //储位列 var rows = int.Parse(s.Substring(2,2)); var rows = int.Parse(s.Substring(2, 2)); //获取移库储位 var moveAddress = GetMiJiMoveAddress(s, locate.AisleOne); @@ -3616,8 +3875,8 @@ outDto1.Add(new OutCommandDto() { PalletNo = item.PalletNo,//托盘号 StartLocate = locate.LocatNo, // 起始位置 PalletNo = ykTask.PalletNo,//托盘号 StartLocate = ykTask.StartLocat, // 起始位置 StartRoadway = locate.RoadwayNo,//其实巷道 EndLocate = moveAddress,//outMode, // 目标位置 TaskNo = ykTaskNo, // 任务号 @@ -3625,7 +3884,7 @@ Order = Math.Abs(row2 - rows), Type = PLCTypeEnum.ShuttleCar }); }); var slotChange = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == s); var slotChange2 = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == moveAddress); @@ -3647,7 +3906,7 @@ } } #region 添加出库任务 var taskNo = new Common().GetMaxNo("TK"); var exTask = new LogTask //出库任务 { @@ -3685,7 +3944,7 @@ }); taskNoStr = exTask.TaskNo; #endregion #region 改变数据 @@ -3859,26 +4118,26 @@ /// <param name="addressList">要出口的储位集合</param> /// <param name="isOut">是否出库 1:有未下发的任务在前面</param> /// <returns>需要移库的集合(如果为空则不需移库)</returns> private List<string> IsNeedMoveLocate(SysStorageLocat lcoate,List<string> locateStrList, out int isOut) private List<string> IsNeedMoveLocate(SysStorageLocat lcoate, List<string> locateStrList, out int isOut) { var nowAddress = new List<string>(); //需要移库的集合 // 010101 派列层 //var bol = String.CompareOrdinal(lcoate.LocatNo, lcoate.AisleOne); var sArray = lcoate.LocatNo.Substring(4,2); // 010101 派列层 //var bol = String.CompareOrdinal(lcoate.LocatNo, lcoate.AisleOne); var sArray = lcoate.LocatNo.Substring(2, 2); var row = int.Parse(sArray);//储位列 var sArray2 = lcoate.AisleOne.Substring(4, 2); var sArray2 = lcoate.AisleOne.Substring(2, 2); var row2 = int.Parse(sArray2); //通道口列 isOut = 0; var bol = row2 - row > 0; //同组的储位集合 var slotList = Db.Queryable<SysStorageLocat>().Where(m => m.RoadwayNo == lcoate.RoadwayNo).ToList(); List<string> list; if (bol) { //储位小于通道口 倒序 @@ -3931,7 +4190,7 @@ { return nowAddress; } return nowAddress; } @@ -3954,7 +4213,7 @@ // 获取移库目标储位 // var sArray = oldAddress.Substring(4,2); var sArray = oldAddress.Substring(4, 2); var ceng = int.Parse(sArray); // var sArray2 = slotOut.Substring(2, 2); @@ -3985,206 +4244,220 @@ //根据十字口差值最小的排序 shiKou3 = shiKou3.OrderBy(m => m.distNum).ToList(); /** //1 移动到最近的空储位,必须回移。 //根据四向车移动轨迹计算出最近空储位。 //出库完成后根据批次号 生产日期 出口计算回移储位。 /** //1 移动到最近的空储位,必须回移。 //根据四向车移动轨迹计算出最近空储位。 //出库完成后根据批次号 生产日期 出口计算回移储位。 //2 移动适合存放的组,系统自动计算是否回移。 //根据批次号 生产日期 出口 物料等计算出移库目标储位 //出库完成后,判断是否有比当前库位更合适的存储储位,有移动,无不移动。 */ //2 移动适合存放的组,系统自动计算是否回移。 //根据批次号 生产日期 出口 物料等计算出移库目标储位 //出库完成后,判断是否有比当前库位更合适的存储储位,有移动,无不移动。 */ var oldSlot = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == oldAddress); if (oldSlot == null) var oldSlot = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == oldAddress); if (oldSlot == null) { throw new Exception("未能找到储位信息"); } #region 1不需要回移的 //后期库存托盘表改了后需要加筛选条件托盘的状态(退货/预拣) var tray1 = Db.Queryable<DataStockDetail>().Where(m => m.LocatNo == oldAddress).ToList(); //根据物料、批次、托盘状态(退货/预拣/暂存等)分组判断 var d = tray1.GroupBy(m => new { m.SkuNo, m.LotNo, m.PalletTags }); var location = string.Empty; if (d.Any()) { //旧储位同组的储位集合 var slotList = Db.Queryable<SysStorageLocat>().Where(m => m.RoadwayNo == oldSlot.RoadwayNo).Select(m => m.LocatNo).ToList(); foreach (var item in d) { throw new Exception("未能找到储位信息"); } #region 1不需要回移的 //后期库存托盘表改了后需要加筛选条件托盘的状态(退货/预拣) var tray1 = Db.Queryable<DataStockDetail>().Where(m => m.LocatNo == oldAddress).ToList(); //根据物料、批次、托盘状态(退货/预拣/暂存等)分组判断 var d = tray1.GroupBy(m => new { m.SkuNo, m.LotNo, m.PalletTags }); var location = string.Empty; if (d.Any()) { //旧储位同组的储位集合 var slotList = Db.Queryable<SysStorageLocat>().Where(m => m.RoadwayNo == oldSlot.RoadwayNo).Select(m => m.LocatNo).ToList(); foreach (var item in d) foreach (var item2 in item) { foreach (var item2 in item) var okLan = Db.Queryable<SysStorageRoadway>().Where(m => m.Status == "0" && m.IsDel == "0" && m.WareHouseNo == item2.WareHouseNo).Select(m => m.RoadwayNo).ToList(); //当前托盘所在楼层 if (oldSlot.Layer == 1) { var okLan = Db.Queryable<SysStorageRoadway>().Where(m => m.Status == "0" && m.IsDel == "0").Select(m => m.RoadwayNo).ToList(); var tray2 = Db.Queryable<DataStockDetail>().Where(m => m.SkuNo == item2.SkuNo okLan = okLan.Where(m => Convert.ToInt32(m.Replace("MR", "")) <= 56).ToList(); } else if (oldSlot.Layer == 2) { okLan = okLan.Where(m => Convert.ToInt32(m.Replace("MR", "")) > 56).ToList(); } else { throw new Exception("当前托盘所在楼层异常"); } var tray2 = Db.Queryable<DataStockDetail>().Where(m => m.SkuNo == item2.SkuNo && m.LotNo == item2.LotNo && !slotList.Contains(m.LocatNo) && m.PalletTags == item2.PalletTags && okLan.Contains(m.RoadwayNo)).ToList(); foreach (var s in tray2) foreach (var s in tray2) { if (string.IsNullOrWhiteSpace(s.RoadwayNo))//判断是否在库外,如是跳过 { if (string.IsNullOrWhiteSpace(s.RoadwayNo))//判断是否在库外,如是跳过 continue; } var lan = Db.Queryable<SysStorageLocat>().Where(m => m.RoadwayNo == s.RoadwayNo).OrderBy(m => m.LocatNo).ToList(); //判断是否有入库中、出库中、移入中、移出中 if (lan.Count(m => m.Status == "2" || m.Status == "3" || m.Status == "4" || m.Status == "5") > 0) { continue; } if (lan.Count(m => m.Status == "0") > 0) { var bol = GetBecomingLocation(s.RoadwayNo, ref location); if (bol && !string.IsNullOrWhiteSpace(location)) { continue; } var lan = Db.Queryable<SysStorageLocat>().Where(m => m.RoadwayNo == s.RoadwayNo).OrderBy(m => m.LocatNo).ToList(); //判断是否有入库中、出库中、移入中、移出中 if (lan.Count(m => m.Status == "2" || m.Status == "3" || m.Status == "4" || m.Status == "5") > 0) { continue; } if (lan.Count(m => m.Status == "0") > 0) { var bol = GetBecomingLocation(s.RoadwayNo, ref location); if (bol && !string.IsNullOrWhiteSpace(location)) { newAddress = location; return newAddress; } newAddress = location; return newAddress; } } } } } #endregion } #region 2需要回移的 #endregion ////如果没有找到合适的储位 //if (string.IsNullOrWhiteSpace(newAddress)) //{ // foreach (var s in shiKou3) // { // var r = int.Parse(s.slotCode.Substring(0, 2)); // var l = int.Parse(s.slotCode.Substring(2, 2)); // var c = int.Parse(s.slotCode.Substring(4, 2)); // //查询空储位 // var sqlString = $@"select LocatNo,Row,Column,Layer,(ABS(Row-{r}) + ABS(Column-{l}) ) as distNum // from SysStorageLocat where (AisleOneRow = {r} or AisleTwoRow = {r}) and Status in (0) and // RoadwayNo !='{oldSlot.RoadwayNo}' and RoadwayNo not in(select RoadwayNo from SysStorageRoadway where Status = 1) order by distNum,SlotCode"; #region 2需要回移的 // var addressModels = dataContext.ExecuteQuery<addreClass>(sqlString).ToList(); // foreach (var item in addressModels) // { 、 // newAddress = item.slotCode; // var dz = newAddress.Split(new char[] { '-' }); // var l1 = dz[1]; // var c1 = dz[0]; // newLaneWayAddress = $"{c1}-{l1}-{a[2]}"; // flags = newLaneWayAddress; ////如果没有找到合适的储位 //if (string.IsNullOrWhiteSpace(newAddress)) //{ // foreach (var s in shiKou3) // { // var slotModel = dataContext.WmsBaseSlot.FirstOrDefault(m => m.SlotCode == item.slotCode); // var r = int.Parse(s.slotCode.Substring(0, 2)); // var l = int.Parse(s.slotCode.Substring(2, 2)); // var c = int.Parse(s.slotCode.Substring(4, 2)); // //查询空储位 // var sqlString = $@"select LocatNo,Row,Column,Layer,(ABS(Row-{r}) + ABS(Column-{l}) ) as distNum // from SysStorageLocat where (AisleOneRow = {r} or AisleTwoRow = {r}) and Status in (0) and // RoadwayNo !='{oldSlot.RoadwayNo}' and RoadwayNo not in(select RoadwayNo from SysStorageRoadway where Status = 1) order by distNum,SlotCode"; // var lan = dataContext.WmsBaseSlot.Where(m => m.SlotLanewayId == slotModel.SlotLanewayId).ToList(); // if (slotModel.SlotRow > int.Parse(a[2])) // { // // 取最上面一排 // lan = lan.OrderBy(m => m.SlotCode).ToList(); // for (int i = 0; i < lan.Count; i++) // { // var slot = dataContext.WmsBaseSlot.FirstOrDefault(m => m.SlotCode == lan[i].SlotCode); // if (slot.SlotStatus == 0) // { // if (i == lan.Count - 1) // { // newAddress = lan[lan.Count - 1].SlotCode; // var addressModels = dataContext.ExecuteQuery<addreClass>(sqlString).ToList(); // foreach (var item in addressModels) // { 、 // break; // } // else // { // continue; // } // } // else // { // newAddress = lan[i - 1].SlotCode; // break; // } // } // newAddress = item.slotCode; // var dz = newAddress.Split(new char[] { '-' }); // var l1 = dz[1]; // var c1 = dz[0]; // newLaneWayAddress = $"{c1}-{l1}-{a[2]}"; // flags = newLaneWayAddress; // } // else // { // // 取最下面一排 // lan = lan.OrderByDescending(m => m.SlotCode).ToList(); // for (int i = 0; i < lan.Count; i++) // { // var slot = dataContext.WmsBaseSlot.FirstOrDefault(m => m.SlotCode == lan[i].SlotCode); // if (slot.SlotStatus == 0) // { // if (i == lan.Count - 1) // { // newAddress = lan[lan.Count - 1].SlotCode; // break; // } // else // { // continue; // } // var slotModel = dataContext.WmsBaseSlot.FirstOrDefault(m => m.SlotCode == item.slotCode); // } // else // { // newAddress = lan[i - 1].SlotCode; // break; // } // } // } // //添加回移任务 // AddHyTask(oldAddress, newAddress, newLaneWayAddress, oldSlot.SlotLanewayId, slotOut, billCode); // refLanWayId = slotModel.SlotLanewayId; // refLanOutCode = newLaneWayAddress; // //9:锁定储位 // var updateSlot = dataContext.WmsBaseSlot.Where(m => m.SlotLanewayId == slotModel.SlotLanewayId).ToList(); // var newAddressRow = dataContext.WmsBaseSlot.FirstOrDefault(m => m.SlotCode == newAddress); // if (newAddressRow.SlotRow > int.Parse(a[2])) // { // updateSlot = updateSlot.Where(m => m.SlotRow < newAddressRow.SlotRow && m.SlotRow > int.Parse(a[2])).OrderBy(m => m.SlotCode).ToList(); // } // else // { // updateSlot = updateSlot.Where(m => m.SlotRow > newAddressRow.SlotRow && m.SlotRow < int.Parse(a[2])).OrderByDescending(m => m.SlotCode).ToList(); // var lan = dataContext.WmsBaseSlot.Where(m => m.SlotLanewayId == slotModel.SlotLanewayId).ToList(); // if (slotModel.SlotRow > int.Parse(a[2])) // { // // 取最上面一排 // lan = lan.OrderBy(m => m.SlotCode).ToList(); // for (int i = 0; i < lan.Count; i++) // { // var slot = dataContext.WmsBaseSlot.FirstOrDefault(m => m.SlotCode == lan[i].SlotCode); // if (slot.SlotStatus == 0) // { // if (i == lan.Count - 1) // { // newAddress = lan[lan.Count - 1].SlotCode; // } // foreach (var source in updateSlot) // { // if (source.SlotCode == newAddress) // { // continue; // } // if (source.SlotStatus == 0) // { // source.SlotStatus = 8; // } // } // break; // } // else // { // continue; // } // if (updateSlot.Count <= 0) // { // refLanWayId = ""; // refLanOutCode = ""; // } // dataContext.SubmitChanges(); // return newAddress; // } // else // { // newAddress = lan[i - 1].SlotCode; // break; // } // } // } // } // else // { // // 取最下面一排 // lan = lan.OrderByDescending(m => m.SlotCode).ToList(); // for (int i = 0; i < lan.Count; i++) // { // var slot = dataContext.WmsBaseSlot.FirstOrDefault(m => m.SlotCode == lan[i].SlotCode); // if (slot.SlotStatus == 0) // { // if (i == lan.Count - 1) // { // newAddress = lan[lan.Count - 1].SlotCode; // break; // } // else // { // continue; // } // } // } // else // { // newAddress = lan[i - 1].SlotCode; // break; // } // } // } // //添加回移任务 // AddHyTask(oldAddress, newAddress, newLaneWayAddress, oldSlot.SlotLanewayId, slotOut, billCode); // refLanWayId = slotModel.SlotLanewayId; // refLanOutCode = newLaneWayAddress; // //9:锁定储位 // var updateSlot = dataContext.WmsBaseSlot.Where(m => m.SlotLanewayId == slotModel.SlotLanewayId).ToList(); // var newAddressRow = dataContext.WmsBaseSlot.FirstOrDefault(m => m.SlotCode == newAddress); // if (newAddressRow.SlotRow > int.Parse(a[2])) // { // updateSlot = updateSlot.Where(m => m.SlotRow < newAddressRow.SlotRow && m.SlotRow > int.Parse(a[2])).OrderBy(m => m.SlotCode).ToList(); // } // else // { // updateSlot = updateSlot.Where(m => m.SlotRow > newAddressRow.SlotRow && m.SlotRow < int.Parse(a[2])).OrderByDescending(m => m.SlotCode).ToList(); //} // } // foreach (var source in updateSlot) // { // if (source.SlotCode == newAddress) // { // continue; // } // if (source.SlotStatus == 0) // { // source.SlotStatus = 8; // } // } return newAddress; #endregion // if (updateSlot.Count <= 0) // { // refLanWayId = ""; // refLanOutCode = ""; // } // dataContext.SubmitChanges(); // return newAddress; // } // } //} return newAddress; #endregion } /// <summary> @@ -4196,14 +4469,14 @@ private bool GetBecomingLocation(string laneWayId, ref string location) { bool bl = false; // 循环判断当前组是否有剩余储位 string sqlString = string.Empty; location = ""; // 判断储位组是否有空储位 关联库存明细表可防止储位状态不准确避免造成满入异常//not in ('1','2','4','6','7','8') sqlString = $"select LocatNo,Column,AisleOne from SysStorageLocat where RoadwayNo = {laneWayId} and Status in ('0') and LocatNo not in (select LocatNo from DataStockDetail where RoadwayNo = { laneWayId}) order by Row;"; var slotModel =Db.SqlQueryable<LocateInfo>(sqlString).ToList(); sqlString = $"select LocatNo,[Column],AisleOne from SysStorageLocat where IsDel=0 and WareHouseNo='W01' and RoadwayNo = '{laneWayId}' and Status in ('0') and LocatNo not in (select LocatNo from DataStockDetail where RoadwayNo = '{laneWayId}') order by Row;"; var slotModel = Db.SqlQueryable<LocateInfo>(sqlString).ToList(); if (slotModel.Count == 0) { bl = false; @@ -4211,7 +4484,7 @@ else // 存在空储位 { // 判断当前组合适的储位地址 var numstr = slotModel[0].AisleOne.Substring(4,2); var numstr = slotModel[0].AisleOne.Substring(4, 2); int aisleRow = int.Parse(numstr); if (slotModel[0].Column > aisleRow) @@ -4226,11 +4499,11 @@ location = slotModel[slotModel.Count - 1].LocatNo; } bl = true; } return bl; } @@ -4245,7 +4518,7 @@ public string LocatNo { get; set; } public int Column { get; set; } public string AisleOne { get; set; } } /// <summary> @@ -4324,12 +4597,12 @@ 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") @@ -4345,9 +4618,9 @@ } var endLocateList = Db.Queryable<SysStorageLocat>().Where(m => m.IsDel == "0" && (m.AreaNo == "B02" || m.AreaNo == "B05")).Select(m=>m.LocatNo).ToList(); 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") if (endLocateList.Contains(task.EndLocat) && PalletType == "0") { //修改目标地址状态 var endLocat = Db.Queryable<SysStorageLocat>().First(m => m.IsDel == "0" && m.LocatNo == task.EndLocat); @@ -4429,9 +4702,9 @@ ////判断起始目标位置都是平库 //if (pingKuList.Contains(task.StartLocat) && pingKuList.Contains(task.EndLocat)) //{ task.Status = "2"; task.Status = "2"; //} task.IsSend = 0; task.IsCancel = 0; task.IsFinish = 0; @@ -4446,13 +4719,13 @@ locate.Status = "0"; Db.Updateable(locate).ExecuteCommand(); } //目标储位改为有货物 1 locate2.Status = "1"; Db.Updateable(locate2).ExecuteCommand(); //判断起始目标位置都是平库 if ( pingKuList.Contains(task.EndLocat)) if (pingKuList.Contains(task.EndLocat)) { foreach (var item in stockDetail) { @@ -4463,7 +4736,7 @@ } Db.Updateable(stockDetail).ExecuteCommand(); } #endregion @@ -4490,12 +4763,12 @@ try { Db.BeginTran(); var task = Db.Queryable<LogTask>().First(m=>m.IsDel =="0" && m.TaskNo == taskNo); var task = Db.Queryable<LogTask>().First(m => m.IsDel == "0" && m.TaskNo == taskNo); if (task == null) { throw new Exception("没有查询到任务信息"); } if (task.Status!="1") if (task.Status != "1") { throw new Exception("任务状态不是正在执行,请核实"); } @@ -4504,7 +4777,7 @@ { throw new Exception("没有查询到起始储位信息"); } if (locate.WareHouseNo!="W04") if (locate.WareHouseNo != "W04") { throw new Exception("起始储位不是平库储位,请核实"); } @@ -4529,7 +4802,7 @@ } } #endregion #endregion @@ -4551,7 +4824,7 @@ throw new Exception("未查询到出库单信息"); } var task = Db.Queryable<BllExportTimingTask>().Count(m => m.SoNo == soNo); if (task>0) if (task > 0) { throw new Exception("当前出库单已生成备料任务,无需重复点击"); } @@ -4563,7 +4836,7 @@ }; Db.Insertable(exTask).ExecuteCommand(); notice.Status = "3";//修改单据状态未正在执行 notice.UpdateTime = DateTime.Now; notice.UpdateTime = DateTime.Now; notice.UpdateUser = userId; Db.Updateable(notice).ExecuteCommand(); @@ -4575,7 +4848,7 @@ throw new Exception(e.Message); } } // JC23 备料定时任务开始 领料单备料下发出库(调用wcs接口给他库位地址) public List<OutCommandDto> BeiLiaoIssueOutHouse(string url) { @@ -4669,7 +4942,7 @@ if (notice.Status == "0" || notice.Status == "1" || notice.Status == "2") { var detailList = Db.Queryable<BllExportNoticeDetail>().Where(m => m.IsDel == "0" && m.SONo == item.SONo).ToList(); if (detailList.Count(m => m.FactQty>0) > 0) if (detailList.Count(m => m.FactQty > 0) > 0) { notice.Status = "3"; //变更状态为正在执行 Db.Updateable(notice).ExecuteCommand(); @@ -4696,7 +4969,7 @@ if (notice.Status == "0" || notice.Status == "1" || notice.Status == "2") { var detailList = Db.Queryable<BllExportNoticeDetail>().Where(m => m.IsDel == "0" && m.SONo == item.SONo).ToList(); if (detailList.Count(m => m.FactQty>0) > 0) if (detailList.Count(m => m.FactQty > 0) > 0) { notice.Status = "3"; //变更状态为正在执行 Db.Updateable(notice).ExecuteCommand(); @@ -5085,7 +5358,7 @@ { //先查询任务表中要有任务的投料口信息 var proCallList = Db.Queryable<BllProductionCallTask>().Where(m => m.IsDel == "0").ToList(); var proLocationList = proCallList.Select(m=>m.PutInLocation).ToList(); var proLocationList = proCallList.Select(m => m.PutInLocation).ToList(); if (proCallList.Count == 0) { return null; @@ -5098,12 +5371,12 @@ { //当前投料口包含的工位 var list = locate.Where(m => m.AreaNo == item).ToList(); var listStr = locate.Where(m => m.AreaNo == item).Select(m=>m.LocatNo).ToList(); var listStr = locate.Where(m => m.AreaNo == item).Select(m => m.LocatNo).ToList(); //判断投料口的工位中是否有未下发成功的任务 var task = Db.Queryable<LogTask>().Where(m => m.Type == "1" && m.IsSuccess == 0 && m.Status == "0" && listStr.Contains(m.EndLocat) ).OrderBy(m=>m.TaskNo).ToList(); if(task.Count > 0) var task = Db.Queryable<LogTask>().Where(m => m.Type == "1" && m.IsSuccess == 0 && m.Status == "0" && listStr.Contains(m.EndLocat)).OrderBy(m => m.TaskNo).ToList(); if (task.Count > 0) { foreach (var item2 in task) { //添加下发任务的信息 @@ -5123,12 +5396,12 @@ //item2.Status = "1"; //Db.Updateable(item2).ExecuteCommand(); } //return outlist; } } if (outlist.Count>0) if (outlist.Count > 0) { //将任务发送至AGV // 正式运行程序放开 @@ -5147,8 +5420,8 @@ //if (wcsModel.StatusCode == 0) //{ // //更改任务的发送返回时间// new TaskServer().EditTaskIssueOk(list2, time1, time2); new TaskServer().EditTaskIssueOk(list2, time1, time2); //} //if (wcsModel.StatusCode == -1) //{ @@ -5161,7 +5434,7 @@ throw new Exception(ex.Message); } } return null; } catch (Exception e) @@ -5186,7 +5459,7 @@ { throw new Exception("当前任务已完成"); } Db.BeginTran(); //库存中当前托盘的信息 var stockDetail = Db.Queryable<DataStockDetail>().Where(m => m.PalletNo == task.PalletNo).ToList(); @@ -5224,11 +5497,11 @@ var exTime = Db.Queryable<BllProductionCallTask>().First(m => m.IsDel == "0" && m.PutInLocation == locate.AreaNo && m.SkuNo == locate.SkuNo); if (exTime != null) { var notice = Db.Queryable<BllExportNotice>().First(m=>m.IsDel =="0" && m.SONo == exTime.OrderCode); var notice = Db.Queryable<BllExportNotice>().First(m => m.IsDel == "0" && m.SONo == exTime.OrderCode); //获取备好料的托盘信息 var taskStr = Db.Queryable<LogTask>().Where(m => m.IsDel == "0" && (m.Status == "0" || m.Status == "1") && m.Receiver == "AGV").Select(m => m.TaskNo).ToList(); var allotList = Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && m.Status == "2" && m.SONo == notice.SONo && m.SkuNo == locate.SkuNo && !taskStr.Contains(m.TaskNo)).Select(m => m.PalletNo).ToList(); if (allotList.Count >0) if (allotList.Count > 0) { var stockDetail2 = Db.Queryable<DataStockDetail>().Where(m => allotList.Contains(m.PalletNo)).OrderBy(m => m.LocatNo).First(); @@ -5266,7 +5539,7 @@ else { var listLocate = Db.Queryable<SysStorageLocat>().Where(m => m.IsDel == "0" && m.AreaNo == locate.AreaNo).ToList(); if (listLocate.Count(m=>m.SkuNo == locate.SkuNo && m.Status != "0") == 0) if (listLocate.Count(m => m.SkuNo == locate.SkuNo && m.Status != "0") == 0) { Db.Deleteable(exTime).ExecuteCommand(); } @@ -5323,7 +5596,7 @@ //删除库存箱码明细 Db.Deleteable(item2).ExecuteCommand(); } if (comList.Count>0) if (comList.Count > 0) { Db.Insertable(comList).ExecuteCommand(); } @@ -5352,9 +5625,9 @@ #endregion #region 出库流水(更改状态) allot.Status = "5"; if (stockInfoList.Count == 0) { allot.CompleteQty += item.LockQty; @@ -5368,7 +5641,7 @@ #region 出库单及明细 var noticeDetail = Db.Queryable<BllExportNoticeDetail>().First(m => m.Id == allot.SODetailNo && m.IsDel == "0"); if (stockInfoList.Count == 0) { noticeDetail.CompleteQty += item.LockQty; @@ -5383,9 +5656,9 @@ { var notice = Db.Queryable<BllExportNotice>().First(m => m.IsDel == "0" && m.SONo == noticeDetail.SONo); notice.Status = "4"; //更改为执行完成//修改出库单信息 Db.Updateable(notice).ExecuteCommand(); } #endregion @@ -5408,7 +5681,7 @@ } } } item.LocatNo = locate2.LocatNo;//储位更改(改为空) item.WareHouseNo = locate2.WareHouseNo;//所属仓库更改(改为空) item.RoadwayNo = locate2.RoadwayNo;//所属巷道更改(改为空) @@ -5782,7 +6055,7 @@ OutMode = toLocation, //目标地址 Order = 1, }); #endregion @@ -5872,7 +6145,7 @@ item.TaskNo = taskNoStr; // 出库分配信息中更新任务号 item.Status = "1"; // 出库分配信息状态改为正在执行 item.UnstackingMode = unstackingMode2;//拆垛方式 item.OutMode = outMode ;//出库口 item.OutMode = outMode;//出库口 //item.LoadingAddre = unstackingMode2 == "0" ? loadingAddre : "";//装车口 Db.Updateable(item).ExecuteCommand(); @@ -5916,7 +6189,7 @@ item.TaskNo = taskNo.TaskNo; item.Status = "1"; // 出库分配信息状态改为正在执行 item.OutMode = item.OutMode;//出库口 item.UnstackingMode = unstackingMode2 ;//拆垛模式 item.UnstackingMode = unstackingMode2;//拆垛模式 Db.Updateable(item).ExecuteCommand(); flagList.Add(0); #endregion @@ -6007,7 +6280,7 @@ throw new Exception(e.Message); } } //重新下发出库任务 public OutCommandDto AgainSendSoTask(string taskNo, int userId, string url) { @@ -6330,7 +6603,7 @@ } #endregion /// <summary> /// 判断出库是否需要拆箱 @@ -6449,7 +6722,7 @@ { sqlPub += $"AND tb1.IsDespatch = '{isDespatch}' "; } if (logisticsId != null) if (logisticsId != null) { sqlPub += $"AND tb1.LogisticsId = '{logisticsId}' "; } Wms/WMS.BLL/DataServer/StockServer.cs
@@ -47,9 +47,11 @@ /// <param name="lotNo">批次</param> /// <param name="status">库存状态</param> /// <param name="inspectStatus">质检状态</param> /// <param name="wareHouseNo">所属仓库</param> /// <param name="areaNo">所属区域</param> /// <returns></returns> public async Task<List<MateDataStockDto>> GetDataStockList(string selectType, string skuNo, string skuName, string ownerNo, string ownerName, string lotNo, string status, string inspectStatus) string ownerName, string lotNo, string status, string inspectStatus, string wareHouseNo, string areaNo) { Expression<Func<DataStockDetail, bool>> item = Expressionable.Create<DataStockDetail>() .AndIF(!string.IsNullOrEmpty(skuNo), a => a.SkuNo.Contains(skuNo)) @@ -59,6 +61,8 @@ .AndIF(!string.IsNullOrEmpty(lotNo), a => a.LotNo.Contains(lotNo)) .AndIF(!string.IsNullOrEmpty(status), a => a.Status == status) .AndIF(!string.IsNullOrEmpty(inspectStatus), a => a.InspectStatus == inspectStatus) .AndIF(!string.IsNullOrEmpty(wareHouseNo), a => a.WareHouseNo == wareHouseNo) .AndIF(!string.IsNullOrEmpty(areaNo), a => a.AreaNo == areaNo) .And(a => a.IsDel == "0") .ToExpression();//注意 这一句 不能少 Wms/WMS.IBLL/IBllSoServer/ICompleteDetailServer.cs
@@ -26,7 +26,7 @@ /// <param name="boxNo">箱码</param> /// <param name="boxNo3">支码</param> /// <returns></returns> List<CompleteDetailDto> GetCompBoxInfoList(string boxNo,string boxNo3); List<CompleteDetailDto> GetCompBoxInfoList(string sONo, string boxNo,string boxNo3); #region 数据归档 /// <summary> Wms/WMS.IBLL/IBllSoServer/IExportNoticeServer.cs
@@ -123,6 +123,18 @@ /// <returns></returns> List<OutCommandDto> IssuePalletNoOut(string palletNo, string outMode, int userId, string url, out string str); /// <summary> /// 托盘出库(密集库) /// </summary> /// <param name="palletNo"></param> /// <param name="outMode"></param> /// <param name="userId"></param> /// <param name="url"></param> /// <param name="str"></param> /// <returns></returns> /// <exception cref="Exception"></exception> List<OutCommandDto> IssuePalletNoOutMk(string palletNo, string outMode, int userId, string url, out string str); //------------------------------------------------------------------------------------------ #region 备料 Wms/WMS.IBLL/IDataServer/IStockServer.cs
@@ -23,9 +23,11 @@ /// <param name="lotNo">批次</param> /// <param name="status">库存状态</param> /// <param name="inspectStatus">质检状态</param> /// <param name="wareHouseNo">所属仓库</param> /// <param name="areaNo">所属区域</param> /// <returns></returns> Task<List<MateDataStockDto>> GetDataStockList(string selectType, string skuNo, string skuName, string ownerNo, string ownerName, string lotNo, string status, string inspectStatus); string status, string inspectStatus, string wareHouseNo, string areaNo); /// <summary> /// 获取库存明细 Wms/WMS.IBLL/IPdaServer/IPdaSoServer.cs
@@ -142,6 +142,18 @@ /// <param name="boxNo3">支/袋码</param> /// <param name="userId">操作人</param> Task SoSetPick(string soNo, string soDetailId, string palletNo, string boxNo, string boxNo3, string PickQty, int userId); /// <summary> /// 出库pda拣货-JC34 /// </summary> /// <param name="soNo"></param> /// <param name="soDetailId"></param> /// <param name="palletNo"></param> /// <param name="boxNo">箱码/盒码/支码</param> /// <param name="pickQty1"></param> /// <param name="userId"></param> /// <returns></returns> /// <exception cref="Exception"></exception> Task SoSetPick34(string soNo, string soDetailId, string palletNo, string boxNo, string pickQty1, int userId); /// <summary> /// 出库pda拣货 Wms/Wms/Controllers/BllSoController.cs
@@ -582,11 +582,11 @@ } [HttpGet] public IActionResult GetCompBoxInfoList( string boxNo,string boxNo3) public IActionResult GetCompBoxInfoList(string sONo, string boxNo,string boxNo3) { try { var bolls = _comDetailSvc.GetCompBoxInfoList(boxNo, boxNo3); var bolls = _comDetailSvc.GetCompBoxInfoList(sONo, boxNo, boxNo3); return Ok(new { code = 0, count = bolls.Count, msg = "拣货明细信息", data = bolls }); } @@ -638,12 +638,21 @@ return Ok(new { code = 1, msg = "未获取到当前操作人信息" }); } //验证出库口 //if (string.IsNullOrWhiteSpace(outMode)) //{ // return Ok(new { code = 1, msg = "请选择出库口" }); //} var list = _exNoticeSvc.IssuePalletNoOut(palletNo, outMode, int.Parse(userId), _config.WcsHost + _config.IssueComApiUrl, out string str); if (string.IsNullOrWhiteSpace(outMode)) { return Ok(new { code = 1, msg = "请选择出库口" }); } string str = string.Empty; var list = new List<OutCommandDto>(); if (outMode == "17" || outMode == "18") { list = _exNoticeSvc.IssuePalletNoOutMk(palletNo, outMode, int.Parse(userId), _config.WcsHost + _config.IssueComApiUrl, out str); } else { list = _exNoticeSvc.IssuePalletNoOut(palletNo, outMode, int.Parse(userId), _config.WcsHost + _config.IssueComApiUrl, out str); } return Ok(new { code = 0, msg = str, data = list }); Wms/Wms/Controllers/PdaSoController.cs
@@ -160,7 +160,8 @@ [HttpPost] public async Task SoSetPick(PdaSoVm model) { await _pdaSoSvc.SoSetPick(model.SoNo, model.SoDetailId, model.PalletNo, model.BoxNo, model.BoxNo3, model.PickQty, _userManager.UserId); //await _pdaSoSvc.SoSetPick(model.SoNo, model.SoDetailId, model.PalletNo, model.BoxNo, model.BoxNo3, model.PickQty, _userManager.UserId); await _pdaSoSvc.SoSetPick34(model.SoNo, model.SoDetailId, model.PalletNo, model.BoxNo, model.PickQty, _userManager.UserId); } /// <summary> Wms/Wms/Controllers/StatisticalController.cs
@@ -7,6 +7,7 @@ using WMS.IBLL.IDataServer; using System.Security.Claims; using System.Threading.Tasks; using Model.ModelDto.SysDto; namespace Wms.Controllers { @@ -51,9 +52,9 @@ /// <param name="inspectStatus">质检状态</param> /// <returns></returns> [HttpGet] public async Task<IActionResult> GetInventoryList(string selectType, string skuNo, string skuName, string ownerNo, string ownerName, string lotNo, string status, string inspectStatus) public async Task<IActionResult> GetInventoryList(string selectType, string skuNo, string skuName, string ownerNo, string ownerName, string lotNo, string status, string inspectStatus, string wareHouseNo, string areaNo) { List<MateDataStockDto> StockList = await _stock.GetDataStockList(selectType, skuNo, skuName, ownerNo, ownerName, lotNo, status, inspectStatus); List<MateDataStockDto> StockList = await _stock.GetDataStockList(selectType, skuNo, skuName, ownerNo, ownerName, lotNo, status, inspectStatus, wareHouseNo, areaNo); return Ok(new { data = StockList,