流程生产订单审批后推送高压IMS-增加修改sql

This commit is contained in:
mzr 2025-09-29 09:14:32 +08:00
parent 5570e015b4
commit ad7bd64aa0
1 changed files with 156 additions and 61 deletions

View File

@ -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<PMOAggVO> {
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<PMOAggVO> {
}
/**
* 构建同步数据
* 构建同步数据逻辑根据主键判断是新增还是更新
*/
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<Map<String, SQLParameter>> 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<String> bodySqlList = new ArrayList<>();
List<SQLParameter> bodyParameterList = new ArrayList<>();
for (PMOItemVO item : itemVOS) {
Map<String, SQLParameter> 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<Map<String, SQLParameter>> 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<String, SQLParameter> 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<String, String> configParams) throws BusinessException {
@ -149,6 +138,20 @@ public class AfterApproveSyncImsRule implements IRule<PMOAggVO> {
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<PMOAggVO> {
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<PMOAggVO> {
}
}
/**
* 推送数据到IMS系统
*/
private void pushData(String headSql, SQLParameter headParams, List<String> bodySqlList, List<SQLParameter> 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);
}
}