package com.warewms.hailiang.MES.impl; import cn.hutool.extra.spring.SpringUtil; import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpResponse; import cn.hutool.http.HttpUtil; import cn.hutool.json.JSONArray; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.github.rholder.retry.*; import com.github.xingshuangs.iot.protocol.s7.service.S7PLC; import com.warewms.common.annotation.Log; import com.warewms.common.exception.ServiceException; import com.warewms.hailiang.MES.MesService; import com.warewms.hailiang.config.DeviceMessageSocket; import com.warewms.hailiang.domain.Device; import com.warewms.hailiang.domain.DeviceLog; import com.warewms.hailiang.domain.RetroactiveNow; import com.warewms.hailiang.enums.DaSanPanPlcEnum; import com.warewms.hailiang.enums.DeviceNameEnum; import com.warewms.hailiang.init.PlcConnectServiceRunner; import io.swagger.util.Json; import lombok.extern.slf4j.Slf4j; import org.jetbrains.annotations.Nullable; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.stereotype.Service; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; /** * Created with IntelliJ IDEA. * * @author: liuzhifei * Date: 2023/8/9 * Time: 11:20 * To change this template use File | Settings | File Templates. * Description: MES对接实现类 **/ @Service @Slf4j public class MesServiceImpl implements MesService { @Value("${MES.address}") private String MESAddress; @Value("${MES.getBatchNoUrl}") private String getBatchNoUrl; @Value("${MES.getBatchNoResultUrl}") private String getBatchNoResultURl; @Value("${MES.processFeedbackUrl}") private String processFeedbackUrl; @Value("${MES.sanPanGetBatchNoUrl}") private String sanPanGetBatchNoUrl; @Value("${MES.tuiHuoShangLiaoUrl}") private String tuiHuoShangLiaoUrl; @Autowired private DeviceMessageSocket deviceMessageSocket; @Autowired private ThreadPoolTaskExecutor threadPoolTaskExecutor; @Autowired private PlcConnectServiceRunner plcConnectServiceRunner; @Override public String getBatchNoByWeight(Double weight, String prodLine) { JSONObject entries = new JSONObject(); entries.set("Weight", weight); entries.set("prodLine", prodLine); log.info("调用MES系统拿铜管批次号,body:{}", entries); String body = null; try { body = HttpRequest.post(MESAddress + getBatchNoUrl).body(entries.toString()).execute().body(); } catch (Exception e) { log.error("调用MES系统拿铜管批次号失败,msg:{}", e.getMessage()); return invokeAlarms("称重辊道PLC", "获取MES铜管批次号失败!"+e.getMessage()); } JSONObject jsonObject = JSONUtil.parseObj(body); if ("false".equals(jsonObject.get("ret").toString())) { log.error("调用MES系统拿铜管批次号失败,msg:{}", jsonObject.get("message")); return invokeAlarms("称重辊道PLC", "获取MES铜管批次号失败!"+jsonObject.get("message")); } return JSONUtil.parseObj(body).get("BatchNo").toString(); } @Nullable private String invokeAlarms(String deviceName, String content) { DeviceLog deviceLog = new DeviceLog("", deviceName, content, "2"); JSONObject jsonObject = new JSONObject(); jsonObject.set("type", "notify"); jsonObject.set("content", JSONUtil.parse(deviceLog)); deviceMessageSocket.sendAllMessage(jsonObject.toString()); return null; } @Override public JSONObject getBatchNoResult(String batchNo, int result) { JSONObject entries = new JSONObject(); entries.set("BatchNo", batchNo); entries.set("type", result); String body = HttpRequest.post(MESAddress + getBatchNoResultURl).body(entries.toString()).execute().body(); JSONObject jsonObject = JSONUtil.parseObj(body); if ("false".equals(jsonObject.get("ret").toString())) { retryTofeedback(MESAddress + processFeedbackUrl, entries, "BatchNoResult"); return null; } return jsonObject; } @Override public JSONObject processFeedback(String batchNo, String type) { JSONObject entries = new JSONObject(); entries.set("BatchNo", batchNo); entries.set("Type", type); entries.set("LineNo", "Z1"); String body = HttpRequest.post(MESAddress + processFeedbackUrl).body(entries.toString()).execute().body(); JSONObject jsonObject = JSONUtil.parseObj(body); if ("false".equals(jsonObject.get("ret"))) { retryTofeedback(MESAddress + processFeedbackUrl, entries, "process"); return null; } return jsonObject; } @Override public String bindLotNo(String deviceId,String lotNot) { JSONObject entries = null; String body = null; try { log.info("散盘产出设备:{}",deviceId); entries = new JSONObject(); entries.set("StockNo", lotNot); entries.set("UnitNo",deviceId ); entries.set("LineNo", "Z1"); body = HttpRequest.post( MESAddress+ sanPanGetBatchNoUrl).body(entries.toString()).execute().body(); JSONObject jsonObject = JSONUtil.parseObj(body); if ("0".equals(jsonObject.get("RES_FLAG").toString())) { retryTofeedback(MESAddress + sanPanGetBatchNoUrl, entries, "sanpan"); } return JSONUtil.parseObj(jsonObject.get("Result")).get("mat_no").toString(); }catch (Exception e){ log.error("大散盘绑定批次号发生错误,json:{},body:{},msg",entries,body,e); return null; } } @Override public String tuiHuoShangLiao(RetroactiveNow retroactiveNow) { JSONObject entries = new JSONObject(); JSONArray matDatas = new JSONArray(); entries.set("matDatas",matDatas); entries.set("unit_code",retroactiveNow.getUniuCode()); JSONObject matDate = new JSONObject(); matDate.set("mat_no",retroactiveNow.getBatchNo()); matDate.set("stand_no",retroactiveNow.getShelfNumber()); matDate.set("stand_position",retroactiveNow.getNumberOfLayers()); matDate.set("loaction",retroactiveNow.getLotAddress()); matDate.set("layerno",retroactiveNow.getLayerno()); String body = HttpRequest.post( MESAddress+ tuiHuoShangLiaoUrl).body(entries.toString()).execute().body(); JSONObject jsonObject = JSONUtil.parseObj(body); if ("0".equals(jsonObject.get("res_flag").toString())) { retryTofeedback(MESAddress + tuiHuoShangLiaoUrl, entries, "tuiHuoUP"); } return null; } /** * MES反馈重试 * @param URl * @param body * @param type */ private void retryTofeedback(String URl, JSONObject body, String type) { threadPoolTaskExecutor.execute(() -> { Retryer retryer = RetryerBuilder.newBuilder() .retryIfResult(Boolean.FALSE::equals) .retryIfExceptionOfType(Exception.class) .withStopStrategy(StopStrategies.stopAfterAttempt(3)) .withWaitStrategy(WaitStrategies.fixedWait(5, TimeUnit.SECONDS)) .build(); try { retryer.call(() -> { log.info("MES对接进行重试,url:{},body{}", URl, body); String data = HttpRequest.post(URl).body(body.toString()).execute().body(); JSONObject jsonObject = JSONUtil.parseObj(data); if ("process".equals(type)) { if ("false".equals(jsonObject.get("ret").toString())) { log.error("工序读码成功反馈失败,msg:{}", jsonObject.get("message")); invokeAlarms("1".equals(type) ? "铣面工序" : "轧制工序", "工序读码成功反馈MES失败!"+ jsonObject.get("message")); return false; } } if ("BatchNoResult".equals(type)){ if ("false".equals(jsonObject.get("ret").toString())) { log.error("喷码成功反馈MES失败,msg:{}", jsonObject.get("message")); invokeAlarms("喷码器", "喷码成功反馈MES失败!"+ jsonObject.get("message")); return false; } } if ("sanpan".equals(type)){ if ("0".equals(jsonObject.get("RES_FLAG").toString())) { log.error("散盘托盘号反馈MES失败,msg:{}", jsonObject.get("message")); invokeAlarms("大散盘", "获取批次号失败!"+ jsonObject.get("message")); return false; } } if ("tuiHuoUP".equals(type)) { if ("0".equals(jsonObject.get("res_flag").toString())) { log.error("退火上料料架信息反馈失败,msg:{}", jsonObject.get("message")); invokeAlarms("退货上料工序", "工序读码成功反馈MES失败!"+ jsonObject.get("message")); return false; } } return true; }); } catch (RetryException | ExecutionException e) { e.printStackTrace(); } }); } }