MesServiceImpl.java 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. package com.warewms.hailiang.MES.impl;
  2. import cn.hutool.extra.spring.SpringUtil;
  3. import cn.hutool.http.HttpRequest;
  4. import cn.hutool.http.HttpResponse;
  5. import cn.hutool.http.HttpUtil;
  6. import cn.hutool.json.JSONArray;
  7. import cn.hutool.json.JSONObject;
  8. import cn.hutool.json.JSONUtil;
  9. import com.github.rholder.retry.*;
  10. import com.github.xingshuangs.iot.protocol.s7.service.S7PLC;
  11. import com.warewms.common.annotation.Log;
  12. import com.warewms.common.exception.ServiceException;
  13. import com.warewms.hailiang.MES.MesService;
  14. import com.warewms.hailiang.config.DeviceMessageSocket;
  15. import com.warewms.hailiang.domain.Device;
  16. import com.warewms.hailiang.domain.DeviceLog;
  17. import com.warewms.hailiang.domain.RetroactiveNow;
  18. import com.warewms.hailiang.enums.DaSanPanPlcEnum;
  19. import com.warewms.hailiang.enums.DeviceNameEnum;
  20. import com.warewms.hailiang.init.PlcConnectServiceRunner;
  21. import io.swagger.util.Json;
  22. import lombok.extern.slf4j.Slf4j;
  23. import org.jetbrains.annotations.Nullable;
  24. import org.springframework.beans.factory.annotation.Autowired;
  25. import org.springframework.beans.factory.annotation.Value;
  26. import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
  27. import org.springframework.stereotype.Service;
  28. import java.util.concurrent.ExecutionException;
  29. import java.util.concurrent.TimeUnit;
  30. /**
  31. * Created with IntelliJ IDEA.
  32. *
  33. * @author: liuzhifei
  34. * Date: 2023/8/9
  35. * Time: 11:20
  36. * To change this template use File | Settings | File Templates.
  37. * Description: MES对接实现类
  38. **/
  39. @Service
  40. @Slf4j
  41. public class MesServiceImpl implements MesService {
  42. @Value("${MES.address}")
  43. private String MESAddress;
  44. @Value("${MES.getBatchNoUrl}")
  45. private String getBatchNoUrl;
  46. @Value("${MES.getBatchNoResultUrl}")
  47. private String getBatchNoResultURl;
  48. @Value("${MES.processFeedbackUrl}")
  49. private String processFeedbackUrl;
  50. @Value("${MES.sanPanGetBatchNoUrl}")
  51. private String sanPanGetBatchNoUrl;
  52. @Value("${MES.tuiHuoShangLiaoUrl}")
  53. private String tuiHuoShangLiaoUrl;
  54. @Autowired
  55. private DeviceMessageSocket deviceMessageSocket;
  56. @Autowired
  57. private ThreadPoolTaskExecutor threadPoolTaskExecutor;
  58. @Autowired
  59. private PlcConnectServiceRunner plcConnectServiceRunner;
  60. @Override
  61. public String getBatchNoByWeight(Double weight, String prodLine) {
  62. JSONObject entries = new JSONObject();
  63. entries.set("Weight", weight);
  64. entries.set("prodLine", prodLine);
  65. log.info("调用MES系统拿铜管批次号,body:{}", entries);
  66. String body = null;
  67. try {
  68. body = HttpRequest.post(MESAddress + getBatchNoUrl).body(entries.toString()).execute().body();
  69. } catch (Exception e) {
  70. log.error("调用MES系统拿铜管批次号失败,msg:{}", e.getMessage());
  71. return invokeAlarms("称重辊道PLC", "获取MES铜管批次号失败!"+e.getMessage());
  72. }
  73. JSONObject jsonObject = JSONUtil.parseObj(body);
  74. if ("false".equals(jsonObject.get("ret").toString())) {
  75. log.error("调用MES系统拿铜管批次号失败,msg:{}", jsonObject.get("message"));
  76. return invokeAlarms("称重辊道PLC", "获取MES铜管批次号失败!"+jsonObject.get("message"));
  77. }
  78. return JSONUtil.parseObj(body).get("BatchNo").toString();
  79. }
  80. @Nullable
  81. private String invokeAlarms(String deviceName, String content) {
  82. DeviceLog deviceLog = new DeviceLog("", deviceName, content, "2");
  83. JSONObject jsonObject = new JSONObject();
  84. jsonObject.set("type", "notify");
  85. jsonObject.set("content", JSONUtil.parse(deviceLog));
  86. deviceMessageSocket.sendAllMessage(jsonObject.toString());
  87. return null;
  88. }
  89. @Override
  90. public JSONObject getBatchNoResult(String batchNo, int result) {
  91. JSONObject entries = new JSONObject();
  92. entries.set("BatchNo", batchNo);
  93. entries.set("type", result);
  94. String body = HttpRequest.post(MESAddress + getBatchNoResultURl).body(entries.toString()).execute().body();
  95. JSONObject jsonObject = JSONUtil.parseObj(body);
  96. if ("false".equals(jsonObject.get("ret").toString())) {
  97. retryTofeedback(MESAddress + processFeedbackUrl, entries, "BatchNoResult");
  98. return null;
  99. }
  100. return jsonObject;
  101. }
  102. @Override
  103. public JSONObject processFeedback(String batchNo, String type) {
  104. JSONObject entries = new JSONObject();
  105. entries.set("BatchNo", batchNo);
  106. entries.set("Type", type);
  107. entries.set("LineNo", "Z1");
  108. String body = HttpRequest.post(MESAddress + processFeedbackUrl).body(entries.toString()).execute().body();
  109. JSONObject jsonObject = JSONUtil.parseObj(body);
  110. if ("false".equals(jsonObject.get("ret"))) {
  111. retryTofeedback(MESAddress + processFeedbackUrl, entries, "process");
  112. return null;
  113. }
  114. return jsonObject;
  115. }
  116. @Override
  117. public String bindLotNo(String deviceId,String lotNot) {
  118. JSONObject entries = null;
  119. String body = null;
  120. try {
  121. log.info("散盘产出设备:{}",deviceId);
  122. entries = new JSONObject();
  123. entries.set("StockNo", lotNot);
  124. entries.set("UnitNo",deviceId );
  125. entries.set("LineNo", "Z1");
  126. body = HttpRequest.post( MESAddress+ sanPanGetBatchNoUrl).body(entries.toString()).execute().body();
  127. JSONObject jsonObject = JSONUtil.parseObj(body);
  128. if ("0".equals(jsonObject.get("RES_FLAG").toString())) {
  129. retryTofeedback(MESAddress + sanPanGetBatchNoUrl, entries, "sanpan");
  130. }
  131. return JSONUtil.parseObj(jsonObject.get("Result")).get("mat_no").toString();
  132. }catch (Exception e){
  133. log.error("大散盘绑定批次号发生错误,json:{},body:{},msg",entries,body,e);
  134. return null;
  135. }
  136. }
  137. @Override
  138. public String tuiHuoShangLiao(RetroactiveNow retroactiveNow) {
  139. JSONObject entries = new JSONObject();
  140. JSONArray matDatas = new JSONArray();
  141. entries.set("matDatas",matDatas);
  142. entries.set("unit_code",retroactiveNow.getUniuCode());
  143. JSONObject matDate = new JSONObject();
  144. matDate.set("mat_no",retroactiveNow.getBatchNo());
  145. matDate.set("stand_no",retroactiveNow.getShelfNumber());
  146. matDate.set("stand_position",retroactiveNow.getNumberOfLayers());
  147. matDate.set("loaction",retroactiveNow.getLotAddress());
  148. matDate.set("layerno",retroactiveNow.getLayerno());
  149. String body = HttpRequest.post( MESAddress+ tuiHuoShangLiaoUrl).body(entries.toString()).execute().body();
  150. JSONObject jsonObject = JSONUtil.parseObj(body);
  151. if ("0".equals(jsonObject.get("res_flag").toString())) {
  152. retryTofeedback(MESAddress + tuiHuoShangLiaoUrl, entries, "tuiHuoUP");
  153. }
  154. return null;
  155. }
  156. /**
  157. * MES反馈重试
  158. * @param URl
  159. * @param body
  160. * @param type
  161. */
  162. private void retryTofeedback(String URl, JSONObject body, String type) {
  163. threadPoolTaskExecutor.execute(() -> {
  164. Retryer<Boolean> retryer = RetryerBuilder.<Boolean>newBuilder()
  165. .retryIfResult(Boolean.FALSE::equals)
  166. .retryIfExceptionOfType(Exception.class)
  167. .withStopStrategy(StopStrategies.stopAfterAttempt(3))
  168. .withWaitStrategy(WaitStrategies.fixedWait(5, TimeUnit.SECONDS))
  169. .build();
  170. try {
  171. retryer.call(() -> {
  172. log.info("MES对接进行重试,url:{},body{}", URl, body);
  173. String data = HttpRequest.post(URl).body(body.toString()).execute().body();
  174. JSONObject jsonObject = JSONUtil.parseObj(data);
  175. if ("process".equals(type)) {
  176. if ("false".equals(jsonObject.get("ret").toString())) {
  177. log.error("工序读码成功反馈失败,msg:{}", jsonObject.get("message"));
  178. invokeAlarms("1".equals(type) ? "铣面工序" : "轧制工序", "工序读码成功反馈MES失败!"+ jsonObject.get("message"));
  179. return false;
  180. }
  181. }
  182. if ("BatchNoResult".equals(type)){
  183. if ("false".equals(jsonObject.get("ret").toString())) {
  184. log.error("喷码成功反馈MES失败,msg:{}", jsonObject.get("message"));
  185. invokeAlarms("喷码器", "喷码成功反馈MES失败!"+ jsonObject.get("message"));
  186. return false;
  187. }
  188. }
  189. if ("sanpan".equals(type)){
  190. if ("0".equals(jsonObject.get("RES_FLAG").toString())) {
  191. log.error("散盘托盘号反馈MES失败,msg:{}", jsonObject.get("message"));
  192. invokeAlarms("大散盘", "获取批次号失败!"+ jsonObject.get("message"));
  193. return false;
  194. }
  195. }
  196. if ("tuiHuoUP".equals(type)) {
  197. if ("0".equals(jsonObject.get("res_flag").toString())) {
  198. log.error("退火上料料架信息反馈失败,msg:{}", jsonObject.get("message"));
  199. invokeAlarms("退货上料工序", "工序读码成功反馈MES失败!"+ jsonObject.get("message"));
  200. return false;
  201. }
  202. }
  203. return true;
  204. });
  205. } catch (RetryException | ExecutionException e) {
  206. e.printStackTrace();
  207. }
  208. });
  209. }
  210. }