From 117812ed2664ac23341fe8e0634c883893c80b3d Mon Sep 17 00:00:00 2001 From: mzr Date: Thu, 21 Aug 2025 10:31:05 +0800 Subject: [PATCH] =?UTF-8?q?=E7=89=A9=E6=96=99=E6=96=B0=E5=A2=9E=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E5=90=8E=E5=90=8C=E6=AD=A5=E5=90=AF=E6=BA=90=E7=9A=84?= =?UTF-8?q?=E7=89=A9=E6=96=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../listener/MaterialToQmsListener.java | 204 ++++++++++++++++++ .../src/public/nc/bs/uapbd/util/MyHelper.java | 30 +++ 2 files changed, 234 insertions(+) create mode 100644 uapbd/src/private/nccloud/api/uapbd/material/listener/MaterialToQmsListener.java diff --git a/uapbd/src/private/nccloud/api/uapbd/material/listener/MaterialToQmsListener.java b/uapbd/src/private/nccloud/api/uapbd/material/listener/MaterialToQmsListener.java new file mode 100644 index 0000000..8115004 --- /dev/null +++ b/uapbd/src/private/nccloud/api/uapbd/material/listener/MaterialToQmsListener.java @@ -0,0 +1,204 @@ +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.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.vo.bd.material.MaterialVO; +import nc.vo.bd.material.marbasclass.MarBasClassVO; +import nc.vo.org.OrgVO; +import nc.vo.pub.BusinessException; +import nccloud.baseapp.core.log.NCCForUAPLogger; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 物料新增修改后同步启源的物料 + * + * @author mzr + * @date 2025/08/20 + */ +public class MaterialToQmsListener implements IBusinessListener { + private static final String LOG_INFO_NAME = "qyMesLog"; + private static final Log logger = Log.getInstance(LOG_INFO_NAME); + private static final String reqUrl = "/IF_QyErpApi.ashx?action=addwlxx"; + 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("xb-config", null); + if (configParams.isEmpty()) { + throw new BusinessException("箱变的QMS接口缺少配置"); + } + buildSyncData(useVOs, eventType); + } else if ("1071".equals(eventType) || "1069".equals(eventType)) { + MaterialVO[] useVOs = ArrayClassConvertUtil.convert(objs, MaterialVO.class); + configParams = MyHelper.getConfigParams("xb-config", null); + if (configParams.isEmpty()) { + throw new BusinessException("箱变的QMS接口缺少配置"); + } + buildSyncData(useVOs, eventType); + } else if ("1009".equals(eventType)) { + // 物料可见性范围-分配后 1009 + configParams = MyHelper.getConfigParams("xb-config", null); + if (configParams.isEmpty()) { + throw new BusinessException("箱变的QMS接口缺少配置"); + } + 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 { + for (MaterialVO vo : useVOs) { + // 判断物料的业务单元是否是箱变公司,不是则跳过 + String pkOrg = vo.getPk_org(); + String orgCode = MyHelper.transferField(OrgVO.getDefaultTableName(), OrgVO.CODE, OrgVO.PK_ORG, pkOrg); + if (!"1009".equals(eventType) && checkIfOrg(orgCode, configParams)) { + continue; + } + // 字段值翻译 + String pk_marbasclass = vo.getPk_marbasclass(); + String mrlTypeName = MyHelper.getStrValByCondition(MarBasClassVO.getDefaultTableName(), MarBasClassVO.NAME, + "pk_marbasclass = '" + pk_marbasclass + "'"); + // 计量单位 + String pkMaterial = vo.getPk_material(); + Map unitMap = getGoodsInfo(pkMaterial); + + // 1=未启用;2=已启用;3=已停用; + Integer enablestate = vo.getEnablestate(); + String statusCode = (3 == enablestate) ? "1" : "0"; + // 组装数据 + JSONObject singleObj = new JSONObject(); + singleObj.put("batchid", "10001");// 批次编号,用于唯一标识当前传输的物料数据批次,便于追溯和批量处理 + JSONObject contentObj = new JSONObject(); + contentObj.put("meswlbh", vo.getCode()); // 启源物料编码 + contentObj.put("bipwlbh", vo.getCode()); // BIP物料编码 + contentObj.put("wlmc", vo.getName()); // 物料名称 + contentObj.put("wlxhgg", vo.getMaterialtype() + vo.getMaterialspec()); // 物料型号规格 + contentObj.put("wlfl", mrlTypeName); // 物料分类 + contentObj.put("sjjldw", unitMap.get("unitname")); // 设计计量单位 + contentObj.put("cgjldw", unitMap.get("deputy_unitname")); // 采购计量单位 + contentObj.put("zhxs", unitMap.getOrDefault("convertRate", "1.00")); // 转换系数 + contentObj.put("flag_fq", statusCode); // 1/0 传递1代表物料废弃 + contentObj.put("bz", vo.getMemo()); // 备注信息 + JSONArray contentArr = new JSONArray(); + contentArr.add(contentObj); + singleObj.put("Content", contentArr); + /* + { + "batchid": "10001", + "Content": [ + { + "meswlbh": "ACC26711", 启源物料编码 + "bipwlbh": "ACC26711", BIP物料编码 + "wlmc": "铜排",物料名称 + "wlxhgg": "15558190831", 物料型号规格 + "wlfl": "铜排", 物料分类 + "cpfl": "", 如果物料是产品需要填写产品分类 + "sjjldw": "根", 设计计量单位 + "cgjldw": "KG", 采购计量单位 + "zhxs": "6", 转换系数,用于实物单位与采购单位的换算(即 1 根铜排的长度为 6.00 米),精确到两位小数,提升换算准确性 + "bz": "备注" 备注信息 + } + ] + } + */ + pushData(singleObj); + } + } + + /** + * 推送同步数据 + */ + private void pushData(JSONObject param) throws BusinessException { + // String jsonString = param.toJSONString(); + // 转json字符串的时候保留null值 + String jsonStr = JSON.toJSONString(param, + SerializerFeature.WriteMapNullValue, + SerializerFeature.WriteNullStringAsEmpty + ); + logger.error("QMS-Material-param = " + jsonStr); + NCCForUAPLogger.debug("QMS-Material-param = " + jsonStr); + String baseUrl = configParams.get("qmsBaseUrl"); + String requestUrl = baseUrl + reqUrl; + logger.error("QMS-Material-url = " + requestUrl); + String result = ThirdPartyPostRequestUtil.sendPostRequest(requestUrl, jsonStr); + JSONObject resultObj = JSONObject.parseObject(result); + logger.error("QMS-Material-res = " + result); + + if (!"success".equals(resultObj.getString("success"))) { + // throw new BusinessException("QMS-Material-error:" + resultObj.getString("msg")); + logger.error("QMS-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 + "' "; + // logDl.error("QMS-Material-getUnitInfo-sql = " + sql); + 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("xbOrg"); + if (targetCode == null || nc.vo.am.common.util.StringUtils.isEmpty(targetCode)) { + throw new BusinessException("未配置组织参数"); + } + String[] orgItem = targetCode.split(","); + for (String orgCode : orgItem) { + if (!orgCode.isEmpty() && orgCode.equals(code)) { + return false; + } + } + return true; + } + +} diff --git a/uapbd/src/public/nc/bs/uapbd/util/MyHelper.java b/uapbd/src/public/nc/bs/uapbd/util/MyHelper.java index 3889bb8..9bbb680 100644 --- a/uapbd/src/public/nc/bs/uapbd/util/MyHelper.java +++ b/uapbd/src/public/nc/bs/uapbd/util/MyHelper.java @@ -4,7 +4,9 @@ import nc.bs.dao.BaseDAO; import nc.bs.dao.DAOException; import nc.bs.logging.Logger; import nc.bs.trade.business.HYSuperDMO; +import nc.jdbc.framework.processor.BaseProcessor; import nc.jdbc.framework.processor.ColumnProcessor; +import nc.jdbc.framework.processor.MapListProcessor; import nc.jdbc.framework.processor.MapProcessor; import nc.vo.bd.defdoc.DefdocVO; import nc.vo.cmp.util.StringUtils; @@ -14,6 +16,7 @@ import nc.vo.pubapp.pattern.pub.SqlBuilder; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.HashMap; +import java.util.List; import java.util.Map; /** @@ -67,6 +70,33 @@ public class MyHelper { return result; } + public static String getStrValByCondition(String tableName, String fieldName, String condition) throws BusinessException { + String result = ""; + String sql = " SELECT " + fieldName + " FROM " + tableName + " " + + " WHERE nvl(" + tableName + " .dr,0)= 0 " + + " and " + condition + " "; + result = (String) dao.executeQuery(sql, new ColumnProcessor()); + return result; + } + + public static Map getMapValByCondition(String tableName, String fieldName, String condition) throws BusinessException { + String sql = " SELECT " + fieldName + " FROM " + tableName + " " + + " WHERE nvl(" + tableName + " .dr,0)= 0 " + + " and " + condition + " "; + Map result = (Map) dao.executeQuery(sql, new MapProcessor()); + if (result == null || result.isEmpty()) { + result = new HashMap<>(); + } + return result; + } + + public static List> getListByCondition(String tableName, String fieldName, String condition) throws BusinessException { + String sql = " SELECT " + fieldName + " FROM " + tableName + " " + + " WHERE nvl(" + tableName + " .dr,0)= 0 " + + " and " + condition + " "; + return (List>) new BaseDAO().executeQuery(sql, new MapListProcessor()); + } + /** * 检查当前组织是否为电力电子