diff --git a/mmpac/src/public/nccloud/web/mmpac/pickm/service/SyncGyMesPickmUtil.java b/mmpac/src/public/nccloud/web/mmpac/pickm/service/SyncGyMesPickmUtil.java index 40a8a2d1..74384f72 100644 --- a/mmpac/src/public/nccloud/web/mmpac/pickm/service/SyncGyMesPickmUtil.java +++ b/mmpac/src/public/nccloud/web/mmpac/pickm/service/SyncGyMesPickmUtil.java @@ -4,7 +4,6 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.serializer.SerializerFeature; -import nc.bs.businessevent.bd.BDCommonEvent; import nc.bs.dao.BaseDAO; import nc.bs.dao.DAOException; import nc.bs.framework.common.NCLocator; @@ -25,13 +24,15 @@ import nc.vo.mmpac.pickm.entity.PickmItemVO; import nc.vo.org.OrgVO; import nc.vo.pmpub.project.ProjectHeadVO; import nc.vo.pub.BusinessException; -import nc.vo.pubapp.pattern.exception.ExceptionUtils; import nc.vo.scmpub.util.ArrayUtil; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import java.util.stream.Stream; /** @@ -40,6 +41,8 @@ import java.util.stream.Stream; public class SyncGyMesPickmUtil { private static final String LOG_INFO_NAME = "gymeslog"; private static final Log logger = Log.getInstance(LOG_INFO_NAME); + // 异步调用线程池 + private static final ExecutorService asyncExecutor = Executors.newFixedThreadPool(1); private Map configParams; public void process(AggPickmVO[] aggPickmVOS) { @@ -51,7 +54,7 @@ public class SyncGyMesPickmUtil { buildSyncData(aggPickmVOS); } catch (Exception e) { logger.error("同步备料计划到高压MES系统失败: " + e.getMessage(), e); - ExceptionUtils.wrappException(e); + // ExceptionUtils.wrappException(e); } } @@ -168,7 +171,9 @@ public class SyncGyMesPickmUtil { list.put("list", jsonArray); } if (!list.isEmpty()) { + // 异步推送数据,不阻塞主线程 pushData(list); + logger.error("gyMes-Pickm-异步任务已提交,主线程继续执行"); } } @@ -185,39 +190,59 @@ public class SyncGyMesPickmUtil { res = defdocVOs[0].getCode().trim(); } } catch (DAOException e) { - logger.error("gyMes-SaleOrder-error,getDefCode[" + e.getMessage() + "]"); + logger.error("gyMes-Pickm-error,getDefCode[" + e.getMessage() + "]"); } return res; } /** - * 推送同步数据 + * 异步推送同步数据 + * 注意:此方法立即返回,不会阻塞调用线程 + * 实际的HTTP请求在独立线程中执行,即使接口响应很慢也不会影响主任务 */ - private void pushData(JSONObject param) throws BusinessException { - // 转json字符串的时候保留null值 - String jsonStr = JSON.toJSONString(param, - SerializerFeature.WriteMapNullValue, - SerializerFeature.WriteNullStringAsEmpty - ); - logger.error("gyMes-Pickm-param = " + jsonStr); - String baseUrl = configParams.get("mesBaseUrl"); - String requestUrl = baseUrl + configParams.get("materialRequirementsUpdate"); - logger.error("gyMes-Pickm-url = " + requestUrl); - String result = ThirdPartyPostRequestUtil.sendPostRequest(requestUrl, jsonStr); - JSONObject resultObj = JSONObject.parseObject(result); - logger.error("gyMes-Pickm-res = " + result); + private void pushData(JSONObject param) { + // 复制配置参数,避免异步任务执行时configParams被修改 + final Map configParamsCopy = new HashMap<>(configParams); - if (!"200".equals(resultObj.getString("code"))) { - logger.error("gyMes-Pickm-error,result[" + resultObj.toJSONString() + "]"); - throw new BusinessException("备料计划推送高压MES错误:" + resultObj.getString("msg")); - } + // 提交异步任务,立即返回,不等待结果 + CompletableFuture.runAsync(() -> { + try { + logger.error("gyMes-Pickm-异步任务开始执行"); + // 转json字符串的时候保留null值 + String jsonStr = JSON.toJSONString(param, + SerializerFeature.WriteMapNullValue, + SerializerFeature.WriteNullStringAsEmpty + ); + logger.error("gyMes-Pickm-param = " + jsonStr); + String baseUrl = configParamsCopy.get("mesBaseUrl"); + String requestUrl = baseUrl + configParamsCopy.get("materialRequirementsUpdate"); + logger.error("gyMes-Pickm-url = " + requestUrl); + + // 这里会阻塞异步线程,但不会阻塞主线程 + String result = ThirdPartyPostRequestUtil.sendPostRequest(requestUrl, jsonStr); + JSONObject resultObj = JSONObject.parseObject(result); + logger.error("gyMes-Pickm-res = " + result); + + if (!"200".equals(resultObj.getString("code"))) { + logger.error("gyMes-Pickm-error,result[" + resultObj.toJSONString() + "]"); + logger.error("备料计划推送高压MES失败:" + resultObj.getString("msg")); + } else { + logger.error("gyMes-Pickm-推送成功"); + } + } catch (Exception e) { + logger.error("异步推送备料计划到高压MES系统失败: " + e.getMessage(), e); + } + }, asyncExecutor); + + // 方法立即返回,主线程继续执行,不会等待接口响应 } - private boolean checkIfOrg(String code, Map configParams) throws BusinessException { + private boolean checkIfOrg(String code, Map configParams) { String targetCode = configParams.get("gyOrg"); if (targetCode == null || nc.vo.am.common.util.StringUtils.isEmpty(targetCode)) { - throw new BusinessException("未配置组织参数"); + logger.error("gyMes-Pickm-未配置组织参数"); + return true; // 未配置时跳过 } String[] orgItem = targetCode.split(","); for (String orgCode : orgItem) { @@ -229,23 +254,28 @@ public class SyncGyMesPickmUtil { } public static Map queryMaterialPlanInfoByPks(String[] pks, String pk_stockorg, - String[] fields) throws BusinessException { + String[] fields) { Map map = null; - List vids = Stream.of(pks).filter(Objects::nonNull).distinct().toList(); - if (vids.isEmpty()) { + try { + List vids = Stream.of(pks).filter(Objects::nonNull).distinct().toList(); + if (vids.isEmpty()) { + map = new HashMap<>(); + } else { + map = NCLocator.getInstance().lookup(IMaterialPubService.class) + .queryMaterialPlanInfoByPks(vids.toArray(new String[0]), pk_stockorg, fields); + } + } catch (Exception e) { + logger.error("gyMes-Pickm-查询物料计划信息失败: " + e.getMessage(), e); map = new HashMap<>(); - } else { - map = NCLocator.getInstance().lookup(IMaterialPubService.class) - .queryMaterialPlanInfoByPks(vids.toArray(new String[0]), pk_stockorg, fields); } - return map; } - private boolean checkBillType(String code, Map configParams) throws BusinessException { + private boolean checkBillType(String code, Map configParams) { String targetCode = configParams.get("vbusitype"); if (targetCode == null || nc.vo.am.common.util.StringUtils.isEmpty(targetCode)) { - throw new BusinessException("未配置单据类型参数"); + logger.error("gyMes-Pickm-未配置单据类型参数"); + return false; // 未配置时不跳过 } String[] types = targetCode.split(","); for (String type : types) { @@ -256,11 +286,16 @@ public class SyncGyMesPickmUtil { return false; } - private Map getStockInfo(String pkMaterial,String pkOrg) throws BusinessException { - String sql = " select def16,bd_stordoc.code as pk_stordoc" + - " from bd_materialstock left join bd_stordoc on bd_stordoc.pk_stordoc = bd_materialstock.pk_stordoc " + - " where pk_material = '" + pkMaterial + "' " + " and bd_materialstock.pk_org = '" + pkOrg + "' "; - Map map = (Map) new BaseDAO().executeQuery(sql, new MapProcessor()); - return map; + private Map getStockInfo(String pkMaterial, String pkOrg) { + try { + String sql = " select def16,bd_stordoc.code as pk_stordoc" + + " from bd_materialstock left join bd_stordoc on bd_stordoc.pk_stordoc = bd_materialstock.pk_stordoc " + + " where pk_material = '" + pkMaterial + "' " + " and bd_materialstock.pk_org = '" + pkOrg + "' "; + Map map = (Map) new BaseDAO().executeQuery(sql, new MapProcessor()); + return map != null ? map : new HashMap(); + } catch (Exception e) { + logger.error("gyMes-Pickm-查询库存信息失败: " + e.getMessage(), e); + return new HashMap(); + } } }