package com.vincent.rsf.openApi.service.phyz.impl; import com.alibaba.fastjson.JSONArray; 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.dto.CommonResponse; import com.vincent.rsf.openApi.entity.phyz.ErpReportParams; import com.vincent.rsf.openApi.service.phyz.ErpReportService; 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.web.client.RestTemplate; import javax.annotation.PostConstruct; import javax.annotation.Resource; import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Arrays; import java.util.Objects; @Slf4j @Service public class ErpReportServiceImpl implements ErpReportService { private static String ERP_REPORT_URL; @Resource private PlatformProperties.ErpApi erpApi; @Resource private RestTemplate restTemplate; @PostConstruct public void init() { ERP_REPORT_URL = erpApi.getErpUrl(); } // 登录参数依次为账套ID、用户名、应用ID、时间戳、签名信息、语言ID public void loginBySign() throws UnsupportedEncodingException, NoSuchAlgorithmException { String url = ERP_REPORT_URL + "/Kingdee.BOS.WebApi.ServicesStub.AuthService.LoginBySign.common.kdsvc"; JSONObject params = new JSONObject(); params.put("parameters", loginParams()); JSONObject result = postRequest(url, params, false); } // 入/出库任务完成上报 public CommonResponse reportInOrOutBound(Object params) { if (Objects.isNull(params)) { throw new CoolException("入/出库任务信息参数不能为空!!"); } // TODO:参数转换 ErpReportParams erpReportParams = new ErpReportParams(); erpReportParams = (ErpReportParams) params; String erpUrl = ERP_REPORT_URL + "/Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.Save.common.kdsvc"; log.info("Erp入/出库任务完成上报: {}, 请求参数: {}", erpUrl, JSONObject.toJSONString(erpReportParams)); try { JSONObject jsonObject = postRequest(erpUrl, erpReportParams, true); boolean sendSuccess = jsonObject.getJSONObject("Result").getJSONObject("ResponseStatus").getBoolean("IsSuccess"); // TODO:转换后返回 if (sendSuccess) { return CommonResponse.ok(); } else { JSONArray errors = jsonObject.getJSONObject("Result").getJSONObject("ResponseStatus").getJSONArray("Errors"); String errorMsg = ""; for (int i = 0; i < errors.size(); i++) { errorMsg += errors.getJSONObject(i).getString("Message") + " "; } return CommonResponse.error(errorMsg); } } catch (Exception e) { log.error("Erp入/出库任务上报响应失败", e); throw new CoolException("Erp解析响应失败:" + e.getMessage()); } } // 其他入/出库主动上报 // 盘点结果上报 private Object[] loginParams() throws UnsupportedEncodingException, NoSuchAlgorithmException { //时间戳 long timestamp = System.currentTimeMillis() / 1000; //数据中心ID String dbId = "69368c1051a322"; //用户名称 String userName = "楼坚伟"; //第三方系统应用Id String appId = "330678_w2eBwdkp0oCW2XxuW16D4w/NRhTaTPKp"; //第三方系统应用秘钥 String appSecret = "31c9e5da6472456193e0c8a7dd2160d9"; //将账套ID、用户名、应用ID、应用秘钥、时间戳 放到数组里面 String[] arr = new String[] { dbId, userName, appId, appSecret, String.valueOf(timestamp) }; //生成签名信息 String sign = getSha256(arr); return new Object[] { dbId, userName, appId, String.valueOf(timestamp), sign, 2052}; } public static String getSha256(String[] input) throws UnsupportedEncodingException, NoSuchAlgorithmException, NoSuchAlgorithmException { Arrays.sort(input); //SHA1加密的话改成MessageDigest.getInstance("SHA-1"); MessageDigest sha256 = MessageDigest.getInstance("SHA-256"); for (String str : input) { sha256.update(str.getBytes("UTF-8")); } byte[] hashBytes = sha256.digest(); StringBuilder hashString = new StringBuilder(); for (byte b : hashBytes) { String hex = Integer.toHexString(0xff & b); if (hex.length() == 1) { hashString.append('0'); } hashString.append(hex); } return hashString.toString(); } /** * 通用HTTP POST请求方法 * * @param url 请求URL * @param params 请求参数 * @param needToken 是否需要token认证 * @return 响应结果 */ public JSONObject postRequest(String url, Object params, boolean needToken) { if (StringUtils.isBlank(url)) { throw new CoolException("请求URL不能为空!!"); } if (Objects.isNull(params)) { throw new CoolException("请求参数不能为空!!"); } log.info("Erp POST请求: {}, 请求参数: {}", url, JSONObject.toJSONString(params)); HttpHeaders headers = new HttpHeaders(); headers.add("Content-Type", "application/json;charset=utf-8"); if (needToken) { // String token = getToken(); // headers.add("Authorization", "Bearer " + token); } HttpEntity httpEntity = new HttpEntity<>(params, headers); ResponseEntity exchange = restTemplate.exchange(url, HttpMethod.POST, httpEntity, String.class); log.info("Erp POST请求响应结果: {}", exchange); if (Objects.isNull(exchange.getBody())) { throw new CoolException("请求失败!!"); } try { ObjectMapper objectMapper = new ObjectMapper(); objectMapper.coercionConfigDefaults().setCoercion(CoercionInputShape.EmptyString, CoercionAction.AsEmpty); return objectMapper.readValue(exchange.getBody(), JSONObject.class); } catch (JsonProcessingException e) { log.error("Erp解析响应失败", e); throw new CoolException("Erp解析响应失败:" + e.getMessage()); } } }