From b7598908f3c1fdd25070fed420aa9ff3d8c51114 Mon Sep 17 00:00:00 2001 From: lyd <1419499670@qq.com> Date: Sat, 26 Nov 2022 11:14:20 +0800 Subject: [PATCH] =?UTF-8?q?=E7=83=A7=E5=88=B6=E3=80=81=E5=88=86=E6=8B=A3?= =?UTF-8?q?=E5=B7=A5=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wms/ext/acs/rest/AcsToWmsController.java | 7 + .../wms/ext/acs/rest/WmsToAcsController.java | 7 + .../wms/ext/acs/service/AcsToWmsService.java | 8 + .../wms/ext/acs/service/WmsToAcsService.java | 7 + .../acs/service/impl/AcsToWmsServiceImpl.java | 443 ++++++++++-------- .../acs/service/impl/WmsToAcsServiceImpl.java | 6 + .../org/nl/wms/sch/manage/RegionEnum.java | 10 + .../org/nl/wms/sch/manage/RegionIOEnum.java | 5 +- .../sch/service/impl/PointServiceImpl.java | 20 +- .../org/nl/wms/sch/tasks/PointUpdateUtil.java | 36 +- .../RykCallMaterialTask.java} | 87 ++-- .../wql/QSCH_rykCallMaterial_01.wql} | 7 +- .../callEmpty/FjCallEmptyVehicleTask.java | 31 +- .../callEmpty/HnCallEmptyVehicleTask.java | 10 +- .../callEmpty/YzjCallEmptyVehicleTask.java | 36 +- .../wql/QSCH_fjCallEmptyVehicle_01.wql | 4 +- .../callMaterial/FjCallMaterialTask.java | 66 +-- .../callMaterial/YzjCallMaterialTask.java | 11 +- .../wql/QSCH_cyCallMaterial_01.wql | 5 +- .../tasks/sendEmpty/DpSendEmpVehicleTask.java | 23 +- .../tasks/sendEmpty/FjSendEmpVehicleTask.java | 41 +- .../sendEmpty/YzjSendEmpVehicleTask.java | 10 +- .../sendMaterial/FjSendMaterialTask.java | 246 ++++++++-- .../sendMaterial/HnSendMaterialTask.java | 11 +- .../sendMaterial/SzSendMaterialTask.java | 81 ++-- .../sendMaterial/YzjSendMaterialTask.java | 18 +- ...icle_01.wql => QSCH_fjSendMaterial_01.wql} | 20 +- .../wql/QSCH_szSendMaterial_01.wql | 5 +- .../src/main/java/org/nl/wms/wms.xls | Bin 326656 -> 291328 bytes .../src/views/wms/pdm/workerorder/index.vue | 33 +- 30 files changed, 788 insertions(+), 506 deletions(-) rename lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/{callMaterial/SzCallMaterialTask.java => autoCallMaterial/RykCallMaterialTask.java} (78%) rename lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/{callMaterial/wql/QSCH_szCallMaterial_01.wql => autoCallMaterial/wql/QSCH_rykCallMaterial_01.wql} (89%) rename lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/wql/{QSCH_fjCallEmptyVehicle_01.wql => QSCH_fjSendMaterial_01.wql} (81%) diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/AcsToWmsController.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/AcsToWmsController.java index e36add8..118620e 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/AcsToWmsController.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/AcsToWmsController.java @@ -104,6 +104,13 @@ public class AcsToWmsController { return new ResponseEntity<>(acsToWmsService.getDeviceCodeByVehicleType(whereJson), HttpStatus.OK); } + @PostMapping("/getVehicleInfoBycode") + @Log("根据设备编码编码获取托盘信息") + @ApiOperation("根据设备编码编码获取托盘信息") + public ResponseEntity getVehicleInfoByDevice_code(@RequestBody Map whereJson) { + return new ResponseEntity<>(acsToWmsService.getVehicleInfoByDeviceCode(whereJson), HttpStatus.OK); + } + @PostMapping("/againApply") @Log("二次申请任务") @ApiOperation("二次申请任务") diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/WmsToAcsController.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/WmsToAcsController.java index c2f627c..61c60c9 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/WmsToAcsController.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/rest/WmsToAcsController.java @@ -79,5 +79,12 @@ public class WmsToAcsController { return new ResponseEntity<>(wmsToAcsService.getPointStatus(whereJson), HttpStatus.OK); } + @PostMapping("/queryTray") + @Log("WMS向acs发送获取载具") + @ApiOperation("WMS向acs发送获取载具") + public ResponseEntity getTray(@RequestBody JSONArray whereJson) { + return new ResponseEntity<>(wmsToAcsService.getTray(whereJson), HttpStatus.OK); + } + } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/AcsToWmsService.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/AcsToWmsService.java index 2f35dc5..2b07547 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/AcsToWmsService.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/AcsToWmsService.java @@ -92,4 +92,12 @@ public interface AcsToWmsService { * @param whereJson */ void reverseGroup(JSONObject whereJson); + + /** + * 根据设备编码获取托盘信息 + * + * @param jsonObject 条件 + * @return Map + */ + Map getVehicleInfoByDeviceCode(Map jsonObject); } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/WmsToAcsService.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/WmsToAcsService.java index 3735345..7cd3033 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/WmsToAcsService.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/WmsToAcsService.java @@ -55,4 +55,11 @@ public interface WmsToAcsService { * @return */ JSONObject getPointStatus(JSONArray whereJson); + + /** + * 获取木托盘 + * @param whereJson + * @return + */ + JSONObject getTray(JSONArray whereJson); } 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 21624fd..0d47eeb 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 @@ -22,11 +22,11 @@ import org.nl.wms.sch.manage.RegionEnum; import org.nl.wms.sch.manage.TaskStatusEnum; import org.nl.wms.sch.manage.WorkOrderEnum; import org.nl.wms.sch.service.TaskService; +import org.nl.wms.sch.tasks.PointUpdateUtil; import org.nl.wms.sch.tasks.callEmpty.FjCallEmptyVehicleTask; import org.nl.wms.sch.tasks.callEmpty.HnCallEmptyVehicleTask; import org.nl.wms.sch.tasks.callEmpty.YzjCallEmptyVehicleTask; import org.nl.wms.sch.tasks.callMaterial.FjCallMaterialTask; -import org.nl.wms.sch.tasks.callMaterial.SzCallMaterialTask; import org.nl.wms.sch.tasks.callMaterial.YzjCallMaterialTask; import org.nl.wms.sch.tasks.sendEmpty.DpSendEmpVehicleTask; import org.nl.wms.sch.tasks.sendEmpty.FjSendEmpVehicleTask; @@ -185,62 +185,23 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { String weight = whereJson.getString("weight"); String qty = whereJson.getString("qty"); - if (ObjectUtil.isEmpty(type)) throw new BadRequestException("类型不能为空"); if (ObjectUtil.isEmpty(point_code)) throw new BadRequestException("点位不能为空"); - // 类型映射 + /** + * 类型映射 + * 1: 送料入库 + * 2: 叫料出库 + * 3: 送空托盘 + * 4: 叫空托盘 + */ String regionId = WQLObject .getWQLObject("sch_base_point") .query("point_code = '" + point_code + "'") .uniqueResult(0) .getString("region_id"); - switch (type) { - case "1": - // 设备送料入库 - if (StrUtil.equals(regionId, RegionEnum.HNQ.getId())) { - type = "1"; - } else if (StrUtil.equals(regionId, RegionEnum.YZQ.getId())) { - type = "5"; - } else if (StrUtil.equals(regionId, RegionEnum.YQ.getId())) { - type = "8"; - } else if (StrUtil.equals(regionId, RegionEnum.ZDCDX.getId())) { - type = "11"; - } - break; - case "2": - // 设备叫料出库 - if (StrUtil.equals(regionId, RegionEnum.YZQ.getId())) { - type = "3"; - } else if (StrUtil.equals(regionId, RegionEnum.YQ.getId())) { - type = "7"; - } else if (StrUtil.equals(regionId, RegionEnum.ZDCDX.getId())) { - type = "9"; - } - break; - case "3": - // 设备送空托盘 - if (StrUtil.equals(regionId, RegionEnum.YZQ.getId())) { - type = "4"; - } else if (StrUtil.equals(regionId, RegionEnum.ZDCDX.getId())) { - type = "10"; - } else if (StrUtil.equals(regionId, RegionEnum.KGTDPQ.getId())) { - type = "13"; - } - break; - case "4": - // 设备叫空托盘 - if (StrUtil.equals(regionId, RegionEnum.HNQ.getId())) { - type = "2"; - } else if (StrUtil.equals(regionId, RegionEnum.YZQ.getId())) { - type = "6"; - } else if (StrUtil.equals(regionId, RegionEnum.ZDCDX.getId())) { - type = "12"; - } - break; - default: - throw new BadRequestException("ACS任务类型错误"); - } + + RegionEnum regionEnum = RegionEnum.get(regionId); // 参数统一获取 JSONObject param = new JSONObject(); @@ -257,7 +218,6 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { * 4.压制机上料位送空盅 * 5.压制机满料入库 * 6.压制机呼叫空钢托盘 - * 7.烧制叫料出库 * 8.烧制送料入库 * 9.分拣叫料出库 * 10.分拣送空钢托盘 @@ -267,76 +227,99 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { */ switch (type) { case "1": - // 1.混碾机送料入库:混碾机物料送到困料货架 - // 创建任务 - param.put("point_code1", point_code); // 起点 - SpringContextHolder.getBean(HnSendMaterialTask.class).createTask(param); + switch (regionEnum) { + case HNQ: + // 1.混碾机送料入库:混碾机物料送到困料货架 + // 创建任务 + param.put("point_code1", point_code); // 起点 + SpringContextHolder.getBean(HnSendMaterialTask.class).createTask(param); + break; + case YZQ: + // 5.压制机满料入库 + param.put("point_code1", point_code); // 起点 + param.put("group_id", whereJson.getString("group_id")); // 组盘标识 - 机械手过来的 + // 创建任务 + SpringContextHolder.getBean(YzjSendMaterialTask.class).createTask(param); + break; + case YQ: + // 8.烧制送料入库 + param.put("point_code1", point_code); // 起点 + SpringContextHolder.getBean(SzSendMaterialTask.class).createTask(param); + break; + case ZDCDX: + // 11.分拣送料入库 + param.put("point_code1", point_code); // 起点 + param.put("group_id", whereJson.getString("group_id")); // 组盘标识 - 机械手过来的 + SpringContextHolder.getBean(FjSendMaterialTask.class).createTask(param); + break; + default: + throw new BadRequestException("ACS任务类型错误"); + } break; case "2": - param.put("point_code2", point_code); // 终点 - // 创建任务 - SpringContextHolder.getBean(HnCallEmptyVehicleTask.class).createTask(param); + switch (regionEnum) { + case YZQ: + // 3.压制机叫料任务 + param.put("point_code2", point_code); // 终点 + // 创建任务 + SpringContextHolder.getBean(YzjCallMaterialTask.class).createTask(param); + break; + case ZDCDX: + // 9.分拣叫料出库 + param.put("point_code2", point_code); // 终点 + SpringContextHolder.getBean(FjCallMaterialTask.class).createTask(param); + break; + default: + throw new BadRequestException("ACS任务类型错误"); + } break; case "3": - // 压制机叫料任务 - param.put("point_code2", point_code); // 终点 - // 创建任务 - SpringContextHolder.getBean(YzjCallMaterialTask.class).createTask(param); + switch (regionEnum) { + case YZQ: + // 4.压制机送空盅 + param.put("point_code1", point_code); // 起点 + // 创建任务 + SpringContextHolder.getBean(YzjSendEmpVehicleTask.class).createTask(param); + break; + case ZDCDX: + // 10.分拣送钢托盘 + param.put("point_code1", point_code); // 起点 + SpringContextHolder.getBean(FjSendEmpVehicleTask.class).createTask(param); + break; + case KGTDPQ: + // 13.叠盘区送空钢托盘 + param.put("point_code1", point_code); // 起点 + SpringContextHolder.getBean(DpSendEmpVehicleTask.class).createTask(param); + break; + default: + throw new BadRequestException("ACS任务类型错误"); + } break; case "4": - // 压制机送空盅 - param.put("point_code1", point_code); // 起点 - // 创建任务 - SpringContextHolder.getBean(YzjSendEmpVehicleTask.class).createTask(param); - break; - case "5": - // 压制机满料入库 - param.put("point_code1", point_code); // 起点 - param.put("group_id", whereJson.getString("group_id")); // 组盘标识 - // 创建任务 - SpringContextHolder.getBean(YzjSendMaterialTask.class).createTask(param); - break; - case "6": - // 压制机呼叫空托盘 - param.put("point_code2", point_code); // 终点 - // 创建任务 - SpringContextHolder.getBean(YzjCallEmptyVehicleTask.class).createTask(param); - break; - case "7": - // 烧制叫料出库 - param.put("point_code2", point_code); // 终点 - SpringContextHolder.getBean(SzCallMaterialTask.class).createTask(param); - break; - case "8": - // 烧制送料入库 - param.put("point_code1", point_code); // 起点 - SpringContextHolder.getBean(SzSendMaterialTask.class).createTask(param); - break; - case "9": - // 分拣叫料出库 - param.put("point_code2", point_code); // 终点 - SpringContextHolder.getBean(FjCallMaterialTask.class).createTask(param); - break; - case "10": - // 分拣送钢托盘 - param.put("point_code1", point_code); // 起点 - SpringContextHolder.getBean(FjSendEmpVehicleTask.class).createTask(param); - break; - case "11": - // 分拣送料入库 - param.put("point_code1", point_code); // 起点 - SpringContextHolder.getBean(FjSendMaterialTask.class).createTask(param); - break; - case "12": - // 分拣呼叫木托盘 - param.put("point_code2", point_code); // 起点 - SpringContextHolder.getBean(FjCallEmptyVehicleTask.class).createTask(param); - break; - case "13": - // 叠盘区送空钢托盘 - param.put("point_code1", point_code); // 起点 - SpringContextHolder.getBean(DpSendEmpVehicleTask.class).createTask(param); + switch (regionEnum) { + case HNQ: + // 2.混碾机呼叫空托盘 + param.put("point_code2", point_code); // 终点 + // 创建任务 + SpringContextHolder.getBean(HnCallEmptyVehicleTask.class).createTask(param); + break; + case YZQ: + // 6.压制机呼叫空托盘 + param.put("point_code2", point_code); // 终点 + // 创建任务 + SpringContextHolder.getBean(YzjCallEmptyVehicleTask.class).createTask(param); + break; + case ZDCDX: + // 12.分拣呼叫木托盘 -- xxx + param.put("point_code2", point_code); // 起点 + SpringContextHolder.getBean(FjCallEmptyVehicleTask.class).createTask(param); + break; + default: + throw new BadRequestException("ACS任务类型错误"); + } break; + default: + throw new BadRequestException("ACS任务类型错误"); } return null; } @@ -349,6 +332,8 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { */ @Override public void manipulatorApply(JSONObject jsonObject) { + WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point"); + WQLObject groupTab = WQLObject.getWQLObject("st_buss_vehiclegroup"); //组盘 JSONObject produceInfoByCode = new JSONObject(); String device_code = (String) jsonObject.get("device_code"); // 对接位 @@ -358,99 +343,105 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { produceInfoByCode = this.getProduceInfoByCode(device_code); // 获取设备的 String material_id = (String) produceInfoByCode.get("material_id"); String cust_id = (String) produceInfoByCode.get("cust_id"); - String producetask_id = (String) produceInfoByCode.get("producetask_id"); - WQLObject.getWQLObject("st_buss_vehiclegroup").delete("vehicle_code ='" + vehicle_code + "'"); -// // 如果上报不了,则去点位上取(木托盘情况) -// if (StrUtil.equals("0", vehicle_code)) { -// vehicle_code = produceInfoByCode.getString("vehicle_code"); -// } - + String producetask_id = (String) produceInfoByCode.get("workorder_id"); + // 物料 JSONObject materialObj = WQLObject .getWQLObject("MD_ME_MaterialBase") - .query("material_id='" + material_id + "'") + .query("material_id = '" + material_id + "'") .uniqueResult(0); - JSONObject groubObj = new JSONObject(); - long nextId = IdUtil.getSnowflake(1, 1).nextId(); - groubObj.put("group_id", nextId); - groubObj.put("vehicle_code", vehicle_code); - groubObj.put("material_uuid", material_id); - groubObj.put("material_code", materialObj.getString("material_code")); - groubObj.put("material_name", materialObj.getString("material_name")); - groubObj.put("cust_id", cust_id); - groubObj.put("qty", qty); - groubObj.put("producetask_id", producetask_id); -// groubObj.put("AlongSide", jsonObject.get("AlongSide")); -// groubObj.put("BshortSide", jsonObject.get("BshortSide")); -// groubObj.put("Htrapezoidal", jsonObject.get("Htrapezoidal")); -// groubObj.put("Wthickness", jsonObject.get("Wthickness")); - groubObj.put("tray_qty", jsonObject.get("tray_qty")); - groubObj.put("crib_category", jsonObject.get("crib_category")); - groubObj.put("tray_high", jsonObject.get("tray_high")); - groubObj.put("palletX1_line", jsonObject.get("palletX1_line")); - groubObj.put("palletY1_row", jsonObject.get("palletY1_row")); - groubObj.put("palletA1_angle", jsonObject.get("palletA1_angle")); - groubObj.put("palletX2_line", jsonObject.get("palletX2_line")); - groubObj.put("palletY2_row", jsonObject.get("palletY2_row")); - groubObj.put("palletA2_angle", jsonObject.get("palletA2_angle")); - groubObj.put("palletX3_line", jsonObject.get("palletX3_line")); - groubObj.put("palletY3_row", jsonObject.get("palletY3_row")); - groubObj.put("pressCribX1_line", jsonObject.get("pressCribX1_line")); - groubObj.put("palletA3_angle", jsonObject.get("palletA3_angle")); - groubObj.put("pressCribY1_row", jsonObject.get("pressCribY1_row")); - groubObj.put("pressCribA1_angle", jsonObject.get("pressCribA1_angle")); - groubObj.put("pressCribX2_line", jsonObject.get("pressCribX2_line")); - groubObj.put("pressCribY2_row", jsonObject.get("pressCribY2_row")); - groubObj.put("pressCribA2_angle", jsonObject.get("pressCribA2_angle")); - groubObj.put("pressCribX3_line", jsonObject.get("pressCribX3_line")); - groubObj.put("pressCribY3_row", jsonObject.get("pressCribY3_row")); - groubObj.put("pressCribA3_angle", jsonObject.get("pressCribA3_angle")); - groubObj.put("Zoffset", jsonObject.get("Zoffset")); - groubObj.put("pallet_layerQty", jsonObject.get("pallet_layerQty")); - groubObj.put("pressCrib_layerQty", jsonObject.get("pressCrib_layerQty")); - groubObj.put("codeLayerX1_interval", jsonObject.get("codeLayerX1_interval")); - groubObj.put("codeLayerY1_interval", jsonObject.get("codeLayerY1_interval")); - groubObj.put("pressCrib_layerQty", jsonObject.get("pressCrib_layerQty")); - groubObj.put("codeLayerX2_interval", jsonObject.get("codeLayerX2_interval")); - groubObj.put("codeLayerY2_interval", jsonObject.get("codeLayerY2_interval")); - groubObj.put("codeLayerX3_interval", jsonObject.get("codeLayerX3_interval")); - groubObj.put("codeLayerY3_interval", jsonObject.get("codeLayerY3_interval")); - groubObj.put("codeLayerY1_offset", jsonObject.get("codeLayerY1_offset")); - groubObj.put("codeLayerX1_offset", jsonObject.get("codeLayerX1_offset")); - groubObj.put("codeLayerX3_interval", jsonObject.get("codeLayerX3_interval")); - groubObj.put("codeLayerX2_offset", jsonObject.get("codeLayerX2_offset")); - groubObj.put("codeLayerX3_offset", jsonObject.get("codeLayerX3_offset")); - groubObj.put("codeLayerY3_offset", jsonObject.get("codeLayerY3_offset")); - groubObj.put("pressLayerX1_interval", jsonObject.get("pressLayerX1_interval")); - groubObj.put("pressLayerY1_interval", jsonObject.get("pressLayerY1_interval")); - groubObj.put("pressLayerX2_interval", jsonObject.get("pressLayerX2_interval")); - groubObj.put("pressLayerY2_interval", jsonObject.get("pressLayerY2_interval")); - groubObj.put("pressLayerX3_interval", jsonObject.get("pressLayerX3_interval")); - groubObj.put("pressLayerY3_interval", jsonObject.get("pressLayerY3_interval")); - groubObj.put("pressLayerX1_offset", jsonObject.get("pressLayerX1_offset")); - groubObj.put("pressLayerY1_offset", jsonObject.get("pressLayerY1_offset")); - groubObj.put("pressLayerX2_offset", jsonObject.get("pressLayerX2_offset")); - groubObj.put("pressLayerY2_offset", jsonObject.get("pressLayerY2_offset")); - groubObj.put("pressLayerX3_offset", jsonObject.get("pressLayerX3_offset")); - groubObj.put("pressLayerY3_offset", jsonObject.get("pressLayerY3_offset")); - groubObj.put("one_cribTotal", jsonObject.get("one_cribTotal")); - groubObj.put("two_cribTotal", jsonObject.get("two_cribTotal")); - groubObj.put("one_qty", jsonObject.get("one_qty")); - groubObj.put("two_qty", jsonObject.get("two_qty")); - groubObj.put("tool_coordinate", jsonObject.get("tool_coordinate")); - groubObj.put("create_id", SecurityUtils.getCurrentUserId()); - groubObj.put("create_name", SecurityUtils.getCurrentNickName()); - groubObj.put("create_time", DateUtil.now()); - WQLObject.getWQLObject("st_buss_vehiclegroup").insert(groubObj); - jsonObject.put("group_id", nextId); // 组盘标识 - // 判断是分拣还是压制的送料入库 - if (device_code.startsWith("FJCD")) { - jsonObject.put("type", "11"); + // 机械手下料位 + JSONObject pointObj = pointTab.query("point_code = '" + device_code + "'").uniqueResult(0); + JSONObject groupObj = new JSONObject(); + if (ObjectUtil.isNotEmpty(pointObj.getString("group_id"))) { // 存在组盘id,表示是半托 + // 半托只需要修改参数即可 + groupObj = groupTab.query("group_id = '" + pointObj.getString("group_id") + "'").uniqueResult(0); + jsonObject.put("group_id", ObjectUtil.isNotEmpty(pointObj.getString("group_id"))); // 组盘标识 } else { - jsonObject.put("type", "5"); + long nextId = IdUtil.getSnowflake(1, 1).nextId(); + groupObj.put("group_id", nextId); + jsonObject.put("group_id", nextId); // 组盘标识 } - this.apply(jsonObject); + groupObj.put("vehicle_code", vehicle_code); + groupObj.put("material_uuid", material_id); + groupObj.put("material_code", materialObj.getString("material_code")); + groupObj.put("material_name", materialObj.getString("material_name")); + groupObj.put("cust_id", cust_id); + groupObj.put("qty", qty); + groupObj.put("producetask_id", producetask_id); + groupObj.put("tray_qty", jsonObject.get("tray_qty")); + groupObj.put("crib_category", jsonObject.get("crib_category")); + groupObj.put("tray_high", jsonObject.get("tray_high")); + groupObj.put("palletX1_line", jsonObject.get("palletX1_line")); + groupObj.put("palletY1_row", jsonObject.get("palletY1_row")); + groupObj.put("palletA1_angle", jsonObject.get("palletA1_angle")); + groupObj.put("palletX2_line", jsonObject.get("palletX2_line")); + groupObj.put("palletY2_row", jsonObject.get("palletY2_row")); + groupObj.put("palletA2_angle", jsonObject.get("palletA2_angle")); + groupObj.put("palletX3_line", jsonObject.get("palletX3_line")); + groupObj.put("palletY3_row", jsonObject.get("palletY3_row")); + groupObj.put("pressCribX1_line", jsonObject.get("pressCribX1_line")); + groupObj.put("palletA3_angle", jsonObject.get("palletA3_angle")); + groupObj.put("pressCribY1_row", jsonObject.get("pressCribY1_row")); + groupObj.put("pressCribA1_angle", jsonObject.get("pressCribA1_angle")); + groupObj.put("pressCribX2_line", jsonObject.get("pressCribX2_line")); + groupObj.put("pressCribY2_row", jsonObject.get("pressCribY2_row")); + groupObj.put("pressCribA2_angle", jsonObject.get("pressCribA2_angle")); + groupObj.put("pressCribX3_line", jsonObject.get("pressCribX3_line")); + groupObj.put("pressCribY3_row", jsonObject.get("pressCribY3_row")); + groupObj.put("pressCribA3_angle", jsonObject.get("pressCribA3_angle")); + groupObj.put("Zoffset", jsonObject.get("Zoffset")); + groupObj.put("pallet_layerQty", jsonObject.get("pallet_layerQty")); + groupObj.put("pressCrib_layerQty", jsonObject.get("pressCrib_layerQty")); + groupObj.put("codeLayerX1_interval", jsonObject.get("codeLayerX1_interval")); + groupObj.put("codeLayerY1_interval", jsonObject.get("codeLayerY1_interval")); + groupObj.put("pressCrib_layerQty", jsonObject.get("pressCrib_layerQty")); + groupObj.put("codeLayerX2_interval", jsonObject.get("codeLayerX2_interval")); + groupObj.put("codeLayerY2_interval", jsonObject.get("codeLayerY2_interval")); + groupObj.put("codeLayerX3_interval", jsonObject.get("codeLayerX3_interval")); + groupObj.put("codeLayerY3_interval", jsonObject.get("codeLayerY3_interval")); + groupObj.put("codeLayerY1_offset", jsonObject.get("codeLayerY1_offset")); + groupObj.put("codeLayerX1_offset", jsonObject.get("codeLayerX1_offset")); + groupObj.put("codeLayerX3_interval", jsonObject.get("codeLayerX3_interval")); + groupObj.put("codeLayerX2_offset", jsonObject.get("codeLayerX2_offset")); + groupObj.put("codeLayerX3_offset", jsonObject.get("codeLayerX3_offset")); + groupObj.put("codeLayerY3_offset", jsonObject.get("codeLayerY3_offset")); + groupObj.put("pressLayerX1_interval", jsonObject.get("pressLayerX1_interval")); + groupObj.put("pressLayerY1_interval", jsonObject.get("pressLayerY1_interval")); + groupObj.put("pressLayerX2_interval", jsonObject.get("pressLayerX2_interval")); + groupObj.put("pressLayerY2_interval", jsonObject.get("pressLayerY2_interval")); + groupObj.put("pressLayerX3_interval", jsonObject.get("pressLayerX3_interval")); + groupObj.put("pressLayerY3_interval", jsonObject.get("pressLayerY3_interval")); + groupObj.put("pressLayerX1_offset", jsonObject.get("pressLayerX1_offset")); + groupObj.put("pressLayerY1_offset", jsonObject.get("pressLayerY1_offset")); + groupObj.put("pressLayerX2_offset", jsonObject.get("pressLayerX2_offset")); + groupObj.put("pressLayerY2_offset", jsonObject.get("pressLayerY2_offset")); + groupObj.put("pressLayerX3_offset", jsonObject.get("pressLayerX3_offset")); + groupObj.put("pressLayerY3_offset", jsonObject.get("pressLayerY3_offset")); + groupObj.put("one_cribTotal", jsonObject.get("one_cribTotal")); + groupObj.put("two_cribTotal", jsonObject.get("two_cribTotal")); + groupObj.put("one_qty", jsonObject.get("one_qty")); + groupObj.put("two_qty", jsonObject.get("two_qty")); + groupObj.put("tool_coordinate", jsonObject.get("tool_coordinate")); + groupObj.put("create_id", SecurityUtils.getCurrentUserId()); + groupObj.put("create_name", SecurityUtils.getCurrentNickName()); + groupObj.put("create_time", DateUtil.now()); + if (ObjectUtil.isNotEmpty(pointObj.getString("group_id"))) { + groupTab.update(groupObj); + // 清除对接位的组盘标识 + pointObj.put("group_id", null); + pointTab.update(pointObj); + } else { + groupTab.insert(groupObj); + } + // 物料更新 + materialObj.put("AlongSide", jsonObject.get("AlongSide")); + materialObj.put("BshortSide", jsonObject.get("BshortSide")); + materialObj.put("Htrapezoidal", jsonObject.get("Htrapezoidal")); + materialObj.put("Wthickness", jsonObject.get("Wthickness")); + WQLObject.getWQLObject("MD_ME_MaterialBase").insert(materialObj); + // 入库 jsonObject.put("type", "1"); - this.apply((JSONObject) jsonObject); + this.apply(jsonObject); } /** @@ -466,21 +457,17 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { if (StrUtil.isEmpty(vehicle_code)) { throw new BadRequestException("托盘条码不能为空!"); } - // 组盘表 - JSONObject vehicleObj = WQLObject.getWQLObject("st_buss_vehiclegroup").query("vehicle_code='" + vehicle_code + "'").uniqueResult(0); + // 组盘表 - 对应的是钢托盘 + JSONObject vehicleObj = WQLObject.getWQLObject("st_buss_vehiclegroup").query("vehicle_code = '" + vehicle_code + "'", "create_time desc").uniqueResult(0); if (ObjectUtil.isEmpty(vehicleObj)) { throw new BadRequestException("未找到托盘号为'" + vehicle_code + "'的组盘信息!"); } // 获取工单 - String workorder_id = vehicleObj.getString("producetask_id"); + String workorder_id = vehicleObj.getString("producetask_id"); // workorder_id JSONObject taskObj = WQLObject.getWQLObject("PDM_BD_WorkOrder").query("workorder_id='" + workorder_id + "'").uniqueResult(0); //1代表去出窑,2 是优先包装 - String is_package = "1"; - if (StrUtil.equals(taskObj.getString("is_package"), "1")) { - is_package = "2"; - } JSONObject returnjo = new JSONObject(); - returnjo.put("is_package", is_package); + returnjo.put("is_package", taskObj.getString("is_package")); return returnjo; } @@ -629,9 +616,49 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { String vehicle_code = whereJson.getString("vehicle_code"); JSONObject rywPoint = pointTab.query("point_code = 'RYW'").uniqueResult(0); String group_id = rywPoint.getString("group_id"); + if (ObjectUtil.isEmpty(group_id)) return; JSONObject group = groupTab.query("group_id = '" + group_id + "'").uniqueResult(0); group.put("vehicle_code", vehicle_code); + group.put("create_time", DateUtil.now()); groupTab.update(group); + // 清理点位 + rywPoint.put("group_id", null); + pointTab.update(rywPoint); + } + + /** + * 根据设备编码获取托盘信息 + * + * @param jsonObject 条件 + * @return Map + */ + @Override + public Map getVehicleInfoByDeviceCode(Map jsonObject) { + WQLObject groupTab = WQLObject.getWQLObject("st_buss_vehiclegroup"); + WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point"); + WQLObject materialTab = WQLObject.getWQLObject("MD_ME_MaterialBase"); + String point_code = (String) jsonObject.get("device_code"); + JSONObject point = pointTab.query("point_code = '" + point_code + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(point)) throw new BadRequestException("未找到点位编码为'"+ point_code +"'的点位信息"); + String group_id = point.getString("group_id"); + JSONObject vehicleObj = groupTab.query("group_id = '" + group_id + "' AND is_delete='0'").uniqueResult(0); + if (ObjectUtil.isEmpty(vehicleObj)){ + throw new BadRequestException("未找到组盘信息"); + } + // 还需要返回砖型 + String material_id = point.getString("material_id"); + JSONObject materialObj = materialTab.query("material_id = '" + material_id + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(materialObj)) { + vehicleObj.put("AlongSide", materialObj.get("AlongSide")); + vehicleObj.put("BshortSide", materialObj.get("BshortSide")); + vehicleObj.put("Htrapezoidal", materialObj.get("Htrapezoidal")); + vehicleObj.put("Wthickness", materialObj.get("Wthickness")); + } + JSONObject result = new JSONObject(); + result.put("status", HttpStatus.OK.value()); + result.put("message", "反馈成功!"); + result.put("data", vehicleObj); + return result; } private JSONObject getProduceInfoByCode(String code) { // 查找工单 diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/WmsToAcsServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/WmsToAcsServiceImpl.java index 9c28278..fbf2142 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/WmsToAcsServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/WmsToAcsServiceImpl.java @@ -54,4 +54,10 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { return AcsUtil.notifyAcs(api, whereJson); } + @Override + public JSONObject getTray(JSONArray whereJson) { + String api = "api/wms/queryTray"; + return AcsUtil.notifyAcs(api, whereJson); + } + } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/RegionEnum.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/RegionEnum.java index 1120e52..c41ade8 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/RegionEnum.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/RegionEnum.java @@ -1,5 +1,6 @@ package org.nl.wms.sch.manage; +import cn.hutool.core.util.StrUtil; import lombok.AllArgsConstructor; import lombok.Getter; @@ -30,4 +31,13 @@ public enum RegionEnum { private String id; private String code; private String name; + + public static RegionEnum get(String id) { + for (RegionEnum regionEnum : RegionEnum.values()) { + if (StrUtil.equals(regionEnum.id, id)) { + return regionEnum; + } + } + return null; + } } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/RegionIOEnum.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/RegionIOEnum.java index 04969a8..63b083e 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/RegionIOEnum.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/RegionIOEnum.java @@ -17,7 +17,10 @@ public enum RegionIOEnum { CREATE_MODE_PC("1", "PC产生"), CREATE_MODE_ACS("2", "ACS申请"), CREATE_MODE_PDA("3", "手持创建"), - CREATE_MODE_INTERFACE("4", "外部接口产生"); + CREATE_MODE_INTERFACE("4", "外部接口产生"), + // 计量单位 + UNIT_ID_B("1", "块"), + UNIT_ID_T("2", "吨"); private final String code; private final String name; 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 9a97af1..5ae69da 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 @@ -19,6 +19,7 @@ import org.nl.wms.sch.service.PointService; import org.nl.wms.sch.service.RegionService; import org.nl.wms.sch.service.dto.PointDto; import org.nl.wms.sch.service.dto.RegionDto; +import org.nl.wms.sch.tasks.PointUpdateUtil; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -167,15 +168,16 @@ public class PointServiceImpl implements PointService { String pointStatus = dto.getPoint_status(); if (ObjectUtil.isNotEmpty(pointStatus) && pointStatus.equals("1")) { // 空位 - dto.setMaterial_id(""); - dto.setVehicle_type(""); - dto.setVehicle_code(""); - dto.setVehicle_qty(""); - dto.setPcsn(""); - dto.setTask_id(null); - dto.setIvt_qty(BigDecimal.valueOf(0)); - dto.setInstorage_time(null); - dto.setStanding_time(BigDecimal.valueOf(0)); +// dto.setMaterial_id(""); +// dto.setVehicle_type(""); +// dto.setVehicle_code(""); +// dto.setVehicle_qty(""); +// dto.setPcsn(""); +// dto.setTask_id(null); +// dto.setIvt_qty(BigDecimal.valueOf(0)); +// dto.setInstorage_time(null); +// dto.setStanding_time(BigDecimal.valueOf(0)); + PointUpdateUtil.clearPoint(dto.getPoint_code()); } else if (pointStatus.equals("2")) { // 空载具 dto.setMaterial_id(null); dto.setInstorage_time(now); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/PointUpdateUtil.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/PointUpdateUtil.java index 2759a9b..61bc4d0 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/PointUpdateUtil.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/PointUpdateUtil.java @@ -1,8 +1,14 @@ package org.nl.wms.sch.tasks; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.wms.ext.acs.service.WmsToAcsService; +import org.nl.wms.ext.acs.service.impl.WmsToAcsServiceImpl; import org.nl.wms.sch.manage.PointEnum; /** @@ -11,7 +17,6 @@ import org.nl.wms.sch.manage.PointEnum; * @Date: 2022/11/23 */ public class PointUpdateUtil { - /** * 清理点位 */ @@ -55,4 +60,33 @@ public class PointUpdateUtil { pointObj.put("standing_time", "0"); pointTab.update(pointObj); } + + /** + * 访问acs获取点位数据更新点位信息: + * 分拣呼叫空托盘、空钢托盘叠盘架 + * @param pointCodes + * @deprecated 只更新点位状态和载具类型 + */ + public static void updatePoint(JSONArray pointCodes) { + WQLObject pointTable = WQLObject.getWQLObject("sch_base_point"); + WmsToAcsServiceImpl wmsToAcsService = new WmsToAcsServiceImpl(); + // 向ACS查询点位状态 + JSONObject pointStatus = wmsToAcsService.getPointStatus(pointCodes); + // 找到对应的载具类型再去下发 + JSONArray deviceDatas = pointStatus.getJSONArray("data"); + for (int j = 0; j < deviceDatas.size(); j++) { + JSONObject pointObj = deviceDatas.getJSONObject(j); + String mode = pointObj.getString("mode"); // 工作状态:0脱机,其他正常 + String error = pointObj.getString("error"); // 0是正常 + if (mode.equals("0") || !error.equals("0")) continue; // 点位异常 + String point_status = pointObj.getString("move"); // 点位状态:0无货,1有货(具体是空载具还是物料不知道) + String point_code = pointObj.getString("device_code"); + //将托盘类型456.... + String vehicle_type = pointObj.getString("container_type"); + JSONObject pointObj2 = pointTable.query("point_code = '" + point_code + "'").uniqueResult(0); + pointObj2.put("point_status", Integer.parseInt(point_status) + 1); // 1空位, 2空载具 + pointObj2.put("vehicle_type", vehicle_type); + pointTable.update(pointObj2); + } + } } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/SzCallMaterialTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/autoCallMaterial/RykCallMaterialTask.java similarity index 78% rename from lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/SzCallMaterialTask.java rename to lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/autoCallMaterial/RykCallMaterialTask.java index 20ca49e..8b3d3c3 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/SzCallMaterialTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/autoCallMaterial/RykCallMaterialTask.java @@ -1,4 +1,4 @@ -package org.nl.wms.sch.tasks.callMaterial; +package org.nl.wms.sch.tasks.autoCallMaterial; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; @@ -6,8 +6,6 @@ import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.nl.modules.common.exception.BadRequestException; import org.nl.modules.common.utils.SecurityUtils; import org.nl.modules.system.util.CodeUtil; @@ -18,21 +16,18 @@ import org.nl.wms.sch.manage.*; import org.nl.wms.sch.tasks.AcsTaskDto; import org.nl.wms.sch.tasks.PointUpdateUtil; import org.nl.wms.util.IdUtil; -import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.List; /** * @author: lyd - * @description: 烧制工序叫料 - 入窑位 - * @Date: 2022/11/10 + * @description: 入窑缓存自动送料 + * @Date: 2022/11/24 */ -@Service -@RequiredArgsConstructor -@Slf4j -public class SzCallMaterialTask extends AbstractAcsTask { - private final String THIS_CLASS = SzCallMaterialTask.class.getName(); +public class RykCallMaterialTask extends AbstractAcsTask { + private final String THIS_CLASS = RykCallMaterialTask.class.getName(); /** * 添加任务进行下发 * @@ -79,6 +74,7 @@ public class SzCallMaterialTask extends AbstractAcsTask { String task_id = task.getString("task_id"); JSONObject taskObj = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); + String point_code2 = taskObj.getString("point_code2"); // 物料点 JSONObject material_point = pointTab.query("point_code = '" + taskObj.getString("point_code1") + "'").uniqueResult(0); //任务取消 @@ -112,7 +108,7 @@ public class SzCallMaterialTask extends AbstractAcsTask { taskObj.put("update_time", DateUtil.now()); taskTab.update(taskObj); - JSONObject requestObj = task.getJSONObject("request_param"); + if (ObjectUtil.isEmpty(material_point)) return; //区域出入表【st_ivt_regionIO】 WQLObject regionIoTab = WQLObject.getWQLObject("st_ivt_regionIO"); @@ -126,10 +122,11 @@ public class SzCallMaterialTask extends AbstractAcsTask { regionIoObj.put("region_name", material_point.getString("region_name")); regionIoObj.put("material_id", taskObj.getString("material_id")); regionIoObj.put("vehicle_code", taskObj.getString("vehicle_code")); - regionIoObj.put("qty", requestObj.getString("qty")); + regionIoObj.put("qty", material_point.getString("qty")); + regionIoObj.put("ivt_weight", material_point.getString("weight")); regionIoObj.put("bill_status", RegionIOEnum.BILL_STATUS_FINISH.getCode()); regionIoObj.put("start_point_code", taskObj.getString("point_code1")); - regionIoObj.put("end_point_code", taskObj.getString("point_code2")); + regionIoObj.put("end_point_code", point_code2); regionIoObj.put("create_mode", RegionIOEnum.CREATE_MODE_ACS.getCode()); regionIoObj.put("pcsn", DateUtil.format(DateUtil.parse(DateUtil.today()), "yyyyMMdd")); regionIoObj.put("create_id", SecurityUtils.getCurrentUserId()); @@ -137,12 +134,50 @@ public class SzCallMaterialTask extends AbstractAcsTask { regionIoObj.put("create_time", DateUtil.now()); regionIoTab.insert(regionIoObj); - //完成后 + /** + * 完成后将组盘id和任务id赋值到入窑口 + */ + JSONObject uniqueResult = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); + uniqueResult.put("group_id", material_point.getString("group_id")); + uniqueResult.put("task_id", material_point.getString("task_id")); + pointTab.update(uniqueResult); // 物料点位解锁 并设置空位 PointUpdateUtil.clearPoint(material_point.getString("point_code")); } } + /** + * 自动生成任务 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void autoCreate() { + String point_code2 = "RYW"; + //任务表【SCH_BASE_Task】 + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + //点位基础表【SCH_BASE_Point】 + WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point"); + //判断当前点是否有未完成的任务 + JSONObject taskObj = taskTab.query("is_delete='0' and point_code2 = '" + point_code2 + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(taskObj)) return; + JSONObject object = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(object.getString("group_id"))) return; + // todo 判断是否有货 + SchTaskDto dto = SchTaskDto.builder() + .task_id(IdUtil.getLongId()) + .task_code(CodeUtil.getNewCode("TASK_CODE")) + .task_type("task_type") + .task_name("烧制出库") + .task_status(TaskStatusEnum.SURE_END.getCode()) + .point_code2(point_code2) + .vehicle_type(PointEnum.VEHICLE_TYPE_STEEL_TRAY.getCode()) + .handle_class(THIS_CLASS) + .create_time(DateUtil.now()) + .build(); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + taskTab.insert(json); + } + /** * @param form 创建任务需要的参数 * @return 返回任务标识 @@ -150,9 +185,7 @@ public class SzCallMaterialTask extends AbstractAcsTask { @Override public String createTask(JSONObject form) { String point_code2 = form.getString("point_code2"); - String vehicle_type = form.getString("vehicle_type"); - String vehicle_code = form.getString("vehicle_code"); - String qty = form.getString("material_num"); + String qty = form.getString("qty"); //生产工单表【PDM_BD_WorkOrder】 WQLObject workOrderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder"); @@ -175,10 +208,9 @@ public class SzCallMaterialTask extends AbstractAcsTask { .material_qty(qty) .task_status(TaskStatusEnum.SURE_END.getCode()) .point_code2(point_code2) - .vehicle_code(vehicle_code) .workorder_id(workOrderObj.getLong("workorder_id")) .material_id(workOrderObj.getLong("material_id")) - .vehicle_type(vehicle_type) + .vehicle_type(PointEnum.VEHICLE_TYPE_STEEL_TRAY.getCode()) .handle_class(THIS_CLASS) .create_time(DateUtil.now()) .request_param(form.toJSONString()) @@ -199,6 +231,7 @@ public class SzCallMaterialTask extends AbstractAcsTask { */ @Override public void findStartPoint() { + // 到入窑缓存区找一托物料 WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); // 点位表 @@ -206,14 +239,12 @@ public class SzCallMaterialTask extends AbstractAcsTask { for (int i = 0; i < taskArr.size(); i++) { JSONObject taskObj = taskArr.getJSONObject(i); String material_id = taskObj.getString("material_id"); - String vehicle_type = taskObj.getString("vehicle_type"); JSONObject queryParam = new JSONObject(); queryParam.put("flag", "1"); queryParam.put("material_id", material_id); queryParam.put("region_code", "RYZCQ"); - queryParam.put("vehicle_type", "%" + vehicle_type + "%"); // 到入窑暂存区找,优先找满拖的 - JSONObject json1 = WQL.getWO("QSCH_szCallMaterial_01").addParamMap(queryParam).process().uniqueResult(0); + JSONObject json1 = WQL.getWO("QSCH_rykCallMaterial_01").addParamMap(queryParam).process().uniqueResult(0); if (ObjectUtil.isNotEmpty(json1)) { // 拿到点位 JSONObject material_point = pointTab.query("point_id = '" + json1.getString("point_id") + "' and lock_type = '1'").uniqueResult(0); @@ -223,8 +254,9 @@ public class SzCallMaterialTask extends AbstractAcsTask { pointTab.update(material_point); taskObj.put("point_code1", material_point.getString("point_code")); + taskObj.put("material_id", material_point.getString("material_id")); taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); - taskObj.put("acs_task_type", "2"); + taskObj.put("task_id", taskObj.getString("task_id")); taskObj.put("update_time", DateUtil.now()); taskTab.update(taskObj); } else { @@ -247,11 +279,8 @@ public class SzCallMaterialTask extends AbstractAcsTask { public void forceFinish(String task_id) { WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); - if (ObjectUtil.isNotEmpty(taskObj)) - this.updateTaskStatus(taskObj,"2"); - else { - throw new BadRequestException("未找到该任务或者任务已完成!"); - } + if (ObjectUtil.isEmpty(taskObj))throw new BadRequestException("未找到该任务或者任务已完成!"); + this.updateTaskStatus(taskObj, UpdateTaskStatusEnum.FORCEFINISH.getCode()); } /** diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/wql/QSCH_szCallMaterial_01.wql b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/autoCallMaterial/wql/QSCH_rykCallMaterial_01.wql similarity index 89% rename from lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/wql/QSCH_szCallMaterial_01.wql rename to lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/autoCallMaterial/wql/QSCH_rykCallMaterial_01.wql index d91c3f6..fa0caf3 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/wql/QSCH_szCallMaterial_01.wql +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/autoCallMaterial/wql/QSCH_rykCallMaterial_01.wql @@ -1,5 +1,5 @@ [交易说明] - 交易名: 烧制叫料 + 交易名: 入窑口自动任务 - 叫料 所属模块: 功能简述: 版权所有: @@ -56,16 +56,13 @@ AND is_delete = '0' AND lock_type = '1' AND point_status = '3' + AND is_full = '1' OPTION 输入.material_id <> "" p.material_id = 输入.material_id ENDOPTION OPTION 输入.region_code <> "" p.region_code = 输入.region_code ENDOPTION - OPTION 输入.vehicle_type <> "" - p.can_vehicle_type like 输入.vehicle_type - ENDOPTION - ORDER BY is_full desc ENDSELECT ENDQUERY ENDIF diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/FjCallEmptyVehicleTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/FjCallEmptyVehicleTask.java index 325859b..b7dad73 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/FjCallEmptyVehicleTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/FjCallEmptyVehicleTask.java @@ -19,6 +19,7 @@ import org.nl.wms.sch.manage.RegionIOEnum; import org.nl.wms.sch.manage.TaskStatusEnum; import org.nl.wms.sch.manage.UpdateTaskStatusEnum; import org.nl.wms.sch.tasks.AcsTaskDto; +import org.nl.wms.sch.tasks.PointUpdateUtil; import org.nl.wms.util.IdUtil; import org.springframework.stereotype.Service; @@ -125,21 +126,9 @@ public class FjCallEmptyVehicleTask extends AbstractAcsTask { regionIoObj.put("create_time", DateUtil.now()); regionIoTab.insert(regionIoObj); // 点位更新,起点:空位,解锁; - startPoint.put("point_status", "1"); + PointUpdateUtil.clearPoint(startPoint.getString("point_code")); + } else { // 钢托盘每次就一个 startPoint.put("lock_type", "1"); - startPoint.put("task_id", ""); - startPoint.put("pcsn", ""); - startPoint.put("ivt_qty", "0"); - startPoint.put("material_id", ""); - startPoint.put("instorage_time", ""); - startPoint.put("is_full", "2"); - startPoint.put("standing_time", "0"); - startPoint.put("vehicle_type", ""); - startPoint.put("vehicle_code", ""); - } else { // 钢托盘每次就一个 --- 如果是堆叠位5需要更新设备状态?? - startPoint.put("point_status", "1"); - startPoint.put("lock_type", "1"); - startPoint.put("vehicle_qty", "0"); } pointTab.update(startPoint); } @@ -162,9 +151,7 @@ public class FjCallEmptyVehicleTask extends AbstractAcsTask { String point_code2 = form.getString("point_code2"); - String sub_device_code = point_code2.substring(0, point_code2.indexOf("_")); - - String device_code = pointTab.query("point_code = '" + sub_device_code + "'").uniqueResult(0).getString("device_code"); + String device_code = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0).getString("device_code"); JSONObject workOrderObj = workOrderTab.query("device_code = '" + device_code + "' and order_status = '3' and is_delete ='0'").uniqueResult(0); if (ObjectUtil.isEmpty(workOrderObj)) throw new BadRequestException("该设备当前未生产或者已删除"); @@ -182,6 +169,7 @@ public class FjCallEmptyVehicleTask extends AbstractAcsTask { .task_group_id(org.nl.wms.util.IdUtil.getLongId()) .handle_class(THIS_CLASS) .create_time(DateUtil.now()) + .request_param(form.toJSONString()) .build(); JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); taskTab.insert(json); @@ -215,6 +203,7 @@ public class FjCallEmptyVehicleTask extends AbstractAcsTask { if (ObjectUtil.isNotEmpty(noFullPoint)) { // 找到半满托盘,叫料出库 taskObj.put("update_time", DateUtil.now()); taskObj.put("point_code1", noFullPoint.getString("point_code")); + taskObj.put("group_id", noFullPoint.getString("group_id")); // 组盘信息挪到任务中 taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); taskTab.update(taskObj); @@ -223,6 +212,7 @@ public class FjCallEmptyVehicleTask extends AbstractAcsTask { noFullPoint.put("lock_type", "2"); pointTab.update(noFullPoint); } else { // 没有就呼叫空的木托盘 + // todo JSONObject param = new JSONObject(); param.put("flag", "2"); param.put("region_code", "BZZCQ"); @@ -258,11 +248,8 @@ public class FjCallEmptyVehicleTask extends AbstractAcsTask { public void forceFinish(String task_id) { WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); - if (ObjectUtil.isNotEmpty(taskObj)) - this.updateTaskStatus(taskObj,"2"); - else { - throw new BadRequestException("未找到该任务或者任务已完成!"); - } + if (ObjectUtil.isEmpty(taskObj))throw new BadRequestException("未找到该任务或者任务已完成!"); + this.updateTaskStatus(taskObj, UpdateTaskStatusEnum.FORCEFINISH.getCode()); } /** diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/HnCallEmptyVehicleTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/HnCallEmptyVehicleTask.java index 35e0bc8..f613220 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/HnCallEmptyVehicleTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/HnCallEmptyVehicleTask.java @@ -233,16 +233,10 @@ public class HnCallEmptyVehicleTask extends AbstractAcsTask { */ @Override public void forceFinish(String task_id) { - /* - * 强制完成 - */ WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); - if (ObjectUtil.isNotEmpty(taskObj)) - this.updateTaskStatus(taskObj,UpdateTaskStatusEnum.FORCEFINISH.getCode()); - else { - throw new BadRequestException("未找到该任务或者任务已完成!"); - } + if (ObjectUtil.isEmpty(taskObj))throw new BadRequestException("未找到该任务或者任务已完成!"); + this.updateTaskStatus(taskObj, UpdateTaskStatusEnum.FORCEFINISH.getCode()); } /** diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/YzjCallEmptyVehicleTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/YzjCallEmptyVehicleTask.java index 4635593..1ff8364 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/YzjCallEmptyVehicleTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/YzjCallEmptyVehicleTask.java @@ -85,6 +85,7 @@ public class YzjCallEmptyVehicleTask extends AbstractAcsTask { JSONObject taskObj = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); String point_code1 = task.getString("point_code1"); + String point_code2 = task.getString("point_code2"); if (StrUtil.equals(status, UpdateTaskStatusEnum.CANCEL.getCode())) { /* @@ -97,7 +98,7 @@ public class YzjCallEmptyVehicleTask extends AbstractAcsTask { taskObj.put("update_time", DateUtil.now()); taskObj.put("remark", "已取消"); taskTab.update(taskObj); - if (ObjectUtil.isNotEmpty(point_code1) && !point_code1.equals("KGTDDW05")) { + if (ObjectUtil.isNotEmpty(point_code1)) { JSONObject startPoint = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0); startPoint.put("lock_type", PointEnum.LOCK_TYPE_FALSE.getCode()); pointTab.update(startPoint); @@ -121,9 +122,9 @@ public class YzjCallEmptyVehicleTask extends AbstractAcsTask { taskObj.put("update_optname", SecurityUtils.getCurrentUsername()); taskObj.put("update_time", DateUtil.now()); taskTab.update(taskObj); - JSONObject startPoint = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0); - if (point_code1.startsWith("R")) { // 入窑缓存位 + if (ObjectUtil.isEmpty(startPoint)) return; + if (point_code1.startsWith("R")) { // 入窑缓存位 - 半托出库 // 插入出库单 JSONObject regionIoObj = new JSONObject(); regionIoObj.put("iostorinv_id", IdUtil.getLongId()); @@ -136,6 +137,7 @@ public class YzjCallEmptyVehicleTask extends AbstractAcsTask { regionIoObj.put("material_id", taskObj.getString("material_id")); regionIoObj.put("vehicle_code", taskObj.getString("vehicle_code")); regionIoObj.put("qty", requestObj.getString("qty")); + regionIoObj.put("weight_unit_id", RegionIOEnum.UNIT_ID_B.getCode()); regionIoObj.put("bill_status", RegionIOEnum.BILL_STATUS_FINISH.getCode()); regionIoObj.put("start_point_code", taskObj.getString("point_code1")); regionIoObj.put("end_point_code", taskObj.getString("point_code2")); @@ -147,7 +149,14 @@ public class YzjCallEmptyVehicleTask extends AbstractAcsTask { regionIoTab.insert(regionIoObj); // 点位更新,起点:空位,解锁; PointUpdateUtil.clearPoint(startPoint.getString("point_code")); + // 终点:压制机对接位,将半托的组盘id放进去 + JSONObject endPoint = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); + endPoint.put("group_id", taskObj.getString("group_id")); + pointTab.update(endPoint); } + // 起点解锁 + startPoint.put("lock_type", PointEnum.LOCK_TYPE_FALSE.getCode()); + pointTab.update(startPoint); } } @@ -224,6 +233,7 @@ public class YzjCallEmptyVehicleTask extends AbstractAcsTask { JSONObject noFullPoint = WQL.getWO("QSCH_yzjCallEmptyVehicle_01").addParamMap(noFull).process().uniqueResult(0); if (ObjectUtil.isNotEmpty(noFullPoint)) { // 找到半满托盘,叫料出库 taskObj.put("update_time", DateUtil.now()); + taskObj.put("group_id", noFullPoint.getString("group_id")); // 组盘信息挪到任务中 taskObj.put("point_code1", noFullPoint.getString("point_code")); taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); taskTab.update(taskObj); @@ -233,7 +243,13 @@ public class YzjCallEmptyVehicleTask extends AbstractAcsTask { noFullPoint.put("lock_type", PointEnum.LOCK_TYPE_TRUE.getCode()); pointTab.update(noFullPoint); } else { // 到KGTDDW05找空钢托盘 + // 访问acs更新点位状态 // 向ACS查询是否有空钢托盘 + JSONArray params = new JSONArray(); + JSONObject deviceCode = new JSONObject(); + deviceCode.put("device_code", "KGTDDW05"); + params.add(deviceCode); + PointUpdateUtil.updatePoint(params); JSONObject param = new JSONObject(); param.put("flag", "2"); param.put("region_code", "KGTCPQ"); @@ -269,11 +285,8 @@ public class YzjCallEmptyVehicleTask extends AbstractAcsTask { public void forceFinish(String task_id) { WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); - if (ObjectUtil.isNotEmpty(taskObj)) - this.updateTaskStatus(taskObj,"2"); - else { - throw new BadRequestException("未找到该任务或者任务已完成!"); - } + if (ObjectUtil.isEmpty(taskObj))throw new BadRequestException("未找到该任务或者任务已完成!"); + this.updateTaskStatus(taskObj, UpdateTaskStatusEnum.FORCEFINISH.getCode()); } /** @@ -285,10 +298,7 @@ public class YzjCallEmptyVehicleTask extends AbstractAcsTask { public void cancel(String task_id) { WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); - if (ObjectUtil.isNotEmpty(taskObj)) - this.updateTaskStatus(taskObj,"0"); - else { - throw new BadRequestException("未找到该任务或者任务已完成!"); - } + if (ObjectUtil.isEmpty(taskObj))throw new BadRequestException("未找到该任务或者任务已完成!"); + this.updateTaskStatus(taskObj, UpdateTaskStatusEnum.CANCEL.getCode()); } } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/wql/QSCH_fjCallEmptyVehicle_01.wql b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/wql/QSCH_fjCallEmptyVehicle_01.wql index 5c66b1f..47bc055 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/wql/QSCH_fjCallEmptyVehicle_01.wql +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callEmpty/wql/QSCH_fjCallEmptyVehicle_01.wql @@ -52,13 +52,13 @@ lock_type = '1' AND is_used = '1' AND is_delete = '0' - AND is_full = '2' + AND is_full = '0' AND point_status = '3' AND point_type = '1' OPTION 输入.region_code <> "" p.region_code = 输入.region_code ENDOPTION - ORDER BY col_num,row_num,layer_num + ORDER BY instorage_time desc ENDSELECT ENDQUERY ENDIF diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/FjCallMaterialTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/FjCallMaterialTask.java index f4dad83..6c5b21e 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/FjCallMaterialTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/FjCallMaterialTask.java @@ -14,9 +14,9 @@ import org.nl.modules.system.util.CodeUtil; import org.nl.modules.wql.WQL; import org.nl.modules.wql.core.bean.WQLObject; import org.nl.wms.sch.SchTaskDto; -import org.nl.wms.sch.manage.AbstractAcsTask; -import org.nl.wms.sch.manage.TaskStatusEnum; +import org.nl.wms.sch.manage.*; import org.nl.wms.sch.tasks.AcsTaskDto; +import org.nl.wms.sch.tasks.PointUpdateUtil; import org.nl.wms.util.IdUtil; import org.springframework.stereotype.Service; @@ -82,7 +82,7 @@ public class FjCallMaterialTask extends AbstractAcsTask { // 物料点 JSONObject material_point = pointTab.query("point_code = '" + taskObj.getString("point_code1") + "'").uniqueResult(0); //任务取消 - if (StrUtil.equals(status, "0")) { + if (StrUtil.equals(status, UpdateTaskStatusEnum.CANCEL.getCode())) { // 取消删除任务 if (StrUtil.equals(taskObj.getString("task_status"), TaskStatusEnum.FINISHED.getCode())) { throw new BadRequestException("已完成不能取消!"); @@ -93,12 +93,12 @@ public class FjCallMaterialTask extends AbstractAcsTask { if (ObjectUtil.isNotEmpty(material_point)) { // 点位解锁 - material_point.put("lock_type", "1"); + material_point.put("lock_type", PointEnum.LOCK_TYPE_FALSE.getCode()); pointTab.update(material_point); } } - if ("1".equals(status)) { + if (UpdateTaskStatusEnum.EXECUTION.getCode().equals(status)) { // 更新任务状态为执行中 taskObj.put("task_status", TaskStatusEnum.EXECUTING.getCode()); taskObj.put("update_time", DateUtil.now()); @@ -106,7 +106,7 @@ public class FjCallMaterialTask extends AbstractAcsTask { taskTab.update(taskObj); } - if (StrUtil.equals(status, "2")) { + if (StrUtil.equals(status, UpdateTaskStatusEnum.FORCEFINISH.getCode())) { // 更改任务状态为完成 taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); taskObj.put("update_time", DateUtil.now()); @@ -120,37 +120,28 @@ public class FjCallMaterialTask extends AbstractAcsTask { regionIoObj.put("iostorinv_id", IdUtil.getLongId()); regionIoObj.put("bill_code", CodeUtil.getNewCode("IN_STORE_CODE")); regionIoObj.put("buss_date", DateUtil.today()); - regionIoObj.put("io_type", "2"); // 出库 + regionIoObj.put("io_type", RegionIOEnum.IO_TYPE_OUT.getCode()); // 出库 regionIoObj.put("region_id", material_point.getString("region_id")); regionIoObj.put("region_code", material_point.getString("region_code")); regionIoObj.put("region_name", material_point.getString("region_name")); regionIoObj.put("material_id", taskObj.getString("material_id")); regionIoObj.put("vehicle_code", taskObj.getString("vehicle_code")); regionIoObj.put("qty", requestObj.getString("qty")); - regionIoObj.put("bill_status", "3"); + regionIoObj.put("weight_unit_id", RegionIOEnum.UNIT_ID_B.getCode()); + regionIoObj.put("bill_status", RegionIOEnum.BILL_STATUS_FINISH.getCode()); regionIoObj.put("start_point_code", taskObj.getString("point_code1")); regionIoObj.put("end_point_code", taskObj.getString("point_code2")); - regionIoObj.put("create_mode", "2"); + regionIoObj.put("create_mode", RegionIOEnum.CREATE_MODE_ACS.getCode()); regionIoObj.put("pcsn", DateUtil.format(DateUtil.parse(DateUtil.today()), "yyyyMMdd")); regionIoObj.put("create_id", SecurityUtils.getCurrentUserId()); regionIoObj.put("create_name", SecurityUtils.getCurrentNickName()); regionIoObj.put("create_time", DateUtil.now()); + regionIoObj.put("task_id", taskObj.getString("task_id")); regionIoTab.insert(regionIoObj); //完成后 // 物料点位解锁 并设置空位 - material_point.put("lock_type", "1"); - material_point.put("point_status", "1"); - material_point.put("task_id", ""); - material_point.put("pcsn", ""); - material_point.put("ivt_qty", "0"); - material_point.put("material_id", ""); - material_point.put("instorage_time", ""); - material_point.put("is_full", "2"); - material_point.put("standing_time", "0"); - material_point.put("vehicle_type", ""); - material_point.put("vehicle_code", ""); - pointTab.update(material_point); + PointUpdateUtil.clearPoint(material_point.getString("point_code")); } } @@ -161,16 +152,14 @@ public class FjCallMaterialTask extends AbstractAcsTask { @Override public String createTask(JSONObject form) { String point_code2 = form.getString("point_code2"); - String vehicle_type = form.getString("vehicle_type"); - String vehicle_code = form.getString("vehicle_code"); - String qty = form.getString("material_num"); + String qty = form.getString("qty"); //生产工单表【PDM_BD_WorkOrder】 WQLObject workOrderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder"); //任务表【SCH_BASE_Task】 WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); //判断当前点是否有未完成的任务 - JSONObject taskObj = taskTab.query("is_delete='0' and point_code2 = '" + point_code2 + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0); + JSONObject taskObj = taskTab.query("is_delete = '0' and point_code2 = '" + point_code2 + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0); if (ObjectUtil.isNotEmpty(taskObj)) throw new BadRequestException("当前点位" + point_code2 + "存在未完成的任务"); //点位基础表【SCH_BASE_Point】 WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point"); @@ -186,10 +175,9 @@ public class FjCallMaterialTask extends AbstractAcsTask { .material_qty(qty) .task_status(TaskStatusEnum.SURE_END.getCode()) .point_code2(point_code2) - .vehicle_code(vehicle_code) .workorder_id(workOrderObj.getLong("workorder_id")) .material_id(workOrderObj.getLong("material_id")) - .vehicle_type(vehicle_type) + .vehicle_type(PointEnum.VEHICLE_TYPE_STEEL_TRAY.getCode()) .handle_class(THIS_CLASS) .create_time(DateUtil.now()) .request_param(form.toJSONString()) @@ -213,16 +201,15 @@ public class FjCallMaterialTask extends AbstractAcsTask { // 到出窑缓存区找一托物料 WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); // 点位表 + WQLObject groupTab = WQLObject.getWQLObject("st_buss_vehiclegroup"); // 组盘表 JSONArray taskArr = taskTab.query("handle_class = '" + THIS_CLASS + "'and is_delete = '0' and task_status = '" + TaskStatusEnum.SURE_END.getCode() + "'").getResultJSONArray(0); for (int i = 0; i < taskArr.size(); i++) { JSONObject taskObj = taskArr.getJSONObject(i); String material_id = taskObj.getString("material_id"); - String vehicle_type = taskObj.getString("vehicle_type"); JSONObject queryParam = new JSONObject(); queryParam.put("flag", "1"); queryParam.put("material_id", material_id); queryParam.put("region_code", "CYZCQ"); - queryParam.put("vehicle_type", "%" + vehicle_type + "%"); // 到出窑暂存区找 JSONObject json1 = WQL.getWO("QSCH_cyCallMaterial_01").addParamMap(queryParam).process().uniqueResult(0); if (ObjectUtil.isNotEmpty(json1)) { @@ -230,12 +217,16 @@ public class FjCallMaterialTask extends AbstractAcsTask { JSONObject material_point = pointTab.query("point_id = '" + json1.getString("point_id") + "' and lock_type = '1'").uniqueResult(0); if (ObjectUtil.isEmpty(material_point)) throw new BadRequestException("数据错误,请校验!"); // 物料点位上锁 - material_point.put("lock_type", "2"); + material_point.put("lock_type", PointEnum.LOCK_TYPE_TRUE.getCode()); + material_point.put("task_id", taskObj.getString("task_id")); pointTab.update(material_point); + // 将组盘标识赋给任务 + taskObj.put("group_id", material_point.getString("group_id")); + JSONObject object = groupTab.query("group_id = '" + material_point.getString("group_id") + "'").uniqueResult(0); + taskObj.put("vehicle_code", object.getString("vehicle_code")); taskObj.put("point_code1", material_point.getString("point_code")); taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); - taskObj.put("acs_task_type", "2"); taskObj.put("update_time", DateUtil.now()); taskTab.update(taskObj); } else { @@ -256,7 +247,10 @@ public class FjCallMaterialTask extends AbstractAcsTask { */ @Override public void forceFinish(String task_id) { - + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); + if (ObjectUtil.isEmpty(taskObj))throw new BadRequestException("未找到该任务或者任务已完成!"); + this.updateTaskStatus(taskObj, UpdateTaskStatusEnum.FORCEFINISH.getCode()); } /** @@ -266,6 +260,12 @@ public class FjCallMaterialTask extends AbstractAcsTask { */ @Override public void cancel(String task_id) { - + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); + if (ObjectUtil.isNotEmpty(taskObj)) + this.updateTaskStatus(taskObj,UpdateTaskStatusEnum.CANCEL.getCode()); + else { + throw new BadRequestException("未找到该任务或者任务已完成!"); + } } } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/YzjCallMaterialTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/YzjCallMaterialTask.java index f3cdb1a..8d461a9 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/YzjCallMaterialTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/YzjCallMaterialTask.java @@ -126,6 +126,8 @@ public class YzjCallMaterialTask extends AbstractAcsTask { regionIoObj.put("material_id", taskObj.getString("material_id")); regionIoObj.put("vehicle_code", taskObj.getString("vehicle_code")); regionIoObj.put("qty", requestObj.getString("qty")); + regionIoObj.put("ivt_weight", requestObj.getString("weight")); + regionIoObj.put("weight_unit_id", RegionIOEnum.UNIT_ID_T.getCode()); regionIoObj.put("bill_status", RegionIOEnum.BILL_STATUS_FINISH.getCode()); regionIoObj.put("start_point_code", taskObj.getString("point_code1")); regionIoObj.put("end_point_code", taskObj.getString("point_code2")); @@ -150,7 +152,7 @@ public class YzjCallMaterialTask extends AbstractAcsTask { String point_code2 = form.getString("point_code2"); String vehicle_type = form.getString("vehicle_type"); String vehicle_code = form.getString("vehicle_code"); - String qty = form.getString("material_num"); + String qty = form.getString("qty"); //生产工单表【PDM_BD_WorkOrder】 WQLObject workOrderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder"); @@ -271,11 +273,8 @@ public class YzjCallMaterialTask extends AbstractAcsTask { public void forceFinish(String task_id) { WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); - if (ObjectUtil.isNotEmpty(taskObj)) - this.updateTaskStatus(taskObj,"2"); - else { - throw new BadRequestException("未找到该任务或者任务已完成!"); - } + if (ObjectUtil.isEmpty(taskObj))throw new BadRequestException("未找到该任务或者任务已完成!"); + this.updateTaskStatus(taskObj, UpdateTaskStatusEnum.FORCEFINISH.getCode()); } /** diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/wql/QSCH_cyCallMaterial_01.wql b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/wql/QSCH_cyCallMaterial_01.wql index 3ea0e4d..674b0d4 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/wql/QSCH_cyCallMaterial_01.wql +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/wql/QSCH_cyCallMaterial_01.wql @@ -62,10 +62,7 @@ OPTION 输入.region_code <> "" p.region_code = 输入.region_code ENDOPTION - OPTION 输入.vehicle_type <> "" - p.can_vehicle_type like 输入.vehicle_type - ENDOPTION - ORDER BY col_num,row_num,layer_num + ORDER BY instorage_time ENDSELECT ENDQUERY ENDIF diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendEmpty/DpSendEmpVehicleTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendEmpty/DpSendEmpVehicleTask.java index e25b657..a1e1202 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendEmpty/DpSendEmpVehicleTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendEmpty/DpSendEmpVehicleTask.java @@ -15,9 +15,11 @@ import org.nl.modules.system.util.CodeUtil; import org.nl.modules.wql.core.bean.WQLObject; import org.nl.wms.sch.SchTaskDto; import org.nl.wms.sch.manage.AbstractAcsTask; +import org.nl.wms.sch.manage.PointEnum; import org.nl.wms.sch.manage.TaskStatusEnum; import org.nl.wms.sch.manage.UpdateTaskStatusEnum; import org.nl.wms.sch.tasks.AcsTaskDto; +import org.nl.wms.sch.tasks.PointUpdateUtil; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -109,7 +111,7 @@ public class DpSendEmpVehicleTask extends AbstractAcsTask { pointTab.update(point_2); // 起点设置为空位 JSONObject point_1 = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0); - point_1.put("point_status", "1"); + point_1.put("point_status", PointEnum.POINT_STATUS_EMPTY_POSITION.getCode()); pointTab.update(point_1); } } @@ -126,15 +128,17 @@ public class DpSendEmpVehicleTask extends AbstractAcsTask { WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 String point_code1 = form.getString("point_code1"); + //判断当前点是否有未完成的任务 + JSONObject taskObj = taskTab.query("is_delete='0' and point_code1 = '" + point_code1 + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(taskObj)) throw new BadRequestException("当前点位" + point_code1 + "存在未完成的任务"); SchTaskDto dto = SchTaskDto.builder().task_id(org.nl.wms.util.IdUtil.getLongId()) .task_code(CodeUtil.getNewCode("TASK_CODE")) .task_type("") - .task_name("叠盘空钢托盘入库") + .task_name("空钢托叠盘区->空钢托拆盘区") .task_status(TaskStatusEnum.SURE_START.getCode()) .point_code1(point_code1) - .vehicle_code(form.getString("vehicle_code")) - .vehicle_type(form.getString("vehicle_type")) + .vehicle_type(PointEnum.VEHICLE_TYPE_STEEL_TRAY.getCode()) .vehicle_qty(form.getIntValue("qty")) .handle_class(THIS_CLASS) .create_time(DateUtil.now()) @@ -160,8 +164,15 @@ public class DpSendEmpVehicleTask extends AbstractAcsTask { JSONArray taskArr = taskTab.query("handle_class = '" + THIS_CLASS + "'and is_delete = '0' and task_status = '2'").getResultJSONArray(0); for (int i = 0; i < taskArr.size(); i++) { JSONObject taskObj = taskArr.getJSONObject(i); + // 请求acs查看堆叠位是否可以搬运,修改对应点的点位 + JSONArray params = new JSONArray(); + JSONObject param = new JSONObject(); + param.put("device_code", "KGTDDW01"); + params.add(param); + PointUpdateUtil.updatePoint(params); // 直接找 - JSONObject endPoint = pointTab.query("point_code = 'KGTDDW01' AND lock_type = '1' AND is_used='1'").uniqueResult(0); + JSONObject endPoint = pointTab.query("point_code = 'KGTDDW01' AND lock_type = '1' AND is_used = '1' AND is_delete = '0'").uniqueResult(0); + if (ObjectUtil.isEmpty(endPoint)) { taskObj.put("remark", "钢托盘堆叠位不可用!"); taskObj.put("task_status", TaskStatusEnum.SURE_START.getCode()); @@ -175,7 +186,7 @@ public class DpSendEmpVehicleTask extends AbstractAcsTask { //锁住终点 endPoint.put("task_id", taskObj.getString("task_id")); - endPoint.put("lock_type", "2"); + endPoint.put("lock_type", PointEnum.LOCK_TYPE_TRUE.getCode()); pointTab.update(endPoint); } } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendEmpty/FjSendEmpVehicleTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendEmpty/FjSendEmpVehicleTask.java index e09e1ea..505d64c 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendEmpty/FjSendEmpVehicleTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendEmpty/FjSendEmpVehicleTask.java @@ -16,7 +16,9 @@ import org.nl.modules.wql.WQL; import org.nl.modules.wql.core.bean.WQLObject; import org.nl.wms.sch.SchTaskDto; import org.nl.wms.sch.manage.AbstractAcsTask; +import org.nl.wms.sch.manage.PointEnum; import org.nl.wms.sch.manage.TaskStatusEnum; +import org.nl.wms.sch.manage.UpdateTaskStatusEnum; import org.nl.wms.sch.tasks.AcsTaskDto; import org.springframework.stereotype.Service; @@ -59,7 +61,7 @@ public class FjSendEmpVehicleTask extends AbstractAcsTask { String point_code2 = taskObj.getString("point_code2"); JSONObject jsonTask = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); - if (StrUtil.equals(status, "0")) { + if (StrUtil.equals(status, UpdateTaskStatusEnum.CANCEL.getCode())) { // 取消删除任务 if (StrUtil.equals(jsonTask.getString("task_status"), TaskStatusEnum.FINISHED.getCode())) { throw new BadRequestException("已完成不能取消!"); @@ -67,7 +69,7 @@ public class FjSendEmpVehicleTask extends AbstractAcsTask { // 解锁终点位置 if (ObjectUtil.isNotEmpty(point_code2)) { // 未找到终点的取消只需要完成任务就行 JSONObject point2 = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); - point2.put("lock_type", "1"); + point2.put("lock_type", PointEnum.LOCK_TYPE_FALSE.getCode()); pointTab.update(point2); } // 任务设置为完成 @@ -76,7 +78,7 @@ public class FjSendEmpVehicleTask extends AbstractAcsTask { taskTab.update(jsonTask); } - if ("1".equals(status)) { + if (UpdateTaskStatusEnum.EXECUTION.getCode().equals(status)) { // 更新任务状态为执行中 jsonTask.put("task_status", TaskStatusEnum.EXECUTING.getCode()); jsonTask.put("update_time", DateUtil.now()); @@ -84,7 +86,7 @@ public class FjSendEmpVehicleTask extends AbstractAcsTask { taskTab.update(jsonTask); } - if (StrUtil.equals(status, "2")) { + if (StrUtil.equals(status, UpdateTaskStatusEnum.FORCEFINISH.getCode())) { // 更改任务状态为完成 jsonTask.put("task_status", TaskStatusEnum.FINISHED.getCode()); jsonTask.put("update_optid", SecurityUtils.getCurrentUserId()); @@ -94,16 +96,8 @@ public class FjSendEmpVehicleTask extends AbstractAcsTask { // 释放点位 if (ObjectUtil.isNotEmpty(point_code2)) { // 防止只有确定起点的任务完成 JSONObject point_2 = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); - point_2.put("lock_type", "1"); - point_2.put("point_status", "2"); - point_2.put("vehicle_code", jsonTask.getString("vehicle_code")); + point_2.put("lock_type", PointEnum.LOCK_TYPE_FALSE.getCode()); point_2.put("vehicle_qty", NumberUtil.add(point_2.getString("vehicle_qty"), jsonTask.getString("vehicle_qty"))); - point_2.put("instorage_time", DateUtil.now()); - point_2.put("is_full", "1"); - point_2.put("ivt_qty", "0"); - point_2.put("pcsn", ""); - point_2.put("material_id", ""); - point_2.put("standing_time", "0"); pointTab.update(point_2); } } @@ -119,16 +113,19 @@ public class FjSendEmpVehicleTask extends AbstractAcsTask { WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 String point_code1 = form.getString("point_code1"); + //判断当前点是否有未完成的任务 + JSONObject taskObj = taskTab.query("is_delete = '0' and point_code2 = '" + point_code1 + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(taskObj)) throw new BadRequestException("当前点位" + point_code1 + "存在未完成的任务"); SchTaskDto dto = SchTaskDto.builder().task_id(org.nl.wms.util.IdUtil.getLongId()) .task_code(CodeUtil.getNewCode("TASK_CODE")) .task_type("") - .task_name("分拣空钢托盘入库") + .task_name("分拣送空钢托盘") .task_status(TaskStatusEnum.SURE_START.getCode()) .point_code1(point_code1) .vehicle_code(form.getString("vehicle_code")) .vehicle_type(form.getString("vehicle_type")) - .vehicle_qty(form.getIntValue("qty")) + .vehicle_qty(1) .handle_class(THIS_CLASS) .create_time(DateUtil.now()) .build(); @@ -153,7 +150,7 @@ public class FjSendEmpVehicleTask extends AbstractAcsTask { for (int i = 0; i < taskArr.size(); i++) { JSONObject taskObj = taskArr.getJSONObject(i); // 直接找 - JSONObject endPoint = pointTab.query("point_code = 'KGTDTW01' AND lock_type = '1' AND is_used='1'").uniqueResult(0); + JSONObject endPoint = pointTab.query("point_code = 'KGTDTW01' AND lock_type = '1'").uniqueResult(0); if (ObjectUtil.isEmpty(endPoint)) { taskObj.put("remark", "钢托盘叠托位不可用!"); taskObj.put("task_status", TaskStatusEnum.SURE_START.getCode()); @@ -167,7 +164,7 @@ public class FjSendEmpVehicleTask extends AbstractAcsTask { //锁住终点 endPoint.put("task_id", taskObj.getString("task_id")); - endPoint.put("lock_type", "2"); + endPoint.put("lock_type", PointEnum.LOCK_TYPE_TRUE.getCode()); pointTab.update(endPoint); } } @@ -182,7 +179,10 @@ public class FjSendEmpVehicleTask extends AbstractAcsTask { */ @Override public void forceFinish(String task_id) { - + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); + if (ObjectUtil.isEmpty(taskObj))throw new BadRequestException("未找到该任务或者任务已完成!"); + this.updateTaskStatus(taskObj, UpdateTaskStatusEnum.FORCEFINISH.getCode()); } /** @@ -192,6 +192,9 @@ public class FjSendEmpVehicleTask extends AbstractAcsTask { */ @Override public void cancel(String task_id) { - + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); + if (ObjectUtil.isEmpty(taskObj))throw new BadRequestException("未找到该任务或者任务已完成!"); + this.updateTaskStatus(taskObj,UpdateTaskStatusEnum.CANCEL.getCode()); } } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendEmpty/YzjSendEmpVehicleTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendEmpty/YzjSendEmpVehicleTask.java index f3c39eb..6e61fe7 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendEmpty/YzjSendEmpVehicleTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendEmpty/YzjSendEmpVehicleTask.java @@ -210,16 +210,10 @@ public class YzjSendEmpVehicleTask extends AbstractAcsTask { */ @Override public void forceFinish(String task_id) { - /* - * 强制完成 - */ WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); - if (ObjectUtil.isNotEmpty(taskObj)) - this.updateTaskStatus(taskObj,UpdateTaskStatusEnum.FORCEFINISH.getCode()); - else { - throw new BadRequestException("未找到该任务或者任务已完成!"); - } + if (ObjectUtil.isEmpty(taskObj))throw new BadRequestException("未找到该任务或者任务已完成!"); + this.updateTaskStatus(taskObj, UpdateTaskStatusEnum.FORCEFINISH.getCode()); } /** diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/FjSendMaterialTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/FjSendMaterialTask.java index dbfc267..305a1cd 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/FjSendMaterialTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/FjSendMaterialTask.java @@ -13,14 +13,17 @@ import org.nl.modules.common.utils.SecurityUtils; import org.nl.modules.system.util.CodeUtil; import org.nl.modules.wql.WQL; import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.wms.ext.acs.service.WmsToAcsService; import org.nl.wms.sch.SchTaskDto; -import org.nl.wms.sch.manage.AbstractAcsTask; -import org.nl.wms.sch.manage.TaskStatusEnum; +import org.nl.wms.sch.manage.*; import org.nl.wms.sch.tasks.AcsTaskDto; +import org.nl.wms.sch.tasks.PointUpdateUtil; import org.nl.wms.sch.tasks.sendEmpty.FjSendEmpVehicleTask; import org.nl.wms.util.IdUtil; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.util.ArrayList; import java.util.List; /** @@ -33,6 +36,8 @@ import java.util.List; @Slf4j public class FjSendMaterialTask extends AbstractAcsTask { private final String THIS_CLASS = FjSendEmpVehicleTask.class.getName(); + + private final WmsToAcsService wmsToAcsService; /** * 添加任务进行下发 * @@ -40,11 +45,32 @@ public class FjSendMaterialTask extends AbstractAcsTask { */ @Override public List addTask() { - return null; + /* + * 下发给ACS时需要特殊处理 + */ + JSONArray arr = WQLObject.getWQLObject("SCH_BASE_Task").query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0); + + ArrayList acsTaskArr = new ArrayList<>(); + for (int i = 0; i < arr.size(); i++) { // 任务 + JSONObject json = arr.getJSONObject(i); + AcsTaskDto dto = AcsTaskDto.builder() + .task_id(json.getString("task_id")) + .task_code(json.getString("task_code")) + .task_type(json.getString("acs_task_type")) + .start_device_code(json.getString("point_code1")) + .next_device_code(json.getString("point_code2")) + .vehicle_code(json.getString("vehicle_code")) + .vehicle_type(json.getString("vehicle_type")) + .priority(json.getString("priority")) + .remark(json.getString("remark")) + .build(); + acsTaskArr.add(dto); + } + return acsTaskArr; } /** - * @param taskObj 代表一条任务对象 + * @param task 代表一条任务对象 * @param status 代表wcs任务完成状态: //0:acs,取消,:执行中,2:完成 * @return * @discription wcs请求wms任务完成状态反馈接口, 比如agv从a点往b点走。生成任务的时候绑定b的物料信息,任务完成的时候,清除a的物料信息 @@ -52,23 +78,26 @@ public class FjSendMaterialTask extends AbstractAcsTask { * @created 2019年4月17日 下午8:51:50 */ @Override + @Transactional(rollbackFor = Exception.class) public void updateTaskStatus(JSONObject task, String status) { WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); + WQLObject workOrderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder"); + WQLObject regionIoTab = WQLObject.getWQLObject("st_ivt_regionIO"); String task_id = task.getString("task_id"); JSONObject taskObj = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); //任务取消 - if (StrUtil.equals(status, "0")) { + if (StrUtil.equals(status, UpdateTaskStatusEnum.CANCEL.getCode())) { // 取消删除任务 if (StrUtil.equals(taskObj.getString("task_status"), TaskStatusEnum.FINISHED.getCode())) { throw new BadRequestException("已完成不能取消!"); } String point_code2 = taskObj.getString("point_code2"); - if (ObjectUtil.isEmpty(point_code2)) { + if (ObjectUtil.isNotEmpty(point_code2)) { JSONObject endPoint = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); - endPoint.put("lock_type", "1"); + endPoint.put("lock_type", PointEnum.LOCK_TYPE_FALSE.getCode()); pointTab.update(endPoint); } taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); @@ -76,7 +105,7 @@ public class FjSendMaterialTask extends AbstractAcsTask { taskTab.update(taskObj); } - if ("1".equals(status)) { + if (UpdateTaskStatusEnum.EXECUTION.getCode().equals(status)) { // 更新任务状态为执行中 taskObj.put("task_status", TaskStatusEnum.EXECUTING.getCode()); taskObj.put("update_time", DateUtil.now()); @@ -84,7 +113,11 @@ public class FjSendMaterialTask extends AbstractAcsTask { taskTab.update(taskObj); } - if (StrUtil.equals(status, "2")) { + if (StrUtil.equals(status, UpdateTaskStatusEnum.FORCEFINISH.getCode())) { + /** + * 任务完成: + * 取木托盘完成,送物料完成 + */ // 更改任务状态为完成 taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); taskObj.put("update_optid", SecurityUtils.getCurrentUserId()); @@ -92,52 +125,95 @@ public class FjSendMaterialTask extends AbstractAcsTask { taskObj.put("update_time", DateUtil.now()); taskTab.update(taskObj); + String point_code1 = taskObj.getString("point_code1"); String point_code2 = taskObj.getString("point_code2"); + JSONObject point1Obj = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0); JSONObject point2Obj = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); JSONObject requestObj = task.getJSONObject("request_param"); //工单标识 - String workorder_id = requestObj.getString("workorder_id"); - //生产工单表【PDM_BD_WorkOrder】 - WQLObject workOrderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder"); - JSONObject workorderObj = workOrderTab.query("workorder_id", workorder_id).uniqueResult(0); - - if (!point_code2.equals("BZX01")) { // 半满到包装暂存区,记录库存 - //区域出入表【st_ivt_regionIO】 - WQLObject regionIoTab = WQLObject.getWQLObject("st_ivt_regionIO"); + String workorder_id = taskObj.getString("workorder_id"); + JSONObject workorderObj = workOrderTab.query("workorder_id = '" + workorder_id + "'").uniqueResult(0); + String sort_seq = taskObj.getString("sort_seq"); + if (sort_seq.equals("1")) { // 取空托盘任务 + // 避免没有找到位置 + if (ObjectUtil.isEmpty(point1Obj)) return; + // 需要判断取的是否为半满或者是控盘 + // 半托 + if (point1Obj.getString("region_code").equals(RegionEnum.BZZCQ.getCode())) { + // 物料出库 + // 插入出库单 + JSONObject regionIoObj = new JSONObject(); + regionIoObj.put("iostorinv_id", IdUtil.getLongId()); + regionIoObj.put("bill_code", CodeUtil.getNewCode("IN_STORE_CODE")); + regionIoObj.put("buss_date", DateUtil.today()); + regionIoObj.put("io_type", RegionIOEnum.IO_TYPE_OUT.getCode()); // 出库 + regionIoObj.put("region_id", point1Obj.getString("region_id")); + regionIoObj.put("region_code", point1Obj.getString("region_code")); + regionIoObj.put("region_name", point1Obj.getString("region_name")); + regionIoObj.put("material_id", taskObj.getString("material_id")); + regionIoObj.put("vehicle_code", taskObj.getString("vehicle_code")); + regionIoObj.put("qty", requestObj.getString("qty")); + regionIoObj.put("weight_unit_id", RegionIOEnum.UNIT_ID_B.getCode()); + regionIoObj.put("bill_status", RegionIOEnum.BILL_STATUS_FINISH.getCode()); + regionIoObj.put("start_point_code", taskObj.getString("point_code1")); + regionIoObj.put("end_point_code", taskObj.getString("point_code2")); + regionIoObj.put("create_mode", RegionIOEnum.CREATE_MODE_ACS.getCode()); + regionIoObj.put("pcsn", DateUtil.format(DateUtil.parse(DateUtil.today()), "yyyyMMdd")); + regionIoObj.put("create_id", SecurityUtils.getCurrentUserId()); + regionIoObj.put("create_name", SecurityUtils.getCurrentNickName()); + regionIoObj.put("create_time", DateUtil.now()); + regionIoTab.insert(regionIoObj); + // 点位更新,起点:空位,解锁; + PointUpdateUtil.clearPoint(point1Obj.getString("point_code")); + // 终点:码垛对接位,将半托的组盘id放进去 + point2Obj.put("group_id", taskObj.getString("group_id")); + pointTab.update(point2Obj); + } + // 起点解锁 + point1Obj.put("lock_type", PointEnum.LOCK_TYPE_FALSE.getCode()); + pointTab.update(point1Obj); + } + if (sort_seq.equals("2")) { // 送物料任务 + // 避免没有找到位置 + if (ObjectUtil.isEmpty(point2Obj)) return; JSONObject regionIoObj = new JSONObject(); regionIoObj.put("iostorinv_id", IdUtil.getLongId()); regionIoObj.put("bill_code", CodeUtil.getNewCode("IN_STORE_CODE")); regionIoObj.put("buss_date", DateUtil.today()); - regionIoObj.put("io_type", "1"); + regionIoObj.put("io_type", RegionIOEnum.IO_TYPE_IN.getCode()); regionIoObj.put("region_id", point2Obj.getString("region_id")); regionIoObj.put("region_code", point2Obj.getString("region_code")); regionIoObj.put("region_name", point2Obj.getString("region_name")); regionIoObj.put("material_id", taskObj.getString("material_id")); regionIoObj.put("vehicle_code", taskObj.getString("vehicle_code")); regionIoObj.put("qty", requestObj.getString("qty")); - regionIoObj.put("bill_status", "3"); + regionIoObj.put("weight_unit_id", RegionIOEnum.UNIT_ID_B.getCode()); + regionIoObj.put("bill_status", RegionIOEnum.BILL_STATUS_FINISH.getCode()); regionIoObj.put("start_point_code", taskObj.getString("point_code1")); regionIoObj.put("end_point_code", taskObj.getString("point_code3")); - regionIoObj.put("create_mode", "2"); + regionIoObj.put("create_mode", RegionIOEnum.CREATE_MODE_ACS.getCode()); regionIoObj.put("pcsn", DateUtil.format(DateUtil.parse(DateUtil.today()), "yyyyMMdd")); regionIoObj.put("create_id", SecurityUtils.getCurrentUserId()); regionIoObj.put("create_name", SecurityUtils.getCurrentNickName()); regionIoObj.put("create_time", DateUtil.now()); regionIoTab.insert(regionIoObj); - //完成后入库 - point2Obj.put("instorage_time", DateUtil.now()); - point2Obj.put("pcsn", DateUtil.format(DateUtil.parse(DateUtil.today()), "yyyyMMdd")); - point2Obj.put("ivt_qty", requestObj.getString("qty")); - point2Obj.put("standing_time", workorderObj.getString("standing_time")); - point2Obj.put("material_id", workorderObj.getString("material_id")); - point2Obj.put("vehicle_type", workorderObj.getString("vehicle_type")); - point2Obj.put("vehicle_code", taskObj.getString("vehicle_code")); - point2Obj.put("is_full", requestObj.getString("is_full")); - point2Obj.put("point_status", "3"); + if (!point_code2.equals("BZX01")) { // 半满到包装暂存区,记录库存 + //完成后入库 + point2Obj.put("instorage_time", DateUtil.now()); + point2Obj.put("pcsn", DateUtil.format(DateUtil.parse(DateUtil.today()), "yyyyMMdd")); + point2Obj.put("ivt_qty", requestObj.getString("qty")); + point2Obj.put("standing_time", workorderObj.getString("standing_time")); + point2Obj.put("material_id", workorderObj.getString("material_id")); + point2Obj.put("vehicle_type", workorderObj.getString("vehicle_type")); + point2Obj.put("vehicle_code", taskObj.getString("vehicle_code")); + point2Obj.put("group_id", taskObj.getString("group_id")); // 组盘标识 + point2Obj.put("is_full", requestObj.getString("is_full")); + point2Obj.put("point_status", PointEnum.POINT_STATUS_HAVE_MATERIAL.getCode()); + } + // 终点解锁 + point2Obj.put("lock_type", PointEnum.LOCK_TYPE_FALSE.getCode()); + pointTab.update(point2Obj); } - // 终点解锁 - point2Obj.put("lock_type", "1"); - pointTab.update(point2Obj); } } @@ -146,6 +222,7 @@ public class FjSendMaterialTask extends AbstractAcsTask { * @return 返回任务标识 */ @Override + @Transactional(rollbackFor = Exception.class) public String createTask(JSONObject form) { String point_code1 = form.getString("point_code1"); String vehicle_code = form.getString("vehicle_code"); @@ -180,8 +257,11 @@ public class FjSendMaterialTask extends AbstractAcsTask { .workorder_id(workOrderObj.getLong("workorder_id")) .material_id(workOrderObj.getLong("material_id")) .handle_class(THIS_CLASS) + .group_id(form.getLong("group_id")) .create_time(DateUtil.now()) .request_param(form.toJSONString()) + .task_group_id(IdUtil.getLongId()) + .sort_seq(2) .build(); JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); taskTab.insert(json); @@ -197,6 +277,7 @@ public class FjSendMaterialTask extends AbstractAcsTask { * @created 2020年6月12日 下午6:01:06 */ @Override + @Transactional(rollbackFor = Exception.class) public void findNextPoint() { // 判断是否满拖:半满->包装暂存区,满->包装线 WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); @@ -207,27 +288,96 @@ public class FjSendMaterialTask extends AbstractAcsTask { JSONObject requestObj = taskObj.getJSONObject("request_param"); if (requestObj.getString("is_full").equals("1")) { JSONObject endPoint = pointTab.query("point_code = 'BZX01' AND lock_type = '1'").uniqueResult(0); - // 满拖就到包装线 + // 满拖先生成叫半托,没有在呼叫空托盘的任务,在执行去到包装线 + SchTaskDto dto = SchTaskDto.builder() + .task_id(IdUtil.getLongId()) + .task_code(CodeUtil.getNewCode("TASK_CODE")) + .task_type("task_type") + .task_name("分拣呼叫空托盘") + .vehicle_type(taskObj.getString("vehicle_type")) // 与满拖的类型一致,因为工单未结束 + .material_qty(taskObj.getString("material_qty")) + .task_status(TaskStatusEnum.SURE_END.getCode()) + .point_code2(taskObj.getString("point_code2")) + .handle_class(THIS_CLASS) + .create_time(DateUtil.now()) + .sort_seq(1) + .task_group_id(taskObj.getLong("task_group_id")) + .build(); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + taskTab.insert(json); + // 先呼叫半托 + JSONObject halfTray = pointTab.query("region_code = 'BZZCQ' AND lock_type = '1' " + + "AND point_status = '2' AND is_used = '1' AND is_delete = '0'").uniqueResult(0); + // 获取任务 + JSONObject taskEnt = taskTab.query("task_id = '" + dto.getTask_id() + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(halfTray)) { // 半托 + // 去搬运 + taskEnt.put("point_code1", halfTray.getString("point_code")); + taskEnt.put("update_time", DateUtil.now()); + taskEnt.put("group_id", halfTray.getString("group_id")); // 半托要把组盘标识记录起来 + taskEnt.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); + taskTab.update(taskEnt); + // 更新半托点位状态 + halfTray.put("task_id", taskObj.getString("task_id")); + halfTray.put("lock_type", PointEnum.LOCK_TYPE_TRUE.getCode()); + pointTab.update(halfTray); + } else { + // 没有半托呼叫空木托盘 + // 获取所有的托盘堆叠位 + JSONArray pointCodes = WQL.getWO("QSCH_fjSendMaterial_01").addParam("flag", "2").process().getResultJSONArray(0); + // 更新点位 + PointUpdateUtil.updatePoint(pointCodes); + // 找到载具类型符合的覆膜机位置:真正的位置在device_code + JSONObject emptyTray = pointTab.query("region_code = 'RGCPQ' AND vehicle_type = '" + + taskObj.getString("vehicle_type") + "' AND point_status = '2' " + + "AND is_used = '1' AND is_delete = '0' AND lock_type = '1'").uniqueResult(0); + + if (ObjectUtil.isNotEmpty(emptyTray)) { + // 向ACS申请传送一个空木托盘 + JSONArray jsonArray = new JSONArray(); + JSONObject data = new JSONObject(); + data.put("device_code", emptyTray.getString("point_code")); + jsonArray.add(data); + wmsToAcsService.getTray(jsonArray); + // 去搬运 + taskEnt.put("point_code1", emptyTray.getString("device_code")); + taskEnt.put("update_time", DateUtil.now()); + taskEnt.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); + taskTab.update(taskEnt); + // 更新空托盘点位状态 + emptyTray.put("task_id", taskObj.getString("task_id")); + emptyTray.put("lock_type", PointEnum.LOCK_TYPE_TRUE.getCode()); + pointTab.update(emptyTray); + } else { + taskEnt.put("remark", "暂无空托盘"); + taskEnt.put("update_time", DateUtil.now()); + taskTab.update(taskEnt); + // 满拖搬运也不下发 + taskObj.put("remark", "暂无空托盘"); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); + return; + } + } + // 更新送料任务信息 taskObj.put("update_time", DateUtil.now()); taskObj.put("point_code2", endPoint.getString("point_code")); taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); taskTab.update(taskObj); - //锁住终点 + //锁住送料任务终点 endPoint.put("task_id", taskObj.getString("task_id")); - endPoint.put("lock_type", "2"); + endPoint.put("lock_type", PointEnum.LOCK_TYPE_TRUE.getCode()); pointTab.update(endPoint); } else { // 半满拖就去包装暂存区 - String vehicle_type = taskObj.getString("vehicle_type"); JSONObject param1 = new JSONObject(); param1.put("flag", "1"); param1.put("region_code", "BZZCQ"); - param1.put("vehicle_type", "%" + vehicle_type + "%"); //1、查找困料货架是否有响应的载具类型和对应的物料 - JSONObject endPoint = WQL.getWO("QSCH_fjCallEmptyVehicle_01").addParamMap(param1).process().uniqueResult(0); + JSONObject endPoint = WQL.getWO("QSCH_fjSendMaterial_01").addParamMap(param1).process().uniqueResult(0); if (ObjectUtil.isEmpty(endPoint)) { - taskObj.put("remark", "包装暂存区无可用货位!"); + taskObj.put("remark", "包装暂存区无可用货位"); taskObj.put("update_time", DateUtil.now()); taskTab.update(taskObj); } else { @@ -238,7 +388,7 @@ public class FjSendMaterialTask extends AbstractAcsTask { //锁住终点 endPoint.put("task_id", taskObj.getString("task_id")); - endPoint.put("lock_type", "2"); + endPoint.put("lock_type", PointEnum.LOCK_TYPE_TRUE.getCode()); pointTab.update(endPoint); } } @@ -256,11 +406,8 @@ public class FjSendMaterialTask extends AbstractAcsTask { public void forceFinish(String task_id) { WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); - if (ObjectUtil.isNotEmpty(taskObj)) - this.updateTaskStatus(taskObj,"2"); - else { - throw new BadRequestException("未找到该任务或者任务已完成!"); - } + if (ObjectUtil.isEmpty(taskObj))throw new BadRequestException("未找到该任务或者任务已完成!"); + this.updateTaskStatus(taskObj, UpdateTaskStatusEnum.FORCEFINISH.getCode()); } /** @@ -272,10 +419,7 @@ public class FjSendMaterialTask extends AbstractAcsTask { public void cancel(String task_id) { WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); - if (ObjectUtil.isNotEmpty(taskObj)) - this.updateTaskStatus(taskObj,"0"); - else { - throw new BadRequestException("未找到该任务或者任务已完成!"); - } + if (ObjectUtil.isEmpty(taskObj))throw new BadRequestException("未找到该任务或者任务已完成!"); + this.updateTaskStatus(taskObj, UpdateTaskStatusEnum.CANCEL.getCode()); } } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/HnSendMaterialTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/HnSendMaterialTask.java index 32d350a..fb6c891 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/HnSendMaterialTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/HnSendMaterialTask.java @@ -146,6 +146,7 @@ public class HnSendMaterialTask extends AbstractAcsTask { regionIoObj.put("vehicle_code", taskObj.getString("vehicle_code")); regionIoObj.put("qty", requestObj.getString("qty")); regionIoObj.put("ivt_weight", requestObj.getString("weight")); + regionIoObj.put("weight_unit_id", RegionIOEnum.UNIT_ID_T.getCode()); regionIoObj.put("bill_status", RegionIOEnum.BILL_STATUS_FINISH.getCode()); regionIoObj.put("start_point_code", taskObj.getString("point_code1")); regionIoObj.put("end_point_code", taskObj.getString("point_code2")); @@ -314,16 +315,10 @@ public class HnSendMaterialTask extends AbstractAcsTask { */ @Override public void forceFinish(String task_id) { - /* - * 强制完成 - */ WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); - if (ObjectUtil.isNotEmpty(taskObj)) - this.updateTaskStatus(taskObj, UpdateTaskStatusEnum.FORCEFINISH.getCode()); - else { - throw new BadRequestException("未找到该任务或者任务已完成!"); - } + if (ObjectUtil.isEmpty(taskObj))throw new BadRequestException("未找到该任务或者任务已完成!"); + this.updateTaskStatus(taskObj, UpdateTaskStatusEnum.FORCEFINISH.getCode()); } /** diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/SzSendMaterialTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/SzSendMaterialTask.java index e040b51..0f13ee1 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/SzSendMaterialTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/SzSendMaterialTask.java @@ -14,11 +14,11 @@ import org.nl.modules.system.util.CodeUtil; import org.nl.modules.wql.WQL; import org.nl.modules.wql.core.bean.WQLObject; import org.nl.wms.sch.SchTaskDto; -import org.nl.wms.sch.manage.AbstractAcsTask; -import org.nl.wms.sch.manage.TaskStatusEnum; +import org.nl.wms.sch.manage.*; import org.nl.wms.sch.tasks.AcsTaskDto; import org.nl.wms.util.IdUtil; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.List; @@ -73,23 +73,25 @@ public class SzSendMaterialTask extends AbstractAcsTask { * @created 2019年4月17日 下午8:51:50 */ @Override + @Transactional(rollbackFor = Exception.class) public void updateTaskStatus(JSONObject task, String status) { WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); + WQLObject groupTab = WQLObject.getWQLObject("st_buss_vehiclegroup"); String task_id = task.getString("task_id"); JSONObject taskObj = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); //任务取消 - if (StrUtil.equals(status, "0")) { + if (StrUtil.equals(status, UpdateTaskStatusEnum.CANCEL.getCode())) { // 取消删除任务 if (StrUtil.equals(taskObj.getString("task_status"), TaskStatusEnum.FINISHED.getCode())) { throw new BadRequestException("已完成不能取消!"); } String point_code2 = taskObj.getString("point_code2"); - if (ObjectUtil.isEmpty(point_code2)) { + if (ObjectUtil.isNotEmpty(point_code2)) { JSONObject endPoint = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); - endPoint.put("lock_type", "1"); + endPoint.put("lock_type", PointEnum.LOCK_TYPE_FALSE.getCode()); pointTab.update(endPoint); } taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); @@ -97,7 +99,7 @@ public class SzSendMaterialTask extends AbstractAcsTask { taskTab.update(taskObj); } - if ("1".equals(status)) { + if (UpdateTaskStatusEnum.EXECUTION.getCode().equals(status)) { // 更新任务状态为执行中 taskObj.put("task_status", TaskStatusEnum.EXECUTING.getCode()); taskObj.put("update_time", DateUtil.now()); @@ -105,7 +107,8 @@ public class SzSendMaterialTask extends AbstractAcsTask { taskTab.update(taskObj); } - if (StrUtil.equals(status, "2")) { + if (StrUtil.equals(status, UpdateTaskStatusEnum.FORCEFINISH.getCode())) { + String vehicle_code = taskObj.getString("vehicle_code"); // 更改任务状态为完成 taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode()); taskObj.put("update_optid", SecurityUtils.getCurrentUserId()); @@ -114,31 +117,28 @@ public class SzSendMaterialTask extends AbstractAcsTask { taskTab.update(taskObj); String point_code2 = taskObj.getString("point_code2"); + if (ObjectUtil.isEmpty(point_code2)) return; JSONObject point2Obj = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); JSONObject requestObj = task.getJSONObject("request_param"); - //工单标识 - String workorder_id = requestObj.getString("workorder_id"); - //生产工单表【PDM_BD_WorkOrder】 - WQLObject workOrderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder"); - JSONObject workorderObj = workOrderTab.query("workorder_id", workorder_id).uniqueResult(0); - + JSONObject groupObj = groupTab.query("group_id = '" + taskObj.getString("group_id") + "'").uniqueResult(0); //区域出入表【st_ivt_regionIO】 WQLObject regionIoTab = WQLObject.getWQLObject("st_ivt_regionIO"); JSONObject regionIoObj = new JSONObject(); regionIoObj.put("iostorinv_id", IdUtil.getLongId()); regionIoObj.put("bill_code", CodeUtil.getNewCode("IN_STORE_CODE")); regionIoObj.put("buss_date", DateUtil.today()); - regionIoObj.put("io_type", "1"); // 入库 + regionIoObj.put("io_type", RegionIOEnum.IO_TYPE_IN.getCode()); // 入库 regionIoObj.put("region_id", point2Obj.getString("region_id")); regionIoObj.put("region_code", point2Obj.getString("region_code")); regionIoObj.put("region_name", point2Obj.getString("region_name")); regionIoObj.put("material_id", taskObj.getString("material_id")); - regionIoObj.put("vehicle_code", taskObj.getString("vehicle_code")); + regionIoObj.put("vehicle_code", vehicle_code); regionIoObj.put("qty", requestObj.getString("qty")); - regionIoObj.put("bill_status", "3"); + regionIoObj.put("weight_unit_id", RegionIOEnum.UNIT_ID_B.getCode()); + regionIoObj.put("bill_status", RegionIOEnum.BILL_STATUS_FINISH.getCode()); regionIoObj.put("start_point_code", taskObj.getString("point_code1")); regionIoObj.put("end_point_code", taskObj.getString("point_code3")); - regionIoObj.put("create_mode", "2"); + regionIoObj.put("create_mode", RegionIOEnum.CREATE_MODE_ACS.getCode()); regionIoObj.put("pcsn", DateUtil.format(DateUtil.parse(DateUtil.today()), "yyyyMMdd")); regionIoObj.put("create_id", SecurityUtils.getCurrentUserId()); regionIoObj.put("create_name", SecurityUtils.getCurrentNickName()); @@ -149,15 +149,16 @@ public class SzSendMaterialTask extends AbstractAcsTask { point2Obj.put("instorage_time", DateUtil.now()); point2Obj.put("pcsn", DateUtil.format(DateUtil.parse(DateUtil.today()), "yyyyMMdd")); point2Obj.put("ivt_qty", requestObj.getString("qty")); - point2Obj.put("standing_time", workorderObj.getString("standing_time")); - point2Obj.put("material_id", workorderObj.getString("material_id")); - point2Obj.put("vehicle_type", workorderObj.getString("vehicle_type")); + point2Obj.put("material_id", taskObj.getString("material_id")); + point2Obj.put("vehicle_type", taskObj.getString("vehicle_type")); point2Obj.put("vehicle_code", taskObj.getString("vehicle_code")); - point2Obj.put("is_full", requestObj.getString("is_full")); + point2Obj.put("vehicle_qty", "1"); // 入库为1个载具 + point2Obj.put("is_full", groupObj.getString("is_full")); + point2Obj.put("group_id", groupObj.getString("group_id")); // 终点解锁 - point2Obj.put("lock_type", "1"); - point2Obj.put("point_status", "3"); + point2Obj.put("lock_type", PointEnum.LOCK_TYPE_FALSE.getCode()); + point2Obj.put("point_status", PointEnum.POINT_STATUS_HAVE_MATERIAL.getCode()); pointTab.update(point2Obj); } } @@ -171,36 +172,28 @@ public class SzSendMaterialTask extends AbstractAcsTask { public String createTask(JSONObject form) { String point_code1 = form.getString("point_code1"); String vehicle_code = form.getString("vehicle_code"); + WQLObject groupTab = WQLObject.getWQLObject("st_buss_vehiclegroup"); String qty = form.getString("qty"); - String is_full = form.getString("is_full"); - String weight = form.getString("weight"); //任务表【SCH_BASE_Task】 WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); //判断当前点是否有未完成的任务 JSONObject taskObj = taskTab.query("is_delete='0' and point_code1 = '" + point_code1 + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0); if (ObjectUtil.isNotEmpty(taskObj)) throw new BadRequestException("当前点位" + point_code1 + "存在未完成的任务"); - //生产工单表【PDM_BD_WorkOrder】 - WQLObject workOrderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder"); - //点位基础表【SCH_BASE_Point】 - WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point"); - // 压制机设备编码 - String device_code = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0).getString("device_code"); - JSONObject workOrderObj = workOrderTab.query("device_code = '" + device_code + "' and order_status = '3' and is_delete ='0'").uniqueResult(0); - if (ObjectUtil.isEmpty(workOrderObj)) throw new BadRequestException("该设备当前未生产或者已删除"); - + // 获取到组盘 + JSONObject groupObj = groupTab.query("vehicle_code = '" + vehicle_code + "'", "create_time desc").uniqueResult(0); SchTaskDto dto = SchTaskDto.builder() .task_id(IdUtil.getLongId()) .task_code(CodeUtil.getNewCode("TASK_CODE")) .task_type("task_type") .task_name("烧制入库") + .material_id(groupObj.getLong("material_uuid")) + .group_id(groupObj.getLong("group_id")) .material_qty(qty) .task_status(TaskStatusEnum.SURE_START.getCode()) .point_code1(point_code1) .vehicle_code(vehicle_code) - .vehicle_type(workOrderObj.getString("vehicle_type")) - .workorder_id(workOrderObj.getLong("workorder_id")) - .material_id(workOrderObj.getLong("material_id")) + .vehicle_type(PointEnum.VEHICLE_TYPE_STEEL_TRAY.getCode()) .handle_class(THIS_CLASS) .create_time(DateUtil.now()) .request_param(form.toJSONString()) @@ -226,11 +219,9 @@ public class SzSendMaterialTask extends AbstractAcsTask { JSONArray taskArr = taskTab.query("handle_class = '" + THIS_CLASS + "'and is_delete = '0' and task_status = '2'").getResultJSONArray(0); for (int i = 0; i < taskArr.size(); i++) { JSONObject taskObj = taskArr.getJSONObject(i); - String vehicle_type = taskObj.getString("vehicle_type"); JSONObject param1 = new JSONObject(); param1.put("flag", "1"); param1.put("region_code", "CYZCQ"); - param1.put("vehicle_type", "%" + vehicle_type + "%"); //1、查找出窑缓存区的空位 JSONObject endPoint = WQL.getWO("QSCH_szSendMaterial_01").addParamMap(param1).process().uniqueResult(0); if (ObjectUtil.isEmpty(endPoint)) { @@ -245,7 +236,7 @@ public class SzSendMaterialTask extends AbstractAcsTask { //锁住终点 endPoint.put("task_id", taskObj.getString("task_id")); - endPoint.put("lock_type", "2"); + endPoint.put("lock_type", PointEnum.LOCK_TYPE_TRUE.getCode()); pointTab.update(endPoint); } } @@ -260,16 +251,10 @@ public class SzSendMaterialTask extends AbstractAcsTask { */ @Override public void forceFinish(String task_id) { - /* - * 强制完成 - */ WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); - if (ObjectUtil.isNotEmpty(taskObj)) - this.updateTaskStatus(taskObj,"2"); - else { - throw new BadRequestException("未找到该任务或者任务已完成!"); - } + if (ObjectUtil.isEmpty(taskObj))throw new BadRequestException("未找到该任务或者任务已完成!"); + this.updateTaskStatus(taskObj, UpdateTaskStatusEnum.FORCEFINISH.getCode()); } /** diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/YzjSendMaterialTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/YzjSendMaterialTask.java index d4ba8a7..5ed29a0 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/YzjSendMaterialTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/YzjSendMaterialTask.java @@ -136,6 +136,7 @@ public class YzjSendMaterialTask extends AbstractAcsTask { regionIoObj.put("vehicle_code", taskObj.getString("vehicle_code")); regionIoObj.put("qty", requestObj.getString("qty")); regionIoObj.put("ivt_weight", requestObj.getString("weight")); + regionIoObj.put("weight_unit_id", RegionIOEnum.UNIT_ID_B.getCode()); regionIoObj.put("bill_status", RegionIOEnum.BILL_STATUS_FINISH.getCode()); regionIoObj.put("start_point_code", taskObj.getString("point_code1")); regionIoObj.put("end_point_code", taskObj.getString("point_code3")); @@ -267,16 +268,10 @@ public class YzjSendMaterialTask extends AbstractAcsTask { */ @Override public void forceFinish(String task_id) { - /* - * 强制完成 - */ WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); - if (ObjectUtil.isNotEmpty(taskObj)) - this.updateTaskStatus(taskObj,UpdateTaskStatusEnum.FORCEFINISH.getCode()); - else { - throw new BadRequestException("未找到该任务或者任务已完成!"); - } + if (ObjectUtil.isEmpty(taskObj))throw new BadRequestException("未找到该任务或者任务已完成!"); + this.updateTaskStatus(taskObj, UpdateTaskStatusEnum.FORCEFINISH.getCode()); } /** @@ -288,10 +283,7 @@ public class YzjSendMaterialTask extends AbstractAcsTask { public void cancel(String task_id) { WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0); - if (ObjectUtil.isNotEmpty(taskObj)) - this.updateTaskStatus(taskObj,UpdateTaskStatusEnum.CANCEL.getCode()); - else { - throw new BadRequestException("未找到该任务或者任务已完成!"); - } + if (ObjectUtil.isEmpty(taskObj))throw new BadRequestException("未找到该任务或者任务已完成!"); + this.updateTaskStatus(taskObj, UpdateTaskStatusEnum.CANCEL.getCode()); } } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/wql/QSCH_fjCallEmptyVehicle_01.wql b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/wql/QSCH_fjSendMaterial_01.wql similarity index 81% rename from lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/wql/QSCH_fjCallEmptyVehicle_01.wql rename to lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/wql/QSCH_fjSendMaterial_01.wql index b85146d..e1422aa 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/wql/QSCH_fjCallEmptyVehicle_01.wql +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/wql/QSCH_fjSendMaterial_01.wql @@ -40,7 +40,7 @@ ########################################## # 3、业务主过程 # ########################################## -IF 输入.flag = "1" + IF 输入.flag = "1" QUERY SELECT p.point_id, @@ -54,13 +54,23 @@ IF 输入.flag = "1" AND is_delete = '0' AND point_status = '1' AND point_type = '1' - OPTION 输入.vehicle_type <> "" - p.can_vehicle_type like 输入.vehicle_type - ENDOPTION OPTION 输入.region_code <> "" p.region_code = 输入.region_code ENDOPTION - ORDER BY col_num,row_num,layer_num + ORDER BY p.instorage_time ENDSELECT ENDQUERY ENDIF + + IF 输入.flag = "2" + QUERY + SELECT + p.point_code AS device_code + FROM + SCH_BASE_Point p + WHERE + region_code = 'RGCPQ' + AND point_type = '2' + ENDSELECT + ENDQUERY + ENDIF diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/wql/QSCH_szSendMaterial_01.wql b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/wql/QSCH_szSendMaterial_01.wql index e840e78..46428f1 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/wql/QSCH_szSendMaterial_01.wql +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/wql/QSCH_szSendMaterial_01.wql @@ -40,7 +40,7 @@ ########################################## # 3、业务主过程 # ########################################## -IF 输入.flag = "1" + IF 输入.flag = "1" QUERY SELECT p.point_id, @@ -53,9 +53,6 @@ IF 输入.flag = "1" AND is_used = '1' AND is_delete = '0' AND point_status = '1' - OPTION 输入.vehicle_type <> "" - p.can_vehicle_type like 输入.vehicle_type - ENDOPTION OPTION 输入.region_code <> "" p.region_code = 输入.region_code ENDOPTION 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 1936aed6b5d34d69fa76823d4c4eca8600860425..95fdefc86242f280f0a6b26d4b48248d15f6f9b1 100644 GIT binary patch delta 16623 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 ZdS}jvy>3_1lt1_ys(r-Q?|cG&|34N?qO<@2 delta 47381 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 lNx2ftWoDY3n%jY$ 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 A?f?J) diff --git a/lms/nladmin-ui/src/views/wms/pdm/workerorder/index.vue b/lms/nladmin-ui/src/views/wms/pdm/workerorder/index.vue index d3902f1..8ec0811 100644 --- a/lms/nladmin-ui/src/views/wms/pdm/workerorder/index.vue +++ b/lms/nladmin-ui/src/views/wms/pdm/workerorder/index.vue @@ -159,7 +159,22 @@ - + + + + + + + + + + + + + + + + +