From 2e67662a875a201471f7f3216b4a641c36841a05 Mon Sep 17 00:00:00 2001 From: zhouz <> Date: Sat, 13 Jul 2024 13:23:12 +0800 Subject: [PATCH 1/6] =?UTF-8?q?fix:B1=E6=AF=8D=E5=8D=B7=E4=B8=8A=E6=96=99?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/nl/wms/pda/mps/service/impl/FeedingServiceImpl.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/service/impl/FeedingServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/service/impl/FeedingServiceImpl.java index 9e6b760bc..37df422e4 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/service/impl/FeedingServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/service/impl/FeedingServiceImpl.java @@ -233,7 +233,7 @@ public class FeedingServiceImpl implements FeedingService { JSONObject cool_jo = WQLObject.getWQLObject("st_ivt_coolpointivt").query("full_point_code = '" + point_code + "'").uniqueResult(0); if (ObjectUtil.isEmpty(cool_jo)) { - cool_jo = WQLObject.getWQLObject("st_ivt_coolpointivt").query("point_code = '" + point_code + "'").uniqueResult(0); + cool_jo = WQLObject.getWQLObject("st_ivt_coolpointivt").query("full_point_code = '" + point_code + "'").uniqueResult(0); } if (ObjectUtil.isEmpty(cool_jo)) { @@ -268,7 +268,9 @@ public class FeedingServiceImpl implements FeedingService { } JSONObject cool_jo = WQLObject.getWQLObject("st_ivt_coolpointivt").query("full_point_code = '" + point_code + "'").uniqueResult(0); - + if (ObjectUtil.isEmpty(cool_jo)) { + cool_jo = WQLObject.getWQLObject("st_ivt_coolpointivt").query("full_point_code = '" + point_code + "'").uniqueResult(0); + } if (ObjectUtil.isEmpty(cool_jo)) { throw new BadRequestException("请输入或者扫描冷却区满轴位的点位做为起点!"); } else { From 0ec06b2937166326da0f8e39f4914cf04106cbdb Mon Sep 17 00:00:00 2001 From: gongbaoxiong <751575283@qq.com> Date: Sat, 13 Jul 2024 14:44:59 +0800 Subject: [PATCH 2/6] =?UTF-8?q?fix:=E4=BF=AE=E6=94=B9=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E6=BB=A1=E8=BD=B4=E5=BA=93=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/BstIvtPackageinfoivtServiceImpl.java | 30 ++++++++++--------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/service/impl/BstIvtPackageinfoivtServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/service/impl/BstIvtPackageinfoivtServiceImpl.java index 7dea812bd..e9bbd6af3 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/service/impl/BstIvtPackageinfoivtServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/service/impl/BstIvtPackageinfoivtServiceImpl.java @@ -153,15 +153,16 @@ public class BstIvtPackageinfoivtServiceImpl extends ServiceImpl updateWrapper = new UpdateWrapper<>(); updateWrapper.eq("point_code", pointCode); - updateWrapper.setSql("ivt_status = '0', container_name = null"); - //清空起点库存状态 + updateWrapper.set("ivt_status", "0"); + updateWrapper.set("container_name", null); + // 清空起点库存状态 bstIvtPackageinfoivtMapper.update(null, updateWrapper); if (isUpDateTask) { //标记桁架任务取空载具完成 From 67d1f7a5e4fcc2c51b6c53ba6d3edf97aeac9b75 Mon Sep 17 00:00:00 2001 From: zhouz <> Date: Sat, 13 Jul 2024 23:48:21 +0800 Subject: [PATCH 3/6] =?UTF-8?q?fix:B1=E6=AF=8D=E5=8D=B7=E4=B8=8A=E6=96=99?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mps/service/impl/BakingServiceImpl.java | 24 ++- .../mps/service/impl/FeedingServiceImpl.java | 143 ++++++++++----- .../mps/service/impl/RawFoilServiceImpl.java | 5 + .../wms/pda/mps/wql/PDA_OVENINANDOUT_01.wql | 6 + .../java/org/nl/wms/pda/st/wql/PDA_COOLIN.wql | 2 +- .../src/main/java/org/nl/wms/pdm/wql/pdm.xls | Bin 253952 -> 254464 bytes .../org/nl/wms/sch/tasks/CoolCutTask.java | 168 ++++++++++++------ .../java/org/nl/wms/sch/tasks/InHotTask.java | 92 +++++----- .../java/org/nl/wms/sch/tasks/OutHotTask.java | 19 +- 9 files changed, 302 insertions(+), 157 deletions(-) diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/service/impl/BakingServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/service/impl/BakingServiceImpl.java index cdffdf2d8..6dd3129b7 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/service/impl/BakingServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/service/impl/BakingServiceImpl.java @@ -118,7 +118,7 @@ public class BakingServiceImpl implements BakingService { */ JSONObject jsonPointZc = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0); - JSONObject cool_jo = coolIvtTab.query("full_point_code = '" + point_code1 + "' AND point_type = '3'").uniqueResult(0); + JSONObject cool_jo = coolIvtTab.query("point_code = '" + point_code1 + "' AND point_type = '3'").uniqueResult(0); if (ObjectUtil.isNotEmpty(jsonPointZc) || ObjectUtil.isNotEmpty(cool_jo)) { if (ObjectUtil.isEmpty(jsonPointZc)) { jsonPointZc = cool_jo; @@ -150,7 +150,27 @@ public class BakingServiceImpl implements BakingService { } if (ObjectUtil.isEmpty(jsonHotIvt)) { - throw new BadRequestException("烘烤区没有合适温度的空位!"); + //如果属于B1的烘箱,变更位置再查询 + if (ObjectUtil.isNotEmpty(cool_jo) && cool_jo.getString("product_area").equals("B1")) { + jsonMap.put("point_location", jsonPointZc.getString("point_location").equals("0") ? "1" : "0"); + hot_rows = WQL.getWO("PDA_BAKING_01").addParamMap(jsonMap).process().getResultJSONArray(0); + for (int i = 0; i < hot_rows.size(); i++) { + JSONObject hot_row = hot_rows.getJSONObject(i); + String point_code = hot_row.getString("point_code"); + String point_temperature = (String) redisUtils.hget(point_code, "temperature"); + if (!ObjectUtil.isEmpty(point_temperature)) { + if (point_temperature.equals(temperature)) { + jsonHotIvt = hot_row; + break; + } + } + } + if (ObjectUtil.isEmpty(jsonHotIvt)) { + throw new BadRequestException("烘烤区没有合适温度的空位!"); + } + } else { + throw new BadRequestException("烘烤区没有合适温度的空位!"); + } } // 2.创建暂存位 --> 烘烤区任务 JSONObject param = new JSONObject(); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/service/impl/FeedingServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/service/impl/FeedingServiceImpl.java index 37df422e4..4786aadd4 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/service/impl/FeedingServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/service/impl/FeedingServiceImpl.java @@ -233,7 +233,7 @@ public class FeedingServiceImpl implements FeedingService { JSONObject cool_jo = WQLObject.getWQLObject("st_ivt_coolpointivt").query("full_point_code = '" + point_code + "'").uniqueResult(0); if (ObjectUtil.isEmpty(cool_jo)) { - cool_jo = WQLObject.getWQLObject("st_ivt_coolpointivt").query("full_point_code = '" + point_code + "'").uniqueResult(0); + cool_jo = WQLObject.getWQLObject("st_ivt_coolpointivt").query("point_code = '" + point_code + "'").uniqueResult(0); } if (ObjectUtil.isEmpty(cool_jo)) { @@ -269,7 +269,7 @@ public class FeedingServiceImpl implements FeedingService { JSONObject cool_jo = WQLObject.getWQLObject("st_ivt_coolpointivt").query("full_point_code = '" + point_code + "'").uniqueResult(0); if (ObjectUtil.isEmpty(cool_jo)) { - cool_jo = WQLObject.getWQLObject("st_ivt_coolpointivt").query("full_point_code = '" + point_code + "'").uniqueResult(0); + cool_jo = WQLObject.getWQLObject("st_ivt_coolpointivt").query("point_code = '" + point_code + "'").uniqueResult(0); } if (ObjectUtil.isEmpty(cool_jo)) { throw new BadRequestException("请输入或者扫描冷却区满轴位的点位做为起点!"); @@ -287,54 +287,99 @@ public class FeedingServiceImpl implements FeedingService { } if (cool_jo.getString("product_area").equals("B1")) { - JSONObject cut_jo = WQLObject.getWQLObject("st_ivt_cutpointivt").query("full_point_code = '" + next_point_code + "'").uniqueResult(0); - JSONObject task_jo = new JSONObject(); - task_jo.put("point_code1", cool_jo.getString("point_code")); - String reging_id = ""; - //查询出的对接位 - switch (cool_jo.getString("product_area")) { - case "A1": - reging_id = RegionTypeEnum.A_HKZC.getId(); - break; - case "A2": - reging_id = RegionTypeEnum.B_HKZC.getId(); - break; - case "A3": - reging_id = RegionTypeEnum.C_HKZC.getId(); - break; - case "A4": - reging_id = RegionTypeEnum.D_HKZC.getId(); - break; - case "B1": - reging_id = RegionTypeEnum.B1_HKZC.getId(); - break; - case "B2": - reging_id = RegionTypeEnum.B2_HKZC.getId(); - break; - default: - break; + if (ObjectUtil.isNotEmpty(cool_jo) && cool_jo.getString("point_type").equals("4")) { + JSONObject cut_jo = WQLObject.getWQLObject("st_ivt_cutpointivt").query("full_point_code = '" + next_point_code + "'").uniqueResult(0); + //起点为分切缓存位,终点为分切机 + JSONObject jo = new JSONObject(); + if (StrUtil.equals("01", cut_jo.getString("empty_point_status"))) { + jo.put("point_code1", cool_jo.getString("full_point_code")); + jo.put("point_code2", cut_jo.getString("full_point_code")); + jo.put("material_code", cool_jo.getString("container_name")); + jo.put("product_area", cut_jo.getString("product_area")); + jo.put("task_type", "010302"); + } else { + jo.put("point_code1", cool_jo.getString("full_point_code")); + jo.put("point_code2", cut_jo.getString("full_point_code")); + jo.put("point_code3", cut_jo.getString("empty_point_code")); + // 2.找冷却区空货位 + JSONObject map = new JSONObject(); + map.put("flag", "2"); + map.put("product_area", cut_jo.getString("product_area")); + map.put("point_location", "0"); + + JSONObject jsonCooIvt = WQL.getWO("PDA_OVENINANDOUT_01").addParamMap(map).process().uniqueResult(0); + // 如果为空 + if (ObjectUtil.isEmpty(jsonCooIvt)) { + map.put("point_location", "1"); + jsonCooIvt = WQL.getWO("PDA_OVENINANDOUT_01").addParamMap(map).process().uniqueResult(0); + } + if (ObjectUtil.isEmpty(jsonCooIvt)) { + throw new BadRequestException("冷却区空位不足"); + } + jo.put("point_code4", jsonCooIvt.getString("empty_point_code")); + jo.put("material_code", cool_jo.getString("container_name")); + jo.put("product_area", cut_jo.getString("product_area")); + jo.put("task_type", "010301"); + } + AbstractAcsTask task = new CoolCutTask(); + task.createTask(jo); + } else { + JSONObject cut_jo = WQLObject.getWQLObject("st_ivt_cutpointivt").query("full_point_code = '" + next_point_code + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(cut_jo) && ObjectUtil.isEmpty(cool_jo)) { + throw new BadRequestException("目的点不存在!"); + } + JSONObject task_jo = new JSONObject(); + task_jo.put("point_code1", cool_jo.getString("point_code")); + String reging_id = ""; + //查询出的对接位 + switch (cool_jo.getString("product_area")) { + case "A1": + reging_id = RegionTypeEnum.A_HKZC.getId(); + break; + case "A2": + reging_id = RegionTypeEnum.B_HKZC.getId(); + break; + case "A3": + reging_id = RegionTypeEnum.C_HKZC.getId(); + break; + case "A4": + reging_id = RegionTypeEnum.D_HKZC.getId(); + break; + case "B1": + reging_id = RegionTypeEnum.B1_HKZC.getId(); + break; + case "B2": + reging_id = RegionTypeEnum.B2_HKZC.getId(); + break; + default: + break; + } + JSONObject map = new JSONObject(); + map.put("flag", "1"); + map.put("reging_id", reging_id); + map.put("point_location", cool_jo.getString("point_location")); + //只找出箱点位 + map.put("point_type", "5"); + + JSONObject pointArr = WQL.getWO("PDA_OVENINANDOUT_01").addParamMap(map).process().uniqueResult(0); + if (ObjectUtil.isEmpty(pointArr)) { + map.put("point_location", cool_jo.getString("point_location").equals("0") ? "1" : "0"); + pointArr = WQL.getWO("PDA_OVENINANDOUT_01").addParamMap(map).process().uniqueResult(0); + if (ObjectUtil.isEmpty(pointArr)) { + throw new BadRequestException("没有无货且没有任务的点位类型为出箱的烘箱对接位!"); + } + } + + + task_jo.put("point_code2", pointArr.getString("point_code")); + //将分切机的点位作为目的点,桁架任务完成时,自动创建AGV任务 + task_jo.put("point_code3", next_point_code); + task_jo.put("material_code", cool_jo.getString("container_name")); + task_jo.put("product_area", cool_jo.getString("product_area")); + task_jo.put("task_type", "010205"); + OutHotTask outHotTask = new OutHotTask(); + String task_id = outHotTask.createTask(task_jo); } - JSONObject map = new JSONObject(); - map.put("flag", "1"); - map.put("reging_id", reging_id); - map.put("point_location", cool_jo.getString("point_location")); - //只找出箱点位 - map.put("point_type", "5"); - - JSONObject pointArr = WQL.getWO("PDA_OVENINANDOUT_01").addParamMap(map).process().uniqueResult(0); - if (ObjectUtil.isEmpty(pointArr)) { - throw new BadRequestException("没有无货且没有任务的点位类型为出箱的烘箱对接位!"); - } - - - task_jo.put("point_code2", pointArr.getString("point_code")); - //将分切机的点位作为目的点,桁架任务完成时,自动创建AGV任务 - task_jo.put("point_code3", next_point_code); - task_jo.put("vehicle_code", cool_jo.getString("container_name")); - task_jo.put("product_area", cut_jo.getString("product_area")); - task_jo.put("task_type", "010205"); - OutHotTask outHotTask = new OutHotTask(); - String task_id = outHotTask.createTask(task_jo); } else { JSONObject jo = new JSONObject(); //查询该分切机对应的点位 diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/service/impl/RawFoilServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/service/impl/RawFoilServiceImpl.java index 4a2918c59..f75795b5c 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/service/impl/RawFoilServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/service/impl/RawFoilServiceImpl.java @@ -215,8 +215,13 @@ public class RawFoilServiceImpl implements RawFoilService { cache_map.put("point_location", jsonSb.getString("point_location")); //只找入箱点位 cache_map.put("point_type", "4"); + cache_map.put("mater_flag", "1"); JSONObject point_code2_jo = WQL.getWO("PDA_OVENINANDOUT_01").addParamMap(cache_map).process().uniqueResult(0); + if (ObjectUtil.isEmpty(point_code2_jo)) { + cache_map.put("point_location", jsonSb.getString("point_location").equals("0") ? "1" : "0"); + point_code2_jo = WQL.getWO("PDA_OVENINANDOUT_01").addParamMap(cache_map).process().uniqueResult(0); + } if (ObjectUtil.isEmpty(point_code2_jo)) { throw new BadRequestException("未查询到可用的点位类型为入箱的烘箱对接位!"); } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/wql/PDA_OVENINANDOUT_01.wql b/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/wql/PDA_OVENINANDOUT_01.wql index c28b660d3..d8de3aa8b 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/wql/PDA_OVENINANDOUT_01.wql +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/mps/wql/PDA_OVENINANDOUT_01.wql @@ -82,6 +82,9 @@ OPTION 输入.point_type = "5" IFNULL(po.material_code,'') = '' ENDOPTION + OPTION 输入.mater_flag = "1" + IFNULL(po.material_code,'') = '' + ENDOPTION UNION SELECT task.task_id, @@ -137,6 +140,9 @@ OPTION 输入.point_type = "5" IFNULL(po.material_code,'') = '' ENDOPTION + OPTION 输入.mater_flag = "1" + IFNULL(po.material_code,'') = '' + ENDOPTION ) c GROUP BY c.point_code diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/wql/PDA_COOLIN.wql b/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/wql/PDA_COOLIN.wql index 515398dbb..443ad9d92 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/wql/PDA_COOLIN.wql +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pda/st/wql/PDA_COOLIN.wql @@ -129,7 +129,7 @@ FROM sch_base_task WHERE - ( point_code1 = empty_point_code OR point_code2 = empty_point_code ) + ( point_code1 = empty_point_code OR point_code2 = empty_point_code OR point_code2 = point_code ) AND task_status < '07' AND is_delete = '0' ) diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pdm/wql/pdm.xls b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/wql/pdm.xls index ddfeb1f7a9550af82a542874da0361527cbd90f4..eea2bd21cfafa196c919f7af879e08d3abaf3ad3 100644 GIT binary patch delta 36755 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 ae}n6P@b|y?dmMl1_mQ4(H+&ZA{eJ+7lieEt delta 37778 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 ID<>rWf1aI`h5!Hn diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/CoolCutTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/CoolCutTask.java index a94f18522..e6ab26607 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/CoolCutTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/CoolCutTask.java @@ -114,17 +114,50 @@ public class CoolCutTask extends AbstractAcsTask { if ("B1".equals(product_area)) { //更新起点烘箱对接位 JSONObject dj_jo = WQLObject.getWQLObject("sch_base_point").query("point_code ='" + point_code1 + "'").uniqueResult(0); - dj_jo.put("point_status", "1"); - dj_jo.put("material_code", ""); - WQLObject.getWQLObject("sch_base_point").update(dj_jo); + JSONObject cool_jo = WQLObject.getWQLObject("st_ivt_coolpointivt").query("full_point_code ='" + point_code1 + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(dj_jo)) { + dj_jo.put("point_status", "1"); + dj_jo.put("material_code", ""); + WQLObject.getWQLObject("sch_base_point").update(dj_jo); + } + if (ObjectUtil.isNotEmpty(cool_jo)) { + cool_jo.put("full_point_status", "01"); + cool_jo.put("container_name", ""); + cool_jo.put("workorder_id", ""); + cool_jo.put("update_optid", currentUserId); + cool_jo.put("update_optname", currentUsername); + cool_jo.put("update_time", DateUtil.now()); + WQLObject.getWQLObject("st_ivt_coolpointivt").update(cool_jo); + } + JSONObject full_jo = WQLObject.getWQLObject("st_ivt_coolpointivt").query("full_point_code ='" + point_code2 + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(full_jo)) { + full_jo.put("full_point_status", "02"); + full_jo.put("container_name", jsonTask.getString("material_code")); + full_jo.put("update_optid", currentUserId); + full_jo.put("update_optname", currentUsername); + full_jo.put("update_time", DateUtil.now()); + WQLObject.getWQLObject("st_ivt_coolpointivt").update(full_jo); + } + //更新满轴终点的空轴对接位 JSONObject cut_jo = WQLObject.getWQLObject("ST_IVT_CutPointIvt").query("empty_point_code = '" + point_code3 + "'").uniqueResult(0); - cut_jo.put("empty_point_status", "02"); - cut_jo.put("empty_vehicle_code", "SJG"); - cut_jo.put("update_optid", currentUserId); - cut_jo.put("update_optname", currentUsername); - cut_jo.put("update_time", DateUtil.now()); - WQLObject.getWQLObject("ST_IVT_CutPointIvt").update(cut_jo); + if (ObjectUtil.isEmpty(cut_jo)) { + cut_jo = WQLObject.getWQLObject("st_ivt_coolpointivt").query("empty_point_code = '" + point_code3 + "'").uniqueResult(0); + cut_jo.put("empty_point_status", "01"); + cut_jo.put("empty_vehicle_code", ""); + cut_jo.put("update_optid", currentUserId); + cut_jo.put("update_optname", currentUsername); + cut_jo.put("update_time", DateUtil.now()); + WQLObject.getWQLObject("st_ivt_coolpointivt").update(cut_jo); + } else { + cut_jo.put("empty_point_status", "02"); + cut_jo.put("empty_vehicle_code", "SJG"); + cut_jo.put("update_optid", currentUserId); + cut_jo.put("update_optname", currentUsername); + cut_jo.put("update_time", DateUtil.now()); + WQLObject.getWQLObject("ST_IVT_CutPointIvt").update(cut_jo); + } + //更新空轴点位 JSONObject jsonCoolIvt2 = WQLObject.getWQLObject("st_ivt_coolpointivt").query("empty_point_code = '" + point_code4 + "'").uniqueResult(0); jsonCoolIvt2.put("empty_point_status", "02"); @@ -207,63 +240,83 @@ public class CoolCutTask extends AbstractAcsTask { if ("B1".equals(product_area)) { //更新起点烘箱对接位 JSONObject dj_jo = WQLObject.getWQLObject("sch_base_point").query("point_code ='" + point_code1 + "'").uniqueResult(0); - dj_jo.put("point_status", "1"); - dj_jo.put("material_code", ""); - WQLObject.getWQLObject("sch_base_point").update(dj_jo); + JSONObject cool_jo = WQLObject.getWQLObject("st_ivt_coolpointivt").query("full_point_code ='" + point_code1 + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(dj_jo)) { + dj_jo.put("point_status", "1"); + dj_jo.put("material_code", ""); + WQLObject.getWQLObject("sch_base_point").update(dj_jo); + } + if (ObjectUtil.isNotEmpty(cool_jo)) { + cool_jo.put("full_point_status", "01"); + cool_jo.put("container_name", ""); + cool_jo.put("workorder_id", ""); + cool_jo.put("update_optid", currentUserId); + cool_jo.put("update_optname", currentUsername); + cool_jo.put("update_time", DateUtil.now()); + WQLObject.getWQLObject("st_ivt_coolpointivt").update(cool_jo); + } //更新满轴终点的空轴对接位 JSONObject cut_jo = WQLObject.getWQLObject("ST_IVT_CutPointIvt").query("full_point_code = '" + point_code2 + "'").uniqueResult(0); - cut_jo.put("empty_point_status", "02"); - cut_jo.put("empty_vehicle_code", "SJG"); + if (ObjectUtil.isEmpty(cut_jo)) { + cut_jo = WQLObject.getWQLObject("st_ivt_coolpointivt").query("full_point_code = '" + point_code2 + "'").uniqueResult(0); + cut_jo.put("full_point_status", "02"); + cut_jo.put("container_name", jsonTask.getString("material_code")); + WQLObject.getWQLObject("st_ivt_coolpointivt").update(cut_jo); + } else { + cut_jo.put("empty_point_status", "02"); + cut_jo.put("empty_vehicle_code", "SJG"); + cut_jo.put("update_optid", currentUserId); + cut_jo.put("update_optname", currentUsername); + cut_jo.put("update_time", DateUtil.now()); + WQLObject.getWQLObject("ST_IVT_CutPointIvt").update(cut_jo); + } + + } else { + // 更新主表状态 + JSONObject coolMst = ivtTab.query("task_id = '" + task_id + "'").uniqueResult(0); + coolMst.put("bill_status", "50"); + ivtTab.update(coolMst); + + //更新冷却区母卷库存 + JSONObject jsonCoolIvt = WQLObject.getWQLObject("st_ivt_coolpointivt").query("full_point_code = '" + point_code1 + "'").uniqueResult(0); + String container_name = jsonCoolIvt.getString("container_name"); // 母卷号 + + jsonCoolIvt.put("full_point_status", "01"); + jsonCoolIvt.put("container_name", ""); + jsonCoolIvt.put("workorder_id", ""); + jsonCoolIvt.put("ivt_qty", "0"); + jsonCoolIvt.put("cool_ivt_status", "01"); + jsonCoolIvt.put("instorage_time", ""); + jsonCoolIvt.put("update_optid", currentUserId); + jsonCoolIvt.put("update_optname", currentUsername); + jsonCoolIvt.put("update_time", DateUtil.now()); + WQLObject.getWQLObject("st_ivt_coolpointivt").update(jsonCoolIvt); + + //更新分切区母卷库存 + JSONObject cut_jo = WQLObject.getWQLObject("ST_IVT_CutPointIvt").query("full_point_code = '" + point_code2 + "'").uniqueResult(0); + cut_jo.put("full_point_status", "02"); + cut_jo.put("container_name", container_name); cut_jo.put("update_optid", currentUserId); cut_jo.put("update_optname", currentUsername); cut_jo.put("update_time", DateUtil.now()); WQLObject.getWQLObject("ST_IVT_CutPointIvt").update(cut_jo); - } else { + //更新该母卷对应分切计划的状态 + HashMap map = new HashMap<>(); + map.put("is_parent_ok", "1"); + WQLObject.getWQLObject("PDM_BI_SlittingProductionPlan").update(map, "parent_container_name = '" + container_name + "'"); + + //回传MES + JSONObject mom_jo = new JSONObject(); + mom_jo.put("contain_name", container_name); + mom_jo.put("warehouse", "1"); + //判断该接口是否需要回传 + JSONObject back_jo = WQLObject.getWQLObject("MD_PB_InterfaceBack").query("interface_name = 'cutPlanMomRollDeliveryComplete'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(back_jo) && "1".equals(back_jo.getString("is_back"))) { + new LmsToMesServiceImpl().cutPlanMomRollDeliveryComplete(mom_jo); + } } - // 更新主表状态 - JSONObject coolMst = ivtTab.query("task_id = '" + task_id + "'").uniqueResult(0); - coolMst.put("bill_status", "50"); - ivtTab.update(coolMst); - //更新冷却区母卷库存 - JSONObject jsonCoolIvt = WQLObject.getWQLObject("st_ivt_coolpointivt").query("full_point_code = '" + point_code1 + "'").uniqueResult(0); - String container_name = jsonCoolIvt.getString("container_name"); // 母卷号 - - jsonCoolIvt.put("full_point_status", "01"); - jsonCoolIvt.put("container_name", ""); - jsonCoolIvt.put("workorder_id", ""); - jsonCoolIvt.put("ivt_qty", "0"); - jsonCoolIvt.put("cool_ivt_status", "01"); - jsonCoolIvt.put("instorage_time", ""); - jsonCoolIvt.put("update_optid", currentUserId); - jsonCoolIvt.put("update_optname", currentUsername); - jsonCoolIvt.put("update_time", DateUtil.now()); - WQLObject.getWQLObject("st_ivt_coolpointivt").update(jsonCoolIvt); - - //更新分切区母卷库存 - JSONObject cut_jo = WQLObject.getWQLObject("ST_IVT_CutPointIvt").query("full_point_code = '" + point_code2 + "'").uniqueResult(0); - cut_jo.put("full_point_status", "02"); - cut_jo.put("container_name", container_name); - cut_jo.put("update_optid", currentUserId); - cut_jo.put("update_optname", currentUsername); - cut_jo.put("update_time", DateUtil.now()); - WQLObject.getWQLObject("ST_IVT_CutPointIvt").update(cut_jo); - - //更新该母卷对应分切计划的状态 - HashMap map = new HashMap<>(); - map.put("is_parent_ok", "1"); - WQLObject.getWQLObject("PDM_BI_SlittingProductionPlan").update(map, "parent_container_name = '" + container_name + "'"); - - //回传MES - JSONObject mom_jo = new JSONObject(); - mom_jo.put("contain_name", container_name); - mom_jo.put("warehouse", "1"); - //判断该接口是否需要回传 - JSONObject back_jo = WQLObject.getWQLObject("MD_PB_InterfaceBack").query("interface_name = 'cutPlanMomRollDeliveryComplete'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(back_jo) && "1".equals(back_jo.getString("is_back"))) { - new LmsToMesServiceImpl().cutPlanMomRollDeliveryComplete(mom_jo); - } } if ("010303".equals(jsonTask.getString("task_type"))) { @@ -379,6 +432,7 @@ public class CoolCutTask extends AbstractAcsTask { json.put("vehicle_code", form.getString("vehicle_code")); json.put("vehicle_code2", form.getString("vehicle_code2")); json.put("product_area", form.getString("product_area")); + json.put("material_code", form.getString("material_code")); json.put("handle_class", THIS_CLASS); json.put("create_id", currentUserId); json.put("create_name", currentUsername); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/InHotTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/InHotTask.java index ee1cd48d0..3a37961da 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/InHotTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/InHotTask.java @@ -117,56 +117,56 @@ public class InHotTask extends AbstractAcsTask { String hot_point_code = ""; // 判断此任务是否有三个点位 - if (ObjectUtil.isEmpty(jsonTask.getString("point_code3"))) { + if (ObjectUtil.isEmpty(jsonTask.getString("point_code3"))) { - if (jsonTask.getString("task_type").equals("010204")) { - //更新冷却区库存 - JSONObject cool_jo = coolIvtTab.query("point_code = '" + jsonTask.getString("point_code2") + "'").uniqueResult(0); - cool_jo.put("full_point_status", "02"); - cool_jo.put("cool_ict_status", "01"); - cool_jo.put("container_name", jsonTask.getString("material_code")); - coolIvtTab.update(cool_jo); - //更新对接位库存 - JSONObject dj_jo = pointTab.query("point_code = '" + jsonTask.getString("point_code1") + "'").uniqueResult(0); - dj_jo.put("point_status", "1"); - dj_jo.put("material_code", ""); - pointTab.update(dj_jo); - return; - } else { - /* - * 暂存区入烘箱任务 - */ - // 更新烘箱区库存状态 - JSONObject jsonHotIvt = hotIvtTab.query("point_code = '" + jsonTask.getString("point_code2") + "'").uniqueResult(0); - jsonHotIvt.put("point_status", "02"); - jsonHotIvt.put("container_name", jsonHotMst.getString("container_name")); - jsonHotIvt.put("workorder_id", jsonHotMst.getString("workorder_id")); - jsonHotIvt.put("ivt_qty", jsonHotMst.getString("qty")); - jsonHotIvt.put("instorage_time", DateUtil.now()); - jsonHotIvt.put("update_optid", currentUserId); - jsonHotIvt.put("update_optname", currentUsername); - jsonHotIvt.put("update_time", DateUtil.now()); - hotIvtTab.update(jsonHotIvt); - - String product_area = jsonHotIvt.getString("product_area"); - if (product_area.equals("B1")) { - JSONObject jsonPoint = coolIvtTab.query("point_code = '" + jsonTask.getString("point_code1") + "'").uniqueResult(0); - jsonPoint.put("container_name", ""); - jsonPoint.put("full_point_status", "01"); - coolIvtTab.update(jsonPoint); + if (jsonTask.getString("task_type").equals("010204")) { + //更新冷却区库存 + JSONObject cool_jo = coolIvtTab.query("point_code = '" + jsonTask.getString("point_code2") + "'").uniqueResult(0); + cool_jo.put("full_point_status", "02"); + cool_jo.put("cool_ict_status", "01"); + cool_jo.put("container_name", jsonTask.getString("material_code")); + coolIvtTab.update(cool_jo); + //更新对接位库存 + JSONObject dj_jo = pointTab.query("point_code = '" + jsonTask.getString("point_code1") + "'").uniqueResult(0); + dj_jo.put("point_status", "1"); + dj_jo.put("material_code", ""); + pointTab.update(dj_jo); + return; } else { - // 更新暂存区点位状态为空位 - JSONObject jsonPoint = pointTab.query("point_code = '" + jsonTask.getString("point_code1") + "'").uniqueResult(0); - jsonPoint.put("point_status", "1"); - jsonPoint.put("material_code", ""); - pointTab.update(jsonPoint); + /* + * 暂存区入烘箱任务 + */ + // 更新烘箱区库存状态 + JSONObject jsonHotIvt = hotIvtTab.query("point_code = '" + jsonTask.getString("point_code2") + "'").uniqueResult(0); + jsonHotIvt.put("point_status", "02"); + jsonHotIvt.put("container_name", jsonHotMst.getString("container_name")); + jsonHotIvt.put("workorder_id", jsonHotMst.getString("workorder_id")); + jsonHotIvt.put("ivt_qty", jsonHotMst.getString("qty")); + jsonHotIvt.put("instorage_time", DateUtil.now()); + jsonHotIvt.put("update_optid", currentUserId); + jsonHotIvt.put("update_optname", currentUsername); + jsonHotIvt.put("update_time", DateUtil.now()); + hotIvtTab.update(jsonHotIvt); + + String product_area = jsonHotIvt.getString("product_area"); + if (product_area.equals("B1")) { + JSONObject jsonPoint = coolIvtTab.query("point_code = '" + jsonTask.getString("point_code1") + "'").uniqueResult(0); + jsonPoint.put("container_name", ""); + jsonPoint.put("full_point_status", "01"); + coolIvtTab.update(jsonPoint); + } else { + // 更新暂存区点位状态为空位 + JSONObject jsonPoint = pointTab.query("point_code = '" + jsonTask.getString("point_code1") + "'").uniqueResult(0); + jsonPoint.put("point_status", "1"); + jsonPoint.put("material_code", ""); + pointTab.update(jsonPoint); + } + + + hot_point_code = jsonHotIvt.getString("ext_code"); } - - hot_point_code = jsonHotIvt.getString("ext_code"); - } - - } else { + } else { /* * 冷却区入烘箱任务 */ diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/OutHotTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/OutHotTask.java index 9f367a1c5..61e349873 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/OutHotTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/OutHotTask.java @@ -103,12 +103,27 @@ public class OutHotTask extends AbstractAcsTask { if (jsonTask.getString("task_type").equals("010205")) { JSONObject cut_jo = WQLObject.getWQLObject("st_ivt_cutpointivt").query("full_point_code = '" + jsonTask.getString("point_code3") + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(cut_jo)) { + cut_jo = WQLObject.getWQLObject("st_ivt_coolpointivt").query("full_point_code = '" + jsonTask.getString("point_code3") + "'").uniqueResult(0); + } + //清空起点库存 + JSONObject cool_jo = WQLObject.getWQLObject("st_ivt_coolpointivt").query("point_code = '" + jsonTask.getString("point_code1") + "'").uniqueResult(0); + cool_jo.put("container_name", ""); + cool_jo.put("full_point_status", "01"); + WQLObject.getWQLObject("st_ivt_coolpointivt").update(cool_jo); + + //更新终点库存 + JSONObject jsonPoint2 = pointTab.query("point_code = '" + jsonTask.getString("point_code2") + "'").uniqueResult(0); + jsonPoint2.put("point_status", "2"); + jsonPoint2.put("material_code", jsonTask.getString("material_code")); + pointTab.update(jsonPoint2); + //创建AGV任务 JSONObject jo = new JSONObject(); if (StrUtil.equals("01", cut_jo.getString("empty_point_status"))) { jo.put("point_code1", jsonTask.getString("point_code2")); jo.put("point_code2", cut_jo.getString("full_point_code")); - jo.put("vehicle_code", jsonTask.getString("material_code")); + jo.put("material_code", jsonTask.getString("material_code")); jo.put("product_area", cut_jo.getString("product_area")); jo.put("task_type", "010302"); } else { @@ -131,7 +146,7 @@ public class OutHotTask extends AbstractAcsTask { throw new BadRequestException("冷却区空位不足"); } jo.put("point_code4", jsonCooIvt.getString("empty_point_code")); - jo.put("vehicle_code", jsonTask.getString("container_name")); + jo.put("material_code", jsonTask.getString("material_code")); jo.put("product_area", cut_jo.getString("product_area")); jo.put("task_type", "010301"); } From dd39ac725af1adec40de82b56d2b2d64895d1fbf Mon Sep 17 00:00:00 2001 From: gongbaoxiong <751575283@qq.com> Date: Sat, 13 Jul 2024 23:57:07 +0800 Subject: [PATCH 4/6] =?UTF-8?q?opt:=E4=BC=98=E5=8C=96=E8=A3=85=E7=AE=B1?= =?UTF-8?q?=E5=8C=BA=E2=80=94=E2=80=94>=E5=BE=85=E6=A3=80=E5=8C=BA?= =?UTF-8?q?=E9=80=81=E7=A9=BA=E8=BD=BD=E5=85=B7=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/IbstIvtPackageinfoivtService.java | 12 +- .../impl/BstIvtPackageinfoivtServiceImpl.java | 208 +++++++++++------- .../auto/AutoSendVehicleToDjq.java | 67 ++++-- .../auto/AutoSendVehicleToKzj.java | 8 +- .../wms/pdm/ivt/packageinfoivt/index.vue | 1 - .../src/views/wms/sch/task/index.vue | 1 + 6 files changed, 189 insertions(+), 108 deletions(-) diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/service/IbstIvtPackageinfoivtService.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/service/IbstIvtPackageinfoivtService.java index 0ccba5603..376cbc309 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/service/IbstIvtPackageinfoivtService.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/service/IbstIvtPackageinfoivtService.java @@ -1,15 +1,11 @@ package org.nl.b_lms.sch.point.service; - import com.alibaba.fastjson.JSONObject; import org.nl.b_lms.sch.point.dao.BstIvtPackageinfoivt; import com.baomidou.mybatisplus.extension.service.IService; - import java.util.List; import java.util.Map; import java.util.Set; - import com.baomidou.mybatisplus.core.metadata.IPage; -import org.nl.b_lms.sch.task.dao.SchBaseTask; import org.nl.common.domain.query.PageQuery; @@ -61,7 +57,13 @@ public interface IbstIvtPackageinfoivtService extends IService getBstIvtPackageinfoivts(String ivtType, String ivtStatus, String sortType); /** diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/service/impl/BstIvtPackageinfoivtServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/service/impl/BstIvtPackageinfoivtServiceImpl.java index e9bbd6af3..05eceb819 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/service/impl/BstIvtPackageinfoivtServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/service/impl/BstIvtPackageinfoivtServiceImpl.java @@ -132,7 +132,7 @@ public class BstIvtPackageinfoivtServiceImpl extends ServiceImpl() .eq(SchBaseTask::getTask_code, taskCode) @@ -158,19 +160,17 @@ public class BstIvtPackageinfoivtServiceImpl extends ServiceImpl空载具缓存位)")) || baseTask.getTask_type().equals(PackageInfoIvtEnum.TASK_TYPE.code("补空(待检区->空载具缓存位)")) ) { - //检查是否满足二次分配条件 - checkTaskInfo(baseTask); newPoint = checkIvtSBlock(baseTask); } else { if (baseTask.getTask_type().equals(PackageInfoIvtEnum.TASK_TYPE.code("满轴缓存位->待检区"))) { @@ -179,22 +179,28 @@ public class BstIvtPackageinfoivtServiceImpl extends ServiceImpl checkEndPointTask(String ivtType, String ivtStatus, String pointCode, String sortType, String taskType) { + List taskList; + Set pointSets; List returList = new ArrayList<>(); List packageinfoivtList = getBstIvtPackageinfoivts(ivtType, ivtStatus, sortType); Set pointIds = packageinfoivtList.stream() @@ -224,8 +232,6 @@ public class BstIvtPackageinfoivtServiceImpl extends ServiceImpl taskList; - Set pointSets; if (pointCode.equals(PackageInfoIvtEnum.TASK_POINT_TYPE.code("取货任务")) || pointCode.equals(PackageInfoIvtEnum.TASK_POINT_TYPE.code("放货任务"))) { taskList = bstIvtPackageinfoivtMapper.getTaskList(pointIds, pointIds, null, null); } else if (pointCode.equals(PackageInfoIvtEnum.TASK_POINT_TYPE.code("取货分配"))) { @@ -233,7 +239,9 @@ public class BstIvtPackageinfoivtServiceImpl extends ServiceImpl(); } else if (pointCode.equals(PackageInfoIvtEnum.TASK_POINT_TYPE.code("四个点任务放货"))) { taskList = bstIvtPackageinfoivtMapper.getTaskList(pointIds, null, pointIds, null); } else if (pointCode.equals(PackageInfoIvtEnum.TASK_POINT_TYPE.code("空载具放货"))) { @@ -331,7 +339,10 @@ public class BstIvtPackageinfoivtServiceImpl extends ServiceImpl getNoBlockIvt(String pointCode, List taskList, List ivtList) { - Set taskPointSet = taskList.stream().map(SchBaseTask::getPoint_code2).filter(pointCode2 -> !pointCode2.equals("ZXQ_01_1")).collect(Collectors.toSet()); + Set taskPointSet = null; + if (CollectionUtils.isEmpty(taskList)) { + taskPointSet = taskList.stream().map(SchBaseTask::getPoint_code2).filter(pointCode2 -> !pointCode2.equals("ZXQ_01_1")).collect(Collectors.toSet()); + } List pointList = new ArrayList<>(); //存在补空载具任务已分配却未完成的任务 if (CollectionUtils.isEmpty(taskPointSet)) { @@ -353,47 +364,73 @@ public class BstIvtPackageinfoivtServiceImpl extends ServiceImpl taskList1 = taskService.list(new LambdaQueryWrapper() - .lt(SchBaseTask::getTask_status, TaskStatusEnum.FINISHED.getCode()) - .eq(SchBaseTask::getIs_delete, IOSEnum.IS_NOTANDYES.code("否")) - .and( - r -> r.eq(SchBaseTask::getTask_type, PackageInfoIvtEnum.TASK_TYPE.code("补空(管制区->空载具缓存位)")) - .or() - .eq(SchBaseTask::getTask_type, PackageInfoIvtEnum.TASK_TYPE.code("补空(待检区->空载具缓存位)") - ))); - if (CollectionUtils.isNotEmpty(taskList1)) { - List taskList3 = taskList1.stream().filter(r -> StringUtils.isNotBlank(r.getResponse_param())).collect(Collectors.toList()); - if (taskList3.size() == 1) { - //校验已分配的补空载具任务是否为当前请求的任务,是可重新分配,否不允许重新分配 - if (!taskList3.get(0).getTask_code().equals(baseTask.getTask_code())) { - log.info("一楼装箱区二次分配" + taskList3.get(0).getTask_code() + ",分配失败,存在多个或上一个已分配的补空载具任务未完成,请检查!"); - throw new BadRequestException("一楼装箱区二次分配" + taskList3.get(0).getTask_code() + ",分配失败,存在多个或上一个已分配的补空载具任务未完成,请检查!"); + //补空载具放货任务 + if (baseTask.getTask_type().equals(PackageInfoIvtEnum.TASK_TYPE.code("补空(管制区->空载具缓存位)")) || + baseTask.getTask_type().equals(PackageInfoIvtEnum.TASK_TYPE.code("补空(待检区->空载具缓存位)")) + ) { + List taskList = taskService.list(new LambdaQueryWrapper() + .lt(SchBaseTask::getTask_status, TaskStatusEnum.FINISHED.getCode()) + .eq(SchBaseTask::getIs_delete, IOSEnum.IS_NOTANDYES.code("否")) + .and( + r -> r.eq(SchBaseTask::getTask_type, PackageInfoIvtEnum.TASK_TYPE.code("补空(管制区->空载具缓存位)")) + .or() + .eq(SchBaseTask::getTask_type, PackageInfoIvtEnum.TASK_TYPE.code("补空(待检区->空载具缓存位)")) + .or() + .eq(SchBaseTask::getTask_type, PackageInfoIvtEnum.TASK_TYPE.code("输送线四个点任务")) + .or() + .eq(SchBaseTask::getTask_type, PackageInfoIvtEnum.TASK_TYPE.code("放空(空载具缓存位->输送线)")) + )); + //是否有执行中已分配补空载具任务 + List taskList1 = taskList.stream().filter(r -> r.getTask_type().equals(PackageInfoIvtEnum.TASK_TYPE.code("补空(管制区->空载具缓存位)")) || r.getTask_type().equals(PackageInfoIvtEnum.TASK_TYPE.code("补空(待检区->空载具缓存位)"))).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(taskList1)) { + List taskList2 = taskList1.stream().filter(r -> StringUtils.isNotBlank(r.getResponse_param())).collect(Collectors.toList()); + if (taskList2.size() == 1) { + //校验已分配的补空载具任务是否为当前请求的任务,是可重新分配,否不允许重新分配 + if (!taskList2.get(0).getTask_code().equals(baseTask.getTask_code())) { + log.info("一楼装箱区放货分配" + baseTask.getTask_code() + ",分配失败,存在已分配的补空载具任务编号为:" + taskList2.get(0).getTask_code() + "的任务未完成,请检查!"); + throw new BadRequestException("一楼装箱区放货分配" + baseTask.getTask_code() + ",分配失败,存在已分配的补空载具任务编号为:" + taskList2.get(0).getTask_code() + "的任务未完成,请检查!"); + } + } else if (taskList2.size() > 1) { + log.info("一楼装箱区放货分配" + baseTask.getTask_code() + ",分配失败,存在已分配的补空载具任务编号为:" + taskList2.get(0).getTask_code() + "的任务未完成,请检查!"); + throw new BadRequestException("一楼装箱区放货分配" + baseTask.getTask_code() + ",分配失败,存在已分配的补空载具任务编号为:" + taskList2.get(0).getTask_code() + "的任务未完成,请检查!"); } - } else if (taskList3.size() > 1) { - log.info("一楼装箱区二次分配" + taskList3.get(0).getTask_code() + ",分配失败,存在多个或上一个已分配的补空载具任务未完成,请检查!"); - throw new BadRequestException("一楼装箱区二次分配:" + taskList3.get(0).getTask_code() + ",分配失败,存在多个或上一个已分配的补空载具任务未完成,请检查!"); } - } - //是否有执行中的行架任务,有等待取空载具任务完成再分配 - List taskList2 = taskService.list(new LambdaQueryWrapper() - .lt(SchBaseTask::getTask_status, TaskStatusEnum.FINISHED.getCode()) - .eq(SchBaseTask::getIs_delete, IOSEnum.IS_NOTANDYES.code("否")) - .and( - r -> r.eq(SchBaseTask::getTask_type, PackageInfoIvtEnum.TASK_TYPE.code("输送线四个点任务")) - .or() - .eq(SchBaseTask::getTask_type, PackageInfoIvtEnum.TASK_TYPE.code("放空(空载具缓存位->输送线)") - ))); - if (CollectionUtils.isNotEmpty(taskList2)) { - if (StringUtils.isBlank(taskList2.get(0).getRequest_param())) { - log.info("一楼装箱区二次分配" + taskList2.get(0).getTask_code() + ",分配失败,请等待桁架任务取空载具动作执行完成"); - throw new BadRequestException("一楼装箱区二次分配" + taskList2.get(0).getTask_code() + ",分配失败,请等待桁架任务取空载具动作执行完成"); - } else { - if (!taskList2.get(0).getRequest_param().equals(PackageInfoIvtEnum.TASK_ACTION_TYPE.code("取货完成"))) { - log.info("一楼装箱区二次分配" + taskList2.get(0).getTask_code() + ",分配失败,请等待桁架任务取空载具动作执行完成"); - throw new BadRequestException("一楼装箱区二次分配" + taskList2.get(0).getTask_code() + ",分配失败,请等待桁架任务取空载具动作执行完成"); + //是否有执行中的行架任务,有等待取空载具任务完成再分配 + List taskList3 = taskList.stream().filter(r -> r.getTask_type().equals(PackageInfoIvtEnum.TASK_TYPE.code("输送线四个点任务")) || r.getTask_type().equals(PackageInfoIvtEnum.TASK_TYPE.code("放空(空载具缓存位->输送线)"))).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(taskList3)) { + if (StringUtils.isBlank(taskList3.get(0).getRequest_param())) { + log.info("一楼装箱区放货分配" + baseTask.getTask_code() + ",分配失败,请等待桁架任务编号为:" + taskList3.get(0).getTask_code() + "的任务未完成,请检查!"); + throw new BadRequestException("一楼装箱区放货分配" + baseTask.getTask_code() + ",分配失败,请等待桁架任务编号为:" + taskList3.get(0).getTask_code() + "的任务未完成,请检查!"); + } else { + if (!taskList3.get(0).getRequest_param().equals(PackageInfoIvtEnum.TASK_ACTION_TYPE.code("取货完成"))) { + log.info("一楼装箱区放货分配" + baseTask.getTask_code() + ",分配失败,请等待桁架任务编号为:" + taskList3.get(0).getTask_code() + "的任务未完成,请检查!"); + throw new BadRequestException("一楼装箱区放货分配" + baseTask.getTask_code() + ",分配失败,请等待桁架任务编号为:" + taskList3.get(0).getTask_code() + "的任务未完成,请检查!"); + } + } + } + } else if (baseTask.getTask_type().equals(PackageInfoIvtEnum.TASK_TYPE.code("满轴缓存位->待检区"))) { + List taskList = taskService.list(new LambdaQueryWrapper() + .lt(SchBaseTask::getTask_status, TaskStatusEnum.FINISHED.getCode()) + .eq(SchBaseTask::getIs_delete, IOSEnum.IS_NOTANDYES.code("否")) + .eq(SchBaseTask::getTask_type, PackageInfoIvtEnum.TASK_TYPE.code("满轴缓存位->待检区"))); + //满轴缓存位->待检区agv任务如果分配了起点,是否发送取货完成信息,否,则需等待此任务发送取货完成信号才能分配第2个任务的起点 + List taskList1 = taskList.stream().filter(r -> StringUtils.isNotBlank(r.getResponse_param())).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(taskList1)) { + //多个已分配的未完成的取满轴任务,需要全部取货完成才能继续分配 + List taskList2 = taskList1.stream().filter(r -> StringUtils.isBlank(r.getRequest_param())).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(taskList2)) { + log.info("一楼装箱区取货分配" + baseTask.getTask_code() + ",分配失败,存在已分配的取满轴任务编号为:" + taskList2.get(0).getTask_code() + "的任务未完成,请检查!"); + throw new BadRequestException("一楼装箱区取货分配" + baseTask.getTask_code() + ",分配失败,存在已分配的取满轴任务编号为:" + taskList2.get(0).getTask_code() + "的任务未完成,请检查!"); + } + List taskList3 = taskList1.stream().filter(r -> StringUtils.isNotBlank(r.getRequest_param())).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(taskList3)) { + if (taskList3.stream().anyMatch(r -> !r.getRequest_param().equals(PackageInfoIvtEnum.TASK_ACTION_TYPE.code("取货完成")))) { + log.info("一楼装箱区取货分配" + baseTask.getTask_code() + ",分配失败,存在已分配的取满轴任务编号为:" + taskList3.get(0).getTask_code() + "的任务未完成,请检查!"); + throw new BadRequestException("一楼装箱区取货分配" + baseTask.getTask_code() + ",分配失败,存在已分配的取满轴任务编号为:" + taskList3.get(0).getTask_code() + "的任务未完成,请检查!"); + } } } } @@ -402,8 +439,12 @@ public class BstIvtPackageinfoivtServiceImpl extends ServiceImpl getBstIvtPackageinfoivts(String ivtType, String ivtStatus, String sortType) { + public List getBstIvtPackageinfoivts(String ivtType, String ivtStatus, String sortType) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() .eq(BstIvtPackageinfoivt::getIs_used, PackageInfoIvtEnum.IS_USED.code("启用")) .eq(BstIvtPackageinfoivt::getPoint_status, ivtType); @@ -468,23 +509,27 @@ public class BstIvtPackageinfoivtServiceImpl extends ServiceImpl待检区"))) { + //过滤未二次分配的任务 + if (StringUtils.isBlank(baseTask.getResponse_param())) { + throw new BadRequestException("该任务任务号为:" + baseTask.getTask_code() + ",起点未进行二次分配!"); + } List ivtList = packageinfoivtService.list(new LambdaQueryWrapper() .eq(BstIvtPackageinfoivt::getIs_used, PackageInfoIvtEnum.IS_USED.code("启用")) .eq(BstIvtPackageinfoivt::getPoint_code, baseTask.getPoint_code1())); if (CollectionUtils.isEmpty(ivtList)) { - throw new BadRequestException("任务编号为:" + baseTask.getTask_code() + "取货完成的目标点位不存在!"); + throw new BadRequestException("任务编号为:" + baseTask.getTask_code() + "agv取货完成的目标点位不存在!"); } //只有子卷号相同才能清除库存 if (baseTask.getVehicle_code().equals(ivtList.get(0).getContainer_name())) { - upDateIvtOrTask(baseTask, baseTask.getPoint_code1(), false); + upDateIvtOrTask(baseTask, baseTask.getPoint_code1()); } } else if (baseTask.getTask_type().equals(PackageInfoIvtEnum.TASK_TYPE.code("输送线四个点任务")) || baseTask.getTask_type().equals(PackageInfoIvtEnum.TASK_TYPE.code("放空(空载具缓存位->输送线)"))) { pointCode = baseTask.getTask_type().equals(PackageInfoIvtEnum.TASK_TYPE.code("输送线四个点任务")) ? baseTask.getPoint_code3() : baseTask.getPoint_code1(); if (StringUtils.isBlank(baseTask.getRequest_param())) { - upDateIvtOrTask(baseTask, pointCode, true); + upDateIvtOrTask(baseTask, pointCode); } else if (StringUtils.isNotBlank(baseTask.getRequest_param())) { if (!baseTask.getRequest_param().equals(PackageInfoIvtEnum.TASK_ACTION_TYPE.code("取货完成"))) { - upDateIvtOrTask(baseTask, pointCode, true); + upDateIvtOrTask(baseTask, pointCode); } } } @@ -503,7 +548,7 @@ public class BstIvtPackageinfoivtServiceImpl extends ServiceImpl updateWrapper = new UpdateWrapper<>(); updateWrapper.eq("point_code", pointCode); updateWrapper.set("ivt_status", "0"); updateWrapper.set("container_name", null); - // 清空起点库存状态 + //清空起点库存状态 bstIvtPackageinfoivtMapper.update(null, updateWrapper); - if (isUpDateTask) { - //标记桁架任务取空载具完成 - UpdateWrapper updateWrapper1 = new UpdateWrapper<>(); - updateWrapper1.eq("task_id", baseTask.getTask_id()); - updateWrapper1.set("request_param", PackageInfoIvtEnum.TASK_ACTION_TYPE.code("取货完成")); - taskService.update(updateWrapper1); - } - log.info("一楼装箱区二次分配的任务编号为:" + baseTask.getTask_code() + ",取货完成执行成功,取货信息:点位:" + pointCode + "子卷号为:" + baseTask.getVehicle_code()); + log.info("一楼装箱区二次分配清空起点库存" + baseTask.getTask_code() + ",执行成功,点位:" + pointCode + "子卷号:" + baseTask.getVehicle_code()); + //标记取满轴或取空载具完成 + UpdateWrapper updateWrapper1 = new UpdateWrapper<>(); + updateWrapper1.eq("task_id", baseTask.getTask_id()); + updateWrapper1.set("request_param", PackageInfoIvtEnum.TASK_ACTION_TYPE.code("取货完成")); + taskService.update(updateWrapper1); + log.info("一楼装箱区二次分配取货完成" + baseTask.getTask_code() + ",取货完成执行成功,点位:" + pointCode + "子卷号:" + baseTask.getVehicle_code()); } /** @@ -537,8 +581,8 @@ public class BstIvtPackageinfoivtServiceImpl extends ServiceImpl queryWrapper = new LambdaQueryWrapper<>(); if (PackageInfoIvtEnum.TASK_ACTION_TYPE.code("取货分配").equals(actionType)) { @@ -552,6 +596,10 @@ public class BstIvtPackageinfoivtServiceImpl extends ServiceImpl newPointList = packageinfoivtService.checkEndPointTask(bstIvtPackageinfoivt.getPoint_status(), ivtInfo.getIvt_status(), targetPoint, ivtInfo.getSort_seq().toString(), ""); diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/auto/AutoSendVehicleToDjq.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/auto/AutoSendVehicleToDjq.java index b20c1d841..d260b1130 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/auto/AutoSendVehicleToDjq.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/auto/AutoSendVehicleToDjq.java @@ -13,7 +13,6 @@ import org.nl.common.enums.PackageInfoIvtEnum; import org.redisson.api.RLock; import org.redisson.api.RedissonClient; import org.springframework.stereotype.Component; - import javax.annotation.Resource; import java.util.List; import java.util.concurrent.TimeUnit; @@ -25,6 +24,8 @@ import java.util.stream.Collectors; @RequiredArgsConstructor public class AutoSendVehicleToDjq { private final String THIS_CLASS = AutoSendVehicleToDjq.class.getName(); + + @Resource private RedissonClient redissonClient; @Resource @@ -32,6 +33,9 @@ public class AutoSendVehicleToDjq { @Resource private SendGzqKzjTask sendGzqKzjTask; + @Resource + private IbstIvtPackageinfoivtService ibstIvtPackageinfoivtService; + @Resource private IbstIvtPackageinfoivtService packageinfoivtService; @@ -43,32 +47,27 @@ public class AutoSendVehicleToDjq { @SneakyThrows public void sendVehicleToDjqOrGzq1() { - log.info(THIS_CLASS+"-装箱区->待检区或管制区补空任务开始执行扫描。"); + log.info(THIS_CLASS + "-装箱区->待检区或管制区补空任务开始执行扫描。"); RLock lock = redissonClient.getLock(THIS_CLASS); boolean tryLock = lock.tryLock(0, TimeUnit.SECONDS); try { if (tryLock) { - //存在装箱区有空载具的点位 - String pointCode2 = null; + String pointCode2; JSONObject task = new JSONObject(); + List ivtList =ibstIvtPackageinfoivtService.getBstIvtPackageinfoivts(PackageInfoIvtEnum.POINT_STATUS.code("装箱区"), PackageInfoIvtEnum.IVT_STATUS.code("合格品"),""); + if (CollectionUtils.isNotEmpty(ivtList)) { + return; + } + //存在装箱区有空载具的点位 List zxqIvtList = packageinfoivtService.checkEndPointTask(PackageInfoIvtEnum.POINT_STATUS.code("装箱区"), PackageInfoIvtEnum.IVT_STATUS.code("空载具"), PackageInfoIvtEnum.TASK_POINT_TYPE.code("取货任务"), "", ""); if (CollectionUtils.isEmpty(zxqIvtList)) { return; } - //待检区有空位且过滤未完成任务 - List djqPackageinfoivtList = packageinfoivtService.checkEndPointTask(PackageInfoIvtEnum.POINT_STATUS.code("待检区"), PackageInfoIvtEnum.IVT_STATUS.code("空"), PackageInfoIvtEnum.TASK_POINT_TYPE.code("放货任务"), PackageInfoIvtEnum.SORT_TYPE.code("升序"), ""); - if (CollectionUtils.isNotEmpty(djqPackageinfoivtList)) { - pointCode2 = djqPackageinfoivtList.get(0).getPoint_code(); - task.put("vehicle_code2", PackageInfoIvtEnum.AGV_ACTION_TYPE.code("普通任务")); - task.put("task_type", PackageInfoIvtEnum.TASK_TYPE.code("补空(装箱区->待检区)")); + if ( Integer.parseInt(zxqIvtList.get(0).getSort_seq().toString()) % 2 != 0) { + //优先去管制区 + pointCode2 = getPointCode(task, PackageInfoIvtEnum.TASK_TYPE.code("补空(装箱区->待检区)")); } else { - //管制区有空位 - List gzqList = packageinfoivtService.checkEndPointTask(PackageInfoIvtEnum.POINT_STATUS.code("管制区"), PackageInfoIvtEnum.IVT_STATUS.code("空"), PackageInfoIvtEnum.TASK_POINT_TYPE.code("放货任务"), PackageInfoIvtEnum.SORT_TYPE.code("升序"), ""); - if (CollectionUtils.isNotEmpty(gzqList)) { - pointCode2 = gzqList.get(0).getPoint_code(); - task.put("vehicle_code2", PackageInfoIvtEnum.AGV_ACTION_TYPE.code("普通任务")); - task.put("task_type", PackageInfoIvtEnum.TASK_TYPE.code("补空(装箱区->管制区)")); - } + pointCode2 = getPointCode(task, PackageInfoIvtEnum.TASK_TYPE.code("补空(装箱区->管制区)")); } //去装箱区搬运空载具 if (pointCode2 != null) { @@ -91,6 +90,40 @@ public class AutoSendVehicleToDjq { } + + private String getPointCode(JSONObject task, String taskType) { + String pointCode2 = null; + List packageList; + if (taskType.equals(PackageInfoIvtEnum.TASK_TYPE.code("补空(装箱区->待检区)"))) { + packageList = packageinfoivtService.checkEndPointTask(PackageInfoIvtEnum.POINT_STATUS.code("待检区"), PackageInfoIvtEnum.IVT_STATUS.code("空"), PackageInfoIvtEnum.TASK_POINT_TYPE.code("放货任务"), PackageInfoIvtEnum.SORT_TYPE.code("升序"), ""); + if (CollectionUtils.isEmpty(packageList)) { + packageList = packageinfoivtService.checkEndPointTask(PackageInfoIvtEnum.POINT_STATUS.code("管制区"), PackageInfoIvtEnum.IVT_STATUS.code("空"), PackageInfoIvtEnum.TASK_POINT_TYPE.code("放货任务"), PackageInfoIvtEnum.SORT_TYPE.code("升序"), ""); + task.put("task_type", PackageInfoIvtEnum.TASK_TYPE.code("补空(装箱区->管制区)")); + } else { + task.put("task_type", PackageInfoIvtEnum.TASK_TYPE.code("补空(装箱区->待检区)")); + } + } else { + packageList = packageinfoivtService.checkEndPointTask(PackageInfoIvtEnum.POINT_STATUS.code("管制区"), PackageInfoIvtEnum.IVT_STATUS.code("空"), PackageInfoIvtEnum.TASK_POINT_TYPE.code("放货任务"), PackageInfoIvtEnum.SORT_TYPE.code("升序"), ""); + if (CollectionUtils.isEmpty(packageList)) { + packageList = packageinfoivtService.checkEndPointTask(PackageInfoIvtEnum.POINT_STATUS.code("待检区"), PackageInfoIvtEnum.IVT_STATUS.code("空"), PackageInfoIvtEnum.TASK_POINT_TYPE.code("放货任务"), PackageInfoIvtEnum.SORT_TYPE.code("升序"), ""); + task.put("task_type", PackageInfoIvtEnum.TASK_TYPE.code("补空(装箱区->待检区)")); + } else { + task.put("task_type", PackageInfoIvtEnum.TASK_TYPE.code("补空(装箱区->管制区)")); + } + } + if (CollectionUtils.isNotEmpty(packageList)) { + pointCode2 = packageList.get(0).getPoint_code(); + task.put("vehicle_code2", PackageInfoIvtEnum.AGV_ACTION_TYPE.code("普通任务")); + } + return pointCode2; + } + + + + + + + /** * 二次分配任务 */ diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/auto/AutoSendVehicleToKzj.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/auto/AutoSendVehicleToKzj.java index e03e2ad7d..cfad2df36 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/auto/AutoSendVehicleToKzj.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/auto/AutoSendVehicleToKzj.java @@ -37,8 +37,6 @@ public class AutoSendVehicleToKzj { private DjqToKzjhcwTask djqToKzjhcwTask; @Resource private GzqToKzjhcwTask gzqToKzjhcwTask; - @Resource - private BstIvtPackageinfoivtMapper bstIvtPackageinfoivtMapper; @Resource private IbstIvtPackageinfoivtService packageinfoivtService; @@ -112,10 +110,10 @@ public class AutoSendVehicleToKzj { return; } if (existTask.size() % 2 != 0) { - //优先去待检区 - pointCode1 = getPointCode(task, PackageInfoIvtEnum.TASK_TYPE.code("补空(管制区->空载具缓存位)")); - } else { + //优先去管制区 pointCode1 = getPointCode(task, PackageInfoIvtEnum.TASK_TYPE.code("补空(待检区->空载具缓存位)")); + } else { + pointCode1 = getPointCode(task, PackageInfoIvtEnum.TASK_TYPE.code("补空(管制区->空载具缓存位)")); } //去待检区或管制区搬运空载具 if (pointCode1 != null) { diff --git a/lms/nladmin-ui/src/views/wms/pdm/ivt/packageinfoivt/index.vue b/lms/nladmin-ui/src/views/wms/pdm/ivt/packageinfoivt/index.vue index 71165b9ce..02ceeef53 100644 --- a/lms/nladmin-ui/src/views/wms/pdm/ivt/packageinfoivt/index.vue +++ b/lms/nladmin-ui/src/views/wms/pdm/ivt/packageinfoivt/index.vue @@ -151,7 +151,6 @@ {{ dict.label.is_used[scope.row.is_used] }} - diff --git a/lms/nladmin-ui/src/views/wms/sch/task/index.vue b/lms/nladmin-ui/src/views/wms/sch/task/index.vue index 8c3075070..612a9ef54 100644 --- a/lms/nladmin-ui/src/views/wms/sch/task/index.vue +++ b/lms/nladmin-ui/src/views/wms/sch/task/index.vue @@ -142,6 +142,7 @@ + From de653e68a460629a9c9567fa1f26202fdf4d1ca3 Mon Sep 17 00:00:00 2001 From: gongbaoxiong <751575283@qq.com> Date: Sun, 14 Jul 2024 08:34:57 +0800 Subject: [PATCH 5/6] =?UTF-8?q?opt:=E4=BC=98=E5=8C=96=E8=A3=85=E7=AE=B1?= =?UTF-8?q?=E5=8C=BA=E2=80=94=E2=80=94>=E5=BE=85=E6=A3=80=E5=8C=BA?= =?UTF-8?q?=E9=80=81=E7=A9=BA=E8=BD=BD=E5=85=B7=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../point/service/impl/BstIvtPackageinfoivtServiceImpl.java | 4 ++-- .../sch/tasks/first_floor_area/auto/AutoSendMzToDjq.java | 2 +- .../src/main/java/org/nl/common/enums/PackageInfoIvtEnum.java | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/service/impl/BstIvtPackageinfoivtServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/service/impl/BstIvtPackageinfoivtServiceImpl.java index 05eceb819..5dff638a1 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/service/impl/BstIvtPackageinfoivtServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/service/impl/BstIvtPackageinfoivtServiceImpl.java @@ -242,7 +242,7 @@ public class BstIvtPackageinfoivtServiceImpl extends ServiceImpl(); - } else if (pointCode.equals(PackageInfoIvtEnum.TASK_POINT_TYPE.code("四个点任务放货"))) { + } else if (pointCode.equals(PackageInfoIvtEnum.TASK_POINT_TYPE.code("四个点任务取货"))) { taskList = bstIvtPackageinfoivtMapper.getTaskList(pointIds, null, pointIds, null); } else if (pointCode.equals(PackageInfoIvtEnum.TASK_POINT_TYPE.code("空载具放货"))) { taskList = bstIvtPackageinfoivtMapper.getTaskList(null, pointIds, null, pointIds); @@ -273,7 +273,7 @@ public class BstIvtPackageinfoivtServiceImpl extends ServiceImpl Stream.of( task.getPoint_code1(), diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/auto/AutoSendMzToDjq.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/auto/AutoSendMzToDjq.java index c5c24f104..0e4559e48 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/auto/AutoSendMzToDjq.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/first_floor_area/auto/AutoSendMzToDjq.java @@ -79,7 +79,7 @@ public class AutoSendMzToDjq { return; } //满轴有子卷且过滤未完成任务 - List mzqPackageinfoivtList = packageinfoivtService.checkEndPointTask(PackageInfoIvtEnum.POINT_STATUS.code("满轴缓存位"), PackageInfoIvtEnum.IVT_STATUS.code("有子卷"), PackageInfoIvtEnum.TASK_POINT_TYPE.code("四个点任务放货"), PackageInfoIvtEnum.SORT_TYPE.code("降序"), ""); + List mzqPackageinfoivtList = packageinfoivtService.checkEndPointTask(PackageInfoIvtEnum.POINT_STATUS.code("满轴缓存位"), PackageInfoIvtEnum.IVT_STATUS.code("有子卷"), PackageInfoIvtEnum.TASK_POINT_TYPE.code("四个点任务取货"), PackageInfoIvtEnum.SORT_TYPE.code("降序"), ""); if (CollectionUtils.isEmpty(mzqPackageinfoivtList)) { return; } diff --git a/lms/nladmin-system/src/main/java/org/nl/common/enums/PackageInfoIvtEnum.java b/lms/nladmin-system/src/main/java/org/nl/common/enums/PackageInfoIvtEnum.java index 1f822b3cb..3d0a67628 100644 --- a/lms/nladmin-system/src/main/java/org/nl/common/enums/PackageInfoIvtEnum.java +++ b/lms/nladmin-system/src/main/java/org/nl/common/enums/PackageInfoIvtEnum.java @@ -41,7 +41,7 @@ public enum PackageInfoIvtEnum { //起点终点类型 - TASK_POINT_TYPE(MapOf.of("取货任务", "1", "放货任务", "2", "取货分配", "3", "放货分配", "4", "取货任务取货分配", "5", "放货任务放货分配", "6", "四个点任务放货", "7","空载具放货", "8", "四个点任务分配", "9","空载具放货分配", "10")), + TASK_POINT_TYPE(MapOf.of("取货任务", "1", "放货任务", "2", "取货分配", "3", "放货分配", "4", "取货任务取货分配", "5", "放货任务放货分配", "6", "四个点任务取货", "7","空载具放货", "8", "四个点任务分配", "9","空载具放货分配", "10")), //等待点类型 WAIT_POINT_TYPE(MapOf.of("满轴区等待点", "1", "待检区等待点", "2")), From 89dbc2218e74d2cdd85c982496b06842a98f24e1 Mon Sep 17 00:00:00 2001 From: gongbaoxiong <751575283@qq.com> Date: Sun, 14 Jul 2024 09:03:01 +0800 Subject: [PATCH 6/6] =?UTF-8?q?opt:=E4=BC=98=E5=8C=96=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/BstIvtPackageinfoivtServiceImpl.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/service/impl/BstIvtPackageinfoivtServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/service/impl/BstIvtPackageinfoivtServiceImpl.java index 5dff638a1..d933c6d94 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/service/impl/BstIvtPackageinfoivtServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/point/service/impl/BstIvtPackageinfoivtServiceImpl.java @@ -402,12 +402,12 @@ public class BstIvtPackageinfoivtServiceImpl extends ServiceImpl taskList3 = taskList.stream().filter(r -> r.getTask_type().equals(PackageInfoIvtEnum.TASK_TYPE.code("输送线四个点任务")) || r.getTask_type().equals(PackageInfoIvtEnum.TASK_TYPE.code("放空(空载具缓存位->输送线)"))).collect(Collectors.toList()); if (CollectionUtils.isNotEmpty(taskList3)) { if (StringUtils.isBlank(taskList3.get(0).getRequest_param())) { - log.info("一楼装箱区放货分配" + baseTask.getTask_code() + ",分配失败,请等待桁架任务编号为:" + taskList3.get(0).getTask_code() + "的任务未完成,请检查!"); - throw new BadRequestException("一楼装箱区放货分配" + baseTask.getTask_code() + ",分配失败,请等待桁架任务编号为:" + taskList3.get(0).getTask_code() + "的任务未完成,请检查!"); + log.info("一楼装箱区放货分配" + baseTask.getTask_code() + ",分配失败,桁架任务编号为:" + taskList3.get(0).getTask_code() + "的取载具动作未完成,请检查!"); + throw new BadRequestException("一楼装箱区放货分配" + baseTask.getTask_code() + ",分配失败,桁架任务编号为:" + taskList3.get(0).getTask_code() + "的取载具动作未完成,请检查!"); } else { if (!taskList3.get(0).getRequest_param().equals(PackageInfoIvtEnum.TASK_ACTION_TYPE.code("取货完成"))) { - log.info("一楼装箱区放货分配" + baseTask.getTask_code() + ",分配失败,请等待桁架任务编号为:" + taskList3.get(0).getTask_code() + "的任务未完成,请检查!"); - throw new BadRequestException("一楼装箱区放货分配" + baseTask.getTask_code() + ",分配失败,请等待桁架任务编号为:" + taskList3.get(0).getTask_code() + "的任务未完成,请检查!"); + log.info("一楼装箱区放货分配" + baseTask.getTask_code() + ",分配失败,桁架任务编号为:" + taskList3.get(0).getTask_code() + "的取载具动作未完成,请检查!"); + throw new BadRequestException("一楼装箱区放货分配" + baseTask.getTask_code() + ",分配失败,桁架任务编号为:" + taskList3.get(0).getTask_code() + "的取载具动作未完成,请检查!"); } } } @@ -511,13 +511,13 @@ public class BstIvtPackageinfoivtServiceImpl extends ServiceImpl待检区"))) { //过滤未二次分配的任务 if (StringUtils.isBlank(baseTask.getResponse_param())) { - throw new BadRequestException("该任务任务号为:" + baseTask.getTask_code() + ",起点未进行二次分配!"); + throw new BadRequestException("取货完成失败" + baseTask.getTask_code() + ",起点未进行二次分配!"); } List ivtList = packageinfoivtService.list(new LambdaQueryWrapper() .eq(BstIvtPackageinfoivt::getIs_used, PackageInfoIvtEnum.IS_USED.code("启用")) .eq(BstIvtPackageinfoivt::getPoint_code, baseTask.getPoint_code1())); if (CollectionUtils.isEmpty(ivtList)) { - throw new BadRequestException("任务编号为:" + baseTask.getTask_code() + "agv取货完成的目标点位不存在!"); + throw new BadRequestException("取货完成失败" + baseTask.getTask_code() + "agv取货完成的目标点位不存在!"); } //只有子卷号相同才能清除库存 if (baseTask.getVehicle_code().equals(ivtList.get(0).getContainer_name())) { @@ -567,12 +567,12 @@ public class BstIvtPackageinfoivtServiceImpl extends ServiceImpl updateWrapper1 = new UpdateWrapper<>(); updateWrapper1.eq("task_id", baseTask.getTask_id()); updateWrapper1.set("request_param", PackageInfoIvtEnum.TASK_ACTION_TYPE.code("取货完成")); taskService.update(updateWrapper1); - log.info("一楼装箱区二次分配取货完成" + baseTask.getTask_code() + ",取货完成执行成功,点位:" + pointCode + "子卷号:" + baseTask.getVehicle_code()); + log.info("一楼装箱区二次分配取货完成" + baseTask.getTask_code() + ",取货完成信号接收成功,点位:" + pointCode + "子卷号:" + baseTask.getVehicle_code()); } /**