From ad7bd64aa04fa143c62886372202cf9045c22a8d Mon Sep 17 00:00:00 2001 From: mzr Date: Mon, 29 Sep 2025 09:14:32 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B5=81=E7=A8=8B=E7=94=9F=E4=BA=A7=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E5=AE=A1=E6=89=B9=E5=90=8E=E6=8E=A8=E9=80=81=E9=AB=98?= =?UTF-8?q?=E5=8E=8BIMS-=E5=A2=9E=E5=8A=A0=E4=BF=AE=E6=94=B9sql?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bp/rule/AfterApproveSyncImsRule.java | 217 +++++++++++++----- 1 file changed, 156 insertions(+), 61 deletions(-) diff --git a/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/rule/AfterApproveSyncImsRule.java b/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/rule/AfterApproveSyncImsRule.java index 1379e26b..d0ca32bb 100644 --- a/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/rule/AfterApproveSyncImsRule.java +++ b/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/rule/AfterApproveSyncImsRule.java @@ -6,6 +6,7 @@ import nc.bs.logging.Log; import nc.bs.uapbd.util.MyHelper; import nc.impl.pubapp.pattern.rule.IRule; import nc.jdbc.framework.SQLParameter; +import nc.jdbc.framework.processor.ColumnProcessor; import nc.vo.mmpac.pmo.pac0002.entity.PMOAggVO; import nc.vo.mmpac.pmo.pac0002.entity.PMOHeadVO; import nc.vo.mmpac.pmo.pac0002.entity.PMOItemVO; @@ -45,7 +46,9 @@ public class AfterApproveSyncImsRule implements IRule { return imsDao; } + // 表头-表名 private static final String HEAD_TABLE = "BIPOrderMainTab"; + // 表体-表名 private static final String BODY_TABLE = "BIPOrderDetailTab"; private static final String[] HEAD_COLUMNS = {"cpmohid", "pk_org", "cplanfactoryid", "dbilldate", "vbillcode", "ctrantypeid", "vtrantypecode", "fbillstatus", "approver", "approvertime", "billmaker", "dmakedate", "vnote", "creator", "creationtime", "status"}; @@ -85,54 +88,40 @@ public class AfterApproveSyncImsRule implements IRule { } /** - * 构建同步数据 + * 构建同步数据逻辑,根据主键判断是新增还是更新 */ private void buildSyncData(PMOAggVO[] useVOs) throws BusinessException { for (PMOAggVO vo : useVOs) { PMOHeadVO pmoHeadVO = vo.getParentVO(); PMOItemVO[] itemVOS = vo.getChildrenVO(); - // 判断物料的业务单元是否是高压加工车间,不是则跳过 + // 判断订单业务单元是否是高压IMS组织,如果是则跳过 String pkOrg = pmoHeadVO.getPk_org(); String orgCode = MyHelper.transferField(OrgVO.getDefaultTableName(), OrgVO.CODE, OrgVO.PK_ORG, pkOrg); if (checkIfOrg(orgCode, configParams)) { - continue; + // continue; } - // 表头 - // 构建插入表头数据的SQL - String headSql = buildInsertSQL(HEAD_TABLE, HEAD_COLUMNS); - SQLParameter headParams = buildHeadParameters(pmoHeadVO); - List> bodyParameterList = new ArrayList<>(); + // 获取主键值 + String headPrimaryKeyValue = (String) pmoHeadVO.getAttributeValue("cpmohid"); + + // 根据是否存在记录构建相应的SQL + String headSql = buildSQL(HEAD_TABLE, HEAD_COLUMNS, "cpmohid", headPrimaryKeyValue); + SQLParameter headParams = buildHeadParameters(pmoHeadVO, headSql.contains("UPDATE")); + + // 处理表体数据 + List bodySqlList = new ArrayList<>(); + List bodyParameterList = new ArrayList<>(); + for (PMOItemVO item : itemVOS) { - Map itemMap = new HashMap<>(); - // 构建明细表SQL - String bodySql = buildInsertSQL(BODY_TABLE, BODY_COLUMNS); - // 添加表体参数 - SQLParameter bodyParams = buildBodyParameters(item, pmoHeadVO); - itemMap.put(bodySql, bodyParams); - bodyParameterList.add(itemMap); + String bodyPrimaryKeyValue = (String) item.getAttributeValue("cmoid"); + String bodySql = buildSQL(BODY_TABLE, BODY_COLUMNS, "cmoid", bodyPrimaryKeyValue); + SQLParameter bodyParams = buildBodyParameters(item, pmoHeadVO, bodySql.contains("UPDATE")); + bodySqlList.add(bodySql); + bodyParameterList.add(bodyParams); } - pushData(headSql, headParams, bodyParameterList); - } - } - /** - * 推送同步数据 - */ - private void pushData(String headSql, SQLParameter headParams, List> bodyParameterList) throws BusinessException { - logger.error("gyIms-PMO-headSql = " + headSql); - int HeadRowsAffected = getImsDao().executeUpdate(headSql, headParams); - if (HeadRowsAffected != 1) { - NCCForUAPLogger.debug("gyIms-PMO-headSql = " + headSql); + pushData(headSql, headParams, bodySqlList, bodyParameterList); } - for (Map map : bodyParameterList) { - String bodySql = map.keySet().iterator().next(); - int bodyRowsAffected = getImsDao().executeUpdate(bodySql, map.get(bodySql)); - if (bodyRowsAffected != 1) { - NCCForUAPLogger.debug("gyIms-PMO-bodySql = " + bodySql); - } - } - // logger.error("gyIms-PMO-res = " + result); } private boolean checkIfOrg(String code, Map configParams) throws BusinessException { @@ -149,6 +138,20 @@ public class AfterApproveSyncImsRule implements IRule { return true; } + private String buildSQL(String tableName, String[] columns, String pkColumn, Object pkValue) throws BusinessException { + // 检查记录是否存在 + String checkSql = "SELECT COUNT(1) FROM " + tableName + " WHERE " + pkColumn + " = '" + pkValue + "'"; + Integer count = (Integer) getImsDao().executeQuery(checkSql, new ColumnProcessor()); + + if (count > 0) { + // 构建UPDATE SQL + return buildUpdateSQL(tableName, columns, pkColumn); + } else { + // 构建INSERT SQL + return buildInsertSQL(tableName, columns); + } + } + private String buildInsertSQL(String tableName, String[] columns) { int columnCount = columns.length; StringBuilder sqlBuilder = new StringBuilder(); @@ -173,43 +176,114 @@ public class AfterApproveSyncImsRule implements IRule { return sqlBuilder.toString(); } + private String buildUpdateSQL(String tableName, String[] columns, String pkColumn) { + StringBuilder sqlBuilder = new StringBuilder(); + sqlBuilder.append("UPDATE ").append(tableName).append(" SET "); - private SQLParameter buildHeadParameters(PMOHeadVO pmoHeadVO) { - SQLParameter headParams = new SQLParameter(); - for (String column : HEAD_COLUMNS) { - if ("status".equals(column)) { - continue; + boolean first = true; + for (String column : columns) { + // 主键字段不更新 + if (!column.equals(pkColumn)) { + if (!first) { + sqlBuilder.append(", "); + } + sqlBuilder.append(column).append(" = ?"); + first = false; } - Object value = pmoHeadVO.getAttributeValue(column); - if (headNumFields.contains(column)) { - value = skipNullForNumber(value); - } else { - value = skipNull(value); - } - headParams.addParam(value); } - // status C=创建U=修改2=处理完成 - headParams.addParam("C");// 默认状态为C(新增) + + sqlBuilder.append(" WHERE ").append(pkColumn).append(" = ?"); + return sqlBuilder.toString(); + } + + + private SQLParameter buildHeadParameters(PMOHeadVO pmoHeadVO, boolean isUpdate) { + SQLParameter headParams = new SQLParameter(); + + if (isUpdate) { + // UPDATE情况:不包含主键字段在参数前面,主键作为WHERE条件在最后 + for (String column : HEAD_COLUMNS) { + if (!"cpmohid".equals(column)) { // 主键字段不作为更新字段 + if ("status".equals(column)) { + continue; + } + Object value = pmoHeadVO.getAttributeValue(column); + if (headNumFields.contains(column)) { + value = skipNullForNumber(value); + } else { + value = skipNull(value); + } + headParams.addParam(value); + } + } + // status C=创建U=修改2=处理完成 + headParams.addParam("U"); // 更新状态为U(修改) + // 添加主键作为WHERE条件 + headParams.addParam(pmoHeadVO.getAttributeValue("cpmohid")); + } else { + // INSERT情况:包含所有字段 + for (String column : HEAD_COLUMNS) { + if ("status".equals(column)) { + continue; + } + Object value = pmoHeadVO.getAttributeValue(column); + if (headNumFields.contains(column)) { + value = skipNullForNumber(value); + } else { + value = skipNull(value); + } + headParams.addParam(value); + } + // status C=创建U=修改2=处理完成 + headParams.addParam("C"); // 默认状态为C(新增) + } + return headParams; } - private SQLParameter buildBodyParameters(PMOItemVO item, PMOHeadVO pmoHeadVO) { + private SQLParameter buildBodyParameters(PMOItemVO item, PMOHeadVO pmoHeadVO, boolean isUpdate) { SQLParameter bodyParams = new SQLParameter(); - for (String column : BODY_COLUMNS) { - Object value; - if ("vbillcode".equals(column)) { - value = pmoHeadVO.getAttributeValue(column); - } else { - value = item.getAttributeValue(column); + + if (isUpdate) { + // UPDATE情况:不包含主键字段在参数前面,主键作为WHERE条件在最后 + for (String column : BODY_COLUMNS) { + if (!"cmoid".equals(column)) { // 主键字段不作为更新字段 + Object value; + if ("vbillcode".equals(column)) { + value = pmoHeadVO.getAttributeValue(column); + } else { + value = item.getAttributeValue(column); + } + // 数值字段需要特殊处理空值 + if (bodyNumFields.contains(column)) { + value = skipNullForNumber(value); + } else { + value = skipNull(value); + } + bodyParams.addParam(value); + } } - // 根据字段类型选择不同的空值处理方式 - if (bodyNumFields.contains(column)) { - value = skipNullForNumber(value); - } else { - value = skipNull(value); + // 添加主键作为WHERE条件 + bodyParams.addParam(item.getAttributeValue("cmoid")); + } else { + // INSERT情况:包含所有字段 + for (String column : BODY_COLUMNS) { + Object value; + if ("vbillcode".equals(column)) { + value = pmoHeadVO.getAttributeValue(column); + } else { + value = item.getAttributeValue(column); + } + // 数值字段需要特殊处理空值 + if (bodyNumFields.contains(column)) { + value = skipNullForNumber(value); + } else { + value = skipNull(value); + } + bodyParams.addParam(value); } - bodyParams.addParam(value); } + return bodyParams; } @@ -260,5 +334,26 @@ public class AfterApproveSyncImsRule implements IRule { } } + /** + * 推送数据到IMS系统 + */ + private void pushData(String headSql, SQLParameter headParams, List bodySqlList, List bodyParameterList) throws BusinessException { + logger.error("gyIms-PMO-headSql = " + headSql); + int headRowsAffected = getImsDao().executeUpdate(headSql, headParams); + if (headRowsAffected != 1) { + NCCForUAPLogger.debug("gyIms-PMO-headSql = " + headSql); + } + + for (int i = 0; i < bodySqlList.size(); i++) { + String bodySql = bodySqlList.get(i); + SQLParameter parameter = bodyParameterList.get(i); + int bodyRowsAffected = getImsDao().executeUpdate(bodySql, parameter); + if (bodyRowsAffected != 1) { + NCCForUAPLogger.debug("gyIms-PMO-bodySql = " + bodySql); + } + } + // logger.error("gyIms-PMO-res = " + result); + } + }