From 6fa8a68356973b6cf764d10ed764bae9726cb95c Mon Sep 17 00:00:00 2001 From: liyongde <1419499670@qq.com> Date: Thu, 6 Jul 2023 12:15:07 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20mes=E5=AF=B9=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mes/service/impl/MesToWmsServiceImpl.java | 39 +++++++++++++----- .../mes/service/impl/WmsToMesServiceImpl.java | 4 +- .../src/main/java/org/nl/wms/sch/MesUtil.java | 29 +++++++++++-- .../sendMaterial/CpSendMaterialTask.java | 9 ++-- .../src/main/java/org/nl/wms/wms.xls | Bin 301056 -> 303616 bytes 5 files changed, 58 insertions(+), 23 deletions(-) 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 b16f1e4..ca7fa74 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 @@ -59,32 +59,33 @@ public class MesToWmsServiceImpl implements MesToWmsService { if (param.getString("device_code").equals("C007")) { // 油漆线 // 分物料上料位与下料位两个工单 String deviceCodeWS = deviceCode.getString("device_code") + "WS"; - String deviceCodeKX = deviceCode.getString("device_code") + "KX"; + // 如果未完成,就把工单完成并插入 JSONObject orderWS = workOrderTab.query("device_code = '" + deviceCodeWS + "' AND order_status <> '5'").uniqueResult(0); - JSONObject orderKX = workOrderTab.query("device_code = '" + deviceCodeKX + "' AND order_status <> '5'").uniqueResult(0); +// JSONObject orderKX = workOrderTab.query("device_code = '" + deviceCodeKX + "' AND order_status <> '5'").uniqueResult(0); if (ObjectUtil.isNotEmpty(orderWS)) { // 存在,就关闭 orderWS.put("order_status", "5"); orderWS.put("update_time", DateUtil.now()); orderWS.put("realproduceend_date", DateUtil.now()); workOrderTab.update(orderWS); } - if (ObjectUtil.isNotEmpty(orderKX)) { // 存在,就关闭 - orderKX.put("order_status", "5"); - orderKX.put("update_time", DateUtil.now()); - orderKX.put("realproduceend_date", DateUtil.now()); - workOrderTab.update(orderKX); - } +// if (ObjectUtil.isNotEmpty(orderKX)) { // 存在,就关闭 +// orderKX.put("order_status", "5"); +// orderKX.put("update_time", DateUtil.now()); +// orderKX.put("realproduceend_date", DateUtil.now()); +// workOrderTab.update(orderKX); +// } param.put("workorder_id", IdUtil.getSnowflake(1,1).nextIdStr()); param.put("device_id", "1607915464833503232"); param.put("device_code", deviceCodeWS); workOrderTab.insert(param); - param.put("workorder_id", IdUtil.getSnowflake(1,1).nextIdStr()); - param.put("device_id", "1654663217064054784"); - param.put("device_code", deviceCodeKX); +// param.put("workorder_id", IdUtil.getSnowflake(1,1).nextIdStr()); +// param.put("device_id", "1654663217064054784"); +// param.put("device_code", deviceCodeKX); workOrderTab.insert(param); String deviceCodeWX = deviceCode.getString("device_code") + "WX"; String deviceCodeKS = deviceCode.getString("device_code") + "KS"; + String deviceCodeKX = deviceCode.getString("device_code") + "KX"; JSONObject deviceCodeWXOrder = workOrderTab .query("device_code = '" + deviceCodeWX + "' AND order_status <> '5'") .uniqueResult(0); @@ -97,6 +98,10 @@ public class MesToWmsServiceImpl implements MesToWmsService { param.put("device_id", "1654663328972279808"); param.put("device_code", deviceCodeKS); workOrderTab.insert(param); + param.put("workorder_id", IdUtil.getSnowflake(1,1).nextIdStr()); + param.put("device_id", "1654663217064054784"); + param.put("device_code", deviceCodeKX); + workOrderTab.insert(param); } else { // 有的话就暂存起来 param.put("workorder_id", IdUtil.getSnowflake(1,1).nextIdStr()); @@ -108,8 +113,20 @@ public class MesToWmsServiceImpl implements MesToWmsService { param.put("device_id", "1654663328972279808"); param.put("device_code", deviceCodeKS); workOrderCacheTab.insert(param); + param.put("workorder_id", IdUtil.getSnowflake(1,1).nextIdStr()); + param.put("device_id", "1654663217064054784"); + param.put("device_code", deviceCodeKX); + workOrderCacheTab.insert(param); } } else { // 不是油漆线直接存入 + JSONObject orderObjs = workOrderTab + .query("device_code = '" + deviceCode.getString("device_code") + "' AND order_status <> '5'") + .uniqueResult(0); + if (ObjectUtil.isNotEmpty(orderObjs)) { + // 多个工单就完成 + orderObjs.put("order_status", "5"); + workOrderTab.update(orderObjs); + } 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 e890df0..bd59d8c 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 @@ -37,9 +37,7 @@ public class WmsToMesServiceImpl implements WmsToMesService { @Override public void taskFeedback(JSONObject param, String finterfaceid) { JSONObject feedback = MesUtil.taskFeedback(param, finterfaceid); - if (!feedback.getString("code").equals("200")) { - taskFeedback(param, finterfaceid); - } + log.info("反馈结果: {}", feedback); } } 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 59874cb..7202913 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 @@ -1,5 +1,6 @@ package org.nl.wms.sch; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; @@ -34,6 +35,20 @@ public class MesUtil { String endpointUrl = "http://192.168.4.111:8080/mes/services/HtWebService"; // 替换为实际的 WebService 地址 JSONObject result = new JSONObject(); JSONObject resObj = new JSONObject(); + String fsn502 = param.getString("fsn502"); + String fscanserialid001 = param.getString("fscanserialid001"); + String fpacknumberpl695 = param.getString("fpacknumberpl695"); + String fserialid054 = param.getString("fserialid054"); + // 获取任务编号 + String task_code = ObjectUtil.isNotEmpty(fsn502) + ? fsn502 + : ObjectUtil.isNotEmpty(fscanserialid001) + ? fscanserialid001 + : ObjectUtil.isNotEmpty(fpacknumberpl695) + ? fpacknumberpl695 + : ObjectUtil.isNotEmpty(fserialid054) + ? fserialid054 + : null; Map stringMap = new HashMap<>(); try { // 创建 HttpClient @@ -53,6 +68,7 @@ public class MesUtil { ir.put("details", p); items.add(ir); req.put("items", items); + // xml报文 String requestXml = parseXmlStr(JSON.toJSONString(req)); // 设置请求体 StringEntity entity = new StringEntity(requestXml, "UTF-8"); @@ -88,16 +104,21 @@ public class MesUtil { log.error(e.getMessage()); result.put("code", 400); result.put("message", resObj.get("ErrorMessage")); + } finally { + // 不管成不成功,记录数据 + } MDC.remove("log_file_type"); return result; } + /** * 获得要发送的webservice的xml形式的参数 + * * @param method * @return */ - private static String parseXmlStr(String method){ + private static String parseXmlStr(String method) { StringBuffer sb = new StringBuffer(); sb.append(""); sb.append(""); @@ -111,7 +132,7 @@ public class MesUtil { sb.append(""); sb.append(""); sb.append(""); - log.info("parseXmlStr组织参数为-----------------"+sb); + log.info("parseXmlStr组织参数为-----------------" + sb); return sb.toString(); } @@ -133,7 +154,7 @@ public class MesUtil { path = map.get(root.getName().trim()); map.remove(root.getName().trim()); } - for (Iterator i = root.elementIterator(); i.hasNext();) { + for (Iterator i = root.elementIterator(); i.hasNext(); ) { Element element = (Element) i.next(); if (element.isTextOnly()) { if (path.length() > 0) { @@ -142,7 +163,7 @@ public class MesUtil { map.put(element.getName().trim(), element.getTextTrim()); } } else { - map.put(element.getName().trim(), path+ element.getName().trim() + "."); + map.put(element.getName().trim(), path + element.getName().trim() + "."); parseXml2Map(element.asXML(), map); } } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/CpSendMaterialTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/CpSendMaterialTask.java index a1e0bd9..3ca35fb 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/CpSendMaterialTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/sch/tasks/sendMaterial/CpSendMaterialTask.java @@ -48,7 +48,6 @@ public class CpSendMaterialTask extends AbstractAcsTask { String task_id = task.getString("task_id"); JSONObject taskObj = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0); JSONObject feedback = new JSONObject(); - feedback.put("task_code", taskObj.getString("task_code")); //任务取消 if (StrUtil.equals(status, "0")) { // 取消删除任务 @@ -56,7 +55,7 @@ public class CpSendMaterialTask extends AbstractAcsTask { throw new BadRequestException("已完成不能取消!"); } String point_code2 = taskObj.getString("point_code2"); - if (ObjectUtil.isEmpty(point_code2)) { + if (ObjectUtil.isNotEmpty(point_code2)) { JSONObject endPoint = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0); endPoint.put("lock_type", "1"); pointTab.update(endPoint); @@ -220,9 +219,9 @@ public class CpSendMaterialTask extends AbstractAcsTask { if (ObjectUtil.isNotEmpty(djwPoint)) { point_code1 = djwPoint.getString("point_code"); } - //判断当前点是否有未完成的任务 - 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 + "存在未完成的任务"); + //todo: 判断当前点是否有未完成的任务 +// 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 + "存在未完成的任务"); JSONObject materialObj = materialTab.query("material_code = '" + material_code + "' AND is_used = '1'").uniqueResult(0); 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 b4d14ae6ed9c699983cc0b5a6316a48373ac4dbc..90196ef57360c1f3a9c9af37839ad75f48558547 100644 GIT binary patch delta 9312 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 delta 7852 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 SMra`H>9>NB7`{%}MgA99?UyG2