MesServiceImpl.java 8.1 KB

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