From b71d83c8ffac20f1dfcca2d689da6f7b88ed94d0 Mon Sep 17 00:00:00 2001 From: liyongde <1419499670@qq.com> Date: Wed, 5 Jul 2023 16:37:08 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BE=9B=E7=BB=99=E7=BA=BF=E3=80=81?= =?UTF-8?q?=E6=B2=B9=E6=BC=86=E7=BA=BF=E4=B8=8A=E6=96=99=E4=B8=8Emes?= =?UTF-8?q?=E5=AF=B9=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../acs/service/impl/AcsToWmsServiceImpl.java | 1 + .../mes/service/impl/MesToWmsServiceImpl.java | 17 +++++++- .../mes/service/impl/WmsToMesServiceImpl.java | 2 +- .../service/impl/WorkorderServiceImpl.java | 39 +++++++++--------- .../src/main/java/org/nl/wms/sch/MesUtil.java | 13 ++++-- .../tasks/autoTask/DPJCallVehicleTask.java | 15 ++++--- .../callMaterial/YqxCallMaterialTask.java | 19 +++++---- .../sendEmpty/YqxSendEmpVehicleTask.java | 18 +++++++- .../sendMaterial/GjxSendMaterialTask.java | 28 ++++++++++--- .../sendMaterial/HtSendMaterialTask.java | 3 ++ .../src/main/java/org/nl/wms/wms.xls | Bin 297984 -> 301056 bytes 11 files changed, 108 insertions(+), 47 deletions(-) diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java index 069ac9e..d8782be 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java @@ -221,6 +221,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { param.put("vehicle_type", vehicle_type); param.put("vehicle_code", vehicle_code); param.put("task_code", whereJson.getString("task_code")); + param.put("workorder_code", whereJson.getString("workorder_code")); GjxSendMaterialTask taskBean = SpringContextHolder.getBean(GjxSendMaterialTask.class); String task_id = taskBean.createTask(param); // 创建任务 diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/impl/MesToWmsServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/impl/MesToWmsServiceImpl.java index d233743..b16f1e4 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/impl/MesToWmsServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/impl/MesToWmsServiceImpl.java @@ -3,6 +3,7 @@ package org.nl.wms.ext.mes.service.impl; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -38,6 +39,7 @@ public class MesToWmsServiceImpl implements MesToWmsService { WQLObject workOrderTab = WQLObject.getWQLObject("pdm_bd_workorder"); WQLObject deviceTab = WQLObject.getWQLObject("pdm_bi_device"); WQLObject materialTab = WQLObject.getWQLObject("md_me_materialbase"); + WQLObject workOrderCacheTab = WQLObject.getWQLObject("PDM_BI_WorkOrderCache"); if (ObjectUtil.isEmpty(param)) { throw new BadRequestException("工单不能为空"); } @@ -67,7 +69,7 @@ public class MesToWmsServiceImpl implements MesToWmsService { orderWS.put("realproduceend_date", DateUtil.now()); workOrderTab.update(orderWS); } - if (ObjectUtil.isNotEmpty(orderKX)) { + if (ObjectUtil.isNotEmpty(orderKX)) { // 存在,就关闭 orderKX.put("order_status", "5"); orderKX.put("update_time", DateUtil.now()); orderKX.put("realproduceend_date", DateUtil.now()); @@ -95,8 +97,19 @@ public class MesToWmsServiceImpl implements MesToWmsService { param.put("device_id", "1654663328972279808"); param.put("device_code", deviceCodeKS); workOrderTab.insert(param); + } else { + // 有的话就暂存起来 + param.put("workorder_id", IdUtil.getSnowflake(1,1).nextIdStr()); + param.put("device_id", "1607915553220071424"); + param.put("device_code", deviceCodeWX); + param.put("update_time", DateUtil.now()); + workOrderCacheTab.insert(param); + param.put("workorder_id", IdUtil.getSnowflake(1,1).nextIdStr()); + param.put("device_id", "1654663328972279808"); + param.put("device_code", deviceCodeKS); + workOrderCacheTab.insert(param); } - } else { + } else { // 不是油漆线直接存入 param.put("workorder_id", IdUtil.getSnowflake(1,1).nextIdStr()); param.put("device_id", deviceCode.getString("device_id")); param.put("device_code", deviceCode.getString("device_code")); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/impl/WmsToMesServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/impl/WmsToMesServiceImpl.java index f886490..e890df0 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/impl/WmsToMesServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/mes/service/impl/WmsToMesServiceImpl.java @@ -38,7 +38,7 @@ public class WmsToMesServiceImpl implements WmsToMesService { public void taskFeedback(JSONObject param, String finterfaceid) { JSONObject feedback = MesUtil.taskFeedback(param, finterfaceid); if (!feedback.getString("code").equals("200")) { - //???? + taskFeedback(param, finterfaceid); } } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/pdm/service/impl/WorkorderServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/service/impl/WorkorderServiceImpl.java index f669ec0..442100b 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/pdm/service/impl/WorkorderServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/pdm/service/impl/WorkorderServiceImpl.java @@ -383,29 +383,30 @@ public class WorkorderServiceImpl implements WorkordeService { @Override @Transactional(rollbackFor = Exception.class) public void finish(JSONObject param) { + WQLObject workorderTab = WQLObject.getWQLObject("pdm_bd_workorder"); + WQLObject workOrderCacheTab = WQLObject.getWQLObject("PDM_BI_WorkOrderCache"); Long currentUserId = SecurityUtils.getCurrentUserId(); String nickName = SecurityUtils.getCurrentNickName(); String now = DateUtil.now(); JSONObject row = param.getJSONObject("row"); - String workorder_id = row.getString("workorder_id"); - WQLObject wo = WQLObject.getWQLObject("PDM_BD_WORKORDER"); - JSONObject produceorderMap = new JSONObject(); - produceorderMap.put("workorder_id",workorder_id); - produceorderMap.put("order_status","5"); - produceorderMap.put("update_optid", currentUserId); - produceorderMap.put("device_id", null); - produceorderMap.put("update_optname", nickName); - produceorderMap.put("update_time", now); - produceorderMap.put("realproduceend_date", now); - wo.update(produceorderMap); - //wms向acs发送请求 工单强制完成 - // TODO - JSONArray array = new JSONArray(); - JSONObject map = new JSONObject(); - map.put("ext_order_id",workorder_id); - map.put("type","3"); - array.add(map); - wmsToAcsService.orderStatusUpdate(array); + String deviceCode = row.getString("device_code"); + row.put("realproduceend_date", now); + row.put("update_optid", currentUserId); + row.put("update_optname", nickName); + row.put("update_time", now); + row.put("order_status", "5"); + workorderTab.update(row); + if (deviceCode.equals("YQX01WX") || deviceCode.equals("YQX01KS")) { + JSONObject jsonObject = workOrderCacheTab.query("device_code = '" + deviceCode + "'", "update_time").uniqueResult(0); + if (ObjectUtil.isEmpty(jsonObject)) { + // 找不到就推出 + return; + } + // 油漆线特殊处理: 工单完成并把这个设备的工单换成暂存表的工单 + workorderTab.insert(jsonObject); + // 加入后工单要去掉 + workOrderCacheTab.delete(jsonObject); + } } @Override diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/MesUtil.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/MesUtil.java index b69a78f..59874cb 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/MesUtil.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/MesUtil.java @@ -30,8 +30,10 @@ import java.util.Map; public class MesUtil { public static JSONObject taskFeedback(JSONObject param, String finterfaceid) { MDC.put("log_file_type", "WMS任务完成反馈给MES"); - String endpointUrl = "http://helptimely.com:7722/Timely4100_15_yonyu/services/HtWebService"; // 替换为实际的 WebService 地址 +// String endpointUrl = "http://helptimely.com:7722/Timely4100_15_yonyu/services/HtWebService"; // 替换为实际的 WebService 地址 + String endpointUrl = "http://192.168.4.111:8080/mes/services/HtWebService"; // 替换为实际的 WebService 地址 JSONObject result = new JSONObject(); + JSONObject resObj = new JSONObject(); Map stringMap = new HashMap<>(); try { // 创建 HttpClient @@ -73,14 +75,19 @@ public class MesUtil { stringMap = parseXml2Map(String.valueOf(responseContent), new HashMap<>()); log.info("Response Code: " + statusCode); log.info("Response Body: " + stringMap); - if (statusCode == 200) { + String s = stringMap.get("Body.postResponse.return"); + resObj = JSON.parseObject(s); + if (resObj.getString("ErrorCode").equals("0")) { result.put("code", 200); result.put("message", "操作成功!"); + } else { + result.put("code", resObj.getString("ErrorCode")); + result.put("message", resObj.getString("ErrorMessage")); } } catch (Exception e) { log.error(e.getMessage()); result.put("code", 400); - result.put("message", stringMap.get("ErrorMessage")); + result.put("message", resObj.get("ErrorMessage")); } MDC.remove("log_file_type"); return result; diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/autoTask/DPJCallVehicleTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/autoTask/DPJCallVehicleTask.java index 351903e..2d42c9b 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/autoTask/DPJCallVehicleTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/autoTask/DPJCallVehicleTask.java @@ -41,9 +41,7 @@ public class DPJCallVehicleTask extends AbstractAcsTask { private final String THIS_CLASS = DPJCallVehicleTask.class.getName(); @Override public List addTask() { - /* - * 下发给ACS时需要特殊处理 - */ + /** 下发给ACS时需要特殊处理*/ JSONArray arr = WQLObject.getWQLObject("SCH_BASE_Task").query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0); ArrayList acsTaskArr = new ArrayList<>(); @@ -150,7 +148,7 @@ public class DPJCallVehicleTask extends AbstractAcsTask { .addParamMap(query) .process() .getResultJSONArray(0); - PointUpdateUtil.updatePoint(array); +// PointUpdateUtil.updatePoint(array); // 选择一个空位 JSONObject endPoint = WQL.getWO("DPJ_AUTOTASK") @@ -210,7 +208,12 @@ public class DPJCallVehicleTask extends AbstractAcsTask { .addParamMap(MapOf.of("flag", "4", "block_num", emptyPoint.getString("block_num"), "row_num", emptyPoint.getString("row_num"))).process() .uniqueResult(0); - if (ObjectUtil.isEmpty(waitPoint)) throw new BadRequestException("叠盘架呼叫空托判断等待点异常!"); + if (ObjectUtil.isEmpty(waitPoint)) { + taskObj.put("remark", "叠盘架呼叫空托判断等待点异常"); + taskObj.put("update_time", DateUtil.now()); + taskTab.update(taskObj); + throw new BadRequestException("叠盘架呼叫空托判断等待点异常!"); + } // 2.2、判断等待点 if (!waitPoint.getString("waitcol").equals(emptyPoint.getString("col_num"))) { // 获取等待点 @@ -221,7 +224,7 @@ public class DPJCallVehicleTask extends AbstractAcsTask { "AND is_delete = '0' " + "AND lock_type = '1'").uniqueResult(0); if (ObjectUtil.isEmpty(waitPoints)) { - taskObj.put("remark", "等待点已被占用"); + taskObj.put("remark", "等待点[" + waitPoints.getString("point_code") + "]已被占用"); taskObj.put("update_time", DateUtil.now()); taskTab.update(taskObj); continue; diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/YqxCallMaterialTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/YqxCallMaterialTask.java index 36e8525..1546b8c 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/YqxCallMaterialTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/callMaterial/YqxCallMaterialTask.java @@ -78,6 +78,12 @@ public class YqxCallMaterialTask extends AbstractAcsTask { if (StrUtil.equals(status, "2")) { //完成后 + // 通知mes + feedback.put("fscanserialid001", taskObj.getString("task_code")); + feedback.put("flocationid979number", taskObj.getString("point_code1")); + feedback.put("flpn979", material_point.getString("vehicle_code")); + feedback.put("fstoragequantity979", material_point.getString("ivt_qty")); + wmsToMesService.taskFeedback(feedback, "WM_INV_MOVE_P011_AGV02"); // 物料点位解锁 并设置空位 material_point.put("lock_type", "1"); material_point.put("point_status", "1"); @@ -94,13 +100,6 @@ public class YqxCallMaterialTask extends AbstractAcsTask { if (ObjectUtil.isEmpty(material_point)) return; - // 通知mes - feedback.put("fscanserialid001", taskObj.getString("task_code")); - feedback.put("flocationid979number", taskObj.getString("point_code1")); - feedback.put("flpn979", taskObj.getString("vehicle_code")); - feedback.put("fstoragequantity979", taskObj.getString("material_qty")); - wmsToMesService.taskFeedback(feedback, "WM_INV_MOVE_P011_AGV02"); - //区域出入表【st_ivt_regionIO】 WQLObject regionIoTab = WQLObject.getWQLObject("st_ivt_regionIO"); JSONObject regionIoObj = new JSONObject(); @@ -129,7 +128,7 @@ public class YqxCallMaterialTask extends AbstractAcsTask { @Override public void findStartPoint() { - MDC.put("log_file_type", "YqxCallMaterial"); + MDC.put("log_file_type", "油漆线叫料"); // 到养生A区找起点:根据物料、载具类型去查找,均在工单中 WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表 WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); // 点位表 @@ -194,10 +193,12 @@ public class YqxCallMaterialTask extends AbstractAcsTask { log.info("等待点搬运物料"); taskObj.put("point_code1", materialPoint.getString("point_code")); taskObj.put("material_qty", materialPoint.getString("ivt_qty")); + taskObj.put("vehicle_code", materialPoint.getString("vehicle_code")); taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); taskObj.put("acs_task_type", "2"); taskObj.put("remark", "等待点搬运物料"); taskObj.put("update_time", DateUtil.now()); + log.info("任务信息:{}", taskObj); taskTab.update(taskObj); } else { log.info("养生A区无所需物料"); @@ -336,10 +337,12 @@ public class YqxCallMaterialTask extends AbstractAcsTask { if (ObjectUtil.isEmpty(materialPoint)) { throw new BadRequestException("养生A区暂无所需物料!"); // 此时车会停止 } + log.info("追加任务物料点:{}", materialPoint); String pointCode = materialPoint.getString("point_code"); // 修改任务 hcTask.put("point_code1", pointCode); hcTask.put("material_qty", materialPoint.getString("ivt_qty")); + hcTask.put("vehicle_code", materialPoint.getString("vehicle_code")); hcTask.put("remark", "养生A区:" + pointCode); taskTab.update(hcTask); // 锁住点位 diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendEmpty/YqxSendEmpVehicleTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendEmpty/YqxSendEmpVehicleTask.java index 63c96bf..d9acc4d 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendEmpty/YqxSendEmpVehicleTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendEmpty/YqxSendEmpVehicleTask.java @@ -17,6 +17,7 @@ import org.nl.wms.sch.manage.AbstractAcsTask; import org.nl.wms.sch.manage.TaskStatusEnum; import org.nl.wms.sch.tasks.AcsTaskDto; import org.nl.wms.sch.tasks.RegionTypeEnum; +import org.slf4j.MDC; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -123,6 +124,8 @@ public class YqxSendEmpVehicleTask extends AbstractAcsTask { @Override @Transactional(rollbackFor = Exception.class) public String createTask(JSONObject form) { + MDC.put("log_file_type", "油漆线呼叫空载具"); + log.info("请求参数: {}", form); /* * 1.先生成确定起点的任务 * 2.通过findNextPoint()找终点 @@ -135,16 +138,16 @@ public class YqxSendEmpVehicleTask extends AbstractAcsTask { WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point"); String point_code1 = form.getString("point_code1"); String device_code = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0).getString("device_code"); - JSONObject workOrderObj = workOrderTab.query("device_code = '" + device_code + "' and order_status = '3' and is_delete ='0'").uniqueResult(0); if (ObjectUtil.isEmpty(workOrderObj)) throw new BadRequestException("该设备当前未生产或者已删除"); String vehicleType = workOrderObj.getString("vehicle_type"); + log.info("目前工单请求的载具类型: {}", vehicleType); if (ObjectUtil.isEmpty(vehicleType)) throw new BadRequestException("载具类型不能为空"); JSONObject jsonObject = pointTab.query("region_code = 'YQQY01' and point_type = '2' and can_vehicle_type = '" + vehicleType + "'").uniqueResult(0); if (ObjectUtil.isEmpty(jsonObject)) throw new BadRequestException("找不到油漆线托盘下料起点"); String startPointCode = jsonObject.getString("point_code"); - + log.info("找到起点的位置:{}", startPointCode); //任务表【SCH_BASE_Task】 //判断当前点是否有未完成的任务 JSONObject taskObj = taskTab.query("is_delete='0' and point_code1 = '" + @@ -167,6 +170,7 @@ public class YqxSendEmpVehicleTask extends AbstractAcsTask { .build(); JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); taskTab.insert(json); + log.info("任务创建成功->id: {}", dto.getTask_id()); // this.findNextPoint(); this.immediateNotifyAcs(); return String.valueOf(dto.getTask_id()); @@ -253,10 +257,12 @@ public class YqxSendEmpVehicleTask extends AbstractAcsTask { String end_code = ""; String vehicle_type = param.getString("vehicle_type"); + log.info("载具类型:{}", vehicle_type); // 1.找到对应类型的叠盘架 JSONObject jsonDpjEnd = pointTab.query("region_id = '" + RegionTypeEnum.DPJQB.getId() + "' and can_vehicle_type = '" + vehicle_type + "' and lock_type = '1' and is_used = '1' and is_delete = '0'").uniqueResult(0); if (ObjectUtil.isNotEmpty(jsonDpjEnd)) { + log.info("找到对应类型的叠盘架: {}", jsonDpjEnd.getString("point_code")); // 判断数量 + 叠盘架的数量是否超过此叠盘架的最大数量 double add_num = NumberUtil.add(param.getIntValue("qty"), jsonDpjEnd.getIntValue("vehicle_qty")); @@ -268,6 +274,7 @@ public class YqxSendEmpVehicleTask extends AbstractAcsTask { if (ObjectUtil.isNotEmpty(jsonZcwEnd)) { end_code = jsonZcwEnd.getString("point_code"); + log.info("找到叠盘架缓存位:{}", end_code); } else { // 为空就去养生A区的等待位 // JSONObject jsonEmpWait = pointTab.query("region_id = '" + RegionTypeEnum.YSAQKTPQ01.getId() + "' and col_num = '1' and can_vehicle_type = '" + vehicle_type + "' and lock_type = '1' and is_used = '1' and is_delete = '0' and point_status = '1'").uniqueResult(0); @@ -286,6 +293,7 @@ public class YqxSendEmpVehicleTask extends AbstractAcsTask { if (is_point) { end_code = endPointCode; } + log.info("找到养生A区: {}", end_code); } } } else { @@ -293,6 +301,7 @@ public class YqxSendEmpVehicleTask extends AbstractAcsTask { JSONObject jsonZcwEnd = pointTab.query("region_id = '" + RegionTypeEnum.KTPHCQB.getId() + "' and can_vehicle_type = '" + vehicle_type + "' and lock_type = '1' and is_used = '1' and is_delete = '0' and point_status = '1'").uniqueResult(0); if (ObjectUtil.isNotEmpty(jsonZcwEnd)) { end_code = jsonZcwEnd.getString("point_code"); + log.info("叠盘架没有空位去找叠盘暂存位:{}", end_code); } else { // 为空就去养生A区的等待位 // JSONObject jsonEmpWait = pointTab.query("region_id = '" + RegionTypeEnum.YSAQKTPQ01.getId() + "' and col_num = '1' and can_vehicle_type = '" + vehicle_type + "' and lock_type = '1' and is_used = '1' and is_delete = '0' and point_status = '1'").uniqueResult(0); @@ -312,8 +321,10 @@ public class YqxSendEmpVehicleTask extends AbstractAcsTask { if (is_point) { end_code = endPointCode; } + log.info("去养生A区{}", end_code); } } + log.info("找到终点:{}", end_code); return end_code; } @@ -323,6 +334,7 @@ public class YqxSendEmpVehicleTask extends AbstractAcsTask { * @return */ public String goToYSAQ(String vehicle_type) { + log.info("载具类型:{}", vehicle_type); String endPointCode = null; WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point"); // 点位表 // 先找看看有没有放过托盘的 @@ -331,6 +343,7 @@ public class YqxSendEmpVehicleTask extends AbstractAcsTask { " AND point_status = '2' AND is_used = '1' AND is_delete = '0'","block_num, row_num, in_empty_seq") .uniqueResult(0); if (ObjectUtil.isNotEmpty(emptyObj)) { + log.info("找到之前放过空载具的位置:{}", emptyObj); // 如果存在则往下继续放 Integer block_num = emptyObj.getInteger("block_num"); Integer col_num = emptyObj.getInteger("col_num"); // 列 @@ -352,6 +365,7 @@ public class YqxSendEmpVehicleTask extends AbstractAcsTask { "and point_status = '1'", "block_num, row_num, in_empty_seq desc").uniqueResult(0); endPointCode = endPointObj.getString("point_code"); } + log.info("找到的终点:{}", endPointCode); return endPointCode; } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/GjxSendMaterialTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/GjxSendMaterialTask.java index 1df573d..cfdedfc 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/GjxSendMaterialTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/GjxSendMaterialTask.java @@ -328,14 +328,17 @@ public class GjxSendMaterialTask extends AbstractAcsTask { WQLObject workOrderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder"); //点位基础表【SCH_BASE_Point】 WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point"); + WQLObject deviceTab = WQLObject.getWQLObject("pdm_bi_device"); //任务表【SCH_BASE_Task】 WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); String point_code1 = whereJson.getString("point_code1"); + String device = null; // mes点位不同,要重新寻找 JSONObject djwPoint = pointTab.query("mes_device_code = '" + point_code1 + "' AND is_used = '1'").uniqueResult(0); if (ObjectUtil.isNotEmpty(djwPoint)) { point_code1 = djwPoint.getString("point_code"); + device = djwPoint.getString("device_code"); } String vehicle_code = whereJson.getString("vehicle_code"); String qty = whereJson.getString("qty"); @@ -343,17 +346,30 @@ public class GjxSendMaterialTask extends AbstractAcsTask { if (ObjectUtil.isNotEmpty(whereJson.getString("task_code"))) { task_code = whereJson.getString("task_code"); } + JSONObject workOrderObj = new JSONObject(); + String workorderCode = whereJson.getString("workorder_code"); + // 如果是acs自己玩就没有带工单编号 + if (ObjectUtil.isEmpty(workorderCode)) { + String device_code = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0).getString("device_code"); + workOrderObj = workOrderTab.query("device_code = '" + device_code + "' and order_status = '3' and is_delete ='0'").uniqueResult(0); + } else { + workOrderObj = workOrderTab.query("workorder_code = '" + workorderCode + "'").uniqueResult(0); + } + if (ObjectUtil.isEmpty(workOrderObj)) { + throw new BadRequestException("该设备当前未生产或者已删除"); + } + if (ObjectUtil.isNotEmpty(device) && !workOrderObj.getString("device_code").equals(device)) { + JSONObject jsonObject = deviceTab.query("device_code = '" + device + "'").uniqueResult(0); + // 工单不符合,工单切换设备 + workOrderObj.put("device_code", jsonObject.getString("device_code")); + workOrderObj.put("device_id", jsonObject.getString("device_id")); + workOrderTab.update(workOrderObj); + } //判断当前点是否有未完成的任务 JSONObject taskObj = taskTab.query("is_delete='0' and point_code1 = '" + point_code1 + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0); if (ObjectUtil.isNotEmpty(taskObj)) throw new BadRequestException("当前点位" + point_code1 + "存在未完成的任务"); - String device_code = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0).getString("device_code"); - - JSONObject workOrderObj = workOrderTab.query("device_code = '" + device_code + "' and order_status = '3' and is_delete ='0'").uniqueResult(0); - if (ObjectUtil.isEmpty(workOrderObj)) throw new BadRequestException("该设备当前未生产或者已删除"); - - SchTaskDto dto = SchTaskDto.builder() .task_id(IdUtil.getLongId()) .task_code(task_code) diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/HtSendMaterialTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/HtSendMaterialTask.java index 9a1eb29..2510945 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/HtSendMaterialTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/HtSendMaterialTask.java @@ -128,6 +128,8 @@ public class HtSendMaterialTask extends AbstractAcsTask { @Override @Transactional(rollbackFor = Exception.class) public String createTask(JSONObject form) { + MDC.put("log_file_type", "一楼货梯口送料"); + log.info("传来的数据:{}", form); WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); WQLObject vehicleInfoTab = WQLObject.getWQLObject("md_pb_vehicle"); String startPointCode = form.getString("point_code1"); @@ -159,6 +161,7 @@ public class HtSendMaterialTask extends AbstractAcsTask { JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto)); taskTab.insert(json); this.immediateNotifyAcs(); + MDC.remove("log_file_type"); return String.valueOf(dto.getTask_id()); } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/wms.xls b/lms/nladmin-system/src/main/java/org/nl/wms/wms.xls index 858a3bcdb93c3b563cc91c69232f8bc2b859262e..b4d14ae6ed9c699983cc0b5a6316a48373ac4dbc 100644 GIT binary patch delta 12131 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