From 4a797e9f7db0bdf07e65057ee88b66b256e4665a Mon Sep 17 00:00:00 2001 From: ludj Date: Mon, 17 Apr 2023 16:45:16 +0800 Subject: [PATCH] =?UTF-8?q?=E5=98=89=E8=80=90=E4=BB=A3=E7=A0=81=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/nl/wms/common/PointUpdateUtil.java | 90 +- .../org/nl/wms/common/StructFindUtil.java | 2 +- .../org/nl/wms/common/wql/QSTRUCT_RULE.wql | 5 +- .../wms/ext/acs/service/AcsToWmsService.java | 2 + .../acs/service/impl/AcsToWmsServiceImpl.java | 684 ++++++++------- .../impl/PdaBindingMaterialServiceImpl.java | 1 - .../callEmpty/rest/CallEmptyController.java | 2 - .../rest/SendMaterialController.java | 1 - .../service/impl/SendMaterialServiceImpl.java | 11 +- .../service/impl/ProducetaskServiceImpl.java | 816 +++++++++--------- .../sch/manage/buss/CallEmptyVehicleTask.java | 610 ++++++------- .../sch/manage/buss/StructToConveyorTask.java | 31 +- .../org/nl/wms/sch/task/AutoCreateTask.java | 7 +- .../src/main/java/org/nl/wms/wms.xls | Bin 403456 -> 402944 bytes .../src/main/resources/logback-spring.xml | 2 +- wms/qd/src/views/login.vue | 2 +- .../src/views/wms/pdm/produceTask/index.vue | 13 +- 17 files changed, 1186 insertions(+), 1093 deletions(-) diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/common/PointUpdateUtil.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/common/PointUpdateUtil.java index 998b3f1..a858257 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/common/PointUpdateUtil.java +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/common/PointUpdateUtil.java @@ -12,54 +12,48 @@ import org.nl.wql.core.bean.WQLObject; import org.springframework.http.HttpStatus; public class PointUpdateUtil { - public static void updatePoint(JSONArray arr) { - String isConnect = SpringContextHolder.getBean(ParamServiceImpl.class).findByCode("IS_CONNECT_ACS").getValue(); - if (StrUtil.equals("0", isConnect)) { - return; - } - new Thread(() -> { - try { - WmsToAcsServiceImpl wmsToAcsServiceImpl = new WmsToAcsServiceImpl(); - JSONObject joo = wmsToAcsServiceImpl.queryPointStatus(arr); - JSONArray pointarr = joo.getJSONArray("data"); - //JSONArray pointarr =new JSONArray(); - WQLObject pointTable = WQLObject.getWQLObject("sch_base_point"); - for (int i = 0; i < pointarr.size(); i++) { - JSONObject pointjo = pointarr.getJSONObject(i); - //String point_status = "00"; - String mode = pointjo.getString("mode"); - String point_status = "0" + pointjo.getString("move"); - //String vehicle_code = pointjo.getString("vehicle_code"); - String vehicle_code = pointjo.getString("barcode"); - String device_code = pointjo.getString("device_code"); - //物料类型 - String weight = pointjo.getString("weight"); - //物料 - String material_code = pointjo.getString("material"); - //将托盘类型123,改为 03,04,05,默认给01 - String pallet_type = "01"; - if (!StrUtil.equals("0", pointjo.getString("pallet_type"))) { - pallet_type = "0" + (pointjo.getIntValue("pallet_type") + 2); - } - pointjo.put("point_status", point_status); - if (StrUtil.equals(vehicle_code, "0")) { - vehicle_code = ""; - } - JSONObject pointObj = pointTable.query("point_code ='" + device_code + "'").uniqueResult(0); - pointObj.put("vehicle_code", vehicle_code); - pointObj.put("point_status", point_status); - pointObj.put("vehicle_type", pallet_type); - pointObj.put("material_type", weight); - pointObj.put("material_code", material_code); - pointObj.put("mode", mode); - pointTable.update(pointObj); - } - } catch (Exception e) { - e.printStackTrace(); - } - }).start(); - + public static void updatePoint(JSONArray arr) { + String isConnect = + SpringContextHolder.getBean(ParamServiceImpl.class).findByCode("IS_CONNECT_ACS").getValue(); + if (StrUtil.equals("0", isConnect)) { + return; } + try { + WmsToAcsServiceImpl wmsToAcsServiceImpl = new WmsToAcsServiceImpl(); + JSONObject joo = wmsToAcsServiceImpl.queryPointStatus(arr); + JSONArray pointarr = joo.getJSONArray("data"); + WQLObject pointTable = WQLObject.getWQLObject("sch_base_point"); + for (int i = 0; i < pointarr.size(); i++) { + JSONObject pointjo = pointarr.getJSONObject(i); + String mode = pointjo.getString("mode"); + String point_status = "0" + pointjo.getString("move"); + String vehicle_code = pointjo.getString("barcode"); + String device_code = pointjo.getString("device_code"); + // 物料类型 + String weight = pointjo.getString("weight"); + // 物料 + String material_code = pointjo.getString("material"); + // 将托盘类型123,改为 03,04,05,默认给01 + String pallet_type = "01"; + if (!StrUtil.equals("0", pointjo.getString("pallet_type"))) { + pallet_type = "0" + (pointjo.getIntValue("pallet_type") + 2); + } + pointjo.put("point_status", point_status); + if (StrUtil.equals(vehicle_code, "0")) { + vehicle_code = ""; + } + JSONObject pointObj = pointTable.query("point_code ='" + device_code + "'").uniqueResult(0); + pointObj.put("vehicle_code", vehicle_code); + pointObj.put("point_status", point_status); + pointObj.put("vehicle_type", pallet_type); + pointObj.put("material_type", weight); + pointObj.put("material_code", material_code); + pointObj.put("mode", mode); + pointTable.update(pointObj); + } + } catch (Exception e) { - + e.printStackTrace(); + } + } } diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/common/StructFindUtil.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/common/StructFindUtil.java index d8a9f85..f27d0ee 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/common/StructFindUtil.java +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/common/StructFindUtil.java @@ -94,7 +94,7 @@ public class StructFindUtil { } } JSONObject result = new JSONObject(); - // 木托盘区 + // 木托盘区--RGV if (StrUtil.equals("05", area_type)) { result = WQL.getWO("QSTRUCT_RULE").addParam("flag", "11") .addParam("area_type", area_type).addParam("vehicle_type", vehicle_type).process().uniqueResult(0); diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/common/wql/QSTRUCT_RULE.wql b/wms/hd/nladmin-system/src/main/java/org/nl/wms/common/wql/QSTRUCT_RULE.wql index 9e6590e..5800641 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/common/wql/QSTRUCT_RULE.wql +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/common/wql/QSTRUCT_RULE.wql @@ -350,8 +350,9 @@ IF 输入.flag = "11" LEFT JOIN md_pb_vehicle vehicle ON vehicle.vehicle_code = point.vehicle_code AND point.vehicle_code <> '' WHERE - point.lock_type = '00' - AND point.point_status = '01' + point.point_status = '01' + and + ( point.lock_type = '00' or point.lock_type = '01') OPTION 输入.area_type <> "" point.area_type = 输入.area_type ENDOPTION diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/AcsToWmsService.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/AcsToWmsService.java index deb413e..c1837f8 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/AcsToWmsService.java +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/AcsToWmsService.java @@ -15,6 +15,8 @@ public interface AcsToWmsService { */ Map receiveTaskFromAcs(Map jsonObject); + + Map receiveTaskFromAcsTrancs(Map jsonObject); /** * ACS客户端--->WMS服务端 * ACS机械手给WMS发送任务 diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java index c2626c8..f1a6b28 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java @@ -32,6 +32,7 @@ import org.nl.wms.sch.service.dto.PointDto; import org.nl.wms.sch.service.dto.TaskDto; import org.nl.wql.WQL; import org.nl.wql.core.bean.WQLObject; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -55,8 +56,20 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { private final FmjToPackIngTask fmjToPackIngTask; private final VehicleService vehicleService; + @Autowired + private AcsToWmsService acsToWmsService; + @Override public Map receiveTaskFromAcs(Map jsonObject) { + String type = (String) jsonObject.get("type"); + synchronized (type) { + return acsToWmsService.receiveTaskFromAcsTrancs(jsonObject); + } + } + + @Override + @Transactional + public Map receiveTaskFromAcsTrancs(Map jsonObject) { log.debug("ACS的receiveTaskFromAcs请求参数为:" + jsonObject); String device_code = (String) jsonObject.get("device_code"); String type = (String) jsonObject.get("type"); @@ -72,345 +85,353 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { } WQLObject pointTable = WQLObject.getWQLObject("sch_base_point"); WQLObject structivtTable = WQLObject.getWQLObject("st_ivt_structivt"); - synchronized (type) { - switch (type) { - // 送料入库 - case "1": - jsonObject.put("start_point_code", device_code); - jsonObject.put("create_mode", "01"); - jsonObject.put("group_id", group_id); - // 假如是半托缓存的几个位置,强制去包装 - String area_type = + + switch (type) { + // 送料入库 + case "1": + jsonObject.put("start_point_code", device_code); + jsonObject.put("create_mode", "01"); + jsonObject.put("group_id", group_id); + // 假如是半托缓存的几个位置,强制去包装 + String area_type = + pointTable + .query("point_code ='" + device_code + "'") + .uniqueResult(0) + .getString("area_type"); + if (StrUtil.equals(area_type, AreaEnum.BTHCQ.getCode())) { + fmjToPackIngTask.createTask((JSONObject) JSON.toJSON(jsonObject)); + // 生成到包装位的任务时,下发托盘类型给RGV + String point_id = pointTable .query("point_code ='" + device_code + "'") .uniqueResult(0) - .getString("area_type"); - if (StrUtil.equals(area_type, AreaEnum.BTHCQ.getCode())) { - fmjToPackIngTask.createTask((JSONObject) JSON.toJSON(jsonObject)); - // 生成到包装位的任务时,下发托盘类型给RGV - String point_id = - pointTable - .query("point_code ='" + device_code + "'") - .uniqueResult(0) - .getString("point_id"); - String material_id = - structivtTable - .query("struct_id ='" + point_id + "'") - .uniqueResult(0) - .getString("material_id"); - JSONObject materiralObj1 = - WQLObject.getWQLObject("md_me_material") - .query("material_id = '" + material_id + "'") - .uniqueResult(0); - // 寻找对应的托盘类型 + .getString("point_id"); + String material_id = + structivtTable + .query("struct_id ='" + point_id + "'") + .uniqueResult(0) + .getString("material_id"); + JSONObject materiralObj1 = + WQLObject.getWQLObject("md_me_material") + .query("material_id = '" + material_id + "'") + .uniqueResult(0); + // 寻找对应的托盘类型 + String vehicle_type = + vehicleService.getVehicleType(materiralObj1.getString("vehicle_type")); + JSONObject jsonObject1 = new JSONObject(); + JSONArray array = new JSONArray(); + jsonObject1.put("device_code", "RGV2"); + jsonObject1.put("code", "to_container_type"); + jsonObject1.put("value", vehicle_type); + array.add(jsonObject1); + wmsToAcsServiceImpl.action(array); + break; + } + if (StrUtil.isEmpty(is_full)) { + throw new BadRequestException("托盘是否满托不能为空!"); + } + String material_code = (String) jsonObject.get("material_code"); + String producetask_id = (String) jsonObject.get("producetask_id"); + String material_id = ""; + JSONObject materialObj = + WQLObject.getWQLObject("md_me_material") + .query("material_code ='" + material_code + "'") + .uniqueResult(0); + if (StrUtil.isEmpty(material_code) + && (!StrUtil.equals(device_code, "CYSSX101")) + && !StrUtil.equals(device_code.substring(0, 4), "BTHC")) { + throw new BadRequestException("物料不能为空!"); + } + if (!StrUtil.equals(device_code, "CYSSX101") + && !StrUtil.equals(device_code.substring(0, 4), "BTHC")) { + material_id = materialObj.getString("material_id"); + } + // 如果是出窑输送线 要从组盘表里面去找物料 + if (StrUtil.equals(device_code, "CYSSX101")) { + String vehicle_code = jsonObject.get("vehicle_code").toString(); + if (StrUtil.isEmpty(vehicle_code)) { + throw new BadRequestException("载具不能为空!"); + } + 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 + "'的组盘信息!"); + } + material_id = vehicleObj.getString("material_id"); + if (ObjectUtil.isEmpty(vehicleObj.getString("qty"))) { + jsonObject.put("qty", "0"); + } else { + jsonObject.put("qty", vehicleObj.getString("qty")); + } + + jsonObject.put("vehicle_code", vehicle_code); + } + jsonObject.put("producetask_id", producetask_id); + jsonObject.put("create_mode", "01"); + jsonObject.put("material_id", material_id); + JSONObject materiralObj = + WQLObject.getWQLObject("md_me_material") + .query("material_id = '" + material_id + "'") + .uniqueResult(0); + Double stewing_time = materiralObj.getDouble("stewing_time"); + jsonObject.put("stewing_time", stewing_time); + // 假如是压制下料的几个位置,则要考虑是入输送线 还是入立体库 + if (StrUtil.equals(area_type, AreaEnum.YZQY.getCode()) && stewing_time <= 0) { + // 1.首先更新所有输送线的点位状态 + JSONArray pointarr = + WQL.getWO("ACSTOMES_001") + .addParam("area_type", "07") + .addParam("flag", "4") + .process() + .getResultJSONArray(0); + PointUpdateUtil.updatePoint(pointarr); + // 2.找一个合适的输送带 + JSONObject pointObj = StructFindUtil.getConveyor(materiralObj); + // 如果未找到合适的输送带 就去货架 + if (ObjectUtil.isNotEmpty(pointObj)) { + jsonObject.put("next_point_code", pointObj.getString("point_code")); + jsonObject.put("group_id", group_id); + toConveyorTask.createTask((JSONObject) JSON.toJSON(jsonObject)); + // 假如是压制下料的几个位置 需要记 录不合格数量 + if (StrUtil.equals(area_type, AreaEnum.YZQY.getCode())) { + JSONObject joo = new JSONObject(); + joo.put("qty", jsonObject.get("unqualified_qty")); + joo.put("device_code", device_code); + try { + String record_id = PressureUtil.record(joo); + // 回传不合格记录 + WmsToJnServiceImpl wmsToJnService = new WmsToJnServiceImpl(); + wmsToJnService.feedBackQualityInfo(record_id); + } catch (Exception e) { + log.info("回传MES记录不合格异常!"); + e.printStackTrace(); + } + } + break; + } + } + // 假如是分拣机械手的下料位置,并且是满托,则去包装线 + if (StrUtil.equals("1", is_full) && StrUtil.equals(area_type, AreaEnum.FJQY.getCode())) { + String vehicle_code = + pointTable + .query("point_code ='" + device_code + "'") + .uniqueResult(0) + .getString("vehicle_code"); + jsonObject.put("vehicle_code", vehicle_code); + // if (StrUtil.isEmpty(vehicle_code)) { + // throw new BadRequestException("当前点位载具号为空!"); + // } + toPackIngTask.createTask((JSONObject) JSON.toJSON(jsonObject)); + + // 生成到包装位的任务时,下发托盘类型给RGV + JSONObject vehicleObj = + WQLObject.getWQLObject("md_pb_vehicle") + .query("vehicle_code='" + vehicle_code + "'", "create_time desc") + .uniqueResult(0); + if (ObjectUtil.isNotEmpty(vehicleObj)) { String vehicle_type = - vehicleService.getVehicleType(materiralObj1.getString("vehicle_type")); + vehicleService.getVehicleType(vehicleObj.getString("vehicle_type")); JSONObject jsonObject1 = new JSONObject(); JSONArray array = new JSONArray(); jsonObject1.put("device_code", "RGV2"); jsonObject1.put("code", "to_container_type"); jsonObject1.put("value", vehicle_type); array.add(jsonObject1); - wmsToAcsServiceImpl.action(array); - break; - } - if (StrUtil.isEmpty(is_full)) { - throw new BadRequestException("托盘是否满托不能为空!"); - } - String material_code = (String) jsonObject.get("material_code"); - String producetask_id = (String) jsonObject.get("producetask_id"); - String material_id = ""; - JSONObject materialObj = - WQLObject.getWQLObject("md_me_material") - .query("material_code ='" + material_code + "'") - .uniqueResult(0); - if (StrUtil.isEmpty(material_code) - && (!StrUtil.equals(device_code, "CYSSX101")) - && !StrUtil.equals(device_code.substring(0, 4), "BTHC")) { - throw new BadRequestException("物料不能为空!"); - } - if (!StrUtil.equals(device_code, "CYSSX101") - && !StrUtil.equals(device_code.substring(0, 4), "BTHC")) { - material_id = materialObj.getString("material_id"); - } - // 如果是出窑输送线 要从组盘表里面去找物料 - if (StrUtil.equals(device_code, "CYSSX101")) { - String vehicle_code = jsonObject.get("vehicle_code").toString(); - if (StrUtil.isEmpty(vehicle_code)) { - throw new BadRequestException("载具不能为空!"); - } - 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 + "'的组盘信息!"); - } - material_id = vehicleObj.getString("material_id"); - if (ObjectUtil.isEmpty(vehicleObj.getString("qty"))) { - jsonObject.put("qty", "0"); - } else { - jsonObject.put("qty", vehicleObj.getString("qty")); + try { + wmsToAcsServiceImpl.action(array); + } catch (Exception e) { + e.printStackTrace(); } + } + break; + } - jsonObject.put("vehicle_code", vehicle_code); - } - jsonObject.put("producetask_id", producetask_id); - jsonObject.put("create_mode", "01"); - jsonObject.put("material_id", material_id); - JSONObject materiralObj = - WQLObject.getWQLObject("md_me_material") - .query("material_id = '" + material_id + "'") - .uniqueResult(0); - Double stewing_time = materiralObj.getDouble("stewing_time"); - jsonObject.put("stewing_time", stewing_time); - // 假如是压制下料的几个位置,则要考虑是入输送线 还是入立体库 - if (StrUtil.equals(area_type, AreaEnum.YZQY.getCode()) && stewing_time <= 0) { - // 1.首先更新所有输送线的点位状态 - JSONArray pointarr = - WQL.getWO("ACSTOMES_001") - .addParam("area_type", "07") - .addParam("flag", "4") - .process() - .getResultJSONArray(0); - PointUpdateUtil.updatePoint(pointarr); - // 2.找一个合适的输送带 - JSONObject pointObj = StructFindUtil.getConveyor(materiralObj); - // 如果未找到合适的输送带 就去货架 - if (ObjectUtil.isNotEmpty(pointObj)) { - jsonObject.put("next_point_code", pointObj.getString("point_code")); - jsonObject.put("group_id", group_id); - toConveyorTask.createTask((JSONObject) JSON.toJSON(jsonObject)); - // 假如是压制下料的几个位置 需要记 录不合格数量 - if (StrUtil.equals(area_type, AreaEnum.YZQY.getCode())) { - JSONObject joo = new JSONObject(); - joo.put("qty", jsonObject.get("unqualified_qty")); - joo.put("device_code", device_code); - String record_id = PressureUtil.record(joo); - // 回传不合格记录 - // Wms/api/produceTaskToJnServiceImpl wmsToJnService = new WmsToJnServiceImpl(); - WmsToJnServiceImpl wmsToJnService = new WmsToJnServiceImpl(); - wmsToJnService.feedBackQualityInfo(record_id); - } - break; - } - } - // 假如是分拣机械手的下料位置,并且是满托,则去包装线 - if (StrUtil.equals("1", is_full) && StrUtil.equals(area_type, AreaEnum.FJQY.getCode())) { - String vehicle_code = - pointTable - .query("point_code ='" + device_code + "'") - .uniqueResult(0) - .getString("vehicle_code"); - jsonObject.put("vehicle_code", vehicle_code); - // if (StrUtil.isEmpty(vehicle_code)) { - // throw new BadRequestException("当前点位载具号为空!"); - // } - toPackIngTask.createTask((JSONObject) JSON.toJSON(jsonObject)); + // 假如是分拣机械手的下料位置,则需要将点位上的托盘号写入 + if (StrUtil.equals(area_type, AreaEnum.FJQY.getCode())) { + String vehicle_code = + pointTable + .query("point_code ='" + device_code + "'") + .uniqueResult(0) + .getString("vehicle_code"); + jsonObject.put("vehicle_code", vehicle_code); + } + String task_id = sendMaterialTask.createTask((JSONObject) JSON.toJSON(jsonObject)); + log.info("创建送料任务标识:" + task_id); + // 假如是压制下料的几个位置 需要记录不合格数量 + if (StrUtil.equals(area_type, AreaEnum.YZQY.getCode())) { + WQLObject groupTable = WQLObject.getWQLObject("st_buss_vehiclegroup"); + JSONObject groupInfo = groupTable.query("task_id='" + task_id + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(groupInfo)) { + log.info("判断送料任务标识异常:" + task_id); - // 生成到包装位的任务时,下发托盘类型给RGV - JSONObject vehicleObj = - WQLObject.getWQLObject("md_pb_vehicle") - .query("vehicle_code='" + vehicle_code + "'", "create_time desc") - .uniqueResult(0); - if (ObjectUtil.isNotEmpty(vehicleObj)) { - String vehicle_type = - vehicleService.getVehicleType(vehicleObj.getString("vehicle_type")); - JSONObject jsonObject1 = new JSONObject(); - JSONArray array = new JSONArray(); - jsonObject1.put("device_code", "RGV2"); - jsonObject1.put("code", "to_container_type"); - jsonObject1.put("value", vehicle_type); - array.add(jsonObject1); - try { - wmsToAcsServiceImpl.action(array); - } catch (Exception e) { - e.printStackTrace(); - } - } - break; + throw new BadRequestException("压制满料扫码组盘错误,任务标识:" + task_id); } + log.info("判断送料任务正常:" + task_id); - // 假如是分拣机械手的下料位置,则需要将点位上的托盘号写入 - if (StrUtil.equals(area_type, AreaEnum.FJQY.getCode())) { - String vehicle_code = - pointTable - .query("point_code ='" + device_code + "'") - .uniqueResult(0) - .getString("vehicle_code"); - jsonObject.put("vehicle_code", vehicle_code); - } - String task_id = sendMaterialTask.createTask((JSONObject) JSON.toJSON(jsonObject)); - log.info("创建送料任务标识:"+task_id); - // 假如是压制下料的几个位置 需要记录不合格数量 - if (StrUtil.equals(area_type, AreaEnum.YZQY.getCode())) { - WQLObject groupTable = WQLObject.getWQLObject("st_buss_vehiclegroup"); - JSONObject groupInfo = groupTable.query("task_id='" + task_id + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(groupInfo)) { - log.info("判断送料任务标识异常:"+task_id); - - throw new BadRequestException("压制满料扫码组盘错误,任务标识:" + task_id); - } - log.info("判断送料任务正常:"+task_id); - - JSONObject joo = new JSONObject(); - joo.put("qty", jsonObject.get("unqualified_qty")); - joo.put("device_code", device_code); + JSONObject joo = new JSONObject(); + joo.put("qty", jsonObject.get("unqualified_qty")); + joo.put("device_code", device_code); + try { String record_id = PressureUtil.record(joo); // 回传不合格记录 WmsToJnServiceImpl wmsToJnService = new WmsToJnServiceImpl(); wmsToJnService.feedBackQualityInfo(record_id); + } catch (Exception e) { + log.info("回传MES记录不合格异常!"); + e.printStackTrace(); } + } - break; - case "2": - // 叫料出库 - jsonObject.put("next_point_code", device_code); - jsonObject.put("create_mode", "01"); - // 机械手1 is_full给1 ,机械手3is_full给空,半托,跟满托都可以出 - if (StrUtil.equals(device_code, "FJJXSSLW101") - || StrUtil.equals(device_code, "FJJXSSLW102")) { - is_full = "1"; - } - if (StrUtil.equals(device_code, "FJJXSSLW301") - || StrUtil.equals(device_code, "FJJXSSLW302")) { - is_full = "2"; - } - jsonObject.put("is_full", is_full); - produceInfoByCode = this.getProduceInfoByCode(device_code); - // 批次 物料,客户要从排产单里面去取 - jsonObject.put("material_id", produceInfoByCode.getString("material_id")); - callMaterialTask.createTask((JSONObject) JSON.toJSON(jsonObject)); - break; + break; + case "2": + // 叫料出库 + jsonObject.put("next_point_code", device_code); + jsonObject.put("create_mode", "01"); + // 机械手1 is_full给1 ,机械手3is_full给空,半托,跟满托都可以出 + if (StrUtil.equals(device_code, "FJJXSSLW101") + || StrUtil.equals(device_code, "FJJXSSLW102")) { + is_full = "1"; + } + if (StrUtil.equals(device_code, "FJJXSSLW301") + || StrUtil.equals(device_code, "FJJXSSLW302")) { + is_full = "2"; + } + jsonObject.put("is_full", is_full); + produceInfoByCode = this.getProduceInfoByCode(device_code); + // 批次 物料,客户要从排产单里面去取 + jsonObject.put("material_id", produceInfoByCode.getString("material_id")); + callMaterialTask.createTask((JSONObject) JSON.toJSON(jsonObject)); + break; - case "3": - // 送空托盘 - jsonObject.put("start_point_code", device_code); - sendEmptyVehicleTask.createTask((JSONObject) JSON.toJSON(jsonObject)); - break; - case "4": - // 叫空托盘 - jsonObject.put("next_point_code", device_code); - // 如果是叠盘位3 ,则去铁托盘缓存区取 - if (StrUtil.equals(device_code, "KTPDDW3")) { - // 1 更新缓存位 - JSONArray pointarr = - WQL.getWO("ACSTOMES_001") - .addParam("area_type", AreaEnum.KTTHCQ.getCode()) - .addParam("flag", "4") - .process() - .getResultJSONArray(0); - PointUpdateUtil.updatePoint(pointarr); - jsonObject.put("vehicle_type", VehicleTypeEnum.GTP.getCode()); - } else { - produceInfoByCode = this.getProduceInfoByCode(device_code); - // 假如是码垛位的上料位,则去看看有没有当前排产单生产的物料的半满托 - if (StrUtil.equals(device_code, "FJJXSXLW201") - || StrUtil.equals(device_code, "FJJXSXLW202") - || StrUtil.equals(device_code, "FJJXSXLW301") - || StrUtil.equals(device_code, "FJJXSXLW302")) { - - JSONObject joo = pointTable.query("point_code='" + device_code + "'").uniqueResult(0); - material_id = produceInfoByCode.getString("material_id"); - String workprocedure_id = WorkProcedureEnum.FJGX.getId(); - JSONObject jsonObject1 = - WQL.getWO("ACSTOMES_001") - .addParam("flag", "1") - .addParam("workprocedure_id", workprocedure_id) - .addParam("material_id", material_id) - .addParam("device_id", joo.getString("device_id")) - .process() - .uniqueResult(0); - if (ObjectUtil.isNotEmpty(jsonObject1)) { - // 如果有库存,则出半满托盘 - // 叫料出库 - jsonObject.put("next_point_code", device_code); - jsonObject.put("create_mode", "01"); - jsonObject.put("material_id", material_id); - jsonObject.put("is_full", "0"); - jsonObject.put("workprocedure_id", WorkProcedureEnum.BZGX.getId()); - jsonObject.put("group_device", jsonObject1.getString("group_device_id")); - callMaterialTask.createTask((JSONObject) JSON.toJSON(jsonObject)); - break; - } - // 需要更新覆膜机的托盘类型 - JSONArray pointarr = - WQL.getWO("ACSTOMES_001") - .addParam("area_type", "05") - .addParam("flag", "4") - .process() - .getResultJSONArray(0); - PointUpdateUtil.updatePoint(pointarr); - } - if (ObjectUtil.isEmpty(produceInfoByCode)) { - throw new BadRequestException("未找到点位为'" + device_code + "'对应机械手的生产工单!"); - } - jsonObject.put("vehicle_type", produceInfoByCode.getString("vehicle_type")); - // 需要更新堆叠位的点位状态 - JSONArray pointarr = - WQL.getWO("ACSTOMES_001") - .addParam("point_code", "KTPDDW5") - .addParam("flag", "4") - .process() - .getResultJSONArray(0); - PointUpdateUtil.updatePoint(pointarr); - } - callEmptyVehicleTask.createTask((JSONObject) JSON.toJSON(jsonObject)); - break; - // 生产rgv搬运任务 - case "5": - jsonObject.put("next_point_code", device_code); - jsonObject.put("create_mode", "01"); - // 1 判断有没有执行的Rgv搬运任务 - JSONObject taskObj = - WQLObject.getWQLObject("SCH_BASE_Task") - .query("task_type='04' and is_delete='0' and acs_task_type<>'07'") - .uniqueResult(0); - if (ObjectUtil.isNotEmpty(taskObj)) { - JSONObject result = new JSONObject(); - result.put("status", HttpStatus.CREATED.value()); - result.put("message", "失败!"); - result.put("data", new JSONObject()); - return result; - } - // 寻找起点 - // 更新所有设备的点位的状态 - // JSONArray pointConveyArr = pointTable.query("area_type='07' and device_point_type ='01' - // ").getResultJSONArray(0); - JSONArray pointConveyArr = + case "3": + // 送空托盘 + jsonObject.put("start_point_code", device_code); + sendEmptyVehicleTask.createTask((JSONObject) JSON.toJSON(jsonObject)); + break; + case "4": + // 叫空托盘 + jsonObject.put("next_point_code", device_code); + // 如果是叠盘位3 ,则去铁托盘缓存区取 + if (StrUtil.equals(device_code, "KTPDDW3")) { + // 1 更新缓存位 + JSONArray pointarr = WQL.getWO("ACSTOMES_001") - .addParam("area_type", "07") + .addParam("area_type", AreaEnum.KTTHCQ.getCode()) .addParam("flag", "4") .process() .getResultJSONArray(0); + PointUpdateUtil.updatePoint(pointarr); + jsonObject.put("vehicle_type", VehicleTypeEnum.GTP.getCode()); + } else { + produceInfoByCode = this.getProduceInfoByCode(device_code); + // 假如是码垛位的上料位,则去看看有没有当前排产单生产的物料的半满托 + if (StrUtil.equals(device_code, "FJJXSXLW201") + || StrUtil.equals(device_code, "FJJXSXLW202") + || StrUtil.equals(device_code, "FJJXSXLW301") + || StrUtil.equals(device_code, "FJJXSXLW302")) { - PointUpdateUtil.updatePoint(pointConveyArr); - // 假如没有设置哪个输送线先出,没有按照先进先出 - JSONObject param = new JSONObject(); - String rule = - WQLObject.getWQLObject("sys_param") - .query("code='is_outrule'") - .uniqueResult(0) - .getString("value"); - if (StrUtil.equals(rule, "1")) { - param = WQL.getWO("ACSTOMES_001").addParam("flag", "3").process().uniqueResult(0); - } else { - param = WQL.getWO("ACSTOMES_001").addParam("flag", "2").process().uniqueResult(0); + JSONObject joo = pointTable.query("point_code='" + device_code + "'").uniqueResult(0); + material_id = produceInfoByCode.getString("material_id"); + String workprocedure_id = WorkProcedureEnum.FJGX.getId(); + JSONObject jsonObject1 = + WQL.getWO("ACSTOMES_001") + .addParam("flag", "1") + .addParam("workprocedure_id", workprocedure_id) + .addParam("material_id", material_id) + .addParam("device_id", joo.getString("device_id")) + .process() + .uniqueResult(0); + if (ObjectUtil.isNotEmpty(jsonObject1)) { + // 如果有库存,则出半满托盘 + // 叫料出库 + jsonObject.put("next_point_code", device_code); + jsonObject.put("create_mode", "01"); + jsonObject.put("material_id", material_id); + jsonObject.put("is_full", "0"); + jsonObject.put("workprocedure_id", WorkProcedureEnum.BZGX.getId()); + jsonObject.put("group_device", jsonObject1.getString("group_device_id")); + callMaterialTask.createTask((JSONObject) JSON.toJSON(jsonObject)); + break; + } + // 需要更新覆膜机的托盘类型 + JSONArray pointarr = + WQL.getWO("ACSTOMES_001") + .addParam("area_type", "05") + .addParam("flag", "4") + .process() + .getResultJSONArray(0); + PointUpdateUtil.updatePoint(pointarr); } - if (ObjectUtil.isEmpty(param)) { - throw new BadRequestException("未找到合适的输送线可以出!"); + if (ObjectUtil.isEmpty(produceInfoByCode)) { + throw new BadRequestException("未找到点位为'" + device_code + "'对应机械手的生产工单!"); } - jsonObject.put("start_point_code", param.getString("point_code")); - jsonObject.put("vehicle_code", param.getString("vehicle_code")); - rgvTask.createTask((JSONObject) JSON.toJSON(jsonObject)); - break; - } - JSONObject result = new JSONObject(); - result.put("status", HttpStatus.OK.value()); - result.put("message", "任务状态反馈成功!"); - result.put("data", new JSONObject()); - return result; + jsonObject.put("vehicle_type", produceInfoByCode.getString("vehicle_type")); + // 需要更新堆叠位的点位状态 + JSONArray pointarr = + WQL.getWO("ACSTOMES_001") + .addParam("point_code", "KTPDDW5") + .addParam("flag", "4") + .process() + .getResultJSONArray(0); + PointUpdateUtil.updatePoint(pointarr); + } + callEmptyVehicleTask.createTask((JSONObject) JSON.toJSON(jsonObject)); + break; + // 生产rgv搬运任务 + case "5": + jsonObject.put("next_point_code", device_code); + jsonObject.put("create_mode", "01"); + // 1 判断有没有执行的Rgv搬运任务 + JSONObject taskObj = + WQLObject.getWQLObject("SCH_BASE_Task") + .query("task_type='04' and is_delete='0' and acs_task_type<>'07'") + .uniqueResult(0); + if (ObjectUtil.isNotEmpty(taskObj)) { + JSONObject result = new JSONObject(); + result.put("status", HttpStatus.CREATED.value()); + result.put("message", "失败!"); + result.put("data", new JSONObject()); + return result; + } + // 寻找起点 + // 更新所有设备的点位的状态 + // JSONArray pointConveyArr = pointTable.query("area_type='07' and device_point_type ='01' + // ").getResultJSONArray(0); + JSONArray pointConveyArr = + WQL.getWO("ACSTOMES_001") + .addParam("area_type", "07") + .addParam("flag", "4") + .process() + .getResultJSONArray(0); + + PointUpdateUtil.updatePoint(pointConveyArr); + // 假如没有设置哪个输送线先出,没有按照先进先出 + JSONObject param = new JSONObject(); + String rule = + WQLObject.getWQLObject("sys_param") + .query("code='is_outrule'") + .uniqueResult(0) + .getString("value"); + if (StrUtil.equals(rule, "1")) { + param = WQL.getWO("ACSTOMES_001").addParam("flag", "3").process().uniqueResult(0); + } else { + param = WQL.getWO("ACSTOMES_001").addParam("flag", "2").process().uniqueResult(0); + } + if (ObjectUtil.isEmpty(param)) { + throw new BadRequestException("未找到合适的输送线可以出!"); + } + jsonObject.put("start_point_code", param.getString("point_code")); + jsonObject.put("vehicle_code", param.getString("vehicle_code")); + rgvTask.createTask((JSONObject) JSON.toJSON(jsonObject)); + break; } + JSONObject result = new JSONObject(); + result.put("status", HttpStatus.OK.value()); + result.put("message", "任务状态反馈成功!"); + result.put("data", new JSONObject()); + return result; } @Override @@ -436,7 +457,6 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { String qty = String.valueOf(jsonObject.get("qty")); // 产品编码 String product_code = String.valueOf(jsonObject.get("product_code")); - // String material_code = (String) jsonObject.get("material_code"); if (StrUtil.isEmpty(product_code)) { throw new BadRequestException("产品编号不能为空!"); } @@ -542,6 +562,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { } groubObj.put("vehicle_code", vehicle_code); WQLObject.getWQLObject("st_buss_vehiclegroup").insert(groubObj); + jsonObject.put("type", "1"); jsonObject.put("group_id", group_id); jsonObject.put("producetask_id", producetask_id); @@ -597,9 +618,39 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { groupObj.put("update_time", DateUtil.now()); groupTable.update(groupObj); } else { - String msg = "未找到任务号为" + task_code + "的组盘信息"; - log.error(msg); - throw new BadRequestException(msg); + groupObj = new JSONObject(); + // 压制下料找不到组盘信息,根据任务号补齐组盘信息 + String start_area = taskobj.getString("start_area"); + JSONObject requestParam = taskobj.getJSONObject("request_param"); + if ("22".equals(start_area)) { + JSONObject materialObj = + WQLObject.getWQLObject("MD_ME_Material") + .query("material_id='" + requestParam.getString("material_id") + "'") + .uniqueResult(0); + groupObj.put("material_code", materialObj.getString("material_code")); + groupObj.put("material_name", materialObj.getString("material_name")); + groupObj.put("material_spec", materialObj.getString("material_spec")); + groupObj.put("group_id", requestParam.getString("group_id")); + groupObj.put("vehicle_code", vehicle_code); + groupObj.put("material_id", requestParam.getString("material_id")); + groupObj.put("producetask_id", requestParam.getString("producetask_id")); + groupObj.put("qty", requestParam.getString("qty")); + groupObj.put("is_full", requestParam.getString("is_full")); + groupObj.put("is_autopackage", "1"); + + groupObj.put("task_id", taskobj.getString("task_id")); + groupObj.put("material_move_id", taskobj.getString("task_id")); + + groupObj.put("create_id", UserInfoUtil.getCurrentUserId()); + groupObj.put("create_name", UserInfoUtil.getNickName()); + groupObj.put("create_time", DateUtil.now()); + groupTable.insert(groupObj); + + } else { + String msg = "未找到任务号为" + task_code + "的组盘信息"; + log.error(msg); + throw new BadRequestException(msg); + } } } @@ -854,6 +905,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { wmsToJnServiceImpl.feedBackPackWordShop(map); } } + // 排产工单完成! if (StrUtil.equals("2", type)) { taskObj.put("producetask_status", "05"); taskObj.put("real_qty", qty); @@ -933,11 +985,6 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { Class clz = Class.forName(processing_class); AbstractAcsTask bean = (AbstractAcsTask) SpringContextHolder.getBean(clz); bean.updateTaskStatus(row, status); - // Object obj = clz.newInstance(); - // // 调用每个任务类的forceFinishInst()强制结束方法 - // Method m = obj.getClass().getDeclaredMethod("updateTaskStatus", - // JSONObject.class, String.class); - // m.invoke(obj, row, status); } catch (Exception e) { e.printStackTrace(); message = e.getMessage(); @@ -1044,7 +1091,6 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { .query("point_code = '" + device_code + "'") .uniqueResult(0) .getString("vehicle_code"); - // WQLObject CribbingInfo_Table = WQLObject.getWQLObject("MD_ME_CribbingInfo"); WQLObject group_table = WQLObject.getWQLObject("st_buss_vehiclegroup"); // 从组盘表里面去获取组盘信息 JSONObject result = group_table.query("vehicle_code = '" + vehicle_code + "'").uniqueResult(0); diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/bindMaterial/service/impl/PdaBindingMaterialServiceImpl.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/bindMaterial/service/impl/PdaBindingMaterialServiceImpl.java index 419950b..60e4329 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/bindMaterial/service/impl/PdaBindingMaterialServiceImpl.java +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/bindMaterial/service/impl/PdaBindingMaterialServiceImpl.java @@ -27,7 +27,6 @@ public class PdaBindingMaterialServiceImpl implements PdaBindingMaterialService public Map queryInfoByVehicle(Map jsonObject) { JSONObject returnjo = new JSONObject(); String vehicle_code = (String) jsonObject.get("vehicle_code"); - //JSONArray materialja = WQLObject.getWQLObject("st_buss_vehiclegroup").query("vehicle_code='"+vehicle_code+"'").getResultJSONArray(0); JSONObject materialja = WQL.getWO("QPADSERVICE").addParam("vehicle_code", vehicle_code).addParam("flag", "16").process().uniqueResult(0); returnjo.put("code", "1"); returnjo.put("desc", "查询成功!"); diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/callEmpty/rest/CallEmptyController.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/callEmpty/rest/CallEmptyController.java index bfa7eaa..4ce15fe 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/callEmpty/rest/CallEmptyController.java +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/callEmpty/rest/CallEmptyController.java @@ -2,14 +2,12 @@ package org.nl.wms.pda.callEmpty.rest; -import com.alibaba.fastjson.JSONArray; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.nl.annotation.Log; import org.nl.wms.pda.callEmpty.service.CallEmptyService; -import org.nl.wms.pda.sendMaterial.service.SendMaterialService; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/sendMaterial/rest/SendMaterialController.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/sendMaterial/rest/SendMaterialController.java index e2c9cab..c01db96 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/sendMaterial/rest/SendMaterialController.java +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/sendMaterial/rest/SendMaterialController.java @@ -2,7 +2,6 @@ package org.nl.wms.pda.sendMaterial.rest; -import com.alibaba.fastjson.JSONArray; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/sendMaterial/service/impl/SendMaterialServiceImpl.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/sendMaterial/service/impl/SendMaterialServiceImpl.java index 3f57a09..1a0341a 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/sendMaterial/service/impl/SendMaterialServiceImpl.java +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/pda/sendMaterial/service/impl/SendMaterialServiceImpl.java @@ -2,7 +2,6 @@ package org.nl.wms.pda.sendMaterial.service.impl; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.IdUtil; -import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; @@ -10,24 +9,18 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.nl.exception.BadRequestException; -import org.nl.modules.system.service.UserService; import org.nl.common.utils.UserInfoUtil; +import org.nl.exception.BadRequestException; import org.nl.wms.WorkProcedureEnum; -import org.nl.wms.database.service.MaterialService; import org.nl.wms.ext.acs.service.impl.AcsToWmsServiceImpl; -import org.nl.wms.pda.sendMaterial.service.SendMaterialService; import org.nl.wms.pda.exception.PdaRequestException; -import org.nl.wms.sch.manage.buss.FmjToPackIngTask; +import org.nl.wms.pda.sendMaterial.service.SendMaterialService; import org.nl.wms.sch.manage.buss.SendMaterialTask; import org.nl.wql.core.bean.WQLObject; -import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.RequestBody; -import java.math.BigDecimal; -import java.util.HashMap; import java.util.Map; @Service diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/pdm/service/impl/ProducetaskServiceImpl.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/pdm/service/impl/ProducetaskServiceImpl.java index ee7a95b..860be48 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/pdm/service/impl/ProducetaskServiceImpl.java +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/pdm/service/impl/ProducetaskServiceImpl.java @@ -1,7 +1,5 @@ - package org.nl.wms.pdm.service.impl; - import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.poi.excel.ExcelReader; @@ -52,419 +50,467 @@ import javax.servlet.http.HttpServletRequest; * @author geng by * @description 服务实现 * @date 2022-04-26 - **/ + */ @Service @RequiredArgsConstructor @Slf4j public class ProducetaskServiceImpl implements ProducetaskService { - @Autowired - DeviceService deviceService; + @Autowired DeviceService deviceService; - @Override - public Map queryAll(Map whereJson, Pageable page) { - String search = MapUtil.getStr(whereJson, "search"); - String material_id = MapUtil.getStr(whereJson, "material_id"); - String device_id = MapUtil.getStr(whereJson, "device_id"); - String produceline_id = MapUtil.getStr(whereJson, "produceline_id"); - String cust_id = MapUtil.getStr(whereJson, "cust_id"); - String workprocedure_id = MapUtil.getStr(whereJson, "workprocedure_id"); - String producetask_status = MapUtil.getStr(whereJson, "producetask_status"); - String material_name = MapUtil.getStr(whereJson, "material_name"); - String device_name = MapUtil.getStr(whereJson, "device_name"); - JSONObject map = new JSONObject(); - map.put("flag", "1"); - map.put("material_id", material_id); - map.put("device_id", device_id); - map.put("produceline_id", produceline_id); - map.put("cust_id", cust_id); - map.put("workprocedure_id", workprocedure_id); - map.put("producetask_status", producetask_status); - if (ObjectUtil.isNotEmpty(material_name)) { - map.put("material_name", "%" + material_name + "%"); - } - if (ObjectUtil.isNotEmpty(device_name)) { - map.put("device_name", "%" + device_name + "%"); - } - if (ObjectUtil.isNotEmpty(search)) { - map.put("search", "%" + search + "%"); - } - JSONObject json = WQL.getWO("PDM_ProduceTask_01").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), "task.create_time desc"); - return json; + @Override + public Map queryAll(Map whereJson, Pageable page) { + String search = MapUtil.getStr(whereJson, "search"); + String material_id = MapUtil.getStr(whereJson, "material_id"); + String device_id = MapUtil.getStr(whereJson, "device_id"); + String produceline_id = MapUtil.getStr(whereJson, "produceline_id"); + String cust_id = MapUtil.getStr(whereJson, "cust_id"); + String workprocedure_id = MapUtil.getStr(whereJson, "workprocedure_id"); + String producetask_status = MapUtil.getStr(whereJson, "producetask_status"); + String material_name = MapUtil.getStr(whereJson, "material_name"); + String device_name = MapUtil.getStr(whereJson, "device_name"); + JSONObject map = new JSONObject(); + map.put("flag", "1"); + map.put("material_id", material_id); + map.put("device_id", device_id); + map.put("produceline_id", produceline_id); + map.put("cust_id", cust_id); + map.put("workprocedure_id", workprocedure_id); + map.put("producetask_status", producetask_status); + if (ObjectUtil.isNotEmpty(material_name)) { + map.put("material_name", "%" + material_name + "%"); + } + if (ObjectUtil.isNotEmpty(device_name)) { + map.put("device_name", "%" + device_name + "%"); + } + if (ObjectUtil.isNotEmpty(search)) { + map.put("search", "%" + search + "%"); + } + JSONObject json = + WQL.getWO("PDM_ProduceTask_01") + .addParamMap(map) + .pageQuery(WqlUtil.getHttpContext(page), "task.create_time desc"); + return json; + } + + @Override + public List queryAll(Map whereJson) { + WQLObject wo = WQLObject.getWQLObject("pdm_mg_producetask"); + JSONArray arr = wo.query().getResultJSONArray(0); + if (ObjectUtil.isNotEmpty(arr)) return arr.toJavaList(ProducetaskDto.class); + return null; + } + + @Override + public ProducetaskDto findById(Long producetask_id) { + WQLObject wo = WQLObject.getWQLObject("pdm_mg_producetask"); + JSONObject json = wo.query("producetask_id = '" + producetask_id + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(json)) { + return json.toJavaObject(ProducetaskDto.class); + } + return null; + } + + @Override + public ProducetaskDto findByCode(String code) { + WQLObject wo = WQLObject.getWQLObject("pdm_mg_producetask"); + JSONObject json = + wo.query("is_delete = '0' and producetask_code ='" + code + "'").uniqueResult(0); + if (ObjectUtil.isNotEmpty(json)) { + return json.toJavaObject(ProducetaskDto.class); + } + return null; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void create(ProducetaskDto dto) { + + // 编码唯一性校验 + String producetask_code = dto.getProducetask_code(); + ProducetaskDto byCode = this.findByCode(producetask_code); + // if (ObjectUtil.isNotEmpty(byCode)) throw new BadRequestException("编码已存在!"); + + Long currentUserId = UserInfoUtil.getCurrentUserId(); + String nickName = UserInfoUtil.getNickName(); + String now = DateUtil.now(); + + String material_id = dto.getMaterial_id().toString(); + // 根据物料去找木托盘类型 + JSONObject materialObj = + WQLObject.getWQLObject("md_me_material") + .query("material_id = '" + material_id + "'") + .uniqueResult(0); + String vehicle_type = materialObj.getString("vehicle_type"); + if (StrUtil.isEmpty(vehicle_type) || StrUtil.equals(vehicle_type, "0")) { + throw new RuntimeException("木托盘类型不可为空!"); + } + dto.setVehicle_type(vehicle_type); + dto.setProducetask_id(IdUtil.getSnowflake(1, 1).nextId()); + dto.setProducetask_code(CodeUtil.getNewCode("PRODUCE_CODE")); + dto.setCreate_id(currentUserId); + dto.setCreate_name(nickName); + dto.setUpdate_optid(currentUserId); + dto.setUpdate_optname(nickName); + dto.setUpdate_time(now); + dto.setCreate_time(now); + dto.setProducetask_status("01"); + WQLObject wo = WQLObject.getWQLObject("pdm_mg_producetask"); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + wo.insert(json); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(ProducetaskDto dto) { + ProducetaskDto entity = this.findById(dto.getProducetask_id()); + if (entity == null) throw new BadRequestException("被删除或无权限,操作失败!"); + + // 编码唯一性校验 + WQLObject wo = WQLObject.getWQLObject("pdm_mg_producetask"); + String where = + "is_delete = '0' and producetask_code = '" + + dto.getProducetask_code() + + "' and producetask_id != '" + + dto.getProducetask_id() + + "'"; + + JSONObject jsonObject = wo.query(where).uniqueResult(0); + if (ObjectUtil.isNotEmpty(jsonObject)) { + throw new BadRequestException("编码已存在!"); } - @Override - public List queryAll(Map whereJson) { - WQLObject wo = WQLObject.getWQLObject("pdm_mg_producetask"); - JSONArray arr = wo.query().getResultJSONArray(0); - if (ObjectUtil.isNotEmpty(arr)) return arr.toJavaList(ProducetaskDto.class); - return null; + Long currentUserId = UserInfoUtil.getCurrentUserId(); + String nickName = UserInfoUtil.getNickName(); + + String now = DateUtil.now(); + dto.setUpdate_time(now); + dto.setUpdate_optid(currentUserId); + dto.setUpdate_optname(nickName); + + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + wo.update(json); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteAll(Long[] ids) { + WQLObject wo = WQLObject.getWQLObject("pdm_mg_producetask"); + for (Long producetask_id : ids) { + wo.delete("producetask_id = '" + producetask_id + "'"); + } + } + + @Override + public JSONArray getMaterial() { + WQLObject wo = WQLObject.getWQLObject("md_me_material"); + JSONArray arr = wo.query(" is_delete = '0'", "update_time").getResultJSONArray(0); + return arr; + } + + @Override + public JSONArray getDevice(JSONObject param) { + String workprocedure_id = param.getString("workprocedure_id"); + WQLObject wo = WQLObject.getWQLObject("pdm_base_device"); + JSONArray arr = + wo.query( + " is_delete = '0' and workprocedure_id = '" + workprocedure_id + "'", "device_code") + .getResultJSONArray(0); + return arr; + } + + @Override + public JSONArray getDevice1() { + WQLObject wo = WQLObject.getWQLObject("pdm_base_device"); + JSONArray arr = + wo.query(" is_delete = '0' and is_work_device ='1'", "device_code").getResultJSONArray(0); + return arr; + } + + @Override + public void copyAdd(JSONObject param) { + Long currentUserId = UserInfoUtil.getCurrentUserId(); + String nickName = UserInfoUtil.getNickName(); + String now = DateUtil.now(); + JSONObject map = new JSONObject(); + map.put("producetask_id", IdUtil.getSnowflake(1, 1).nextId()); + + map.put("producetask_code", CodeUtil.getNewCode("PRODUCE_CODE")); + map.put("producetask_status", "01"); + map.put("material_id", param.getString("material_id")); + map.put("device_id", param.getString("device_id")); + map.put("produceline_id", param.getString("produceline_id")); + map.put("cust_id", param.getString("cust_id")); + + map.put("seq_no", param.getString("seq_no")); + map.put("plan_qty", param.getString("plan_qty")); + map.put("plan_end_time", param.getString("plan_end_time")); + map.put("plan_start_time", param.getString("plan_start_time")); + map.put("model", param.getString("model")); + map.put("molten_pool", param.getString("molten_pool")); + map.put("stewing_time", param.getString("stewing_time")); + map.put("create_id", currentUserId); + map.put("create_name", nickName); + map.put("create_time", now); + WQLObject wo = WQLObject.getWQLObject("pdm_mg_producetask"); + wo.insert(map); + } + + @Override + public Map getTaskByDeviceId(Map whereJson, Pageable page) { + String device_id = MapUtil.getStr(whereJson, "device_id"); + JSONObject map = new JSONObject(); + map.put("flag", "2"); + map.put("device_id", device_id); + JSONObject json = + WQL.getWO("PDM_ProduceTask_01") + .addParamMap(map) + .pageQuery(WqlUtil.getHttpContext(page), "task.seq_no"); + return json; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void sortUpdate(JSONObject param) { + Long currentUserId = UserInfoUtil.getCurrentUserId(); + String nickName = UserInfoUtil.getNickName(); + String now = DateUtil.now(); + WQLObject wo = WQLObject.getWQLObject("pdm_mg_producetask"); + JSONArray rows = param.getJSONArray("rows"); + for (int i = 0; i < rows.size(); i++) { + JSONObject jsonObject = rows.getJSONObject(i); + String producetask_id = jsonObject.getString("producetask_id"); + String seq_no = jsonObject.getString("seq_no"); + JSONObject map = new JSONObject(); + map.put("seq_no", seq_no); + map.put("update_optid", currentUserId); + map.put("update_optname", nickName); + map.put("update_time", now); + wo.update(map, "producetask_id = '" + producetask_id + "'"); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void mandFinish(JSONObject param) { + Long currentUserId = UserInfoUtil.getCurrentUserId(); + String nickName = UserInfoUtil.getNickName(); + String now = DateUtil.now(); + String producetask_id = param.getString("producetask_id"); + WQLObject wo = WQLObject.getWQLObject("pdm_mg_producetask"); + JSONObject map = new JSONObject(); + map.put("producetask_status", "99"); + map.put("producetask_finish_type", "02"); + param.put("update_optid", currentUserId); + param.put("update_optname", nickName); + param.put("update_time", now); + wo.update(map, "producetask_id = '" + producetask_id + "'"); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void issued(JSONObject param) { + Long currentUserId = UserInfoUtil.getCurrentUserId(); + String nickName = UserInfoUtil.getNickName(); + String now = DateUtil.now(); + String producetask_id = param.getString("producetask_id"); + WQLObject wo = WQLObject.getWQLObject("pdm_mg_producetask"); + String device_id = param.getString("device_id"); + WQLObject taskTable = WQLObject.getWQLObject("PDM_MG_produceTask"); + JSONObject jo = + taskTable + .query("device_id='" + device_id + "' and producetask_status in ('02','03','04')") + .uniqueResult(0); + if (ObjectUtil.isNotEmpty(jo)) { + throw new BadRequestException("该设备存在未完成的工单,不能下发!"); } - @Override - public ProducetaskDto findById(Long producetask_id) { - WQLObject wo = WQLObject.getWQLObject("pdm_mg_producetask"); - JSONObject json = wo.query("producetask_id = '" + producetask_id + "'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(json)) { - return json.toJavaObject(ProducetaskDto.class); - } - return null; + DeviceDto dto = deviceService.findById(Long.valueOf(device_id)); + JSONObject taskObj = new JSONObject(); + // 假如是包装的三台机械手,是将设备当作工单设备 + // 假如是压机下料的机械手,则是将对接为当作工单设备 + if (StrUtil.equals(dto.getDevice_code(), "FJJXS1") + || StrUtil.equals("FJJXS2", dto.getDevice_code()) + || StrUtil.equals("FJJXS3", dto.getDevice_code())) { + taskObj = + WQL.getWO("PDM_ProduceTask_01") + .addParam("flag", "3") + .addParam("producetask_id", producetask_id) + .process() + .uniqueResult(0); + } else { + taskObj = + WQL.getWO("PDM_ProduceTask_01") + .addParam("flag", "4") + .addParam("producetask_id", producetask_id) + .process() + .uniqueResult(0); + } + String product_code = taskObj.getString("product_code"); + String material_code = taskObj.getString("material_code"); + if (ObjectUtil.isEmpty(product_code)) { + throw new BadRequestException("物料【"+material_code+"】的垛形参数未设置!"); } - @Override - public ProducetaskDto findByCode(String code) { - WQLObject wo = WQLObject.getWQLObject("pdm_mg_producetask"); - JSONObject json = wo.query("is_delete = '0' and producetask_code ='" + code + "'").uniqueResult(0); - if (ObjectUtil.isNotEmpty(json)) { - return json.toJavaObject(ProducetaskDto.class); - } - return null; + taskObj.put("product_type", "wms"); + WmsToAcsService wmsToAcsService = SpringContextHolder.getBean(WmsToAcsService.class); + JSONArray arr = new JSONArray(); + arr.add(taskObj); + Map result = wmsToAcsService.sendProduceTask(arr); + if (result.get("status").toString().equals("400")) { + String message = result.get("message").toString(); + throw new BadRequestException(message); } - - @Override - @Transactional(rollbackFor = Exception.class) - public void create(ProducetaskDto dto) { - - //编码唯一性校验 - String producetask_code = dto.getProducetask_code(); - ProducetaskDto byCode = this.findByCode(producetask_code); - // if (ObjectUtil.isNotEmpty(byCode)) throw new BadRequestException("编码已存在!"); - - Long currentUserId = UserInfoUtil.getCurrentUserId(); - String nickName = UserInfoUtil.getNickName(); - String now = DateUtil.now(); - - - String material_id = dto.getMaterial_id().toString(); - //根据物料去找木托盘类型 - JSONObject materialObj = WQLObject.getWQLObject("md_me_material").query("material_id = '" + material_id + "'").uniqueResult(0); - String vehicle_type = materialObj.getString("vehicle_type"); - if (StrUtil.isEmpty(vehicle_type) || StrUtil.equals(vehicle_type,"0")) { - throw new RuntimeException("木托盘类型不可为空!"); - } - dto.setVehicle_type(vehicle_type); - dto.setProducetask_id(IdUtil.getSnowflake(1, 1).nextId()); - dto.setProducetask_code(CodeUtil.getNewCode("PRODUCE_CODE")); - dto.setCreate_id(currentUserId); - dto.setCreate_name(nickName); - dto.setUpdate_optid(currentUserId); - dto.setUpdate_optname(nickName); - dto.setUpdate_time(now); - dto.setCreate_time(now); - dto.setProducetask_status("01"); - WQLObject wo = WQLObject.getWQLObject("pdm_mg_producetask"); - JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); - wo.insert(json); + JSONObject map = new JSONObject(); + String producetask_status = "02"; + // 压机一 + if (StrUtil.equals(device_id, "1560189462410039296")) { + producetask_status = "04"; } + map.put("producetask_status", producetask_status); + map.put("update_optid", currentUserId); + map.put("update_optname", nickName); + map.put("update_time", now); + wo.update(map, "producetask_id = '" + producetask_id + "'"); + } - @Override - @Transactional(rollbackFor = Exception.class) - public void update(ProducetaskDto dto) { - ProducetaskDto entity = this.findById(dto.getProducetask_id()); - if (entity == null) throw new BadRequestException("被删除或无权限,操作失败!"); + @Override + public void synchro(JSONObject param) { + WmsToJnServiceImpl wmsToJnService = new WmsToJnServiceImpl(); + JSONObject jo = new JSONObject(); + jo.put("startdate", DateUtil.today()); + jo.put("enddate", DateUtil.today()); + wmsToJnService.synchroDaySchedule(jo); + } - //编码唯一性校验 - WQLObject wo = WQLObject.getWQLObject("pdm_mg_producetask"); - String where = "is_delete = '0' and producetask_code = '" + dto.getProducetask_code() + "' and producetask_id != '" + dto.getProducetask_id() + "'"; + @Override + public JSONArray getProduceline() { + WQLObject wo = WQLObject.getWQLObject("pdm_base_produceline"); + JSONArray arr = wo.query(" is_delete = '0'", "produceline_code").getResultJSONArray(0); + return arr; + } - JSONObject jsonObject = wo.query(where).uniqueResult(0); - if (ObjectUtil.isNotEmpty(jsonObject)) { - throw new BadRequestException("编码已存在!"); - } + @Override + public JSONArray getCust() { + WQLObject wo = WQLObject.getWQLObject("MD_CS_CustomerBase"); + JSONArray arr = wo.query(" is_delete = '0'", "update_time").getResultJSONArray(0); + return arr; + } - Long currentUserId = UserInfoUtil.getCurrentUserId(); - String nickName = UserInfoUtil.getNickName(); + @Override + public JSONArray getWorkprocedure() { + WQLObject wo = WQLObject.getWQLObject("pdm_base_workprocedure"); + JSONArray arr = wo.query(" is_delete = '0'", "seq_no").getResultJSONArray(0); + return arr; + } - String now = DateUtil.now(); - dto.setUpdate_time(now); - dto.setUpdate_optid(currentUserId); - dto.setUpdate_optname(nickName); - - - JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); - wo.update(json); + @Override + @Transactional(rollbackFor = Exception.class) + public void excelImport(MultipartFile file, HttpServletRequest request) { + if (file.isEmpty()) { + throw new BadRequestException("文件为空,请添加数据后重新导入"); } - - @Override - @Transactional(rollbackFor = Exception.class) - public void deleteAll(Long[] ids) { - WQLObject wo = WQLObject.getWQLObject("pdm_mg_producetask"); - for (Long producetask_id : ids) { - wo.delete("producetask_id = '" + producetask_id + "'"); - } + Long currentUserId = UserInfoUtil.getCurrentUserId(); + String nickName = UserInfoUtil.getNickName(); + String now = DateUtil.now(); + // 1.获取上传文件输入流 + InputStream inputStream = null; + try { + inputStream = file.getInputStream(); + } catch (Exception e) { + e.printStackTrace(); } + WQLObject wo = WQLObject.getWQLObject("PDM_MG_produceTask"); + WQLObject wo_material = WQLObject.getWQLObject("MD_ME_Material"); + WQLObject wo_device = WQLObject.getWQLObject("pdm_base_device"); + WQLObject wo_line = WQLObject.getWQLObject("pdm_base_produceline"); + WQLObject wo_cust = WQLObject.getWQLObject("md_cs_customerbase"); - @Override - public JSONArray getMaterial() { - WQLObject wo = WQLObject.getWQLObject("md_me_material"); - JSONArray arr = wo.query(" is_delete = '0'", "update_time").getResultJSONArray(0); - return arr; - } + // 调用用 hutool 方法读取数据 默认调用第一个sheet + ExcelReader excelReader = ExcelUtil.getReader(inputStream); + // 从第二行开始获取数据 excelReader.read的结果是一个2纬的list,外层是行,内层是行对应的所有列 + List> read = excelReader.read(1, excelReader.getRowCount()); + // 循环获取的数据 + for (int i = 0; i < read.size(); i++) { + List list = read.get(i); + JSONObject param = new JSONObject(); + // 按照列获取 + param.put("producetask_id", IdUtil.getSnowflake(1, 1).nextId()); + param.put("producetask_code", CodeUtil.getNewCode("PRODUCE_CODE")); + param.put("producetask_status", "01"); - @Override - public JSONArray getDevice(JSONObject param) { - String workprocedure_id = param.getString("workprocedure_id"); - WQLObject wo = WQLObject.getWQLObject("pdm_base_device"); - JSONArray arr = wo.query(" is_delete = '0' and workprocedure_id = '" + workprocedure_id + "'", "device_code").getResultJSONArray(0); - return arr; - } + String material_code = list.get(0).toString(); + JSONObject json_material = + wo_material + .query("is_delete = '0' and material_code = '" + material_code + "'") + .uniqueResult(0); + if (ObjectUtil.isEmpty(json_material)) { + throw new BadRequestException("第'" + (i + 2) + "'行,物料编码不存在"); + } + param.put("material_id", json_material.getString("material_id")); - @Override - public JSONArray getDevice1() { - WQLObject wo = WQLObject.getWQLObject("pdm_base_device"); - JSONArray arr = wo.query(" is_delete = '0' and is_work_device ='1'", "device_code").getResultJSONArray(0); - return arr; - } + String device_code = list.get(1).toString(); + JSONObject json_device = + wo_device + .query("is_delete = '0' and device_code = '" + device_code + "'") + .uniqueResult(0); + if (ObjectUtil.isEmpty(json_device)) { + throw new BadRequestException("第'" + (i + 2) + "'行,设备编码不存在"); + } + param.put("device_id", json_device.getString("device_id")); - @Override - public void copyAdd(JSONObject param) { - Long currentUserId = UserInfoUtil.getCurrentUserId(); - String nickName = UserInfoUtil.getNickName(); - String now = DateUtil.now(); - JSONObject map = new JSONObject(); - map.put("producetask_id", IdUtil.getSnowflake(1, 1).nextId()); + String produceline_code = list.get(2).toString(); + JSONObject json_produceline = + wo_line + .query("is_delete = '0' and produceline_code = '" + produceline_code + "'") + .uniqueResult(0); + if (ObjectUtil.isEmpty(json_produceline)) { + throw new BadRequestException("第'" + (i + 2) + "'行,产线编码不存在"); + } + param.put("produceline_id", json_produceline.getString("produceline_id")); - map.put("producetask_code", CodeUtil.getNewCode("PRODUCE_CODE")); - map.put("producetask_status", "01"); - map.put("material_id", param.getString("material_id")); - map.put("device_id", param.getString("device_id")); - map.put("produceline_id", param.getString("produceline_id")); - map.put("cust_id", param.getString("cust_id")); + String cust_code = list.get(3).toString(); + JSONObject json_cust = + wo_cust.query("is_delete = '0' and cust_code = '" + cust_code + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(json_cust)) { + throw new BadRequestException("第'" + (i + 2) + "'行,客户编码不存在"); + } + param.put("cust_id", json_cust.getString("cust_id")); - map.put("seq_no", param.getString("seq_no")); - map.put("plan_qty", param.getString("plan_qty")); - map.put("plan_end_time", param.getString("plan_end_time")); - map.put("plan_start_time", param.getString("plan_start_time")); - map.put("model", param.getString("model")); - map.put("molten_pool", param.getString("molten_pool")); - map.put("stewing_time", param.getString("stewing_time")); - map.put("create_id", currentUserId); - map.put("create_name", nickName); - map.put("create_time", now); - WQLObject wo = WQLObject.getWQLObject("pdm_mg_producetask"); - wo.insert(map); - } - - @Override - public Map getTaskByDeviceId(Map whereJson, Pageable page) { - String device_id = MapUtil.getStr(whereJson, "device_id"); - JSONObject map = new JSONObject(); - map.put("flag", "2"); - map.put("device_id", device_id); - JSONObject json = WQL.getWO("PDM_ProduceTask_01").addParamMap(map).pageQuery(WqlUtil.getHttpContext(page), "task.seq_no"); - return json; - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void sortUpdate(JSONObject param) { - Long currentUserId = UserInfoUtil.getCurrentUserId(); - String nickName = UserInfoUtil.getNickName(); - String now = DateUtil.now(); - WQLObject wo = WQLObject.getWQLObject("pdm_mg_producetask"); - JSONArray rows = param.getJSONArray("rows"); - for (int i = 0; i < rows.size(); i++) { - JSONObject jsonObject = rows.getJSONObject(i); - String producetask_id = jsonObject.getString("producetask_id"); - String seq_no = jsonObject.getString("seq_no"); - JSONObject map = new JSONObject(); - map.put("seq_no", seq_no); - map.put("update_optid", currentUserId); - map.put("update_optname", nickName); - map.put("update_time", now); - wo.update(map, "producetask_id = '" + producetask_id + "'"); - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void mandFinish(JSONObject param) { - Long currentUserId = UserInfoUtil.getCurrentUserId(); - String nickName = UserInfoUtil.getNickName(); - String now = DateUtil.now(); - String producetask_id = param.getString("producetask_id"); - WQLObject wo = WQLObject.getWQLObject("pdm_mg_producetask"); - JSONObject map = new JSONObject(); - map.put("producetask_status", "99"); - map.put("producetask_finish_type", "02"); - param.put("update_optid", currentUserId); - param.put("update_optname", nickName); - param.put("update_time", now); - wo.update(map, "producetask_id = '" + producetask_id + "'"); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void issued(JSONObject param) { - Long currentUserId = UserInfoUtil.getCurrentUserId(); - String nickName = UserInfoUtil.getNickName(); - String now = DateUtil.now(); - String producetask_id = param.getString("producetask_id"); - WQLObject wo = WQLObject.getWQLObject("pdm_mg_producetask"); - String device_id = param.getString("device_id"); - WQLObject taskTable = WQLObject.getWQLObject("PDM_MG_produceTask"); - JSONObject jo = taskTable.query("device_id='" + device_id + "' and producetask_status in ('02','03','04')").uniqueResult(0); - if (ObjectUtil.isNotEmpty(jo)) { - throw new BadRequestException("该设备存在未完成的工单,不能下发!"); - } - - DeviceDto dto = deviceService.findById(Long.valueOf(device_id)); - JSONObject taskObj = new JSONObject(); - //假如是包装的三台机械手,是将设备当作工单设备 - //假如是压机下料的机械手,则是将对接为当作工单设备 - if (StrUtil.equals(dto.getDevice_code(), "FJJXS1") || StrUtil.equals("FJJXS2", dto.getDevice_code()) || StrUtil.equals("FJJXS3", dto.getDevice_code())) { - taskObj = WQL.getWO("PDM_ProduceTask_01").addParam("flag", "3").addParam("producetask_id", producetask_id).process().uniqueResult(0); + param.put("seq_no", list.get(4).toString()); + param.put("plan_qty", list.get(5).toString()); + if (ObjectUtil.isEmpty(list.get(6))) { + throw new BadRequestException("第'" + (i + 2) + "'行,计划开始时间不能为空"); + } else { + if (this.isLegalTime(list.get(6).toString())) { + param.put("plan_start_time", list.get(6).toString()); } else { - taskObj = WQL.getWO("PDM_ProduceTask_01").addParam("flag", "4").addParam("producetask_id", producetask_id).process().uniqueResult(0); + throw new BadRequestException("第'" + (i + 2) + "'行,计划开始时间日期格式不正确"); } - taskObj.put("product_type", "wms"); - WmsToAcsService wmsToAcsService = SpringContextHolder.getBean(WmsToAcsService.class); - JSONArray arr = new JSONArray(); - arr.add(taskObj); - Map result = wmsToAcsService.sendProduceTask(arr); - if (result.get("status").toString().equals("400")) { - String message = result.get("message").toString(); - throw new BadRequestException(message); + } + if (ObjectUtil.isEmpty(list.get(7))) { + throw new BadRequestException("第'" + (i + 2) + "'行,计划结束时间不能为空"); + } else { + if (this.isLegalTime(list.get(7).toString())) { + param.put("plan_end_time", list.get(7).toString()); + } else { + throw new BadRequestException("第'" + (i + 2) + "'行,计划结束时间日期格式不正确"); } - JSONObject map = new JSONObject(); - String producetask_status = "02"; - if (StrUtil.equals(device_id, "1560189462410039296")) { - producetask_status = "04"; - } - map.put("producetask_status", producetask_status); - map.put("update_optid", currentUserId); - map.put("update_optname", nickName); - map.put("update_time", now); - wo.update(map, "producetask_id = '" + producetask_id + "'"); - } - - @Override - public void synchro(JSONObject param) { - WmsToJnServiceImpl wmsToJnService = new WmsToJnServiceImpl(); - JSONObject jo = new JSONObject(); - jo.put("startdate", DateUtil.today()); - jo.put("enddate", DateUtil.today()); - wmsToJnService.synchroDaySchedule(jo); - } - - @Override - public JSONArray getProduceline() { - WQLObject wo = WQLObject.getWQLObject("pdm_base_produceline"); - JSONArray arr = wo.query(" is_delete = '0'", "produceline_code").getResultJSONArray(0); - return arr; - } - - @Override - public JSONArray getCust() { - WQLObject wo = WQLObject.getWQLObject("MD_CS_CustomerBase"); - JSONArray arr = wo.query(" is_delete = '0'", "update_time").getResultJSONArray(0); - return arr; - } - - @Override - public JSONArray getWorkprocedure() { - WQLObject wo = WQLObject.getWQLObject("pdm_base_workprocedure"); - JSONArray arr = wo.query(" is_delete = '0'", "seq_no").getResultJSONArray(0); - return arr; - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void excelImport(MultipartFile file, HttpServletRequest request) { - if (file.isEmpty()) { - throw new BadRequestException("文件为空,请添加数据后重新导入"); - } - Long currentUserId = UserInfoUtil.getCurrentUserId(); - String nickName = UserInfoUtil.getNickName(); - String now = DateUtil.now(); - // 1.获取上传文件输入流 - InputStream inputStream = null; - try { - inputStream = file.getInputStream(); - } catch (Exception e) { - e.printStackTrace(); - } - WQLObject wo = WQLObject.getWQLObject("PDM_MG_produceTask"); - WQLObject wo_material = WQLObject.getWQLObject("MD_ME_Material"); - WQLObject wo_device = WQLObject.getWQLObject("pdm_base_device"); - WQLObject wo_line = WQLObject.getWQLObject("pdm_base_produceline"); - WQLObject wo_cust = WQLObject.getWQLObject("md_cs_customerbase"); - - // 调用用 hutool 方法读取数据 默认调用第一个sheet - ExcelReader excelReader = ExcelUtil.getReader(inputStream); - // 从第二行开始获取数据 excelReader.read的结果是一个2纬的list,外层是行,内层是行对应的所有列 - List> read = excelReader.read(1, excelReader.getRowCount()); - // 循环获取的数据 - for (int i = 0; i < read.size(); i++) { - List list = read.get(i); - JSONObject param = new JSONObject(); - //按照列获取 - param.put("producetask_id", IdUtil.getSnowflake(1, 1).nextId()); - param.put("producetask_code", CodeUtil.getNewCode("PRODUCE_CODE")); - param.put("producetask_status", "01"); - - String material_code = list.get(0).toString(); - JSONObject json_material = wo_material.query("is_delete = '0' and material_code = '" + material_code + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(json_material)) { - throw new BadRequestException("第'" + (i + 2) + "'行,物料编码不存在"); - } - param.put("material_id", json_material.getString("material_id")); - - String device_code = list.get(1).toString(); - JSONObject json_device = wo_device.query("is_delete = '0' and device_code = '" + device_code + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(json_device)) { - throw new BadRequestException("第'" + (i + 2) + "'行,设备编码不存在"); - } - param.put("device_id", json_device.getString("device_id")); - - String produceline_code = list.get(2).toString(); - JSONObject json_produceline = wo_line.query("is_delete = '0' and produceline_code = '" + produceline_code + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(json_produceline)) { - throw new BadRequestException("第'" + (i + 2) + "'行,产线编码不存在"); - } - param.put("produceline_id", json_produceline.getString("produceline_id")); - - String cust_code = list.get(3).toString(); - JSONObject json_cust = wo_cust.query("is_delete = '0' and cust_code = '" + cust_code + "'").uniqueResult(0); - if (ObjectUtil.isEmpty(json_cust)) { - throw new BadRequestException("第'" + (i + 2) + "'行,客户编码不存在"); - } - param.put("cust_id", json_cust.getString("cust_id")); - - param.put("seq_no", list.get(4).toString()); - param.put("plan_qty", list.get(5).toString()); - if (ObjectUtil.isEmpty(list.get(6))) { - throw new BadRequestException("第'" + (i + 2) + "'行,计划开始时间不能为空"); - } else { - if (this.isLegalTime(list.get(6).toString())) { - param.put("plan_start_time", list.get(6).toString()); - } else { - throw new BadRequestException("第'" + (i + 2) + "'行,计划开始时间日期格式不正确"); - } - } - if (ObjectUtil.isEmpty(list.get(7))) { - throw new BadRequestException("第'" + (i + 2) + "'行,计划结束时间不能为空"); - } else { - if (this.isLegalTime(list.get(7).toString())) { - param.put("plan_end_time", list.get(7).toString()); - } else { - throw new BadRequestException("第'" + (i + 2) + "'行,计划结束时间日期格式不正确"); - } - } - param.put("model", list.get(8).toString()); - param.put("molten_pool", list.get(9).toString()); - param.put("create_id", currentUserId); - param.put("create_name", nickName); - param.put("create_time", now); - wo.insert(param); - } - } - - public boolean isLegalTime(String str) { - String formatTime = "^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29) (20|21|22|23|[0-1][0-9]):[0-5][0-9]:[0-5][0-9]$"; - Pattern p = Pattern.compile(formatTime); - Matcher m = p.matcher(str); - return m.matches(); + } + param.put("model", list.get(8).toString()); + param.put("molten_pool", list.get(9).toString()); + param.put("create_id", currentUserId); + param.put("create_name", nickName); + param.put("create_time", now); + wo.insert(param); } + } + public boolean isLegalTime(String str) { + String formatTime = + "^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29) (20|21|22|23|[0-1][0-9]):[0-5][0-9]:[0-5][0-9]$"; + Pattern p = Pattern.compile(formatTime); + Matcher m = p.matcher(str); + return m.matches(); + } } diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/CallEmptyVehicleTask.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/CallEmptyVehicleTask.java index 189dc62..88391ac 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/CallEmptyVehicleTask.java +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/CallEmptyVehicleTask.java @@ -33,310 +33,342 @@ import java.util.HashMap; */ @Service public class CallEmptyVehicleTask extends AbstractAcsTask { - private final String THIS_CLASS = CallEmptyVehicleTask.class.getName(); - - @Override - public void updateTaskStatus(JSONObject taskObj, String status) { - /** - *改变任务状态 - **/ - String task_id = taskObj.getString("task_id"); - WQLObject taskTab = WQLObject.getWQLObject("sch_base_task"); - JSONObject jsonTask = taskTab.query("task_id='" + task_id + "'").uniqueResult(0); - if (TaskStatusEnum.EXECUTING.getCode().equals(status)) { - //更新任务状态为执行中 - jsonTask.put("task_status", TaskStatusEnum.EXECUTING.getCode()); - jsonTask.put("update_time", DateUtil.now()); - taskTab.update(jsonTask); - HashMap map = new HashMap(); - map.put("bill_status", "40"); - WQLObject.getWQLObject("st_buss_EmptyVehicleRecord").update(map, "task_uuid='" + jsonTask.getString("task_id") + "'"); - } - - if (TaskStatusEnum.FINISHED.getCode().equals(status)) { - // 更新任务状态为完成 - jsonTask.put("task_status", TaskStatusEnum.FINISHED.getCode()); - jsonTask.put("taskfinish_mode", taskObj.getString("taskfinish_mode")); - jsonTask.put("update_time", DateUtil.now()); - jsonTask.put("remark", "任务执行完成"); - ///审核单据 - HashMap map = new HashMap(); - map.put("bill_status", "50"); - WQLObject.getWQLObject("st_buss_EmptyVehicleRecord").update(map, "task_uuid='" + jsonTask.getString("task_id") + "'"); - //解锁仓位,托盘信息,回写到点位上去 - String vehicle_code = jsonTask.getString("vehicle_code"); - //插入刚托盘木托盘表 - String point_code = jsonTask.getString("next_point_code"); - String area_type = WQLObject.getWQLObject("sch_base_point").query("point_code='" + point_code + "'").uniqueResult(0).getString("area_type"); - if (StrUtil.equals(area_type, AreaEnum.FJQY.getCode())) { - JSONObject jo = new JSONObject(); - jo.put("device_code", point_code); - jo.put("vehicle_code", vehicle_code); - SortingUtil.record(jo); - } - - - WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); - JSONObject endpointObj = pointTab.query("point_code='" + jsonTask.getString("next_point_code") + "'").uniqueResult(0); - endpointObj.put("lock_type", "00"); - endpointObj.put("point_status", "01"); - endpointObj.put("vehicle_code", vehicle_code); - pointTab.update(endpointObj); - JSONObject startPointObj = pointTab.query("point_code='" + jsonTask.getString("start_point_code") + "'").uniqueResult(0); - startPointObj.put("lock_type", "00"); - startPointObj.put("point_status", "00"); - startPointObj.put("vehicle_code", ""); - pointTab.update(startPointObj); - taskTab.update(jsonTask); - } + private final String THIS_CLASS = CallEmptyVehicleTask.class.getName(); + @Override + public void updateTaskStatus(JSONObject taskObj, String status) { + /** 改变任务状态 */ + String task_id = taskObj.getString("task_id"); + WQLObject taskTab = WQLObject.getWQLObject("sch_base_task"); + JSONObject jsonTask = taskTab.query("task_id='" + task_id + "'").uniqueResult(0); + if (TaskStatusEnum.EXECUTING.getCode().equals(status)) { + // 更新任务状态为执行中 + jsonTask.put("task_status", TaskStatusEnum.EXECUTING.getCode()); + jsonTask.put("update_time", DateUtil.now()); + taskTab.update(jsonTask); + HashMap map = new HashMap(); + map.put("bill_status", "40"); + WQLObject.getWQLObject("st_buss_EmptyVehicleRecord") + .update(map, "task_uuid='" + jsonTask.getString("task_id") + "'"); } - @Override - @Transactional - public void findStartPoint() { - String task_status = TaskStatusEnum.SURE_END.getCode(); - WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); - JSONArray taskArry = taskTab.query("task_status='" + task_status + "' AND handle_class='" + THIS_CLASS + "' AND is_delete='0' ").getResultJSONArray(0); - for (int i = 0; i < taskArry.size(); i++) { - JSONObject taskObj = taskArry.getJSONObject(i); - String task_id = taskObj.getString("task_id"); - String next_point_code = taskObj.getString("next_point_code"); - //找一个合适的仓位 - WQLObject Recordtable = WQLObject.getWQLObject("sch_base_task"); - JSONObject IosObj = Recordtable.query("task_id='" + task_id + "' and is_delete ='0'").uniqueResult(0); - if (ObjectUtil.isEmpty(IosObj)) { - throw new BadRequestException("未找到任务号为'" + taskObj.getString("task_code") + "'的单据!"); - } - JSONObject param = new JSONObject(); - param.put("area_type", IosObj.getString("end_area")); - param.put("vehicle_code", IosObj.getString("vehicle_code")); - JSONObject inStructObj = StructFindUtil.getEmptyVehicleInStruct(param); - if (ObjectUtil.isEmpty(inStructObj)) { - throw new BadRequestException("未找到合适的仓位!"); - } - JSONObject workInfo = WQL.getWO("QSTRUCT_RULE").addParam("flag", "1").addParam("code", next_point_code) - .process().uniqueResult(0); - String workprocedure_code = workInfo.getString("workInfo"); - String workprocedure_id = workInfo.getString("workprocedure_id"); - WorkProcedureEnum workProcedureEnum = WorkProcedureEnum.get(workprocedure_id); - String start_area = ""; - String vehicle_type = ""; - switch (workProcedureEnum) { + if (TaskStatusEnum.FINISHED.getCode().equals(status)) { + // 更新任务状态为完成 + jsonTask.put("task_status", TaskStatusEnum.FINISHED.getCode()); + jsonTask.put("taskfinish_mode", taskObj.getString("taskfinish_mode")); + jsonTask.put("update_time", DateUtil.now()); + jsonTask.put("remark", "任务执行完成"); + /// 审核单据 + HashMap map = new HashMap(); + map.put("bill_status", "50"); + WQLObject.getWQLObject("st_buss_EmptyVehicleRecord") + .update(map, "task_uuid='" + jsonTask.getString("task_id") + "'"); + // 解锁仓位,托盘信息,回写到点位上去 + String vehicle_code = jsonTask.getString("vehicle_code"); + // 插入刚托盘木托盘表 + String point_code = jsonTask.getString("next_point_code"); + String area_type = + WQLObject.getWQLObject("sch_base_point") + .query("point_code='" + point_code + "'") + .uniqueResult(0) + .getString("area_type"); + if (StrUtil.equals(area_type, AreaEnum.FJQY.getCode())) { + JSONObject jo = new JSONObject(); + jo.put("device_code", point_code); + jo.put("vehicle_code", vehicle_code); + SortingUtil.record(jo); + } - // 压制工序 - case YZGX: - vehicle_type = VehicleTypeEnum.GTP.getCode(); - start_area = AreaEnum.KTTDDQ.getCode(); - - //分拣工序 - case FJGX: - vehicle_type = VehicleTypeEnum.MTP.getCode(); - start_area = AreaEnum.MTPQ.getCode(); - default: - vehicle_type = VehicleTypeEnum.LZ.getCode(); - start_area = AreaEnum.KTTDDQ.getCode(); - } - //寻找一个合适的仓位 - JSONObject outStructObj = StructFindUtil.getEmptyVehicleOutStruct(param); - if (ObjectUtil.isEmpty(outStructObj)) { - continue; - } - String start_point_code = outStructObj.getString("struct_code"); - String vehicle_code = outStructObj.getString("vehicle_code"); - //修改单据状态,将终点填入 - IosObj.put("bill_status", "20"); - IosObj.put("start_point_code", start_point_code); - IosObj.put("vehicle_code", vehicle_code); - IosObj.put("start_area", start_area); - Recordtable.update(IosObj); - - //起点加锁 - HashMap lock_map = new HashMap(); - lock_map.put("lock_type", "01"); - WQLObject.getWQLObject("sch_base_point").update(lock_map, "point_code = '" + start_point_code + "'"); - //修改任务状态 - taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); - taskObj.put("update_optid", UserInfoUtil.getCurrentUserId()); - taskObj.put("update_optname", UserInfoUtil.getNickName()); - taskObj.put("update_time", DateUtil.now()); - return; - - } + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); + JSONObject endpointObj = + pointTab + .query("point_code='" + jsonTask.getString("next_point_code") + "'") + .uniqueResult(0); + endpointObj.put("lock_type", "00"); + endpointObj.put("point_status", "01"); + endpointObj.put("vehicle_code", vehicle_code); + pointTab.update(endpointObj); + JSONObject startPointObj = + pointTab + .query("point_code='" + jsonTask.getString("start_point_code") + "'") + .uniqueResult(0); + startPointObj.put("lock_type", "00"); + startPointObj.put("point_status", "00"); + startPointObj.put("vehicle_code", ""); + pointTab.update(startPointObj); + taskTab.update(jsonTask); } + } - @Override - public void findNextPoint() { + @Override + @Transactional + public void findStartPoint() { + String task_status = TaskStatusEnum.SURE_END.getCode(); + WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); + JSONArray taskArry = + taskTab.query( + "task_status='" + + task_status + + "' AND handle_class='" + + THIS_CLASS + + "' AND is_delete='0' ") + .getResultJSONArray(0); + for (int i = 0; i < taskArry.size(); i++) { + JSONObject taskObj = taskArry.getJSONObject(i); + String task_id = taskObj.getString("task_id"); + String next_point_code = taskObj.getString("next_point_code"); + // 找一个合适的仓位 + WQLObject Recordtable = WQLObject.getWQLObject("sch_base_task"); + JSONObject IosObj = + Recordtable.query("task_id='" + task_id + "' and is_delete ='0'").uniqueResult(0); + if (ObjectUtil.isEmpty(IosObj)) { + throw new BadRequestException("未找到任务号为'" + taskObj.getString("task_code") + "'的单据!"); + } + JSONObject param = new JSONObject(); + param.put("area_type", IosObj.getString("end_area")); + param.put("vehicle_code", IosObj.getString("vehicle_code")); + JSONObject inStructObj = StructFindUtil.getEmptyVehicleInStruct(param); + if (ObjectUtil.isEmpty(inStructObj)) { + throw new BadRequestException("未找到合适的仓位!"); + } + JSONObject workInfo = + WQL.getWO("QSTRUCT_RULE") + .addParam("flag", "1") + .addParam("code", next_point_code) + .process() + .uniqueResult(0); + String workprocedure_code = workInfo.getString("workInfo"); + String workprocedure_id = workInfo.getString("workprocedure_id"); + WorkProcedureEnum workProcedureEnum = WorkProcedureEnum.get(workprocedure_id); + String start_area = ""; + String vehicle_type = ""; + switch (workProcedureEnum) { + // 压制工序 + case YZGX: + vehicle_type = VehicleTypeEnum.GTP.getCode(); + start_area = AreaEnum.KTTDDQ.getCode(); + // 分拣工序 + case FJGX: + vehicle_type = VehicleTypeEnum.MTP.getCode(); + start_area = AreaEnum.MTPQ.getCode(); + default: + vehicle_type = VehicleTypeEnum.LZ.getCode(); + start_area = AreaEnum.KTTDDQ.getCode(); + } + // 寻找一个合适的仓位 + JSONObject outStructObj = StructFindUtil.getEmptyVehicleOutStruct(param); + if (ObjectUtil.isEmpty(outStructObj)) { + continue; + } + String start_point_code = outStructObj.getString("struct_code"); + String vehicle_code = outStructObj.getString("vehicle_code"); + // 修改单据状态,将终点填入 + IosObj.put("bill_status", "20"); + IosObj.put("start_point_code", start_point_code); + IosObj.put("vehicle_code", vehicle_code); + IosObj.put("start_area", start_area); + Recordtable.update(IosObj); + + // 起点加锁 + HashMap lock_map = new HashMap(); + lock_map.put("lock_type", "01"); + WQLObject.getWQLObject("sch_base_point") + .update(lock_map, "point_code = '" + start_point_code + "'"); + // 修改任务状态 + taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); + taskObj.put("update_optid", UserInfoUtil.getCurrentUserId()); + taskObj.put("update_optname", UserInfoUtil.getNickName()); + taskObj.put("update_time", DateUtil.now()); + return; } + } - @Override - public JSONObject renotifyAcs(String task_id) { - return super.renotifyAcs(task_id); + @Override + public void findNextPoint() {} + + @Override + public JSONObject renotifyAcs(String task_id) { + return super.renotifyAcs(task_id); + } + + @Override + public String createTask(JSONObject form) { + // 请求参数 终点不能为空 起点点位为空时,托盘类型不能为空,托盘不能为空! + String next_point_code = form.getString("next_point_code"); + // 默认给一个测试托盘 + String vehicle_code = "999"; + String is_auto_issue = "1"; + if (StrUtil.isEmpty(next_point_code)) { + throw new BadRequestException("终点不能为空!"); } - - @Override - public String createTask(JSONObject form) { - //请求参数 终点不能为空 起点点位为空时,托盘类型不能为空,托盘不能为空! - String next_point_code = form.getString("next_point_code"); - //默认给一个测试托盘 - String vehicle_code = "999"; - String is_auto_issue = "1"; - if (StrUtil.isEmpty(next_point_code)) { - throw new BadRequestException("终点不能为空!"); - } - String start_point_code = form.getString("start_point_code"); - String vehicle_type = form.getString("vehicle_type"); - WQLObject taskTable = WQLObject.getWQLObject("sch_base_task"); - //判断起点有没有未完成的指令 - JSONObject beforTaskObj = taskTable. - query("is_delete='0' and next_point_code='" + next_point_code + "' and task_status <>'" + TaskStatusEnum.FINISHED.getCode() + "'") - .uniqueResult(0); - if (ObjectUtil.isNotEmpty(beforTaskObj)) { - throw new BadRequestException("存在指令号为'" + beforTaskObj.getString("task_code") + "' 未完成!"); - } - String start_area = ""; - //假如起点为空,根据终点点去找对应工序需要的托盘类型 - if (StrUtil.isEmpty(start_point_code)) { - JSONObject workInfo = WQL.getWO("QSTRUCT_RULE").addParam("flag", "1").addParam("code", next_point_code) - .process().uniqueResult(0); - String workprocedure_id = workInfo.getString("workprocedure_id"); - String device_id = workInfo.getString("device_id"); - WorkProcedureEnum workProcedureEnum = WorkProcedureEnum.get(workprocedure_id); - switch (workProcedureEnum) { - // 压制工序 - case YZGX: - vehicle_type = VehicleTypeEnum.GTP.getCode(); - start_area = AreaEnum.KTTDDQ.getCode(); - start_point_code="KTPDDW5"; - break; - //分拣工序 - case FJGX: - //托盘类型取的物料对应的木托盘类型 - JSONObject produceObj = WQLObject.getWQLObject("PDM_MG_produceTask").query("device_id='" + device_id + "' and producetask_status in('03','04')").uniqueResult(0); - vehicle_type = produceObj.getString("vehicle_type"); - start_area = AreaEnum.MTPQ.getCode(); - is_auto_issue = "0"; - break; - //叠盘工序 - case DPGX: - //托盘类型取的物料对应的木托盘类型 - vehicle_type = VehicleTypeEnum.GTP.getCode(); - start_area = AreaEnum.KTTHCQ.getCode(); - break; - default: - vehicle_type = VehicleTypeEnum.GTP.getCode(); - start_area = AreaEnum.KTTHCQ.getCode(); - } - JSONObject param = new JSONObject(); - //如果托盘类型不是02,则需要加上托盘类型 - if (!StrUtil.equals(vehicle_type, "02")) { - param.put("vehicle_type", vehicle_type); - } - param.put("area_type", start_area); - param.put("point_code",start_point_code); - - JSONObject outStructObj = StructFindUtil.getEmptyVehicleOutStruct(param); - if (ObjectUtil.isEmpty(outStructObj)) { - throw new BadRequestException("未找到合适的空托盘点位"); - } - - vehicle_code = outStructObj.getString("vehicle_code"); - if (StrUtil.isEmpty(vehicle_code)) { - vehicle_code = "999"; - } - //如果是托盘区域/生成一个该类型的托盘 - if (StrUtil.equals(workInfo.getString("area_type"), AreaEnum.FJQY.getCode())) { - vehicle_code = CodeUtil.getNewCode("VEHICCLE_CODE_MTP"); - //将托盘插入托盘表 - WQLObject wo = WQLObject.getWQLObject("MD_PB_Vehicle"); - JSONObject jo = new JSONObject(); - VehicleDto dto = new VehicleDto(); - dto.setVehicle_id(IdUtil.getSnowflake(1, 1).nextId()); - dto.setVehicle_code(vehicle_code); - dto.setCreate_id(UserInfoUtil.getCurrentUserId()); - dto.setVehicle_name(vehicle_code); - dto.setCreate_name(UserInfoUtil.getNickName()); - dto.setUpdate_optid(UserInfoUtil.getCurrentUserId()); - dto.setUpdate_optname(UserInfoUtil.getNickName()); - dto.setUpdate_time(DateUtil.now()); - dto.setCreate_time(DateUtil.now()); - dto.setVehicle_type(vehicle_type); - JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); - wo.insert(json); - } - - start_point_code = outStructObj.getString("struct_code"); - } - PointService pointService = SpringContextHolder.getBean(PointService.class); - PointDto nextPoint = pointService.findByCode(next_point_code); - //生成空托盘搬运的单据 - String task_status = TaskStatusEnum.SURE_END.getCode(); - String bill_status = "10"; - if (StrUtil.isNotEmpty(start_point_code)) { -// PointDto startPoint = pointService.findByCode(start_point_code); - bill_status = "20"; - task_status = TaskStatusEnum.START_AND_POINT.getCode(); - //锁定起点 - HashMap lock_map = new HashMap(); - lock_map.put("lock_type", "01"); - WQLObject.getWQLObject("sch_base_point").update(lock_map, "point_code = '" + start_point_code + "'"); - } - String task_id = IdUtil.getSnowflake(1, 1).nextId() + ""; - //生成空载具搬运单据 - JSONObject EmptyVehicleObj = new JSONObject(); - EmptyVehicleObj.put("record_uuid", IdUtil.getSnowflake(1, 1).nextId()); - EmptyVehicleObj.put("bill_code", CodeUtil.getNewCode("KZJ_BILL_CODE")); - EmptyVehicleObj.put("bill_status", bill_status); - EmptyVehicleObj.put("start_point_code", start_point_code); - EmptyVehicleObj.put("next_point_code", next_point_code); - EmptyVehicleObj.put("start_area", start_area); - EmptyVehicleObj.put("end_area", nextPoint.getArea_type()); - EmptyVehicleObj.put("vehicle_code", vehicle_code); - EmptyVehicleObj.put("task_uuid", task_id); - EmptyVehicleObj.put("create_id", UserInfoUtil.getCurrentUserId()); - EmptyVehicleObj.put("create_name", UserInfoUtil.getNickName()); - EmptyVehicleObj.put("create_time", DateUtil.now()); - EmptyVehicleObj.put("is_delete", "0"); - WQLObject.getWQLObject("st_buss_EmptyVehicleRecord").insert(EmptyVehicleObj); - //生成任务 - JSONObject taskObj = new JSONObject(); - taskObj.put("task_id", task_id); - taskObj.put("task_code", IdUtil.getSnowflake(1, 1).nextId() + ""); - taskObj.put("task_type", "03"); - taskObj.put("acs_task_type", "1"); - taskObj.put("task_status", task_status); - taskObj.put("start_point_code", start_point_code); - taskObj.put("start_area", start_area); - taskObj.put("request_param", form.toJSONString()); - taskObj.put("next_point_code", next_point_code); - taskObj.put("next_area", nextPoint.getArea_type()); - taskObj.put("vehicle_code", vehicle_code); - taskObj.put("handle_class", THIS_CLASS); - taskObj.put("is_auto_issue", is_auto_issue); - taskObj.put("create_name", UserInfoUtil.getNickName()); - taskObj.put("create_id", UserInfoUtil.getCurrentUserId()); - taskObj.put("create_time", DateUtil.now()); - taskObj.put("is_delete", "0"); - taskTable.insert(taskObj); - - return task_id; + String start_point_code = form.getString("start_point_code"); + String vehicle_type = form.getString("vehicle_type"); + WQLObject taskTable = WQLObject.getWQLObject("sch_base_task"); + // 判断起点有没有未完成的指令 + JSONObject beforTaskObj = + taskTable + .query( + "is_delete='0' and next_point_code='" + + next_point_code + + "' and task_status <>'" + + TaskStatusEnum.FINISHED.getCode() + + "'") + .uniqueResult(0); + if (ObjectUtil.isNotEmpty(beforTaskObj)) { + throw new BadRequestException("存在指令号为'" + beforTaskObj.getString("task_code") + "' 未完成!"); } + String start_area = ""; + // 假如起点为空,根据终点点去找对应工序需要的托盘类型 + if (StrUtil.isEmpty(start_point_code)) { + JSONObject workInfo = + WQL.getWO("QSTRUCT_RULE") + .addParam("flag", "1") + .addParam("code", next_point_code) + .process() + .uniqueResult(0); + String workprocedure_id = workInfo.getString("workprocedure_id"); + String device_id = workInfo.getString("device_id"); + WorkProcedureEnum workProcedureEnum = WorkProcedureEnum.get(workprocedure_id); + switch (workProcedureEnum) { + // 压制工序 + case YZGX: + vehicle_type = VehicleTypeEnum.GTP.getCode(); + start_area = AreaEnum.KTTDDQ.getCode(); + start_point_code = "KTPDDW5"; + break; + // 分拣工序 + case FJGX: + // 托盘类型取的物料对应的木托盘类型 + JSONObject produceObj = + WQLObject.getWQLObject("PDM_MG_produceTask") + .query("device_id='" + device_id + "' and producetask_status in('02','03','04')") + .uniqueResult(0); + if (ObjectUtil.isEmpty(produceObj)) + throw new BadRequestException("设备未设置工单或者工单状态不正确,请检查LMS设备工单状态!"); + vehicle_type = produceObj.getString("vehicle_type"); + start_area = AreaEnum.MTPQ.getCode(); + is_auto_issue = "0"; + break; + // 叠盘工序 + case DPGX: + // 托盘类型取的物料对应的木托盘类型 + vehicle_type = VehicleTypeEnum.GTP.getCode(); + start_area = AreaEnum.KTTHCQ.getCode(); + break; + default: + vehicle_type = VehicleTypeEnum.GTP.getCode(); + start_area = AreaEnum.KTTHCQ.getCode(); + } + JSONObject param = new JSONObject(); + // 如果托盘类型不是02,则需要加上托盘类型(木托盘) + if (!StrUtil.equals(vehicle_type, "02")) { + param.put("vehicle_type", vehicle_type); + } + param.put("area_type", start_area); + param.put("point_code", start_point_code); - @Override - public void forceFinish(String task_id) { - JSONObject taskObj = WQLObject.getWQLObject("SCH_BASE_Task").query("task_id = '" + task_id + "'").uniqueResult(0); - this.updateTaskStatus(taskObj, TaskStatusEnum.FINISHED.getCode()); + JSONObject outStructObj = StructFindUtil.getEmptyVehicleOutStruct(param); + if (ObjectUtil.isEmpty(outStructObj)) { + throw new BadRequestException("未找到合适的空托盘点位"); + } + + vehicle_code = outStructObj.getString("vehicle_code"); + if (StrUtil.isEmpty(vehicle_code)) { + vehicle_code = "999"; + } + // 如果是托盘区域/生成一个该类型的托盘 + if (StrUtil.equals(workInfo.getString("area_type"), AreaEnum.FJQY.getCode())) { + vehicle_code = CodeUtil.getNewCode("VEHICCLE_CODE_MTP"); + // 将托盘插入托盘表 + WQLObject wo = WQLObject.getWQLObject("MD_PB_Vehicle"); + JSONObject jo = new JSONObject(); + VehicleDto dto = new VehicleDto(); + dto.setVehicle_id(IdUtil.getSnowflake(1, 1).nextId()); + dto.setVehicle_code(vehicle_code); + dto.setCreate_id(UserInfoUtil.getCurrentUserId()); + dto.setVehicle_name(vehicle_code); + dto.setCreate_name(UserInfoUtil.getNickName()); + dto.setUpdate_optid(UserInfoUtil.getCurrentUserId()); + dto.setUpdate_optname(UserInfoUtil.getNickName()); + dto.setUpdate_time(DateUtil.now()); + dto.setCreate_time(DateUtil.now()); + dto.setVehicle_type(vehicle_type); + JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); + wo.insert(json); + } + + start_point_code = outStructObj.getString("struct_code"); } - - @Override - public void pullBack(String task_id) { - + PointService pointService = SpringContextHolder.getBean(PointService.class); + PointDto nextPoint = pointService.findByCode(next_point_code); + // 生成空托盘搬运的单据 + String task_status = TaskStatusEnum.SURE_END.getCode(); + String bill_status = "10"; + if (StrUtil.isNotEmpty(start_point_code)) { + // PointDto startPoint = pointService.findByCode(start_point_code); + bill_status = "20"; + task_status = TaskStatusEnum.START_AND_POINT.getCode(); + // 锁定起点 + HashMap lock_map = new HashMap(); + lock_map.put("lock_type", "01"); + WQLObject.getWQLObject("sch_base_point") + .update(lock_map, "point_code = '" + start_point_code + "'"); } + String task_id = IdUtil.getSnowflake(1, 1).nextId() + ""; + // 生成空载具搬运单据 + JSONObject EmptyVehicleObj = new JSONObject(); + EmptyVehicleObj.put("record_uuid", IdUtil.getSnowflake(1, 1).nextId()); + EmptyVehicleObj.put("bill_code", CodeUtil.getNewCode("KZJ_BILL_CODE")); + EmptyVehicleObj.put("bill_status", bill_status); + EmptyVehicleObj.put("start_point_code", start_point_code); + EmptyVehicleObj.put("next_point_code", next_point_code); + EmptyVehicleObj.put("start_area", start_area); + EmptyVehicleObj.put("end_area", nextPoint.getArea_type()); + EmptyVehicleObj.put("vehicle_code", vehicle_code); + EmptyVehicleObj.put("task_uuid", task_id); + EmptyVehicleObj.put("create_id", UserInfoUtil.getCurrentUserId()); + EmptyVehicleObj.put("create_name", UserInfoUtil.getNickName()); + EmptyVehicleObj.put("create_time", DateUtil.now()); + EmptyVehicleObj.put("is_delete", "0"); + WQLObject.getWQLObject("st_buss_EmptyVehicleRecord").insert(EmptyVehicleObj); + // 生成任务 + JSONObject taskObj = new JSONObject(); + taskObj.put("task_id", task_id); + taskObj.put("task_code", IdUtil.getSnowflake(1, 1).nextId() + ""); + taskObj.put("task_type", "03"); + taskObj.put("acs_task_type", "1"); + taskObj.put("task_status", task_status); + taskObj.put("start_point_code", start_point_code); + taskObj.put("start_area", start_area); + taskObj.put("request_param", form.toJSONString()); + taskObj.put("next_point_code", next_point_code); + taskObj.put("next_area", nextPoint.getArea_type()); + taskObj.put("vehicle_code", vehicle_code); + taskObj.put("handle_class", THIS_CLASS); + taskObj.put("is_auto_issue", is_auto_issue); + taskObj.put("create_name", UserInfoUtil.getNickName()); + taskObj.put("create_id", UserInfoUtil.getCurrentUserId()); + taskObj.put("create_time", DateUtil.now()); + taskObj.put("is_delete", "0"); + taskTable.insert(taskObj); - @Override - public void cancel(String task_id) { + return task_id; + } - } + @Override + public void forceFinish(String task_id) { + JSONObject taskObj = + WQLObject.getWQLObject("SCH_BASE_Task") + .query("task_id = '" + task_id + "'") + .uniqueResult(0); + this.updateTaskStatus(taskObj, TaskStatusEnum.FINISHED.getCode()); + } + + @Override + public void pullBack(String task_id) {} + + @Override + public void cancel(String task_id) {} } diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/StructToConveyorTask.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/StructToConveyorTask.java index ab14e26..b679418 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/StructToConveyorTask.java +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/manage/buss/StructToConveyorTask.java @@ -8,9 +8,8 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.nl.exception.BadRequestException; -import org.nl.modules.system.util.CodeUtil; import org.nl.common.utils.UserInfoUtil; +import org.nl.exception.BadRequestException; import org.nl.utils.SpringContextHolder; import org.nl.wms.common.StructFindUtil; import org.nl.wms.sch.manage.AbstractAcsTask; @@ -22,7 +21,6 @@ import org.nl.wms.st.ivt.IvtChangeTypeEnum; import org.nl.wms.st.ivt.StoreIvtServiceImpl; import org.nl.wql.core.bean.WQLObject; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; import java.util.HashMap; @@ -157,16 +155,11 @@ public class StructToConveyorTask extends AbstractAcsTask { } @Override - @Transactional public String createTask(JSONObject form) { //请求参数 载具、起点 物料,数量,客户,批次,创建方式 是否满托不能为空! 终点可以不为空时,入库单据编号不能为空 String vehicle_code = form.getString("vehicle_code"); String start_point_code = form.getString("start_point_code"); String next_point_code = form.getString("next_point_code"); - String material_id = form.getString("material_id"); - String is_full = form.getString("is_full"); - String qty = form.getString("qty"); - String pcsn = form.getString("pcsn"); WQLObject taskTable = WQLObject.getWQLObject("SCH_BASE_Task"); if (StrUtil.isEmpty(start_point_code)) { @@ -182,29 +175,7 @@ public class StructToConveyorTask extends AbstractAcsTask { if (ObjectUtil.isNotEmpty(beforTaskObj)) { throw new BadRequestException("存在指令号为'" + beforTaskObj.getString("task_code") + "' 未完成!"); } - String is_autopackage = "1"; - if (StrUtil.equals(start_point_code, "MDJXS601")) { - is_autopackage = "0"; - } String task_id = IdUtil.getSnowflake(1, 1).nextId() + ""; - JSONObject materialObj = WQLObject.getWQLObject("md_me_material").query("material_id='" + material_id + "'").uniqueResult(0); - /* //组盘 - JSONObject jo = new JSONObject(); - String group_id = IdUtil.getSnowflake(1, 1).nextIdStr(); - jo.put("group_id", group_id); - jo.put("material_id", material_id); - jo.put("material_code", materialObj.getString("material_code")); - jo.put("material_name", materialObj.getString("material_name")); - jo.put("vehicle_code", vehicle_code); - jo.put("is_autopackage", is_autopackage); - jo.put("pcsn", pcsn); - jo.put("qty", qty); - jo.put("create_id",UserInfoUtil.getCurrentUserId()); - jo.put("create_name",UserInfoUtil.getNickName()); - jo.put("create_time",DateUtil.now()); - jo.put("task_id",task_id); - WQLObject groupTable = WQLObject.getWQLObject("st_buss_vehiclegroup"); - groupTable.insert(jo);*/ PointService pointService = SpringContextHolder.getBean(PointService.class); PointDto startPoint = pointService.findByCode(start_point_code); diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/task/AutoCreateTask.java b/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/task/AutoCreateTask.java index c25f516..60ac502 100644 --- a/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/task/AutoCreateTask.java +++ b/wms/hd/nladmin-system/src/main/java/org/nl/wms/sch/task/AutoCreateTask.java @@ -102,7 +102,9 @@ public class AutoCreateTask { taskList.forEach(item -> { JSONObject taskObj = new JSONObject(); taskObj.put("task_id", item.getExt_task_uuid()); - taskObj.put("task_status", TaskStatusEnum.ISSUE.getCode()); + //下发失败,改状态为了重新下发 + taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); +// taskObj.put("task_status", TaskStatusEnum.ISSUE.getCode()); taskObj.put("remark", "下发失败:" + message); taskObj.put("update_time", DateUtil.now()); taskTab.update(taskObj); @@ -115,6 +117,9 @@ public class AutoCreateTask { JSONObject taskObj = errArr.getJSONObject(i); JSONObject param=new JSONObject(); param.put("remark", "下发失败:"+taskObj.getString("message")); + //下发失败,改状态为了重新下发 + param.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); + param.put("update_time", DateUtil.now()); taskTab.update(param,"task_code = '"+taskObj.getString("task_code")+"'"); } diff --git a/wms/hd/nladmin-system/src/main/java/org/nl/wms/wms.xls b/wms/hd/nladmin-system/src/main/java/org/nl/wms/wms.xls index bfbe46033d316f6f1213fab6e5a096f90c7a36da..18e7f2a1180a3ea5f1736ea91f191cf9b311a11e 100644 GIT binary patch delta 56883 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 B{Qv*} diff --git a/wms/hd/nladmin-system/src/main/resources/logback-spring.xml b/wms/hd/nladmin-system/src/main/resources/logback-spring.xml index ba945de..c4506c9 100644 --- a/wms/hd/nladmin-system/src/main/resources/logback-spring.xml +++ b/wms/hd/nladmin-system/src/main/resources/logback-spring.xml @@ -60,7 +60,7 @@ https://juejin.cn/post/6844903775631572999 - + diff --git a/wms/qd/src/views/login.vue b/wms/qd/src/views/login.vue index a78daa0..dca1ec9 100644 --- a/wms/qd/src/views/login.vue +++ b/wms/qd/src/views/login.vue @@ -46,7 +46,7 @@ import { encrypt } from '@/utils/rsaEncrypt' import Config from '@/settings' import { getCodeImg } from '@/api/login' import Cookies from 'js-cookie' -import Background from '@/assets/images/background2.jpg' +import Background from '@/assets/images/background.jpg' export default { name: 'Login', data() { diff --git a/wms/qd/src/views/wms/pdm/produceTask/index.vue b/wms/qd/src/views/wms/pdm/produceTask/index.vue index 621e657..7ce2ef8 100644 --- a/wms/qd/src/views/wms/pdm/produceTask/index.vue +++ b/wms/qd/src/views/wms/pdm/produceTask/index.vue @@ -257,7 +257,7 @@ {{ dict.label.PRODUCETASK_STATUS[scope.row.producetask_status] }} - + @@ -268,7 +268,7 @@ - + @@ -300,14 +300,21 @@ -