电力电器流程生产订单与MES对接接口-张鑫-代码同步
This commit is contained in:
		
							parent
							
								
									585471ac75
								
							
						
					
					
						commit
						3c913ba2a2
					
				|  | @ -0,0 +1,10 @@ | |||
| <?xml version='1.0' encoding='gb2312'?> | ||||
| <module name="mmpac"> | ||||
| 	<public> | ||||
| 	    <!-- 调用mes新增删除接口 --> | ||||
| 	    <component priority="0" singleton="true"  remote="false" tx="NONE"  supportAlias="true"> | ||||
| 	      <interface>nccloud.api.mmpac.service.MesDataService</interface> | ||||
| 	      <implementation>nc.bs.mmpac.pmo.pac0002.Impl.MesDataServiceImpl</implementation> | ||||
| 	    </component> | ||||
| 	</public> | ||||
| </module> | ||||
|  | @ -0,0 +1,93 @@ | |||
| package nc.bs.mmpac.pmo.pac0002.Impl; | ||||
| 
 | ||||
| import com.alibaba.fastjson.JSONObject; | ||||
| import nc.bd.itf.util.MesApiSignatureUtil; | ||||
| import nc.bs.dao.BaseDAO; | ||||
| import nc.bs.dao.DAOException; | ||||
| import nc.vo.mmpac.pmo.pac0002.entity.PMOAggVO; | ||||
| import nc.vo.mmpac.pmo.pac0002.entity.PMOItemVO; | ||||
| import nc.vo.pub.BusinessException; | ||||
| import nc.vo.pub.VOStatus; | ||||
| import nccloud.api.mmpac.service.MesDataService; | ||||
| import org.apache.commons.httpclient.HttpStatus; | ||||
| import java.io.IOException; | ||||
| import java.net.URI; | ||||
| import java.net.URLEncoder; | ||||
| import java.net.http.HttpClient; | ||||
| import java.net.http.HttpRequest; | ||||
| import java.net.http.HttpResponse; | ||||
| import java.nio.charset.StandardCharsets; | ||||
| import java.time.Duration; | ||||
| import java.util.*; | ||||
| 
 | ||||
| /** | ||||
|  * MES新增接口数据组装服务实现类 | ||||
|  */ | ||||
| public class MesDataServiceImpl implements MesDataService { | ||||
|     public static final String mes = "http://172.18.6.3:8282/SD_TKDLDQ_SD_TKDLDQ/Api/Public/Pushsoft.Data/Import"; | ||||
|     // 单例HttpClient,避免重复创建 | ||||
|     private static final HttpClient httpClient = HttpClient.newBuilder() | ||||
|             .connectTimeout(Duration.ofSeconds(10)) | ||||
|             .build(); | ||||
|     private static final int TIMEOUT = 60000; // 超时时间设置为60秒 | ||||
| 
 | ||||
|     @Override | ||||
|     public Map<String, String> assembleAndSaveProductionOrder(PMOAggVO[] pmoAggVOS, String UNIQUE_ID, List<String> jsonObjects) { | ||||
|         Map<String, String> map = new HashMap<>(); | ||||
|         try { | ||||
|             for (String jsonObject : jsonObjects) { | ||||
|                 JSONObject jsonObject2 = new JSONObject(); | ||||
|                 jsonObject2.put("data", jsonObject); | ||||
|                 jsonObject2.put("uniqueId", UNIQUE_ID); | ||||
|                 String header = MesApiSignatureUtil.buldeRequestHeader(jsonObject2); | ||||
|                 String body = this.doPost(jsonObject, header, UNIQUE_ID); | ||||
|                 JSONObject jsonObject1 = JSONObject.parseObject(body); | ||||
|                 String mesDocEntry = jsonObject1.getJSONObject("Data").getJSONObject("Key").getString("DocEntry"); | ||||
|                 if (UNIQUE_ID.equals("ff3f024bc1")){ | ||||
|                     map.put(JSONObject.parseObject(jsonObject).get("Z_cmoid").toString(), mesDocEntry); | ||||
|                 } | ||||
|                 if (UNIQUE_ID.equals("ff3f024d12")){ | ||||
| //                    map.put("10070","10070"); | ||||
| 
 | ||||
| 
 | ||||
|                     map.put(mesDocEntry, mesDocEntry); | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|         } catch (Exception e) { | ||||
|             throw new RuntimeException(e); | ||||
|         } | ||||
|         return map; | ||||
|     } | ||||
| 
 | ||||
|     private String doPost(String jsonData, String header, String uniqueId)  { | ||||
|         // 构造表单数据 | ||||
|         try { | ||||
|             // 关键修复:手动对表单参数进行URLEncoder编码,确保与签名原始数据的对应关系 | ||||
|             String encodedData = URLEncoder.encode(jsonData, StandardCharsets.UTF_8.name()); | ||||
|             String encodedUniqueId = URLEncoder.encode(uniqueId, StandardCharsets.UTF_8.name()); | ||||
| 
 | ||||
|             // 构建正确的表单请求体(application/x-www-form-urlencoded格式) | ||||
|             String formBody = "data=" + encodedData + "&uniqueId=" + encodedUniqueId; | ||||
|             // 构造请求 | ||||
|             HttpRequest request = HttpRequest.newBuilder().uri(URI.create(mes)) | ||||
|                     .header("Content-Type", "application/x-www-form-urlencoded;charset=utf-8") | ||||
|                     .header("Accept", "application/json").header("X-PushApi-User", "ERP") | ||||
|                     .header("X-PushApi-Digest", header).POST(HttpRequest.BodyPublishers.ofString(formBody.toString())) | ||||
|                     .build(); | ||||
| 
 | ||||
|             // 执行请求 | ||||
|             HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString()); | ||||
|             if (response.statusCode() != HttpStatus.SC_OK){ | ||||
|                 throw new RuntimeException(response.body()); | ||||
|             } | ||||
|             return response.body(); | ||||
|         } catch (IOException | InterruptedException e) { | ||||
|             // TODO Auto-generated catch block | ||||
|             e.printStackTrace(); | ||||
|         } | ||||
|         return null; | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
| } | ||||
|  | @ -0,0 +1,81 @@ | |||
| package nc.bs.mmpac.pmo.pac0002.bp.rule; | ||||
| 
 | ||||
| import com.alibaba.fastjson.JSONObject; | ||||
| import nc.bs.framework.common.NCLocator; | ||||
| import nc.impl.pubapp.pattern.rule.IRule; | ||||
| import nc.pubitf.bd.accessor.GeneralAccessorFactory; | ||||
| import nc.pubitf.bd.accessor.IGeneralAccessor; | ||||
| import nc.vo.bd.accessor.IBDData; | ||||
| import nc.vo.mmpac.pmo.pac0002.entity.PMOAggVO; | ||||
| import nc.vo.mmpac.pmo.pac0002.entity.PMOItemVO; | ||||
| import nc.vo.pub.BusinessException; | ||||
| import nccloud.api.mmpac.service.MesDataService; | ||||
| 
 | ||||
| import java.math.BigDecimal; | ||||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
| import java.util.Map; | ||||
| 
 | ||||
| /** | ||||
|  * 修改的时候调用mes的修改接口 | ||||
|  */ | ||||
| public class UpdateAfterToMesRule implements IRule<PMOAggVO> { | ||||
|     @Override | ||||
|     public void process(PMOAggVO[] pmoAggVOS) { | ||||
|         MesDataService lookup = NCLocator.getInstance().lookup(MesDataService.class); | ||||
|         String UNIQUE_ID = "ff3f024d18"; | ||||
|         List<String> jsonObjects = null; | ||||
|         try { | ||||
|             jsonObjects = this.buildParams(pmoAggVOS); | ||||
|         } catch (BusinessException e) { | ||||
|             throw new RuntimeException(e); | ||||
|         } | ||||
|         if (jsonObjects.size()>0){ | ||||
|             Map<String, String> map = lookup.assembleAndSaveProductionOrder(pmoAggVOS, UNIQUE_ID, jsonObjects); | ||||
|         } | ||||
| 
 | ||||
|     } | ||||
|     /** | ||||
|      * 组装参数 | ||||
|      */ | ||||
|     private List<String> buildParams(PMOAggVO[] pmoAggVOS) throws BusinessException { | ||||
| 
 | ||||
|         IGeneralAccessor accessor = GeneralAccessorFactory.getAccessor("2ee58f9b-781b-469f-b1d8-1816842515c3"); | ||||
| 
 | ||||
|         List<String> maps = new ArrayList<>(); | ||||
|         for (PMOAggVO pmoAggVO : pmoAggVOS) { | ||||
|             PMOItemVO[] childrenVO = pmoAggVO.getChildrenVO(); | ||||
|             for (PMOItemVO childrenVO1 : childrenVO) { | ||||
|                 boolean b = this.checkOrg(pmoAggVO); | ||||
|                 if (!b)continue; | ||||
|                 if (childrenVO1.getVdef41() == null||childrenVO1.getVdef41().equals("")||childrenVO1.getVdef40().equals("")||childrenVO1.getVdef40()==null) continue; | ||||
|                 JSONObject params = new JSONObject(); | ||||
|                 //增加表体备注 | ||||
|                 BigDecimal qty = childrenVO1.getNplanputnum() != null ? | ||||
|                         childrenVO1.getNplanputnum().toBigDecimal() : BigDecimal.ZERO; | ||||
|                 params.put("DocEntry", childrenVO1.getVdef41()); | ||||
|                 params.put("Qty", qty); | ||||
|                 params.put("Remarks",childrenVO1.getVnote()==null?"":childrenVO1.getVnote());//备注 | ||||
|                 params.put("SchedStart", childrenVO1.getTplanstarttime()==null?"":childrenVO1.getTplanstarttime().toString()); | ||||
|                 params.put("SchedEnd", childrenVO1.getTplanendtime()==null?"":childrenVO1.getTplanendtime().toString()); | ||||
|                 IBDData docByPk = accessor.getDocByPk(childrenVO1.getCprojectid()); | ||||
|                 params.put("ProjectID", docByPk==null?"":docByPk.getCode()); | ||||
|                 maps.add( params.toJSONString()); | ||||
|             } | ||||
|         } | ||||
|         return maps; | ||||
|     } | ||||
|     /** | ||||
|      * 校验组织是否是C023 | ||||
|      */ | ||||
|     private boolean checkOrg(PMOAggVO pmoAggVO) { | ||||
|         IGeneralAccessor accessorOrg = GeneralAccessorFactory.getAccessor("985be8a4-3a36-4778-8afe-2d8ed3902659"); | ||||
|         String pkOrg = pmoAggVO.getParentVO().getPk_org(); | ||||
|         IBDData docByPk = accessorOrg.getDocByPk(pkOrg); | ||||
|         if (docByPk.getCode().equals("C023")) { | ||||
|             return true; | ||||
|         } | ||||
| 
 | ||||
|         return false; | ||||
|     } | ||||
| } | ||||
|  | @ -0,0 +1,239 @@ | |||
| package nc.bd.itf.util; | ||||
| 
 | ||||
| import com.alibaba.fastjson.JSONObject; | ||||
| 
 | ||||
| import java.nio.charset.StandardCharsets; | ||||
| import java.security.MessageDigest; | ||||
| import java.security.NoSuchAlgorithmException; | ||||
| import java.util.ArrayList; | ||||
| import java.util.Comparator; | ||||
| import java.util.List; | ||||
| import java.util.Map; | ||||
| import java.util.stream.Collectors; | ||||
| 
 | ||||
| /** | ||||
|  * MES系统API签名工具类 | ||||
|  * 用于生成符合MES系统要求的请求摘要 | ||||
|  */ | ||||
| public class MesApiSignatureUtil { | ||||
|     private static final String Url = "http://192.168.110.62:8282/AIO8/Api//Public/"; | ||||
|     private static final String AppID = "ERP"; | ||||
|     private static final String AppVersion = "v250930"; | ||||
|     private static final String AppSecret = "2e13b8dc412b42968abbe105360155af"; | ||||
|     private static final String UserID = "ERP"; | ||||
|     /** | ||||
|      * API请求参数键值对 | ||||
|      */ | ||||
|     public static class ApiKeyValue { | ||||
|         private String key; | ||||
|         private String value; | ||||
| 
 | ||||
|         public ApiKeyValue(String key, String value) { | ||||
|             this.key = key; | ||||
|             this.value = value; | ||||
|         } | ||||
| 
 | ||||
|         public String getKey() { | ||||
|             return key; | ||||
|         } | ||||
| 
 | ||||
|         public void setKey(String key) { | ||||
|             this.key = key; | ||||
|         } | ||||
| 
 | ||||
|         public String getValue() { | ||||
|             return value; | ||||
|         } | ||||
| 
 | ||||
|         public void setValue(String value) { | ||||
|             this.value = value; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 计算当前时间戳(秒级) | ||||
|      * @return 时间戳 | ||||
|      */ | ||||
|     public static long getCurrentTimestamp() { | ||||
|         return System.currentTimeMillis() / 1000; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 对请求参数进行排序 | ||||
|      * @param params 参数列表 | ||||
|      * @return 排序后的参数列表 | ||||
|      */ | ||||
|     public static List<ApiKeyValue> sortParams(List<ApiKeyValue> params) { | ||||
|         if (params == null || params.isEmpty()) { | ||||
|             return new ArrayList<>(); | ||||
|         } | ||||
| 
 | ||||
|         // 按参数名称进行升序排序 | ||||
|         return params.stream() | ||||
|                 .sorted(Comparator.comparing(ApiKeyValue::getKey)) | ||||
|                 .collect(Collectors.toList()); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 合并参数为字符串 | ||||
|      * @param sortedParams 排序后的参数列表 | ||||
|      * @return 合并后的参数字符串 | ||||
|      */ | ||||
|     public static String mergeParams(List<ApiKeyValue> sortedParams) { | ||||
|         if (sortedParams == null || sortedParams.isEmpty()) { | ||||
|             return ""; | ||||
|         } | ||||
| 
 | ||||
|         StringBuilder paramString = new StringBuilder(); | ||||
|         for (ApiKeyValue kv : sortedParams) { | ||||
|             paramString.append(kv.getKey()).append(kv.getValue()); | ||||
|         } | ||||
|         return paramString.toString(); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 计算摘要 | ||||
|      * @param paramString 合并后的参数字符串 | ||||
|      * @param timeStamp 时间戳 | ||||
|      * @return 计算后的的摘要 | ||||
|      */ | ||||
|     public static String calcDigestDigest(String paramString, long timeStamp) { | ||||
|         try { | ||||
|             // 参数字符串 + 时间戳 + 密钥 | ||||
|             String content = paramString + timeStamp + AppSecret; | ||||
| 
 | ||||
|             // 创建MD5消息摘要 | ||||
|             MessageDigest md5 = MessageDigest.getInstance("MD5"); | ||||
| 
 | ||||
|             // 计算摘要 | ||||
|             byte[] digestBytes = md5.digest(content.getBytes(StandardCharsets.UTF_8)); | ||||
| 
 | ||||
|             // 转为十六进制字符串 | ||||
|             StringBuilder result = new StringBuilder(); | ||||
|             for (byte b : digestBytes) { | ||||
|                 result.append(String.format("%02x", b)); | ||||
|             } | ||||
| 
 | ||||
|             return result.toString(); | ||||
|         } catch (NoSuchAlgorithmException e) { | ||||
|             throw new RuntimeException("MD5算法不可用", e); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 生成完整的摘要请求头 | ||||
|      * @param timeStamp 时间戳 | ||||
|      * @param digest 摘要 | ||||
|      * @return 请求头内容 | ||||
|      */ | ||||
|     public static String generateDigestHeader(long timeStamp, String digest) { | ||||
|         return String.format("AppID=%s, AppVersion=%s, Timestamp=%d, Digest=%s", | ||||
|                 AppID, AppVersion, timeStamp, digest); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 生成完整的摘要请求头(自动计算时间戳) | ||||
|      * @param params 请求参数 | ||||
|      * @param secret 密钥 | ||||
|      * @return 请求头内容 | ||||
|      */ | ||||
|     public static String generateDigestHeader(List<ApiKeyValue> params, String secret) { | ||||
|         // 计算时间戳 | ||||
|         long timeStamp = getCurrentTimestamp(); | ||||
| 
 | ||||
|         // 排序参数 | ||||
|         List<ApiKeyValue> sortedParams = sortParams(params); | ||||
| 
 | ||||
|         // 合并参数 | ||||
|         String paramString = mergeParams(sortedParams); | ||||
| 
 | ||||
|         // 计算摘要 | ||||
|         String digest = calcDigestDigest(paramString, timeStamp); | ||||
| 
 | ||||
|         // 生成请求头 | ||||
|         return generateDigestHeader(timeStamp, digest); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 生成完整的摘要请求头(自动计算时间戳) | ||||
|      * @param paramMap 请求参数Map | ||||
|      * @param secret 密钥 | ||||
|      * @return 请求头内容 | ||||
|      */ | ||||
|     public static String generateDigestHeader(Map<String, String> paramMap, String secret) { | ||||
|         if (paramMap == null || paramMap.isEmpty()) { | ||||
|             return generateDigestHeader(new ArrayList<>(), secret); | ||||
|         } | ||||
| 
 | ||||
|         List<ApiKeyValue> params = paramMap.entrySet().stream() | ||||
|                 .map(entry -> new ApiKeyValue(entry.getKey(), entry.getValue())) | ||||
|                 .collect(Collectors.toList()); | ||||
| 
 | ||||
|         return generateDigestHeader(params, secret); | ||||
|     } | ||||
| 
 | ||||
|     public static String buldeRequestHeader(JSONObject paramsJson) { | ||||
|         // 创建测试参数 | ||||
|         List<ApiKeyValue> params = new ArrayList<>(); | ||||
|         for (String key : paramsJson.keySet()) { | ||||
|             params.add(new ApiKeyValue(key, paramsJson.getString(key))); | ||||
|         } | ||||
|         // 方法1:分步处理 | ||||
|         System.out.println("=== 方法1:分步处理 ==="); | ||||
|         long timeStamp = getCurrentTimestamp(); | ||||
|         System.out.println("时间戳: " + timeStamp); | ||||
| 
 | ||||
|         List<ApiKeyValue> sortedParams = sortParams(params); | ||||
|         System.out.println("排序后参数:"); | ||||
|         sortedParams.forEach(kv -> System.out.println(kv.getKey() + "=" + kv.getValue())); | ||||
| 
 | ||||
|         String paramString = mergeParams(sortedParams); | ||||
|         System.out.println("合并后参数: " + paramString); | ||||
| 
 | ||||
|         String digest = calcDigestDigest(paramString, timeStamp); | ||||
|         System.out.println("计算的摘要: " + digest); | ||||
| 
 | ||||
|         String header = generateDigestHeader(timeStamp, digest); | ||||
|         return header; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 主方法用于测试 | ||||
|      */ | ||||
|     public static void main(String[] args) { | ||||
|         try { | ||||
|             /* 创建测试参数 | ||||
|             List<ApiKeyValue> params = new ArrayList<>(); | ||||
|             params.add(new ApiKeyValue("参数名3", "参数值3")); | ||||
|             params.add(new ApiKeyValue("参数名1", "参数值1")); | ||||
|             params.add(new ApiKeyValue("参数名2", "参数值2")); | ||||
| 
 | ||||
|             // 方法1:分步处理 | ||||
|             System.out.println("=== 方法1:分步处理 ==="); | ||||
|             long timeStamp = getCurrentTimestamp(); | ||||
|             System.out.println("时间戳: " + timeStamp); | ||||
| 
 | ||||
|             List<ApiKeyValue> sortedParams = sortParams(params); | ||||
|             System.out.println("排序后参数:"); | ||||
|             sortedParams.forEach(kv -> System.out.println(kv.getKey() + "=" + kv.getValue())); | ||||
| 
 | ||||
|             String paramString = mergeParams(sortedParams); | ||||
|             System.out.println("合并后参数: " + paramString); | ||||
| 
 | ||||
|             String digest = calcDigestDigest(paramString, timeStamp); | ||||
|             System.out.println("计算的摘要: " + digest); | ||||
| 
 | ||||
|             String header = generateDigestHeader(timeStamp, digest); | ||||
|             System.out.println("请求头: " + header);*/ | ||||
| 
 | ||||
|             JSONObject paramsJson = new JSONObject(); | ||||
|             paramsJson.put("code","0001"); | ||||
|             paramsJson.put("name","张三"); | ||||
|             String header = MesApiSignatureUtil.buldeRequestHeader(paramsJson); | ||||
| 
 | ||||
|             System.out.println("请求头: " + header); | ||||
|         } catch (Exception e) { | ||||
|             e.printStackTrace(); | ||||
|         } | ||||
|     } | ||||
| } | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							|  | @ -0,0 +1,22 @@ | |||
| package nccloud.api.mmpac.service; | ||||
| 
 | ||||
| import java.util.List; | ||||
| import java.util.Map; | ||||
| 
 | ||||
| import com.alibaba.fastjson.JSONObject; | ||||
| import nc.vo.mmpac.pmo.pac0002.entity.PMOAggVO; | ||||
| import nc.vo.pub.BusinessException; | ||||
| 
 | ||||
| /** | ||||
|  * MES新增接口数据组装服务 | ||||
|  */ | ||||
| public interface MesDataService { | ||||
| 
 | ||||
|     /** | ||||
|      * 组装并保存MES生产订单数据 | ||||
|      * @param pmoAggVOS 生产订单数据 | ||||
|      * @return 处理结果 | ||||
|      * @throws BusinessException 业务异常 | ||||
|      */ | ||||
|     Map<String, String> assembleAndSaveProductionOrder(PMOAggVO[] pmoAggVOS,String UNIQUE_ID,List<String> jsonObjects); | ||||
| } | ||||
		Loading…
	
		Reference in New Issue