From 43357070ccc5b7ec165bd20fc3727aef1d877020 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=B1=9F=E7=8E=AE?= Date: Sun, 16 Apr 2023 13:16:49 +0800 Subject: [PATCH] =?UTF-8?q?fix=20=E5=8E=8B=E5=88=B6=E9=80=81=E6=96=99=20?= =?UTF-8?q?=E7=83=A7=E5=88=B6=E5=8F=AB=E6=96=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../acs/service/impl/AcsToWmsServiceImpl.java | 34 ++++++++++---- .../sch/service/impl/PointServiceImpl.java | 4 +- .../call/material/wql/CALL_MATERIAL_TASK.wql | 4 +- .../sch/task/send/empty/FJSendEmptyTask.java | 42 ++++++++--------- .../task/send/empty/wql/SEND_EMPTY_TASK.wql | 36 ++------------- .../send/material/SZSendMaterialTask.java | 14 +----- .../send/material/YZSendMaterialTask.java | 43 ++++++++++-------- .../org/nl/wms/sch/task/util/TaskUtils.java | 2 +- .../src/main/java/org/nl/wms/wms.xls | Bin 266240 -> 266752 bytes 9 files changed, 78 insertions(+), 101 deletions(-) diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java index 14b96a9..7bf5851 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java @@ -224,11 +224,11 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { switch (type) { case "1": // 送料 - String vehicle_code = param.getString("vehicle_code"); - if (StrUtil.isBlank(vehicle_code) || "0".equals(vehicle_code)) { - throw new BadRequestException("载具号不能为空!"); + String vehicle_code = TaskUtils.formatVehicleCode(param.getString("vehicle_code")); + if ("0000".equals(vehicle_code)) { + throw new BadRequestException("载具编码不能为空!"); } - method_param.put("vehicle_code", TaskUtils.formatVehicleCode(vehicle_code)); + method_param.put("vehicle_code", vehicle_code); switch (region) { case HL: @@ -240,6 +240,18 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { yzSendMaterialTask.createTask(method_param); break; case SZ: + WQLObject vd_table = WQLObject.getWQLObject("st_ivt_vehicle_detail"); + JSONObject vd = vd_table + .query("is_delete = '0' AND vehicle_type = '2' AND vehicle_code = '" + vehicle_code + "'") + .uniqueResult(0); + if (ObjectUtil.isEmpty(vd)) { + throw new BadRequestException("未找到 [" + vehicle_code + "] 的组盘信息!"); + } + vd.put("is_fire", "1"); + vd.put("is_in_kiln", "0"); + vd_table.update(vd); + method_param.put("vd", vd); + szSendMaterialTask.createTask(method_param); break; default: @@ -409,12 +421,14 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { vd.put("create_name", ACSSystem.nick_name); vd.put("create_time", DateUtil.now()); vd.put("is_delete", TrueOrFalse.FALSE.value()); + vd.put("is_fire", TrueOrFalse.FALSE.value()); - if (device_code.startsWith("FJ")) { + String region_code = point.getString("region_code"); + if (Region.FJ.value().equals(region_code)) { vd.put("is_fire", TrueOrFalse.TRUE.value()); } vd.put("is_in_kiln", TrueOrFalse.trueOrFalse(is_full) ? TrueOrFalse.TRUE.value() : TrueOrFalse.FALSE.value()); - if (device_code.startsWith("FJ")) { + if (Region.FJ.value().equals(region_code)) { vd.put("is_in_kiln", TrueOrFalse.FALSE.value()); } @@ -430,8 +444,9 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { param.put("point", point); param.put("workorder", work_order); param.put("vd", vd); + param.put("vehicle_code", vehicle_code); param.put("type", "1"); - param.put("request_param", jsonObject); + param.put("request_param", jsonObject.toJSONString()); this.apply(param); } @@ -691,7 +706,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { JSONObject result = new JSONObject(); result.put("status", HttpStatus.OK.value()); - result.put("message", "反馈成功"); + result.put("message", "反馈成功!"); return result; } @@ -703,6 +718,9 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { } String vehicle_code = whereJson.getString("vehicle_code"); vehicle_code = TaskUtils.formatVehicleCode(vehicle_code); + if ("0000".equals(vehicle_code)) { + throw new BadRequestException("载具编码不能为空!"); + } JSONObject point = WQLObject .getWQLObject("sch_base_point") .query("is_used = '1' AND point_code = '" + point_code + "'") diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/PointServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/PointServiceImpl.java index 5f47843..f14b47e 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/PointServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/service/impl/PointServiceImpl.java @@ -153,12 +153,10 @@ public class PointServiceImpl implements PointService { dto.setUpdate_optname(nickName); String pointStatus = dto.getPoint_status(); - if (ObjectUtil.isNotEmpty(pointStatus) && pointStatus.equals("1")) { // 空位 + if (ObjectUtil.isNotEmpty(pointStatus) && pointStatus.equals("0")) { // 空位 dto.setVehicle_type(""); dto.setVehicle_code(""); // PointUpdateUtil.clearPoint(dto.getPoint_code()); - } else if (pointStatus.equals("2")) { // 空载具 - } else if (pointStatus.equals("3")) { // 有料 } JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); pointTab.update(json); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/material/wql/CALL_MATERIAL_TASK.wql b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/material/wql/CALL_MATERIAL_TASK.wql index ea27da3..60c9d04 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/material/wql/CALL_MATERIAL_TASK.wql +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/call/material/wql/CALL_MATERIAL_TASK.wql @@ -37,7 +37,7 @@ # 3、业务主过程 # ########################################## - IF flag = "1" + IF 输入.flag = "1" QUERY SELECT point.*, @@ -78,7 +78,7 @@ ENDQUERY ENDIF - IF flag = "3" + IF 输入.flag = "3" QUERY SELECT point.* diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/send/empty/FJSendEmptyTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/send/empty/FJSendEmptyTask.java index 94f2fa6..e440d65 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/send/empty/FJSendEmptyTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/send/empty/FJSendEmptyTask.java @@ -3,24 +3,25 @@ package org.nl.wms.sch.task.send.empty; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; import org.nl.modules.common.exception.BadRequestException; import org.nl.modules.wql.WQL; import org.nl.modules.wql.core.bean.WQLObject; -import org.nl.wms.basedata.eum.TrueOrFalse; import org.nl.wms.basedata.eum.VehicleType; import org.nl.wms.sch.manage.*; -import org.nl.wms.sch.task.send.material.HLSendMaterialTask; -import org.nl.wms.sch.task.send.material.YZSendMaterialTask; import org.nl.wms.sch.task.util.TaskUtils; +import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; /** * @author zhangjiangwei * @date 2023/04/14 21:29 */ +@RequiredArgsConstructor +@Component public class FJSendEmptyTask extends AbstractAcsTask { - + @Transactional(rollbackFor = Exception.class) @Override public void updateTaskStatus(JSONObject task, String status) { if (TaskStatus.EXECUTING.value().equals(status)) { @@ -34,32 +35,23 @@ public class FJSendEmptyTask extends AbstractAcsTask { } } + @Transactional(rollbackFor = Exception.class) @Override - @Transactional public String createTask(JSONObject form) { JSONObject point = form.getJSONObject("point"); - - TaskUtils.isLocked(point); - JSONObject work_order = TaskUtils.hasWorkOrder(point); - String vehicle_code = form.getString("vehicle_code"); - if ("0000".equals(vehicle_code)) { - throw new BadRequestException("载具编码不能为空!"); - } - - // todo 组盘 JSONObject task = TaskUtils.buildTask( - "混料机送料入库", - TaskType.SEND_MATERIAL.value(), + "分拣区送空", + TaskType.SEND_EMPTY.value(), TaskStatus.SURE_START.value(), point.getString("point_code"), null, - work_order.getString("material_id"), - VehicleType.CUP.value(), + null, + VehicleType.STEEL_TRAY.value(), vehicle_code, - TrueOrFalse.trueOrFalse(work_order.getString("is_urgent")) ? "99" : "1", - HLSendMaterialTask.class.getName(), + "1", + FJSendEmptyTask.class.getName(), form.getString("create_mode"), form.getString("request_param"), form.getString("create_id"), @@ -67,6 +59,10 @@ public class FJSendEmptyTask extends AbstractAcsTask { ); WQLObject.getWQLObject("sch_base_task").insert(task); + point.put("lock_type", LockType.TASK_LOCKED.value()); + point.put("task_code", task.getString("task_code")); + WQLObject.getWQLObject("sch_base_point").update(point); + return task.getString("task_id"); } @@ -75,7 +71,7 @@ public class FJSendEmptyTask extends AbstractAcsTask { public void findNextPoint() { WQLObject task_table = WQLObject.getWQLObject("sch_base_task"); JSONArray tasks = task_table - .query("is_delete = '0' AND task_status = '" + TaskStatus.SURE_START.value() + "' AND handle_class = '" + YZSendMaterialTask.class.getName() + "'", "priority DESC, create_time ASC") + .query("is_delete = '0' AND task_status = '" + TaskStatus.SURE_START.value() + "' AND handle_class = '" + FJSendEmptyTask.class.getName() + "'", "priority DESC, create_time ASC") .getResultJSONArray(0); WQLObject point_table = WQLObject.getWQLObject("sch_base_point"); @@ -83,7 +79,7 @@ public class FJSendEmptyTask extends AbstractAcsTask { JSONObject task = tasks.getJSONObject(i); JSONObject point = WQL - .getWO("SEND_MATERIAL_TASK") + .getWO("SEND_EMPTY_TASK") .addParam("flag", "1") .process() .uniqueResult(0); @@ -186,8 +182,6 @@ public class FJSendEmptyTask extends AbstractAcsTask { JSONObject point2 = new JSONObject(); point2.put("lock_type", LockType.UNLOCKED.value()); point2.put("task_code", ""); - point2.put("vehicle_type", task.getString("vehicle_type")); - point2.put("vehicle_code", task.getString("vehicle_code")); point2.put("point_status", PointStatus.NOT_EMPTY.value()); if (operation_type == OperationType.AUTO) { TaskUtils.addACSUpdateColum(point2); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/send/empty/wql/SEND_EMPTY_TASK.wql b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/send/empty/wql/SEND_EMPTY_TASK.wql index fe07fe8..60de1da 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/send/empty/wql/SEND_EMPTY_TASK.wql +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/send/empty/wql/SEND_EMPTY_TASK.wql @@ -37,34 +37,8 @@ # 3、业务主过程 # ########################################## - IF flag = "1" - QUERY - SELECT - point.*, - vd.material_id, - workorder.is_urgent - FROM - sch_base_point point - JOIN st_ivt_vehicle_detail vd ON point.vehicle_type = vd.vehicle_type - AND point.vehicle_code = vd.vehicle_code - AND vd.is_delete = '0' - LEFT JOIN pdm_bd_workorder workorder ON vd.workorder_id = workorder.workorder_id - WHERE - point.is_used = '1' - AND point.lock_type = '1' - AND point.region_code = 'CPHJ' - AND point.point_status = '1' - AND point.vehicle_type = '2' - AND vd.is_fire = '0' - AND vd.is_in_kiln = '1' - ORDER BY - workorder.is_urgent DESC, vd.create_time ASC - ENDSELECT - ENDQUERY - ENDIF - - IF 输入.flag = "2" - QUERY + IF 输入.flag = "1" + QUERY SELECT * FROM @@ -72,8 +46,8 @@ WHERE is_used = '1' AND lock_type = '1' - AND region_code = 'SZ' + AND region_code = 'GTK' AND point_type = '1' ENDSELECT - ENDQUERY - ENDIF + ENDQUERY + ENDIF diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/send/material/SZSendMaterialTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/send/material/SZSendMaterialTask.java index 62b9135..508de79 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/send/material/SZSendMaterialTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/send/material/SZSendMaterialTask.java @@ -39,17 +39,7 @@ public class SZSendMaterialTask extends AbstractAcsTask { @Override public String createTask(JSONObject form) { JSONObject point = form.getJSONObject("point"); - String vehicle_code = form.getString("vehicle_code"); - WQLObject vd_table = WQLObject.getWQLObject("st_ivt_vehicle_detail"); - JSONObject vd = vd_table - .query("is_delete = '0' AND vehicle_type = '2' AND vehicle_code = '" + vehicle_code + "'") - .uniqueResult(0); - if (ObjectUtil.isEmpty(vd)) { - throw new BadRequestException("未找到 [" + vehicle_code + "] 的组盘信息!"); - } - vd.put("is_fire", "1"); - vd.put("is_in_kiln", "0"); - vd_table.update(vd); + JSONObject vd = form.getJSONObject("vd"); JSONObject task = TaskUtils.buildTask( "烧制区送料", @@ -59,7 +49,7 @@ public class SZSendMaterialTask extends AbstractAcsTask { null, vd.getString("material_id"), VehicleType.STEEL_TRAY.value(), - vehicle_code, + vd.getString("vehicle_code"), "1", SZSendMaterialTask.class.getName(), form.getString("create_mode"), diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/send/material/YZSendMaterialTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/send/material/YZSendMaterialTask.java index 4c8410d..e4eb972 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/send/material/YZSendMaterialTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/send/material/YZSendMaterialTask.java @@ -75,26 +75,29 @@ public class YZSendMaterialTask extends AbstractAcsTask { JSONArray tasks = task_table .query("is_delete = '0' AND task_status = '" + TaskStatus.SURE_START.value() + "' AND handle_class = '" + YZSendMaterialTask.class.getName() + "'", "priority DESC, create_time ASC") .getResultJSONArray(0); - WQLObject point_table = WQLObject.getWQLObject("sch_base_point"); - - for (int i = 0; i < tasks.size(); i++) { - JSONObject task = tasks.getJSONObject(i); - - JSONObject point = WQL - .getWO("SEND_MATERIAL_TASK") - .addParam("flag", "1") - .process() - .uniqueResult(0); - - if (ObjectUtil.isNotEmpty(point)) { - task.put("task_status", TaskStatus.START_AND_END.value()); - task.put("point_code2", point.getString("point_code")); - task.put("remark", ""); - task_table.update(task); - - point.put("lock_type", LockType.TASK_LOCKED.value()); - point.put("task_code", task.getString("task_code")); - point_table.update(point); + + if (ObjectUtil.isNotEmpty(tasks)) { + WQLObject point_table = WQLObject.getWQLObject("sch_base_point"); + + for (int i = 0; i < tasks.size(); i++) { + JSONObject task = tasks.getJSONObject(i); + + JSONObject point = WQL + .getWO("SEND_MATERIAL_TASK") + .addParam("flag", "1") + .process() + .uniqueResult(0); + + if (ObjectUtil.isNotEmpty(point)) { + task.put("task_status", TaskStatus.START_AND_END.value()); + task.put("point_code2", point.getString("point_code")); + task.put("remark", ""); + task_table.update(task); + + point.put("lock_type", LockType.TASK_LOCKED.value()); + point.put("task_code", task.getString("task_code")); + point_table.update(point); + } } } } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/util/TaskUtils.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/util/TaskUtils.java index 5d9dd27..fdf4aaf 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/util/TaskUtils.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/task/util/TaskUtils.java @@ -87,7 +87,7 @@ public class TaskUtils { if (StrUtil.isBlank(vehicle_code)) { vehicle_code = "0000"; } else { - if (vehicle_code.length() > 4 || vehicle_code.matches("^\\d+$")) { + if (vehicle_code.length() > 4 || !vehicle_code.matches("^\\d+$")) { throw new BadRequestException("载具编码错误!"); } } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/wms.xls b/lms/nladmin-system/src/main/java/org/nl/wms/wms.xls index 9de783a1b2c6d2c77acceefadce8be1fcc894166..0142a6e7a82aecbfdc333d75ebc76b9adfdccdba 100644 GIT binary patch delta 7278 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 C9lII; delta 6912 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 b>7v^!lMI!}JH+t~Q@|DMt_wGp6w3Y!5p{2`