package com.vincent.rsf.openApi.service.phyz.impl; import com.alibaba.fastjson.JSONObject; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.cfg.CoercionAction; import com.fasterxml.jackson.databind.cfg.CoercionInputShape; import com.vincent.rsf.framework.exception.CoolException; import com.vincent.rsf.openApi.config.PlatformProperties; import com.vincent.rsf.openApi.entity.constant.PhyzMesConstant; import com.vincent.rsf.openApi.entity.dto.CommonResponse; import com.vincent.rsf.openApi.entity.phyz.*; import com.vincent.rsf.openApi.service.phyz.MesReportService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.web.client.RestTemplate; import javax.annotation.PostConstruct; import javax.annotation.Resource; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.springframework.http.client.ClientHttpResponse; import java.util.Objects; @Service @Slf4j public class MesReportServiceImpl implements MesReportService { private static String MES_REPORT_URL; @Resource private PlatformProperties.MesApi mesApi; @Resource private RestTemplate restTemplate; @PostConstruct public void init() { MES_REPORT_URL = mesApi.getMesUrl(); } /** * 获取token * * @return token字符串 */ private String getToken() { String mesUrl = MES_REPORT_URL + PhyzMesConstant.TOKEN; try { HttpHeaders headers = new HttpHeaders(); headers.add("Content-Type", "application/x-www-form-urlencoded"); // 准备表单数据 MultiValueMap map = new LinkedMultiValueMap<>(); map.add("grant_type", "password"); map.add("username", PhyzMesConstant.TOKEN_USER); map.add("password", PhyzMesConstant.TOKEN_PASSWORD); map.add("client_id", "global"); map.add("client_secret", "cs"); HttpEntity httpEntity = new HttpEntity<>(map, headers); ResponseEntity exchange = restTemplate.exchange(mesUrl, HttpMethod.POST, httpEntity, String.class); if (Objects.isNull(exchange.getBody())) { throw new CoolException("请求失败!!"); } try { ObjectMapper objectMapper = new ObjectMapper(); objectMapper.coercionConfigDefaults().setCoercion(CoercionInputShape.EmptyString, CoercionAction.AsEmpty); JSONObject jsonObject = objectMapper.readValue(exchange.getBody(), JSONObject.class); return jsonObject.getString("access_token"); } catch (JsonProcessingException e) { log.error("Mes解析响应失败", e); throw new CoolException("Mes解析响应失败:" + e.getMessage()); } } catch (Exception e) { log.error("Mes解析token响应失败", e); return StringUtils.EMPTY; } } /** * 托盘信息同步 * * @param params 托盘信息参数 * @return 响应结果 */ public CommonResponse syncPalletInfo(Object params) { if (Objects.isNull(params)) { throw new CoolException("托盘信息参数不能为空!!"); } // TODO: 参数转换 List pallets = new ArrayList<>(); // 将传入的 params 转换为 Pallet 对象列表 if (params instanceof List) { for (Object obj : (List) params) { if (obj instanceof Map) { Map map = (Map) obj; Pallet pallet = new Pallet(); pallet.setBarCode((String) map.get("BarCode")); pallet.setPalletCode((String) map.get("PalletCode")); pallet.setPalletName((String) map.get("PalletName")); pallet.setPalletTypeCode((String) map.get("PalletTypeCode")); pallet.setPalletTypeName((String) map.get("PalletTypeName")); pallet.setCreatedBy((String) map.get("CreatedBy")); pallets.add(pallet); } else if (obj instanceof Pallet) { pallets.add((Pallet) obj); } } } MesReportList reportList = new MesReportList<>(); reportList.setCommand(new MesReportList.CommandData().setDataList(pallets)); String mesUrl = MES_REPORT_URL + PhyzMesConstant.PALLET_SYN; log.info("Mes托盘信息同步: {}, 请求参数: {}", mesUrl, JSONObject.toJSONString(reportList)); try { JSONObject jsonObject = postRequest(mesUrl, reportList, getToken()); boolean sendSuccess = jsonObject.getBoolean("Succeeded"); if (sendSuccess) { return CommonResponse.ok(); } else { // TODO:失败后记录重发 return CommonResponse.error(jsonObject.getJSONObject("Error").getString("ErrorMessage")); } } catch (Exception e) { log.error("Mes解析托盘信息同步响应失败", e); throw new CoolException("Mes解析响应失败:" + e.getMessage()); } } /** * 接驳口信息同步(站点信息同步) * * @param params 站点信息参数 * @return 响应结果 */ public CommonResponse syncStationInfo(Object params) { if (Objects.isNull(params)) { throw new CoolException("站点信息参数不能为空!!"); } // TODO:参数转换 List stations = new ArrayList<>(); if (params instanceof List) { for (Object obj : (List) params) { if (obj instanceof Map) { Map map = (Map) obj; Station station = new Station(); station.setConnPortCode((String) map.get("ConnPortCode")); station.setConnPortName((String) map.get("ConnPortName")); station.setWorkshopCode((String) map.get("WorkshopCode")); station.setWorkshopName((String) map.get("WorkshopName")); station.setProductionLineCode((String) map.get("ProductionLineCode")); station.setProductionLineName((String) map.get("ProductionLineName")); station.setCreatedBy((String) map.get("CreatedBy")); stations.add(station); } else if (obj instanceof Station) { stations.add((Station) obj); } } } MesReportList reportList = new MesReportList<>(); reportList.setCommand(new MesReportList.CommandData().setDataList(stations)); String mesUrl = MES_REPORT_URL + PhyzMesConstant.STATION_SYN; log.info("Mes站点信息同步: {}, 请求参数: {}", mesUrl, JSONObject.toJSONString(reportList)); try { JSONObject jsonObject = postRequest(mesUrl, reportList, getToken()); boolean sendSuccess = jsonObject.getBoolean("Succeeded"); if (sendSuccess) { return CommonResponse.ok(); } else { // TODO:失败后记录重发 return CommonResponse.error(jsonObject.getJSONObject("Error").getString("ErrorMessage")); } } catch (Exception e) { log.error("Mes解析站点信息同步响应失败", e); throw new CoolException("Mes解析响应失败:" + e.getMessage()); } } /** * 托盘任务回调(任务执行上报) * * @param params 任务执行参数 * @return 响应结果 */ public CommonResponse reportTaskExecute(Object params) { if (Objects.isNull(params)) { throw new CoolException("任务执行参数不能为空!!"); } // TODO:参数转换 TaskResult taskResult = new TaskResult(); if (params instanceof TaskResult) { TaskResult task = (TaskResult) params; taskResult.setTaskNo(task.getTaskNo()); taskResult.setStatus(task.getStatus()); } else if (params instanceof Map) { Map map = (Map) params; taskResult.setTaskNo((String) map.get("TaskNo")); taskResult.setStatus((Integer) map.get("Status")); } MesReportOne reportOne = new MesReportOne<>(); reportOne.setCommand(taskResult); String mesUrl = MES_REPORT_URL + PhyzMesConstant.TASK_EXECUTE_REPORT; log.info("Mes任务执行上报: {}, 请求参数: {}", mesUrl, JSONObject.toJSONString(reportOne)); try { JSONObject jsonObject = postRequest(mesUrl, reportOne, getToken()); boolean sendSuccess = jsonObject.getBoolean("Succeeded"); if (sendSuccess) { return CommonResponse.ok(); } else { // TODO:失败后记录重发 return CommonResponse.error(jsonObject.getJSONObject("Error").getString("ErrorMessage")); } } catch (Exception e) { log.error("Mes解析任务执行上报响应失败", e); throw new CoolException("Mes解析响应失败:" + e.getMessage()); } } /** * 通用HTTP POST请求方法 * * @param url 请求URL * @param params 请求参数 * @param token token * @return 响应结果 */ public JSONObject postRequest(String url, Object params, String token) { if (StringUtils.isBlank(url)) { throw new CoolException("请求URL不能为空!!"); } if (Objects.isNull(params)) { throw new CoolException("请求参数不能为空!!"); } log.info("Mes POST请求: {}, 请求参数: {}", url, JSONObject.toJSONString(params)); HttpHeaders headers = new HttpHeaders(); headers.add("Content-Type", "application/json;charset=utf-8"); // headers.add("Authorization", "Bearer " + token); HttpEntity httpEntity = new HttpEntity<>(params, headers); try { // 创建自定义的ResponseErrorHandler来处理非200状态码 RestTemplate customRestTemplate = new RestTemplate(); customRestTemplate.setRequestFactory(restTemplate.getRequestFactory()); // 设置错误处理器,不抛出异常,而是返回响应体 customRestTemplate.setErrorHandler(new org.springframework.web.client.DefaultResponseErrorHandler() { @Override public boolean hasError(ClientHttpResponse response) throws IOException { // 不管状态码如何,都不视为错误 return false; } }); ResponseEntity exchange = customRestTemplate.exchange(url, HttpMethod.POST, httpEntity, String.class); log.info("Mes POST请求响应结果: {}", exchange); if (Objects.isNull(exchange.getBody()) || exchange.getBody().isEmpty()) { throw new CoolException("请求失败!!"); } ObjectMapper objectMapper = new ObjectMapper(); objectMapper.coercionConfigDefaults().setCoercion(CoercionInputShape.EmptyString, CoercionAction.AsEmpty); return objectMapper.readValue(exchange.getBody(), JSONObject.class); } catch (Exception e) { //JsonProcessingException log.error("Mes解析响应失败", e); throw new CoolException("Mes解析响应失败:" + e.getMessage()); } } }