From 0239d214f33a95effa30b8ad8a2253c2a4a70011 Mon Sep 17 00:00:00 2001 From: gongbaoxiong <751575283@qq.com> Date: Mon, 26 May 2025 14:18:18 +0800 Subject: [PATCH] =?UTF-8?q?add:=E4=BB=A3=E7=A0=81=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E4=BC=98=E5=8C=96=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/nl/common/enums/StatusEnum.java | 17 +- .../org/nl/common/utils/ErpServiceUtils.java | 149 +++++- .../StIvtBsrealstorattrController.java | 7 +- .../chainer/impl/EndDecisionChainer.java | 22 +- .../chainer/impl/ExecuteDecisionChainer.java | 28 +- .../chainer/impl/StartDecisionChainer.java | 11 +- .../impl/base/AlleyAveRuleHandler.java | 39 +- .../decisioner/impl/base/FIFORuleHandler.java | 88 +++- .../impl/base/LimitStorageRuleHandler.java | 21 +- .../impl/base/NearbyRuleHandler.java | 5 +- .../impl/diy/DepthPriorityHandler.java | 46 +- .../controller/SchBaseTaskController.java | 8 +- .../handler/impl/GroupDickInStorageTask.java | 2 +- .../task/handler/impl/InStorageTask.java | 22 +- .../task/handler/impl/OutStorageTask.java | 59 ++- .../handler/impl/PalletInStorageTask.java | 2 +- .../handler/impl/PalletOutStorageTask.java | 10 + .../task/handler/impl/PickStorageTask.java | 45 +- .../impl/SecondFloorInStorageTask.java | 7 +- .../impl/SecondFloorOutStorageTask.java | 2 +- .../task/handler/impl/ToPickPlatformTask.java | 40 +- .../task/service/ISchBaseTaskService.java | 2 + .../dao/mapper/xml/SchBaseTaskMapper.xml | 9 +- .../task/service/dto/SchBaseTaskQuery.java | 4 +- .../service/impl/SchBaseTaskServiceImpl.java | 104 ++-- .../wms/external_system/GateWayService.java | 23 +- .../acs/service/WmsToAcsService.java | 13 +- .../impl/SubProcessActivityBehavior.java | 2 +- .../nodeType/excess/impl/ClassHandler.java | 51 +- .../classprocessimpl/CtuProcessHandler.java | 105 ++-- .../StorageChangesProcessHandler.java | 22 +- .../SyncReceiptProcessHandler.java | 452 +++++++++++------- .../group_dick/service/dao/MdGruopDick.java | 60 ++- .../dao/mapper/xml/MdGruopDickMapper.xml | 15 + .../service/dto/GroupDickQuery.java | 1 + .../service/impl/MdGruopDickServiceImpl.java | 51 +- .../cockpit/service/CockpitService.java | 3 +- .../cockpit/service/dao/TaskInfo.java | 2 + .../service/impl/CockpitServiceImpl.java | 148 +++--- .../cockpit/service/mapper/CockpitMapper.xml | 2 + .../devicemanage/DeviceManageController.java | 2 +- .../pda_manage/iostorage/PdaInController.java | 53 +- .../iostorage/PdaOutController.java | 12 +- .../iostorage/server/dto/PdaFormInMst.java | 19 +- .../iostorage/sevice/PdaIOService.java | 174 +++++-- .../iostorage/sevice/PdaInIOService.java | 26 +- .../pda_manage/pick/PdaPickController.java | 62 ++- .../controller/PmFormDataController.java | 177 ++++++- .../form_data/service/IPmFormDataService.java | 3 + .../form_data/service/dao/PmFormData.java | 6 + .../service/dao/mapper/PmFormDataMapper.java | 5 +- .../dao/mapper/xml/PmFormDataMapper.xml | 79 ++- .../service/dto/ErpInventoryData.java | 29 ++ .../form_data/service/dto/PmFormDataDto.java | 34 +- .../service/impl/PmFormDataServiceImpl.java | 263 ++++++++-- .../controller/CheckController.java | 3 +- .../StIvtIostorinvOutController.java | 6 + .../iostor/IStIvtIostorinvService.java | 1 + .../impl/StIvtIostorinvServiceImpl.java | 37 +- .../pick/service/PickingService.java | 151 +++--- .../dao/mapper/StIvtStructivtflowMapper.java | 4 +- .../mapper/xml/StIvtStructivtflowMapper.xml | 46 ++ .../service/dto/StructIvtFlowQuery.java | 5 + .../impl/StIvtStructivtflowServiceImpl.java | 55 ++- .../controller/StIvtStructattrController.java | 84 +++- .../service/IStIvtStructattrService.java | 2 + .../dao/mapper/StIvtStructattrMapper.java | 7 + .../dao/mapper/xml/StIvtStructattrMapper.xml | 99 +++- .../service/dto/StructattrVechielDto.java | 4 + .../impl/StIvtStructattrServiceImpl.java | 144 +++--- .../SyncFormMappingController.java | 2 +- .../controller/dict/SysDictController.java | 13 +- .../dept/dao/mapper/SysDeptMapper.java | 2 +- .../task/ApplyShelfScheduleService.java | 6 +- .../task/CleanCtuTaskScheduleService.java | 75 +++ .../quartz/task/CtuTaskScheduleService.java | 112 +++++ .../task/SyncErpBillsScheduleService.java | 46 +- .../quartz/task/TaskScheduleService.java | 149 +++--- .../quartz/task/WaitTaskScheduleService.java | 99 ++++ wms_pro/qd/src/views/mnt/database/index.vue | 9 +- wms_pro/qd/src/views/system/timing/index.vue | 148 ++++-- wms_pro/qd/src/views/system/timing/timing.js | 2 +- .../views/wms/base_manage/measure/index.vue | 3 +- .../views/wms/dispatch_manage/task/index.vue | 78 ++- .../views/wms/dispatch_manage/task/index2.vue | 12 +- .../wms/dispatch_manage/task/schBaseTask.js | 8 +- .../wms/flow_manage/act/execution/index.vue | 38 +- .../wms/md_manage/group_dick/ViewDialog.vue | 18 +- .../views/wms/md_manage/group_dick/index.vue | 42 +- .../wms/pm_manage/feedback_data/formData.js | 8 +- .../wms/pm_manage/feedback_data/index.vue | 124 ++++- .../views/wms/pm_manage/form_data/index.vue | 2 +- .../qd/src/views/wms/stor_manage/in/index.vue | 6 +- .../views/wms/stor_manage/out/ViewDialog.vue | 24 +- .../src/views/wms/stor_manage/out/index.vue | 74 ++- .../views/wms/stor_manage/out/storinvout.js | 13 +- .../views/wms/stor_manage/record/index.vue | 100 +++- .../wms/stor_manage/storIvtInfo/index.vue | 86 +++- .../wms/stor_manage/storIvtInfo/structattr.js | 8 + .../wms/stor_manage/warehouse/pick/index.vue | 86 ++-- 100 files changed, 3601 insertions(+), 1083 deletions(-) create mode 100644 wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/pm_manage/form_data/service/dto/ErpInventoryData.java create mode 100644 wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/system_manage/service/quartz/task/CleanCtuTaskScheduleService.java create mode 100644 wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/system_manage/service/quartz/task/CtuTaskScheduleService.java create mode 100644 wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/system_manage/service/quartz/task/WaitTaskScheduleService.java diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/common/enums/StatusEnum.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/common/enums/StatusEnum.java index 230b2e67..1c515e93 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/common/enums/StatusEnum.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/common/enums/StatusEnum.java @@ -27,8 +27,14 @@ public enum StatusEnum { /** * 出入库单据类型退货出库 */ - IOBILL_TYPE_IN(ForkMap.of("生产入库", "10", "inStorageTask", "调拨入库", "11", "inStorageTask", "退货入库", "12", "inStorageTask", "拣选回库", "13", "inStorageTask", "盘点入库", "14", "inStorageTask", "托盘入库", "30", "inStorageTask", "二楼CTU入库", "80", "inStorageTask")), - IOBILL_TYPE_OUT(ForkMap.of("销售出库", "20", "outStorageTask", "生产出库", "21", "outStorageTask", "调拨出库", "22", "outStorageTask", "拣选出库", "23", "conveyorOutStorageTask", "盘点出库", "24", "outStorageTask", "出库拣选", "25", "toPickPlatformTask", "退货出库", "26", "outStorageTask", "托盘出库", "40", "outStorageTask", "二楼CTU出库", "81", "inStorageTask", "二楼出库AGV搬运", "82", "inStorageTask", "二楼空架AGV搬运", "83", "inStorageTask")), + IOBILL_TYPE_IN(ForkMap.of("生产入库", "10", "inStorageTask", "调拨入库", "11", "inStorageTask", "退货入库", "12", "inStorageTask", "拣选回库", + "13", "inStorageTask", "盘点入库", "14", "inStorageTask", "托盘入库", "30", "inStorageTask", "二楼CTU入库", "80", "inStorageTask")), + IOBILL_TYPE_OUT(ForkMap.of("销售出库", "20", "outStorageTask", "生产出库", "21", "outStorageTask", "调拨出库", "22", "outStorageTask", + "拣选出库", "23", "conveyorOutStorageTask", "盘点出库", "24", "outStorageTask", "出库拣选", "25", "toPickPlatformTask", + "退货出库", "26", "outStorageTask", "托盘出库", "40", "outStorageTask", "二楼CTU出库", "81", "inStorageTask", "二楼出库AGV搬运", + "82", "inStorageTask", "二楼空架AGV搬运", "83", "inStorageTask")), + + IOBILL_TYPE_MOVE(ForkMap.of("移库", "50", "moveStorageTask", "异常位移库", "51", "moveStorageTask")), EXT_TASK_TYPE(ForkMap.of("盘点", "60", "moveStorageTask")), OTHER_TASK_TYPE(ForkMap.of("转运", "70", "tranforTask")), @@ -39,10 +45,9 @@ public enum StatusEnum { */ ERP_TYPE(ForkMap.of("PRD_MO", "10", "生产订单", "PUR_ReceiveBill", "11", "收料通知单", "SAL_SaleOrder", "12", "销售订单", "PRD_INSTOCK", "13", "生产入库单", "STK_InStock", "14", "采购入库单", + "SAL_RETURNSTOCK", "15", "销售退货入库单","PUR_MRB", "18", "采购退料出库单", "SUB_PickMtrl", "19", "委外用料清单", "PRD_PPBOM", "20", "生产用料清单", "PRD_PickMtrl", "21", "生产领料单", - "SP_PickMtrl", "22", "简单生产领料单", - "STK_TransferDirect", "23", "调拨出库单", "SAL_RETURNSTOCK", "24", "销售退货单", - "PUR_MRB", "25", "采购退料单", "STK_MisDelivery", "26", "其他出库单")), + "SP_PickMtrl", "22", "简单生产领料单", "STK_TransferDirect", "23", "调拨出库单", "STK_MisDelivery", "26", "其他出库单", "PRD_ReturnMtrl", "27", "生产退料单", "PRD_FeedMtrl", "28", "生产补料单", "SUB_RETURNMTRL", "29", "委外退料单")), /** @@ -60,7 +65,7 @@ public enum StatusEnum { /** * 点位锁类型 */ - LOCK(ForkMap.of("无锁", "00", null, "入库锁", "10", null, "入库盘点锁", "16", null, "出库锁", "20", null, "盘点出库锁", "26", null, "移库锁", "50", null, "异常锁定", "60", null)), + LOCK(ForkMap.of("无锁", "00", null, "入库锁", "10", null, "入库盘点锁", "16", null, "出库锁", "20", null, "盘点出库锁", "26", null, "移库锁", "50", null, "异常锁定", "60", null, "空出锁", "70", null)), STRATEGY_TYPE(ForkMap.of("入库", "1", null, "出库", "2", null, "出入库", "3", null)), diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/common/utils/ErpServiceUtils.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/common/utils/ErpServiceUtils.java index f2ca050d..a09bc2f3 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/common/utils/ErpServiceUtils.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/common/utils/ErpServiceUtils.java @@ -3,6 +3,8 @@ package org.nl.common.utils; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; import com.github.javaparser.utils.Log; import com.kingdee.bos.webapi.entity.*; import com.kingdee.bos.webapi.sdk.K3CloudApi; @@ -12,13 +14,15 @@ import org.nl.common.domain.exception.BadRequestException; import org.nl.wms.external_system.erp.dto.ErpQuery; import org.nl.wms.external_system.erp.dto.ErpQueryJson; import org.nl.wms.external_system.erp.dto.ErpSec; +import org.nl.wms.pm_manage.form_data.service.dto.ErpInventoryData; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; -import java.util.concurrent.locks.ReentrantLock; +import java.util.Map; import java.util.stream.Collectors; /** @@ -32,7 +36,6 @@ public class ErpServiceUtils { ErpSec erpSec; - /** * 构建api */ @@ -44,6 +47,7 @@ public class ErpServiceUtils { /** * 查询单据-单据明细 + * * @param query 查询条件 */ public JSONArray queryBills(ErpQuery query) { @@ -88,28 +92,132 @@ public class ErpServiceUtils { /** * 查询单据指定结果 */ - public List queryResult(ErpQueryJson query) { + public List queryResult(ErpQueryJson query) { if (StringUtils.isBlank(query.getFormId())) { throw new BadRequestException("参数异常"); } - List result = new ArrayList<>(); + List result = new ArrayList<>(); try { - String jsonString = JSON.toJSONString(query); - K3CloudApi cloudApi = getCloudApi(); - List> lists = cloudApi.executeBillQuery(jsonString); - for (List list : lists) { - JSONObject jsonObject =new JSONObject(); - jsonObject.put("material_code",list.get(0)); - jsonObject.put("erpCounts",list.get(1)); - result.add(jsonObject); + String jsonString = JSON.toJSONString(query); + K3CloudApi cloudApi = getCloudApi(); + List> lists = cloudApi.executeBillQuery(jsonString); + for (List list : lists) { + if (list.get(1) != null && list.get(3) != null) { + if (new BigDecimal(list.get(1).toString()).compareTo(BigDecimal.ZERO) > 0) { + ErpInventoryData inventoryData = new ErpInventoryData(); + inventoryData.setMaterial_code(list.get(0).toString()); + inventoryData.setBaseQty(new BigDecimal(list.get(1).toString())); + if (list.get(2) != null) { + inventoryData.setSecQty(new BigDecimal(list.get(2).toString())); + } else { + inventoryData.setSecQty(BigDecimal.ZERO); + } + inventoryData.setLot(list.get(3).toString()); + if (list.get(4) != null) { + inventoryData.setStockId(list.get(4).toString()); + } else { + inventoryData.setStockId(null); + } + if (list.get(5) != null) { + inventoryData.setBomId(list.get(5).toString()); + } else { + inventoryData.setBomId("0"); + } + result.add(inventoryData); + } } + + } } catch (Exception ex) { throw new BadRequestException(ex.getMessage()); } + // List result = new ArrayList<>(); + // for (int i = 1; i <= 5; i++) { + // ErpInventoryData data = new ErpInventoryData(); + // data.setMaterial_code("Material" + i); + // data.setBaseQty(new BigDecimal(100)); + // data.setSecQty(new BigDecimal(50)); + // data.setLot("Lot" + i); + // data.setStockId("Stock" + i); + // data.setBomId("Bom" + i); + // result.add(data); + // } return result; } + public List queryInventory(JSONObject from) { + ErpQueryJson erpQuery = new ErpQueryJson(); + erpQuery.setFormId("STK_Inventory"); + erpQuery.setFieldKeys("FMATERIALID.FNUMBER,FBASEQTY,FSECQTY,FLOT.FNUMBER,FSTOCKID.FNUMBER,FBomId.FNUMBER"); + erpQuery.setOrderString("FLOT"); + erpQuery.setLimit(1000); + // String filterString = ""; + // if (StringUtils.isNotBlank(from.getString("storeCode"))) { + // storeCode = "FStockId".equals(from.getString("storeCode")) ? "25" : "24"; + // } + // if (StringUtils.isNotBlank(from.getString("materialCode"))) { + // if (StringUtils.isNotBlank(storeCode)) { + // filterString = "[{\"FieldName\":\"FMaterialId.FNumber\",\"Compare\":\"67\",\"Value\":\"" + from.getString("materialCode") + "\",\"Left\":\"\",\"Right\":\"\",\"Logic\":\"0\"}," + + // "{\"FieldName\":\"FStockId.FNumber\",\"Compare\":\"67\",\"Value\":\"" + storeCode + "\",\"Left\":\"\",\"Right\":\"\",\"Logic\":\"0\"}]"; + // } else { + // filterString = "[{\"FieldName\":\"FMaterialId.FNumber\",\"Compare\":\"67\",\"Value\":\"" + from.getString("materialCode").toString() + "\",\"Left\":\"(\",\"Right\":\")\",\"Logic\":\"0\"}," + + // "{\"FieldName\":\"FStockId.FNumber\",\"Compare\":\"67\",\"Value\":\"25\",\"Left\":\"(\",\"Right\":\"\",\"Logic\":\"1\"}," + + // "{\"FieldName\":\"FStockId.FNumber\",\"Compare\":\"67\",\"Value\":\"24\",\"Left\":\"\",\"Right\":\")\",\"Logic\":\"0\"}]"; + // } + // } else if (StringUtils.isNotBlank(from.getString("pcsn"))) { + // if (StringUtils.isNotBlank(storeCode)) { + // filterString = "[{\"FieldName\":\"FLot.FNumber\",\"Compare\":\"67\",\"Value\":\"" + from.getString("pcsn") + "\",\"Left\":\"\",\"Right\":\"\",\"Logic\":\"0\"}," + + // "{\"FieldName\":\"FStockId.FNumber\",\"Compare\":\"67\",\"Value\":\"" + storeCode + "\",\"Left\":\"\",\"Right\":\"\",\"Logic\":\"0\"}]"; + // } else { + // filterString = "[{\"FieldName\":\"FLot.FNumber\",\"Compare\":\"67\",\"Value\":\"" + from.getString("pcsn") + "\",\"Left\":\"(\",\"Right\":\")\",\"Logic\":\"0\"}," + + // "{\"FieldName\":\"FStockId.FNumber\",\"Compare\":\"67\",\"Value\":\"25\",\"Left\":\"(\",\"Right\":\"\",\"Logic\":\"1\"}," + + // "{\"FieldName\":\"FStockId.FNumber\",\"Compare\":\"67\",\"Value\":\"24\",\"Left\":\"\",\"Right\":\")\",\"Logic\":\"0\"}]"; + // } + // } + String storeCode = from.getString("storeCode"); + String materialCode = from.getString("materialCode"); + String pcsn = from.getString("pcsn"); + StringBuilder filterBuilder = new StringBuilder(); + if (StringUtils.isNotBlank(materialCode)) { + filterBuilder.append("[{\"FieldName\":\"FMaterialId.FNumber\",\"Compare\":\"67\",\"Value\":\"") + .append(materialCode) + .append("\",\"Left\":\"\",\"Right\":\"\",\"Logic\":\"0\"},"); + if (StringUtils.isBlank(storeCode)) { + filterBuilder.append("{\"FieldName\":\"FStockId.FNumber\",\"Compare\":\"67\",\"Value\":\"25\",\"Left\":\"(\",\"Right\":\"\",\"Logic\":\"1\"},") + .append("{\"FieldName\":\"FStockId.FNumber\",\"Compare\":\"67\",\"Value\":\"24\",\"Left\":\"\",\"Right\":\")\",\"Logic\":\"0\"}"); + } else { + filterBuilder.append("{\"FieldName\":\"FStockId.FNumber\",\"Compare\":\"67\",\"Value\":\"") + .append(storeCode) + .append("\",\"Left\":\"\",\"Right\":\"\",\"Logic\":\"0\"}"); + } + filterBuilder.append("]"); + } else if (StringUtils.isNotBlank(pcsn)) { + filterBuilder.append("[{\"FieldName\":\"FLot.FNumber\",\"Compare\":\"67\",\"Value\":\"") + .append(pcsn) + .append("\",\"Left\":\"\",\"Right\":\"\",\"Logic\":\"0\"},"); + if (StringUtils.isBlank(storeCode)) { + filterBuilder.append("{\"FieldName\":\"FStockId.FNumber\",\"Compare\":\"67\",\"Value\":\"25\",\"Left\":\"(\",\"Right\":\"\",\"Logic\":\"1\"},") + .append("{\"FieldName\":\"FStockId.FNumber\",\"Compare\":\"67\",\"Value\":\"24\",\"Left\":\"\",\"Right\":\")\",\"Logic\":\"0\"}"); + } else { + filterBuilder.append("{\"FieldName\":\"FStockId.FNumber\",\"Compare\":\"67\",\"Value\":\"") + .append(storeCode) + .append("\",\"Left\":\"\",\"Right\":\"\",\"Logic\":\"0\"}"); + } + filterBuilder.append("]"); + } + ObjectMapper objectMapper = new ObjectMapper(); + try { + List> filterList = objectMapper.readValue(filterBuilder.toString(), objectMapper.getTypeFactory().constructCollectionType(List.class, Map.class)); + erpQuery.setFilterString(filterList); + } catch ( + JsonProcessingException e) { + throw new BadRequestException("erp库存查询条件错误"); + } + //根据物料编号或批次查询ERP即时库存 + return this.queryResult(erpQuery); + } + /** * 单据保存 */ @@ -145,6 +253,23 @@ public class ErpServiceUtils { } + /** + * 单据提交 + */ + public JSONObject submit(JSONObject from) { + String result; + //执行回传 + try { + String json = from.toJSONString(); + result = getCloudApi().submit(from.getString("formid"), json); + from.put("result", result); + } catch (Exception ex) { + Log.error(ex.getMessage()); + from.put("result", ex.getMessage()); + } + return from; + } + /** * 单据下推 diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/base_manage/bsrealstorattr/controller/StIvtBsrealstorattrController.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/base_manage/bsrealstorattr/controller/StIvtBsrealstorattrController.java index 78a8b315..d24011b4 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/base_manage/bsrealstorattr/controller/StIvtBsrealstorattrController.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/base_manage/bsrealstorattr/controller/StIvtBsrealstorattrController.java @@ -85,6 +85,9 @@ public class StIvtBsrealstorattrController { return new ResponseEntity<>(HttpStatus.OK); } + /** + * 库位初始化 + */ @PostMapping("/batchSaveAttr") @SaIgnore public ResponseEntity batchSaveAttr(@Validated @RequestBody JSONObject config) { @@ -96,7 +99,7 @@ public class StIvtBsrealstorattrController { String pre = config.getString("pre"); String now = DateUtil.now(); ArrayList list = new ArrayList<>(); - for (int x = 12; x <= 排; x++) { + for (int x = 1; x <= 排; x++) { for (int y = 1; y <= 列; y++) { for (int z = 1; z <= 层; z++) { StIvtStructattr attr = new StIvtStructattr(); @@ -111,7 +114,7 @@ public class StIvtBsrealstorattrController { attr.setCreate_id("1"); attr.setRow_num(x); attr.setCol_num(y); - attr.setBlock_num(12); + attr.setBlock_num(2); attr.setLayer_num(z); attr.setCreate_time(now); attr.setCreate_name("Admin"); diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/decision_manage/handler/chainer/impl/EndDecisionChainer.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/decision_manage/handler/chainer/impl/EndDecisionChainer.java index 5356edb7..de5e7209 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/decision_manage/handler/chainer/impl/EndDecisionChainer.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/decision_manage/handler/chainer/impl/EndDecisionChainer.java @@ -55,8 +55,28 @@ public class EndDecisionChainer extends DecisionerChain { IStIvtStructattrService iStIvtStructattrService = SpringContextHolder.getBean(IStIvtStructattrService.class); IMdPbVehicleMaterService iMdPbVehicleMaterService = SpringContextHolder.getBean(IMdPbVehicleMaterService.class); List structs = new ArrayList<>(); + //入库分配 if (in_storage) { StIvtStructattr structattr = (StIvtStructattr) transfers.get(0); + //清除异常锁 + // if ("FStockId".equals(startParam.getString("stor_code"))) { + // QueryWrapper query = new QueryWrapper() + // .eq("is_used", true) + // .eq("vehicle_code", startParam.getString("vehicle_code")) + // .eq("stor_code", startParam.getString("stor_code")) + // .eq("sect_code", "LXBCP01"); + // StIvtStructattr list = iStIvtStructattrService.getOne(query); + // if (list != null) { + // log.error("发现异常,入满阻挡未更新旧目标库位的载具号:" + startParam.getString("vehicle_code")); + // iStIvtStructattrService.update(new UpdateWrapper() + // .set("vehicle_code", null) + // .set("lock_type", StatusEnum.LOCK.code("无锁")) + // .set("update_time", DateUtil.now()) + // .set("update_name", SecurityUtils.getCurrentNickName()) + // .eq("vehicle_code", startParam.getString("vehicle_code"))); + // + // } + // } UpdateWrapper updateWrapper = new UpdateWrapper() .set("vehicle_code", startParam.getString("vehicle_code")) .set("lock_type", StatusEnum.LOCK.code("入库锁")) @@ -65,7 +85,7 @@ public class EndDecisionChainer extends DecisionerChain { .eq("struct_code", structattr.getStruct_code()); Boolean isMove = startParam.getBoolean("is_move"); //移库任务不能绑定终点托盘不然报错 - if (isMove != null && isMove == true) { + if (isMove != null && isMove) { updateWrapper.set("vehicle_code", null) .set("lock_type", StatusEnum.LOCK.code("移库锁")); } diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/decision_manage/handler/chainer/impl/ExecuteDecisionChainer.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/decision_manage/handler/chainer/impl/ExecuteDecisionChainer.java index a459d81b..113ed8bc 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/decision_manage/handler/chainer/impl/ExecuteDecisionChainer.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/decision_manage/handler/chainer/impl/ExecuteDecisionChainer.java @@ -1,12 +1,17 @@ package org.nl.wms.decision_manage.handler.chainer.impl; import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.nl.common.domain.exception.BadRequestException; +import org.nl.common.enums.StatusEnum; import org.nl.common.utils.SpringContextHolder; import org.nl.wms.decision_manage.handler.chainer.DecisionerChain; import org.nl.wms.decision_manage.handler.decisioner.Decisioner; +import org.nl.wms.decision_manage.handler.decisioner.impl.base.SameBlockNumRuleHandler; +import org.nl.wms.stor_manage.struct.service.IStIvtStructattrService; +import org.nl.wms.stor_manage.struct.service.dao.StIvtStructattr; import org.springframework.util.CollectionUtils; import java.util.List; @@ -38,11 +43,28 @@ public class ExecuteDecisionChainer extends DecisionerChain { List list = transfers; for (String decisionerType : decisionerTypes) { Decisioner decisioner = decisionerMap.get(decisionerType); - log.info("执行出入库规格:"+decisioner.strategyConfig.getStrategy_name()); + log.info("执行出入库规格:" + decisioner.strategyConfig.getStrategy_name()); //执行不同的分配策略,出入库策略,扩展策略 list = decisioner.handler(list, startPatam); - if (CollectionUtils.isEmpty(list)){ - throw new BadRequestException("当前策略"+decisioner.strategyConfig.getStrategy_name()+"无可用货位,分配前数量:"+transfers.size()); + if (CollectionUtils.isEmpty(list)) { + String storCode = startPatam.getString("stor_code"); + if (storCode.equals(StatusEnum.STOCK_INFO.code("料箱库"))) { + IStIvtStructattrService iStIvtStructattrService = SpringContextHolder.getBean(IStIvtStructattrService.class); + QueryWrapper query = new QueryWrapper() + .eq("is_used", true) + .eq("sect_code", "LXBCP02") + .eq("lock_type", StatusEnum.LOCK.code("无锁")) + .eq("stor_code", StatusEnum.STOCK_INFO.code("料箱库")); + query.isNull("vehicle_code"); + list = iStIvtStructattrService.list(query); + SameBlockNumRuleHandler sameBlockNumRuleHandler = SpringContextHolder.getBean(SameBlockNumRuleHandler.class); + list = sameBlockNumRuleHandler.handler(list, null); + if (CollectionUtils.isEmpty(list)) { + throw new BadRequestException("当前载具:" + startPatam.getString("vehicle_code") + "申请任务失败,没有可用仓位!"); + } + } else { + throw new BadRequestException("当前策略" + decisioner.strategyConfig.getStrategy_name() + "无可用货位,分配前数量:" + transfers.size()); + } } } return list; diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/decision_manage/handler/chainer/impl/StartDecisionChainer.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/decision_manage/handler/chainer/impl/StartDecisionChainer.java index d0e49575..922516e2 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/decision_manage/handler/chainer/impl/StartDecisionChainer.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/decision_manage/handler/chainer/impl/StartDecisionChainer.java @@ -2,22 +2,14 @@ package org.nl.wms.decision_manage.handler.chainer.impl; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import lombok.Data; -import org.apache.poi.ss.formula.functions.T; import org.nl.common.domain.exception.BadRequestException; import org.nl.common.enums.StatusEnum; import org.nl.common.utils.MapOf; import org.nl.common.utils.SpringContextHolder; import org.nl.wms.decision_manage.handler.chainer.DecisionerChain; -import org.nl.wms.flow_manage.flow.framework.engine.cmd.unify.Command; -import org.nl.wms.flow_manage.flow.framework.entity.ExecutionEntity; -import org.nl.wms.flow_manage.flow.framework.process.nodeType.excess.impl.DecisionHandler; -import org.nl.wms.md_manage.vehicleMater.service.IMdPbVehicleMaterService; -import org.nl.wms.md_manage.vehicleMater.service.dao.MdPbVehicleMater; import org.nl.wms.stor_manage.struct.service.IStIvtStructattrService; import org.nl.wms.stor_manage.struct.service.dao.StIvtStructattr; -import org.nl.wms.stor_manage.struct.service.dto.StructattrVechielDto; import org.springframework.util.CollectionUtils; import java.util.ArrayList; @@ -54,6 +46,9 @@ public class StartDecisionChainer extends DecisionerChain { .eq("lock_type", StatusEnum.LOCK.code("无锁")) .eq("stor_code", startParam.getString("stor_code")); query.isNull("vehicle_code"); + if ("FStockId".equals(startParam.getString("stor_code"))) { + query.eq("sect_code", "LXBCP01"); + } list = iStIvtStructattrService.list(query); }else { //出库流程由于有货货位较多:会生成多个对象容易内存益出,在fifo中直接通过materilal过滤目标 diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/decision_manage/handler/decisioner/impl/base/AlleyAveRuleHandler.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/decision_manage/handler/decisioner/impl/base/AlleyAveRuleHandler.java index 9f241c68..56f1177d 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/decision_manage/handler/decisioner/impl/base/AlleyAveRuleHandler.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/decision_manage/handler/decisioner/impl/base/AlleyAveRuleHandler.java @@ -2,23 +2,23 @@ package org.nl.wms.decision_manage.handler.decisioner.impl.base; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.ObjectUtils; import org.nl.common.domain.exception.BadRequestException; import org.nl.common.utils.ListOf; import org.nl.common.utils.MapOf; -import org.nl.wms.stor_manage.io.service.iostor_dtl.IStIvtIostorinvdtlService; +import org.nl.wms.decision_manage.handler.decisioner.Decisioner; +import org.nl.wms.pm_manage.form_data.service.dao.PmFormData; import org.nl.wms.stor_manage.struct.service.IStIvtStructattrService; import org.nl.wms.stor_manage.struct.service.dao.StIvtStructattr; import org.nl.wms.stor_manage.struct.service.dao.StIvtStructattr2; import org.nl.wms.stor_manage.struct.service.dto.StructattrQuery; -import org.nl.wms.decision_manage.handler.decisioner.Decisioner; -import org.nl.wms.pm_manage.form_data.service.dao.PmFormData; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import java.util.*; -import java.util.function.Predicate; import java.util.stream.Collectors; /* @@ -26,8 +26,8 @@ import java.util.stream.Collectors; * @Date 2024/4/6 16:18 * 巷道均衡策略:XYZ: 排列层 */ -@Service("alleyAve") @Slf4j +@Service("alleyAve") public class AlleyAveRuleHandler extends Decisioner { @@ -49,7 +49,14 @@ public class AlleyAveRuleHandler extends Decisioner public List handler(List list, JSONObject param) { // 判断仓位是否为空 if (CollectionUtils.isEmpty(list)) { - throw new BadRequestException("当前分配策略alleyAve无可用货位"); + throw new BadRequestException("均衡策略结果:载具号:" + param.getString("vehicle_code") + "当前分配策略无可用货位"); + } + long startTime1 = System.currentTimeMillis(); + if (ObjectUtils.isNotEmpty(list)) { + //扩展库不需要均衡策略 + if ("LXBCP02".equals(list.get(0).getSect_code())) { + return list; + } } /** * 根据XYZ进行均衡排序:排层列 @@ -66,17 +73,29 @@ public class AlleyAveRuleHandler extends Decisioner HashMap of1 = MapOf.of("x", rowNum1, "y", colNum1, "z", layerNum1); HashMap of2 = MapOf.of("x", rowNum2, "y", colNum2, "z", layerNum2); for (String sort : configList) { - if (of1.get(sort)>of2.get(sort)){ + if (of1.get(sort) > of2.get(sort)) { return 1; } - if (of1.get(sort) subList = list.subList(0, list.size()>10?10:list.size()); - log.info("均衡策略结果"+subList.stream().map(StIvtStructattr::getStruct_code).collect(Collectors.toList())); + List subList = list.subList(0, Math.min(list.size(), 10)); + StIvtStructattr result = iStIvtStructattrService.getOne( + new LambdaQueryWrapper() + .eq(StIvtStructattr::getStruct_code, subList.get(0).getStruct_code()) + ); + if (result.getVehicle_code() != null) { + log.error("均衡策略分配异常载具号" + param.getString("vehicle_code") + "分配异常,仓位: " + result.getStruct_code() + ",该仓位被其他任务的载具锁定"); + subList = subList.stream().filter(r -> !r.getStruct_code().equals(result.getStruct_code())).collect(Collectors.toList()); + } + log.info("均衡策略结果:载具号:" + param.getString("vehicle_code") + "分配结果: " + subList.stream().map(StIvtStructattr::getStruct_code).collect(Collectors.toList())); + log.info("均衡策略:载具号:"+param.getString("vehicle_code")+"获取仓位耗时:{}", System.currentTimeMillis() - startTime1); + if (subList.size() == 0) { + throw new BadRequestException("均衡策略结果:载具号:" + param.getString("vehicle_code") + "当前分配策略无可用货位"); + } return subList; } diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/decision_manage/handler/decisioner/impl/base/FIFORuleHandler.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/decision_manage/handler/decisioner/impl/base/FIFORuleHandler.java index c416d684..d755f7fa 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/decision_manage/handler/decisioner/impl/base/FIFORuleHandler.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/decision_manage/handler/decisioner/impl/base/FIFORuleHandler.java @@ -1,21 +1,18 @@ package org.nl.wms.decision_manage.handler.decisioner.impl.base; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.ObjectUtils; import org.nl.common.domain.exception.BadRequestException; import org.nl.common.utils.MapOf; - -import org.nl.wms.stor_manage.struct.service.IStIvtStructattrService; import org.nl.wms.decision_manage.handler.decisioner.Decisioner; +import org.nl.wms.stor_manage.struct.service.IStIvtStructattrService; import org.nl.wms.stor_manage.struct.service.dto.StructattrVechielDto; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; +import java.util.*; import java.util.stream.Collectors; /* @@ -33,20 +30,81 @@ public class FIFORuleHandler extends Decisioner handler(List list, JSONObject param) { + //分配数量 + int plan_qty = param.getInteger("qty"); + int finalPlan_qty = plan_qty; + //当前条件只有id,批次 + log.info("---------执行fifo出库分配规则---------"); + List vechielDtos = iStIvtStructattrService.collectVechicle(MapOf.of("material_id", param.getString("material_id") + , "pcsn", param.getString("pcsn") + , "stor_code", param.getString("stor_code") + , "plan_qty", plan_qty + , "is_lock", "false" + , "order_by", "md_pb_vehicleMater.pcsn asc") + ); + if (ObjectUtils.isEmpty(vechielDtos)) { + throw new BadRequestException("当前出库策略:先进先出,库存分配失败,失败原因:库存不足!"); + } + List disList = new ArrayList<>(); + Map> groupedMap = vechielDtos.stream() + .collect(Collectors.groupingBy( + StructattrVechielDto::getPcsn, + Collectors.collectingAndThen( + Collectors.toList(), + r -> r.stream() + .sorted(Comparator.comparing(StructattrVechielDto::getPcsn)) + .collect(Collectors.toList()) + ) + )); + LinkedHashMap> sortedGroupMap = groupedMap.entrySet().stream() + .sorted(Comparator.comparing(entry -> entry.getValue().get(0).getPcsn())) + .collect(Collectors.toMap( + Map.Entry::getKey, + Map.Entry::getValue, + (r, s) -> r, + LinkedHashMap::new + )); + for (Map.Entry> entry : sortedGroupMap.entrySet()) { + List sortedList = new ArrayList<>(entry.getValue()); + for (StructattrVechielDto structattr : sortedList) { + BigDecimal qty = structattr.getQty() != null ? structattr.getQty() : BigDecimal.ZERO; + BigDecimal frozen = structattr.getFrozen_qty() != null ? structattr.getFrozen_qty() : BigDecimal.ZERO; + int available = qty.subtract(frozen).intValue(); + if (available <= 0) { + continue; + } + if (finalPlan_qty <= available) { + structattr.setFrozen_qty(frozen.add(new BigDecimal(finalPlan_qty))); + disList.add(structattr); + finalPlan_qty = 0; + break; + } else { + structattr.setFrozen_qty(frozen.add(new BigDecimal(available))); + disList.add(structattr); + finalPlan_qty -= available; + } + } + if (finalPlan_qty <= 0) { + break; + } + } + return disList; + } /** * 巷道均衡策略 - * @param list :仓位集合 - * @param param:物料相关信息、出入类型:{ - * ioType: 出入类型 - * materialId: 物料标识 - * ... - * } + * + * @param list :仓位集合 + * @param param:物料相关信息、出入类型:{ ioType: 出入类型 + * materialId: 物料标识 + * ... + * } * @return List :仓位集合 */ - @Override - public List handler(List list, JSONObject param) { + // @Override + public List handler1(List list, JSONObject param) { // 判断仓位是否为空 // if (ObjectUtil.isEmpty(list)) { // throw new BadRequestException("库存分配失败:库存不足!"); diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/decision_manage/handler/decisioner/impl/base/LimitStorageRuleHandler.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/decision_manage/handler/decisioner/impl/base/LimitStorageRuleHandler.java index 806da199..ab3e0127 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/decision_manage/handler/decisioner/impl/base/LimitStorageRuleHandler.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/decision_manage/handler/decisioner/impl/base/LimitStorageRuleHandler.java @@ -2,6 +2,7 @@ package org.nl.wms.decision_manage.handler.decisioner.impl.base; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.nl.common.domain.exception.BadRequestException; import org.nl.wms.base_manage.vehicle.service.IBmVehicleInfoService; @@ -22,6 +23,7 @@ import java.util.stream.Collectors; * 货位限位策略: 限高,限宽,限长,限重 */ @Service("limitStorage") +@Slf4j public class LimitStorageRuleHandler extends Decisioner { @@ -43,21 +45,32 @@ public class LimitStorageRuleHandler extends Decisioner handler(List list, JSONObject param) { + + long startTime1 = System.currentTimeMillis(); // 判断仓位是否为空 // 判断策略类型 String vehicleCode = param.getString("vehicle_code"); BmVehicleInfo vehileInfo = bmVehicleInfoService.vehileInfo(vehicleCode); if (vehileInfo == null) { - throw new BadRequestException("当前载具信息不存在:" + vehicleCode + "!"); + throw new BadRequestException("限位策略,当前载具信息不存在:" + vehicleCode + "!"); } //限位策略特殊处理 String start_point = param.getString("start_point"); String errorTask = param.getString("errorTask"); - if ((StringUtils.isNotEmpty(start_point) && "1109".equals(start_point)) || StringUtils.isNotEmpty(errorTask)) { + log.info("限位策略:起点为" + start_point + ",载具号:" + vehicleCode + "执行策略前仓位位数为:" + list.size() + ",第一个仓位为:" + list.get(0).getStruct_code()); + if ((StringUtils.isNotBlank(start_point))) { + if ("1109".equals(start_point)) { + list = list.stream().filter(struct -> struct.getCol_num() > 2).collect(Collectors.toList()); + log.info("限位策略:起点为1109,载具号:" + vehicleCode + "排除小于3排的仓位成功!"); + } + } else if (StringUtils.isBlank(start_point) || StringUtils.isNotBlank(errorTask)) { list = list.stream().filter(struct -> struct.getCol_num() > 2).collect(Collectors.toList()); + log.info("限位策略:起点为1109,载具号:" + vehicleCode + "排除小于3排的仓位成功!"); } - List resultList = inHandler(list, vehileInfo); - return resultList; + List result = inHandler(list, vehileInfo); + log.info("限位策略:起点为" + start_point + ",载具号:" + vehicleCode + "执行策略后仓位位数为:" + result.size() + ",第一个仓位为:" + result.get(0).getStruct_code()); + log.info("限位策略:载具号:"+vehicleCode+"获取仓位耗时:{}", System.currentTimeMillis() - startTime1); + return result; } /** diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/decision_manage/handler/decisioner/impl/base/NearbyRuleHandler.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/decision_manage/handler/decisioner/impl/base/NearbyRuleHandler.java index c33be072..75ff1c95 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/decision_manage/handler/decisioner/impl/base/NearbyRuleHandler.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/decision_manage/handler/decisioner/impl/base/NearbyRuleHandler.java @@ -16,6 +16,7 @@ import org.springframework.util.CollectionUtils; import java.util.ArrayList; import java.util.Comparator; import java.util.List; +import java.util.stream.Collectors; /* * @author ZZQ @@ -53,11 +54,11 @@ public class NearbyRuleHandler extends Decisioner { throw new BadRequestException("当前分配策略无可用货位"); } List before = list.subList(0, list.size()>10?10:list.size()); - log.info("就近分配前:"+ before); + log.info("就近分配前:"+ before.stream().map(StIvtStructattr::getStruct_code).collect(Collectors.joining(","))); list.sort(Comparator.comparingInt(i -> i.getRow_num()+i.getCol_num()+i.getLayer_num())); //就近分配区分出库还是入库策略 List subList = list.subList(0, list.size()>10?10:list.size()); - log.info("就近分配结果:"+ subList); + log.info("就近分配结果:"+ subList.stream().map(StIvtStructattr::getStruct_code).collect(Collectors.joining(","))); return subList; } } diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/decision_manage/handler/decisioner/impl/diy/DepthPriorityHandler.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/decision_manage/handler/decisioner/impl/diy/DepthPriorityHandler.java index 8d638bb1..f2679ea8 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/decision_manage/handler/decisioner/impl/diy/DepthPriorityHandler.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/decision_manage/handler/decisioner/impl/diy/DepthPriorityHandler.java @@ -3,6 +3,7 @@ package org.nl.wms.decision_manage.handler.decisioner.impl.diy; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; import org.nl.common.enums.StatusEnum; import org.nl.common.utils.SpringContextHolder; import org.nl.wms.decision_manage.handler.decisioner.Decisioner; @@ -10,7 +11,10 @@ import org.nl.wms.stor_manage.struct.service.IStIvtStructattrService; import org.nl.wms.stor_manage.struct.service.dao.StIvtStructattr; import org.springframework.stereotype.Service; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Set; import java.util.stream.Collectors; /* @@ -27,7 +31,14 @@ public class DepthPriorityHandler extends Decisioner handler(List list, JSONObject param) { + if (CollectionUtils.isNotEmpty(list)) { + //托盘库和扩展库不需要深位判断 + if (list.get(0).getStor_code().equals(StatusEnum.STOCK_INFO.code("托盘库")) || "LXBCP02".equals(list.get(0).getSect_code())) { + return list; + } + } long startTime1 = System.currentTimeMillis(); + List returnResult = new ArrayList<>(); // 深货位 List depCollect = list.stream() .filter(a -> a.getRow_num() == 1 || a.getRow_num() == 4) @@ -43,19 +54,31 @@ public class DepthPriorityHandler extends Decisioner 0) { + if (returnResult.size() < 3) { + return getOtherStructattr(list, param, startTime1, depCollect); + } else { + log.info("深位优先策略:载具号:" + param.getString("vehicle_code") + "分配结果: 存在深位并对应浅位无货的库位,分配仓位:" + returnResult.get(0).getStruct_code()); + log.info("深位优先策略:载具号:"+param.getString("vehicle_code")+"获取深货位且浅货位无货仓位耗时:{}", System.currentTimeMillis() - startTime1); + return returnResult; + } + } else { + return getOtherStructattr(list, param, startTime1, depCollect); } - //获取浅货位对应无锁的深货位 + } + + private static List getOtherStructattr(List list, JSONObject param, long startTime1, List depCollect) { + // if (!depCollect.isEmpty()) { + // log.info("深位优先策略:载具号:" + param.getString("vehicle_code") + "分配结果: 存在深位无货但对应浅位有货的库位,需要移库,分配仓位:" + depCollect.get(0).getStruct_code()); + // log.info("深位优先策略:获取深货位无货且浅货位有货仓位耗时:{}", System.currentTimeMillis() - startTime1); + // return depCollect; + // } + //浅货位,则需要判断对应 IStIvtStructattrService iStIvtStructattrService = SpringContextHolder.getBean(IStIvtStructattrService.class); if (list.get(0).getStor_code().equals(StatusEnum.STOCK_INFO.code("料箱库"))) { List list1 = iStIvtStructattrService.list(new LambdaUpdateWrapper() @@ -63,6 +86,7 @@ public class DepthPriorityHandler extends Decisioner combinedResult = new ArrayList<>(); //1排 @@ -96,7 +120,8 @@ public class DepthPriorityHandler extends Decisioner(HttpStatus.OK); } - @GetMapping("/taskSchedule") + @PostMapping ("/taskSchedule") @Log("任务调度") - public ResponseEntity taskSchedule() { - iSchBaseTaskService.deleteCtuStruct(); + public ResponseEntity taskSchedule(@RequestBody List list) { + iSchBaseTaskService.taskSchedule(list); return new ResponseEntity<>(HttpStatus.OK); } @GetMapping("/taskMsgSchedule") diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/handler/impl/GroupDickInStorageTask.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/handler/impl/GroupDickInStorageTask.java index 95c66326..ea1369fa 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/handler/impl/GroupDickInStorageTask.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/handler/impl/GroupDickInStorageTask.java @@ -133,7 +133,7 @@ public class GroupDickInStorageTask extends AbstractTask { data.put("status", StatusEnum.FORM_STATUS.code("完成")); this.updateTask(data); SchBaseTask schBaseTask = iSchBaseTaskService.getOne(new QueryWrapper().eq("task_code", data.getString("task_code"))); - //跟新库存 + //更新库存 iStIvtStructattrService.changeStruct(schBaseTask.getPoint_code1(),schBaseTask.getVehicle_code(),schBaseTask.getTask_type(), null,Boolean.TRUE,schBaseTask.getPoint_code2()); } diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/handler/impl/InStorageTask.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/handler/impl/InStorageTask.java index 6e04eceb..15ddd7fa 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/handler/impl/InStorageTask.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/handler/impl/InStorageTask.java @@ -16,6 +16,7 @@ import org.nl.wms.dispatch_manage.task.service.ISchBaseTaskService; import org.nl.wms.dispatch_manage.task.service.dao.SchBaseTask; import org.nl.wms.md_manage.vehicleMater.service.IMdPbVehicleMaterService; import org.nl.wms.md_manage.vehicleMater.service.dao.MdPbVehicleMater; +import org.nl.wms.md_manage.vehicleMater.service.dto.MdPbVehicleMaterVo; import org.nl.wms.stor_manage.struct.service.IStIvtStructattrService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -23,6 +24,7 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import java.util.List; +import java.util.Objects; import java.util.stream.Collectors; /* @@ -68,6 +70,15 @@ public class InStorageTask extends AbstractTask { task.setVehicle_code(vehicle_code); task.setPoint_code1(start_point); task.setPoint_code2(struct_code); + task.setProduct_area(struct_code.contains("B") ? "A3" : "A1"); + List materList = iMdPbVehicleMaterService.getVehicleMaters(vehicle_code); + if (materList.size() > 0) { + MdPbVehicleMaterVo mater = materList.get(0); + String materialCode = "物料编码:" + Objects.toString(mater.getMaterial_code(), "") + + " | 数量:" + Objects.toString(mater.getQty() != null ? mater.getQty().toBigInteger() : "", "") + + " | 批号:" + Objects.toString(mater.getPcsn(), ""); + task.setForm_data(materialCode); + } iSchBaseTaskService.create(task); iMdPbVehicleMaterService.update(new LambdaUpdateWrapper() .set(MdPbVehicleMater::getTask_code,task.getTask_code()) @@ -80,12 +91,13 @@ public class InStorageTask extends AbstractTask { @Override @Transactional public void finish(JSONObject data) { - data.put("status",StatusEnum.FORM_STATUS.code("完成")); - this.updateTask(data); SchBaseTask schBaseTask = iSchBaseTaskService.getOne(new QueryWrapper().eq("task_code", data.getString("task_code"))); - //跟新库存 - iStIvtStructattrService.changeStruct(schBaseTask.getPoint_code2(),schBaseTask.getVehicle_code(),schBaseTask.getTask_type(), null,Boolean.TRUE,schBaseTask.getPoint_code2()); - + if (!schBaseTask.getStatus().equals(StatusEnum.FORM_STATUS.code("完成"))) { + data.put("status", StatusEnum.FORM_STATUS.code("完成")); + this.updateTask(data); + //更新库存 + iStIvtStructattrService.changeStruct(schBaseTask.getPoint_code2(), schBaseTask.getVehicle_code(), schBaseTask.getTask_type(), null, Boolean.TRUE, schBaseTask.getPoint_code2()); + } } @Override diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/handler/impl/OutStorageTask.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/handler/impl/OutStorageTask.java index 6cc91a42..d153b486 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/handler/impl/OutStorageTask.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/handler/impl/OutStorageTask.java @@ -18,11 +18,9 @@ import org.nl.wms.dispatch_manage.task.service.dao.SchBaseTask; import org.nl.wms.flow_manage.flow.framework.process.nodeType.excess.impl.DecisionHandler; import org.nl.wms.md_manage.vehicleMater.service.IMdPbVehicleMaterService; import org.nl.wms.md_manage.vehicleMater.service.dao.MdPbVehicleMater; -import org.nl.wms.pm_manage.form_data.service.IPmFormDataService; +import org.nl.wms.md_manage.vehicleMater.service.dto.MdPbVehicleMaterVo; import org.nl.wms.stor_manage.struct.service.IStIvtStructattrService; import org.nl.wms.stor_manage.struct.service.dao.StIvtStructattr; -import org.redisson.api.RLock; -import org.redisson.api.RedissonClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; @@ -31,7 +29,7 @@ import org.springframework.util.CollectionUtils; import java.util.List; import java.util.Map; -import java.util.concurrent.TimeUnit; +import java.util.Objects; import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Collectors; @@ -107,26 +105,39 @@ public class OutStorageTask extends AbstractTask { } SchBaseTask task = new SchBaseTask(); task.setId(IdUtil.getStringId()); - task.setTask_code(CodeUtil.getNewCode("TASK_CODE")); - task.setStatus(StatusEnum.FORM_STATUS.code("生成")); - task.setHandle_class(this.getClass().getName()); - task.setAcs_type(StatusEnum.ACS_TYPE.code("立库")); - task.setCreate_time(DateUtil.now()); - task.setCreate_name(SecurityUtils.getCurrentNickName()); - task.setTask_type(from.getString("task_type")); - task.setVehicle_code(vehicle_code); - task.setPoint_code1(end_struct_code); - task.setPoint_code2(target_point); - taskService.save(task); - iMdPbVehicleMaterService.update(new LambdaUpdateWrapper() - .set(MdPbVehicleMater::getTask_code, task.getTask_code()) - .eq(MdPbVehicleMater::getVehicle_code, task.getVehicle_code()) - .eq(MdPbVehicleMater::getIs_delete, false)); - Boolean isSend = from.getBoolean("is_send"); - if (isSend) { - //参数封装,调acs接口 - } - return (JSONObject) JSON.toJSON(task); + task.setTask_code(CodeUtil.getNewCode("TASK_CODE")); + task.setStatus(StatusEnum.FORM_STATUS.code("生成")); + task.setHandle_class(this.getClass().getName()); + task.setAcs_type(StatusEnum.ACS_TYPE.code("立库")); + task.setCreate_time(DateUtil.now()); + task.setCreate_name(SecurityUtils.getCurrentNickName()); + task.setTask_type(from.getString("task_type")); + task.setVehicle_code(vehicle_code); + task.setPoint_code1(end_struct_code); + task.setPoint_code2(target_point); + task.setProduct_area(end_struct_code.contains("B") ? "A3" : "A1"); + List materList = iMdPbVehicleMaterService.getVehicleMaters(vehicle_code); + if (materList.size() > 0) { + MdPbVehicleMaterVo mater = materList.get(0); + String materialCode = "物料编码:" + Objects.toString(mater.getMaterial_code(), "") + + " | 数量:" + Objects.toString(mater.getFrozen_qty() != null ? mater.getFrozen_qty().toBigInteger() : "", "") + + " | 批号:" + Objects.toString(mater.getPcsn(), ""); + task.setForm_data(materialCode); + if("2114".equals(target_point)) + { + + } + } + taskService.save(task); + iMdPbVehicleMaterService.update(new LambdaUpdateWrapper() + .set(MdPbVehicleMater::getTask_code, task.getTask_code()) + .eq(MdPbVehicleMater::getVehicle_code, task.getVehicle_code()) + .eq(MdPbVehicleMater::getIs_delete, false)); + Boolean isSend = from.getBoolean("is_send"); + if (isSend) { + //参数封装,调acs接口 + } + return (JSONObject) JSON.toJSON(task); } @Transactional(propagation= Propagation.REQUIRES_NEW) diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/handler/impl/PalletInStorageTask.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/handler/impl/PalletInStorageTask.java index 60730fb1..e07c60be 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/handler/impl/PalletInStorageTask.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/handler/impl/PalletInStorageTask.java @@ -154,7 +154,7 @@ public class PalletInStorageTask extends AbstractTask { data.put("status", StatusEnum.FORM_STATUS.code("完成")); this.updateTask(data); SchBaseTask schBaseTask = iSchBaseTaskService.getOne(new QueryWrapper().eq("task_code", data.getString("task_code"))); - //跟新库存 + //更新库存 iStIvtStructattrService.changeStruct(schBaseTask.getPoint_code2(),schBaseTask.getVehicle_code(),schBaseTask.getTask_type(), null,Boolean.TRUE,schBaseTask.getPoint_code2()); } diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/handler/impl/PalletOutStorageTask.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/handler/impl/PalletOutStorageTask.java index 0ea6ebe8..97af3634 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/handler/impl/PalletOutStorageTask.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/handler/impl/PalletOutStorageTask.java @@ -17,6 +17,7 @@ import org.nl.wms.dispatch_manage.task.service.dao.SchBaseTask; import org.nl.wms.flow_manage.flow.framework.process.nodeType.excess.impl.DecisionHandler; import org.nl.wms.md_manage.vehicleMater.service.IMdPbVehicleMaterService; import org.nl.wms.md_manage.vehicleMater.service.dao.MdPbVehicleMater; +import org.nl.wms.md_manage.vehicleMater.service.dto.MdPbVehicleMaterVo; import org.nl.wms.stor_manage.struct.service.IStIvtStructattrService; import org.nl.wms.stor_manage.struct.service.dao.StIvtStructattr; import org.springframework.beans.factory.annotation.Autowired; @@ -27,6 +28,7 @@ import org.springframework.util.CollectionUtils; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Collectors; @@ -93,6 +95,14 @@ public class PalletOutStorageTask extends AbstractTask { task.setVehicle_code(vehicle_code); task.setPoint_code1(end_struct_code); task.setPoint_code2(target_point); + List materList = iMdPbVehicleMaterService.getVehicleMaters(vehicle_code); + if (materList.size() > 0) { + MdPbVehicleMaterVo mater = materList.get(0); + String materialCode = "物料编码:" + Objects.toString(mater.getMaterial_code(), "") + + " | 数量:" + Objects.toString(mater.getFrozen_qty() != null ? mater.getFrozen_qty().toBigInteger() : "", "") + + " | 批号:" + Objects.toString(mater.getPcsn(), ""); + task.setForm_data(materialCode); + } taskService.save(task); iMdPbVehicleMaterService.update(new LambdaUpdateWrapper() .set(MdPbVehicleMater::getTask_code,task.getTask_code()) diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/handler/impl/PickStorageTask.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/handler/impl/PickStorageTask.java index 723ddd9e..6223f558 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/handler/impl/PickStorageTask.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/handler/impl/PickStorageTask.java @@ -16,6 +16,7 @@ import org.nl.wms.dispatch_manage.task.service.ISchBaseTaskService; import org.nl.wms.dispatch_manage.task.service.dao.SchBaseTask; import org.nl.wms.md_manage.vehicleMater.service.IMdPbVehicleMaterService; import org.nl.wms.md_manage.vehicleMater.service.dao.MdPbVehicleMater; +import org.nl.wms.md_manage.vehicleMater.service.dto.MdPbVehicleMaterVo; import org.nl.wms.stor_manage.struct.service.IStIvtStructattrService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -23,6 +24,7 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import java.util.List; +import java.util.Objects; import java.util.stream.Collectors; /* @@ -55,29 +57,38 @@ public class PickStorageTask extends AbstractTask { List list = iSchBaseTaskService.list(new QueryWrapper() .eq("task_type", from.getString("task_type")) .lt("status", StatusEnum.FORM_STATUS.code("完成"))); - if (!CollectionUtils.isEmpty(list)){ - throw new BadRequestException("当前载具存在任务:"+list.stream().map(SchBaseTask::getTask_code).collect(Collectors.joining(","))); + if (!CollectionUtils.isEmpty(list)) { + throw new BadRequestException("当前载具存在任务:" + list.stream().map(SchBaseTask::getTask_code).collect(Collectors.joining(","))); } SchBaseTask task = new SchBaseTask(); - task.setId(IdUtil.getStringId()); - task.setTask_code(CodeUtil.getNewCode("TASK_CODE")); - task.setStatus(StatusEnum.FORM_STATUS.code("生成")); - task.setHandle_class(this.getClass().getName()); + task.setId(IdUtil.getStringId()); + task.setTask_code(CodeUtil.getNewCode("TASK_CODE")); + task.setStatus(StatusEnum.FORM_STATUS.code("生成")); + task.setHandle_class(this.getClass().getName()); task.setAcs_type(StatusEnum.ACS_TYPE.code("立库")); - task.setCreate_time(DateUtil.now()); - task.setCreate_name(SecurityUtils.getCurrentNickName()); - task.setTask_type(from.getString("task_type")); - task.setVehicle_code(vehicle_code); - task.setPoint_code1(struct_code); - task.setPoint_code2(target_point); + task.setCreate_time(DateUtil.now()); + task.setCreate_name(SecurityUtils.getCurrentNickName()); + task.setTask_type(from.getString("task_type")); + task.setVehicle_code(vehicle_code); + task.setPoint_code1(struct_code); + task.setPoint_code2(target_point); + task.setProduct_area(struct_code.contains("B") ? "A3" : "A1"); + List materList = iMdPbVehicleMaterService.getVehicleMaters(vehicle_code); + if (materList.size() > 0) { + MdPbVehicleMaterVo mater = materList.get(0); + String materialCode = "物料编码:" + Objects.toString(mater.getMaterial_code(), "") + + " | 数量:" + Objects.toString(mater.getFrozen_qty() != null ? mater.getFrozen_qty().toBigInteger() : "", "") + + " | 批号:" + Objects.toString(mater.getPcsn(), ""); + task.setForm_data(materialCode); + } iSchBaseTaskService.save(task); iMdPbVehicleMaterService.update(new LambdaUpdateWrapper() - .set(MdPbVehicleMater::getTask_code,task.getTask_code()) - .eq(MdPbVehicleMater::getVehicle_code,task.getVehicle_code()) - .eq(MdPbVehicleMater::getIs_delete,false)); + .set(MdPbVehicleMater::getTask_code, task.getTask_code()) + .eq(MdPbVehicleMater::getVehicle_code, task.getVehicle_code()) + .eq(MdPbVehicleMater::getIs_delete, false)); //TODO:是否下发 Boolean isSend = from.getBoolean("is_send"); - if (isSend){ + if (isSend) { //参数封装,调acs接口 } return (JSONObject)JSON.toJSON(task); @@ -93,7 +104,7 @@ public class PickStorageTask extends AbstractTask { data.put("status", StatusEnum.FORM_STATUS.code("完成")); this.updateTask(data); SchBaseTask schBaseTask = iSchBaseTaskService.getOne(new QueryWrapper().eq("task_code", data.getString("task_code"))); - //跟新库存 + //更新库存 iStIvtStructattrService.changeStruct(schBaseTask.getPoint_code2(),schBaseTask.getVehicle_code(),schBaseTask.getTask_type(), null,Boolean.TRUE,schBaseTask.getPoint_code2()); } diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/handler/impl/SecondFloorInStorageTask.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/handler/impl/SecondFloorInStorageTask.java index fed04274..16e64ca9 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/handler/impl/SecondFloorInStorageTask.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/handler/impl/SecondFloorInStorageTask.java @@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.nl.common.domain.exception.BadRequestException; import org.nl.common.enums.StatusEnum; @@ -102,8 +103,8 @@ public class SecondFloorInStorageTask extends AbstractTask { if (vehicleInfo.getH() == null) { throw new BadRequestException("申请任务失败:载具" + vehicleCode + "高度等级信息不能为空"); } - List item = iMdPbVehicleMaterService.list(new LambdaQueryWrapper().eq(MdPbVehicleMater::getVehicle_code, vehicleCode)); - if (CollectionUtils.isEmpty(item)) { + List item = iMdPbVehicleMaterService.list(new LambdaQueryWrapper().eq(MdPbVehicleMater::getVehicle_code, vehicleCode).eq(MdPbVehicleMater::getIs_delete, false)); + if (ObjectUtils.isEmpty(item)) { throw new BadRequestException("申请任务失败:载具" + vehicleCode + "载具物料信息信息不存在"); } List list = iSchBaseTaskService.list(new QueryWrapper().eq("vehicle_code", vehicleCode) @@ -165,7 +166,7 @@ public class SecondFloorInStorageTask extends AbstractTask { .eq("vehicle_code", schBaseTask.getVehicle_code()) .eq("is_delete", false)); if (ObjectUtil.isEmpty(vehicleMaterList)) { - throw new BadRequestException("任务完成失败,到载具物料信息: " + schBaseTask.getVehicle_code()); + throw new BadRequestException("任务完成失败,未找到载具物料信息: " + schBaseTask.getVehicle_code()); } MdPbVehicleMater vehicleMater = vehicleMaterList.get(0); StIvtStructattr attr = iStIvtStructattrService.getOne(new QueryWrapper().eq("struct_code", schBaseTask.getPoint_code2()).select("stor_code")); diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/handler/impl/SecondFloorOutStorageTask.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/handler/impl/SecondFloorOutStorageTask.java index d282ef89..f10a2bc3 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/handler/impl/SecondFloorOutStorageTask.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/handler/impl/SecondFloorOutStorageTask.java @@ -178,7 +178,7 @@ public class SecondFloorOutStorageTask extends AbstractTask { .eq("vehicle_code", schBaseTask.getVehicle_code()) .eq("is_delete", false)); if (ObjectUtil.isEmpty(vehicleMaterList)) { - throw new BadRequestException("任务完成失败,到载具物料信息: " + schBaseTask.getVehicle_code()); + throw new BadRequestException("任务完成失败,未找到载具物料信息: " + schBaseTask.getVehicle_code()); } //扣库存 MdPbVehicleMater vehicleMater = vehicleMaterList.get(0); diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/handler/impl/ToPickPlatformTask.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/handler/impl/ToPickPlatformTask.java index fa35bf29..dd386ddb 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/handler/impl/ToPickPlatformTask.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/handler/impl/ToPickPlatformTask.java @@ -21,6 +21,7 @@ import org.nl.wms.dispatch_manage.task.service.ISchBaseTaskService; import org.nl.wms.dispatch_manage.task.service.dao.SchBaseTask; import org.nl.wms.md_manage.vehicleMater.service.IMdPbVehicleMaterService; import org.nl.wms.md_manage.vehicleMater.service.dao.MdPbVehicleMater; +import org.nl.wms.md_manage.vehicleMater.service.dto.MdPbVehicleMaterVo; import org.nl.wms.stor_manage.struct.service.IStIvtStructattrService; import org.nl.wms.stor_manage.struct.service.dao.StIvtStructattr; import org.springframework.beans.factory.annotation.Autowired; @@ -29,6 +30,7 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import java.util.List; +import java.util.Objects; import java.util.stream.Collectors; /* @@ -73,7 +75,6 @@ public class ToPickPlatformTask extends AbstractTask { } target_point = code; } - if (StringUtils.isEmpty(vehicle_code) ||StringUtils.isEmpty(target_point)){ throw new BadRequestException("创建任务失败:方法请求参数不能为空"); } @@ -95,26 +96,35 @@ public class ToPickPlatformTask extends AbstractTask { } SchBaseTask task = new SchBaseTask(); task.setId(IdUtil.getStringId()); - task.setTask_code(CodeUtil.getNewCode("TASK_CODE")); - task.setStatus(StatusEnum.FORM_STATUS.code("生成")); - task.setHandle_class(this.getClass().getName()); + task.setTask_code(CodeUtil.getNewCode("TASK_CODE")); + task.setStatus(StatusEnum.FORM_STATUS.code("生成")); + task.setHandle_class(this.getClass().getName()); task.setAcs_type(StatusEnum.ACS_TYPE.code("立库")); - task.setCreate_time(DateUtil.now()); - task.setCreate_name(SecurityUtils.getCurrentNickName()); - task.setTask_type(from.getString("task_type")); - task.setVehicle_code(vehicle_code); - task.setPoint_code1(start_struct_code); - task.setPoint_code2(target_point); + task.setCreate_time(DateUtil.now()); + task.setCreate_name(SecurityUtils.getCurrentNickName()); + task.setTask_type(from.getString("task_type")); + task.setVehicle_code(vehicle_code); + task.setPoint_code1(start_struct_code); + task.setPoint_code2(target_point); + task.setProduct_area(start_struct_code.contains("B") ? "A3" : "A1"); + List materList = iMdPbVehicleMaterService.getVehicleMaters(vehicle_code); + if (materList.size() > 0) { + MdPbVehicleMaterVo mater = materList.get(0); + String materialCode = "物料编码:" + Objects.toString(mater.getMaterial_code(), "") + + " | 数量:" + Objects.toString(mater.getFrozen_qty() != null ? mater.getFrozen_qty().toBigInteger() : "", "") + + " | 批号:" + Objects.toString(mater.getPcsn(), ""); + task.setForm_data(materialCode); + } iSchBaseTaskService.save(task); Lask_Point = target_point; - log.info("当前拣选平台分配位置:{},{}",Lask_Point,target_point); + log.info("当前拣选平台分配位置:{},{}", Lask_Point, target_point); iMdPbVehicleMaterService.update(new LambdaUpdateWrapper() - .set(MdPbVehicleMater::getTask_code,task.getTask_code()) - .eq(MdPbVehicleMater::getVehicle_code,task.getVehicle_code()) - .eq(MdPbVehicleMater::getIs_delete,false)); + .set(MdPbVehicleMater::getTask_code, task.getTask_code()) + .eq(MdPbVehicleMater::getVehicle_code, task.getVehicle_code()) + .eq(MdPbVehicleMater::getIs_delete, false)); //TODO:是否下发 Boolean isSend = from.getBoolean("is_send"); - if (isSend){ + if (isSend) { //参数封装,调acs接口 } return (JSONObject)JSON.toJSON(task); diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/service/ISchBaseTaskService.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/service/ISchBaseTaskService.java index 18afa92f..59a6263a 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/service/ISchBaseTaskService.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/service/ISchBaseTaskService.java @@ -57,6 +57,8 @@ public interface ISchBaseTaskService extends IService { void deleteAll(Set ids); public void deleteCtuStruct(); + void taskSchedule(List list); + /** * 任务操作 * diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/service/dao/mapper/xml/SchBaseTaskMapper.xml b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/service/dao/mapper/xml/SchBaseTaskMapper.xml index 712e7634..d5c201db 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/service/dao/mapper/xml/SchBaseTaskMapper.xml +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/service/dao/mapper/xml/SchBaseTaskMapper.xml @@ -32,6 +32,13 @@ AND t.create_time =]]> #{whereJson.start_time} + + AND t.is_delete = #{whereJson.is_delete} + + + AND (t.point_code1 LIKE '%L%' + AND t.point_code2 = '2114') + AND t.status IN @@ -54,7 +61,7 @@ st_ivt_iostorinvdtl LEFT JOIN st_ivt_iostorinv ON st_ivt_iostorinv.id = st_ivt_iostorinvdtl.inv_id WHERE - vehicle_code = #{vehicle_code} + vehicle_code LIKE '%${vehicle_code}%' AND pcsn = #{pcsn} AND st_ivt_iostorinv.STATUS 80 diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/service/dto/SchBaseTaskQuery.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/service/dto/SchBaseTaskQuery.java index 24f97098..57f59ffa 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/service/dto/SchBaseTaskQuery.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/service/dto/SchBaseTaskQuery.java @@ -19,7 +19,9 @@ public class SchBaseTaskQuery implements Serializable { private String end_time; private String more_status; private String unFinished; - + private String allBoxOut; private String config_code; + private String is_delete="0"; + } diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/service/impl/SchBaseTaskServiceImpl.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/service/impl/SchBaseTaskServiceImpl.java index 9cd38c9c..70f059af 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/service/impl/SchBaseTaskServiceImpl.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/service/impl/SchBaseTaskServiceImpl.java @@ -13,6 +13,7 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.nl.common.TableDataInfo; @@ -40,10 +41,13 @@ import org.nl.wms.stor_manage.struct.service.IStIvtStructattrService; import org.nl.wms.stor_manage.struct.service.dao.StIvtStructattr; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; +import org.springframework.scheduling.annotation.Async; +import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; +import java.math.BigDecimal; import java.util.*; import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Collectors; @@ -57,6 +61,8 @@ import java.util.stream.Collectors; * @since 2024-05-06 */ @Service +@Slf4j +@EnableAsync public class SchBaseTaskServiceImpl extends ServiceImpl implements ISchBaseTaskService { @Autowired @@ -75,8 +81,17 @@ public class SchBaseTaskServiceImpl extends ServiceImpl queryAll(SchBaseTaskQuery whereJson, PageQuery page) { + //默认显示未下发的拣选任务 + if ("84".equals(whereJson.getTask_type())) { + if (whereJson.getMore_status() == null) { + whereJson.setMore_status("10"); + } + whereJson.setAllBoxOut("1"); + whereJson.setTask_type(null); + } List collect = ObjectUtil.isNotEmpty(whereJson.getMore_status()) ? Arrays.stream(whereJson.getMore_status().split(",")).collect(Collectors.toList()) : null; if (collect != null) { @@ -132,6 +147,33 @@ public class SchBaseTaskServiceImpl extends ServiceImpl list) { + list = list.stream().filter(r -> r.getStatus().equals(StatusEnum.FORM_STATUS.code("生成")) && "2114".equals(r.getPoint_code2())).collect(Collectors.toList()); + List taskCodes = list.stream().map(SchBaseTask::getTask_code).collect(Collectors.toList()); + log.info("---手动下发整出任务:-----taskSchedule-----" + taskCodes); + TableDataInfo response = wmsToAcsService.interationToExt(list, "createTask"); + if (!response.getCode().equals(String.valueOf(HttpStatus.HTTP_OK))) { + JSONArray results = (JSONArray) JSON.toJSON(response.getData()); + if (!CollectionUtils.isEmpty(results)) { + for (Object result : results) { + Map resultM = (Map) result; + taskCodes.remove(resultM.get("task_code")); + this.update(new UpdateWrapper() + .eq("task_code", resultM.get("task_code")) + .set("status", StatusEnum.FORM_STATUS.code("暂停")) + .set("update_time", DateUtil.now()).set("remark", resultM.get("msg"))); + } + } + } + if (!CollectionUtils.isEmpty(taskCodes)) { + this.update(new UpdateWrapper() + .set("status", StatusEnum.FORM_STATUS.code("下发")) + .in("task_code", taskCodes)); + } + } + + @Override public void create(SchBaseTask entity) { String nickName = SecurityUtils.getCurrentNickName(); @@ -148,6 +190,7 @@ public class SchBaseTaskServiceImpl extends ServiceImpl().eq("task_code", task_code)); @@ -158,23 +201,17 @@ public class SchBaseTaskServiceImpl extends ServiceImpl vehicleMaterList = iMdPbVehicleMaterService.list(new QueryWrapper() .eq("vehicle_code", task.getVehicle_code()) .eq("is_delete", false)); - if (ObjectUtils.isEmpty(vehicleMaterList)) { - throw new BadRequestException("当前任务未找到组盘信息"); - } - if (StringUtils.isNotBlank(vehicleMaterList.get(0).getProc_inst_id())) { - FlowContinueEvent continueEvent = new FlowContinueEvent(vehicleMaterList.get(0).getProc_inst_id(), null, null); - BussEventMulticaster.Publish(continueEvent); - } else { - handleFinishTask(param, task); + if (ObjectUtils.isNotEmpty(vehicleMaterList)) { + //排除移库和二楼CTU处理任务 + if (StringUtils.isNotBlank(vehicleMaterList.get(0).getProc_inst_id()) && !task.getTask_type().equals(StatusEnum.IOBILL_TYPE_MOVE.code("移库")) && !task.getProduct_area().equals(StatusEnum.PRODUCT_AREA.code("二层车间"))) { + FlowContinueEvent continueEvent = new FlowContinueEvent(vehicleMaterList.get(0).getProc_inst_id(), null, null); + BussEventMulticaster.Publish(continueEvent); + } } + handleFinishTask(param, task); } else if (param.getString("status").equals(StatusEnum.FORM_STATUS.code("下发"))) { ArrayList list = ListOf.of(task); if (!CollectionUtils.isEmpty(list)) { @@ -203,23 +240,28 @@ public class SchBaseTaskServiceImpl extends ServiceImpl vehicleMaterList = iMdPbVehicleMaterService.list( new QueryWrapper() - .eq("task_code", task.getTask_code()).eq("vehicle_code", task.getVehicle_code()) - - ); + .eq("task_code", task.getTask_code()).eq("vehicle_code", task.getVehicle_code()).eq("is_delete", "0")); if (ObjectUtils.isNotEmpty(vehicleMaterList)) { //查找非二楼任务的未完成的出库单与明细 if (StringUtils.isBlank(vehicleMaterList.get(0).getPrd_ppbom_no())) { List formData = this.getIoSourceFormData(task.getVehicle_code(), vehicleMaterList.get(0).getPcsn()); if (ObjectUtils.isNotEmpty(formData)) { - Map formDataMap = formData.get(0); - JSONObject formDataId = formDataMap.get("source_form_data"); + Map formDataMap = formData.get(0); + Object sourceFormData = formDataMap.get("source_form_data"); + JSONObject formDataId = JSONObject.parseObject((String) sourceFormData); String id = formDataId.getString("id"); String qty = formDataId.getString("qty"); if (StringUtils.isNotBlank(id) && StringUtils.isNotBlank(qty)) { + BigDecimal cancelQty = BigDecimal.valueOf(Long.parseLong(qty)).subtract(vehicleMaterList.get(0).getFrozen_qty()); iPmFormDataService.update(new LambdaUpdateWrapper() - .set(PmFormData::getQty, qty) - .eq(PmFormData::getId, formDataId)); + .set(PmFormData::getAssign_qty, cancelQty) + .eq(PmFormData::getId, id)); } + String msg = "该库存在执行出库单id为:" + id + ",任务号为:" + task.getTask_code() + ",触发空出或被手动取消,取消数量为:" + vehicleMaterList.get(0).getFrozen_qty(); + //冻结解锁 + iMdPbVehicleMaterService.update(new LambdaUpdateWrapper().set(MdPbVehicleMater::getFrozen_qty, 0).set(MdPbVehicleMater::getRemark, msg).eq(MdPbVehicleMater::getId, vehicleMaterList.get(0).getId())); + //库位空出 + iStIvtStructattrService.update(new LambdaUpdateWrapper().set(StIvtStructattr::getLock_type, StatusEnum.LOCK.code("空出锁")).set(StIvtStructattr::getRemark, msg).eq(StIvtStructattr::getVehicle_code, task.getVehicle_code())); } } } @@ -332,28 +374,36 @@ public class SchBaseTaskServiceImpl extends ServiceImpl() .eq("vehicle_code", task.getVehicle_code()) .eq("is_delete",false)); - //阻挡位锁定 + //阻挡位锁定,如果无载具,那么锁定为异常库位,需要人工查看库位情况 if (StringUtils.isEmpty(stIvtStructattr.getVehicle_code())){ iStIvtStructattrService.update(new UpdateWrapper() .eq("struct_code", stIvtStructattr.getStruct_code()) .set("lock_type", StatusEnum.LOCK.code("异常锁定")) .set("update_time", DateUtil.now()) .set("remark", "入满异常:" + task_code) - .set("vehicle_code", task_code+"_ZD_"+ org.nl.common.utils.IdUtil.getStringId())); + .set("vehicle_code", task_code + "_ZD_" + org.nl.common.utils.IdUtil.getStringId())); } //深货位锁定防止二次分配到 iStIvtStructattrService.update(new UpdateWrapper() .set("update_time", DateUtil.now()) .set("vehicle_code", null) - .set("remark", stIvtStructattr.getStruct_code() + "入满异常重新分配货位") + .set("remark", "该货位对应浅位:" + stIvtStructattr.getStruct_code() + "疑似有货,待查清浅位无货时,解开此异常锁") .set("lock_type", StatusEnum.LOCK.code("异常锁定")) .eq("struct_code", task.getPoint_code2())); + //如果是移库任务,则清除起点库位载具号,重新分配新目标库位,绑定载具号,防止唯一索引约束 + if (task.getTask_type().equals(StatusEnum.IOBILL_TYPE_MOVE.code("移库")) || task.getTask_type().equals(StatusEnum.IOBILL_TYPE_MOVE.code("异常位移库"))) { + iStIvtStructattrService.update(new UpdateWrapper() + .set("update_time", DateUtil.now()) + .set("vehicle_code", null) + .set("remark", "该货位进行移库任务号为:" + task.getTask_code() + "时,目标货位:" + task.getPoint_code2() + "为深位,存在浅位:"+stIvtStructattr.getStruct_code()+"阻挡,清除载具号,即将重新分配新目标货位。") + .eq("struct_code", task.getPoint_code1())); + } //查询分配规则 Map map = SpringContextHolder.getBean(DecisionHandler.class) - .dispenseTransa(ListOf.of("limitStorage","depthPriority","nearby") + .dispenseTransa(ListOf.of("limitStorage", "depthPriority", "nearby") , new JSONObject(MapOf.of("stor_code", stIvtStructattr.getStor_code() - ,"vehicle_code",task.getVehicle_code(), - "start_point",task.getPoint_code1(),"errorTask","errorTask"))); + , "vehicle_code", task.getVehicle_code(), + "start_point", task.getPoint_code1(), "errorTask", "errorTask"))); String new_struct_code = ((Map) map.get("form_data")).get("end_struct_code"); iActRuExecutionService.update(new UpdateWrapper() .set("remark", stIvtStructattr.getStruct_code() + "入满异常重新分配货位" + new_struct_code) @@ -362,8 +412,6 @@ public class SchBaseTaskServiceImpl extends ServiceImpl param){ + public JSONObject apply(InteracteDto param) { JSONObject jsonObject = new JSONObject(param.getData()); //处理日志相关 JSONObject result = new JSONObject(); @@ -59,7 +64,17 @@ public class GateWayService { Integer h = vehicle.getH(); result.putAll(MapOf.of("height",h,"type",h)); } - if (service.equals("Device")){ + if (service.equals("Device")) { + Assert.noNullElements(new Object[]{jsonObject.getString("devicePoint"), jsonObject.getString("status")}, "请求参数不能为空"); + if (!"1207".equals(jsonObject.getString("devicePoint")) && !"1210".equals(jsonObject.getString("devicePoint"))) { + throw new BadRequestException("您输入的拣选位不存在,请输入1207或1210拣选位!"); + } + RedissonUtils.lock(() -> { + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.set(SchBasePoint::getIs_used, "0".equals(jsonObject.getString("status")) ? 0 : 1); + updateWrapper.eq(SchBasePoint::getCode, "1207".equals(jsonObject.getString("devicePoint")) ? "1308" : "1311"); + iSchBasePointService.update(updateWrapper); + }, param.getService() + param.getType(), null); } if (service.equals("ErrorTask")){ AtomicReference reference = new AtomicReference<>(new JSONObject()); diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/external_system/acs/service/WmsToAcsService.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/external_system/acs/service/WmsToAcsService.java index 1327f16a..5e56bc59 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/external_system/acs/service/WmsToAcsService.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/external_system/acs/service/WmsToAcsService.java @@ -1,22 +1,13 @@ package org.nl.wms.external_system.acs.service; -import cn.hutool.core.convert.Convert; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import org.apache.commons.beanutils.ConvertUtils; import org.nl.common.TableDataInfo; import org.nl.common.utils.InterationUtil; import org.nl.common.utils.MapOf; -import org.nl.common.utils.SpringContextHolder; import org.nl.wms.dispatch_manage.task.service.dao.SchBaseTask; import org.nl.wms.external_system.dto.InteracteDto; -import org.nl.wms.sync_manage.service.form_mapping.ISyncFormMappingService; -import org.nl.wms.sync_manage.service.form_mapping.dao.SyncFormMapping; import org.slf4j.MDC; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @@ -39,11 +30,11 @@ public class WmsToAcsService{ return result; } - public TableDataInfo toCommand(String deviceCode,String toCommand,Integer toHeight){ + public TableDataInfo toCommand(String deviceCode, String toCommand, Integer toHeight, String isMove) { InteracteDto dto = InteracteDto.builder().service("wmsToAcsService") .trace_id(MDC.get("trace_id")) .type("toCommand") - .data(MapOf.of("device_code", deviceCode, "toCommand", toCommand,"toHeight",toHeight)) + .data(MapOf.of("device_code", deviceCode, "toCommand", toCommand, "toHeight", toHeight, "is_move", isMove)) .build(); TableDataInfo result = InterationUtil.notifyExt("/api/wmsToAcs/apply", (JSONObject) JSON.toJSON(dto)); return result; diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/flow_manage/flow/framework/engine/behavior/impl/SubProcessActivityBehavior.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/flow_manage/flow/framework/engine/behavior/impl/SubProcessActivityBehavior.java index 16349751..0f107742 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/flow_manage/flow/framework/engine/behavior/impl/SubProcessActivityBehavior.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/flow_manage/flow/framework/engine/behavior/impl/SubProcessActivityBehavior.java @@ -29,7 +29,7 @@ import java.util.function.Supplier; /* * @author ZZQ * @Date 2024/5/6 17:47 - * 后续可以定义规则:子流程如果根据vehicle_code拆分的话,每个载具都有一个自己的流程,所以需要跟新载具流程实例id + * 后续可以定义规则:子流程如果根据vehicle_code拆分的话,每个载具都有一个自己的流程,所以需要更新载具流程实例id */ @Service("subProcess") public class SubProcessActivityBehavior extends FlowNodeActivityBehavior { diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/flow_manage/flow/framework/process/nodeType/excess/impl/ClassHandler.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/flow_manage/flow/framework/process/nodeType/excess/impl/ClassHandler.java index a2366d95..1a68dfd2 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/flow_manage/flow/framework/process/nodeType/excess/impl/ClassHandler.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/flow_manage/flow/framework/process/nodeType/excess/impl/ClassHandler.java @@ -1,61 +1,82 @@ package org.nl.wms.flow_manage.flow.framework.process.nodeType.excess.impl; import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; import org.nl.common.domain.exception.BadRequestException; import org.nl.common.utils.SpringContextHolder; import org.nl.wms.config_manage.form_struc.service.dao.BmFormStruc; import org.nl.wms.flow_manage.flow.framework.entity.ExecutionDto; import org.nl.wms.flow_manage.flow.framework.entity.ExecutionEntity; -import org.nl.wms.flow_manage.flow.framework.entity.node.base.impl.FlowNode; import org.nl.wms.flow_manage.flow.framework.entity.node.impl.task.impl.ServerTask; import org.nl.wms.flow_manage.flow.framework.process.nodeType.TypeHandler; import org.nl.wms.flow_manage.flow.framework.process.nodeType.excess.impl.process.classprocess.ClassProcess; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; +import javax.annotation.Resource; import java.util.List; +import java.util.Map; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ThreadPoolExecutor; /* * @author ZZQ * @Date 2024/3/21 15:17 */ @Service("class") -public class ClassHandler extends TypeHandler> { - +@Slf4j +public class ClassHandler extends TypeHandler> { //{"t","souce",form} + + @Resource + @Qualifier("meshandlerPool") + private ThreadPoolExecutor pool; + @Override public JSONObject handler(List params, ExecutionEntity entity, BmFormStruc isnull) { JSONObject result = new JSONObject(); - ExecutionDto dto = entity.getT().toJavaObject(ExecutionDto.class); ServerTask flowNode = (ServerTask) entity.getCurrentFlowElement(); ClassProcess process = SpringContextHolder.getBean(params.get(0)); - if (process==null){ + if (process == null) { throw new BadRequestException("当前serverTask配置的类信息不存在"); } String form_type = flowNode.getForm_type(); JSONObject auxParam = new JSONObject(); - auxParam.put("form_type",form_type); - if (flowNode.getAuxParam()!=null){ + auxParam.put("form_type", form_type); + if (flowNode.getAuxParam() != null) { auxParam.putAll(flowNode.getAuxParam()); } - if (!CollectionUtils.isEmpty(entity.getAuxParam())){ + if (!CollectionUtils.isEmpty(entity.getAuxParam())) { auxParam.putAll(entity.getAuxParam()); } - JSONObject form = process.process(dto.getT(), auxParam); + JSONObject form = dto.getT(); + if ("SyncReceiptProcessHandler".equals(params.get(0))) { + CompletableFuture>> task1 = CompletableFuture.supplyAsync(() -> { + process.process(dto.getT(), auxParam); + return null; + }, pool); + task1.exceptionally((e) -> { + log.error("回传ERP执行异常:{}", e.getMessage(), e); + return null; + }); + } else { + form = process.process(dto.getT(), auxParam); + } //清空全局配置的数据:暂时不清空只做覆盖 - // entity.setAuxParam(new JSONObject()); - result.put("t",form); + // entity.setAuxParam(new JSONObject()); + result.put("t", form); //后续:涉及框架的参数提到框架中处理 String source_form_type = dto.getForm_type(); String source_form_id = dto.getForm_id(); - if (dto.getForm_type().equals(form_type)){ + if (dto.getForm_type().equals(form_type)) { source_form_type = dto.getSource_form_type(); source_form_id = dto.getSource_form_id(); } - result.put("source_form_id",source_form_id); - result.put("source_form_type",source_form_type); - result.put("form_id",form.getString("id")); + result.put("source_form_id", source_form_id); + result.put("source_form_type", source_form_type); + result.put("form_id", form.getString("id")); result.put("form_type", form_type); return result; diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/flow_manage/flow/service/classprocessimpl/CtuProcessHandler.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/flow_manage/flow/service/classprocessimpl/CtuProcessHandler.java index 0bff5853..ef852dd7 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/flow_manage/flow/service/classprocessimpl/CtuProcessHandler.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/flow_manage/flow/service/classprocessimpl/CtuProcessHandler.java @@ -6,6 +6,8 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.nl.wms.dispatch_manage.task.service.ISchBaseTaskService; +import org.nl.wms.dispatch_manage.task.service.dao.SchBaseTask; import org.nl.wms.flow_manage.flow.framework.process.nodeType.excess.impl.process.classprocess.ClassProcess; import org.nl.wms.md_manage.vehicleMater.service.IMdPbVehicleMaterService; import org.nl.wms.md_manage.vehicleMater.service.dao.MdPbVehicleMater; @@ -28,53 +30,70 @@ public class CtuProcessHandler implements ClassProcess { @Autowired private IMdPbVehicleMaterService iMdPbVehicleMaterService; + @Autowired + private ISchBaseTaskService iSchBaseTaskService; + /** - * 回执单回传 + * CTU更新单据号 */ @Override public JSONObject process(JSONObject from, JSONObject param) { - JSONObject vehicleMater = from.getJSONObject("vehicleMater"); - if (vehicleMater == null) { - log.error("CTU出库用料单号异常:未获取到物料载具信息vehicleMater,from数据为:" + JSON.toJSONString(from)); - return from; - } - JSONObject sourceFormData = from.getJSONObject("source_form_data"); - if (sourceFormData == null) { - iMdPbVehicleMaterService.update(new UpdateWrapper() - .set("prd_ppbom_no", "CTU出库用料单号异常:未获取到源单信息sourceFormData,from数据为:" + JSON.toJSONString(from)) - .eq("id", vehicleMater.getString("id"))); - log.error("CTU出库用料单号异常:未获取到源单信息sourceFormData,from数据为:" + JSON.toJSONString(from)); - return from; - } - try { - String billCode = sourceFormData.getString("code"); - String vehicleId = StringUtils.isNotBlank(sourceFormData.getString("vehicle_id")) ? sourceFormData.getString("vehicle_id") : vehicleMater.getString("id"); - if (StringUtils.isBlank(vehicleId)) { - LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); - updateWrapper.eq(PmFormData::getId, sourceFormData.getString("id")); - updateWrapper.set(PmFormData::getRemark, "更新CTU物料载具信息的出库单据号失败,原因为:载具物料表为空,载具id为空,无法更新用料清单号,form数据:" + JSON.toJSONString(from)); - iPmFormDataService.update(updateWrapper); - log.error("更新CTU物料载具信息的出库单据号失败,原因为:载具物料表为空,载具id为空,无法更新用料清单号,form数据:" + JSON.toJSONString(from)); - } else { - if (StringUtils.isNotBlank(billCode)) { - //更新物料载具信息的出库单据号 - iMdPbVehicleMaterService.update(new UpdateWrapper() - .set("prd_ppbom_no", billCode) - .eq("id", vehicleId)); - } else { - iMdPbVehicleMaterService.update(new UpdateWrapper() - .set("prd_ppbom_no", "CTU出库用料单号异常:未获取到源单号billCode,from数据为:" + JSON.toJSONString(from)) - .eq("id", vehicleId)); - log.error("CTU出库用料单号异常:未获取到源单号billCode,from数据为:" + JSON.toJSONString(from)); - } - } - } catch (Exception ex) { - LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); - updateWrapper.eq(PmFormData::getId, sourceFormData.getString("id")); - updateWrapper.set(PmFormData::getRemark, "更新CTU物料载具信息的出库单据号失败,原因为:" + ex.getMessage()); - iPmFormDataService.update(updateWrapper); - log.error("更新CTU物料载具信息的出库单据号失败,原因为:" + ex.getMessage() + ",form数据:" + JSON.toJSONString(from)); - } + // JSONObject vehicleMater = from.getJSONObject("vehicleMater"); + // if (vehicleMater == null) { + // log.error("CTU出库用料单号异常:未获取到物料载具信息vehicleMater,from数据为:" + JSON.toJSONString(from)); + // return from; + // } + // SchBaseTask schBaseTask = iSchBaseTaskService.getOne(new LambdaUpdateWrapper().eq(SchBaseTask::getTask_code, vehicleMater.getString("task_code"))); + // if (schBaseTask != null) { + // JSONObject sourceFormData = from.getJSONObject("source_form_data"); + // if (sourceFormData == null) { + // iMdPbVehicleMaterService.update(new UpdateWrapper() + // .set("prd_ppbom_no", "CTU出库用料单号异常:未获取到源单信息sourceFormData,from数据为:" + JSON.toJSONString(from)) + // .eq("id", vehicleMater.getString("id"))); + // return from; + // } + // String vehicleId = StringUtils.isNotBlank(sourceFormData.getString("vehicle_id")) ? sourceFormData.getString("vehicle_id") : vehicleMater.getString("id"); + // if ("2114".equals(schBaseTask.getPoint_code2())) { + // try { + // log.error("CTU获取单据号,任务终点为2114"); + // String billCode = sourceFormData.getString("code"); + // if (StringUtils.isBlank(vehicleId)) { + // LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + // updateWrapper.eq(PmFormData::getId, sourceFormData.getString("id")); + // updateWrapper.set(PmFormData::getRemark, "更新CTU物料载具信息的出库单据号失败,原因为:载具物料表为空,载具id为空,无法更新用料清单号,form数据:" + JSON.toJSONString(from)); + // iPmFormDataService.update(updateWrapper); + // log.error("更新CTU物料载具信息的出库单据号失败,原因为:载具物料表为空,载具id为空,无法更新用料清单号,form数据:" + JSON.toJSONString(from)); + // } else { + // if (StringUtils.isNotBlank(billCode)) { + // //更新物料载具信息的出库单据号 + // iMdPbVehicleMaterService.update(new UpdateWrapper() + // .set("prd_ppbom_no", billCode) + // .eq("id", vehicleId)); + // } else { + // iMdPbVehicleMaterService.update(new UpdateWrapper() + // .set("prd_ppbom_no", "CTU出库用料单号异常:未获取到源单号billCode,from数据为:" + JSON.toJSONString(from)) + // .eq("id", vehicleId)); + // log.error("CTU出库用料单号异常:未获取到源单号billCode,from数据为:" + JSON.toJSONString(from)); + // } + // } + // } catch (Exception ex) { + // LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + // updateWrapper.eq(PmFormData::getId, sourceFormData.getString("id")); + // updateWrapper.set(PmFormData::getRemark, "更新CTU物料载具信息的出库单据号失败,原因为:" + ex.getMessage()); + // iPmFormDataService.update(updateWrapper); + // log.error("更新CTU物料载具信息的出库单据号失败,原因为:" + ex.getMessage() + ",form数据:" + JSON.toJSONString(from)); + // } + // } else { + // log.error("CTU获取单据号,任务终点非2114,清除单据号"); + // //清除非二楼终点任务的单据编号 + // iMdPbVehicleMaterService.update(new UpdateWrapper() + // .set("prd_ppbom_no", null) + // .eq("id", vehicleId)); + // } + // } else { + // log.error("CTU回传单号异常:未获取到任务单信息schBaseTask,from数据为:" + JSON.toJSONString(from)); + // return from; + // } return from; } diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/flow_manage/flow/service/classprocessimpl/StorageChangesProcessHandler.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/flow_manage/flow/service/classprocessimpl/StorageChangesProcessHandler.java index 7ef13f01..ea1d84fb 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/flow_manage/flow/service/classprocessimpl/StorageChangesProcessHandler.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/flow_manage/flow/service/classprocessimpl/StorageChangesProcessHandler.java @@ -1,18 +1,20 @@ package org.nl.wms.flow_manage.flow.service.classprocessimpl; import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.nl.common.domain.exception.BadRequestException; - - import org.nl.common.utils.ListOf; import org.nl.common.utils.SpelUtil; import org.nl.common.utils.SpringContextHolder; import org.nl.wms.dispatch_manage.task.handler.AbstractTask; import org.nl.wms.flow_manage.flow.framework.process.nodeType.excess.impl.process.classprocess.ClassProcess; - +import org.nl.wms.md_manage.vehicleMater.service.IMdPbVehicleMaterService; +import org.nl.wms.md_manage.vehicleMater.service.dao.MdPbVehicleMater; +import org.nl.wms.pm_manage.form_data.service.IPmFormDataService; +import org.nl.wms.pm_manage.form_data.service.dao.PmFormData; import org.nl.wms.stor_manage.struct.service.IStIvtStructattrService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -66,21 +68,21 @@ public class StorageChangesProcessHandler implements ClassProcess { for (String base_field : Base_Fields) { String skip = param.getString(base_field); if (StringUtils.isNotEmpty(skip)){ - (skip.contains("#M") ? spelMap : valueMap).put(base_field,skip); + (skip.contains("#M") ? spelMap : valueMap).put(base_field, skip); } } - if (!CollectionUtils.isEmpty(spelMap)){ + if (!CollectionUtils.isEmpty(spelMap)) { Map parse = SpelUtil.parse(from, spelMap); valueMap.putAll(parse); } String start_struct_code = valueMap.get("start_struct_code"); String end_struct_code = valueMap.get("end_struct_code"); - BigDecimal change_qty = StringUtils.isEmpty(valueMap.get("change_qty"))?null:new BigDecimal(valueMap.get("change_qty")); - if (StringUtils.isNotEmpty(start_struct_code)){ - iStIvtStructattrService.changeStruct(start_struct_code,vehicle_code,param.getString("task_type"), change_qty,Boolean.FALSE,null); + BigDecimal change_qty = StringUtils.isEmpty(valueMap.get("change_qty")) ? null : new BigDecimal(valueMap.get("change_qty")); + if (StringUtils.isNotEmpty(start_struct_code)) { + iStIvtStructattrService.changeStruct(start_struct_code, vehicle_code, param.getString("task_type"), change_qty, Boolean.FALSE, null); } - if (StringUtils.isNotEmpty(end_struct_code)){ - iStIvtStructattrService.changeStruct(end_struct_code,vehicle_code,param.getString("task_type"), change_qty,change_qty.intValue()<0?Boolean.FALSE:Boolean.TRUE,null); + if (StringUtils.isNotEmpty(end_struct_code)) { + iStIvtStructattrService.changeStruct(end_struct_code, vehicle_code, param.getString("task_type"), change_qty, change_qty.intValue() < 0 ? Boolean.FALSE : Boolean.TRUE, null); } } return from; diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/flow_manage/flow/service/classprocessimpl/SyncReceiptProcessHandler.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/flow_manage/flow/service/classprocessimpl/SyncReceiptProcessHandler.java index e4515f5f..08751131 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/flow_manage/flow/service/classprocessimpl/SyncReceiptProcessHandler.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/flow_manage/flow/service/classprocessimpl/SyncReceiptProcessHandler.java @@ -1,6 +1,7 @@ package org.nl.wms.flow_manage.flow.service.classprocessimpl; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.BooleanUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; @@ -9,6 +10,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.github.javaparser.utils.Log; import com.kingdee.bos.webapi.entity.IdentifyInfo; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; @@ -22,15 +24,14 @@ import org.nl.wms.external_system.erp.dto.ErpSec; import org.nl.wms.flow_manage.flow.framework.process.nodeType.excess.impl.process.classprocess.ClassProcess; import org.nl.wms.pm_manage.form_data.service.IPmFormDataService; import org.nl.wms.pm_manage.form_data.service.dao.PmFormData; +import org.nl.wms.pm_manage.form_data.service.dto.ErpInventoryData; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.annotation.Resource; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; +import java.math.BigDecimal; +import java.util.*; import java.util.stream.Collectors; /* @@ -39,6 +40,7 @@ import java.util.stream.Collectors; * 回传服务 */ @Service +@Slf4j public class SyncReceiptProcessHandler implements ClassProcess { @Autowired @@ -68,38 +70,58 @@ public class SyncReceiptProcessHandler implements ClassProcess { if (StringUtils.isEmpty(formid)) { throw new BadRequestException("回传失败:回传数据form_data中数据格式不是formid,data类型"); } - handleBillEntity(pmFormData.getForm_type(), formData); + handleErpBill(from, pmFormData, formData, formid); + return new JSONObject(); + } + + + protected void handleErpBill(JSONObject from, PmFormData pmFormData, JSONObject formData, String formid) { + String billCode = handleBillEntity(pmFormData.getForm_type(), formData, pmFormData); String json = formData.toJSONString(); LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); updateWrapper.eq(PmFormData::getId, pmFormData.getId()); + updateWrapper.set(PmFormData::getAssign_qty, pmFormData.getAssign_qty()); updateWrapper.set(PmFormData::getUpdate_time, DateUtil.now()); updateWrapper.set(PmFormData::getErp_data, json); try { + //回传状态 + boolean isSuccess; IdentifyInfo identifyInfo = new IdentifyInfo(); BeanUtils.copyProperties(erpSec, identifyInfo); - JSONObject res; if (Integer.parseInt(StatusEnum.ERP_TYPE.code(formid)) > 22) { - String result = erpServiceUtils.audit(formData).getString("result"); - res = JSONObject.parseObject(result); + ErpQuery reportQuery = new ErpQuery(); + reportQuery.setFilterString("FID ='" + formData.getString("ids") + "'"); + reportQuery.setFormId(formData.getString("formid")); + JSONArray array = erpServiceUtils.queryBills(reportQuery); + if (CollectionUtils.isEmpty(array)) { + throw new BadRequestException("回传失败:回传数据未找到对应erp单据"); + } + JSONObject responseStatus = getResponseInfo(formData, true); + isSuccess = responseStatus.getBooleanValue("IsSuccess"); + if (isSuccess) { + updateWrapper.set(PmFormData::getRemark, "回传ERP单据审批操作成功!"); + updateWrapper.set(PmFormData::getStatus, StatusEnum.FORM_STATUS.code("完成")); + } else { + updateWrapper.set(PmFormData::getRemark, "回传ERP单据审批操作失败,原因为:" + responseStatus.getString("errorMessages") + ",回传Erp数据为:" + json); + updateWrapper.set(PmFormData::getStatus, StatusEnum.FORM_STATUS.code("暂停")); + } } else { - String result = erpServiceUtils.save(formData).getString("result"); - res = JSONObject.parseObject(result); - } - JSONObject responseStatus = res.getJSONObject("Result").getJSONObject("ResponseStatus"); - boolean isSuccess = responseStatus.getBooleanValue ("IsSuccess"); - JSONArray errors = responseStatus.getJSONArray("Errors"); - String errorMessages = ""; - if (ObjectUtils.isNotEmpty(errors)) { - errorMessages = errors.stream() - .map(error -> ((JSONObject) error).getString("Message")) - .collect(Collectors.joining("; ")); - } - if (isSuccess) { - updateWrapper.set(PmFormData::getStatus, StatusEnum.FORM_STATUS.code("完成")); - updateWrapper.set(PmFormData::getRemark, "回执单创建成功,回传Erp数据为:" + responseStatus.getJSONArray("SuccessEntitys").toJSONString()); - } else { - updateWrapper.set(PmFormData::getStatus, StatusEnum.FORM_STATUS.code("暂停")); - updateWrapper.set(PmFormData::getRemark, "回执单创建失败,原因为:" + errorMessages + ",回传Erp数据为:" + json); + JSONObject responseStatus = getResponseInfo(formData, false); + isSuccess = responseStatus.getBooleanValue("IsSuccess"); + if (StringUtils.isNotBlank(billCode)) { + updateWrapper.set(PmFormData::getSource_form_date, billCode); + if (billCode.contains("PPBOM") || billCode.contains("JDSCLLSQ")) { + updateWrapper.set(PmFormData::getBar_code, "0"); + } + } + if (isSuccess) { + updateWrapper.set(PmFormData::getRemark, "回执单创建成功,回传Erp数据为:" + responseStatus.getJSONArray("SuccessEntitys").toJSONString()); + updateWrapper.set(PmFormData::getActual_qty, pmFormData.getActual_qty().add(pmFormData.getQty())); + updateWrapper.set(PmFormData::getStatus, StatusEnum.FORM_STATUS.code("完成")); + } else { + updateWrapper.set(PmFormData::getStatus, StatusEnum.FORM_STATUS.code("暂停")); + updateWrapper.set(PmFormData::getRemark, "回执单创建失败,原因为:" + responseStatus.getString("errorMessages") + ",回传Erp数据为:" + json); + } } iPmFormDataService.update(updateWrapper); } catch (Exception ex) { @@ -108,162 +130,258 @@ public class SyncReceiptProcessHandler implements ClassProcess { iPmFormDataService.update(updateWrapper); Log.error(ex.getMessage()); } - return from; } - public void handleBillEntity(String formType, JSONObject formData) { + private JSONObject getResponseInfo(JSONObject formData, boolean isAudit) { + String result; + if (isAudit) { + result = erpServiceUtils.audit(formData).getString("result"); + } else { + result = erpServiceUtils.save(formData).getString("result"); + } + JSONObject res = JSONObject.parseObject(result); + JSONObject responseInfo = res.getJSONObject("Result").getJSONObject("ResponseStatus"); + JSONArray errors = responseInfo.getJSONArray("Errors"); + if (ObjectUtils.isNotEmpty(errors)) { + String errorMessages = errors.stream() + .map(error -> ((JSONObject) error).getString("Message")) + .collect(Collectors.joining("; ")); + responseInfo.put("errorMessages", errorMessages); + } + return responseInfo; + } + + + public String handleBillEntity(String formType, JSONObject formData, PmFormData pmFormData) { + String billCode = null; JSONObject model = formData.getJSONObject("Model"); - if (model == null) { - return; + if (ObjectUtils.isEmpty(model)) { + return null; + } + JSONArray fEntityArray = formData.getJSONObject("Model").getJSONArray("FEntity"); + if (ObjectUtils.isEmpty(fEntityArray)) { + return null; } model.put("FDate", DateUtil.now()); - JSONArray fEntityArray = formData.getJSONObject("Model").getJSONArray("FEntity"); List materialList = iMdMeMaterialbaseService.list(new LambdaQueryWrapper().eq(MdMeMaterialbase::getMaterial_code, JSON.parseObject(fEntityArray.getJSONObject(0).getString("FMaterialId")).getString("FNumber"))); if (ObjectUtil.isEmpty(materialList)) { throw new BadRequestException("回传失败:查询物料信息,物料编码不存在:" + JSON.parseObject(fEntityArray.getJSONObject(0).getString("FMaterialId")).getString("FNumber")); } MdMeMaterialbase materialInfo = materialList.get(0); if ("RECEIPT_PRD".equals(formType)) { - for (int i = 0; i < fEntityArray.size(); i++) { - JSONObject fEntity = fEntityArray.getJSONObject(i); - ErpQuery reportQuery = new ErpQuery(); - reportQuery.setFilterString("FMoNumber ='" + fEntity.getString("FMoBillNo") + "'"); - reportQuery.setOrderString("FId desc"); - reportQuery.setFormId("SFC_OperationReport"); - JSONArray jsonArray = erpServiceUtils.queryBills(reportQuery); - if (CollectionUtils.isEmpty(jsonArray)) { - throw new BadRequestException("该生产订单未找到对应生产汇报单"); - } - JSONArray optRptEntry = jsonArray.getJSONObject(0).getJSONArray("OptRptEntry"); - fEntity.put("FSrcEntryId", optRptEntry.getJSONObject(0).getString("Id")); - Map linkedMap = new LinkedHashMap<>(); - for (String key : fEntity.keySet()) { - linkedMap.put(key, fEntity.get(key)); - } - //明细字段顺序排列 - Map tempMap = new LinkedHashMap<>(); - for (Map.Entry entry : linkedMap.entrySet()) { - tempMap.put(entry.getKey(), entry.getValue()); - if ("FMoEntrySeq".equals(entry.getKey())) { - tempMap.put("FSrcBillNo", jsonArray.getJSONObject(0).getString("BillNo")); - tempMap.put("FSrcEntryId", optRptEntry.getJSONObject(0).getString("Id")); - tempMap.put("FSrcEntrySeq", optRptEntry.getJSONObject(0).getString("Seq")); - tempMap.put("FSrcBillType", "SFC_OperationReport"); - } - //辅助单位 - if (!"0".equals(materialInfo.getAssist_unit_id()) && "FUnitID".equals(entry.getKey())) { - JSONObject fUnit = new JSONObject(); - fUnit.put("FNumber", materialInfo.getAssist_unit_id()); - tempMap.put("FSecUnitId", fUnit); - } - } - JSONArray fEntityLinkArray = new JSONArray(); - JSONObject fEntityLink = new JSONObject(); - fEntityLink.put("FEntity_Link_FRuleId", "SFC_OPTRPT2INSTOCK"); - fEntityLink.put("FEntity_Link_FSBillId", jsonArray.getJSONObject(0).getString("Id")); - fEntityLink.put("FEntity_Link_FSId", optRptEntry.getJSONObject(0).getString("Id")); - fEntityLink.put("FEntity_Link_FSTableName", "T_SFC_OPTRPTENTRY"); - fEntityLink.put("FEntity_Link_FBasePrdRealQtyOld", fEntity.getString("FRealQty")); - fEntityLink.put("FEntity_Link_FBasePrdRealQty", fEntity.getString("FRealQty")); - fEntityLinkArray.add(fEntityLink); - tempMap.put("FEntity_Link", fEntityLinkArray); - fEntity.clear(); - fEntity.putAll(tempMap); - } + billCode = handlePrdData(pmFormData, billCode, fEntityArray, materialInfo); } - //判断生产领料单的批次与辅助单位 if ("RECEIPT_PickMtrl".equals(formType)) { - for (int i = 0; i < fEntityArray.size(); i++) { - JSONObject fEntity = fEntityArray.getJSONObject(i); - ErpQuery prdQuery = new ErpQuery(); - prdQuery.setFilterString("FBillNo ='" + fEntity.getString("FPPBomBillNo") + "'"); - prdQuery.setOrderString("FId desc"); - prdQuery.setFormId("PRD_PPBOM"); - JSONArray jsonArray = erpServiceUtils.queryBills(prdQuery); - if (CollectionUtils.isEmpty(jsonArray)) { - throw new BadRequestException("该领料出库单未找到对应用生产用料清单"); - } - JSONArray prdEntry = jsonArray.getJSONObject(0).getJSONArray("PPBomEntry"); - JSONObject entity; - Optional filterJsonObject = prdEntry.stream() - .map(obj -> (JSONObject) obj) - .filter(r -> fEntity.getString("FPPBomEntryId").equals(r.getString("Id"))) - .findFirst(); - if (filterJsonObject.isPresent()) { - entity = filterJsonObject.get(); - } else { - throw new BadRequestException("该领料出库单的对应用生产用料清单未找到对应的物料明细"); - } - Map linkedMap = new LinkedHashMap<>(); - for (String key : fEntity.keySet()) { - linkedMap.put(key, fEntity.get(key)); - } - Map tempMap = new LinkedHashMap<>(); - for (Map.Entry entry : linkedMap.entrySet()) { - tempMap.put(entry.getKey(), entry.getValue()); - if ("FPPBomEntryId".equals(entry.getKey())) { - tempMap.put("FSrcBillType", "PRD_PPBOM"); - tempMap.put("FSrcBillNo", jsonArray.getJSONObject(0).getString("BillNo")); - tempMap.put("FEntrySrcEnteryId", entity.getString("Id")); - tempMap.put("FEntrySrcEntrySeq", entity.getString("Seq")); - } - //辅助单位 - if (!"0".equals(materialInfo.getAssist_unit_id()) && "FPPBomEntryId".equals(entry.getKey())) { - JSONObject fUnit = new JSONObject(); - fUnit.put("FNumber", materialInfo.getAssist_unit_id()); - tempMap.put("FSecUnitId", fUnit); - } - //没有启用批次号 - if ("0".equals(materialInfo.getPrint_no())) { - if (entry.getKey().contains("FLot")) { - tempMap.remove("FLot"); - } - } - } - JSONArray fEntityLinkArray = new JSONArray(); - JSONObject fEntityLink = new JSONObject(); - fEntityLink.put("FEntity_Link_FFlowLineId", 0); - fEntityLink.put("FEntity_Link_FBaseActualQty", fEntity.getString("FActualQty")); - fEntityLink.put("FEntity_Link_FSId",entity.getString("Id")); - fEntityLink.put("FEntity_Link_FBaseActualQtyOld", fEntity.getString("FActualQty")); - fEntityLink.put("FEntity_Link_FRuleId", "PRD_PPBOM2PICKMTRL_NORMAL"); - fEntityLink.put("FEntity_Link_FSTableId", 0); - fEntityLink.put("FEntity_Link_FFlowId",""); - fEntityLink.put("FEntity_Link_FSBillId", jsonArray.getJSONObject(0).getString("Id")); - fEntityLink.put("FEntity_Link_FSTableName", "T_PRD_PPBOMENTRY"); - fEntityLinkArray.add(fEntityLink); - tempMap.put("FEntity_Link", fEntityLinkArray); - fEntity.clear(); - fEntity.putAll(tempMap); - } + billCode = handlePickData(billCode, fEntityArray, materialInfo); } - if ("RECEIPT_SUB_PickMtrl".equals(formType)) { - for (int i = 0; i < fEntityArray.size(); i++) { - JSONObject fEntity = fEntityArray.getJSONObject(i); - Map linkedMap = new LinkedHashMap<>(); - for (String key : fEntity.keySet()) { - linkedMap.put(key, fEntity.get(key)); - } - Map tempMap = new LinkedHashMap<>(); - for (Map.Entry entry : linkedMap.entrySet()) { - tempMap.put(entry.getKey(), entry.getValue()); - } - JSONArray fEntityLinkArray = new JSONArray(); - JSONObject fEntityLink = new JSONObject(); - fEntityLink.put("FEntity_Link_FFlowLineId", 6); - fEntityLink.put("FEntity_Link_FBaseActualQty", fEntity.getString("FActualQty")); - fEntityLink.put("FEntity_Link_FSId",fEntity.getString("FSrcEntryId")); - fEntityLink.put("FEntity_Link_FBaseActualQtyOld", fEntity.getString("FBaseActualQty")); - fEntityLink.put("FEntity_Link_FRuleId", "SUB_PPBOM_Pick"); - fEntityLink.put("FEntity_Link_FSTableId", 0); - fEntityLink.put("FEntity_Link_FFlowId","0b064121-4926-4808-8632-a195b6a202e8"); - fEntityLink.put("FEntity_Link_FSBillId",fEntity.getString("FSrcInterId")); - fEntityLink.put("FEntity_Link_FSTableName", "T_SUB_PPBOMENTRY"); - fEntityLinkArray.add(fEntityLink); - tempMap.put("FEntity_Link", fEntityLinkArray); - fEntity.clear(); - fEntity.putAll(tempMap); + return billCode; + } + + + + private String handlePickData(String billCode, JSONArray fEntityArray, MdMeMaterialbase materialInfo) { + for (int i = 0; i < fEntityArray.size(); i++) { + JSONObject fEntity = fEntityArray.getJSONObject(i); + billCode = fEntity.getString("FPPBomBillNo"); + ErpQuery prdQuery = new ErpQuery(); + prdQuery.setFilterString("FBillNo ='" + fEntity.getString("FPPBomBillNo") + "'"); + prdQuery.setOrderString("FId desc"); + prdQuery.setFormId("PRD_PPBOM"); + JSONArray jsonArray = erpServiceUtils.queryBills(prdQuery); + if (CollectionUtils.isEmpty(jsonArray)) { + throw new BadRequestException("该领料出库单未找到对应用生产用料清单"); } + JSONObject stockInfo = JSON.parseObject(fEntity.getString("FStockId")); + String stockId = stockInfo.getString("FNumber"); + JSONObject lotInfo = JSON.parseObject(fEntity.getString("FLot")); + String lot = lotInfo.getString("FNumber"); + JSONObject params = new JSONObject(); + params.put("storeCode", stockId); + params.put("pcsn", lot); + List result = erpServiceUtils.queryInventory(params); + JSONArray prdEntry = jsonArray.getJSONObject(0).getJSONArray("PPBomEntry"); + JSONObject entity; + Optional filterJsonObject = prdEntry.stream() + .map(obj -> (JSONObject) obj) + .filter(r -> fEntity.getString("FPPBomEntryId").equals(r.getString("Id"))) + .findFirst(); + if (filterJsonObject.isPresent()) { + entity = filterJsonObject.get(); + } else { + throw new BadRequestException("该领料出库单的对应用生产用料清单未找到对应的物料明细"); + } + Map linkedMap = new LinkedHashMap<>(); + for (String key : fEntity.keySet()) { + linkedMap.put(key, fEntity.get(key)); + } + Map tempMap = new LinkedHashMap<>(); + for (Map.Entry entry : linkedMap.entrySet()) { + tempMap.put(entry.getKey(), entry.getValue()); + if ("FPPBomEntryId".equals(entry.getKey())) { + tempMap.put("FSrcBillType", "PRD_PPBOM"); + tempMap.put("FSrcBillNo", jsonArray.getJSONObject(0).getString("BillNo")); + tempMap.put("FEntrySrcEnteryId", entity.getString("Id")); + tempMap.put("FEntrySrcEntrySeq", entity.getString("Seq")); + } + //辅助单位 + if (!"0".equals(materialInfo.getAssist_unit_id()) && "FPPBomEntryId".equals(entry.getKey())) { + JSONObject fUnit = new JSONObject(); + fUnit.put("FNumber", materialInfo.getAssist_unit_id()); + tempMap.put("FSecUnitId", fUnit); + } + //没有启用批次号 + if ("0".equals(materialInfo.getPrint_no())) { + if (entry.getKey().contains("FLot")) { + tempMap.remove("FLot"); + } + } + } + JSONArray fEntityLinkArray = new JSONArray(); + JSONObject fEntityLink = new JSONObject(); + fEntityLink.put("FEntity_Link_FFlowLineId", 0); + fEntityLink.put("FEntity_Link_FBaseActualQty", fEntity.getString("FActualQty")); + fEntityLink.put("FEntity_Link_FSId", entity.getString("Id")); + fEntityLink.put("FEntity_Link_FBaseActualQtyOld", fEntity.getString("FActualQty")); + fEntityLink.put("FEntity_Link_FRuleId", "PRD_PPBOM2PICKMTRL_NORMAL"); + fEntityLink.put("FEntity_Link_FSTableId", 0); + fEntityLink.put("FEntity_Link_FFlowId", ""); + fEntityLink.put("FEntity_Link_FSBillId", jsonArray.getJSONObject(0).getString("Id")); + fEntityLink.put("FEntity_Link_FSTableName", "T_PRD_PPBOMENTRY"); + fEntityLinkArray.add(fEntityLink); + tempMap.put("FEntity_Link", fEntityLinkArray); + fEntity.clear(); + fEntity.putAll(tempMap); } + return billCode; + } + + //生产入库单回传处理 + private String handlePrdData(PmFormData pmFormData, String billCode, JSONArray fEntityArray, MdMeMaterialbase materialInfo) { + for (int i = 0; i < fEntityArray.size(); i++) { + JSONObject fEntity = fEntityArray.getJSONObject(i); + billCode = fEntity.getString("FMoBillNo"); + ErpQuery reportQuery = new ErpQuery(); + reportQuery.setFilterString("FBillNo ='" + fEntity.getString("FMoBillNo") + "'"); + reportQuery.setFormId("PRD_MO"); + JSONArray moArray = erpServiceUtils.queryBills(reportQuery); + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(PmFormData::getId, pmFormData.getId()); + if (CollectionUtils.isEmpty(moArray)) { + updateWrapper.set(PmFormData::getRemark, "该回传单据未找到对应生产订单"); + iPmFormDataService.update(updateWrapper); + throw new BadRequestException("该回传单据未找到对应生产订单"); + } + reportQuery.setFilterString("FMoNumber ='" + fEntity.getString("FMoBillNo") + "'"); + reportQuery.setOrderString("FId desc"); + reportQuery.setFormId("SFC_OperationReport"); + JSONArray jsonArray = erpServiceUtils.queryBills(reportQuery); + if (CollectionUtils.isEmpty(jsonArray)) { + updateWrapper.set(PmFormData::getRemark, "该生产订单未找到对应生产工序汇报单"); + iPmFormDataService.update(updateWrapper); + throw new BadRequestException("该生产订单未找到对应生产工序汇报单"); + } + //获取最大的报工数 + JSONObject optJsonObject; + JSONArray list = new JSONArray(); + jsonArray.forEach(r -> { + JSONObject array = (JSONObject) r; + JSONArray array1 = array.getJSONArray("OptRptEntry"); + list.addAll(array1); + }); + Map> reportGroup = list.stream() + .map(obj -> ((JSONObject) obj)) + .collect(Collectors.groupingBy(r -> ((JSONObject) r).getString("OperNumber"))); + Optional maxKey = reportGroup.keySet().stream() + .max(Comparator.comparingInt(Integer::parseInt)); + if (!maxKey.isPresent()) { + updateWrapper.set(PmFormData::getRemark, "该生产订单未找到生产工序汇报单对应的末道工序汇报数!"); + iPmFormDataService.update(updateWrapper); + throw new BadRequestException("该生产订单未找到生产工序汇报单对应的末道工序汇报数!"); + } + String firstKey = maxKey.get(); + BigDecimal totalInQty = reportGroup.values().stream() + .flatMap(List::stream) + .filter(obj -> firstKey.equals(obj.getString("OperNumber"))) + .collect(Collectors.collectingAndThen( + Collectors.toMap( + r -> r.getString("QuaQty"), + r -> r, + (existing, replacement) -> existing, + LinkedHashMap::new + ), + map -> map.values().stream() + )) + .map(obj -> new BigDecimal(obj.getString("QuaQty"))) + .reduce(BigDecimal.ZERO, BigDecimal::add); + //获取总报工数量 + pmFormData.setAssign_qty(totalInQty); + List formDataList = iPmFormDataService.list(new LambdaUpdateWrapper() + .eq(PmFormData::getForm_type, "RECEIPT_PRD") + .eq(PmFormData::getPcsn, pmFormData.getPcsn()) + .eq(PmFormData::getMaterial_id, pmFormData.getMaterial_id()) + .eq(PmFormData::getSource_form_id, pmFormData.getSource_form_id()) + .eq(PmFormData::getStatus, "80" + ) + ); + //多次报工中的最大报工数量 + BigDecimal actualQy = formDataList.stream().map(PmFormData::getQty).reduce(BigDecimal.ZERO, BigDecimal::add); + pmFormData.setActual_qty(actualQy); + BigDecimal maxReportQty = totalInQty.subtract(actualQy); + if (maxReportQty.compareTo(BigDecimal.ZERO) < 0) { + if (totalInQty.subtract(actualQy).abs().compareTo(BigDecimal.valueOf(100)) > 0) { + updateWrapper.set(PmFormData::getRemark, "生产报工数量不能超过生产订单合格数量100,请检查入库数量!"); + iPmFormDataService.update(updateWrapper); + //throw new BadRequestException("生产报工数量不能超过生产订单合格数量100,请检查入库数量!"); + } + } + Optional maxQtyObj = reportGroup.values().stream() + .flatMap(List::stream) + .filter(r -> firstKey.equals(r.getString("OperNumber"))) + .max(Comparator.comparing(obj -> new BigDecimal(obj.getString("QuaQty")))); + if (!maxQtyObj.isPresent()) { + updateWrapper.set(PmFormData::getRemark, "该生产订单未找到最大的报工数对应的生产工序汇报单"); + iPmFormDataService.update(updateWrapper); + throw new BadRequestException("该生产订单找到最大的报工数对应的生产工序汇报单"); + } + optJsonObject = maxQtyObj.get(); + Map linkedMap = new LinkedHashMap<>(); + for (String key : fEntity.keySet()) { + linkedMap.put(key, fEntity.get(key)); + } + //明细字段顺序排列 + Map tempMap = new LinkedHashMap<>(); + for (Map.Entry entry : linkedMap.entrySet()) { + tempMap.put(entry.getKey(), entry.getValue()); + if ("FMOMAINENTRYID".equals(entry.getKey())) { + tempMap.put("FSrcEntryId", optJsonObject.getString("Id")); + tempMap.put("FSrcBillType", "SFC_OperationReport"); + tempMap.put("FSrcBillNo", jsonArray.getJSONObject(0).getString("BillNo")); + tempMap.put("FSrcEntrySeq", optJsonObject.getString("Seq")); + } + if (pmFormData.getQty().compareTo(maxReportQty.abs()) > 0 && "FRealQty".equals(entry.getKey())) { + pmFormData.setQty(maxReportQty.abs()); + tempMap.put("FRealQty", maxReportQty.abs()); + } + //辅助单位 + if (!"0".equals(materialInfo.getAssist_unit_id()) && "FSecUnitId".equals(entry.getKey())) { + JSONObject fUnit = new JSONObject(); + fUnit.put("FNumber", materialInfo.getAssist_unit_id()); + tempMap.put("FSecUnitId", fUnit); + } + } + JSONArray fEntityLinkArray = new JSONArray(); + JSONObject fEntityLink = new JSONObject(); + fEntityLink.put("FEntity_Link_FRuleId", "SFC_OPTRPT2INSTOCK"); + fEntityLink.put("FEntity_Link_FSBillId", jsonArray.getJSONObject(0).getString("Id")); + fEntityLink.put("FEntity_Link_FSId", optJsonObject.getString("Id")); + fEntityLink.put("FEntity_Link_FSTableName", "T_SFC_OPTRPTENTRY"); + fEntityLink.put("FEntity_Link_FBasePrdRealQtyOld", pmFormData.getQty()); + fEntityLink.put("FEntity_Link_FBasePrdRealQty", pmFormData.getQty()); + fEntityLinkArray.add(fEntityLink); + tempMap.put("FEntity_Link", fEntityLinkArray); + fEntity.clear(); + fEntity.putAll(tempMap); + } + return billCode; } } diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/md_manage/group_dick/service/dao/MdGruopDick.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/md_manage/group_dick/service/dao/MdGruopDick.java index ffca7cb8..42d434eb 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/md_manage/group_dick/service/dao/MdGruopDick.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/md_manage/group_dick/service/dao/MdGruopDick.java @@ -1,16 +1,15 @@ package org.nl.wms.md_manage.group_dick.service.dao; -import java.math.BigDecimal; - import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; -import java.io.Serializable; - -import org.nl.common.domain.mybatis.handler.FastjsonSortTypeHandler; import lombok.Data; import lombok.EqualsAndHashCode; +import org.nl.common.domain.mybatis.handler.FastjsonSortTypeHandler; + +import java.io.Serializable; +import java.math.BigDecimal; /** *

@@ -42,6 +41,7 @@ public class MdGruopDick implements Serializable { */ private String status; + /** * 组盘 */ @@ -79,6 +79,7 @@ public class MdGruopDick implements Serializable { */ private String create_name; + /** * 自定义字段 */ @@ -86,9 +87,58 @@ public class MdGruopDick implements Serializable { private JSONObject form_data = new JSONObject(); + /** + * 是否删除 + */ + @TableField(exist = false) + private String is_delete; + + + /** + * 数量 + */ + @TableField(exist = false) + private BigDecimal qty; + /** + * 冻结数量 + */ + @TableField(exist = false) + private BigDecimal frozen_qty; + + + /** + * 批次号 + */ + @TableField(exist = false) + private String pcsn; /** * 物料编码 */ @TableField(exist = false) private String material_code; + + + /** + * 单据编号 + */ + @TableField(exist = false) + private String prd_ppbom_no; + /** + * 物料进度 + */ + @TableField(exist = false) + private String remark1; + + /** + * 物料状态 + */ + @TableField(exist = false) + private String material_status; + + /** + * ctu出库状态 + */ + @TableField(exist = false) + private String ctu_status; + } diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/md_manage/group_dick/service/dao/mapper/xml/MdGruopDickMapper.xml b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/md_manage/group_dick/service/dao/mapper/xml/MdGruopDickMapper.xml index e1624760..03faec8e 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/md_manage/group_dick/service/dao/mapper/xml/MdGruopDickMapper.xml +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/md_manage/group_dick/service/dao/mapper/xml/MdGruopDickMapper.xml @@ -7,7 +7,13 @@ + + + + + + @@ -20,6 +26,12 @@ SELECT t.task_type, + t.point_code1, + t.point_code2, t.vehicle_code, t.create_time, t.update_time, diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/pda_manage/devicemanage/DeviceManageController.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/pda_manage/devicemanage/DeviceManageController.java index b5b7e23d..88572621 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/pda_manage/devicemanage/DeviceManageController.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/pda_manage/devicemanage/DeviceManageController.java @@ -141,7 +141,7 @@ public class DeviceManageController { } }, StatusEnum.STRATEGY_TYPE.code("入库") + vehicleCode, 5); } - wmsToAcsService.toCommand(device_code, "1", vehicleInfo.getH()); + wmsToAcsService.toCommand(device_code, "1", vehicleInfo.getH(),""); return new ResponseEntity<>(TableDataInfo.build(), HttpStatus.OK); } @PostMapping("transf") diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/pda_manage/iostorage/PdaInController.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/pda_manage/iostorage/PdaInController.java index 4748c0ce..9f4277d3 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/pda_manage/iostorage/PdaInController.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/pda_manage/iostorage/PdaInController.java @@ -2,22 +2,16 @@ package org.nl.wms.pda_manage.iostorage; import cn.dev33.satoken.annotation.SaIgnore; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.alibaba.fastjson.JSONObject; import org.nl.common.TableDataInfo; import org.nl.common.anno.Log; import org.nl.common.domain.entity.PageQuery; -import org.nl.common.enums.StatusEnum; import org.nl.common.utils.MapOf; import org.nl.common.utils.RedissonUtils; -import org.nl.wms.config_manage.form_struc.service.IBmFormStrucService; -import org.nl.wms.config_manage.form_struc.service.dao.BmFormStruc; import org.nl.wms.pda_manage.iostorage.server.dto.PdaFormInMst; -import org.nl.wms.pda_manage.iostorage.server.dto.PdaFormOutMst; import org.nl.wms.pda_manage.iostorage.sevice.PdaIOService; import org.nl.wms.pda_manage.iostorage.sevice.PdaInIOService; -import org.nl.wms.pm_manage.form_data.service.IPmFormDataService; import org.nl.wms.pm_manage.form_data.service.dto.FormDataQuery; -import org.nl.wms.pm_manage.form_data.service.dto.PmFormDataDto; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -57,13 +51,54 @@ public class PdaInController { /** - * + * 根据生产合格证查询物料信息 */ @GetMapping("/getCertificateInfo/{id}") - @Log("根据合格证查询物料信息") + @Log("根据生产合格证查询物料信息") public ResponseEntity getCertificateInfo(@PathVariable String id) { return new ResponseEntity<>(pdaIOService.getCertificateInfo(id), HttpStatus.OK); } + + /** + * 根据入库单据号查询物料信息 + */ + @PostMapping("/getBillNoInfo") + @Log("根据合格证查询物料信息") + public ResponseEntity getBillNoInfo(@RequestBody JSONObject whereJson) { + return new ResponseEntity<>(pdaIOService.getBillNoInfo(whereJson), HttpStatus.OK); + } + + + /** + * 根据入库单据号查询物料信息 + */ +// @GetMapping("/getBillNoInfo/{id}") +// @Log("根据合格证查询物料信息") +// public ResponseEntity getBillNoInfo(@PathVariable String id) { +// return new ResponseEntity<>(pdaIOService.getBillNoInfo(id), HttpStatus.OK); +// } + + + + @GetMapping("order") + @Log("出库单据列表") + @SaIgnore + public ResponseEntity> orderType() { + List result = new ArrayList<>(); + // List list = iBmFormStrucService.list(new QueryWrapper() + // .like("form_desc","出库") + // .select("form_type","form_name")); + // for (BmFormStruc formStruc : list) { + // result.add(MapOf.of("text",formStruc.getForm_name(),"value",formStruc.getForm_type())); + // } + result.add(MapOf.of("text", "生产退料单", "value", "PRD_ReturnMtrl")); + result.add(MapOf.of("text", "销售退货通知单", "value", "SAL_RETURNNOTICE")); + result.add(MapOf.of("text", "委外退料单", "value", "SUB_RETURNMTRL")); +// result.add(MapOf.of("text", "委外退料单", "value", "SUB_RETURNMTRL")); +// result.add(MapOf.of("text", "其他入库单", "value", "STK_MisDelivery")); + return new ResponseEntity<>(result, HttpStatus.OK); + } + } diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/pda_manage/iostorage/PdaOutController.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/pda_manage/iostorage/PdaOutController.java index fd9fc154..84cb8a82 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/pda_manage/iostorage/PdaOutController.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/pda_manage/iostorage/PdaOutController.java @@ -53,7 +53,6 @@ public class PdaOutController { @GetMapping("order") @Log("出库单据列表") @SaIgnore - public ResponseEntity> orderType() { List result = new ArrayList<>(); // List list = iBmFormStrucService.list(new QueryWrapper() @@ -63,9 +62,10 @@ public class PdaOutController { // result.add(MapOf.of("text",formStruc.getForm_name(),"value",formStruc.getForm_type())); // } result.add(MapOf.of("text","生产用料清单","value","PRD_PPBOM")); + result.add(MapOf.of("text","生产补料单","value","PRD_FeedMtrl")); result.add(MapOf.of("text","委外用料清单","value","SUB_PPBOM")); - result.add(MapOf.of("text","采购退料单","value","PUR_MRB")); - result.add(MapOf.of("text","直接调拨单","value","STK_TransferDirect")); + result.add(MapOf.of("text","采购退料申请单","value","PUR_MRAPP")); + result.add(MapOf.of("text","直接调拨出库单","value","STK_TransferDirect")); result.add(MapOf.of("text","简单领料申请单","value","ka7c19edf9d4b4b39b8cc4a06802163b0")); result.add(MapOf.of("text","其他出库单","value","STK_MisDelivery")); return new ResponseEntity<>(result,HttpStatus.OK); @@ -111,7 +111,7 @@ public class PdaOutController { @PostMapping("orderConfirm") - @Log("查询单据数据") + @Log("一楼手持扫码出库查询单据数据") @SaIgnore public ResponseEntity> orderConfirm(@RequestBody JSONObject param) { if (param == null || StringUtils.isEmpty(param.getString("code")) || StringUtils.isEmpty(param.getString("stor_code"))) { @@ -122,7 +122,7 @@ public class PdaOutController { } /** - * 一楼单据出库确认 + * 一楼手持出库单据确认 */ @PostMapping("confirm") @Log("一楼单据出库确认") @@ -153,7 +153,7 @@ public class PdaOutController { * 二楼产线站点人工从货架取货确认 */ @PostMapping("takeConfirm") - @Log("二楼产线站点人工从货架取货出库确认") + @Log("二楼确认取货") @SaIgnore public ResponseEntity takeConfirm(@RequestBody JSONObject param) { if (param == null || StringUtils.isEmpty(param.getString("site_code"))) { diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/pda_manage/iostorage/server/dto/PdaFormInMst.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/pda_manage/iostorage/server/dto/PdaFormInMst.java index 255fcdea..fb50d8ef 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/pda_manage/iostorage/server/dto/PdaFormInMst.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/pda_manage/iostorage/server/dto/PdaFormInMst.java @@ -1,5 +1,6 @@ package org.nl.wms.pda_manage.iostorage.server.dto; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.annotation.TableField; import lombok.Data; @@ -29,6 +30,10 @@ public class PdaFormInMst implements Serializable { * 是否更新(生产入库必须参数,固定值:false) */ private String isNew; + /** + * 载具编码 + */ + private String form_type; /** * 载具编码 @@ -98,6 +103,15 @@ public class PdaFormInMst implements Serializable { * 对应明细:生产入库单-入库数量FRealQty/采购入库单-采购数量FRealQty */ private BigDecimal qty; + /** + * 已分配的qty + */ + private BigDecimal assign_qty; + + /** + * 主单据id + */ + private String parent_id; /** @@ -253,12 +267,15 @@ public class PdaFormInMst implements Serializable { private String srcBillNo; - /** * 源头订单号编号 */ private String srcBillCode; + /** + * Erp回传参数 + */ + private JSONObject form_data; } diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/pda_manage/iostorage/sevice/PdaIOService.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/pda_manage/iostorage/sevice/PdaIOService.java index db2f3ab4..ef724da6 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/pda_manage/iostorage/sevice/PdaIOService.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/pda_manage/iostorage/sevice/PdaIOService.java @@ -1,6 +1,7 @@ package org.nl.wms.pda_manage.iostorage.sevice; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; @@ -39,6 +40,8 @@ import org.nl.wms.pda_manage.iostorage.server.dto.ReceiveBillData; import org.nl.wms.pm_manage.form_data.service.IPmFormDataService; import org.nl.wms.pm_manage.form_data.service.dao.PmFormData; import org.nl.wms.pm_manage.form_data.service.dao.mapper.PmFormDataMapper; +import org.nl.wms.pm_manage.form_data.service.dto.FormDataQuery; +import org.nl.wms.pm_manage.form_data.service.dto.PmFormDataDto; import org.nl.wms.stor_manage.io.service.iostor.IStIvtIostorinvService; import org.nl.wms.stor_manage.io.service.iostor.dao.StIvtIostorinv; import org.nl.wms.stor_manage.io.service.iostor_dtl.IStIvtIostorinvdtlService; @@ -47,21 +50,20 @@ import org.nl.wms.stor_manage.struct.service.IStIvtStructattrService; import org.nl.wms.stor_manage.struct.service.dao.StIvtStructattr; import org.nl.wms.stor_manage.struct.service.dao.StructAssignQty; import org.nl.wms.stor_manage.struct.service.dto.StructattrVechielDto; +import org.nl.wms.sync_manage.service.form_mapping.ISyncFormMappingService; import org.nl.wms.sync_manage.service.form_mapping.dao.SyncFormMapping; import org.nl.wms.sync_manage.service.form_mapping.impl.SyncFormMappingServiceImpl; import org.nl.wms.system_manage.service.quartz.task.ApplyShelfScheduleService; import org.nl.wms.system_manage.service.quartz.task.SyncErpBillsScheduleService; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; @Service @@ -107,6 +109,9 @@ public class PdaIOService { @Autowired private ApplyShelfScheduleService applyShelfScheduleService; + @Lazy + @Autowired + private ISyncFormMappingService iSyncFormMappingService; /** @@ -345,7 +350,7 @@ public class PdaIOService { public StIvtIostorinv createPadIvtAndoutDispense(PdaFormOutMst pdaFormOutMst) { // || StringUtils.isEmpty(pdaFormOutMst.getStor_code()) if (pdaFormOutMst == null || !pdaFormOutMst.getHasChildren()) { - throw new BadRequestException("出库申请失败:请求参数异常"); + throw new BadRequestException("出库申请失败:请求参数异 常"); } List dtls = pdaFormOutMst.getChildren(); if (CollectionUtils.isEmpty(dtls)) { @@ -416,8 +421,18 @@ public class PdaIOService { .in("vehicle_code", vehicles.split(",")) .eq("is_delete", false).eq("material_id", dtl.getMaterial_id())); Map> pcsnListMap = MdPbVehicleMaters.stream().collect(Collectors.groupingBy(MdPbVehicleMater::getPcsn)); + //手持生成出库单 for (String disPcsn : pcsnListMap.keySet()) { List currentPcsnMater = pcsnListMap.get(disPcsn); + if (StringUtils.isNotBlank(pdaFormOutMst.getCode())) { + Set materSet = currentPcsnMater.stream().map(MdPbVehicleMater::getVehicle_code).collect(Collectors.toSet()); + //CTU更新单据号 + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.in(MdPbVehicleMater::getVehicle_code,materSet); + updateWrapper.eq(MdPbVehicleMater::getIs_delete, false); + updateWrapper.set(MdPbVehicleMater::getPrd_ppbom_no, pdaFormOutMst.getCode()); + iMdPbVehicleMaterService.update(updateWrapper); + } HashMap map = MapOf.of("end_struct_code", "", "start_struct_code", "", "order", "", "product_area", productArea); StIvtIostorinvdtl ivtDtl = new StIvtIostorinvdtl(); ivtDtl.setMaterial_id(dtl.getMaterial_id()); @@ -472,10 +487,10 @@ public class PdaIOService { .eq("id",sourceFormid)); }else { iPmFormDataService.update(new UpdateWrapper() - .set("status",StatusEnum.FORM_STATUS.code("执行中")) - .set("update_time",now) - .set("update_name",nickName) - .eq("id",sourceFormid)); + .set("status", StatusEnum.FORM_STATUS.code("执行中")) + .set("update_time", now) + .set("update_name", nickName) + .eq("id", sourceFormid)); } return mst; } @@ -484,6 +499,60 @@ public class PdaIOService { iStIvtIostorinvService.taskOpen((JSONObject) JSONObject.toJSON(mst)); } + + public List getBillNoInfo(JSONObject whereJson) { + if (ObjectUtil.isEmpty(whereJson.getString("code")) || ObjectUtil.isEmpty(whereJson.getString("form_type"))) { + throw new BadRequestException("单据编码和单据类型不能为空"); + } + FormDataQuery query = new FormDataQuery(); + query.setBill_code(whereJson.getString("code")); + query.setForm_type(whereJson.getString("form_type")); + List parentList = pmFormDataMapper.queryTree2(query); + if (ObjectUtil.isEmpty(parentList)) { + List mappingList = iSyncFormMappingService.list( + new LambdaQueryWrapper() + .eq(SyncFormMapping::getForm_type, query.getForm_type())); + if (ObjectUtil.isNotEmpty(mappingList)) { + SyncFormMapping mapping = mappingList.get(0); + String mappingString = JSON.toJSONString(mapping.getMapping_json()); + syncErpBillsScheduleService.syncData(mappingString, mapping.getForm_type(), mapping.getDtl_split(), query.getBill_code(), true); + query.setStatus(null); + parentList = pmFormDataMapper.queryTree2(query); + } + } + if (ObjectUtil.isNotEmpty(parentList)) { + List parentIds = parentList.stream() + .map(PmFormDataDto::getId) + .collect(Collectors.toList()); + List childList = pmFormDataMapper.selectChilds(parentIds); + //todo 仓库过滤 + iPmFormDataService.filterStockInfo(parentList, childList); + List finalParentList = parentList; + JSONObject parentFormData = finalParentList.get(0).getForm_data(); + childList.forEach(r -> { + r.setQty(r.getQty().subtract(r.getAssign_qty()).compareTo(BigDecimal.ZERO) >= 0 ? r.getQty().subtract(r.getAssign_qty()) : BigDecimal.ZERO); + r.setBillNo(finalParentList.get(0).getCode()); + r.setSrcBillNo(finalParentList.get(0).getCode()); + r.setBar_code(r.getId()); + JSONObject formData = r.getForm_data(); + formData.putAll(parentFormData); + formData.put("BillNo", finalParentList.get(0).getCode()); + if (r.getQty().compareTo(BigDecimal.ZERO) != 0) { + r.setBill_status("10".equals(r.getStatus()) ? "未入库" : "80".equals(r.getStatus()) ? "入库完成" : "部分入库"); + } else { + r.setBill_status("入库完成"); + r.setStatus("80"); + } + }); + if (ObjectUtils.isEmpty(childList)) { + throw new BadRequestException("请检查该单据的仓库信息是否为立库!"); + } + return childList; + } + return null; + } + + public PmFormData getCertificateInfo(String id) { K3CloudApi k3CloudApi = erpServiceUtils.getCloudApi(); PmFormData result = new PmFormData(); @@ -495,38 +564,17 @@ public class PdaIOService { //采购入库 ReceiveBillData receiveBillData = pmFormDataMapper.queryReceiveBill(id); if (receiveBillData != null) { - String pForm_data = receiveBillData.getPForm_data(); - String dForm_data = receiveBillData.getDForm_data(); - JSONObject pFormJson = JSONObject.parseObject(pForm_data); - JSONObject dFormJson = JSONObject.parseObject(dForm_data); - if (ObjectUtils.isNotEmpty(dFormJson) && ObjectUtils.isNotEmpty(pFormJson)) { - result.setBillNo(receiveBillData.getPCode()); - result.setBusinessType(StringUtils.isBlank(pFormJson.getString("businessType")) ? "CG" : dFormJson.getString("businessType")); - result.setPrdOrgId(pFormJson.getString("DemandOrgId")); - result.setStockOrgId(pFormJson.getString("StockOrgId")); - result.setSupplierId(pFormJson.getString("SupplierId")); - result.setMaterial_id(receiveBillData.getMaterial_id()); - result.setPcsn(StringUtils.isBlank(receiveBillData.getPcsn()) ? "001" : receiveBillData.getPcsn()); - result.setPurchaserId(pFormJson.getString("PurchaserId")); - result.setUnit_id(receiveBillData.getUnit_id()); - result.setQty(new BigDecimal(dFormJson.getString("ActReceiveQty"))); - result.setTaxPrice(dFormJson.getString("taxPrice")); - result.setMoNumber(receiveBillData.getPCode()); - result.setMoEntryId(receiveBillData.getDId().substring(0, receiveBillData.getDId().indexOf("$"))); - //源单信息校验 - if (StringUtils.isBlank(dFormJson.getString("OrderBillNo"))) { - result.setSrcBillNo(null); - } else { - if (dFormJson.getString("OrderBillNo").equals("0")) { - result.setSrcBillNo(null); - } else { - result.setSrcBillNo(dFormJson.getString("OrderBillNo")); - } - } - } else { - throw new BadRequestException("查询合格证关联的收料通知单信息异常!"); - } + getSlBills(result, receiveBillData); } else { + String billCode = "SLTZD_" + id; + List mappingList = iSyncFormMappingService.list( + new LambdaQueryWrapper() + .eq(SyncFormMapping::getForm_type, "PUR_ReceiveBill")); + SyncFormMapping mapping = mappingList.get(0); + String mappingString = JSON.toJSONString(mapping.getMapping_json()); + syncErpBillsScheduleService.syncData(mappingString, mapping.getForm_type(), mapping.getDtl_split(), billCode, true); + ReceiveBillData receiveBill = pmFormDataMapper.queryReceiveBill(id); + getSlBills(result, receiveBill); throw new BadRequestException("未查询到该合格证信息!"); } } @@ -552,9 +600,13 @@ public class PdaIOService { String materialMappingString = JSON.toJSONString(syncFormMapping.getMapping_json()); syncErpBillsScheduleService.queryMaterialInfo(materialMappingString, "BD_MATERIAL", false, result.getMaterial_id(), k3CloudApi); List materialList = mdMeMaterialbaseServiceImpl.list(new LambdaQueryWrapper().eq(MdMeMaterialbase::getMaterial_id, result.getMaterial_id())); - result.setMaterial_code(materialList.get(0).getMaterial_code()); - result.setMaterial_spec(materialList.get(0).getMaterial_spec()); - result.setMaterial_name(materialList.get(0).getMaterial_name()); + if (ObjectUtils.isNotEmpty(materialList)) { + result.setMaterial_code(materialList.get(0).getMaterial_code()); + result.setMaterial_spec(materialList.get(0).getMaterial_spec()); + result.setMaterial_name(materialList.get(0).getMaterial_name()); + } else { + throw new BadRequestException("该物料已存在,但当前工序计划中的物料内码id:" + result.getMaterial_id() + "与已存在的物料内码id不一致,请检查!"); + } } } if (StringUtils.isNotBlank(result.getStockId())) { @@ -562,12 +614,46 @@ public class PdaIOService { if (ObjectUtils.isNotEmpty(storattrList)) { result.setStockId(storattrList.get(0).getStor_code()); } - }else{ + } else { result.setStockId("0"); } return result; } + private void getSlBills(PmFormData result, ReceiveBillData receiveBillData) { + String pForm_data = receiveBillData.getPForm_data(); + String dForm_data = receiveBillData.getDForm_data(); + JSONObject pFormJson = JSONObject.parseObject(pForm_data); + JSONObject dFormJson = JSONObject.parseObject(dForm_data); + if (ObjectUtils.isNotEmpty(dFormJson) && ObjectUtils.isNotEmpty(pFormJson)) { + result.setBillNo(receiveBillData.getPCode()); + result.setBusinessType(StringUtils.isBlank(pFormJson.getString("businessType")) ? "CG" : dFormJson.getString("businessType")); + result.setPrdOrgId(pFormJson.getString("DemandOrgId")); + result.setStockOrgId(pFormJson.getString("StockOrgId")); + result.setSupplierId(pFormJson.getString("SupplierId")); + result.setMaterial_id(receiveBillData.getMaterial_id()); + result.setPcsn(StringUtils.isBlank(receiveBillData.getPcsn()) ? "001" : receiveBillData.getPcsn()); + result.setPurchaserId(pFormJson.getString("PurchaserId")); + result.setUnit_id(receiveBillData.getUnit_id()); + result.setQty(new BigDecimal(dFormJson.getString("ActReceiveQty"))); + result.setTaxPrice(dFormJson.getString("taxPrice")); + result.setMoNumber(receiveBillData.getPCode()); + result.setMoEntryId(receiveBillData.getDId().substring(0, receiveBillData.getDId().indexOf("$"))); + //源单信息校验 + if (StringUtils.isBlank(dFormJson.getString("OrderBillNo"))) { + result.setSrcBillNo(null); + } else { + if (dFormJson.getString("OrderBillNo").equals("0")) { + result.setSrcBillNo(null); + } else { + result.setSrcBillNo(dFormJson.getString("OrderBillNo")); + } + } + } else { + throw new BadRequestException("查询合格证关联的收料通知单信息异常!"); + } + } + /** * */ diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/pda_manage/iostorage/sevice/PdaInIOService.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/pda_manage/iostorage/sevice/PdaInIOService.java index fa5e5e7a..b593c31e 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/pda_manage/iostorage/sevice/PdaInIOService.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/pda_manage/iostorage/sevice/PdaInIOService.java @@ -43,7 +43,7 @@ public class PdaInIOService { String materialId = mst.getMaterial_id(); String vehicleCode = mst.getVehicle_code(); String unitId = mst.getUnit_id(); - mst.setStockId("FStockPallet".equals(mst.getStor_code())? "24" : "25"); + mst.setStockId("FStockPallet".equals(mst.getStor_code()) ? "24" : "25"); if (StringUtils.isBlank(mst.getSrcBillNo())) { throw new BadRequestException("操作失败,源单信息不存在!"); } @@ -53,27 +53,37 @@ public class PdaInIOService { Assert.noNullElements(new Object[]{mst.getStor_code(), mst.getQty(), mst.getMaterial_code(), mst.getBar_code(), materialId, mst.getQty()}, "入库失败:请求参数不全"); MaterGroupDto groupDto = new MaterGroupDto(); groupDto.setStor_code(mst.getStor_code()); - String form_type; - if (mst.getBillNo().contains("OP") || mst.getBillNo().contains("op")) { - form_type = "PRD_INSTOCK"; + if (StringUtils.isBlank(mst.getForm_type())) { + if (mst.getBillNo().contains("OP") || mst.getBillNo().contains("op")) { + mst.setForm_type("PRD_INSTOCK"); + } else { + mst.setForm_type("STK_InStock"); + } + groupDto.setForm_data((JSONObject) JSONObject.toJSON(mst)); } else { - form_type = "STK_InStock"; + JSONObject inFormData = mst.getForm_data(); + inFormData.put("inQty", mst.getQty()); + inFormData.put("totalQty", mst.getForm_data().getString("Qty")); + inFormData.put("assignQty", mst.getAssign_qty()); + if (StringUtils.isNotBlank(mst.getParent_id())) { + inFormData.put("ids", mst.getParent_id().split("\\$")[0]); + } + groupDto.setForm_data(inFormData); } MdMeMaterialbase meMaterialbase = iMdMeMaterialbaseService.getById(materialId); if (meMaterialbase == null) { throw new BadRequestException("入库失败,物料id在系统中不存在"); } BmMeasureUnit measureUnit = iBmMeasureUnitService.getById(unitId); - if (measureUnit==null){ + if (measureUnit == null) { throw new BadRequestException("入库失败,物料单位ID在系统中不存在"); } BmVehicleInfo vehicleInfo = iBmVehicleInfoService.vehileInfo(vehicleCode); if (vehicleInfo==null){ throw new BadRequestException("入库失败,载具编码在基础信息中不存在"); } - groupDto.setSource_form_type(form_type); + groupDto.setSource_form_type(mst.getForm_type()); groupDto.setSource_form_id(mst.getBar_code()); - groupDto.setForm_data((JSONObject) JSONObject.toJSON(mst)); MaterItem materItem = new MaterItem(); materItem.setMaterial_id(materialId); materItem.setMaterial_code(mst.getMaterial_code()); diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/pda_manage/pick/PdaPickController.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/pda_manage/pick/PdaPickController.java index 068a94da..9560e22d 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/pda_manage/pick/PdaPickController.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/pda_manage/pick/PdaPickController.java @@ -2,19 +2,16 @@ package org.nl.wms.pda_manage.pick; import cn.dev33.satoken.annotation.SaIgnore; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.nl.common.TableDataInfo; import org.nl.common.anno.Log; -import org.nl.common.domain.constant.DictConstantPool; import org.nl.common.domain.exception.BadRequestException; import org.nl.common.enums.StatusEnum; -import org.nl.common.utils.MapOf; import org.nl.common.utils.RedissonUtils; -import org.nl.wms.md_manage.group_dick.service.IMdGruopDickService; -import org.nl.wms.md_manage.group_dick.service.dao.MdGruopDick; +import org.nl.wms.md_manage.vehicleMater.service.IMdPbVehicleMaterService; +import org.nl.wms.md_manage.vehicleMater.service.dao.MdPbVehicleMater; import org.nl.wms.pda_manage.pick.dto.PdaPickQuery; import org.nl.wms.pda_manage.pick.dto.PickFormVo; import org.nl.wms.pda_manage.pick.dto.PickTask; @@ -26,15 +23,13 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.util.Assert; -import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import java.util.HashMap; import java.util.List; -import java.util.Map; +import java.util.stream.Collectors; /** *

@@ -54,27 +49,50 @@ public class PdaPickController { @Autowired private PickingService pickingService; + @Autowired + private IMdPbVehicleMaterService iMdPbVehicleMaterService; @PostMapping("queryPick") @SaIgnore @Log("查询拣选作业") public ResponseEntity queryPick(@RequestBody PdaPickQuery form) { - if (StringUtils.isEmpty(form.getVehicle_code())){ + if (StringUtils.isEmpty(form.getVehicle_code())) { throw new BadRequestException("查询失败:托盘信息不能为空"); } - PmFormData one = iPmFormDataService.getOne(new QueryWrapper() - .eq("vehicle_code", form.getVehicle_code()) - .eq("form_type", "Picking") - .lt("status", StatusEnum.FLOW_STATUS.code("完成"))); - if (one ==null){ - throw new BadRequestException("当前托盘"+form.getVehicle_code()+"不存在拣选中的作业"); + //托盘拣选信息 + if (form.getVehicle_code().contains("T")) { + List list = iMdPbVehicleMaterService.list(new QueryWrapper() + .eq("vehicle_code", form.getVehicle_code())); + if (CollectionUtils.isNotEmpty(list)) { + list = list.stream().filter(r -> StringUtils.isNotBlank(r.getRemark())).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(list)) { + list = list.stream().filter(r -> r.getRemark().contains("该托盘")).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(list)) { + throw new BadRequestException(list.get(0).getRemark()); + } else { + throw new BadRequestException("该托盘,托盘号为:" + form.getVehicle_code() + ",无相关出库信息,请在WMS系统查询库存变动信息"); + } + } else { + throw new BadRequestException("该托盘,托盘号为:" + form.getVehicle_code() + ",无相关出库信息,请在WMS系统查询库存变动信息"); + } + } else { + throw new BadRequestException("该托盘,托盘号为:" + form.getVehicle_code() + ",无组盘信息,请在WMS系统查询组盘信息"); + } + } else { + PmFormData one = iPmFormDataService.getOne(new QueryWrapper() + .eq("vehicle_code", form.getVehicle_code()) + .eq("form_type", "Picking") + .lt("status", StatusEnum.FLOW_STATUS.code("完成"))); + if (one == null) { + throw new BadRequestException("当前托盘" + form.getVehicle_code() + "不存在拣选中的作业"); + } + PickFormVo formVo = new PickFormVo(); + BeanUtils.copyProperties(one, formVo); + formVo.setPoint_code(one.getForm_data().getString("point_code")); + formVo.setProduct_area(one.getForm_data().getString("product_area")); + formVo.setStor_code(one.getForm_data().getString("stor_code")); + return new ResponseEntity<>(formVo, HttpStatus.OK); } - PickFormVo formVo = new PickFormVo(); - BeanUtils.copyProperties(one,formVo); - formVo.setPoint_code(one.getForm_data().getString("point_code")); - formVo.setProduct_area(one.getForm_data().getString("product_area")); - formVo.setStor_code(one.getForm_data().getString("stor_code")); - return new ResponseEntity<>(formVo,HttpStatus.OK); } @PostMapping("savePickTask") diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/pm_manage/form_data/controller/PmFormDataController.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/pm_manage/form_data/controller/PmFormDataController.java index 848cd0b0..289dad39 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/pm_manage/form_data/controller/PmFormDataController.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/pm_manage/form_data/controller/PmFormDataController.java @@ -7,14 +7,17 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.parser.Feature; import com.alibaba.fastjson.serializer.SerializerFeature; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; import org.nl.common.TableDataInfo; import org.nl.common.anno.Log; import org.nl.common.domain.entity.PageQuery; +import org.nl.common.domain.exception.BadRequestException; import org.nl.common.enums.StatusEnum; +import org.nl.common.utils.ErpServiceUtils; import org.nl.common.utils.SecurityUtils; +import org.nl.wms.external_system.erp.dto.ErpQuery; import org.nl.wms.pm_manage.form_data.service.IPmFormDataService; import org.nl.wms.pm_manage.form_data.service.dao.PmFormData; import org.nl.wms.pm_manage.form_data.service.dao.mapper.PmFormDataMapper; @@ -25,8 +28,9 @@ import org.springframework.http.ResponseEntity; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; -import java.util.Arrays; -import java.util.Set; +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.*; import java.util.stream.Collectors; /** @@ -46,31 +50,168 @@ public class PmFormDataController { private IPmFormDataService iPmFormDataService; @Autowired private PmFormDataMapper pFormDataMapper; + @Resource + private ErpServiceUtils erpServiceUtils; @GetMapping() @Log("查询数据") public ResponseEntity queryAll(FormDataQuery query, PageQuery page) { - return new ResponseEntity<>(TableDataInfo.build(iPmFormDataService.queryTree(query,page)), HttpStatus.OK); + return new ResponseEntity<>(TableDataInfo.build(iPmFormDataService.queryTree(query, page)), HttpStatus.OK); } + @PutMapping() @Log("修改单据结构") - public ResponseEntity update(@RequestBody JSONObject param){ + @Transactional(rollbackFor = Exception.class) + public ResponseEntity update(@RequestBody JSONObject param) { //逻辑判断:如果有数据了则不允许修改 String s = param.toString(SerializerFeature.SortField); PmFormData pmFormData = JSONObject.parseObject(s, PmFormData.class, Feature.OrderedField); - pmFormData.setUpdate_name(SecurityUtils.getCurrentUserId()); - pmFormData.setUpdate_time(DateUtil.now()); - iPmFormDataService.updateById(pmFormData); + //生产入库单存在报工数超过合格数,需要人工修改正确报工数=合格数,进行手动回传 + String id = pmFormData.getId(); + PmFormData pmFormData1 = iPmFormDataService.getById(id); + pmFormData1.setRemark(pmFormData.getRemark()); + pmFormData1.setUpdate_name(SecurityUtils.getCurrentUserId()); + pmFormData1.setUpdate_time(DateUtil.now()); + //生产入库单处理 + if ("RECEIPT_PRD".equals(pmFormData.getForm_type())) { + if (pmFormData1.getQty().subtract(pmFormData.getQty()).compareTo(BigDecimal.valueOf(100)) > 0) { + throw new BadRequestException("生产报工数量不能超过生产订单合格数量100!"); + } + pmFormData1.setQty(pmFormData.getQty()); + pmFormData1.setPcsn(pmFormData.getPcsn()); + //要回传的json数据 + JSONObject formData = pmFormData1.getErp_data(); + if (formData == null) { + throw new BadRequestException("修改失败,Erp数据未生成!"); + } + JSONObject model = formData.getJSONObject("Model"); + if (model == null) { + throw new BadRequestException("修改失败,回传Erp数据异常!"); + } + JSONArray fEntityArray = formData.getJSONObject("Model").getJSONArray("FEntity"); + //查询工序汇报 + ErpQuery reportQuery = new ErpQuery(); + reportQuery.setFilterString("FMoNumber ='" + fEntityArray.getJSONObject(0).getString("FMoBillNo") + "'"); + reportQuery.setOrderString("FId desc"); + reportQuery.setFormId("SFC_OperationReport"); + JSONArray jsonArray = erpServiceUtils.queryBills(reportQuery); + if (CollectionUtils.isEmpty(jsonArray)) { + throw new BadRequestException("该生产订单未找到对应生产工序汇报单"); + } + //获取最大的报工数 + JSONArray list = new JSONArray(); + jsonArray.forEach(r -> { + JSONObject array = (JSONObject) r; + JSONArray array1 = array.getJSONArray("OptRptEntry"); + list.addAll(array1); + }); + Map> reportGroup = list.stream() + .map(obj -> ((JSONObject) obj)) + .collect(Collectors.groupingBy(r -> ((JSONObject) r).getString("OperNumber"))); + Optional maxKey = reportGroup.keySet().stream() + .max(Comparator.comparingInt(Integer::parseInt)); + if (!maxKey.isPresent()) { + throw new BadRequestException("该生产订单未找到生产工序汇报单对应的末道工序汇报数!"); + } + String firstKey = maxKey.get(); + BigDecimal totalInQty = reportGroup.values().stream() + .flatMap(List::stream) + .filter(obj -> firstKey.equals(obj.getString("OperNumber"))) + .collect(Collectors.collectingAndThen( + Collectors.toMap( + r -> r.getString("QuaQty"), + r -> r, + (existing, replacement) -> existing, + LinkedHashMap::new + ), + map -> map.values().stream() + )) + .map(obj -> new BigDecimal(obj.getString("QuaQty"))) + .reduce(BigDecimal.ZERO, BigDecimal::add); + //获取总报工数量 + pmFormData.setAssign_qty(totalInQty); + pmFormData1.setAssign_qty(totalInQty); + List formDataList = iPmFormDataService.list(new LambdaUpdateWrapper() + .eq(PmFormData::getForm_type, "RECEIPT_PRD") + .eq(PmFormData::getPcsn, pmFormData.getPcsn()) + .eq(PmFormData::getMaterial_id, pmFormData.getMaterial_id()) + .eq(PmFormData::getSource_form_id, pmFormData.getSource_form_id()) + .eq(PmFormData::getStatus, "80" + ) + ); + //多次报工中的最大报工数量 + BigDecimal actualQy = formDataList.stream().map(PmFormData::getQty).reduce(BigDecimal.ZERO, BigDecimal::add); + pmFormData.setActual_qty(actualQy); + pmFormData1.setActual_qty(actualQy); + BigDecimal maxReportQty = totalInQty.subtract(actualQy); + if (maxReportQty.compareTo(BigDecimal.ZERO) < 0) { + if (totalInQty.subtract(actualQy).abs().compareTo(BigDecimal.valueOf(100)) > 0) { + throw new BadRequestException("生产报工数量不能超过生产订单合格数量100,请检查入库数量!"); + } + } + for (int i = 0; i < fEntityArray.size(); i++) { + JSONObject fEntity = fEntityArray.getJSONObject(i); + Map linkedMap = new LinkedHashMap<>(); + for (String key : fEntity.keySet()) { + linkedMap.put(key, fEntity.get(key)); + } + Map tempMap = new LinkedHashMap<>(); + for (Map.Entry entry : linkedMap.entrySet()) { + tempMap.put(entry.getKey(), entry.getValue()); + if ("FRealQty".equals(entry.getKey())) { + tempMap.put("FRealQty", pmFormData.getQty()); + if ("FLot".equals(entry.getKey())) { + JSONObject fLot = new JSONObject(); + fLot.put("FNumber", pmFormData.getPcsn()); + tempMap.put("FLot", fLot); + } + if ("FEntity_Link".equals(entry.getKey())) { + JSONArray jsonArray1 = fEntity.getJSONArray("FEntity_Link"); + if (jsonArray1 != null && !jsonArray1.isEmpty()) { + for (int j = 0; j < jsonArray1.size(); j++) { + JSONObject jsonObject = jsonArray1.getJSONObject(j); + Map orderedMap = new LinkedHashMap<>(); + for (String jsonKey : jsonObject.keySet()) { + orderedMap.put(jsonKey, jsonObject.get(jsonKey)); + } + orderedMap.put("FEntity_Link_FBasePrdRealQtyOld", pmFormData.getQty()); + orderedMap.put("FEntity_Link_FBasePrdRealQty", pmFormData.getQty()); + jsonArray1.set(j, new JSONObject(orderedMap)); + } + } + tempMap.put("FEntity_Link", jsonArray1); + } + } + fEntity.clear(); + fEntity.putAll(tempMap); + } + } + } + iPmFormDataService.updateById(pmFormData1); + //生产领料单处理 + if ("RECEIPT_PickMtrl".equals(pmFormData.getForm_type())) { + LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper<>(); + if (pmFormData.getRemark().contains("SOUT")) { + pmFormData.setRemark("回执单创建成功,回传Erp数据为:[{\"Number\":\"" + (pmFormData.getRemark()) + "\",\"DIndex\":0}]"); + } + lambdaUpdateWrapper.set(PmFormData::getRemark, (pmFormData.getRemark())); + lambdaUpdateWrapper.set(PmFormData::getStatus, StatusEnum.FORM_STATUS.code("完成")); + lambdaUpdateWrapper.eq(PmFormData::getSource_form_date, pmFormData1.getSource_form_date()) + .eq(PmFormData::getMaterial_id, pmFormData1.getMaterial_id()).eq(PmFormData::getStatus, StatusEnum.FORM_STATUS.code("暂停")); + iPmFormDataService.update(lambdaUpdateWrapper); + } + return new ResponseEntity<>(HttpStatus.OK); } + @DeleteMapping @Transactional @Log("删除单据") public ResponseEntity delete(@RequestBody String[] ids) { if (ids.length > 0) { - pFormDataMapper.delete(new LambdaUpdateWrapper().in(PmFormData::getId,ids)); - pFormDataMapper.delete(new LambdaUpdateWrapper().in(PmFormData::getParent_id,ids)); + pFormDataMapper.delete(new LambdaUpdateWrapper().in(PmFormData::getId, ids)); + pFormDataMapper.delete(new LambdaUpdateWrapper().in(PmFormData::getParent_id, ids)); } return new ResponseEntity<>(HttpStatus.OK); } @@ -89,13 +230,16 @@ public class PmFormDataController { @Transactional(rollbackFor = Exception.class) public ResponseEntity confirmStatus(@RequestBody JSONObject form) { JSONArray data = form.getJSONArray("data"); + String status = form.getString("status"); if (!ObjectUtils.isEmpty(data)) { Set ids = data.stream() .map(item -> (String) item) .collect(Collectors.toSet()); iPmFormDataService.update( new LambdaUpdateWrapper() - .set(PmFormData::getStatus, StatusEnum.FORM_STATUS.code("完成")) + .set(PmFormData::getStatus,status) + .set(PmFormData::getUpdate_time,DateUtil.now()) + .set(PmFormData::getUpdate_name, "人工手动完成") .in(PmFormData::getId, ids)); } return new ResponseEntity<>(HttpStatus.OK); @@ -110,16 +254,15 @@ public class PmFormDataController { return new ResponseEntity<>(HttpStatus.OK); } - - @PostMapping ("/syncFeedBack") + /** + * 手动回传 + */ + @PostMapping("/syncFeedBack") @Log("手动回执单同步") public ResponseEntity syncFeedBack(@RequestBody JSONObject fromData) { - return new ResponseEntity<>(iPmFormDataService.syncFeedBack(fromData),HttpStatus.OK); + return new ResponseEntity<>(iPmFormDataService.syncFeedBack(fromData), HttpStatus.OK); } - - - } diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/pm_manage/form_data/service/IPmFormDataService.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/pm_manage/form_data/service/IPmFormDataService.java index 79a8b80f..31b71c8a 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/pm_manage/form_data/service/IPmFormDataService.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/pm_manage/form_data/service/IPmFormDataService.java @@ -63,4 +63,7 @@ public interface IPmFormDataService extends IService { List getByParentId(String...parent_id); + + void filterStockInfo(List pmFormDataList, List childs); + } diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/pm_manage/form_data/service/dao/PmFormData.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/pm_manage/form_data/service/dao/PmFormData.java index 444699a0..9a735374 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/pm_manage/form_data/service/dao/PmFormData.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/pm_manage/form_data/service/dao/PmFormData.java @@ -163,6 +163,12 @@ public class PmFormData implements Serializable { @TableField(exist = false) private String stockOrgId; + /** + * 拣选出库的载具 + */ + @TableField(exist = false) + private String outVehicleCode; + /** * 货主类型1 diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/pm_manage/form_data/service/dao/mapper/PmFormDataMapper.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/pm_manage/form_data/service/dao/mapper/PmFormDataMapper.java index 11b72200..16947b6a 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/pm_manage/form_data/service/dao/mapper/PmFormDataMapper.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/pm_manage/form_data/service/dao/mapper/PmFormDataMapper.java @@ -8,6 +8,7 @@ import org.nl.wms.pm_manage.form_data.service.dao.PmFormData; import org.nl.wms.pm_manage.form_data.service.dto.FormDataQuery; import org.nl.wms.pm_manage.form_data.service.dto.PmFormDataDto; +import java.math.BigDecimal; import java.util.List; import java.util.Set; @@ -39,7 +40,9 @@ public interface PmFormDataMapper extends BaseMapper { ReceiveBillData queryReceiveBill(@Param("bar_code") String bar_code); - Set existFormDataList(); + Set existFormDataList(@Param("form_type") String form_type); Set existFormCodeDataList(); + BigDecimal queryTreeCounts(@Param("query") FormDataQuery query); + } diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/pm_manage/form_data/service/dao/mapper/xml/PmFormDataMapper.xml b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/pm_manage/form_data/service/dao/mapper/xml/PmFormDataMapper.xml index 568a0a9b..aca51c05 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/pm_manage/form_data/service/dao/mapper/xml/PmFormDataMapper.xml +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/pm_manage/form_data/service/dao/mapper/xml/PmFormDataMapper.xml @@ -126,6 +126,59 @@ and code LIKE '%${query.code}' + + and source_form_date = #{query.bill_code} + + + and md_me_materialbase.material_code like '%${query.mater}%' + + + and pm_form_data.create_time >= #{query.start_time} + + + and #{query.end_time} >= pm_form_data.create_time + + + and pm_form_data.status IN + + #{status} + + + + and parent_id = #{query.parent_id} + + + + + and JSON_CONTAINS(form_data, '{"${key}":"${value}"}') + + + + + ORDER BY create_time DESC + + - SELECT v.*, m.material_code, @@ -200,6 +253,29 @@ ORDER BY v.create_time DESC + SELECT id FROM pm_form_data + WHERE form_type LIKE CONCAT('%', #{form_type}, '%') + diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/stor_manage/record/service/dto/StructIvtFlowQuery.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/stor_manage/record/service/dto/StructIvtFlowQuery.java index 9234beba..e50e7e98 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/stor_manage/record/service/dto/StructIvtFlowQuery.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/stor_manage/record/service/dto/StructIvtFlowQuery.java @@ -13,8 +13,13 @@ import org.nl.wms.stor_manage.record.service.dao.StIvtStructivtflow; @Data public class StructIvtFlowQuery extends BaseQuery { + private String struct_code; private String search; private String material_code; + private String material_name; private String vehicle_code; + private String task_type; private String pcsn; + private String is_growth; + } diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/stor_manage/record/service/impl/StIvtStructivtflowServiceImpl.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/stor_manage/record/service/impl/StIvtStructivtflowServiceImpl.java index f73458b0..9cd70462 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/stor_manage/record/service/impl/StIvtStructivtflowServiceImpl.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/stor_manage/record/service/impl/StIvtStructivtflowServiceImpl.java @@ -1,6 +1,7 @@ package org.nl.wms.stor_manage.record.service.impl; +import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.github.pagehelper.Page; import com.github.pagehelper.PageHelper; @@ -12,8 +13,10 @@ import org.nl.wms.stor_manage.record.service.dao.mapper.StIvtStructivtflowMapper import org.nl.wms.stor_manage.record.service.dto.StructIvtFlowQuery; import org.springframework.stereotype.Service; +import java.util.Arrays; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; /** *

@@ -28,9 +31,57 @@ public class StIvtStructivtflowServiceImpl extends ServiceImpl taskTypes = ObjectUtil.isNotEmpty(query.getTask_type()) + ? Arrays.stream(query.getTask_type().split(",")).collect(Collectors.toList()) : null; + if (taskTypes != null) { + if (taskTypes.contains("")) { + taskTypes = null; + } + } + if (ObjectUtil.isNotEmpty(query.getSearch()) || ObjectUtil.isNotEmpty(query.getMaterial_code()) || ObjectUtil.isNotEmpty(query.getIs_growth()) || ObjectUtil.isNotEmpty(query.getMaterial_name()) || ObjectUtil.isNotEmpty(query.getVehicle_code()) || ObjectUtil.isNotEmpty(query.getPcsn())) { + if (ObjectUtil.isNotEmpty(query.getPcsn())) { + query.setPcsn(query.getPcsn().trim()); + } + if (ObjectUtil.isNotEmpty(query.getIs_growth())) { + if ("1".equals(query.getIs_growth())) { + taskTypes = Arrays.asList("10"); + } else { + taskTypes = Arrays.asList("80"); + } + query.setTask_type("taskTypes"); + } + if (ObjectUtil.isNotEmpty(query.getMaterial_code())) { + query.setMaterial_code(query.getMaterial_code().trim()); + } + if (ObjectUtil.isNotEmpty(query.getSearch())) { + query.setSearch(query.getSearch().trim()); + } + if (ObjectUtil.isNotEmpty(query.getVehicle_code())) { + query.setVehicle_code(query.getVehicle_code().trim()); + } + counts = this.baseMapper.getPageCount(query, taskTypes); + } Page page = PageHelper.startPage(pageQuery.getPage() + 1, pageQuery.getSize()); - page.setOrderBy("update_time DESC"); - List mst_detail = this.baseMapper.getPageQuery(query, pageQuery); + page.setOrderBy("struct_flow.update_time DESC"); + List mst_detail = this.baseMapper.getPageQuery(query, pageQuery, taskTypes); + if (ObjectUtil.isNotEmpty(mst_detail)) { + // Map totals = mst_detail.stream() + // .filter(item -> item.get("qty") != null) + // .filter(item -> item.get("material_code") != null) + // .collect(Collectors.groupingBy( + // r -> (String) r.get("material_code"), + // Collectors.reducing(BigDecimal.ZERO, item -> (BigDecimal) item.get("qty"), BigDecimal::add) + // )); + for (Map item : mst_detail) { + // String key = (String) item.get("material_code"); + // BigDecimal totalQty = totals.getOrDefault(key, BigDecimal.ZERO); + if ("80".equals(item.get("task_type"))) { + item.put("growth", false); + } + item.put("counts", counts); + } + } TableDataInfo build = TableDataInfo.build(mst_detail); build.setTotalElements(page.getTotal()); return build; diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/stor_manage/struct/controller/StIvtStructattrController.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/stor_manage/struct/controller/StIvtStructattrController.java index cf98dfd1..2d840dd8 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/stor_manage/struct/controller/StIvtStructattrController.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/stor_manage/struct/controller/StIvtStructattrController.java @@ -3,15 +3,26 @@ package org.nl.wms.stor_manage.struct.controller; import cn.dev33.satoken.annotation.SaIgnore; import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.nl.common.TableDataInfo; import org.nl.common.anno.Log; import org.nl.common.domain.entity.PageQuery; +import org.nl.common.domain.exception.BadRequestException; +import org.nl.common.enums.StatusEnum; import org.nl.common.utils.IdUtil; -import org.nl.common.utils.ListOf; import org.nl.common.utils.MapOf; import org.nl.common.utils.SecurityUtils; +import org.nl.wms.dispatch_manage.task.service.ISchBaseTaskService; +import org.nl.wms.dispatch_manage.task.service.dao.SchBaseTask; +import org.nl.wms.flow_manage.flow.service.execution.IActRuExecutionService; +import org.nl.wms.flow_manage.flow.service.execution.dao.ActRuExecution; +import org.nl.wms.md_manage.group_dick.service.IMdGruopDickService; +import org.nl.wms.md_manage.vehicleMater.service.IMdPbVehicleMaterService; +import org.nl.wms.md_manage.vehicleMater.service.dao.MdPbVehicleMater; import org.nl.wms.stor_manage.struct.service.IStIvtStructattrService; import org.nl.wms.stor_manage.struct.service.dao.StIvtStructattr; import org.nl.wms.stor_manage.struct.service.dto.StructattrQuery; @@ -19,6 +30,7 @@ import org.nl.wms.system_manage.service.tableData.ColumnInfoService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -42,12 +54,22 @@ public class StIvtStructattrController { private IStIvtStructattrService structattrService; @Autowired private ColumnInfoService columnInfoService; + @Autowired + private IMdPbVehicleMaterService iMdPbVehicleMaterService; + @Autowired + private IActRuExecutionService iActRuExecutionService; + @Autowired + private ISchBaseTaskService iSchBaseTaskService; + @Autowired + private IMdGruopDickService iMdGruopDickService; + @Autowired + private IStIvtStructattrService iStIvtStructattrService; @GetMapping @Log("仓位查询") @SaIgnore public ResponseEntity query(StructattrQuery query, PageQuery page) { - return new ResponseEntity<>(structattrService.pageQuery(query,page), HttpStatus.OK); + return new ResponseEntity<>(structattrService.pageQuery(query, page), HttpStatus.OK); } @PostMapping @@ -100,13 +122,61 @@ public class StIvtStructattrController { @PostMapping("/exportFile") public void exportFile(@RequestBody StructattrQuery query, HttpServletResponse response) { PageQuery page = new PageQuery(); - page.setPage(0);page.setSize(99999); + page.setPage(0); + page.setSize(99999); TableDataInfo structIvt = structattrService.getStructIvt(query, page); List maps = structIvt.getContent(); - columnInfoService.exportFile("",maps,response, + columnInfoService.exportFile("", maps, response, null, - MapOf.linkOf("stor_code","仓库编码","struct_code","仓位","vehicle_code","载具编码", - "material_code","物料编号","material_code","物料名称","pcsn","批号" - ,"forzen_qty","冻结数量","qty","库位库存","counts","物料总库存","erpCounts","ERP实时库存","differCount","立库-ERP库存差异","create_time","组盘入库时间")); + MapOf.linkOf("stor_code", "仓库编码", "struct_code", "仓位", "vehicle_code", "载具编码", + "material_code", "物料编号", "material_code", "物料名称", "pcsn", "批号" + , "forzen_qty", "冻结数量", "qty", "库位库存", "counts", "物料总库存", "erpCounts", "ERP实时库存", "differCount", "立库-ERP库存差异", "create_time", "组盘入库时间")); } + + + @PostMapping("unlock") + @Log("库存解锁") + @Transactional(rollbackFor = Exception.class) + public ResponseEntity unlock(@RequestBody JSONObject form) { + String vehicleCode = form.getString("vehicle_code"); + List ones = iMdPbVehicleMaterService.list(new QueryWrapper() + .eq("vehicle_code", vehicleCode) + .eq("is_delete", false)); + //流程校验 + for (MdPbVehicleMater one : ones) { + String proc_inst_id = one.getProc_inst_id(); + String taskCode = one.getTask_code(); + if (!StringUtils.isEmpty(taskCode)) { + List list = iSchBaseTaskService.list(new QueryWrapper().eq("vehicle_code", vehicleCode) + .lt("status", StatusEnum.FORM_STATUS.code("完成"))); + if (ObjectUtils.isNotEmpty(list)) { + throw new BadRequestException(String.format("库存解锁失败,当前载具: %s,存在任务,任务号为: %s 未完成,请在任务管理中检查任务状态。", vehicleCode, list.get(0).getTask_code())); + } + } + if (!StringUtils.isEmpty(proc_inst_id)) { + String parent_id = iActRuExecutionService.getParentByChild(proc_inst_id); + ActRuExecution ruExecution = iActRuExecutionService.getOne(new QueryWrapper() + .eq("proc_inst_id", parent_id) + .lt("status", StatusEnum.FLOW_STATUS.code("完成"))); + if (ruExecution != null) { + throw new BadRequestException(String.format("库存解锁失败,当前载具: %s,存在业务流程id为: %s 未完成,请在流程管理,流程实例中搜索载具编码检查流程状态。", vehicleCode, parent_id)); + } + } + if (structattrService.getIoBillCounts(vehicleCode) > 0) { + throw new BadRequestException(String.format("库存解锁失败,当前载具: %s,存在出入库任务,请在仓储管理,出/入库管理中搜索分配载具的任务,检查任务状态。", vehicleCode)); + } + iMdPbVehicleMaterService.update(new UpdateWrapper() + .set("frozen_qty", 0) + .set("update_time", DateUtil.now()) + .set("update_name", SecurityUtils.getCurrentNickName()) + .eq("id", one.getId())); + iStIvtStructattrService.update(new LambdaUpdateWrapper() + .set(StIvtStructattr::getLock_type, StatusEnum.LOCK.code("无锁")) + .set(StIvtStructattr::getUpdate_name, DateUtil.now()) + .set(StIvtStructattr::getUpdate_name, SecurityUtils.getCurrentNickName()) + .eq(StIvtStructattr::getVehicle_code, vehicleCode)); + } + return new ResponseEntity<>(TableDataInfo.build(), HttpStatus.OK); + } + } diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/stor_manage/struct/service/IStIvtStructattrService.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/stor_manage/struct/service/IStIvtStructattrService.java index df5e66d9..2846d881 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/stor_manage/struct/service/IStIvtStructattrService.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/stor_manage/struct/service/IStIvtStructattrService.java @@ -1,6 +1,7 @@ package org.nl.wms.stor_manage.struct.service; import com.alibaba.fastjson.JSONObject; +import org.apache.ibatis.annotations.Param; import org.nl.common.TableDataInfo; import org.nl.wms.stor_manage.struct.service.dao.StIvtStructattr; import org.nl.common.domain.entity.PageQuery; @@ -59,6 +60,7 @@ public interface IStIvtStructattrService extends IService { List getStructIvtAssign(List materials, String stor_code); + Long getIoBillCounts(String vehicleCode); } diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/stor_manage/struct/service/dao/mapper/StIvtStructattrMapper.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/stor_manage/struct/service/dao/mapper/StIvtStructattrMapper.java index ed3dc6ed..70ebcd2d 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/stor_manage/struct/service/dao/mapper/StIvtStructattrMapper.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/stor_manage/struct/service/dao/mapper/StIvtStructattrMapper.java @@ -1,5 +1,6 @@ package org.nl.wms.stor_manage.struct.service.dao.mapper; +import org.nl.wms.stor_manage.record.service.dto.StructIvtFlowQuery; import org.nl.wms.stor_manage.struct.service.dao.StIvtStructattr; import org.apache.ibatis.annotations.Param; import org.nl.common.domain.entity.PageQuery; @@ -31,5 +32,11 @@ public interface StIvtStructattrMapper extends BaseMapper { List getStructIvt(@Param("query")StructattrQuery query, PageQuery pageQuery); + Long getPageCount(@Param("query") StructattrQuery query); + Long getPageCount1(@Param("query") StructattrQuery query); + List getStructIvtAssign(@Param("materials")List materials, @Param("stor_code")String stor_code); + + Long getIoBillCounts(@Param("vehicleCode") String vehicleCode); + } diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/stor_manage/struct/service/dao/mapper/xml/StIvtStructattrMapper.xml b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/stor_manage/struct/service/dao/mapper/xml/StIvtStructattrMapper.xml index f903136e..ca25134d 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/stor_manage/struct/service/dao/mapper/xml/StIvtStructattrMapper.xml +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/stor_manage/struct/service/dao/mapper/xml/StIvtStructattrMapper.xml @@ -65,16 +65,18 @@ GROUP BY struct.struct_code - + + + diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/stor_manage/struct/service/dto/StructattrVechielDto.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/stor_manage/struct/service/dto/StructattrVechielDto.java index fd78fd03..6ba8f316 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/stor_manage/struct/service/dto/StructattrVechielDto.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/stor_manage/struct/service/dto/StructattrVechielDto.java @@ -21,6 +21,10 @@ public class StructattrVechielDto extends MdPbVehicleMater { * 载具物料id */ private String vm_id; + /** + * 入库类型 + */ + private String source_form_type; /** * 仓位编码 diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/stor_manage/struct/service/impl/StIvtStructattrServiceImpl.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/stor_manage/struct/service/impl/StIvtStructattrServiceImpl.java index 57761f21..77930908 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/stor_manage/struct/service/impl/StIvtStructattrServiceImpl.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/stor_manage/struct/service/impl/StIvtStructattrServiceImpl.java @@ -6,10 +6,10 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; import com.github.pagehelper.Page; import com.github.pagehelper.PageHelper; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.nl.common.TableDataInfo; import org.nl.common.domain.entity.PageQuery; @@ -17,12 +17,12 @@ import org.nl.common.domain.exception.BadRequestException; import org.nl.common.enums.StatusEnum; import org.nl.common.utils.ErpServiceUtils; import org.nl.common.utils.IdUtil; -import org.nl.wms.external_system.erp.dto.ErpQueryJson; import org.nl.wms.flow_manage.flow.framework.process.nodeType.excess.impl.DecisionHandler; import org.nl.wms.md_manage.group_dick.service.IMdGruopDickService; import org.nl.wms.md_manage.group_dick.service.dao.MdGruopDick; import org.nl.wms.md_manage.vehicleMater.service.IMdPbVehicleMaterService; import org.nl.wms.md_manage.vehicleMater.service.dao.MdPbVehicleMater; +import org.nl.wms.pm_manage.form_data.service.dto.ErpInventoryData; import org.nl.wms.stor_manage.record.service.IStIvtStructivtflowService; import org.nl.wms.stor_manage.record.service.dao.StIvtStructivtflow; import org.nl.wms.stor_manage.struct.service.IStIvtStructattrService; @@ -39,10 +39,8 @@ import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Map; +import java.util.*; +import java.util.function.Function; import java.util.stream.Collectors; /** @@ -54,6 +52,7 @@ import java.util.stream.Collectors; * @since 2024-04-08 */ @Service +@Slf4j public class StIvtStructattrServiceImpl extends ServiceImpl implements IStIvtStructattrService { @Autowired @@ -123,12 +122,25 @@ public class StIvtStructattrServiceImpl extends ServiceImpl 0) { + //托盘出库提示拣选信息 + if (!growth) { + update.set("remark", "该托盘需要拣选数量为:" + vehicleMater.getFrozen_qty() + ",拣选完请把托盘剩余物料拉到入库口进行回库"); + } + } else { + //托盘入库清除拣选信息 + if (growth) { + update.set("remark", ""); + } + } } update.set("qty", subtract);//50 } else { //托盘整出需要扣库存,除了二楼料箱整出不扣库存,其他都扣库存 if (!("2114").equals(point_code2)) { + if (vehicleCode.contains("T")) { + update.set("remark", "该托盘需要取走全部数量,拣选数量为:" + vehicleMater.getFrozen_qty() + ",拣选完该物料数量为0,如果托盘不存在其他类型物料,则作为空托盘使用,无需回库"); + } update.set("qty", subtract).set("is_delete", 1); } } @@ -152,7 +164,7 @@ public class StIvtStructattrServiceImpl extends ServiceImpl getStructIvt(StructattrQuery query, PageQuery pageQuery) { - if (StringUtils.isNotBlank(query.getMaterial()) || StringUtils.isNotBlank(query.getPcsn())) { - if (StringUtils.isNotBlank(query.getMaterial())) { - query.setMaterial(query.getMaterial().trim()); - } else { + List mst_detail = null; + Page page = null; + if (StringUtils.isNotBlank(query.getMaterial()) || StringUtils.isNotBlank(query.getPcsn()) || StringUtils.isNotBlank(query.getStruct_code()) || StringUtils.isNotBlank(query.getMaterial_code()) || StringUtils.isNotBlank(query.getVehicle_code())) { + if (ObjectUtil.isNotEmpty(query.getPcsn())) { query.setPcsn(query.getPcsn().trim()); + pageQuery.setSize(500); + } + if (ObjectUtil.isNotEmpty(query.getMaterial())) { + query.setMaterial(query.getMaterial().trim()); + pageQuery.setSize(500); + } + if (ObjectUtil.isNotEmpty(query.getMaterial_code())) { + query.setMaterial_code(query.getMaterial_code().trim()); + } + if (ObjectUtil.isNotEmpty(query.getStruct_code())) { + query.setStruct_code(query.getStruct_code().trim()); + } + if (ObjectUtil.isNotEmpty(query.getVehicle_code())) { + query.setVehicle_code(query.getVehicle_code().trim()); } - pageQuery.setSize(5000); } - Page page = PageHelper.startPage(pageQuery.getPage() + 1, pageQuery.getSize()); - page.setOrderBy("struct.update_time DESC"); - List mst_detail = this.baseMapper.getStructIvt(query, pageQuery); - if (ObjectUtil.isNotEmpty(mst_detail)) { - if ((StringUtils.isNotBlank(query.getMaterial()) || StringUtils.isNotBlank(query.getPcsn()))) { - ErpQueryJson erpQuery = new ErpQueryJson(); - erpQuery.setFormId("STK_Inventory"); - erpQuery.setFieldKeys("FMaterialId.FNumber,FBaseQty"); - erpQuery.setLimit(1000); - String filterString = ""; - if (StringUtils.isNotBlank(query.getMaterial())) { - filterString = "[{\"FieldName\":\"FMaterialId.FNumber\",\"Compare\":\"67\",\"Value\":\"" + mst_detail.get(0).get("material_code").toString() + "\",\"Left\":\"\",\"Right\":\"\",\"Logic\":\"0\"},{\"FieldName\":\"FStockId.FNumber\",\"Compare\":\"67\",\"Value\":\"25\",\"Left\":\"\",\"Right\":\"\",\"Logic\":\"0\"}]"; - } else { - filterString = "[{\"FieldName\":\"FLot.FNumber\",\"Compare\":\"67\",\"Value\":\"" + mst_detail.get(0).get("pcsn").toString() + "\",\"Left\":\"\",\"Right\":\"\",\"Logic\":\"0\"},{\"FieldName\":\"FStockId.FNumber\",\"Compare\":\"67\",\"Value\":\"25\",\"Left\":\"\",\"Right\":\"\",\"Logic\":\"0\"}]"; - } - ObjectMapper objectMapper = new ObjectMapper(); - try { - List> filterList = objectMapper.readValue(filterString, objectMapper.getTypeFactory().constructCollectionType(List.class, Map.class)); - erpQuery.setFilterString(filterList); - } catch (JsonProcessingException e) { - throw new BadRequestException("erp库存查询条件错误"); - } - //根据物料编号或批次查询ERP即时库存 - List result = erpServiceUtils.queryResult(erpQuery); - Map erpCounts = result.stream() - .filter(item -> item.get("erpCounts") != null) - .collect(Collectors.groupingBy( - item -> (String) item.get("material_code"), - Collectors.reducing(BigDecimal.ZERO, item -> BigDecimal.valueOf((Double) item.get("erpCounts")), BigDecimal::add) - )); + Long counts = this.baseMapper.getPageCount1(query); + if (counts > 0) { + page = PageHelper.startPage(pageQuery.getPage() + 1, pageQuery.getSize()); + page.setOrderBy("struct.update_time DESC"); + Map baseQty = null; + mst_detail = this.baseMapper.getStructIvt(query, pageQuery); + //todo 改回 + if (ObjectUtil.isNotEmpty(mst_detail)) { Map totals = mst_detail.stream() .filter(item -> item.get("qty") != null) .filter(item -> item.get("material_code") != null) @@ -259,23 +262,45 @@ public class StIvtStructattrServiceImpl extends ServiceImpl (String) item.get("material_code"), Collectors.reducing(BigDecimal.ZERO, item -> (BigDecimal) item.get("qty"), BigDecimal::add) )); - for (Map item : mst_detail) { - String key = (String) item.get("material_code"); - BigDecimal totalQty = totals.getOrDefault(key, BigDecimal.ZERO); - BigDecimal totalErpQty = erpCounts.getOrDefault(key, BigDecimal.ZERO); - BigDecimal differCount = totalQty.subtract(totalErpQty); - item.put("differCount", differCount); - item.put("counts", totalQty); - item.put("erpCounts", totalErpQty); + if ((StringUtils.isNotBlank(query.getMaterial()) || StringUtils.isNotBlank(query.getPcsn())) && counts <= 500) { + JSONObject params = new JSONObject(); + params.put("storeCode", query.getStor_code()); + params.put("materialCode", query.getMaterial()); + params.put("pcsn", query.getPcsn()); + List result = erpServiceUtils.queryInventory(params); + baseQty = result.stream() + .filter(item -> item.getBaseQty() != null) + .collect(Collectors.groupingBy( + ErpInventoryData::getMaterial_code, + Collectors.reducing(BigDecimal.ZERO, + ErpInventoryData::getBaseQty, + BigDecimal::add) + )); } - } else { - for (Map item : mst_detail) { - item.put("differCount", null); - item.put("counts", null); - item.put("erpCounts", null); + if (baseQty != null) { + for (Map item : mst_detail) { + String key = (String) item.get("material_code"); + BigDecimal totalQty = totals.getOrDefault(key, BigDecimal.ZERO); + BigDecimal totalErpQty = baseQty.getOrDefault(key, BigDecimal.ZERO); + BigDecimal differCount = totalQty.subtract(totalErpQty); + item.put("differCount", differCount); + item.put("erpCounts", totalErpQty); + item.put("counts", totalQty); + } + } else { + Long allQty = this.baseMapper.getPageCount(query); + for (Map item : mst_detail) { + item.put("differCount", null); + item.put("erpCounts", null); + item.put("counts", allQty); + } } + } } + if (ObjectUtils.isEmpty(mst_detail) || ObjectUtils.isEmpty(page)) { + return null; + } TableDataInfo build = TableDataInfo.build(mst_detail); build.setTotalElements(page.getTotal()); return build; @@ -290,6 +315,11 @@ public class StIvtStructattrServiceImpl extends ServiceImpl getStructFromBillCode(List billCodeList, String vehicleCode) { return this.baseMapper.getStructFromBillCode(billCodeList, vehicleCode); diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/sync_manage/controller/form_mapping/SyncFormMappingController.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/sync_manage/controller/form_mapping/SyncFormMappingController.java index 3ad973d0..5ab0bb81 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/sync_manage/controller/form_mapping/SyncFormMappingController.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/sync_manage/controller/form_mapping/SyncFormMappingController.java @@ -148,7 +148,7 @@ public class SyncFormMappingController { } //主单据Id final String mainId = pmFormDataList.get(0).getId(); - Set exitFormDataList = pmFormDataMapper.existFormDataList(); + Set exitFormDataList = pmFormDataMapper.existFormDataList(form.getString("form_type")); for (PmFormData f : pmFormDataList) { //存在ID,主单据不新增不修改,修改未出库单据的明细 String id = f.getId() + "$" + f.getForm_type(); diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/system_manage/controller/dict/SysDictController.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/system_manage/controller/dict/SysDictController.java index 4cd6b166..1ee00e7e 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/system_manage/controller/dict/SysDictController.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/system_manage/controller/dict/SysDictController.java @@ -4,13 +4,11 @@ package org.nl.wms.system_manage.controller.dict; import cn.dev33.satoken.annotation.SaIgnore; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; - - import lombok.RequiredArgsConstructor; +import lombok.RequiredArgsConstructor; import org.apache.commons.lang3.StringUtils; -import org.nl.common.anno.Log; import org.nl.common.TableDataInfo; +import org.nl.common.anno.Log; import org.nl.common.domain.entity.PageQuery; - import org.nl.common.domain.exception.BadRequestException; import org.nl.common.enums.StatusEnum; import org.nl.common.utils.ForkMap; @@ -128,10 +126,13 @@ public class SysDictController { Object type = criteria.get("code"); List items = new ArrayList<>(); for (StatusEnum value : StatusEnum.values()) { - if (value.name().equals(type)){ + if (value.name().equals(type)) { ForkMap forkMap = value.getCode(); + if ("TASK_TYPE".equals(type)) { + items.add(MapOf.of("label", "整箱出库", "value", "84")); + } for (String code : forkMap.getKeySet()) { - items.add(MapOf.of("label",forkMap.getM(code),"value",code)); + items.add(MapOf.of("label", forkMap.getM(code), "value", code)); } break; } diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/system_manage/service/dept/dao/mapper/SysDeptMapper.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/system_manage/service/dept/dao/mapper/SysDeptMapper.java index 4fe3ae36..1a32c50e 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/system_manage/service/dept/dao/mapper/SysDeptMapper.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/system_manage/service/dept/dao/mapper/SysDeptMapper.java @@ -34,7 +34,7 @@ public interface SysDeptMapper extends BaseMapper { List getDeptRelationByUser(@Param("user") String user); /** - * 跟新sub_count字段 + * 更新sub_count字段 * @param deptId * @return */ diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/system_manage/service/quartz/task/ApplyShelfScheduleService.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/system_manage/service/quartz/task/ApplyShelfScheduleService.java index 35804cb7..ada3eca7 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/system_manage/service/quartz/task/ApplyShelfScheduleService.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/system_manage/service/quartz/task/ApplyShelfScheduleService.java @@ -41,9 +41,9 @@ public class ApplyShelfScheduleService { @Autowired private ISchBasePointService iSchBasePointService; @Autowired - private WmsToAcsService wmsToAcsService; - @Autowired private SecondFloorEmptyShelfTask secondFloorEmptyShelfTask; + + private final String THIS_CLASS = ApplyShelfScheduleService.class.getName(); public void run() { @@ -58,6 +58,8 @@ public class ApplyShelfScheduleService { } } + + /** * 空架搬运任务 * diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/system_manage/service/quartz/task/CleanCtuTaskScheduleService.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/system_manage/service/quartz/task/CleanCtuTaskScheduleService.java new file mode 100644 index 00000000..39e8b2d9 --- /dev/null +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/system_manage/service/quartz/task/CleanCtuTaskScheduleService.java @@ -0,0 +1,75 @@ +package org.nl.wms.system_manage.service.quartz.task; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.http.HttpStatus; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import lombok.extern.slf4j.Slf4j; +import org.nl.common.TableDataInfo; +import org.nl.common.enums.StatusEnum; +import org.nl.common.utils.BaseCode; +import org.nl.common.utils.IdUtil; +import org.nl.config.lucene.LuceneAppender; +import org.nl.wms.dispatch_manage.task.service.ISchBaseTaskService; +import org.nl.wms.dispatch_manage.task.service.dao.SchBaseTask; +import org.nl.wms.dispatch_manage.task.service.dao.mapper.SchBaseTaskMapper; +import org.nl.wms.external_system.acs.service.WmsToAcsService; +import org.slf4j.MDC; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.locks.ReentrantLock; +import java.util.stream.Collectors; + +/* + * @author GBX + * @Date 2025/4/15 17:14 + */ +@Service +@Slf4j +public class CleanCtuTaskScheduleService { + + private ReentrantLock lock = new ReentrantLock(); + + @Autowired + private SchBaseTaskMapper schBaseTaskMapper; + @Autowired + private WmsToAcsService wmsToAcsService; + + public void run() { + try { + MDC.put("requestMethod", "TaskScheduleService#run"); + MDC.put("requestIp", "127.0.0.1"); + MDC.put("requestTime", DateUtil.now()); + LuceneAppender.traceIdTL.set(BaseCode.intToChars(IdUtil.getLongId())); + this.waitTaskPublish(); + } finally { + LuceneAppender.traceIdTL.remove(); + } + } + + + public void waitTaskPublish() { + boolean islock = lock.tryLock(); + try { + if (islock) { + schBaseTaskMapper.updateVehiclemater(); + schBaseTaskMapper.updateStructattr(); + } + } catch (Exception ex) { + log.error("定时任务执行异常:" + ex.getMessage()); + ex.printStackTrace(); + } finally { + if (lock.isLocked() && lock.isHeldByCurrentThread()) { + lock.unlock(); + } + } + } + + +} diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/system_manage/service/quartz/task/CtuTaskScheduleService.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/system_manage/service/quartz/task/CtuTaskScheduleService.java new file mode 100644 index 00000000..c0274331 --- /dev/null +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/system_manage/service/quartz/task/CtuTaskScheduleService.java @@ -0,0 +1,112 @@ +package org.nl.wms.system_manage.service.quartz.task; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.ObjectUtils; +import org.nl.common.enums.StatusEnum; +import org.nl.common.utils.BaseCode; +import org.nl.common.utils.IdUtil; +import org.nl.config.lucene.LuceneAppender; +import org.nl.wms.dispatch_manage.point.service.ISchBasePointService; +import org.nl.wms.dispatch_manage.point.service.dao.SchBasePoint; +import org.nl.wms.dispatch_manage.task.handler.impl.SecondFloorAgvTransferTask; +import org.nl.wms.dispatch_manage.task.service.ISchBaseTaskService; +import org.nl.wms.dispatch_manage.task.service.dao.SchBaseTask; +import org.nl.wms.external_system.acs.service.WmsToAcsService; +import org.slf4j.MDC; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.locks.ReentrantLock; +import java.util.stream.Collectors; + +/* + * @author ZZQ + * @Date 2023/3/22 17:14 + */ +@Service +@Slf4j +public class CtuTaskScheduleService { + private static final ExecutorService DELAY_EXECUTOR = Executors.newSingleThreadExecutor(); + + private ReentrantLock lock = new ReentrantLock(); + + @Autowired + private ISchBaseTaskService iSchBaseTaskService; + @Autowired + private SecondFloorAgvTransferTask secondFloorAgvTransferTask; + @Autowired + private ISchBasePointService iSchBasePointService; + + public void run() { + try { + MDC.put("requestMethod", "TaskScheduleService#run"); + MDC.put("requestIp", "127.0.0.1"); + MDC.put("requestTime", DateUtil.now()); + LuceneAppender.traceIdTL.set(BaseCode.intToChars(IdUtil.getLongId())); + this.taskPublish(); + } finally { + LuceneAppender.traceIdTL.remove(); + } + } + + + public void taskPublish() { + boolean islock = lock.tryLock(); + try { + if (islock) { + //定时任务,查询所有CTU出库完成的任务,创建二阶段agv搬运到产线任务 + List finishTaskList = iSchBaseTaskService.list( + new LambdaQueryWrapper() + .eq(SchBaseTask::getTask_step, "1") + .eq(SchBaseTask::getStatus, StatusEnum.FORM_STATUS.code("完成")) + .eq(SchBaseTask::getTask_type, StatusEnum.IOBILL_TYPE_OUT.code("二楼CTU出库")) + + ); + //二楼二阶段任务执行 + if (ObjectUtil.isNotEmpty(finishTaskList)) { + finishTaskList.stream().collect(Collectors.groupingBy(SchBaseTask::getGroup_code)).forEach((g, t) -> { + String targetCode = g.split("_")[0]; + int targetSize = Integer.parseInt(g.substring(g.lastIndexOf("_") + 1)); + //任务组任务全部完成 + if (targetSize == t.size()) { + //创建agv任务 + // 终点满足条件 + List endPointList = iSchBasePointService.checkEndPointTask(null, + StatusEnum.LOCK.code("无锁"), + StatusEnum.SORT_TYPE.code("升序"), "0", targetCode, "true"); + if (ObjectUtils.isEmpty(endPointList)) { + return; + } + JSONObject taskJsonObject = new JSONObject(); + taskJsonObject.put("pointCode1", t.get(0).getPoint_code3()); + taskJsonObject.put("pointCode2", targetCode); + taskJsonObject.put("pointCode3", t.get(0).getPoint_code2().substring(0, t.get(0).getPoint_code2().indexOf("-"))); + taskJsonObject.put("group_code", g); + taskJsonObject.put("vehicleCode", t.stream().map(SchBaseTask::getVehicle_code).collect(Collectors.joining(","))); + secondFloorAgvTransferTask.createTask(taskJsonObject); + //更新agv任务已创建 + iSchBaseTaskService.update(new LambdaUpdateWrapper() + .set(SchBaseTask::getTask_step, "2") + .in(SchBaseTask::getId, t.stream().map(SchBaseTask::getId).collect(Collectors.toList()))); + } + }); + } + } + } catch (Exception ex) { + log.error("定时任务执行异常:" + ex.getMessage()); + ex.printStackTrace(); + } finally { + if (lock.isLocked() && lock.isHeldByCurrentThread()) { + lock.unlock(); + } + } + } +} diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/system_manage/service/quartz/task/SyncErpBillsScheduleService.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/system_manage/service/quartz/task/SyncErpBillsScheduleService.java index 14738501..f4c5c13d 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/system_manage/service/quartz/task/SyncErpBillsScheduleService.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/system_manage/service/quartz/task/SyncErpBillsScheduleService.java @@ -134,9 +134,15 @@ public class SyncErpBillsScheduleService { String sevenDaysAgo = new SimpleDateFormat("yyyy-MM-dd").format(calendar.getTime()); String filterString; if (StringUtils.isNotBlank(billCode)) { - filterString = "FBillNo like '%" + billCode + "'"; + if (billCode.contains("SLTZD")) { + billCode = billCode.split("_")[1]; + filterString = "FBarCode = '" + billCode + "'"; + } else { + + filterString = "FBillNo like '%" + billCode + "'"; + } } else { - filterString = getFilterString(formType, "", sevenDaysAgo, today); + filterString = getFilterString(formType, billCode, sevenDaysAgo, today); } query.setFilterString(filterString); query.setFormId(formType); @@ -180,20 +186,24 @@ public class SyncErpBillsScheduleService { * 手动同步 */ private String manualSyncData(String mappingJson, String formType, Boolean dtlSplit, String code, String start, String end) { - Map errorMsg = new HashMap<>(); try { - + //如果是物料,不是单据,则同步物料信息 + if ("BD_MATERIAL".equals(formType)) { + K3CloudApi k3CloudApi = erpServiceUtils.getCloudApi(); + queryMaterialInfo(mappingJson, formType, dtlSplit, code, k3CloudApi); + return "同步成功"; + } //单据同步总数 - JSONArray result; - // 获取当前日期 - String timeEnd = new SimpleDateFormat("yyyy-MM-dd").format(new Date()); - Calendar calendar = Calendar.getInstance(); - calendar.add(Calendar.DAY_OF_MONTH, -15); - String timeStart = new SimpleDateFormat("yyyy-MM-dd").format(calendar.getTime()); - if (StringUtils.isNotBlank(start) && StringUtils.isNotBlank(end)) { - timeStart = start; - timeEnd = end; + JSONArray result; + // 获取当前日期 + String timeEnd = new SimpleDateFormat("yyyy-MM-dd").format(new Date()); + Calendar calendar = Calendar.getInstance(); + calendar.add(Calendar.DAY_OF_MONTH, -15); + String timeStart = new SimpleDateFormat("yyyy-MM-dd").format(calendar.getTime()); + if (StringUtils.isNotBlank(start) && StringUtils.isNotBlank(end)) { + timeStart = start; + timeEnd = end; } String filterString = getFilterString(formType, code, timeStart, timeEnd); ErpQuery query = new ErpQuery(); @@ -238,9 +248,9 @@ public class SyncErpBillsScheduleService { private void handleBills(String mappingJson, String formType, Boolean dtlSplit, Map errorMsg, JSONArray result, K3CloudApi cloudApi, Boolean isManual) { //物料同步 - SyncFormMapping syncFormMapping = syncFormMappingServiceImpl.getOne(new LambdaQueryWrapper().in(SyncFormMapping::getForm_type, "BD_MATERIAL")); + SyncFormMapping syncFormMapping = syncFormMappingServiceImpl.getOne(new LambdaQueryWrapper().in(SyncFormMapping::getForm_type, formType)); String materialMappingString = JSON.toJSONString(syncFormMapping.getMapping_json()); - Set exitFormDataList = pmFormDataMapper.existFormDataList(); + Set exitFormDataList = pmFormDataMapper.existFormDataList(formType); 外部: for (int i = 0; i < result.size(); i++) { Object r = result.get(i); @@ -399,13 +409,15 @@ public class SyncErpBillsScheduleService { MdMeMaterialbase materialInfo = iMdMeMaterialbaseService.getOne(new QueryWrapper().eq("material_id", mainFormData.getId())); if (materialInfo != null) { iMdMeMaterialbaseService.update(new LambdaUpdateWrapper() - .set(MdMeMaterialbase::getMaterial_code, m_code) + .set(MdMeMaterialbase::getMaterial_id, mainFormData.getId()) .set(MdMeMaterialbase::getMaterial_name, m_name) .set(MdMeMaterialbase::getMaterial_spec, m_spec) .set(MdMeMaterialbase::getQty_unit_id, m_unit) .set(MdMeMaterialbase::getAssist_unit_id, assistUint) .set(MdMeMaterialbase::getPrint_no, formData.getPcsn()) - .eq(MdMeMaterialbase::getMaterial_id, materialInfo.getMaterial_id())); + .set(MdMeMaterialbase::getUpdate_time, DateUtil.now()) + .set(MdMeMaterialbase::getEnglish_name, "id变更前id:" + materialInfo.getMaterial_id()) + .eq(MdMeMaterialbase::getMaterial_code, m_code)); } else { MdMeMaterialbase materialBase = new MdMeMaterialbase(); materialBase.setMaterial_id(mainFormData.getId()); diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/system_manage/service/quartz/task/TaskScheduleService.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/system_manage/service/quartz/task/TaskScheduleService.java index ef546bdb..80fbf218 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/system_manage/service/quartz/task/TaskScheduleService.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/system_manage/service/quartz/task/TaskScheduleService.java @@ -15,6 +15,7 @@ import org.nl.common.TableDataInfo; import org.nl.common.enums.StatusEnum; import org.nl.common.utils.BaseCode; import org.nl.common.utils.IdUtil; +import org.nl.common.utils.ListOf; import org.nl.config.lucene.LuceneAppender; import org.nl.wms.dispatch_manage.point.service.ISchBasePointService; import org.nl.wms.dispatch_manage.point.service.dao.SchBasePoint; @@ -27,8 +28,11 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; +import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import java.util.concurrent.locks.ReentrantLock; import java.util.stream.Collectors; @@ -39,7 +43,7 @@ import java.util.stream.Collectors; @Service @Slf4j public class TaskScheduleService { - + private static final ExecutorService DELAY_EXECUTOR = Executors.newSingleThreadExecutor(); private ReentrantLock lock = new ReentrantLock(); @@ -71,62 +75,79 @@ public class TaskScheduleService { try { if (islock) { //定时任务,查询所有自动下发acs的任务与CTU出库完成的任务 - List taskList = iSchBaseTaskService.list( - new LambdaQueryWrapper() - .or(r -> r.eq(SchBaseTask::getIs_send, true).eq(SchBaseTask::getStatus, StatusEnum.FORM_STATUS.code("生成"))) - .or(r -> r.eq(SchBaseTask::getStatus, StatusEnum.FORM_STATUS.code("完成")).eq(SchBaseTask::getTask_step, "1")).eq(SchBaseTask::getTask_type, StatusEnum.IOBILL_TYPE_OUT.code("二楼CTU出库"))); + List taskList = iSchBaseTaskService.list(new LambdaQueryWrapper() .in(SchBaseTask::getStatus, ListOf.of("10", "15", "20"))); List createTaskList = taskList.stream().filter(r -> r.getStatus().equals(StatusEnum.FORM_STATUS.code("生成"))).collect(Collectors.toList()); + //生成的任务处理 if (ObjectUtil.isNotEmpty(createTaskList)) { - List taskCodes = createTaskList.stream().map(SchBaseTask::getTask_code).collect(Collectors.toList()); - log.info("---执行定时222任务:-----taskPublish-----" + taskCodes); - TableDataInfo response = wmsToAcsService.interationToExt(createTaskList, "createTask"); - if (!response.getCode().equals(String.valueOf(HttpStatus.HTTP_OK))) { - JSONArray results = (JSONArray) JSON.toJSON(response.getData()); - if (!CollectionUtils.isEmpty(results)) { - for (Object result : results) { - Map resultM = (Map) result; - taskCodes.remove(resultM.get("task_code")); - iSchBaseTaskService.update(new UpdateWrapper() - .eq("task_code", resultM.get("task_code")) - .set("status", StatusEnum.FORM_STATUS.code("暂停")) - .set("update_time", DateUtil.now()).set("remark", resultM.get("msg"))); - } - } + // 优先发送移库任务 + List immediatelyTaskList = createTaskList.stream() + .filter(r -> r.getTask_type().equals(StatusEnum.IOBILL_TYPE_MOVE.code("异常位移库"))) + .collect(Collectors.toList()); + List delayTaskList = new ArrayList<>(createTaskList); + delayTaskList.removeAll(immediatelyTaskList); + if (ObjectUtil.isNotEmpty(immediatelyTaskList)) { + List taskCodes = immediatelyTaskList.stream().map(SchBaseTask::getTask_code).collect(Collectors.toList()); + log.info("---立即下发任务: " + taskCodes); + TableDataInfo response = wmsToAcsService.interationToExt(immediatelyTaskList, "createTask"); + handleTaskResponse(response, taskCodes); // 提取为独立方法以复用 } - if (!CollectionUtils.isEmpty(taskCodes)) { - iSchBaseTaskService.update(new UpdateWrapper() - .set("status", StatusEnum.FORM_STATUS.code("下发")) - .in("task_code", taskCodes)); - } - } - List finishTaskList = taskList.stream().filter(r -> r.getStatus().equals(StatusEnum.FORM_STATUS.code("完成"))).collect(Collectors.toList()); - if (ObjectUtil.isNotEmpty(finishTaskList)) { - finishTaskList.stream().collect(Collectors.groupingBy(SchBaseTask::getGroup_code)).forEach((g, t) -> { - String targetCode = g.split("_")[0]; - int targetSize = Integer.parseInt(g.substring(g.lastIndexOf("_") + 1)); - //任务组任务全部完成 - if (targetSize == t.size()) { - //创建agv任务 - // 终点满足条件 - List endPointList = iSchBasePointService.checkEndPointTask(null, - StatusEnum.LOCK.code("无锁"), - StatusEnum.SORT_TYPE.code("升序"), "0", targetCode, "true"); - if (ObjectUtils.isEmpty(endPointList)) { - return; - } - JSONObject taskJsonObject = new JSONObject(); - taskJsonObject.put("pointCode1", t.get(0).getPoint_code3()); - taskJsonObject.put("pointCode2", targetCode); - taskJsonObject.put("pointCode3", t.get(0).getPoint_code2().substring(0, t.get(0).getPoint_code2().indexOf("-"))); - taskJsonObject.put("group_code", g); - taskJsonObject.put("vehicleCode", t.stream().map(SchBaseTask::getVehicle_code).collect(Collectors.joining(","))); - secondFloorAgvTransferTask.createTask(taskJsonObject); - //更新agv任务已创建 - iSchBaseTaskService.update(new LambdaUpdateWrapper() - .set(SchBaseTask::getTask_step, "2") - .in(SchBaseTask::getId, t.stream().map(SchBaseTask::getId).collect(Collectors.toList()))); + if (ObjectUtil.isNotEmpty(delayTaskList)) { + //1311 出库拣选 (1311目标拣选任务不超过4个) + List jxTaskList = taskList.stream() + .filter(r -> ((r.getStatus().equals(StatusEnum.FORM_STATUS.code("下发")) || + r.getStatus().equals(StatusEnum.FORM_STATUS.code("执行中"))) && + r.getProduct_area().contains("A3") && + r.getPoint_code2().contains("1311") && + r.getTask_type().equals(StatusEnum.IOBILL_TYPE_OUT.code("出库拣选")))) + .collect(Collectors.toList()); + if (jxTaskList.size() > 3) { + List waitTaskList1 = delayTaskList.stream().filter(r -> r.getProduct_area().contains("A3") && r.getPoint_code2().contains("1311") && r.getTask_type().equals(StatusEnum.IOBILL_TYPE_OUT.code("出库拣选"))).collect(Collectors.toList()); + delayTaskList.removeAll(waitTaskList1); } - }); + //做预约单,整出的不下发,标记待执行 + List waitTaskList = delayTaskList.stream().filter(r -> (r.getPoint_code1().contains("L") && "2114".equals(r.getPoint_code2()))).collect(Collectors.toList()); + if (ObjectUtil.isNotEmpty(waitTaskList)) { + List waitIds = waitTaskList.stream().map(SchBaseTask::getId).collect(Collectors.toList()); + LambdaUpdateWrapper updateWrapper1 = new LambdaUpdateWrapper<>(); + updateWrapper1.in(SchBaseTask::getId, waitIds); + updateWrapper1.set(SchBaseTask::getTask_step, "0"); + iSchBaseTaskService.update(updateWrapper1); + delayTaskList.removeAll(waitTaskList); + } + //相同载具号,任务类型的任务不下发 + Map> grouped = delayTaskList.stream() + .collect(Collectors.groupingBy(task -> task.getVehicle_code() + "_" + task.getTask_type())); + List toRemove = new ArrayList<>(); + grouped.forEach((k, t) -> { + if (t.size() > 1) { + toRemove.addAll(t.subList(1, t.size())); + } + }); + if (toRemove.size() > 0) { + List taskIds = toRemove.stream().map(SchBaseTask::getId).collect(Collectors.toList()); + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.in(SchBaseTask::getId, taskIds); + updateWrapper.set(SchBaseTask::getStatus, StatusEnum.FORM_STATUS.code("完成")); + updateWrapper.set(SchBaseTask::getIs_delete, "1"); + updateWrapper.set(SchBaseTask::getRemark, "前置校验,载具号与任务类型相同,校验完成"); + iSchBaseTaskService.update(updateWrapper); + delayTaskList.removeAll(toRemove); + } + DELAY_EXECUTOR.execute(() -> { + try { + Thread.sleep(2000); + List taskCodes = delayTaskList.stream().map(SchBaseTask::getTask_code).collect(Collectors.toList()); + log.info("---延迟下发任务: " + taskCodes); + TableDataInfo response = wmsToAcsService.interationToExt(delayTaskList, "createTask"); + handleTaskResponse(response, taskCodes); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + log.error("延迟任务被中断", e); + } catch (Exception e) { + log.error("延迟下发任务执行失败", e); + } + }); + } } } }catch (Exception ex){ @@ -138,6 +159,26 @@ public class TaskScheduleService { } } } - + private void handleTaskResponse(TableDataInfo response, List taskCodes) { + if (!response.getCode().equals(String.valueOf(HttpStatus.HTTP_OK))) { + JSONArray results = (JSONArray) JSON.toJSON(response.getData()); + if (!CollectionUtils.isEmpty(results)) { + for (Object result : results) { + Map resultM = (Map) result; + taskCodes.remove(resultM.get("task_code")); + iSchBaseTaskService.update(new UpdateWrapper() + .eq("task_code", resultM.get("task_code")) + .set("status", StatusEnum.FORM_STATUS.code("暂停")) + .set("update_time", DateUtil.now()) + .set("remark", resultM.get("msg"))); + } + } + } + if (!CollectionUtils.isEmpty(taskCodes)) { + iSchBaseTaskService.update(new UpdateWrapper() + .set("status", StatusEnum.FORM_STATUS.code("下发")) + .in("task_code", taskCodes)); + } + } } diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/system_manage/service/quartz/task/WaitTaskScheduleService.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/system_manage/service/quartz/task/WaitTaskScheduleService.java new file mode 100644 index 00000000..3da484c7 --- /dev/null +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/system_manage/service/quartz/task/WaitTaskScheduleService.java @@ -0,0 +1,99 @@ +package org.nl.wms.system_manage.service.quartz.task; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.http.HttpStatus; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import lombok.extern.slf4j.Slf4j; +import org.nl.common.TableDataInfo; +import org.nl.common.enums.StatusEnum; +import org.nl.common.utils.BaseCode; +import org.nl.common.utils.IdUtil; +import org.nl.config.lucene.LuceneAppender; +import org.nl.wms.dispatch_manage.task.service.ISchBaseTaskService; +import org.nl.wms.dispatch_manage.task.service.dao.SchBaseTask; +import org.nl.wms.external_system.acs.service.WmsToAcsService; +import org.slf4j.MDC; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.locks.ReentrantLock; +import java.util.stream.Collectors; + +/* + * @author GBX + * @Date 2025/4/15 17:14 + */ +@Service +@Slf4j +public class WaitTaskScheduleService { + + private ReentrantLock lock = new ReentrantLock(); + + @Autowired + private ISchBaseTaskService iSchBaseTaskService; + @Autowired + private WmsToAcsService wmsToAcsService; + + public void run() { + try { + MDC.put("requestMethod", "TaskScheduleService#run"); + MDC.put("requestIp", "127.0.0.1"); + MDC.put("requestTime", DateUtil.now()); + LuceneAppender.traceIdTL.set(BaseCode.intToChars(IdUtil.getLongId())); + this.waitTaskPublish(); + } finally { + LuceneAppender.traceIdTL.remove(); + } + } + + + public void waitTaskPublish() { + boolean islock = lock.tryLock(); + try { + if (islock) { + //定时任务,查询所有自动下发acs的任务与CTU出库完成的任务 + List taskList = iSchBaseTaskService.list( + new LambdaQueryWrapper() + .eq(SchBaseTask::getTask_step, "0") + .eq(SchBaseTask::getStatus, StatusEnum.FORM_STATUS.code("生成")) + ); + List taskCodes = taskList.stream().map(SchBaseTask::getTask_code).collect(Collectors.toList()); + log.info("---执行夜间定时整出任务:-----waitTaskPublish-----" + taskCodes); + TableDataInfo response = wmsToAcsService.interationToExt(taskList, "createTask"); + if (!response.getCode().equals(String.valueOf(HttpStatus.HTTP_OK))) { + JSONArray results = (JSONArray) JSON.toJSON(response.getData()); + if (!CollectionUtils.isEmpty(results)) { + for (Object result : results) { + Map resultM = (Map) result; + taskCodes.remove(resultM.get("task_code")); + iSchBaseTaskService.update(new UpdateWrapper() + .eq("task_code", resultM.get("task_code")) + .set("status", StatusEnum.FORM_STATUS.code("暂停")) + .set("update_time", DateUtil.now()).set("remark", resultM.get("msg"))); + } + } + } + if (!CollectionUtils.isEmpty(taskCodes)) { + iSchBaseTaskService.update(new UpdateWrapper() + .set("status", StatusEnum.FORM_STATUS.code("下发")) + .in("task_code", taskCodes)); + } + } + } catch (Exception ex) { + log.error("定时任务执行异常:" + ex.getMessage()); + ex.printStackTrace(); + } finally { + if (lock.isLocked() && lock.isHeldByCurrentThread()) { + lock.unlock(); + } + } + } + + +} diff --git a/wms_pro/qd/src/views/mnt/database/index.vue b/wms_pro/qd/src/views/mnt/database/index.vue index 0e4373d9..4130531e 100644 --- a/wms_pro/qd/src/views/mnt/database/index.vue +++ b/wms_pro/qd/src/views/mnt/database/index.vue @@ -4,7 +4,14 @@
- +
diff --git a/wms_pro/qd/src/views/system/timing/index.vue b/wms_pro/qd/src/views/system/timing/index.vue index 9caf5af5..b5e207bc 100644 --- a/wms_pro/qd/src/views/system/timing/index.vue +++ b/wms_pro/qd/src/views/system/timing/index.vue @@ -4,7 +4,15 @@
- +
@@ -16,19 +24,25 @@ type="info" icon="el-icon-tickets" @click="doLog" - >日志 + >日志 +
- + - - - + @@ -55,6 +69,9 @@ + + + @@ -67,8 +84,8 @@ 暂停 - - + + - + + + + + + - - - - - + + - + @@ -136,7 +197,26 @@ import crudOperation from '@crud/CRUD.operation' import pagination from '@crud/Pagination' import Crontab from './components/crontab' -const defaultForm = { job_id: null, bean_name: null, cron_expression: null, is_pause: false, job_name: null, method_name: null, params: null, description: null, person_in_charge: null, email: null, sub_task: null, pause_after_failure: true, create_id: null, create_name: null, create_time: null, update_id: null, update_name: null, update_time: null } +const defaultForm = { + job_id: null, + bean_name: null, + cron_expression: null, + is_pause: false, + job_name: null, + method_name: null, + params: null, + description: null, + person_in_charge: null, + email: null, + sub_task: null, + pause_after_failure: true, + create_id: null, + create_name: null, + create_time: null, + update_id: null, + update_name: null, + update_time: null +} export default { name: 'Timing', components: { Log, pagination, crudOperation, rrOperation, Crontab }, diff --git a/wms_pro/qd/src/views/system/timing/timing.js b/wms_pro/qd/src/views/system/timing/timing.js index 613e15f4..018b37e8 100644 --- a/wms_pro/qd/src/views/system/timing/timing.js +++ b/wms_pro/qd/src/views/system/timing/timing.js @@ -38,4 +38,4 @@ export function execution(id) { }) } -export default { del, updateIsPause, execution, add, edit } +export default { updateIsPause, execution, add, edit } diff --git a/wms_pro/qd/src/views/wms/base_manage/measure/index.vue b/wms_pro/qd/src/views/wms/base_manage/measure/index.vue index e1c7834a..ad02a66c 100644 --- a/wms_pro/qd/src/views/wms/base_manage/measure/index.vue +++ b/wms_pro/qd/src/views/wms/base_manage/measure/index.vue @@ -3,6 +3,7 @@
- + diff --git a/wms_pro/qd/src/views/wms/dispatch_manage/task/index.vue b/wms_pro/qd/src/views/wms/dispatch_manage/task/index.vue index 6d7456aa..f42815fe 100644 --- a/wms_pro/qd/src/views/wms/dispatch_manage/task/index.vue +++ b/wms_pro/qd/src/views/wms/dispatch_manage/task/index.vue @@ -17,6 +17,7 @@ clearable style="width: 240px" placeholder="任务号" + @input="handleSearchInput('task_code')" @keyup.enter.native="crud.toQuery" /> @@ -27,6 +28,7 @@ clearable style="width: 240px" placeholder="任务ID" + @input="handleSearchInput('task_id')" @keyup.enter.native="crud.toQuery" /> @@ -37,6 +39,7 @@ clearable style="width: 240px" placeholder="载具号" + @input="handleSearchInput('vehicle_code')" @keyup.enter.native="crud.toQuery" /> @@ -46,6 +49,7 @@ clearable style="width: 240px" placeholder="起点" + @input="handleSearchInput('point_code')" @keyup.enter.native="crud.toQuery" /> @@ -86,7 +90,6 @@ placeholder="任务类型" class="filter-item" clearable - @change="handTaskStatus" > + 清空条件
- - 未完成数: - - 任务调度 - + + + + + + + + 执行整出任务 + - + - + - - + - - + + @@ -211,8 +214,6 @@ - - - + - - + + + + + + + + + - - - - + + + + 清空条件
@@ -105,7 +121,7 @@ icon="el-icon-check" size="mini" :disabled="!currentRow" - @click="confirm" + @click="confirm('80')" > 处理完成 @@ -122,24 +138,24 @@ - + - + - + - + @@ -149,6 +165,21 @@ + + + + + + + + + + + + + + + @@ -189,7 +220,38 @@ {{ scope.row.code }} - + + + + + + + + - - - @@ -220,6 +280,8 @@ + + @@ -236,7 +298,7 @@ :data="scope.row" :permission="permission" :disabled-edit="scope.row.is_modify === '0'" - :disabled-dle="scope.row.is_modify === '0'" + :disabled-dle="true" msg="确定删除吗,如果存在下级节点则一并删除,此操作不能撤销!" /> @@ -338,8 +400,33 @@ export default { this.getFromTypes() }, mounted() { + this.query.status = localStorage.getItem('searchQuery_status4') || '' + this.query.bill_code = localStorage.getItem('searchQuery_bill_code4') || '' + this.query.mater = localStorage.getItem('searchQuery_mater4') || '' + this.query.pcsn = localStorage.getItem('searchQuery_pcsn4') || '' }, methods: { + handleSearchInput(queryKey) { + if (this.query[queryKey]) { + // 只有当输入框不为空时,才保存到 localStorage + localStorage.setItem(`searchQuery_${queryKey + '4'}`, this.query[queryKey]) + } else { + // 清空时,移除对应的查询条件 + localStorage.removeItem(`searchQuery_${queryKey + '4'}`) + } + this.crud.toQuery() + }, + delQueryItem() { + localStorage.removeItem('searchQuery_status4') + localStorage.removeItem('searchQuery_bill_code4') + localStorage.removeItem('searchQuery_mater4') + localStorage.removeItem('searchQuery_pcsn4') + this.query.status = '' + this.query.bill_code = '' + this.query.mater = '' + this.query.pcsn = '' + this.crud.toQuery() + }, [CRUD.HOOK.beforeRefresh]() { if (this.query.datepick) { this.query.start_time = this.query.datepick[0] @@ -420,14 +507,15 @@ export default { }, handleDtlCurrentChange(val) { this.currentRow = val - }, confirm() { + }, confirm(status) { if (this.currentRow.length === 0) { this.crud.notify('请选择一行单据', CRUD.NOTIFICATION_TYPE.INFO) return } const ids = this.currentRow.map(row => row.id) const param = { - data: ids + data: ids, + status: status } crudFormData.confirm(param).then(res => { this.crud.notify('单据处理成功!', CRUD.NOTIFICATION_TYPE.SUCCESS) diff --git a/wms_pro/qd/src/views/wms/pm_manage/form_data/index.vue b/wms_pro/qd/src/views/wms/pm_manage/form_data/index.vue index cbd8ecbf..d8af8114 100644 --- a/wms_pro/qd/src/views/wms/pm_manage/form_data/index.vue +++ b/wms_pro/qd/src/views/wms/pm_manage/form_data/index.vue @@ -125,7 +125,7 @@ - + diff --git a/wms_pro/qd/src/views/wms/stor_manage/in/index.vue b/wms_pro/qd/src/views/wms/stor_manage/in/index.vue index fca9e5cd..d00ca576 100644 --- a/wms_pro/qd/src/views/wms/stor_manage/in/index.vue +++ b/wms_pro/qd/src/views/wms/stor_manage/in/index.vue @@ -87,7 +87,8 @@ :key="item.value" :label="item.label" :value="item.value" - /> + />RECSPPM202504230003 + - + 2 + diff --git a/wms_pro/qd/src/views/wms/stor_manage/out/ViewDialog.vue b/wms_pro/qd/src/views/wms/stor_manage/out/ViewDialog.vue index a1966ffe..a5133a1c 100644 --- a/wms_pro/qd/src/views/wms/stor_manage/out/ViewDialog.vue +++ b/wms_pro/qd/src/views/wms/stor_manage/out/ViewDialog.vue @@ -100,6 +100,13 @@ + + + @@ -176,7 +183,22 @@ export default { storlist: [], currentdtl: null, currentDis: {}, - form: {} + form: {}, + formStatus: [ + { + value: '10', + label: '生成' + }, + { + value: '20', + label: '执行中' + }, + { + value: '80', + label: '完成' + } + ] + } }, watch: { diff --git a/wms_pro/qd/src/views/wms/stor_manage/out/index.vue b/wms_pro/qd/src/views/wms/stor_manage/out/index.vue index f4830ad1..48df604d 100644 --- a/wms_pro/qd/src/views/wms/stor_manage/out/index.vue +++ b/wms_pro/qd/src/views/wms/stor_manage/out/index.vue @@ -26,6 +26,7 @@ size="mini" clearable placeholder="单据号" + @input="handleSearchInput('source_form_code')" /> @@ -34,6 +35,7 @@ size="mini" clearable placeholder="分配载具" + @input="handleSearchInput('vehicles')" /> @@ -42,6 +44,7 @@ size="mini" clearable placeholder="物料编码或名称" + @input="handleSearchInput('material')" /> @@ -96,6 +99,7 @@ + 清空条件 @@ -134,6 +138,17 @@ > 强制取消 + + 处理完成 + { + // this.cols = res + // }) + }, setDefaultDate() { const now = new Date() const lastWeek = new Date() @@ -293,12 +339,6 @@ export default { this.query.start_time = start_time this.query.end_time = end_time }, - [CRUD.HOOK.beforeRefresh]() { - this.setDefaultDate() - formstruc.getHeader('st_ivt_iostorinv_out').then(res => { - this.cols = res - }) - }, [CRUD.HOOK.beforeToEdit](row) { this.$refs.editDialog.setForm(row) }, @@ -345,6 +385,16 @@ export default { this.crud.toQuery() }) }, + confirmMst() { + if (!this.currentRow) { + this.crud.notify('请选择一条单据', CRUD.NOTIFICATION_TYPE.INFO) + return + } + crudProductOut.confirmMst(this.currentRow.id).then(res => { + this.crud.notify('操作成功', CRUD.NOTIFICATION_TYPE.SUCCESS) + this.crud.toQuery() + }) + }, handleCurrentChange(currentRow) { if (currentRow === null) { this.dis_flag = true diff --git a/wms_pro/qd/src/views/wms/stor_manage/out/storinvout.js b/wms_pro/qd/src/views/wms/stor_manage/out/storinvout.js index 9ae1d6a8..d84d146b 100644 --- a/wms_pro/qd/src/views/wms/stor_manage/out/storinvout.js +++ b/wms_pro/qd/src/views/wms/stor_manage/out/storinvout.js @@ -77,10 +77,18 @@ export function getVehicleTask(data) { export function cancelMst(id) { return request({ - url: "/api/stIvtIostorinvOut/cancelMst/" + id, + url: '/api/stIvtIostorinvOut/cancelMst/' + id, method: 'get' }) } + +export function confirmMst(id) { + return request({ + url: '/api/stIvtIostorinvOut/confirmMst/' + id, + method: 'get' + }) +} + export default { add, edit, @@ -92,5 +100,6 @@ export default { divDis, cancelMst, taskOpen, - getVehicleTask + getVehicleTask, + confirmMst } diff --git a/wms_pro/qd/src/views/wms/stor_manage/record/index.vue b/wms_pro/qd/src/views/wms/stor_manage/record/index.vue index ebced7da..f7a18c26 100644 --- a/wms_pro/qd/src/views/wms/stor_manage/record/index.vue +++ b/wms_pro/qd/src/views/wms/stor_manage/record/index.vue @@ -18,6 +18,19 @@ placeholder="请输入仓位信息" prefix-icon="el-icon-search" class="filter-item" + @input="handleSearchInput('search')" + /> + + + @@ -29,8 +42,10 @@ placeholder="请输入物料编码" prefix-icon="el-icon-search" class="filter-item" + @input="handleSearchInput('material_code')" /> + @@ -51,8 +67,43 @@ placeholder="请输入批次信息" prefix-icon="el-icon-search" class="filter-item" + @input="handleSearchInput('pcsn')" /> + + + + + + + + + + + + + + 清空条件 + + - @@ -84,6 +138,7 @@ + - + @@ -91,13 +91,24 @@ 作业下发 + 重新处理 + + 处理完成 @@ -114,20 +125,20 @@ - + - + - + - - - + + + - - + + - + - - - + + +