refactor(sync): 高压IMS-流程生产订单和备料计划同步-调整数据源获取方式
This commit is contained in:
parent
68cee38aab
commit
7de733be00
|
|
@ -1,5 +1,6 @@
|
||||||
package nc.bs.mmpac.pickm.bp;
|
package nc.bs.mmpac.pickm.bp;
|
||||||
|
|
||||||
|
import nc.bs.mmpac.pickm.bp.rule.AfterApproveRuleHighpressureIms;
|
||||||
import nc.bs.mmpac.pickm.bp.rule.AfterQtyUpdRuleHighpressureMes;
|
import nc.bs.mmpac.pickm.bp.rule.AfterQtyUpdRuleHighpressureMes;
|
||||||
import nc.bs.mmpac.pickm.bp.rule.AfterupdateSyncEpicMesRule;
|
import nc.bs.mmpac.pickm.bp.rule.AfterupdateSyncEpicMesRule;
|
||||||
import nc.bs.mmpac.pickm.bp.rule.PickItemsSetVbdef36Rule;
|
import nc.bs.mmpac.pickm.bp.rule.PickItemsSetVbdef36Rule;
|
||||||
|
|
@ -184,7 +185,7 @@ public class PickmUpdateBP {
|
||||||
processer.addAfterRule(subMoAdjustSuggestRule);
|
processer.addAfterRule(subMoAdjustSuggestRule);
|
||||||
processer.addAfterRule(new AfterupdateSyncEpicMesRule());
|
processer.addAfterRule(new AfterupdateSyncEpicMesRule());
|
||||||
// 备料计划变更后推送高压IMS
|
// 备料计划变更后推送高压IMS
|
||||||
// processer.addAfterRule(new AfterApproveRuleHighpressureIms());
|
processer.addAfterRule(new AfterApproveRuleHighpressureIms());
|
||||||
// 备料计划预留推送高压MES
|
// 备料计划预留推送高压MES
|
||||||
processer.addAfterRule(new AfterQtyUpdRuleHighpressureMes());
|
processer.addAfterRule(new AfterQtyUpdRuleHighpressureMes());
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,22 +1,9 @@
|
||||||
package nc.bs.mmpac.pickm.bp;
|
package nc.bs.mmpac.pickm.bp;
|
||||||
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import nc.bs.mmpac.pickm.bp.rule.AfterApproveRuleHighpressureIms;
|
import nc.bs.mmpac.pickm.bp.rule.AfterApproveRuleHighpressureIms;
|
||||||
import nc.bs.mmpac.pickm.bp.rule.AfterQtyUpdRuleHighpressureMes;
|
|
||||||
import nc.bs.mmpac.pickm.bp.rule.AfterupdateSyncEpicMesRule;
|
import nc.bs.mmpac.pickm.bp.rule.AfterupdateSyncEpicMesRule;
|
||||||
import nc.bs.mmpac.pickm.plugin.PickmPluginPoint;
|
import nc.bs.mmpac.pickm.plugin.PickmPluginPoint;
|
||||||
import nc.bs.mmpac.pickm.rule.PickmCheckItemMaterialPermissionRule;
|
import nc.bs.mmpac.pickm.rule.*;
|
||||||
import nc.bs.mmpac.pickm.rule.PickmCheckMaterialPermissionRule;
|
|
||||||
import nc.bs.mmpac.pickm.rule.PickmCreateSubMoRule;
|
|
||||||
import nc.bs.mmpac.pickm.rule.PickmHeadEditRule;
|
|
||||||
import nc.bs.mmpac.pickm.rule.PickmItemAdjustRule;
|
|
||||||
import nc.bs.mmpac.pickm.rule.PickmItemReCreateRule;
|
|
||||||
import nc.bs.mmpac.pickm.rule.PickmNeedDeliverBackCheckRule;
|
|
||||||
import nc.bs.mmpac.pickm.rule.PickmReserveCheckForMoUpdateRule;
|
|
||||||
import nc.bs.mmpac.pickm.rule.PickmSubMoAdjustSuggestRule;
|
|
||||||
import nc.bs.mmpac.pickm.rule.PickmSynBrepairFlagRule;
|
|
||||||
import nc.bs.mmpac.pickm.rule.SNMaterialNotBackFlushRule;
|
|
||||||
import nc.bs.mmpac.pickm.rule.ic.PickmATPCheckRule;
|
import nc.bs.mmpac.pickm.rule.ic.PickmATPCheckRule;
|
||||||
import nc.bs.mmpac.pickm.rule.ic.PickmAutoChangeStateRule;
|
import nc.bs.mmpac.pickm.rule.ic.PickmAutoChangeStateRule;
|
||||||
import nc.bs.mmpac.pickm.rule.ic.PickmAutoReserveRule;
|
import nc.bs.mmpac.pickm.rule.ic.PickmAutoReserveRule;
|
||||||
|
|
@ -24,11 +11,7 @@ import nc.bs.mmpac.pickm.rule.ic.PickmRewriteOtherNumRule;
|
||||||
import nc.bs.mmpac.pickm.rule.realsub.PickmRewritePLOWhenUpdateRule;
|
import nc.bs.mmpac.pickm.rule.realsub.PickmRewritePLOWhenUpdateRule;
|
||||||
import nc.bs.mmpub.rule.MMAutoMaterialAssignRule;
|
import nc.bs.mmpub.rule.MMAutoMaterialAssignRule;
|
||||||
import nc.bs.mmpub.rule.MMVOSagaFrozenValidateRule;
|
import nc.bs.mmpub.rule.MMVOSagaFrozenValidateRule;
|
||||||
import nc.bs.pubapp.pub.rule.BillCodeCheckRule;
|
import nc.bs.pubapp.pub.rule.*;
|
||||||
import nc.bs.pubapp.pub.rule.FieldLengthCheckRule;
|
|
||||||
import nc.bs.pubapp.pub.rule.FillUpdateDataRule;
|
|
||||||
import nc.bs.pubapp.pub.rule.OrgDisabledCheckRule;
|
|
||||||
import nc.bs.pubapp.pub.rule.UpdateBillCodeRule;
|
|
||||||
import nc.bs.uif2.validation.ValidationFailure;
|
import nc.bs.uif2.validation.ValidationFailure;
|
||||||
import nc.bsutil.mmpac.pickm.PickmSagasUtil;
|
import nc.bsutil.mmpac.pickm.PickmSagasUtil;
|
||||||
import nc.impl.pubapp.bd.material.assistant.MarAssistantSaveRule;
|
import nc.impl.pubapp.bd.material.assistant.MarAssistantSaveRule;
|
||||||
|
|
@ -46,6 +29,8 @@ import nc.vo.mmpac.pickm.entity.PickmHeadVO;
|
||||||
import nc.vo.mmpac.pickm.entity.PickmItemVO;
|
import nc.vo.mmpac.pickm.entity.PickmItemVO;
|
||||||
import nc.vo.mmpac.pickm.param.MoChangeParam;
|
import nc.vo.mmpac.pickm.param.MoChangeParam;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 生产订单修改后同步变更备料计划操作
|
* 生产订单修改后同步变更备料计划操作
|
||||||
*
|
*
|
||||||
|
|
@ -225,13 +210,10 @@ public class PickmUpdateForMOBP {
|
||||||
// 配套变更建议
|
// 配套变更建议
|
||||||
ICompareRule<AggPickmVO> subMoAdjustSuggestRule = new PickmSubMoAdjustSuggestRule(this.checkInfo);
|
ICompareRule<AggPickmVO> subMoAdjustSuggestRule = new PickmSubMoAdjustSuggestRule(this.checkInfo);
|
||||||
aroundProcesser.addAfterRule(subMoAdjustSuggestRule);
|
aroundProcesser.addAfterRule(subMoAdjustSuggestRule);
|
||||||
|
|
||||||
|
|
||||||
aroundProcesser.addAfterRule(new AfterupdateSyncEpicMesRule());
|
aroundProcesser.addAfterRule(new AfterupdateSyncEpicMesRule());
|
||||||
|
|
||||||
// 备料计划修改后推送高压IMS
|
// 备料计划修改后推送高压IMS
|
||||||
aroundProcesser.addAfterRule(new AfterApproveRuleHighpressureIms());
|
aroundProcesser.addAfterRule(new AfterApproveRuleHighpressureIms());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,12 +5,9 @@ import nc.bs.dao.BaseDAO;
|
||||||
import nc.bs.dao.DAOException;
|
import nc.bs.dao.DAOException;
|
||||||
import nc.bs.logging.Log;
|
import nc.bs.logging.Log;
|
||||||
import nc.bs.trade.business.HYPubBO;
|
import nc.bs.trade.business.HYPubBO;
|
||||||
|
import nc.bs.uapbd.util.GyImsDbUtil;
|
||||||
import nc.bs.uapbd.util.MyHelper;
|
import nc.bs.uapbd.util.MyHelper;
|
||||||
import nc.impl.pubapp.pattern.rule.IRule;
|
import nc.impl.pubapp.pattern.rule.IRule;
|
||||||
import nc.jdbc.framework.JdbcSession;
|
|
||||||
import nc.jdbc.framework.PersistenceManager;
|
|
||||||
import nc.jdbc.framework.exception.DbException;
|
|
||||||
import nc.jdbc.framework.processor.MapProcessor;
|
|
||||||
import nc.uif.pub.exception.UifException;
|
import nc.uif.pub.exception.UifException;
|
||||||
import nc.vo.mmpac.pickm.entity.AggPickmVO;
|
import nc.vo.mmpac.pickm.entity.AggPickmVO;
|
||||||
import nc.vo.mmpac.pickm.entity.PickmHeadVO;
|
import nc.vo.mmpac.pickm.entity.PickmHeadVO;
|
||||||
|
|
@ -22,8 +19,6 @@ import nc.vo.pub.lang.UFDateTime;
|
||||||
import nc.vo.pubapp.pattern.exception.ExceptionUtils;
|
import nc.vo.pubapp.pattern.exception.ExceptionUtils;
|
||||||
import nc.vo.scmpub.util.ArrayUtil;
|
import nc.vo.scmpub.util.ArrayUtil;
|
||||||
|
|
||||||
import java.sql.Connection;
|
|
||||||
import java.sql.SQLException;
|
|
||||||
import java.sql.Timestamp;
|
import java.sql.Timestamp;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
@ -158,6 +153,7 @@ public class AfterApproveRuleHighpressureIms implements IRule<AggPickmVO> {
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void pushIms(List<Map<String, Object>> mainDataList, List<Map<String, Object>> detailDataList, String targetCpickmid) throws BusinessException {
|
private void pushIms(List<Map<String, Object>> mainDataList, List<Map<String, Object>> detailDataList, String targetCpickmid) throws BusinessException {
|
||||||
// 1. 关键参数校验
|
// 1. 关键参数校验
|
||||||
if (targetCpickmid == null || targetCpickmid.trim().isEmpty()) {
|
if (targetCpickmid == null || targetCpickmid.trim().isEmpty()) {
|
||||||
|
|
@ -165,94 +161,37 @@ public class AfterApproveRuleHighpressureIms implements IRule<AggPickmVO> {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (mainDataList.isEmpty()) {
|
if (mainDataList.isEmpty()) {
|
||||||
logger.warn("备料计划主表数据为空,终止同步,cpickmid:" + targetCpickmid + "");
|
logger.warn("备料计划主表数据为空,终止同步,cpickmid:" + targetCpickmid);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 2. 直接通过静态工厂方法获取 PersistenceManager
|
|
||||||
PersistenceManager pm = null;
|
|
||||||
JdbcSession jdbcSession = null;
|
|
||||||
Connection conn = null;
|
|
||||||
boolean isSuccess = false;
|
|
||||||
|
|
||||||
try {
|
|
||||||
// 直接调用 PersistenceManager 的静态方法 getInstance()
|
|
||||||
pm = PersistenceManager.getInstance("gyims");
|
|
||||||
pm.setAddTimeStamp(false);
|
|
||||||
|
|
||||||
// 2.1 获取 JdbcSession 和 Connection
|
|
||||||
jdbcSession = pm.getJdbcSession();
|
|
||||||
jdbcSession.setSQLTranslator(true); // 保持 SQL 转换
|
|
||||||
conn = jdbcSession.getConnection();
|
|
||||||
conn.setAutoCommit(false);
|
|
||||||
logger.info("直接获取PersistenceManager,手动事务开启,cpickmid:" + targetCpickmid + "");
|
|
||||||
|
|
||||||
// 3. 判断新增/更新 (checkMainExists 方法逻辑不变)
|
// 3. 判断新增/更新 (checkMainExists 方法逻辑不变)
|
||||||
boolean isUpdate = checkMainExists(pm, targetCpickmid);
|
boolean isUpdate = checkMainExists(targetCpickmid);
|
||||||
|
|
||||||
// 4. 执行主表+子表操作 (传入共享的 pm)
|
// 4. 执行主表+子表操作 (传入共享的 pm)
|
||||||
if (isUpdate) {
|
if (isUpdate) {
|
||||||
logger.info("事务内执行更新,cpickmid:" + targetCpickmid + "");
|
updatePlanMain(mainDataList, targetCpickmid);
|
||||||
updatePlanMain(mainDataList, pm, targetCpickmid);
|
|
||||||
if (!detailDataList.isEmpty()) {
|
if (!detailDataList.isEmpty()) {
|
||||||
updatePlanDetail(detailDataList, pm, targetCpickmid);
|
updatePlanDetail(detailDataList, targetCpickmid);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
logger.info("事务内执行新增,cpickmid:" + targetCpickmid + "");
|
insertPlanMain(mainDataList, targetCpickmid);
|
||||||
insertPlanMain(mainDataList, pm, targetCpickmid);
|
|
||||||
if (!detailDataList.isEmpty()) {
|
if (!detailDataList.isEmpty()) {
|
||||||
insertPlanDetail(detailDataList, pm, targetCpickmid);
|
insertPlanDetail(detailDataList, targetCpickmid);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
isSuccess = true;
|
|
||||||
logger.info("事务内操作全部成功,准备提交,cpickmid:" + targetCpickmid + "");
|
|
||||||
|
|
||||||
} catch (DbException | SQLException e) { // 捕获 DbException 和 SQLException
|
|
||||||
logger.error("事务执行失败,触发回滚,cpickmid:" + targetCpickmid + "");
|
|
||||||
if (conn != null) {
|
|
||||||
try {
|
|
||||||
conn.rollback();
|
|
||||||
logger.info("事务回滚完成,cpickmid:" + targetCpickmid + "");
|
|
||||||
} catch (SQLException rollbackE) {
|
|
||||||
logger.error("事务回滚异常,cpickmid:" + targetCpickmid + "");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
throw new BusinessException("备料计划同步事务失败:" + e.getMessage(), e);
|
|
||||||
|
|
||||||
} finally {
|
|
||||||
if (conn != null) {
|
|
||||||
try {
|
|
||||||
if (isSuccess) {
|
|
||||||
conn.commit();
|
|
||||||
logger.info("事务提交成功,cpickmid:" + targetCpickmid + "");
|
|
||||||
}
|
|
||||||
conn.setAutoCommit(true);
|
|
||||||
} catch (SQLException commitE) {
|
|
||||||
logger.error("事务提交异常,cpickmid:" + targetCpickmid + "");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// 5. 释放 PersistenceManager (至关重要)
|
|
||||||
if (pm != null) {
|
|
||||||
try {
|
|
||||||
pm.release(); // 必须调用 release() 将连接归还给连接池
|
|
||||||
logger.info("PersistenceManager 释放完成,cpickmid:" + targetCpickmid + "");
|
|
||||||
} catch (Exception releaseE) {
|
|
||||||
logger.error("PersistenceManager 释放异常", releaseE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 校验主表是否存在(使用共享的 PersistenceManager)
|
* 校验主表是否存在
|
||||||
*/
|
*/
|
||||||
private boolean checkMainExists(PersistenceManager pm, String cpickmid) throws DAOException, DbException {
|
private boolean checkMainExists(String cpickmid) throws BusinessException {
|
||||||
String safeCpickmid = cpickmid.replace("'", "''");
|
String safeCpickmid = cpickmid.replace("'", "''");
|
||||||
String sql = "SELECT cpickmid FROM BIPPlanMainTab WHERE cpickmid = '" + safeCpickmid + "'";
|
String sql = "SELECT cpickmid FROM BIPPlanMainTab WHERE cpickmid = '" + safeCpickmid + "'";
|
||||||
// 使用共享 pm 的 JdbcSession 执行查询,避免新建连接
|
Map<String, Object> existMain = GyImsDbUtil.queryOne(sql);
|
||||||
Map<String, Object> existMain = (Map<String, Object>) pm.getJdbcSession().executeQuery(sql, new MapProcessor());
|
|
||||||
return existMain != null && !existMain.isEmpty();
|
return existMain != null && !existMain.isEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -343,13 +282,12 @@ public class AfterApproveRuleHighpressureIms implements IRule<AggPickmVO> {
|
||||||
// -------------------------- 新增/更新逻辑(提取通用SQL值处理,减少冗余) --------------------------
|
// -------------------------- 新增/更新逻辑(提取通用SQL值处理,减少冗余) --------------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 主表新增(使用共享的 PersistenceManager)
|
* 主表新增
|
||||||
*
|
*
|
||||||
* @param mainDataList 主表数据列表
|
* @param mainDataList 主表数据列表
|
||||||
* @param pm 共享的 PersistenceManager 实例
|
|
||||||
* @param cpickmid 主表业务主键
|
* @param cpickmid 主表业务主键
|
||||||
*/
|
*/
|
||||||
private void insertPlanMain(List<Map<String, Object>> mainDataList, PersistenceManager pm, String cpickmid) throws DAOException, DbException, DbException {
|
private void insertPlanMain(List<Map<String, Object>> mainDataList, String cpickmid) throws BusinessException {
|
||||||
// 1. 构建 SQL(逻辑与原代码一致,仅执行方式改变)
|
// 1. 构建 SQL(逻辑与原代码一致,仅执行方式改变)
|
||||||
String[] mainFields = {
|
String[] mainFields = {
|
||||||
"cpickmid", "pk_org", "vbillcode", "fbillstatus", "vbusitypeid", "vbusitype",
|
"cpickmid", "pk_org", "vbillcode", "fbillstatus", "vbusitypeid", "vbusitype",
|
||||||
|
|
@ -377,25 +315,22 @@ public class AfterApproveRuleHighpressureIms implements IRule<AggPickmVO> {
|
||||||
valuesSb.append("), ");
|
valuesSb.append("), ");
|
||||||
}
|
}
|
||||||
|
|
||||||
// 2. 执行 SQL(使用共享 pm 的 JdbcSession,避免新建连接)
|
if (!valuesSb.isEmpty()) {
|
||||||
if (valuesSb.length() > 0) {
|
|
||||||
String valuesStr = valuesSb.substring(0, valuesSb.length() - 2);
|
String valuesStr = valuesSb.substring(0, valuesSb.length() - 2);
|
||||||
String insertSql = "INSERT INTO BIPPlanMainTab (" + fieldStr + ") VALUES " + valuesStr;
|
String insertSql = "INSERT INTO BIPPlanMainTab (" + fieldStr + ") VALUES " + valuesStr;
|
||||||
|
|
||||||
// 关键:用共享 pm 的 JdbcSession 执行,而非 BaseDAO 的 executeUpdate
|
int rows = GyImsDbUtil.update(insertSql);
|
||||||
int rows = pm.getJdbcSession().executeUpdate(insertSql);
|
logger.error("主表新增成功,cpickmid:" + cpickmid + ",影响行数:" + rows + "");
|
||||||
logger.info("主表新增成功,cpickmid:" + cpickmid + ",影响行数:" + rows + "");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 子表新增(使用共享的 PersistenceManager)
|
* 子表新增
|
||||||
*
|
*
|
||||||
* @param detailDataList 子表数据列表
|
* @param detailDataList 子表数据列表
|
||||||
* @param pm 共享的 PersistenceManager 实例
|
|
||||||
* @param cpickmid 子表业务主键
|
* @param cpickmid 子表业务主键
|
||||||
*/
|
*/
|
||||||
private void insertPlanDetail(List<Map<String, Object>> detailDataList, PersistenceManager pm, String cpickmid) throws DAOException, DbException {
|
private void insertPlanDetail(List<Map<String, Object>> detailDataList, String cpickmid) throws BusinessException {
|
||||||
String[] detailFields = {
|
String[] detailFields = {
|
||||||
"cpickm_bid", "cpickmid", "pk_org", "vbillcode", "vrowno", "fitemtype",
|
"cpickm_bid", "cpickmid", "pk_org", "vbillcode", "vrowno", "fitemtype",
|
||||||
"fitemsource", "cbmaterialvid", "cbunitid", "cbastunitid", "vbchangerate", "nquotastnum",
|
"fitemsource", "cbmaterialvid", "cbunitid", "cbastunitid", "vbchangerate", "nquotastnum",
|
||||||
|
|
@ -416,24 +351,22 @@ public class AfterApproveRuleHighpressureIms implements IRule<AggPickmVO> {
|
||||||
valuesSb.append("), ");
|
valuesSb.append("), ");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (valuesSb.length() > 0) {
|
if (!valuesSb.isEmpty()) {
|
||||||
String valuesStr = valuesSb.substring(0, valuesSb.length() - 2);
|
String valuesStr = valuesSb.substring(0, valuesSb.length() - 2);
|
||||||
String insertSql = "INSERT INTO BIPPlanDetailTab (" + fieldStr + ") VALUES " + valuesStr;
|
String insertSql = "INSERT INTO BIPPlanDetailTab (" + fieldStr + ") VALUES " + valuesStr;
|
||||||
|
|
||||||
// 关键:用共享 pm 的 JdbcSession 执行
|
int rows = GyImsDbUtil.update(insertSql);
|
||||||
int rows = pm.getJdbcSession().executeUpdate(insertSql);
|
logger.error("子表新增成功,子表cpickmid:" + cpickmid + ",影响行数:" + rows);
|
||||||
logger.info("子表新增成功,子表cpickmid:" + cpickmid + ",影响行数:" + rows + "");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 主表更新(使用共享的 PersistenceManager)
|
* 主表更新
|
||||||
*
|
*
|
||||||
* @param mainDataList 主表数据列表
|
* @param mainDataList 主表数据列表
|
||||||
* @param pm 共享的 PersistenceManager 实例
|
|
||||||
* @param cpickmid 主表业务主键
|
* @param cpickmid 主表业务主键
|
||||||
*/
|
*/
|
||||||
private void updatePlanMain(List<Map<String, Object>> mainDataList, PersistenceManager pm, String cpickmid) throws DAOException, DbException {
|
private void updatePlanMain(List<Map<String, Object>> mainDataList, String cpickmid) throws BusinessException {
|
||||||
String[] mainFields = {
|
String[] mainFields = {
|
||||||
"pk_org", "vbillcode", "fbillstatus", "vbusitypeid", "vbusitype",
|
"pk_org", "vbillcode", "fbillstatus", "vbusitypeid", "vbusitype",
|
||||||
"cmaterialvid", "nastnum", "cdeptid", "cdeptvid", "vsalebillcode", "ccustmaterialid",
|
"cmaterialvid", "nastnum", "cdeptid", "cdeptvid", "vsalebillcode", "ccustmaterialid",
|
||||||
|
|
@ -453,27 +386,26 @@ public class AfterApproveRuleHighpressureIms implements IRule<AggPickmVO> {
|
||||||
setSb.append(field).append(" = ").append(SqlValueUtil.processSqlValue(value)).append(", ");
|
setSb.append(field).append(" = ").append(SqlValueUtil.processSqlValue(value)).append(", ");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (setSb.length() > 0) {
|
if (!setSb.isEmpty()) {
|
||||||
String setStr = setSb.substring(0, setSb.length() - 2);
|
String setStr = setSb.substring(0, setSb.length() - 2);
|
||||||
String safeCpickmid = cpickmid.replace("'", "''");
|
String safeCpickmid = cpickmid.replace("'", "''");
|
||||||
String updateSql = "UPDATE BIPPlanMainTab SET " + setStr + " WHERE cpickmid = '" + safeCpickmid + "'";
|
String updateSql = "UPDATE BIPPlanMainTab SET " + setStr + " WHERE cpickmid = '" + safeCpickmid + "'";
|
||||||
|
|
||||||
// 关键:用共享 pm 的 JdbcSession 执行
|
// 关键:用共享 pm 的 JdbcSession 执行
|
||||||
int rows = pm.getJdbcSession().executeUpdate(updateSql);
|
int rows = GyImsDbUtil.update(updateSql);
|
||||||
logger.info("主表更新成功,cpickmid:" + cpickmid + ",影响行数:" + rows + "");
|
logger.error("主表更新成功,cpickmid:" + cpickmid + ",影响行数:" + rows);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 子表更新(使用共享的 PersistenceManager)
|
* 子表更新
|
||||||
*
|
*
|
||||||
* @param detailDataList 子表数据列表
|
* @param detailDataList 子表数据列表
|
||||||
* @param pm 共享的 PersistenceManager 实例
|
|
||||||
* @param cpickmid 子表业务主键
|
* @param cpickmid 子表业务主键
|
||||||
*/
|
*/
|
||||||
private void updatePlanDetail(List<Map<String, Object>> detailDataList, PersistenceManager pm, String cpickmid) throws BusinessException {
|
private void updatePlanDetail(List<Map<String, Object>> detailDataList, String cpickmid) throws BusinessException {
|
||||||
if (detailDataList.isEmpty()) {
|
if (detailDataList.isEmpty()) {
|
||||||
logger.warn("备料计划" + cpickmid + "子表同步数据为空,跳过更新");
|
logger.error("备料计划" + cpickmid + "子表同步数据为空,跳过更新");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -487,7 +419,7 @@ public class AfterApproveRuleHighpressureIms implements IRule<AggPickmVO> {
|
||||||
for (Map<String, Object> detailData : detailDataList) {
|
for (Map<String, Object> detailData : detailDataList) {
|
||||||
String cpickmBid = (String) detailData.get("cpickm_bid");
|
String cpickmBid = (String) detailData.get("cpickm_bid");
|
||||||
if (cpickmBid == null || cpickmBid.trim().isEmpty()) {
|
if (cpickmBid == null || cpickmBid.trim().isEmpty()) {
|
||||||
logger.warn("备料计划" + cpickmid + "子表主键cpickm_bid为空,跳过该子表更新");
|
logger.error("备料计划" + cpickmid + "子表主键cpickm_bid为空,跳过该子表更新");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -499,18 +431,13 @@ public class AfterApproveRuleHighpressureIms implements IRule<AggPickmVO> {
|
||||||
}
|
}
|
||||||
|
|
||||||
// 执行SQL
|
// 执行SQL
|
||||||
if (setSb.length() > 0) {
|
if (!setSb.isEmpty()) {
|
||||||
String setStr = setSb.substring(0, setSb.length() - 2);
|
String setStr = setSb.substring(0, setSb.length() - 2);
|
||||||
String safeBid = cpickmBid.replace("'", "''");
|
String safeBid = cpickmBid.replace("'", "''");
|
||||||
String updateSql = "UPDATE BIPPlanDetailTab SET " + setStr + " WHERE cpickm_bid = '" + safeBid + "'";
|
String updateSql = "UPDATE BIPPlanDetailTab SET " + setStr + " WHERE cpickm_bid = '" + safeBid + "'";
|
||||||
|
|
||||||
// 关键:使用共享的 PersistenceManager 执行 SQL
|
int rows = GyImsDbUtil.update(updateSql);
|
||||||
try {
|
logger.error("子表更新成功,子表主键:" + cpickmBid + ",影响行数:" + rows);
|
||||||
int rows = pm.getJdbcSession().executeUpdate(updateSql);
|
|
||||||
logger.info("子表更新成功,子表主键:" + cpickmBid + ",影响行数:" + rows + "");
|
|
||||||
} catch (DbException e) {
|
|
||||||
throw new BusinessException("子表更新失败,SQL: " + updateSql, e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -518,26 +445,6 @@ public class AfterApproveRuleHighpressureIms implements IRule<AggPickmVO> {
|
||||||
|
|
||||||
// -------------------------- 通用工具方法(提取后复用,减少冗余) --------------------------
|
// -------------------------- 通用工具方法(提取后复用,减少冗余) --------------------------
|
||||||
|
|
||||||
/**
|
|
||||||
* 执行SQL并处理DAO异常
|
|
||||||
*
|
|
||||||
* @param sql SQL语句
|
|
||||||
* @param dao BaseDAO实例
|
|
||||||
* @param operType 操作类型(如"主表新增")
|
|
||||||
* @param bizKey 业务标识(如cpickmid)
|
|
||||||
*/
|
|
||||||
private void executeSql(String sql, BaseDAO dao, String operType, String bizKey) throws BusinessException {
|
|
||||||
try {
|
|
||||||
logger.debug("执行" + operType + "SQL,业务标识:" + bizKey + ",SQL:" + sql + "");
|
|
||||||
int rows = dao.executeUpdate(sql);
|
|
||||||
logger.info("" + operType + "成功,业务标识:" + bizKey + ",影响行数:" + rows + "");
|
|
||||||
} catch (DAOException e) {
|
|
||||||
String errorMsg = operType + "失败,业务标识:" + bizKey + ",SQL:" + sql;
|
|
||||||
logger.error(errorMsg, e);
|
|
||||||
throw new BusinessException(errorMsg, e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 判断是否跳过该组织
|
* 判断是否跳过该组织
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -32,25 +32,11 @@ public class AfterApproveSyncImsRule implements IRule<PMOAggVO> {
|
||||||
private Map<String, String> configParams;
|
private Map<String, String> configParams;
|
||||||
// BIP数据源
|
// BIP数据源
|
||||||
public static final BaseDAO baseDAO = new BaseDAO();
|
public static final BaseDAO baseDAO = new BaseDAO();
|
||||||
// IMS数据源
|
|
||||||
public BaseDAO imsDao;
|
|
||||||
|
|
||||||
public AfterApproveSyncImsRule(String auditFlag) {
|
public AfterApproveSyncImsRule(String auditFlag) {
|
||||||
this.auditFlag = auditFlag;
|
this.auditFlag = auditFlag;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取IMS数据源
|
|
||||||
*/
|
|
||||||
public BaseDAO getImsDao() {
|
|
||||||
if (imsDao == null) {
|
|
||||||
imsDao = new BaseDAO("gyims");
|
|
||||||
// 禁用时间戳ts
|
|
||||||
imsDao.setAddTimeStamp(false);
|
|
||||||
}
|
|
||||||
return imsDao;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 表头-表名
|
// 表头-表名
|
||||||
private static final String HEAD_TABLE = "BIPOrderMainTab";
|
private static final String HEAD_TABLE = "BIPOrderMainTab";
|
||||||
// 表体-表名
|
// 表体-表名
|
||||||
|
|
|
||||||
|
|
@ -1,17 +1,12 @@
|
||||||
package nc.bs.mmpac.pmo.pac0002.bp.rule;
|
package nc.bs.mmpac.pmo.pac0002.bp.rule;
|
||||||
|
|
||||||
import com.alibaba.fastjson.JSONObject;
|
import com.alibaba.fastjson.JSONObject;
|
||||||
import nc.bs.dao.BaseDAO;
|
|
||||||
import nc.bs.dao.DAOException;
|
|
||||||
import nc.bs.framework.common.NCLocator;
|
import nc.bs.framework.common.NCLocator;
|
||||||
import nc.bs.logging.Log;
|
import nc.bs.logging.Log;
|
||||||
import nc.bs.trade.business.HYPubBO;
|
import nc.bs.trade.business.HYPubBO;
|
||||||
|
import nc.bs.uapbd.util.GyImsDbUtil;
|
||||||
import nc.bs.uapbd.util.MyHelper;
|
import nc.bs.uapbd.util.MyHelper;
|
||||||
import nc.impl.pubapp.pattern.rule.IRule;
|
import nc.impl.pubapp.pattern.rule.IRule;
|
||||||
import nc.jdbc.framework.JdbcSession;
|
|
||||||
import nc.jdbc.framework.PersistenceManager;
|
|
||||||
import nc.jdbc.framework.exception.DbException;
|
|
||||||
import nc.jdbc.framework.processor.MapProcessor;
|
|
||||||
import nc.md.model.MetaDataException;
|
import nc.md.model.MetaDataException;
|
||||||
import nc.md.persist.framework.IMDPersistenceQueryService;
|
import nc.md.persist.framework.IMDPersistenceQueryService;
|
||||||
import nc.uif.pub.exception.UifException;
|
import nc.uif.pub.exception.UifException;
|
||||||
|
|
@ -26,8 +21,6 @@ import nc.vo.pub.lang.UFDate;
|
||||||
import nc.vo.pub.lang.UFDateTime;
|
import nc.vo.pub.lang.UFDateTime;
|
||||||
import nc.vo.pubapp.pattern.exception.ExceptionUtils;
|
import nc.vo.pubapp.pattern.exception.ExceptionUtils;
|
||||||
|
|
||||||
import java.sql.Connection;
|
|
||||||
import java.sql.SQLException;
|
|
||||||
import java.sql.Timestamp;
|
import java.sql.Timestamp;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
@ -181,91 +174,34 @@ public class PMOAfterApproveRuleHighpressureIms implements IRule<PMOAggVO> {
|
||||||
logger.warn("备料计划主表数据为空,终止同步,cpickmid:" + targetCpickmid + "");
|
logger.warn("备料计划主表数据为空,终止同步,cpickmid:" + targetCpickmid + "");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 2. 直接通过静态工厂方法获取 PersistenceManager
|
|
||||||
PersistenceManager pm = null;
|
|
||||||
JdbcSession jdbcSession = null;
|
|
||||||
Connection conn = null;
|
|
||||||
boolean isSuccess = false;
|
|
||||||
|
|
||||||
try {
|
|
||||||
// 直接调用 PersistenceManager 的静态方法 getInstance()
|
|
||||||
pm = PersistenceManager.getInstance("gyims");
|
|
||||||
pm.setAddTimeStamp(false);
|
|
||||||
|
|
||||||
// 2.1 获取 JdbcSession 和 Connection
|
|
||||||
jdbcSession = pm.getJdbcSession();
|
|
||||||
jdbcSession.setSQLTranslator(true); // 保持 SQL 转换
|
|
||||||
conn = jdbcSession.getConnection();
|
|
||||||
conn.setAutoCommit(false);
|
|
||||||
logger.info("直接获取PersistenceManager,手动事务开启,cpickmid:" + targetCpickmid + "");
|
|
||||||
|
|
||||||
// 3. 判断新增/更新 (checkMainExists 方法逻辑不变)
|
// 3. 判断新增/更新 (checkMainExists 方法逻辑不变)
|
||||||
boolean isUpdate = checkMainExists(pm, targetCpickmid);
|
boolean isUpdate = checkMainExists(targetCpickmid);
|
||||||
|
|
||||||
// 4. 执行主表+子表操作 (传入共享的 pm)
|
// 4. 执行主表+子表操作 (传入共享的 pm)
|
||||||
if (isUpdate) {
|
if (isUpdate) {
|
||||||
logger.info("事务内执行更新,cpickmid:" + targetCpickmid + "");
|
logger.info("事务内执行更新,cpickmid:" + targetCpickmid + "");
|
||||||
updatePlanMain(mainDataList, pm, targetCpickmid);
|
updatePlanMain(mainDataList, targetCpickmid);
|
||||||
if (!detailDataList.isEmpty()) {
|
if (!detailDataList.isEmpty()) {
|
||||||
updatePlanDetail(detailDataList, pm, targetCpickmid);
|
updatePlanDetail(detailDataList, targetCpickmid);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
logger.info("事务内执行新增,cpickmid:" + targetCpickmid + "");
|
logger.info("事务内执行新增,cpickmid:" + targetCpickmid);
|
||||||
insertPlanMain(mainDataList, pm, targetCpickmid);
|
insertPlanMain(mainDataList, targetCpickmid);
|
||||||
if (!detailDataList.isEmpty()) {
|
if (!detailDataList.isEmpty()) {
|
||||||
insertPlanDetail(detailDataList, pm, targetCpickmid);
|
insertPlanDetail(detailDataList, targetCpickmid);
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
isSuccess = true;
|
|
||||||
logger.info("事务内操作全部成功,准备提交,cpickmid:" + targetCpickmid + "");
|
|
||||||
|
|
||||||
} catch (DbException | SQLException e) { // 捕获 DbException 和 SQLException
|
|
||||||
logger.error("事务执行失败,触发回滚,cpickmid:" + targetCpickmid + "");
|
|
||||||
if (conn != null) {
|
|
||||||
try {
|
|
||||||
conn.rollback();
|
|
||||||
logger.info("事务回滚完成,cpickmid:" + targetCpickmid + "");
|
|
||||||
} catch (SQLException rollbackE) {
|
|
||||||
logger.error("事务回滚异常,cpickmid:" + targetCpickmid + "");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
throw new BusinessException("备料计划同步事务失败:" + e.getMessage(), e);
|
|
||||||
|
|
||||||
} finally {
|
|
||||||
if (conn != null) {
|
|
||||||
try {
|
|
||||||
if (isSuccess) {
|
|
||||||
conn.commit();
|
|
||||||
logger.info("事务提交成功,cpickmid:" + targetCpickmid + "");
|
|
||||||
}
|
|
||||||
conn.setAutoCommit(true);
|
|
||||||
} catch (SQLException commitE) {
|
|
||||||
logger.error("事务提交异常,cpickmid:" + targetCpickmid + "");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// 5. 释放 PersistenceManager (至关重要)
|
|
||||||
if (pm != null) {
|
|
||||||
try {
|
|
||||||
pm.release(); // 必须调用 release() 将连接归还给连接池
|
|
||||||
logger.info("PersistenceManager 释放完成,cpickmid:" + targetCpickmid + "");
|
|
||||||
} catch (Exception releaseE) {
|
|
||||||
logger.error("PersistenceManager 释放异常", releaseE);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 校验主表是否存在(使用共享的 PersistenceManager)
|
* 校验主表是否存在
|
||||||
*/
|
*/
|
||||||
private boolean checkMainExists(PersistenceManager pm, String cpickmid) throws DAOException, DbException {
|
private boolean checkMainExists(String cpickmid) throws BusinessException {
|
||||||
String safeCpickmid = cpickmid.replace("'", "''");
|
String safeCpickmid = cpickmid.replace("'", "''");
|
||||||
String sql = "SELECT cpickmid FROM BIPPlanMainTab WHERE cpickmid = '" + safeCpickmid + "'";
|
String sql = "SELECT cpickmid FROM BIPPlanMainTab WHERE cpickmid = '" + safeCpickmid + "'";
|
||||||
// 使用共享 pm 的 JdbcSession 执行查询,避免新建连接
|
// 使用共享 pm 的 JdbcSession 执行查询,避免新建连接
|
||||||
Map<String, Object> existMain = (Map<String, Object>) pm.getJdbcSession().executeQuery(sql, new MapProcessor());
|
Map<String, Object> existMain = GyImsDbUtil.queryOne(sql);
|
||||||
return existMain != null && !existMain.isEmpty();
|
return existMain != null && !existMain.isEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -356,13 +292,12 @@ public class PMOAfterApproveRuleHighpressureIms implements IRule<PMOAggVO> {
|
||||||
// -------------------------- 新增/更新逻辑(提取通用SQL值处理,减少冗余) --------------------------
|
// -------------------------- 新增/更新逻辑(提取通用SQL值处理,减少冗余) --------------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 主表新增(使用共享的 PersistenceManager)
|
* 主表新增
|
||||||
*
|
*
|
||||||
* @param mainDataList 主表数据列表
|
* @param mainDataList 主表数据列表
|
||||||
* @param pm 共享的 PersistenceManager 实例
|
|
||||||
* @param cpickmid 主表业务主键
|
* @param cpickmid 主表业务主键
|
||||||
*/
|
*/
|
||||||
private void insertPlanMain(List<Map<String, Object>> mainDataList, PersistenceManager pm, String cpickmid) throws DAOException, DbException, DbException {
|
private void insertPlanMain(List<Map<String, Object>> mainDataList, String cpickmid) throws BusinessException {
|
||||||
// 1. 构建 SQL(逻辑与原代码一致,仅执行方式改变)
|
// 1. 构建 SQL(逻辑与原代码一致,仅执行方式改变)
|
||||||
String[] mainFields = {
|
String[] mainFields = {
|
||||||
"cpickmid", "pk_org", "vbillcode", "fbillstatus", "vbusitypeid", "vbusitype",
|
"cpickmid", "pk_org", "vbillcode", "fbillstatus", "vbusitypeid", "vbusitype",
|
||||||
|
|
@ -395,20 +330,18 @@ public class PMOAfterApproveRuleHighpressureIms implements IRule<PMOAggVO> {
|
||||||
String valuesStr = valuesSb.substring(0, valuesSb.length() - 2);
|
String valuesStr = valuesSb.substring(0, valuesSb.length() - 2);
|
||||||
String insertSql = "INSERT INTO BIPPlanMainTab (" + fieldStr + ") VALUES " + valuesStr;
|
String insertSql = "INSERT INTO BIPPlanMainTab (" + fieldStr + ") VALUES " + valuesStr;
|
||||||
|
|
||||||
// 关键:用共享 pm 的 JdbcSession 执行,而非 BaseDAO 的 executeUpdate
|
int rows = GyImsDbUtil.update(insertSql);
|
||||||
int rows = pm.getJdbcSession().executeUpdate(insertSql);
|
logger.error("主表新增成功,cpickmid:" + cpickmid + ",影响行数:" + rows);
|
||||||
logger.info("主表新增成功,cpickmid:" + cpickmid + ",影响行数:" + rows + "");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 子表新增(使用共享的 PersistenceManager)
|
* 子表新增
|
||||||
*
|
*
|
||||||
* @param detailDataList 子表数据列表
|
* @param detailDataList 子表数据列表
|
||||||
* @param pm 共享的 PersistenceManager 实例
|
|
||||||
* @param cpickmid 子表业务主键
|
* @param cpickmid 子表业务主键
|
||||||
*/
|
*/
|
||||||
private void insertPlanDetail(List<Map<String, Object>> detailDataList, PersistenceManager pm, String cpickmid) throws DAOException, DbException {
|
private void insertPlanDetail(List<Map<String, Object>> detailDataList, String cpickmid) throws BusinessException {
|
||||||
String[] detailFields = {
|
String[] detailFields = {
|
||||||
"cpickm_bid", "cpickmid", "pk_org", "vbillcode", "vrowno", "fitemtype",
|
"cpickm_bid", "cpickmid", "pk_org", "vbillcode", "vrowno", "fitemtype",
|
||||||
"fitemsource", "cbmaterialvid", "cbunitid", "cbastunitid", "vbchangerate", "nquotastnum",
|
"fitemsource", "cbmaterialvid", "cbunitid", "cbastunitid", "vbchangerate", "nquotastnum",
|
||||||
|
|
@ -434,19 +367,18 @@ public class PMOAfterApproveRuleHighpressureIms implements IRule<PMOAggVO> {
|
||||||
String insertSql = "INSERT INTO BIPPlanDetailTab (" + fieldStr + ") VALUES " + valuesStr;
|
String insertSql = "INSERT INTO BIPPlanDetailTab (" + fieldStr + ") VALUES " + valuesStr;
|
||||||
|
|
||||||
// 关键:用共享 pm 的 JdbcSession 执行
|
// 关键:用共享 pm 的 JdbcSession 执行
|
||||||
int rows = pm.getJdbcSession().executeUpdate(insertSql);
|
int rows = GyImsDbUtil.update(insertSql);
|
||||||
logger.info("子表新增成功,子表cpickmid:" + cpickmid + ",影响行数:" + rows + "");
|
logger.info("子表新增成功,子表cpickmid:" + cpickmid + ",影响行数:" + rows + "");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 主表更新(使用共享的 PersistenceManager)
|
* 主表更新
|
||||||
*
|
*
|
||||||
* @param mainDataList 主表数据列表
|
* @param mainDataList 主表数据列表
|
||||||
* @param pm 共享的 PersistenceManager 实例
|
|
||||||
* @param cpickmid 主表业务主键
|
* @param cpickmid 主表业务主键
|
||||||
*/
|
*/
|
||||||
private void updatePlanMain(List<Map<String, Object>> mainDataList, PersistenceManager pm, String cpickmid) throws DAOException, DbException {
|
private void updatePlanMain(List<Map<String, Object>> mainDataList, String cpickmid) throws BusinessException {
|
||||||
String[] mainFields = {
|
String[] mainFields = {
|
||||||
"pk_org", "vbillcode", "fbillstatus", "vbusitypeid", "vbusitype",
|
"pk_org", "vbillcode", "fbillstatus", "vbusitypeid", "vbusitype",
|
||||||
"cmaterialvid", "nastnum", "cdeptid", "cdeptvid", "vsalebillcode", "ccustmaterialid",
|
"cmaterialvid", "nastnum", "cdeptid", "cdeptvid", "vsalebillcode", "ccustmaterialid",
|
||||||
|
|
@ -466,25 +398,24 @@ public class PMOAfterApproveRuleHighpressureIms implements IRule<PMOAggVO> {
|
||||||
setSb.append(field).append(" = ").append(SqlValueUtil.processSqlValue(value)).append(", ");
|
setSb.append(field).append(" = ").append(SqlValueUtil.processSqlValue(value)).append(", ");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (setSb.length() > 0) {
|
if (!setSb.isEmpty()) {
|
||||||
String setStr = setSb.substring(0, setSb.length() - 2);
|
String setStr = setSb.substring(0, setSb.length() - 2);
|
||||||
String safeCpickmid = cpickmid.replace("'", "''");
|
String safeCpickmid = cpickmid.replace("'", "''");
|
||||||
String updateSql = "UPDATE BIPPlanMainTab SET " + setStr + " WHERE cpickmid = '" + safeCpickmid + "'";
|
String updateSql = "UPDATE BIPPlanMainTab SET " + setStr + " WHERE cpickmid = '" + safeCpickmid + "'";
|
||||||
|
|
||||||
// 关键:用共享 pm 的 JdbcSession 执行
|
// 关键:用共享 pm 的 JdbcSession 执行
|
||||||
int rows = pm.getJdbcSession().executeUpdate(updateSql);
|
int rows = GyImsDbUtil.update(updateSql);
|
||||||
logger.info("主表更新成功,cpickmid:" + cpickmid + ",影响行数:" + rows + "");
|
logger.error("主表更新成功,cpickmid:" + cpickmid + ",影响行数:" + rows);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 子表更新(使用共享的 PersistenceManager)
|
* 子表更新
|
||||||
*
|
*
|
||||||
* @param detailDataList 子表数据列表
|
* @param detailDataList 子表数据列表
|
||||||
* @param pm 共享的 PersistenceManager 实例
|
|
||||||
* @param cpickmid 子表业务主键
|
* @param cpickmid 子表业务主键
|
||||||
*/
|
*/
|
||||||
private void updatePlanDetail(List<Map<String, Object>> detailDataList, PersistenceManager pm, String cpickmid) throws BusinessException {
|
private void updatePlanDetail(List<Map<String, Object>> detailDataList, String cpickmid) throws BusinessException {
|
||||||
if (detailDataList.isEmpty()) {
|
if (detailDataList.isEmpty()) {
|
||||||
logger.warn("备料计划" + cpickmid + "子表同步数据为空,跳过更新");
|
logger.warn("备料计划" + cpickmid + "子表同步数据为空,跳过更新");
|
||||||
return;
|
return;
|
||||||
|
|
@ -512,18 +443,13 @@ public class PMOAfterApproveRuleHighpressureIms implements IRule<PMOAggVO> {
|
||||||
}
|
}
|
||||||
|
|
||||||
// 执行SQL
|
// 执行SQL
|
||||||
if (setSb.length() > 0) {
|
if (!setSb.isEmpty()) {
|
||||||
String setStr = setSb.substring(0, setSb.length() - 2);
|
String setStr = setSb.substring(0, setSb.length() - 2);
|
||||||
String safeBid = cpickmBid.replace("'", "''");
|
String safeBid = cpickmBid.replace("'", "''");
|
||||||
String updateSql = "UPDATE BIPPlanDetailTab SET " + setStr + " WHERE cpickm_bid = '" + safeBid + "'";
|
String updateSql = "UPDATE BIPPlanDetailTab SET " + setStr + " WHERE cpickm_bid = '" + safeBid + "'";
|
||||||
|
|
||||||
// 关键:使用共享的 PersistenceManager 执行 SQL
|
int rows = GyImsDbUtil.update(updateSql);
|
||||||
try {
|
logger.error("子表更新成功,子表主键:" + cpickmBid + ",影响行数:" + rows);
|
||||||
int rows = pm.getJdbcSession().executeUpdate(updateSql);
|
|
||||||
logger.info("子表更新成功,子表主键:" + cpickmBid + ",影响行数:" + rows + "");
|
|
||||||
} catch (DbException e) {
|
|
||||||
throw new BusinessException("子表更新失败,SQL: " + updateSql, e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -531,26 +457,6 @@ public class PMOAfterApproveRuleHighpressureIms implements IRule<PMOAggVO> {
|
||||||
|
|
||||||
// -------------------------- 通用工具方法(提取后复用,减少冗余) --------------------------
|
// -------------------------- 通用工具方法(提取后复用,减少冗余) --------------------------
|
||||||
|
|
||||||
/**
|
|
||||||
* 执行SQL并处理DAO异常
|
|
||||||
*
|
|
||||||
* @param sql SQL语句
|
|
||||||
* @param dao BaseDAO实例
|
|
||||||
* @param operType 操作类型(如"主表新增")
|
|
||||||
* @param bizKey 业务标识(如cpickmid)
|
|
||||||
*/
|
|
||||||
private void executeSql(String sql, BaseDAO dao, String operType, String bizKey) throws BusinessException {
|
|
||||||
try {
|
|
||||||
logger.debug("执行" + operType + "SQL,业务标识:" + bizKey + ",SQL:" + sql + "");
|
|
||||||
int rows = dao.executeUpdate(sql);
|
|
||||||
logger.info("" + operType + "成功,业务标识:" + bizKey + ",影响行数:" + rows + "");
|
|
||||||
} catch (DAOException e) {
|
|
||||||
String errorMsg = operType + "失败,业务标识:" + bizKey + ",SQL:" + sql;
|
|
||||||
logger.error(errorMsg, e);
|
|
||||||
throw new BusinessException(errorMsg, e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 判断是否跳过该组织
|
* 判断是否跳过该组织
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue