From ba87df50205cebc234a8b062331d6a86890becfb Mon Sep 17 00:00:00 2001 From: mzr Date: Mon, 22 Sep 2025 15:28:56 +0800 Subject: [PATCH] =?UTF-8?q?=E9=AB=98=E5=8E=8BMES=E6=8E=A8=E7=89=A9?= =?UTF-8?q?=E6=96=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../listener/MaterialToGyMesListener.java | 254 ++++++++++++++++++ 1 file changed, 254 insertions(+) create mode 100644 uapbd/src/private/nccloud/api/uapbd/material/listener/MaterialToGyMesListener.java diff --git a/uapbd/src/private/nccloud/api/uapbd/material/listener/MaterialToGyMesListener.java b/uapbd/src/private/nccloud/api/uapbd/material/listener/MaterialToGyMesListener.java new file mode 100644 index 00000000..b13cc467 --- /dev/null +++ b/uapbd/src/private/nccloud/api/uapbd/material/listener/MaterialToGyMesListener.java @@ -0,0 +1,254 @@ +package nccloud.api.uapbd.material.listener; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.serializer.SerializerFeature; +import nc.bs.bd.assignservice.multiorg.MultiOrgAssignVO; +import nc.bs.bd.baseservice.ArrayClassConvertUtil; +import nc.bs.businessevent.IBusinessEvent; +import nc.bs.businessevent.IBusinessListener; +import nc.bs.businessevent.bd.BDCommonEvent; +import nc.bs.dao.BaseDAO; +import nc.bs.framework.common.NCLocator; +import nc.bs.logging.Log; +import nc.bs.trade.business.HYPubBO; +import nc.bs.uapbd.util.MyHelper; +import nc.bs.uapbd.util.ThirdPartyPostRequestUtil; +import nc.jdbc.framework.processor.MapProcessor; +import nc.pubitf.uapbd.IMaterialPubService; +import nc.util.mmf.framework.base.MMValueCheck; +import nc.vo.am.common.util.StringUtils; +import nc.vo.bd.material.MaterialVO; +import nc.vo.bd.material.marbasclass.MarBasClassVO; +import nc.vo.bd.material.plan.MaterialPlanVO; +import nc.vo.org.OrgVO; +import nc.vo.pub.BusinessException; +import nc.vo.pub.lang.UFBoolean; +import nc.vo.sm.UserVO; + +import java.util.*; +import java.util.stream.Stream; + +/** + * 高压MES-物料新增修改后同步 + * + * @author mzr + * @date 2025/09/11 + */ +public class MaterialToGyMesListener implements IBusinessListener { + private static final String LOG_INFO_NAME = "gyMesLog"; + private static final Log logger = Log.getInstance(LOG_INFO_NAME); + private static final String addUrl = "/bip/order/materialAdd"; + private static final String updateUrl = "/bip/order/materialUpdate"; + private Map configParams; + + @Override + public void doAction(IBusinessEvent event) throws BusinessException { + BDCommonEvent e = (BDCommonEvent) event; + String eventType = event.getEventType(); + Object[] objs = e.getObjs(); + + // EventType是事件编码 1002-新增后 1004-修改后 1071-状态由停用变为启用后 1069-状态由启用变为停用后 + if ("1004".equals(eventType)) { + MaterialVO[] useVOs = ArrayClassConvertUtil.convert(objs, MaterialVO.class); + configParams = MyHelper.getConfigParams("jm-config", null); + if (configParams.isEmpty()) { + throw new BusinessException("高压的gymes接口缺少配置"); + } + buildSyncData(useVOs, eventType); + } else if ("1071".equals(eventType) || "1069".equals(eventType)) { + MaterialVO[] useVOs = ArrayClassConvertUtil.convert(objs, MaterialVO.class); + configParams = MyHelper.getConfigParams("jm-config", null); + if (configParams.isEmpty()) { + throw new BusinessException("高压的gymes接口缺少配置"); + } + buildSyncData(useVOs, eventType); + } else if ("1009".equals(eventType)) { + // 物料可见性范围-分配后 1009 + configParams = MyHelper.getConfigParams("jm-config", null); + if (configParams.isEmpty()) { + throw new BusinessException("高压的gymes接口缺少配置"); + } + HYPubBO hyPub = new HYPubBO(); + List voList = new ArrayList<>(); + for (Object obj : objs) { + MultiOrgAssignVO vo = (MultiOrgAssignVO) obj; + String pkMaterial = vo.getPk_doc(); + String pkOrg = vo.getPk_org(); + String orgCode = (String) hyPub.findColValue(OrgVO.getDefaultTableName(), OrgVO.CODE, "dr =0 and pk_org = '" + pkOrg + "' "); + // 检查当前组织是否为高压 + if (checkIfOrg(orgCode, configParams)) { + continue; + } + MaterialVO materialVO = (MaterialVO) hyPub.queryByPrimaryKey(MaterialVO.class, pkMaterial); + voList.add(materialVO); + } + if (!voList.isEmpty()) { + MaterialVO[] useVOs = voList.toArray(new MaterialVO[0]); + buildSyncData(useVOs, eventType); + } + + } + } + + /** + * 构建同步数据 + */ + private void buildSyncData(MaterialVO[] useVOs, String eventType) throws BusinessException { + String orgId = MyHelper.transferField(OrgVO.getDefaultTableName(), OrgVO.PK_ORG, OrgVO.CODE, "C003"); + JSONArray dataArr = new JSONArray(); + for (MaterialVO vo : useVOs) { + String pkMaterial = vo.getPk_material(); + // 判断物料的业务单元是否是高压公司,不是则跳过 + // String pkOrg = vo.getPk_org(); + Integer num = MyHelper.checkIfOrg(configParams, pkMaterial, "gyOrg"); + if (!"1009".equals(eventType) && (num <= 0)) { + continue; + } + // 字段值翻译 + String pk_marbasclass = vo.getPk_marbasclass(); + String mrlTypeName = MyHelper.getStrValByCondition(MarBasClassVO.getDefaultTableName(), MarBasClassVO.NAME, + "pk_marbasclass = '" + pk_marbasclass + "'"); + // 计量单位 + Map unitMap = getGoodsInfo(pkMaterial); + Map planMap = queryMaterialPlanInfoByPks(new String[]{pkMaterial}, orgId, + new String[]{MaterialPlanVO.ISVIRTUAL}); + UFBoolean isvirtual = new UFBoolean(false); + if (MMValueCheck.isNotEmpty(planMap) && + MMValueCheck.isNotEmpty(planMap.get(pkMaterial))) { + isvirtual = planMap.get(pkMaterial).getIsvirtual(); + } + // creator 创建人 + String creator = vo.getCreator(); + String creatorName = MyHelper.getStrValByCondition("sm_user", UserVO.USER_NAME, + UserVO.CUSERID + " = '" + creator + "'"); + // 1=未启用;2=已启用;3=已停用; + Integer enablestate = vo.getEnablestate(); + // 组装数据 + JSONObject singleObj = new JSONObject(); + singleObj.put("materialCode", vo.getCode()); // 物料编码 + singleObj.put("bipMaterialId", pkMaterial); // 物料主键 + singleObj.put("materialName", vo.getName()); // 物料名称 + singleObj.put("materialCategory", ""); // 物料分类 + singleObj.put("specification", vo.getMaterialspec()); // 规格 + singleObj.put("intervalModel", ""); // 产品类型 例如35-KV-断路器(物料自定义字段) + singleObj.put("primaryUnit", unitMap.get("unitname")); // 主单位 + singleObj.put("materialUnit", unitMap.get("deputy_unitname")); // 单位 + singleObj.put("drawingNumber", vo.getGraphid()); // 图号编码 + singleObj.put("enableStatus", enablestate - 1); // 启用状态 0 未启动 1 已启动 2 已停用 + singleObj.put("materialType", ""); // 物料类型编码 + singleObj.put("batchManagement", ""); // 批次管理 + singleObj.put("outboundPriority", ""); // 出库优先级 + singleObj.put("mainWarehouse", ""); // 主仓库 + singleObj.put("reservation", ""); // 预留 + singleObj.put("virtualItem", isvirtual.toString()); // 虚项 + singleObj.put("productionDepartment", ""); // 生产部门编码 + singleObj.put("matchingComponents", ""); // 配套子件 + singleObj.put("issuance", ""); // 发料 + singleObj.put("backflushMethod", ""); // 倒冲方式 + singleObj.put("postCompletionProcessing", ""); // 完工后续处理 + singleObj.put("bipCreateBy", creatorName); // 创建人 + dataArr.add(singleObj); + /** + * { + * "list": [ + * { + * "materialCode": "物料编码", + * "bipMaterialId": "物料主键", + * "materialName": "物料名称", + * "materialCategory": "物料分类", + * "specification": "规格例如 台 件", + * "intervalModel": "产品类型 例如35-KV-断路器(物料自定义字段)", + * "primaryUnit": "主单位例如 1 ", + * "materialUnit": "单位例如 1 ", + * "drawingNumber": "图号编码 如 X56434 高压", + * "enableStatus": "启用状态 0 未启动 1 已启动 2 已停用", + * "materialType": "物料类型编码", + * "batchManagement": "批次管理", + * "outboundPriority": "出库优先级 按BIP类型", + * "mainWarehouse": "主仓库 按BIP类型", + * "reservation": "预留 按BIP类型", + * "virtualItem": "虚项 按BIP类型", + * "productionDepartment": "生产部门编码 按BIP类型", + * "matchingComponents": "配套子件 按BIP类型", + * "issuance": "发料 按BIP类型", + * "backflushMethod": "倒冲方式 按BIP类型", + * "postCompletionProcessing": "完工后续处理 按BIP类型", + * "bipCreateBy": "创建人" + * } + * ] + * } + */ + } + if (!dataArr.isEmpty()) { + pushData(dataArr); + } + } + + /** + * 推送同步数据 + */ + private void pushData(JSONArray param) throws BusinessException { + // String jsonString = param.toJSONString(); + // 转json字符串的时候保留null值 + String jsonStr = JSON.toJSONString(param, + SerializerFeature.WriteMapNullValue, + SerializerFeature.WriteNullStringAsEmpty + ); + logger.error("gymes-Material-param = " + jsonStr); + // NCCForUAPLogger.debug("gymes-Material-param = " + jsonStr); + String baseUrl = configParams.get("gymesBaseUrl"); + String requestUrl = baseUrl + addUrl; + logger.error("gymes-Material-url = " + requestUrl); + String result = ThirdPartyPostRequestUtil.sendPostRequest(requestUrl, jsonStr); + JSONObject resultObj = JSONObject.parseObject(result); + logger.error("gymes-Material-res = " + result); + + if (!"200".equals(resultObj.getString("code"))) { + // throw new BusinessException("gymes-Material-error:" + resultObj.getString("msg")); + logger.error("gymes-Material-error,result[" + resultObj.toJSONString() + "]"); + } + } + + private Map getGoodsInfo(String pkMaterial) throws BusinessException { + String sql = " select a.pk_measdoc, c.name unitname, b.pk_measdoc deputyUnit, d.name deputy_unitname, nvl(b.measrate, '1/1') measrate " + + "from bd_material a " + + "left join bd_materialconvert b on a.pk_material = b.pk_material " + + "left join bd_measdoc c on a.pk_measdoc = c.pk_measdoc " + + "left join bd_measdoc d on b.pk_measdoc = d.pk_measdoc " + + "where a.pk_material = '" + pkMaterial + "' "; + Map map = (Map) new BaseDAO().executeQuery(sql, new MapProcessor()); + // map.put("convertRate", MyHelper.transferSpecialField(map.get("measrate") + "")); + return map; + } + + private boolean checkIfOrg(String code, Map configParams) throws BusinessException { + String targetCode = configParams.get("jmOrg"); + if (targetCode == null || StringUtils.isEmpty(targetCode)) { + throw new BusinessException("未配置组织参数"); + } + String[] orgItem = targetCode.split(","); + for (String orgCode : orgItem) { + if (!orgCode.isEmpty() && orgCode.equals(code)) { + return false; + } + } + return true; + } + + public static Map queryMaterialPlanInfoByPks(String[] pks, String pk_stockorg, + String[] fields) throws BusinessException { + Map map = null; + 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); + } + + return map; + } + +}