From 4de8c5b102f0a52e872d4c2fa5adb89293f45464 Mon Sep 17 00:00:00 2001 From: mzr Date: Tue, 7 Oct 2025 12:39:13 +0800 Subject: [PATCH] =?UTF-8?q?feat(bom):=20=E5=AE=9E=E7=8E=B0BOM=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=E5=A4=B1=E8=B4=A5=E5=90=8E=E7=9A=84=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E5=A4=84=E7=90=86=E6=9C=BA=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增定时任务插件 BomToEpicMesPlugin 用于同步推送失败的BOM数据 - 在 BomSaveAfterEpicMesRule 中增加异常捕获与错误信息记录逻辑 --- .../bom0202/rule/BomSaveAfterEpicMesRule.java | 46 ++++- .../uapbd/task/base/BomToEpicMesPlugin.java | 193 ++++++++++++++++++ 2 files changed, 237 insertions(+), 2 deletions(-) create mode 100644 uapbd/src/private/nc/bs/uapbd/task/base/BomToEpicMesPlugin.java diff --git a/uapbd/src/private/nc/bs/bd/bom/bom0202/rule/BomSaveAfterEpicMesRule.java b/uapbd/src/private/nc/bs/bd/bom/bom0202/rule/BomSaveAfterEpicMesRule.java index ab27fc70..4fc15736 100644 --- a/uapbd/src/private/nc/bs/bd/bom/bom0202/rule/BomSaveAfterEpicMesRule.java +++ b/uapbd/src/private/nc/bs/bd/bom/bom0202/rule/BomSaveAfterEpicMesRule.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.serializer.SerializerFeature; +import nc.bs.dao.BaseDAO; import nc.bs.logging.Log; import nc.bs.uapbd.util.MyHelper; import nc.bs.uapbd.util.ThirdPartyPostRequestUtil; @@ -13,11 +14,14 @@ import nc.vo.bd.bom.bom0202.entity.AggBomVO; import nc.vo.bd.bom.bom0202.entity.BomItemVO; import nc.vo.bd.bom.bom0202.entity.BomVO; import nc.vo.bd.material.MaterialVO; +import nc.vo.fi.pub.SqlUtils; import nc.vo.org.OrgVO; import nc.vo.pub.BusinessException; import nc.vo.pubapp.pattern.exception.ExceptionUtils; +import java.util.HashSet; import java.util.Map; +import java.util.Set; /** * BOM޸ĺͬMESBOM @@ -30,6 +34,14 @@ public class BomSaveAfterEpicMesRule implements IRule { private static final Log logDl = Log.getInstance(LOG_INFO_NAME); private static final String reqUrl = "/prj-v5-web/ext/api/bom"; private Map configParams; + private BaseDAO dao; + + public BaseDAO getDao() { + if (dao == null) { + dao = new BaseDAO(); + } + return dao; + } @Override public void process(AggBomVO[] vos) { @@ -38,9 +50,11 @@ public class BomSaveAfterEpicMesRule implements IRule { configParams = MyHelper.getConfigParams("Dldz-config", null); JSONArray data = buildSyncData(vos); if (!data.isEmpty()) { - pushData(data); + pushData(data, vos); } } catch (BusinessException e) { + logDl.error("EpicMes-BOM-exp:" + e.getMessage(), e); + handleSyncBomExp(vos, "N", e.getMessage()); ExceptionUtils.wrappException(e); } } @@ -112,7 +126,7 @@ public class BomSaveAfterEpicMesRule implements IRule { /** * ͬ */ - private void pushData(JSONArray param) throws BusinessException { + private void pushData(JSONArray param, AggBomVO[] vos) throws BusinessException { // תjsonַʱnullֵ String jsonStr = JSON.toJSONString(param, SerializerFeature.WriteMapNullValue, @@ -130,6 +144,34 @@ public class BomSaveAfterEpicMesRule implements IRule { if (!"1".equals(resultObj.getString("flag"))) { // throw new BusinessException("EpicMes-BOM-error:" + resultObj.getString("msg")); logDl.error("EpicMes-BOM-error,result[" + resultObj.toJSONString() + "]"); + // BOM͵ĴϢ + handleSyncBomExp(vos, "N", resultObj.getString("msg")); + } else { + handleSyncBomExp(vos, "Y", ""); } } + + /** + * ´Ϣ + */ + private void handleSyncBomExp(AggBomVO[] vos, String errorCode, String errorMsg) { + if (MMValueCheck.isEmpty(vos)) { + return; + } + Set ids = new HashSet<>(); + for (AggBomVO vo : vos) { + BomVO hvo = (BomVO) vo.getParentVO(); + String cbomid = hvo.getCbomid(); + ids.add(cbomid); + } + try { + String inSql = SqlUtils.getInStr("cbomid", ids.toArray(new String[0]), Boolean.TRUE); + String updateSql = "update bd_bom set hvdef19 = '[errorCode]' where " + inSql; + updateSql = updateSql.replace("[errorCode]", errorCode); + int updatedRows = getDao().executeUpdate(updateSql); + } catch (BusinessException e) { + logDl.error("EpicMes-BOM-updateErrorInfo = " + e.getMessage(), e); + } + } + } diff --git a/uapbd/src/private/nc/bs/uapbd/task/base/BomToEpicMesPlugin.java b/uapbd/src/private/nc/bs/uapbd/task/base/BomToEpicMesPlugin.java new file mode 100644 index 00000000..8fb22b3e --- /dev/null +++ b/uapbd/src/private/nc/bs/uapbd/task/base/BomToEpicMesPlugin.java @@ -0,0 +1,193 @@ +package nc.bs.uapbd.task.base; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.serializer.SerializerFeature; +import nc.bs.dao.BaseDAO; +import nc.bs.framework.common.NCLocator; +import nc.bs.logging.Log; +import nc.bs.pub.pa.PreAlertObject; +import nc.bs.pub.taskcenter.BgWorkingContext; +import nc.bs.pub.taskcenter.IBackgroundWorkPlugin; +import nc.bs.uapbd.util.MyHelper; +import nc.bs.uapbd.util.ThirdPartyPostRequestUtil; +import nc.itf.bd.bom.bom0202.IBomBillQueryService; +import nc.jdbc.framework.processor.MapListProcessor; +import nc.util.mmf.framework.base.MMValueCheck; +import nc.vo.bd.bom.bom0202.entity.AggBomVO; +import nc.vo.bd.bom.bom0202.entity.BomItemVO; +import nc.vo.bd.bom.bom0202.entity.BomVO; +import nc.vo.bd.material.MaterialVO; +import nc.vo.fi.pub.SqlUtils; +import nc.vo.org.OrgVO; +import nc.vo.pub.BusinessException; + +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * ʱͬʧܵBOMMES + * + * @author mzr + * @date 20251006 + */ +public class BomToEpicMesPlugin implements IBackgroundWorkPlugin { + private static final String LOG_INFO_NAME = "syscron"; + private static final Log logDl = Log.getInstance(LOG_INFO_NAME); + private static final String reqUrl = "/prj-v5-web/ext/api/bom"; + private Map configParams; + private BaseDAO dao; + + public BaseDAO getDao() { + if (dao == null) { + dao = new BaseDAO(); + } + return dao; + } + + @Override + public PreAlertObject executeTask(BgWorkingContext bgWorkingContext) throws BusinessException { + try { + String sql = " select * from v_bip_so_cron"; + List> pkList = (List>) getDao().executeQuery(sql.toString(), new MapListProcessor()); + if (pkList.isEmpty()) { + return null; + } + configParams = MyHelper.getConfigParams("Dldz-config", null); + if (configParams.isEmpty()) { + return null; + } + IBomBillQueryService qry = NCLocator.getInstance().lookup(IBomBillQueryService.class); + for (Map map : pkList) { + String cbomid = map.get("cbomid"); + AggBomVO[] vos = qry.queryAggBomByBomID(new String[]{cbomid}); + JSONArray data = buildSyncData(vos); + if (!data.isEmpty()) { + pushData(data, vos); + } + } + + } catch (Exception e) { + logDl.error("BomToEpicMesPlugin-exp:" + e.getMessage(), e); + } + return null; + } + + /** + * ͬ + */ + private JSONArray buildSyncData(AggBomVO[] useVOs) throws BusinessException { + JSONArray data = new JSONArray(); + for (AggBomVO vo : useVOs) { + // жϵҵԪǷǵӹ˾ + BomVO hvo = (BomVO) vo.getParentVO(); + String hvnote = hvo.getHvnote(); + // ڳBOM + if ("202509QC".equals(hvnote)) { + continue; + } + String pkOrg = (String) hvo.getAttributeValue("pk_org"); + String orgCode = MyHelper.transferField(OrgVO.getDefaultTableName(), OrgVO.CODE, OrgVO.PK_ORG, pkOrg); + if (MyHelper.checkIfDldzOrg(orgCode, configParams)) { + continue; + } + BomItemVO[] childrenVOs = vo.getChildrenVO(); + if (MMValueCheck.isEmpty(childrenVOs)) { + continue; + } + // ֻBOM 1=BOM;2=װBOM;3=BOM; + Integer fbomtype = hvo.getFbomtype(); + if (fbomtype != 1) { + continue; + } + String hcmaterialid = hvo.getHcmaterialid();// ϱ + String hversion = hvo.getHversion();// BOM汾 + + String mitm = MyHelper.getStrValByCondition(MaterialVO.getDefaultTableName(), MaterialVO.CODE, + MaterialVO.PK_MATERIAL + " = '" + hcmaterialid + "'"); + for (BomItemVO childrenVO : childrenVOs) { + String cmaterialid = childrenVO.getCmaterialid(); + String sitm = MyHelper.getStrValByCondition(MaterialVO.getDefaultTableName(), MaterialVO.CODE, + MaterialVO.PK_MATERIAL + " = '" + cmaterialid + "'"); + // װ + JSONObject singleObj = new JSONObject(); + singleObj.put("mitm", mitm); // ϱ(ERPϱ) + singleObj.put("sitm", sitm); // ϱ + singleObj.put("orderNum", hversion); // ͬ(ERPеĿ=BOM汾) + singleObj.put("qana", childrenVO.getNassitemnum().toString()); // (ERP) + singleObj.put("ver", hversion); // BOM汾 + singleObj.put("remark", childrenVO.getVnote()); // ע + data.add(singleObj); + } + /** + * [ + * { + * "mitm": "DSF01-2501230028", + * "sitm": "2305050447", + * "orderNum": "111", + * "qana": 1, + * "ver": "1", + * "remark": "" + * } + * ] + */ + + } + return data; + } + + /** + * ͬ + */ + private void pushData(JSONArray param, AggBomVO[] vos) throws BusinessException { + // תjsonַʱnullֵ + String jsonStr = JSON.toJSONString(param, + SerializerFeature.WriteMapNullValue, + SerializerFeature.WriteNullStringAsEmpty + ); + logDl.error("EpicMes-BOM-param = " + jsonStr); + // NCCForUAPLogger.debug("EpicMes-BOM-param = " + jsonStr); + String baseUrl = configParams.get("epicMesUrl"); + String requestUrl = baseUrl + reqUrl; + logDl.error("EpicMes-BOM-url = " + requestUrl); + String result = ThirdPartyPostRequestUtil.sendPostRequest(requestUrl, jsonStr); + JSONObject resultObj = JSONObject.parseObject(result); + logDl.error("EpicMes-BOM-res = " + result); + // NCCForUAPLogger.debug("EpicMes-BOM-result = " + result); + if (!"1".equals(resultObj.getString("flag"))) { + // throw new BusinessException("EpicMes-BOM-error:" + resultObj.getString("msg")); + logDl.error("EpicMes-BOM-error,result[" + resultObj.toJSONString() + "]"); + // BOM͵ĴϢ + // handleSyncBomExp(vos, "N", resultObj.getString("msg")); + } else { + handleSyncBomExp(vos, "Y", ""); + } + } + + + /** + * ´Ϣ + */ + private void handleSyncBomExp(AggBomVO[] vos, String errorCode, String errorMsg) { + if (MMValueCheck.isEmpty(vos)) { + return; + } + Set ids = new HashSet<>(); + for (AggBomVO vo : vos) { + BomVO hvo = (BomVO) vo.getParentVO(); + String cbomid = hvo.getCbomid(); + ids.add(cbomid); + } + try { + String inSql = SqlUtils.getInStr("cbomid", ids.toArray(new String[0]), Boolean.TRUE); + String updateSql = "update bd_bom set hvdef19 = '[errorCode]' where " + inSql; + updateSql = updateSql.replace("[errorCode]", errorCode); + int updatedRows = getDao().executeUpdate(updateSql); + } catch (BusinessException e) { + logDl.error("EpicMes-BOM-updateErrorInfo = " + e.getMessage(), e); + } + } +}