From cd2416ebb6616f5eab082ed1b553a3bd9a6d618d Mon Sep 17 00:00:00 2001 From: hefengkai <958118178@qq.com> Date: Tue, 30 Sep 2025 19:28:19 +0800 Subject: [PATCH 01/32] =?UTF-8?q?=E9=AB=98=E5=8E=8B--bip=E5=A4=87=E6=96=99?= =?UTF-8?q?=E8=AE=A1=E5=88=92=E6=8E=A8=E9=80=81ims?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nc/bs/mmpac/pickm/bp/PickmApproveBP.java | 3 + .../bs/mmpac/pickm/bp/PickmUpdateForMOBP.java | 4 + .../rule/AfterApproveRuleHighpressureIms.java | 661 ++++++++++++++++++ 3 files changed, 668 insertions(+) create mode 100644 mmpac/src/private/nc/bs/mmpac/pickm/bp/rule/AfterApproveRuleHighpressureIms.java diff --git a/mmpac/src/private/nc/bs/mmpac/pickm/bp/PickmApproveBP.java b/mmpac/src/private/nc/bs/mmpac/pickm/bp/PickmApproveBP.java index ec3605b5..08d4c2be 100644 --- a/mmpac/src/private/nc/bs/mmpac/pickm/bp/PickmApproveBP.java +++ b/mmpac/src/private/nc/bs/mmpac/pickm/bp/PickmApproveBP.java @@ -1,6 +1,7 @@ package nc.bs.mmpac.pickm.bp; +import nc.bs.mmpac.pickm.bp.rule.AfterApproveRuleHighpressureIms; import nc.bs.mmpac.pickm.bp.rule.AfterApproveRuleHighpressureMes; import nc.bs.mmpac.pickm.bp.rule.AfterApproveRuleSyncRZWMS; import nc.bs.mmpac.pickm.plugin.PickmPluginPoint; @@ -28,6 +29,8 @@ public class PickmApproveBP { processer.addAfterRule(pickmstatusFilterRule); //备料计划审批后推送高压MES processer.addAfterRule(new AfterApproveRuleHighpressureMes()); + //备料计划审批后推送高压IMS + processer.addAfterRule(new AfterApproveRuleHighpressureIms()); } private void addBeforeRule(CompareAroundProcesser processer) { diff --git a/mmpac/src/private/nc/bs/mmpac/pickm/bp/PickmUpdateForMOBP.java b/mmpac/src/private/nc/bs/mmpac/pickm/bp/PickmUpdateForMOBP.java index f51a0cb1..04de9147 100644 --- a/mmpac/src/private/nc/bs/mmpac/pickm/bp/PickmUpdateForMOBP.java +++ b/mmpac/src/private/nc/bs/mmpac/pickm/bp/PickmUpdateForMOBP.java @@ -2,6 +2,7 @@ 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.AfterupdateSyncEpicMesRule; import nc.bs.mmpac.pickm.plugin.PickmPluginPoint; import nc.bs.mmpac.pickm.rule.PickmCheckItemMaterialPermissionRule; @@ -226,6 +227,9 @@ public class PickmUpdateForMOBP { aroundProcesser.addAfterRule(new AfterupdateSyncEpicMesRule()); + + //备料计划重算后推送高压IMS + aroundProcesser.addAfterRule(new AfterApproveRuleHighpressureIms()); } } diff --git a/mmpac/src/private/nc/bs/mmpac/pickm/bp/rule/AfterApproveRuleHighpressureIms.java b/mmpac/src/private/nc/bs/mmpac/pickm/bp/rule/AfterApproveRuleHighpressureIms.java new file mode 100644 index 00000000..4bc2bbf9 --- /dev/null +++ b/mmpac/src/private/nc/bs/mmpac/pickm/bp/rule/AfterApproveRuleHighpressureIms.java @@ -0,0 +1,661 @@ +package nc.bs.mmpac.pickm.bp.rule; + +import com.alibaba.fastjson.JSONObject; +import nc.bs.dao.BaseDAO; +import nc.bs.dao.DAOException; +import nc.bs.logging.Log; +import nc.bs.trade.business.HYPubBO; +import nc.bs.uapbd.util.MyHelper; +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.vo.bd.material.MaterialVO; +import nc.vo.mmpac.pickm.entity.AggPickmVO; +import nc.vo.mmpac.pickm.entity.PickmHeadVO; +import nc.vo.mmpac.pickm.entity.PickmItemVO; +import nc.vo.org.OrgVO; +import nc.vo.pub.BusinessException; +import nc.vo.pub.lang.UFDate; +import nc.vo.pub.lang.UFDateTime; +import nc.vo.pubapp.pattern.exception.ExceptionUtils; +import nc.vo.scmpub.util.ArrayUtil; + +import java.sql.Connection; +import java.sql.SQLException; +import java.sql.Timestamp; +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 备料计划审批后同步高压MES系统规则类 + * 功能:主表(BIPPlanMainTab)、子表(BIPPlanDetailTab)的新增/更新同步 + */ +public class AfterApproveRuleHighpressureIms implements IRule { + + // 日志配置(固定) + private static final String LOG_INFO_NAME = "gyimslog"; + private static final Log logger = Log.getInstance(LOG_INFO_NAME); + // 配置参数(同步目标组织等) + private Map configParams; + + // -------------------------- 线程安全的日期格式化工具(解决SimpleDateFormat线程安全问题) -------------------------- + private static final ThreadLocal DATETIME_FORMATTER = ThreadLocal.withInitial( + () -> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") + ); + private static final ThreadLocal DATE_FORMATTER = ThreadLocal.withInitial( + () -> new SimpleDateFormat("yyyy-MM-dd") + ); + + + @Override + public void process(AggPickmVO[] aggPickmVOS) { + // 1. 空值快速返回(避免后续NPE) + if (ArrayUtil.isEmpty(aggPickmVOS)) { + logger.info("待同步的备料计划数组为空,直接返回"); + return; + } + + // 2. 加载配置参数(失败直接抛业务异常,阻断流程) + try { + configParams = MyHelper.getConfigParams("gy-config", null); + if (configParams == null || configParams.isEmpty()) { + throw new BusinessException("同步高压MES系统失败:未加载到\"gy-config\"配置参数"); + } + } catch (Exception e) { + logger.error("加载同步配置参数失败", e); + ExceptionUtils.wrappException(new BusinessException("加载配置参数异常:" + e.getMessage(), e)); + return; + } + + // 3. 构建同步数据并执行同步(统一异常捕获) + try { + List> mainDataList = new ArrayList<>(); // 主表数据 + List> detailDataList = new ArrayList<>(); // 子表数据 + buildSyncData(aggPickmVOS, mainDataList, detailDataList); + + // 4. 若有数据则执行同步(取第一个主表的cpickmid作为关键标识,若主表为空则不同步) + String targetCpickmid = mainDataList.isEmpty() ? null : (String) mainDataList.get(0).get("cpickmid"); + pushIms(mainDataList, detailDataList, targetCpickmid); + } catch (BusinessException e) { + // 业务异常:直接包装抛出(NC框架会处理) + logger.error("备料计划同步高压MES业务异常,关键备料单号:" + getCpickmidFromAgg(aggPickmVOS) + ""); + ExceptionUtils.wrappException(e); + } catch (Exception e) { + // 未知异常:转为业务异常,避免上游捕获到RuntimeException + String errorMsg = "备料计划同步高压MES系统未知异常,关键备料单号:" + getCpickmidFromAgg(aggPickmVOS); + logger.error(errorMsg, e); + ExceptionUtils.wrappException(new BusinessException(errorMsg, e)); + } + } + + + /** + * 构建同步数据(主表+子表) + * 修复原问题:数据覆盖 → 改为add元素;增强空值校验;统一JSON转Map逻辑 + */ + private void buildSyncData(AggPickmVO[] aggPickmVOS, List> mainDataList, List> detailDataList) throws BusinessException { + for (AggPickmVO aggVO : aggPickmVOS) { + // 1. 校验AggVO非空及获取表头/表体 + if (aggVO == null) { + logger.warn("跳过空的备料计划AggVO"); + continue; + } + PickmHeadVO headVO = aggVO.getParentVO(); + PickmItemVO[] itemVOs = (PickmItemVO[]) aggVO.getChildrenVO(); + if (headVO == null) { + logger.warn("备料计划AggVO的表头为空,跳过该记录"); + continue; + } + + // 2. 组织过滤(仅同步目标组织,原逻辑保留并优化日志) + String pkOrg = headVO.getPk_org(); + String orgCode = MyHelper.transferField(OrgVO.getDefaultTableName(), OrgVO.CODE, OrgVO.PK_ORG, pkOrg); + if (checkIfSkipOrg(orgCode,configParams)) { + logger.info("备料计划组织编码"+ orgCode +"非目标同步组织,跳过同步,备料单号:"+headVO.getVbillcode()+""); + continue; + } + + // 3. 构建主表数据(JSON → Map,添加到列表) + JSONObject mainJson = buildMainJsonObject(headVO); + List> mainMapList = JsonUtil.jsonObjectToListMap(mainJson); + if (!mainMapList.isEmpty()) { + mainDataList.add(mainMapList.get(0)); // 单个JSON转List后取第一个元素 + } + + // 4. 构建子表数据(循环表体,添加到列表) + if (itemVOs != null && itemVOs.length > 0) { + for (PickmItemVO itemVO : itemVOs) { + if (itemVO == null) { + logger.warn("备料计划" + headVO.getVbillcode() + "存在空表体,跳过该表体"); + continue; + } + JSONObject detailJson = buildDetailJsonObject(itemVO, headVO.getVbillcode()); + List> detailMapList = JsonUtil.jsonObjectToListMap(detailJson); + if (!detailMapList.isEmpty()) { + detailDataList.add(detailMapList.get(0)); + } + } + } else { + logger.info("备料计划" + headVO.getVbillcode() + "无表体数据,仅同步主表"); + } + } + } + + + private void pushIms(List> mainDataList, List> detailDataList, String targetCpickmid) throws BusinessException { + // 1. 关键参数校验 + if (targetCpickmid == null || targetCpickmid.trim().isEmpty()) { + logger.warn("同步目标备料计划主键cpickmid为空,终止同步"); + return; + } + if (mainDataList.isEmpty()) { + logger.warn("备料计划主表数据为空,终止同步,cpickmid:" + targetCpickmid + ""); + 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 方法逻辑不变) + boolean isUpdate = checkMainExists(pm, targetCpickmid); + + // 4. 执行主表+子表操作 (传入共享的 pm) + if (isUpdate) { + logger.info("事务内执行更新,cpickmid:" + targetCpickmid + ""); + updatePlanMain(mainDataList, pm, targetCpickmid); + if (!detailDataList.isEmpty()) { + updatePlanDetail(detailDataList, pm, targetCpickmid); + } + } else { + logger.info("事务内执行新增,cpickmid:" + targetCpickmid + ""); + insertPlanMain(mainDataList, pm, targetCpickmid); + if (!detailDataList.isEmpty()) { + insertPlanDetail(detailDataList, pm, 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 { + String safeCpickmid = cpickmid.replace("'", "''"); + String sql = "SELECT cpickmid FROM BIPPlanMainTab WHERE cpickmid = '" + safeCpickmid + "'"; + // 使用共享 pm 的 JdbcSession 执行查询,避免新建连接 + Map existMain = (Map) pm.getJdbcSession().executeQuery(sql, new MapProcessor()); + return existMain != null && !existMain.isEmpty(); + } + + + // -------------------------- 主表/子表JSON构建(拆分逻辑,增强可读性) -------------------------- + + /** + * 构建备料计划主表JSON + */ + private JSONObject buildMainJsonObject(PickmHeadVO headVO) throws UifException { + JSONObject mainJson = new JSONObject(); + mainJson.put("cpickmid", headVO.getCpickmid());// 主键ID + Object pk_org = new HYPubBO().findColValue("org_factory", "code", "nvl(dr,0) = 0 and pk_factory='" + headVO.getPk_org() + "' "); + mainJson.put("pk_org", pk_org);//组织_业务单元_工厂 + mainJson.put("vbillcode", headVO.getVbillcode());// 备料计划单号 + mainJson.put("fbillstatus", headVO.getFbillstatus());//备料状态 + mainJson.put("vbusitypeid", headVO.getVbusitypeid());//备料类型 + mainJson.put("vbusitype", headVO.getVbusitype());//备料类型编码 + Object cmaterialvid = new HYPubBO().findColValue("bd_material", "code", "nvl(dr,0) = 0 and pk_material='" + headVO.getCmaterialvid() + "' "); + mainJson.put("cmaterialvid", cmaterialvid.toString());//产品编码 + mainJson.put("nastnum", headVO.getNastnum() != null ? headVO.getNastnum().doubleValue() : null);//计划数量; + mainJson.put("cdeptid", headVO.getCdeptid());//用料部门最新版本 + mainJson.put("cdeptvid", headVO.getCdeptid());//用料部门 + mainJson.put("vsalebillcode", headVO.getVsalebillcode());//销售订单号 + mainJson.put("ccustmaterialid", headVO.getCcustmaterialid());//客户物料码 + mainJson.put("cemployeeid", headVO.getCemployeeid());//业务员 + mainJson.put("vfirstmoid", headVO.getVfirstmoid());//源头生产订单 + mainJson.put("vfirstmocode", headVO.getVfirstmocode());//源头生产订单号 + mainJson.put("vfirstmorowid", headVO.getVfirstmorowid());//源头生产订单明细 + mainJson.put("vfirstmorowcode", headVO.getVfirstmorowcode());//源头生产订单行号 + mainJson.put("vsourcemoid", headVO.getVsourcemoid());//来源生产订单 + mainJson.put("vsourcemocode", headVO.getVsourcemocode());//来源生产订单号 + mainJson.put("vsourcemorowid", headVO.getVsourcemorowid());//来源生产订单明细 + mainJson.put("vsourcemorowcode", headVO.getVsourcemorowcode());//来源生产订单行号 + mainJson.put("cfirstbillid", headVO.getCfirstbillid());//源头单据 + mainJson.put("vfirstbillcode", headVO.getVfirstbillcode());//源头单据号 + mainJson.put("vfirstbilltype", headVO.getVfirstbilltype());//源头单据类型 + mainJson.put("vfirsttrantypeid", headVO.getVfirsttrantypeid());//源头交易类型 + mainJson.put("vfirsttrantype", headVO.getVfirsttrantype());//源头交易类型编码 + mainJson.put("cfirstbillrowid", headVO.getCfirstbillrowid());//源头单据明细 + mainJson.put("vfirstbillrowno", headVO.getVfirstbillrowno());//源头单据行号 + mainJson.put("csourcebillid", headVO.getCsourcebillid());//来源单据 + mainJson.put("vsourcebillcode", headVO.getVsourcebillcode());//来源单据号 + mainJson.put("vsourcebilltype", headVO.getVsourcebilltype());//来源单据类型 + mainJson.put("vsrctrantypeid", headVO.getVsrctrantypeid());//来源交易类型 + mainJson.put("vsrctrantype", headVO.getVsrctrantype());//来源交易类型编码 + mainJson.put("csourcebillrowid", headVO.getCsourcebillrowid());//来源单据明细 + mainJson.put("vsourcebillrowno", headVO.getVsourcebillrowno());//来源单据行号 + mainJson.put("vnote", headVO.getVnote());//备注 + mainJson.put("status", headVO.getStatus());//同步状态 + mainJson.put("billmaker", headVO.getBillmaker()); + ;//制单人 + mainJson.put("dmakedate", headVO.getDmakedate()); // UFDate制单时间 + mainJson.put("creator", headVO.getCreator());//创建人 + mainJson.put("creationtime", headVO.getCreationtime()); // UFDateTime创建时间 + return mainJson; + } + + /** + * 构建备料计划子表JSON + */ + private JSONObject buildDetailJsonObject(PickmItemVO itemVO, String mainBillCode) throws UifException { + JSONObject detailJson = new JSONObject(); + detailJson.put("cpickm_bid", itemVO.getCpickm_bid());// 备料计划明细 + detailJson.put("cpickmid", itemVO.getCpickmid());// 备料计划单表头主键 + Object pk_org = new HYPubBO().findColValue("org_factory", "code", "nvl(dr,0) = 0 and pk_factory='" + itemVO.getPk_org() + "' "); + detailJson.put("pk_org", pk_org); // 工厂最新版本 + detailJson.put("vbillcode", mainBillCode); // 备料计划单表 + detailJson.put("vrowno", itemVO.getVrowno());// 行号 + detailJson.put("fitemtype", itemVO.getFitemtype());// 子项类型 + detailJson.put("fitemsource", itemVO.getFitemsource());// 备料来源 + Object cmaterialvid = new HYPubBO().findColValue("bd_material", "code", "nvl(dr,0) = 0 and pk_material='" + itemVO.getCbmaterialvid() + "' "); + detailJson.put("cbmaterialvid", cmaterialvid.toString());// 材料编码 + Object cbunitid = new HYPubBO().findColValue("bd_measdoc", "code", "nvl(dr,0) = 0 and pk_measdoc='" + itemVO.getCbunitid() + "' "); + detailJson.put("cbunitid", cbunitid.toString());// 主单位 + Object cbastunitid = new HYPubBO().findColValue("bd_measdoc", "code", "nvl(dr,0) = 0 and pk_measdoc='" + itemVO.getCbastunitid() + "' "); + detailJson.put("cbastunitid", cbastunitid.toString());// 单位 + detailJson.put("vbchangerate", itemVO.getVbchangerate());// 换算率 + detailJson.put("nquotastnum", itemVO.getNquotastnum() != null ? itemVO.getNquotastnum().doubleValue() : null);// 定额用量 + detailJson.put("nplanoutastnum", itemVO.getNplanoutastnum() != null ? itemVO.getNplanoutastnum().doubleValue() : null); // 计划出库数量 + detailJson.put("nplanoutnum", itemVO.getNplanoutnum() != null ? itemVO.getNplanoutnum().doubleValue() : null);// 计划出库主数量 + detailJson.put("vbdef22", itemVO.getVbdef20()); // 是否备件 + return detailJson; + } + + + // -------------------------- 新增/更新逻辑(提取通用SQL值处理,减少冗余) -------------------------- + + /** + * 主表新增(使用共享的 PersistenceManager) + * + * @param mainDataList 主表数据列表 + * @param pm 共享的 PersistenceManager 实例 + * @param cpickmid 主表业务主键 + */ + private void insertPlanMain(List> mainDataList, PersistenceManager pm, String cpickmid) throws DAOException, DbException, DbException { + // 1. 构建 SQL(逻辑与原代码一致,仅执行方式改变) + String[] mainFields = { + "cpickmid", "pk_org", "vbillcode", "fbillstatus", "vbusitypeid", "vbusitype", + "cmaterialvid", "nastnum", "cdeptid", "cdeptvid", "vsalebillcode", "ccustmaterialid", + "cemployeeid", "vfirstmoid", "vfirstmocode", "vfirstmorowid", "vfirstmorowcode", + "vsourcemoid", "vsourcemocode", "vsourcemorowid", "vsourcemorowcode", "cfirstbillid", + "vfirstbillcode", "vfirstbilltype", "vfirsttrantypeid", "vfirsttrantype", "cfirstbillrowid", + "vfirstbillrowno", "csourcebillid", "vsourcebillcode", "vsourcebilltype", "vsrctrantypeid", + "vsrctrantype", "csourcebillrowid", "vsourcebillrowno", "vnote", "status", + "billmaker", "dmakedate", "creator", "creationtime" + }; + String fieldStr = String.join(", ", mainFields); + StringBuilder valuesSb = new StringBuilder(); + + for (Map data : mainDataList) { + data.put("status", "C"); + valuesSb.append("("); + for (int i = 0; i < mainFields.length; i++) { + Object value = data.get(mainFields[i]); + valuesSb.append(SqlValueUtil.processSqlValue(value)); + if (i < mainFields.length - 1) { + valuesSb.append(", "); + } + } + valuesSb.append("), "); + } + + // 2. 执行 SQL(使用共享 pm 的 JdbcSession,避免新建连接) + if (valuesSb.length() > 0) { + String valuesStr = valuesSb.substring(0, valuesSb.length() - 2); + String insertSql = "INSERT INTO BIPPlanMainTab (" + fieldStr + ") VALUES " + valuesStr; + + // 关键:用共享 pm 的 JdbcSession 执行,而非 BaseDAO 的 executeUpdate + int rows = pm.getJdbcSession().executeUpdate(insertSql); + logger.info("主表新增成功,cpickmid:" + cpickmid + ",影响行数:" + rows + ""); + } + } + + /** + * 子表新增(使用共享的 PersistenceManager) + * + * @param detailDataList 子表数据列表 + * @param pm 共享的 PersistenceManager 实例 + * @param cpickmid 子表业务主键 + */ + private void insertPlanDetail(List> detailDataList, PersistenceManager pm, String cpickmid) throws DAOException, DbException { + String[] detailFields = { + "cpickm_bid", "cpickmid", "pk_org", "vbillcode", "vrowno", "fitemtype", + "fitemsource", "cbmaterialvid", "cbunitid", "cbastunitid", "vbchangerate", "nquotastnum", + "nplanoutastnum", "nplanoutnum", "vbdef22" + }; + String fieldStr = String.join(", ", detailFields); + StringBuilder valuesSb = new StringBuilder(); + + for (Map data : detailDataList) { + valuesSb.append("("); + for (int i = 0; i < detailFields.length; i++) { + Object value = data.get(detailFields[i]); + valuesSb.append(SqlValueUtil.processSqlValue(value)); + if (i < detailFields.length - 1) { + valuesSb.append(", "); + } + } + valuesSb.append("), "); + } + + if (valuesSb.length() > 0) { + String valuesStr = valuesSb.substring(0, valuesSb.length() - 2); + String insertSql = "INSERT INTO BIPPlanDetailTab (" + fieldStr + ") VALUES " + valuesStr; + + // 关键:用共享 pm 的 JdbcSession 执行 + int rows = pm.getJdbcSession().executeUpdate(insertSql); + logger.info("子表新增成功,子表cpickmid:" + cpickmid + ",影响行数:" + rows + ""); + } + } + + /** + * 主表更新(使用共享的 PersistenceManager) + * + * @param mainDataList 主表数据列表 + * @param pm 共享的 PersistenceManager 实例 + * @param cpickmid 主表业务主键 + */ + private void updatePlanMain(List> mainDataList, PersistenceManager pm, String cpickmid) throws DAOException, DbException { + String[] mainFields = { + "pk_org", "vbillcode", "fbillstatus", "vbusitypeid", "vbusitype", + "cmaterialvid", "nastnum", "cdeptid", "cdeptvid", "vsalebillcode", "ccustmaterialid", + "cemployeeid", "vfirstmoid", "vfirstmocode", "vfirstmorowid", "vfirstmorowcode", + "vsourcemoid", "vsourcemocode", "vsourcemorowid", "vsourcemorowcode", "cfirstbillid", + "vfirstbillcode", "vfirstbilltype", "vfirsttrantypeid", "vfirsttrantype", "cfirstbillrowid", + "vfirstbillrowno", "csourcebillid", "vsourcebillcode", "vsourcebilltype", "vsrctrantypeid", + "vsrctrantype", "csourcebillrowid", "vsourcebillrowno", "vnote", "status", + "billmaker", "dmakedate", "creator", "creationtime" + }; + + Map mainData = mainDataList.get(0); + mainData.put("status", "U"); + StringBuilder setSb = new StringBuilder(); + for (String field : mainFields) { + Object value = mainData.get(field); + setSb.append(field).append(" = ").append(SqlValueUtil.processSqlValue(value)).append(", "); + } + + if (setSb.length() > 0) { + String setStr = setSb.substring(0, setSb.length() - 2); + String safeCpickmid = cpickmid.replace("'", "''"); + String updateSql = "UPDATE BIPPlanMainTab SET " + setStr + " WHERE cpickmid = '" + safeCpickmid + "'"; + + // 关键:用共享 pm 的 JdbcSession 执行 + int rows = pm.getJdbcSession().executeUpdate(updateSql); + logger.info("主表更新成功,cpickmid:" + cpickmid + ",影响行数:" + rows + ""); + } + } + + /** + * 子表更新(使用共享的 PersistenceManager) + * + * @param detailDataList 子表数据列表 + * @param pm 共享的 PersistenceManager 实例 + * @param cpickmid 子表业务主键 + */ + private void updatePlanDetail(List> detailDataList, PersistenceManager pm, String cpickmid) throws BusinessException { + if (detailDataList.isEmpty()) { + logger.warn("备料计划" + cpickmid + "子表同步数据为空,跳过更新"); + return; + } + + String[] detailFields = { + "cpickmid", "pk_org", "vbillcode", "vrowno", "fitemtype", + "fitemsource", "cbmaterialvid", "cbunitid", "cbastunitid", "vbchangerate", "nquotastnum", + "nplanoutastnum", "nplanoutnum", "vbdef22" + }; + + // 循环更新每条子表数据 + for (Map detailData : detailDataList) { + String cpickmBid = (String) detailData.get("cpickm_bid"); + if (cpickmBid == null || cpickmBid.trim().isEmpty()) { + logger.warn("备料计划" + cpickmid + "子表主键cpickm_bid为空,跳过该子表更新"); + continue; + } + + // 构建SET语句 + StringBuilder setSb = new StringBuilder(); + for (String field : detailFields) { + Object value = detailData.get(field); + setSb.append(field).append(" = ").append(SqlValueUtil.processSqlValue(value)).append(", "); + } + + // 执行SQL + if (setSb.length() > 0) { + String setStr = setSb.substring(0, setSb.length() - 2); + String safeBid = cpickmBid.replace("'", "''"); + String updateSql = "UPDATE BIPPlanDetailTab SET " + setStr + " WHERE cpickm_bid = '" + safeBid + "'"; + + // 关键:使用共享的 PersistenceManager 执行 SQL + try { + int rows = pm.getJdbcSession().executeUpdate(updateSql); + logger.info("子表更新成功,子表主键:" + cpickmBid + ",影响行数:" + rows + ""); + } catch (DbException e) { + throw new BusinessException("子表更新失败,SQL: " + updateSql, e); + } + } + } + } + + + // -------------------------- 通用工具方法(提取后复用,减少冗余) -------------------------- + + /** + * 执行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); + } + } + + /** + * 判断是否跳过该组织 + */ + private boolean checkIfSkipOrg(String code, Map configParams) throws BusinessException{ + String targetCode = configParams.get("imsOrg"); + 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; + } + + /** + * 从Agg数组中提取关键备料单号(用于日志) + */ + private String getCpickmidFromAgg(AggPickmVO[] aggPickmVOS) { + if (aggPickmVOS != null && aggPickmVOS[0] != null && aggPickmVOS[0].getParentVO() != null) { + return aggPickmVOS[0].getParentVO().getCpickmid(); + } + return "未知"; + } + + + // -------------------------- 内部工具类(封装通用逻辑,避免污染外部类) -------------------------- + + /** + * JSON处理工具类 + */ + private static class JsonUtil { + /** + * JSONObject转List>(单个JSON对象) + */ + public static List> jsonObjectToListMap(JSONObject jsonObject) { + List> resultList = new ArrayList<>(); + if (jsonObject == null || jsonObject.isEmpty()) { + return resultList; + } + // 指定初始容量,优化性能 + Map dataMap = new HashMap<>(jsonObject.size()); + for (Map.Entry entry : jsonObject.entrySet()) { + dataMap.put(entry.getKey(), entry.getValue()); + } + resultList.add(dataMap); + return resultList; + } + } + + /** + * SQL值处理工具类(封装日期转换、字符串转义等) + */ + private static class SqlValueUtil { + /** + * 处理SQL值(自动识别类型,转义特殊字符,加单引号) + */ + public static String processSqlValue(Object value) { + if (value == null) { + return "NULL"; + } + // 处理UFDateTime类型 + if (value instanceof UFDateTime) { + return formatUFDateTime((UFDateTime) value); + } + // 处理UFDate类型 + if (value instanceof UFDate) { + return formatUFDate((UFDate) value); + } + // 处理标准日期类型 + if (value instanceof Date || value instanceof Timestamp) { + return formatDate((Date) value, true); + } + // 处理字符串类型(转义单引号) + if (value instanceof String) { + String safeStr = ((String) value).replace("'", "''"); + return "'" + safeStr + "'"; + } + // 其他类型(数字、布尔等)直接转字符串 + return String.valueOf(value); + } + + /** + * 格式化UFDateTime(转SQL字符串) + */ + private static String formatUFDateTime(UFDateTime ufDateTime) { + try { + Date date = ufDateTime.getDate().toDate(); + return formatDate(date, true); + } catch (Exception e) { + logger.error("格式化UFDateTime失败,值:" + ufDateTime + ""); + return "NULL"; + } + } + + /** + * 格式化UFDate(转SQL字符串) + */ + private static String formatUFDate(UFDate ufDate) { + try { + Date date = ufDate.toDate(); // 依赖UFDate的toDate()方法返回Date + return formatDate(date, true); + } catch (Exception e) { + logger.error("格式化UFDate失败,值:" + ufDate + ""); + return "NULL"; + } + } + + /** + * 格式化Date为SQL字符串 + * + * @param withTime 是否包含时间(true: yyyy-MM-dd HH:mm:ss; false: yyyy-MM-dd) + */ + private static String formatDate(Date date, boolean withTime) { + if (date == null) { + return "NULL"; + } + SimpleDateFormat sdf = withTime ? DATETIME_FORMATTER.get() : DATE_FORMATTER.get(); + try { + String dateStr = sdf.format(date); + return "'" + dateStr + "'"; + } finally { + // 移除ThreadLocal中的Formatter,避免内存泄漏 + if (withTime) { + DATETIME_FORMATTER.remove(); + } else { + DATE_FORMATTER.remove(); + } + } + } + } +} \ No newline at end of file From 220e5bf1475f655d25be204052bd9f1ada4e875b Mon Sep 17 00:00:00 2001 From: mzr Date: Wed, 1 Oct 2025 10:12:14 +0800 Subject: [PATCH 02/32] =?UTF-8?q?=E7=8E=B0=E5=AD=98=E9=87=8F=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/ic/onhand/APIOnhandQueryIpml.java | 43 ++++++++++++++++++- .../api/ic/onhand/IAPIOnhandQuery.java | 9 ++++ .../openapi/ic/onhand/OnhandResource.java | 2 +- 3 files changed, 52 insertions(+), 2 deletions(-) diff --git a/ic/src/private/nccloud/api/impl/ic/onhand/APIOnhandQueryIpml.java b/ic/src/private/nccloud/api/impl/ic/onhand/APIOnhandQueryIpml.java index 462f2876..48e26bec 100644 --- a/ic/src/private/nccloud/api/impl/ic/onhand/APIOnhandQueryIpml.java +++ b/ic/src/private/nccloud/api/impl/ic/onhand/APIOnhandQueryIpml.java @@ -14,6 +14,7 @@ import nccloud.openapi.scmpub.pub.TransferCodeToPKTool; import nccloud.openapi.scmpub.pubitf.IJsonParamMapping; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -59,7 +60,7 @@ public class APIOnhandQueryIpml implements IAPIOnhandQuery { public OnhandVO[] queryOnhandVOByDimsNoTrans(List> paramMapList) throws BusinessException { - //必输项检查 + // 必输项检查 try { List onhandDimVOS = new ArrayList<>(); for (Map paramMap : paramMapList) { @@ -79,6 +80,7 @@ public class APIOnhandQueryIpml implements IAPIOnhandQuery { return null; } } + @Override public OnhandVO[] queryOnhandVOByDims(List> paramMapList) throws Exception { // 必输项检查 @@ -120,6 +122,45 @@ public class APIOnhandQueryIpml implements IAPIOnhandQuery { return onhandVOs; } + @Override + public OnhandVO[] onhandQueryBatch(Map paramMap) throws Exception { + try { + List onhandDimVOS = new ArrayList<>(); + String pk_org = paramMap.get("pk_org").toString(); + if (paramMap.get("cmaterialoid") != null && paramMap.get("cmaterialoid") instanceof List) { + List cmaterialoids = (List) paramMap.get("cmaterialoid"); + for (String cmaterialoid : cmaterialoids) { + Map selMap = new HashMap<>(); + selMap.put("pk_org", pk_org); + selMap.put("cmaterialoid", cmaterialoid); + // 翻译 + selMap = TransferCodeToPKTool.doTranslateFields(jsonParamMapping, selMap); + OnhandDataSupplement dataSupplement = new OnhandDataSupplement(); + OnhandDimVO onhandDimVO = new OnhandDimVO(); + onhandDimVO = dataSupplement.process(selMap); + onhandDimVOS.add(onhandDimVO); + } + + } else { + Map selMap = new HashMap<>(); + selMap.put("pk_org", pk_org); + // 翻译 + selMap = TransferCodeToPKTool.doTranslateFields(jsonParamMapping, selMap); + OnhandDataSupplement dataSupplement = new OnhandDataSupplement(); + OnhandDimVO onhandDimVO = new OnhandDimVO(); + onhandDimVO = dataSupplement.process(selMap); + onhandDimVOS.add(onhandDimVO); + } + + OnhandVO[] onhandVOs = NCLocator.getInstance().lookup(OnhandResService.class) + .queryOnhandVOByDims(onhandDimVOS.toArray(new OnhandDimVO[0])); + return onhandVOs; + } catch (Exception e) { + ExceptionUtils.marsh(e); + return null; + } + } + // 必输项校验 private void requiredFieldCheck(String[] requiredField, Map paramMap) { diff --git a/ic/src/public/nccloud/api/ic/onhand/IAPIOnhandQuery.java b/ic/src/public/nccloud/api/ic/onhand/IAPIOnhandQuery.java index e94d4a22..03708dc6 100644 --- a/ic/src/public/nccloud/api/ic/onhand/IAPIOnhandQuery.java +++ b/ic/src/public/nccloud/api/ic/onhand/IAPIOnhandQuery.java @@ -46,4 +46,13 @@ public interface IAPIOnhandQuery { * @throws Exception 当查询操作失败时抛出的异常 */ OnhandVO[] queryOnhandVOByCondition(Map paramMap) throws Exception; + + /** + * 根据查询条件查询多个物料的现存量信息 + * + * @param paramMap 参数映射列表,每个映射包含一组查询条件 + * @return OnhandVO[] 查询到的现存量信息数组 + * @throws Exception 当查询操作失败时抛出的异常 + */ + OnhandVO[] onhandQueryBatch(Map paramMap) throws Exception; } diff --git a/ic/src/public/nccloud/openapi/ic/onhand/OnhandResource.java b/ic/src/public/nccloud/openapi/ic/onhand/OnhandResource.java index bf349736..2e367616 100644 --- a/ic/src/public/nccloud/openapi/ic/onhand/OnhandResource.java +++ b/ic/src/public/nccloud/openapi/ic/onhand/OnhandResource.java @@ -773,7 +773,7 @@ public class OnhandResource { } try { OnhandVO[] onhandVOs = NCLocator.getInstance().lookup(IAPIOnhandQuery.class) - .queryOnhandVOByDims(paramMap); + .onhandQueryBatch(paramMap); // 对数据进行整合组装,返回物料+仓库+数量 if (null != onhandVOs && onhandVOs.length > 0) { // 收集所有物料和仓库ID From be49a4f6f45b7bd2219e298c0f206e3639a3fa45 Mon Sep 17 00:00:00 2001 From: mzr Date: Wed, 1 Oct 2025 10:25:13 +0800 Subject: [PATCH 03/32] =?UTF-8?q?=E7=8E=B0=E5=AD=98=E9=87=8F=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/impl/ic/onhand/APIOnhandQueryIpml.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/ic/src/private/nccloud/api/impl/ic/onhand/APIOnhandQueryIpml.java b/ic/src/private/nccloud/api/impl/ic/onhand/APIOnhandQueryIpml.java index 48e26bec..876d5a4d 100644 --- a/ic/src/private/nccloud/api/impl/ic/onhand/APIOnhandQueryIpml.java +++ b/ic/src/private/nccloud/api/impl/ic/onhand/APIOnhandQueryIpml.java @@ -1,6 +1,7 @@ package nccloud.api.impl.ic.onhand; import nc.bs.framework.common.NCLocator; +import nc.bs.logging.Logger; import nc.itf.ic.onhand.OnhandResService; import nc.vo.ic.onhand.entity.OnhandDimVO; import nc.vo.ic.onhand.entity.OnhandVO; @@ -137,7 +138,15 @@ public class APIOnhandQueryIpml implements IAPIOnhandQuery { selMap = TransferCodeToPKTool.doTranslateFields(jsonParamMapping, selMap); OnhandDataSupplement dataSupplement = new OnhandDataSupplement(); OnhandDimVO onhandDimVO = new OnhandDimVO(); - onhandDimVO = dataSupplement.process(selMap); + try { + onhandDimVO = dataSupplement.process(selMap); + } catch (Exception e) { + Logger.error(e); + } + // 跳过查不出数据的物料 + if (onhandDimVO == null || onhandDimVO.getCmaterialoid() == null) { + continue; + } onhandDimVOS.add(onhandDimVO); } @@ -151,7 +160,6 @@ public class APIOnhandQueryIpml implements IAPIOnhandQuery { onhandDimVO = dataSupplement.process(selMap); onhandDimVOS.add(onhandDimVO); } - OnhandVO[] onhandVOs = NCLocator.getInstance().lookup(OnhandResService.class) .queryOnhandVOByDims(onhandDimVOS.toArray(new OnhandDimVO[0])); return onhandVOs; From 80133551cad0c986911bd8ba8ac2c3ceb0b041f6 Mon Sep 17 00:00:00 2001 From: mzr Date: Wed, 1 Oct 2025 13:05:33 +0800 Subject: [PATCH 04/32] =?UTF-8?q?=E5=AE=9A=E6=97=B6=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=E9=AB=98=E5=8E=8B=E5=8A=A0=E5=B7=A5=E8=BD=A6=E9=97=B4IMS?= =?UTF-8?q?=E7=9A=84=E7=94=9F=E4=BA=A7=E6=8A=A5=E5=91=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../uapbd/task/ProductReportGyImsPlugin.java | 171 ++++++++++++++++++ 1 file changed, 171 insertions(+) create mode 100644 uapbd/src/private/nc/bs/uapbd/task/ProductReportGyImsPlugin.java diff --git a/uapbd/src/private/nc/bs/uapbd/task/ProductReportGyImsPlugin.java b/uapbd/src/private/nc/bs/uapbd/task/ProductReportGyImsPlugin.java new file mode 100644 index 00000000..2cc8eae9 --- /dev/null +++ b/uapbd/src/private/nc/bs/uapbd/task/ProductReportGyImsPlugin.java @@ -0,0 +1,171 @@ +package nc.bs.uapbd.task; + +import nc.bs.dao.BaseDAO; +import nc.bs.framework.common.NCLocator; +import nc.bs.logging.Logger; +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.itf.mmpac.pmo.pac0002.IPMOQueryService; +import nc.itf.mmpac.wr.IWrMaintainService; +import nc.itf.uap.pf.busiflow.PfButtonClickContext; +import nc.jdbc.framework.processor.MapListProcessor; +import nc.util.mmf.busi.service.PFPubService; +import nc.util.mmf.framework.base.MMValueCheck; +import nc.vo.bd.material.MaterialVO; +import nc.vo.fi.pub.SqlUtils; +import nc.vo.mmpac.pmo.pac0002.entity.PMOAggVO; +import nc.vo.mmpac.wr.entity.AggWrVO; +import nc.vo.mmpac.wr.entity.WrItemVO; +import nc.vo.mmpac.wr.entity.WrVO; +import nc.vo.pub.BusinessException; +import nc.vo.pub.lang.UFDate; +import nc.vo.pub.lang.UFDateTime; +import nc.vo.pub.lang.UFDouble; +import nc.vo.scmpub.res.billtype.MMBillType; +import nccloud.baseapp.core.log.NCCForUAPLogger; +import uap.mw.trans.TransactionFactory; + +import java.math.BigDecimal; +import java.sql.Timestamp; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * 定时同步高压加工车间IMS的生产报告 + * + * @author mzr + * @date 20250929 + */ +public class ProductReportGyImsPlugin implements IBackgroundWorkPlugin { + private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + private SimpleDateFormat sdf_ts = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + // BIP数据源 + public static final BaseDAO baseDAO = new BaseDAO(); + // IMS数据源 + public BaseDAO imsDao; + + /** + * 获取IMS数据源 + */ + public BaseDAO getImsDao() { + if (imsDao == null) { + imsDao = new BaseDAO("gyims"); + // 禁用时间戳ts + imsDao.setAddTimeStamp(false); + } + return imsDao; + } + + @Override + public PreAlertObject executeTask(BgWorkingContext arg0) { + Logger.error("---start----任务开始运行--"); + try { + IPMOQueryService pmoQueryService = NCLocator.getInstance().lookup(IPMOQueryService.class); + IWrMaintainService wrService = NCLocator.getInstance().lookup(IWrMaintainService.class); + // 手动开启事务 + TransactionFactory.getTMProxy().begin(3, 0); + // IMS:C-创建;U-修改 BIP:2-BIP单据接收完成 + String selSql = "select * from BIPReportMainTab where status != '2'"; + List> mainList = (List>) getImsDao().executeQuery(selSql, new MapListProcessor()); + Set pkWrSet = new HashSet<>(); + for (Map mainMap : mainList) { + String pkWr = mainMap.get("pk_wr").toString(); + String pkWrSql = "select * from BIPReportDetailTab where pk_wr = '" + pkWr + "'"; + List> detailList = (List>) getImsDao().executeQuery(pkWrSql, new MapListProcessor()); + Map> detailIdMap = new HashMap<>(); + for (Map detailMap : detailList) { + detailIdMap.put(detailMap.get("vbdef23").toString(), detailMap); + } + if (detailList.isEmpty()) { + continue; + } + String vbdef22 = detailList.get(0).get("vbdef22") + "";// 流程生产订单主键 + // 查询流程生产订单的VO + PMOAggVO[] pmoAggVOS = pmoQueryService.queryByPks(new String[]{vbdef22}); + // 调用单据转换规则转换出流程生产报告的VO + AggWrVO[] vos = (AggWrVO[]) PFPubService.runChangeData(MMBillType.ProduceOrder.getCode(), MMBillType.ProduceReport.getCode(), + pmoAggVOS, null, PfButtonClickContext.ClassifyByItfdef); + if (MMValueCheck.isEmpty(vos)) { + continue; + } + // 根据IMS字段赋值 + for (AggWrVO vo : vos) { + WrVO hvo = vo.getParentVO(); + WrItemVO[] bvos = vo.getChildrenVO(); + hvo.setVbillcode(mainMap.get("vbillcode") + ""); + hvo.setCreator("BIP"); + hvo.setBillmaker("BIP"); + String dmakedateStr = ""; + if (mainMap.get("dmakedate") != null) { + Timestamp dmakedate1 = (Timestamp) mainMap.get("dmakedate"); + dmakedateStr = sdf.format(dmakedate1); + UFDate dmakedate = new UFDate(dmakedateStr); + hvo.setDmakedate(dmakedate); + } + if (mainMap.get("creationtime") != null) { + Timestamp creationtime1 = (Timestamp) mainMap.get("creationtime"); + String creationtimeStr = sdf_ts.format(creationtime1); + UFDateTime creationtime = new UFDateTime(creationtimeStr); + hvo.setCreationtime(creationtime); + } + for (WrItemVO bvo : bvos) { + bvo.setFbproducttype(1);// 产品类型 1.主产品 + bvo.setTbstarttime(new UFDateTime(dmakedateStr + " 00:00:00"));// 开始时间 + bvo.setTbendtime(new UFDateTime(dmakedateStr + " 23:59:59"));// 结束时间 + String cbmobid = bvo.getCbmobid();// 流程生产订单明细id + Map detailMap = detailIdMap.get(cbmobid); + if (detailMap != null) { + // 物料或数量替换 + bvo.setNbplanwrnum(new UFDouble((BigDecimal) detailMap.get("nbplanwrnum")));// 计划完工主数量 + bvo.setNbplanwrastnum(new UFDouble((BigDecimal) detailMap.get("nbplanwrastnum")));// 计划完工数量 + bvo.setNbwrnum(new UFDouble((BigDecimal) detailMap.get("nbwrnum")));// 完工主数量 + bvo.setNbwrastnum(new UFDouble((BigDecimal) detailMap.get("nbwrastnum")));// 完工数量 + // 如果物料不相等,则BIP物料替换为IMS物料 + String cbmaterialvid = bvo.getCbmaterialvid(); + String goodsCode = detailMap.get("cbmaterialvid") + ""; + String goodsId = MyHelper.getStrValByCondition(MaterialVO.getDefaultTableName(), MaterialVO.PK_MATERIAL, + MaterialVO.CODE + " = '" + goodsCode + "'"); + if (!cbmaterialvid.equals(goodsId)) { + bvo.setCbmaterialvid(goodsId); + } + } + } + } + AggWrVO[] resultvos = null; + try { + resultvos = wrService.insert(vos); + } catch (BusinessException e) { + Logger.error("ProductReportGyImsPlugin Error: ", e); + NCCForUAPLogger.debug("ProductReportGyImsPlugin Error: " + e.getMessage()); + String updateSql = "update BIPReportMainTab set err_msg = '[err_msg]' where pk_wr = '[pkWr]'"; + updateSql = updateSql.replace("[err_msg]", e.getMessage()); + updateSql = updateSql.replace("[pkWr]", pkWr); + NCCForUAPLogger.debug("ProductReportGyImsPlugin-updateSql = " + updateSql); + getImsDao().executeUpdate(updateSql); + } + if (MMValueCheck.isEmpty(resultvos)) { + continue; + } + pkWrSet.add(pkWr); + } + if (!pkWrSet.isEmpty()) { + // 修改状态为 完成 + String inSql = SqlUtils.getInStr("pk_wr", pkWrSet.toArray(new String[0]), Boolean.TRUE); + String updateSql = "update BIPReportMainTab set status = '2' where " + inSql; + getImsDao().executeUpdate(updateSql); + } + // 正常结束 + TransactionFactory.getTMProxy().end(null); + Logger.error("---end----任务结束运行--"); + } catch (Exception e) { + // 异常回滚 + TransactionFactory.getTMProxy().end(e); + Logger.error("ProductReportGyImsPlugin Error: ", e); + NCCForUAPLogger.debug("ProductReportGyImsPlugin Error: " + e.getMessage()); + } + return null; + } + +} From ab130eac15551dfd5197fe9bc0470a0a9ffe9f0f Mon Sep 17 00:00:00 2001 From: lihao Date: Wed, 1 Oct 2025 17:10:38 +0800 Subject: [PATCH 05/32] =?UTF-8?q?erp=E4=BB=8Eims=E4=B8=AD=E9=97=B4?= =?UTF-8?q?=E8=A1=A8=E8=8E=B7=E5=8F=96=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ErpIaI2billFromGyImsPlugin.java | 393 ++++++++++++++++++ 1 file changed, 393 insertions(+) create mode 100644 uapbd/src/private/nc/bs/uapbd/bip/workplugin/ErpIaI2billFromGyImsPlugin.java diff --git a/uapbd/src/private/nc/bs/uapbd/bip/workplugin/ErpIaI2billFromGyImsPlugin.java b/uapbd/src/private/nc/bs/uapbd/bip/workplugin/ErpIaI2billFromGyImsPlugin.java new file mode 100644 index 00000000..245f702d --- /dev/null +++ b/uapbd/src/private/nc/bs/uapbd/bip/workplugin/ErpIaI2billFromGyImsPlugin.java @@ -0,0 +1,393 @@ +package nc.bs.uapbd.bip.workplugin; + +import nc.bs.dao.BaseDAO; +import nc.bs.framework.common.InvocationInfoProxy; +import nc.bs.pub.pa.PreAlertObject; +import nc.bs.pub.taskcenter.BgWorkingContext; +import nc.bs.pub.taskcenter.IBackgroundWorkPlugin; +import nc.bs.trade.business.HYPubBO; +import nc.jdbc.framework.processor.MapListProcessor; +import nc.pubimpl.ic.api.maintain.BillMaintainTool; +import nc.vo.ia.mi2.entity.I2BillVO; +import nc.vo.ia.mi2.entity.I2HeadVO; +import nc.vo.ic.m45.entity.PurchaseInBodyVO; +import nc.vo.ic.m45.entity.PurchaseInHeadVO; +import nc.vo.ic.m45.entity.PurchaseInVO; +import nc.vo.pub.BusinessException; +import nc.vo.pub.lang.UFDate; +import nc.vo.pub.lang.UFDouble; +import nc.vo.scmpub.res.billtype.ICBillType; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class ErpIaI2billFromGyImsPlugin implements IBackgroundWorkPlugin { + + @Override + public PreAlertObject executeTask(BgWorkingContext bgWorkingContext) throws BusinessException { + BaseDAO imsDao= new BaseDAO("gyims"); + // 禁用时间戳ts + imsDao.setAddTimeStamp(false); +// 查询高压ims中间表需要同步的数据 + String sql = " \t\tSELECT\n" + + "\t* \n" + + "from BIPInputMainTab a " + + "where a.status !='2'"; + List> remain = (List>) imsDao.executeQuery(sql, new MapListProcessor()); + + if (remain != null && remain.size() > 0) { + List list = new ArrayList(); + for (Map map : remain) { + HYPubBO hy = new HYPubBO(); + PurchaseInVO vo = new PurchaseInVO(); + PurchaseInHeadVO head = new PurchaseInHeadVO(); + + // 按数据库字段名直接调用对应setter方法(set+字段名) + head.setCgeneralhid((String) map.get("cgeneralhid")); + head.setPk_group(InvocationInfoProxy.getInstance().getGroupId()); + map.put("pk_org","C047"); + map.put("pk_org_v","C047"); +// OrgVO orgvo = (OrgVO)hy.queryByPrimaryKey(OrgVO.class, ); + Object pk_org = hy.findColValue("org_stockorg", "pk_org", "code = '"+map.get("pk_org")+"' and nvl(dr,0)=0 and islastversion='Y' "); + + head.setPk_org((String) pk_org); // 对应字段pk_org + +// Object pk_org_v = hy.findColValue("org_stockorg_v", "pk_vid", "pk_stockorg = '"+pk_org+"' "); + + Object pk_org_v = hy.findColValue("org_stockorg_v", "pk_vid", "code = '"+map.get("pk_org")+"' "); + + head.setPk_org((String) pk_org_v); // 对应字段pk_org_v + + Object busicode = hy.findColValue("bd_busitype", "pk_busitype", "busicode = '"+map.get("busicode")+"' "); + + head.setCbiztype((String) busicode); + head.setVbillcode((String) map.get("vbillcode")); + +// Object cwarehouseid = hy.findColValue("bd_stordoc", "pk_stordoc", " code = '"+map.get("cwarehouseid")+"' "); + + Object cwarehouseid = hy.findColValue("bd_stordoc", "pk_stordoc", " code = '"+"C047002"+"' "); + + head.setCwarehouseid((String) cwarehouseid); + + head.setDbilldate(new UFDate(String.valueOf(map.get("dbilldate"))) ); // 日期类型 + + map.put("vtrantypecode","45-Cxx-C102"); + head.setVtrantypecode((String) map.get("vtrantypecode")); + + Object ctrantypeid = hy.findColValue("bd_billtype", "pk_billtypeid", " pk_billtypecode = '"+map.get("vtrantypecode")+"' and dr='0' "); + + head.setCtrantypeid((String) ctrantypeid); + Object cwhsmanagerid = hy.findColValue("bd_psndoc", "pk_psndoc", " code = '"+map.get("cwhsmanagerid")+"' and dr='0' "); + + head.setCwhsmanagerid((String)cwhsmanagerid); + + Object cdptid = hy.findColValue("org_dept", "pk_dept", " code = '"+map.get("cdptid")+"' and dr='0' "); + + head.setCdptid((String) cdptid); + + Object cbizid = hy.findColValue("bd_psndoc", "pk_psndoc", " code = '"+map.get("cbizid")+"' and dr='0' "); + + head.setCbizid((String) cbizid); + head.setNtotalnum(new UFDouble(String.valueOf(map.get("ntotalnum")))); // 数字类型 + head.setVnote((String) map.get("vnote")); +// head.setStatus((Integer) map.get("status")); + head.setFbillflag(2); + Object billmaker = hy.findColValue("sm_user", "cuserid", " user_code = '"+map.get("billmaker")+"' and dr='0' "); + + head.setBillmaker((String) billmaker); + Object approver = hy.findColValue("sm_user", "cuserid", " user_code = '"+map.get("approver")+"' and dr='0' "); + + head.setApprover((String)approver); + if(map.get("taudittime") !=null){ + head.setTaudittime(new UFDate(String.valueOf(map.get("taudittime"))) ); // 日期类型 + } + + Object cpayfinorgoid = hy.findColValue("org_financeorg", "pk_financeorg", " code = '"+map.get("cpayfinorgoid")+"' and dr='0' "); + + head.setCpayfinorgoid((String) cpayfinorgoid); + + Object cfanaceorgoid = hy.findColValue("org_financeorg", "pk_financeorg", " code = '"+map.get("cfanaceorgoid")+"' and dr='0' "); + + head.setCfanaceorgoid((String) cfanaceorgoid); // 注意原字段名是否正确org_financeorg + + Object cpurorgoid = hy.findColValue("org_purchaseorg", "pk_purchaseorg", " code = '"+map.get("cpurorgoid")+"' and dr='0' "); + + head.setCpurorgoid((String) cpurorgoid); + head.setCvendorvid((String) map.get("cvendorvid")); + head.setDmakedate(new UFDate(String.valueOf(map.get("dmakedate")))); // 日期类型 + + Object csendcountryid = hy.findColValue("bd_countryzone", "pk_country", " code = '"+"CN"+"' and dr='0' "); + + head.setCsendcountryid((String) csendcountryid); + + Object crececountryid = hy.findColValue("bd_countryzone", "pk_country", " code = '"+"CN"+"' and dr='0' "); + + head.setCrececountryid((String) crececountryid); + + Object ctaxcountryid = hy.findColValue("bd_countryzone", "pk_country", " code = '"+"CN"+"' and dr='0' "); + + head.setCtaxcountryid((String) ctaxcountryid); + head.setFbuysellflag(2 ); // 数值类型(按需调整) + + // 将head设置到vo中 + vo.setParent(head); + String bodysql = " \t\tSELECT\n" + + "\t* \n" + + "from BIPInputDetailTab a " + + "where a.cgeneralhid ='"+map.get("cgeneralhid")+"'"; + List> bodys = (List>) imsDao.executeQuery(bodysql, new MapListProcessor()); + List list1 = new ArrayList<>(); + for(Map body : bodys) { + HYPubBO hy1 = new HYPubBO(); + PurchaseInBodyVO bodyVO = new PurchaseInBodyVO(); + + // 主键及关联字段 + bodyVO.setCgeneralbid((String) body.get("cgeneralbid")); // 主键(UFID)org_corp + bodyVO.setCgeneralhid((String) body.get("cgeneralhid")); // 关联主表ID + + body.put("corpoid","C003"); + Object corpoid = hy1.findColValue("org_corp", "pk_corp", " code = '"+body.get("corpoid")+"' and dr='0' "); + + bodyVO.setCorpoid((String)corpoid); // 组织_业务单元_公司 + Object cfanaceorgoid1 = hy1.findColValue("org_financeorg", "pk_financeorg", " code = '"+"C003"+"' and dr='0' "); + + bodyVO.setCfanaceorgoid((String) cfanaceorgoid1); // 组织_业务单元_财务组织org_financeorg +// bodyVO.setVbillcode((String) body.get("vbillcode")); // 字符串 + bodyVO.setCrowno((String) body.get("crowno")); // 字符串 + Object cmaterialvid = hy1.findColValue("bd_material", "pk_material", " code = '"+body.get("cmaterialvid")+"' and dr='0' "); + + bodyVO.setCmaterialvid((String)cmaterialvid); // 物料基本信息 + Object cunitid = hy1.findColValue("bd_material", "pk_measdoc", " code = '"+body.get("cmaterialvid")+"' and dr='0' "); + + bodyVO.setCunitid((String)cunitid); // 计量单位bd_measdoc +// Object castunitid = hy1.findColValue("bd_measdoc", "pk_measdoc", " code = '"+body.get("castunitid")+"' and dr='0' "); + + bodyVO.setCastunitid((String)cunitid); // 计量单位 + bodyVO.setVchangerate((String) body.get("vchangerate")); // 字符串 + bodyVO.setVbatchcode((String) body.get("vbatchcode")); // 字符串 + + // 数值类型(UFDouble) + bodyVO.setNshouldassistnum(new UFDouble(String.valueOf(body.get("nshouldassistnum")))); // 数值 + bodyVO.setNshouldnum(new UFDouble(String.valueOf(body.get("nshouldnum")))); // 数值 + bodyVO.setNassistnum(new UFDouble(String.valueOf(body.get("nassistnum")))); // 数值 + bodyVO.setNnum(new UFDouble(String.valueOf(body.get("nnum")))); // 数值 + if(body.get("cprojectid")!=null){ + Object cprojectid = hy1.findColValue("bd_project", "pk_project", " code = '"+body.get("cprojectid")+"' and dr='0' "); + + bodyVO.setCprojectid((String) cprojectid); // 项目 + } + + bodyVO.setVnotebody((String) body.get("vnotebody")); // 字符串 + + Object cbodytranstypecode = hy1.findColValue("bd_billtype", "pk_billtypeid", " pk_billtypecode = '"+body.get("cbodytranstypecode")+"' and dr='0' "); + + bodyVO.setCbodytranstypecode((String)cbodytranstypecode); // 单据类型 + +// Object cbodywarehouseid = hy1.findColValue("bd_stordoc", "pk_stordoc", " code = '"+body.get("cbodywarehouseid")+"' and dr='0' "); + + bodyVO.setCbodywarehouseid(head.getCwarehouseid()); // 仓库 + + Object cproductorid = hy1.findColValue("bd_defdoc", "pk_defdoc", " code = '" + body.get("cproductorid") + "' and dr='0' "); + bodyVO.setCproductorid((String) cproductorid); // 生产厂商 + +// Object pk_creqwareid = hy1.findColValue("bd_stordoc", "pk_stordoc", " code = '"+body.get("pk_creqwareid")+"' and dr='0' "); + + bodyVO.setPk_creqwareid(head.getCwarehouseid()); // 仓库 + Object creqstoorgoid = hy1.findColValue("org_stockorg", "pk_org", "code = '"+"C047"+"' and nvl(dr,0)=0 and islastversion='Y' "); + + bodyVO.setCreqstoorgoid((String) creqstoorgoid); // 组织_业务单元_库存组织 + + Object corigcurrencyid = hy1.findColValue("bd_currtype", "pk_currtype", "code = '"+"CNY"+"' and nvl(dr,0)=0 "); + + bodyVO.setCorigcurrencyid((String) corigcurrencyid); // 币种 + bodyVO.setNchangestdrate(new UFDouble(1)); // 数值 + + Object ccurrencyid = hy1.findColValue("bd_currtype", "pk_currtype", "code = '"+"CNY"+"' and nvl(dr,0)=0 "); + + bodyVO.setCcurrencyid((String) ccurrencyid); // 币种 + +// 价格相关数值(UFDouble) + // 处理UFDouble类型属性(值非null时才赋值) + Object norignetpriceVal = body.get("norignetprice"); + if (norignetpriceVal != null) { + bodyVO.setNorignetprice(new UFDouble(String.valueOf(norignetpriceVal))); + } + + Object norigtaxnetpriceVal = body.get("norigtaxnetprice"); + if (norigtaxnetpriceVal != null) { + bodyVO.setNorigtaxnetprice(new UFDouble(String.valueOf(norigtaxnetpriceVal))); + } + + Object nnetpriceVal = body.get("nnetprice"); + if (nnetpriceVal != null) { + bodyVO.setNnetprice(new UFDouble(String.valueOf(nnetpriceVal))); + } + + Object ntaxnetpriceVal = body.get("ntaxnetprice"); + if (ntaxnetpriceVal != null) { + bodyVO.setNtaxnetprice(new UFDouble(String.valueOf(ntaxnetpriceVal))); + } + +// 计量单位(非null时赋值) + Object cqtunitidVal = body.get("cqtunitid"); + if (cqtunitidVal != null) { + bodyVO.setCqtunitid((String) cqtunitidVal); + } + +// 数值(UFDouble类型,非null时赋值) + Object nqtunitnumVal = body.get("nqtunitnum"); + if (nqtunitnumVal != null) { + bodyVO.setNqtunitnum(new UFDouble(String.valueOf(nqtunitnumVal))); + } + +// 字符串(非null时赋值) + Object vqtunitrateVal = body.get("vqtunitrate"); + if (vqtunitrateVal != null) { + bodyVO.setVqtunitrate((String) vqtunitrateVal); + } + +// 继续处理其他UFDouble类型属性 + Object nqtorignetpriceVal = body.get("nqtorignetprice"); + if (nqtorignetpriceVal != null) { + bodyVO.setNqtorignetprice(new UFDouble(String.valueOf(nqtorignetpriceVal))); + } + + Object nqtorigtaxnetpriceVal = body.get("nqtorigtaxnetprice"); + if (nqtorigtaxnetpriceVal != null) { + bodyVO.setNqtorigtaxnetprice(new UFDouble(String.valueOf(nqtorigtaxnetpriceVal))); + } + + Object nqtnetpriceVal = body.get("nqtnetprice"); + if (nqtnetpriceVal != null) { + bodyVO.setNqtnetprice(new UFDouble(String.valueOf(nqtnetpriceVal))); + } + + Object nqttaxnetpriceVal = body.get("nqttaxnetprice"); + if (nqttaxnetpriceVal != null) { + bodyVO.setNqttaxnetprice(new UFDouble(String.valueOf(nqttaxnetpriceVal))); + } + + Object norigpriceVal = body.get("norigprice"); + if (norigpriceVal != null) { + bodyVO.setNorigprice(new UFDouble(String.valueOf(norigpriceVal))); + } + + Object norigtaxpriceVal = body.get("norigtaxprice"); + if (norigtaxpriceVal != null) { + bodyVO.setNorigtaxprice(new UFDouble(String.valueOf(norigtaxpriceVal))); + } + + Object npriceVal = body.get("nprice"); + if (npriceVal != null) { + bodyVO.setNprice(new UFDouble(String.valueOf(npriceVal))); + } + + Object ntaxpriceVal = body.get("ntaxprice"); + if (ntaxpriceVal != null) { + bodyVO.setNtaxprice(new UFDouble(String.valueOf(ntaxpriceVal))); + } + + Object nqtorigpriceVal = body.get("nqtorigprice"); + if (nqtorigpriceVal != null) { + bodyVO.setNqtorigprice(new UFDouble(String.valueOf(nqtorigpriceVal))); + } + + Object nqtorigtaxpriceVal = body.get("nqtorigtaxprice"); + if (nqtorigtaxpriceVal != null) { + bodyVO.setNqtorigtaxprice(new UFDouble(String.valueOf(nqtorigtaxpriceVal))); + } + + Object nqtpriceVal = body.get("nqtprice"); + if (nqtpriceVal != null) { + bodyVO.setNqtprice(new UFDouble(String.valueOf(nqtpriceVal))); + } + + Object nqttaxpriceVal = body.get("nqttaxprice"); + if (nqttaxpriceVal != null) { + bodyVO.setNqttaxprice(new UFDouble(String.valueOf(nqttaxpriceVal))); + } + + Object nitemdiscountrateVal = body.get("nitemdiscountrate"); + if (nitemdiscountrateVal != null) { + bodyVO.setNitemdiscountrate(new UFDouble(String.valueOf(nitemdiscountrateVal))); + } + +// 金额及税额相关(UFDouble类型,非null时赋值) + Object norigmnyVal = body.get("norigmny"); + if (norigmnyVal != null) { + bodyVO.setNorigmny(new UFDouble(String.valueOf(norigmnyVal))); + } + + Object norigtaxmnyVal = body.get("norigtaxmny"); + if (norigtaxmnyVal != null) { + bodyVO.setNorigtaxmny(new UFDouble(String.valueOf(norigtaxmnyVal))); + } + + Object nmnyVal = body.get("nmny"); + if (nmnyVal != null) { + bodyVO.setNmny(new UFDouble(String.valueOf(nmnyVal))); + } + + Object ntaxmnyVal = body.get("ntaxmny"); + if (ntaxmnyVal != null) { + bodyVO.setNtaxmny(new UFDouble(String.valueOf(ntaxmnyVal))); + } + + Object ntaxVal = body.get("ntax"); + if (ntaxVal != null) { + bodyVO.setNtax(new UFDouble(String.valueOf(ntaxVal))); + } + + + +// 增值税税码税率(查询结果非null时赋值) + Object ctaxcodeid = hy1.findColValue("bd_taxcode", "pk_taxcode", + "code = '" + "CN13" + "' and dr=0 "); + if (ctaxcodeid != null) { + bodyVO.setCtaxcodeid((String) ctaxcodeid); + } + Object ntaxrateVal = hy1.findColValue("bd_taxrate", "taxrate", + " pk_taxcode = '" + ctaxcodeid+ "' and dr=0 "); + if (ntaxrateVal != null) { + bodyVO.setNtaxrate(new UFDouble(String.valueOf(ntaxrateVal))); + } +// 继续处理其他UFDouble类型 + Object ncaltaxmnyVal = body.get("ncaltaxmny"); + if (ncaltaxmnyVal != null) { + bodyVO.setNcaltaxmny(new UFDouble(String.valueOf(ncaltaxmnyVal))); + } + +// 扣税类别(非null时转换并赋值) + Object ftaxtypeflagVal = body.get("ftaxtypeflag"); + if (ftaxtypeflagVal != null) { + bodyVO.setFtaxtypeflag(Integer.valueOf((String) ftaxtypeflagVal)); + } + + Object ncalcostmnyVal = body.get("ncalcostmny"); + if (ncalcostmnyVal != null) { + bodyVO.setNcalcostmny(new UFDouble(String.valueOf(ncalcostmnyVal))); + } + +// 供应商基本信息(查询结果非null时赋值) + String cvendorid = (String) hy1.findColValue("bd_supplierclass", "pk_supplierclass", + " code = '" + body.get("cvendorid") + "' and dr=0 "); + if (cvendorid != null) { + bodyVO.setCvendorid(cvendorid); + } + + list1.add(bodyVO); + } + vo.setChildrenVO(list1.toArray(new PurchaseInBodyVO[list1.size()])); + // 添加到集合 + list.add(vo); + } + BillMaintainTool tool = new BillMaintainTool( + PurchaseInVO.class, ICBillType.PurchaseIn.getCode()); + tool.insert(list.toArray(new PurchaseInVO[list.size()])); + } + + + return null; + } +} From 0fd69271b96dcd7afd6a5ae5056293a238b8946f Mon Sep 17 00:00:00 2001 From: mzr Date: Wed, 1 Oct 2025 21:27:25 +0800 Subject: [PATCH 06/32] =?UTF-8?q?=E5=AE=9A=E6=97=B6=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=E9=AB=98=E5=8E=8B=E5=8A=A0=E5=B7=A5=E8=BD=A6=E9=97=B4IMS?= =?UTF-8?q?=E7=9A=84=E7=94=9F=E4=BA=A7=E6=8A=A5=E5=91=8A-=E8=B0=83?= =?UTF-8?q?=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bs/uapbd/task/ProductReportGyImsPlugin.java | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/uapbd/src/private/nc/bs/uapbd/task/ProductReportGyImsPlugin.java b/uapbd/src/private/nc/bs/uapbd/task/ProductReportGyImsPlugin.java index 2cc8eae9..69a061e5 100644 --- a/uapbd/src/private/nc/bs/uapbd/task/ProductReportGyImsPlugin.java +++ b/uapbd/src/private/nc/bs/uapbd/task/ProductReportGyImsPlugin.java @@ -39,8 +39,8 @@ import java.util.*; * @date 20250929 */ public class ProductReportGyImsPlugin implements IBackgroundWorkPlugin { - private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); - private SimpleDateFormat sdf_ts = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + private SimpleDateFormat DATE_FORMATTER = new SimpleDateFormat("yyyy-MM-dd"); + private SimpleDateFormat DATETIME_FORMATTER = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // BIP数据源 public static final BaseDAO baseDAO = new BaseDAO(); // IMS数据源 @@ -98,15 +98,13 @@ public class ProductReportGyImsPlugin implements IBackgroundWorkPlugin { hvo.setCreator("BIP"); hvo.setBillmaker("BIP"); String dmakedateStr = ""; - if (mainMap.get("dmakedate") != null) { - Timestamp dmakedate1 = (Timestamp) mainMap.get("dmakedate"); - dmakedateStr = sdf.format(dmakedate1); + if (mainMap.get("dmakedate") != null && mainMap.get("dmakedate") instanceof Timestamp dmakedate1) { + dmakedateStr = DATE_FORMATTER.format(dmakedate1); UFDate dmakedate = new UFDate(dmakedateStr); hvo.setDmakedate(dmakedate); } - if (mainMap.get("creationtime") != null) { - Timestamp creationtime1 = (Timestamp) mainMap.get("creationtime"); - String creationtimeStr = sdf_ts.format(creationtime1); + if (mainMap.get("creationtime") != null && mainMap.get("creationtime") instanceof Timestamp creationtime1) { + String creationtimeStr = DATETIME_FORMATTER.format(creationtime1); UFDateTime creationtime = new UFDateTime(creationtimeStr); hvo.setCreationtime(creationtime); } @@ -125,8 +123,9 @@ public class ProductReportGyImsPlugin implements IBackgroundWorkPlugin { // 如果物料不相等,则BIP物料替换为IMS物料 String cbmaterialvid = bvo.getCbmaterialvid(); String goodsCode = detailMap.get("cbmaterialvid") + ""; + String whereSql = MaterialVO.CODE + " = '" + goodsCode + "'" + " and pk_org = '" + hvo.getPk_org() + "'"; String goodsId = MyHelper.getStrValByCondition(MaterialVO.getDefaultTableName(), MaterialVO.PK_MATERIAL, - MaterialVO.CODE + " = '" + goodsCode + "'"); + whereSql); if (!cbmaterialvid.equals(goodsId)) { bvo.setCbmaterialvid(goodsId); } From 15a1f8e2c2cc2d15fd25e99ecdb3b14d2ff1f498 Mon Sep 17 00:00:00 2001 From: lihao Date: Thu, 2 Oct 2025 16:23:56 +0800 Subject: [PATCH 07/32] =?UTF-8?q?erp=E4=BB=8Eims=E4=B8=AD=E9=97=B4?= =?UTF-8?q?=E8=A1=A8=E8=8E=B7=E5=8F=96=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ErpIaI2billFromGyImsPlugin.java | 28 +++++++++++++++---- 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/uapbd/src/private/nc/bs/uapbd/bip/workplugin/ErpIaI2billFromGyImsPlugin.java b/uapbd/src/private/nc/bs/uapbd/bip/workplugin/ErpIaI2billFromGyImsPlugin.java index 245f702d..24a5e238 100644 --- a/uapbd/src/private/nc/bs/uapbd/bip/workplugin/ErpIaI2billFromGyImsPlugin.java +++ b/uapbd/src/private/nc/bs/uapbd/bip/workplugin/ErpIaI2billFromGyImsPlugin.java @@ -2,10 +2,12 @@ package nc.bs.uapbd.bip.workplugin; import nc.bs.dao.BaseDAO; import nc.bs.framework.common.InvocationInfoProxy; +import nc.bs.ic.m45.insert.InsertBP; import nc.bs.pub.pa.PreAlertObject; import nc.bs.pub.taskcenter.BgWorkingContext; import nc.bs.pub.taskcenter.IBackgroundWorkPlugin; import nc.bs.trade.business.HYPubBO; +import nc.jdbc.framework.processor.ColumnProcessor; import nc.jdbc.framework.processor.MapListProcessor; import nc.pubimpl.ic.api.maintain.BillMaintainTool; import nc.vo.ia.mi2.entity.I2BillVO; @@ -16,7 +18,9 @@ import nc.vo.ic.m45.entity.PurchaseInVO; import nc.vo.pub.BusinessException; import nc.vo.pub.lang.UFDate; import nc.vo.pub.lang.UFDouble; +import nc.vo.pubapp.pattern.exception.ExceptionUtils; import nc.vo.scmpub.res.billtype.ICBillType; +import org.eclipse.swt.internal.C; import java.util.ArrayList; import java.util.List; @@ -72,7 +76,7 @@ public class ErpIaI2billFromGyImsPlugin implements IBackgroundWorkPlugin { head.setDbilldate(new UFDate(String.valueOf(map.get("dbilldate"))) ); // 日期类型 - map.put("vtrantypecode","45-Cxx-C102"); + map.put("vtrantypecode","45-Cxx-CI02"); head.setVtrantypecode((String) map.get("vtrantypecode")); Object ctrantypeid = hy.findColValue("bd_billtype", "pk_billtypeid", " pk_billtypecode = '"+map.get("vtrantypecode")+"' and dr='0' "); @@ -347,8 +351,12 @@ public class ErpIaI2billFromGyImsPlugin implements IBackgroundWorkPlugin { if (ctaxcodeid != null) { bodyVO.setCtaxcodeid((String) ctaxcodeid); } - Object ntaxrateVal = hy1.findColValue("bd_taxrate", "taxrate", - " pk_taxcode = '" + ctaxcodeid+ "' and dr=0 "); + String sql1 ="select taxrate from bd_taxrate where pk_taxcode = '1002Z01000000001CNE2' and dr=0 "; + Object ntaxrateVal =new BaseDAO().executeQuery(sql1, new ColumnProcessor()); + + +// Object ntaxrateVal = hy1.findColValue("bd_taxrate", "taxrate", +// " pk_taxcode = '" + ctaxcodeid+ "' and dr=0 "); if (ntaxrateVal != null) { bodyVO.setNtaxrate(new UFDouble(String.valueOf(ntaxrateVal))); } @@ -382,9 +390,17 @@ public class ErpIaI2billFromGyImsPlugin implements IBackgroundWorkPlugin { // 添加到集合 list.add(vo); } - BillMaintainTool tool = new BillMaintainTool( - PurchaseInVO.class, ICBillType.PurchaseIn.getCode()); - tool.insert(list.toArray(new PurchaseInVO[list.size()])); + + try{ +// InsertBP insertBP=new InsertBP(); +// insertBP.insert(list.toArray(new PurchaseInVO[list.size()])); + BillMaintainTool tool = new BillMaintainTool( + PurchaseInVO.class, ICBillType.PurchaseIn.getCode()); + tool.insert(list.toArray(new PurchaseInVO[list.size()])); + } catch (Exception e) { + throw new BusinessException("同步失败:" + e.getMessage(), e); + } + } From b11ca5ed820f97c143651c9f4a30b253206a1dd2 Mon Sep 17 00:00:00 2001 From: mzr Date: Thu, 2 Oct 2025 16:36:07 +0800 Subject: [PATCH 08/32] =?UTF-8?q?=E5=AE=9A=E6=97=B6=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=E9=AB=98=E5=8E=8B=E5=8A=A0=E5=B7=A5=E8=BD=A6=E9=97=B4IMS?= =?UTF-8?q?=E7=9A=84=E6=9D=90=E6=96=99=E5=87=BA=E5=BA=93v0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bs/uapbd/task/MaterialOutGyImsPlugin.java | 261 ++++++++++++++++++ 1 file changed, 261 insertions(+) create mode 100644 uapbd/src/private/nc/bs/uapbd/task/MaterialOutGyImsPlugin.java diff --git a/uapbd/src/private/nc/bs/uapbd/task/MaterialOutGyImsPlugin.java b/uapbd/src/private/nc/bs/uapbd/task/MaterialOutGyImsPlugin.java new file mode 100644 index 00000000..762a39d0 --- /dev/null +++ b/uapbd/src/private/nc/bs/uapbd/task/MaterialOutGyImsPlugin.java @@ -0,0 +1,261 @@ +package nc.bs.uapbd.task; + +import nc.bs.dao.BaseDAO; +import nc.bs.framework.common.NCLocator; +import nc.bs.logging.Log; +import nc.bs.logging.Logger; +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.itf.mmpac.pickm.IPickmQueryService; +import nc.itf.uap.pf.busiflow.PfButtonClickContext; +import nc.jdbc.framework.JdbcSession; +import nc.jdbc.framework.PersistenceManager; +import nc.jdbc.framework.exception.DbException; +import nc.jdbc.framework.processor.MapListProcessor; +import nc.pubitf.ic.m4d.api.IMaterialOutMaintainAPI; +import nc.util.mmf.busi.service.PFPubService; +import nc.util.mmf.framework.base.MMValueCheck; +import nc.vo.bd.material.MaterialVO; +import nc.vo.fi.pub.SqlUtils; +import nc.vo.ic.m4d.entity.MaterialOutBodyVO; +import nc.vo.ic.m4d.entity.MaterialOutHeadVO; +import nc.vo.ic.m4d.entity.MaterialOutVO; +import nc.vo.mmpac.pickm.entity.AggPickmVO; +import nc.vo.pub.BusinessException; +import nc.vo.pub.lang.UFDate; +import nc.vo.pub.lang.UFDateTime; +import nc.vo.pub.lang.UFDouble; +import nc.vo.scmpub.res.billtype.ICBillType; +import nc.vo.scmpub.res.billtype.MMBillType; +import nccloud.baseapp.core.log.NCCForUAPLogger; + +import java.math.BigDecimal; +import java.sql.Connection; +import java.sql.SQLException; +import java.sql.Timestamp; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * 定时同步高压加工车间IMS的材料出库 + * + * @author mzr + * @date 20250930 + */ +public class MaterialOutGyImsPlugin implements IBackgroundWorkPlugin { + + private static final String LOG_INFO_NAME = "gymeslog"; + private static final Log logger = Log.getInstance(LOG_INFO_NAME); + + private SimpleDateFormat DATE_FORMATTER = new SimpleDateFormat("yyyy-MM-dd"); + private SimpleDateFormat DATETIME_FORMATTER = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + // BIP数据源 + public static final BaseDAO baseDAO = new BaseDAO(); + // IMS数据源 + public BaseDAO imsDao; + + /** + * 获取IMS数据源 + */ + public BaseDAO getImsDao() { + if (imsDao == null) { + imsDao = new BaseDAO("gyims"); + // 禁用时间戳ts + imsDao.setAddTimeStamp(false); + } + return imsDao; + } + + @Override + public PreAlertObject executeTask(BgWorkingContext arg0) { + Logger.error("---start----任务开始运行--"); + try { + IPickmQueryService queryService = NCLocator.getInstance().lookup(IPickmQueryService.class); + // IMS 同步状态:BIP:C-创建;U-修改D-删除 IMS:2-MES单据接收完成 + String selSql = "select * from BIPOutMainTab where status != '2'"; + List> mainList = (List>) getImsDao().executeQuery(selSql, new MapListProcessor()); + Set imsIdSet = new HashSet<>(); + for (Map mainMap : mainList) { + String cgeneralhid = mainMap.get("cgeneralhid") + ""; + try { + String pkSql = "select * from BIPOutDetailTab where cgeneralhid = '" + cgeneralhid + "'"; + List> detailList = (List>) getImsDao().executeQuery(pkSql, new MapListProcessor()); + Map> detailIdMap = new HashMap<>(); + for (Map detailMap : detailList) { + detailIdMap.put(detailMap.get("vbdef17") + "", detailMap); + } + if (detailList.isEmpty()) { + continue; + } + String csourcebillhid = detailList.get(0).get("vbdef16") + "";// 备料计划主键 + // 查询备料计划的VO + AggPickmVO[] pickmVOS = queryService.queryBillsByPks(new String[]{csourcebillhid}); + // 调用单据转换规则转换出流程材料出库的VO + MaterialOutVO[] vos = (MaterialOutVO[]) PFPubService.runChangeData(MMBillType.PickMo.getCode(), ICBillType.MaterialOut.getCode(), + pickmVOS, null, PfButtonClickContext.ClassifyByItfdef); + if (MMValueCheck.isEmpty(vos)) { + continue; + } + // 设置行号 + setMaterialOutRowNum(vos); + // 根据IMS字段赋值 + for (MaterialOutVO vo : vos) { + MaterialOutHeadVO hvo = vo.getHead(); + MaterialOutBodyVO[] bodys = vo.getBodys(); + hvo.setVbillcode(mainMap.get("vbillcode") + ""); + hvo.setCreator("BIP"); + hvo.setBillmaker("BIP"); + hvo.setVtrantypecode("4D-01"); + if (mainMap.get("dmakedate") != null && mainMap.get("dmakedate") instanceof Timestamp dmakedate1) { + String dmakedateStr = DATE_FORMATTER.format(dmakedate1); + UFDate dmakedate = new UFDate(dmakedateStr); + hvo.setDmakedate(dmakedate); + } + if (mainMap.get("creationtime") != null && mainMap.get("creationtime") instanceof Timestamp creationtime1) { + String creationtimeStr = DATETIME_FORMATTER.format(creationtime1); + UFDateTime creationtime = new UFDateTime(creationtimeStr); + hvo.setCreationtime(creationtime); + } + for (MaterialOutBodyVO bvo : bodys) { + String getCsourcebillbid = bvo.getCsourcebillbid();// 备料计划明细id + Map detailMap = detailIdMap.get(getCsourcebillbid); + if (detailMap != null) { + // 物料或数量替换 + bvo.setNshouldnum(skipNullNum(detailMap.get("nshouldnum"), bvo.getNshouldnum()));// 应发主数量 + bvo.setNshouldassistnum(skipNullNum(detailMap.get("nshouldassistnum"), bvo.getNshouldassistnum()));// 应发数量 + bvo.setNnum(skipNullNum(detailMap.get("nnum"), bvo.getNnum()));// 实发主数量 + bvo.setNassistnum(skipNullNum(detailMap.get("nassistnum"), bvo.getNassistnum()));// 实发数量 + // 如果物料不相等,则BIP物料替换为IMS物料 + String cmaterialvid = bvo.getCmaterialvid(); + String goodsCode = detailMap.get("cmaterialvid") + ""; + String whereSql = MaterialVO.CODE + " = '" + goodsCode + "'" + " and pk_org = '" + hvo.getPk_org() + "'"; + String goodsId = MyHelper.getStrValByCondition(MaterialVO.getDefaultTableName(), MaterialVO.PK_MATERIAL, + whereSql); + if (!cmaterialvid.equals(goodsId)) { + bvo.setCmaterialvid(goodsId); + } + if ("0".equals(bvo.getVbatchcode())) { + bvo.setVbatchcode(null); + } + } + } + } + IMaterialOutMaintainAPI materialOut = NCLocator.getInstance().lookup(IMaterialOutMaintainAPI.class); + MaterialOutVO[] resultvos = materialOut.insertBills(vos); + if (MMValueCheck.isEmpty(resultvos)) { + continue; + } + imsIdSet.add(cgeneralhid); + } catch (BusinessException e) { + Logger.error("MaterialOutGyImsPlugin Error: ", e); + NCCForUAPLogger.debug("MaterialOutGyImsPlugin Error: " + e.getMessage()); + String updateSql = "update BIPOutMainTab set err_msg = '[err_msg]' where cgeneralhid = '[cgeneralhid]'"; + updateSql = updateSql.replace("[err_msg]", e.getMessage()); + updateSql = updateSql.replace("[cgeneralhid]", cgeneralhid); + NCCForUAPLogger.debug("MaterialOutGyImsPlugin-updateSql = " + updateSql); + int rows = executeUpdate(updateSql, cgeneralhid); + NCCForUAPLogger.debug("MaterialOutGyImsPlugin-rows = " + rows); + } + } + if (!imsIdSet.isEmpty()) { + // 修改状态为 完成 + String inSql = SqlUtils.getInStr("cgeneralhid", imsIdSet.toArray(new String[0]), Boolean.TRUE); + String updateSql = "update BIPOutMainTab set status = '2',err_msg = null where " + inSql; + executeUpdate(updateSql, imsIdSet.toString()); + } + Logger.error("---end----任务结束运行--"); + } catch (Exception e) { + Logger.error("MaterialOutGyImsPlugin Error: ", e); + NCCForUAPLogger.debug("MaterialOutGyImsPlugin Error: " + e.getMessage()); + } + return null; + } + + private UFDouble skipNullNum(Object value, UFDouble num) { + if (value instanceof BigDecimal) { + return new UFDouble((BigDecimal) value); + } + if (num != null) { + return num; + } + return UFDouble.ZERO_DBL; + } + + private void setMaterialOutRowNum(MaterialOutVO[] vos) { + for (int i = 0; i < vos.length; i++) { + MaterialOutVO vo = vos[i]; + MaterialOutBodyVO[] bodys = vo.getBodys(); + if (bodys != null && bodys.length > 0) { + for (int j = 0; j < bodys.length; j++) { + MaterialOutBodyVO body = bodys[j]; + body.setCrowno(String.valueOf((j + 1) * 10)); + } + } + } + } + + private int executeUpdate(String sql, String targetId) throws BusinessException { + + // 2. 直接通过静态工厂方法获取 PersistenceManager + PersistenceManager pm = null; + JdbcSession jdbcSession = null; + Connection conn = null; + int rows = 0; + try { + // 直接调用 PersistenceManager 的静态方法 getInstance() + pm = PersistenceManager.getInstance("gyims"); + pm.setAddTimeStamp(false);// 不添加时间戳ts + + // 2.1 获取 JdbcSession 和 Connection + jdbcSession = pm.getJdbcSession(); + jdbcSession.setSQLTranslator(true); // 保持 SQL 转换 + conn = jdbcSession.getConnection(); + conn.setAutoCommit(false); + logger.info("直接获取PersistenceManager,手动事务开启,targetId:" + targetId); + + // 4. 执行主表+子表操作 (传入共享的 pm) + logger.info("事务内执行更新,targetId:" + targetId); + rows = pm.getJdbcSession().executeUpdate(sql); + logger.info("事务内执行更新,rows:" + rows); + logger.info("事务内操作全部成功,准备提交,targetId:" + targetId); + + } catch (DbException | SQLException e) { // 捕获 DbException 和 SQLException + logger.error("事务执行失败,触发回滚,targetId:" + targetId); + if (conn != null) { + try { + conn.rollback(); + logger.info("事务回滚完成,targetId:" + targetId); + } catch (SQLException rollbackE) { + logger.error("事务回滚异常,targetId:" + targetId); + } + } + throw new BusinessException("备料计划同步事务失败:" + e.getMessage(), e); + + } finally { + if (conn != null) { + try { + conn.commit(); + logger.info("事务提交成功,targetId:" + targetId); + // 恢复自动提交模式,确保不会影响其他操作 + conn.setAutoCommit(true); + } catch (SQLException commitE) { + logger.error("事务提交异常,targetId:" + targetId); + } + } + // 5. 释放 PersistenceManager (至关重要) + if (pm != null) { + try { + pm.release(); // 必须调用 release() 将连接归还给连接池 + logger.info("PersistenceManager 释放完成,targetId:" + targetId); + } catch (Exception releaseE) { + logger.error("PersistenceManager 释放异常", releaseE); + } + } + } + return rows; + } + + +} From b52c051eee063f0c2edca74eff328a4379aaba81 Mon Sep 17 00:00:00 2001 From: mzr Date: Thu, 2 Oct 2025 22:51:23 +0800 Subject: [PATCH 09/32] =?UTF-8?q?=E5=AE=9A=E6=97=B6=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=E9=AB=98=E5=8E=8B=E5=8A=A0=E5=B7=A5=E8=BD=A6=E9=97=B4IMS?= =?UTF-8?q?=E7=9A=84=E6=9D=90=E6=96=99=E5=87=BA=E5=BA=93v1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- uapbd/src/private/nc/bs/uapbd/task/MaterialOutGyImsPlugin.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/uapbd/src/private/nc/bs/uapbd/task/MaterialOutGyImsPlugin.java b/uapbd/src/private/nc/bs/uapbd/task/MaterialOutGyImsPlugin.java index 762a39d0..cb455a14 100644 --- a/uapbd/src/private/nc/bs/uapbd/task/MaterialOutGyImsPlugin.java +++ b/uapbd/src/private/nc/bs/uapbd/task/MaterialOutGyImsPlugin.java @@ -136,9 +136,6 @@ public class MaterialOutGyImsPlugin implements IBackgroundWorkPlugin { if (!cmaterialvid.equals(goodsId)) { bvo.setCmaterialvid(goodsId); } - if ("0".equals(bvo.getVbatchcode())) { - bvo.setVbatchcode(null); - } } } } From 7559d99918f0548f19edb5c82271a42f4f7f60f2 Mon Sep 17 00:00:00 2001 From: mzr Date: Thu, 2 Oct 2025 23:26:09 +0800 Subject: [PATCH 10/32] =?UTF-8?q?=E9=94=80=E5=94=AE=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=E6=8E=A8=E9=80=81=E5=90=AF=E6=BA=90mes-=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../so/m30/rule/approve/AfterApprovingSynchronizeRuleQMS.java | 2 +- .../nc/impl/so/m30/action/main/ApproveSaleOrderAction.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/so/src/private/nc/bs/so/m30/rule/approve/AfterApprovingSynchronizeRuleQMS.java b/so/src/private/nc/bs/so/m30/rule/approve/AfterApprovingSynchronizeRuleQMS.java index ad485c28..0f18fa0a 100644 --- a/so/src/private/nc/bs/so/m30/rule/approve/AfterApprovingSynchronizeRuleQMS.java +++ b/so/src/private/nc/bs/so/m30/rule/approve/AfterApprovingSynchronizeRuleQMS.java @@ -176,8 +176,8 @@ public class AfterApprovingSynchronizeRuleQMS implements IRule { String requestUrl = baseUrl + reqUrl; logger.error("QMS-SaleOrder-url = " + requestUrl); String result = ThirdPartyPostRequestUtil.sendPostRequest(requestUrl, jsonStr); - JSONObject resultObj = JSONObject.parseObject(result); logger.error("QMS-SaleOrder-res = " + result); + JSONObject resultObj = JSONObject.parseObject(result); if (!"true".equals(resultObj.getString("success"))) { logger.error("QMS-SaleOrder-error,result[" + resultObj.toJSONString() + "]"); diff --git a/so/src/private/nc/impl/so/m30/action/main/ApproveSaleOrderAction.java b/so/src/private/nc/impl/so/m30/action/main/ApproveSaleOrderAction.java index 1d84ac29..fb30851f 100644 --- a/so/src/private/nc/impl/so/m30/action/main/ApproveSaleOrderAction.java +++ b/so/src/private/nc/impl/so/m30/action/main/ApproveSaleOrderAction.java @@ -170,7 +170,7 @@ public class ApproveSaleOrderAction { // 在审批后推送到QMS系统 processer.addAfterRule(new AfterApprovingSynchronizeRuleQMS()); // 在审批后推送到高压MES - processer.addAfterRule(new AfterSoSyncRuleGyMes()); + processer.addAfterRule(new AfterSoSyncRuleGyMes()); } private boolean isExistDelivery(String ctranstype) { From 33a73ecbac7754f79dffab37a135f15d8ef9f0e7 Mon Sep 17 00:00:00 2001 From: mzr Date: Fri, 3 Oct 2025 11:52:42 +0800 Subject: [PATCH 11/32] =?UTF-8?q?=E7=AE=B1=E5=8F=98-=E8=B4=A8=E6=A3=80?= =?UTF-8?q?=E6=8A=A5=E5=91=8A=E6=8E=A8=E5=90=AF=E6=BA=90MES?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bs/qc/c003/maintain/ReportInsertBP.java | 2 +- .../qc/c003/maintain/rule/SyncQcQmsRule.java | 26 ++++++++++++++++--- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/qc/src/private/nc/bs/qc/c003/maintain/ReportInsertBP.java b/qc/src/private/nc/bs/qc/c003/maintain/ReportInsertBP.java index 17418c46..2207c256 100644 --- a/qc/src/private/nc/bs/qc/c003/maintain/ReportInsertBP.java +++ b/qc/src/private/nc/bs/qc/c003/maintain/ReportInsertBP.java @@ -48,7 +48,7 @@ public class ReportInsertBP { this.addAfterFinalRule(processer); processer.before(aggVO); BillInsert bo = new BillInsert(); - ReportVO[] vos = (ReportVO[])bo.insert(aggVO); + ReportVO[] vos = (ReportVO[]) bo.insert(aggVO); processer.after(aggVO); return vos; } diff --git a/qc/src/private/nc/bs/qc/c003/maintain/rule/SyncQcQmsRule.java b/qc/src/private/nc/bs/qc/c003/maintain/rule/SyncQcQmsRule.java index 5020419b..003e0483 100644 --- a/qc/src/private/nc/bs/qc/c003/maintain/rule/SyncQcQmsRule.java +++ b/qc/src/private/nc/bs/qc/c003/maintain/rule/SyncQcQmsRule.java @@ -107,10 +107,8 @@ public class SyncQcQmsRule implements IRule { String creatorName = MyHelper.getStrValByCondition("sm_user", UserVO.USER_NAME, UserVO.CUSERID + " = '" + hvo.getBillmaker() + "'"); JSONObject singleObj = new JSONObject(); - String cghth = ""; - if (bvo != null && bvo.length > 0) { - cghth = bvo[0].getVsourcecode(); - } + // 采购合同号 + String cghth = getCghthVal(bvo); // 启源送检单主表 long cts = System.currentTimeMillis(); singleObj.put("batchid", cts); @@ -150,6 +148,26 @@ public class SyncQcQmsRule implements IRule { } } + private String getCghthVal(ArriveItemVO[] bvo) { + String cghth = ""; + if (bvo != null && bvo.length > 0) { + StringBuilder cghthBuilder = new StringBuilder(); + for (int i = 0; i < bvo.length; i++) { + String vsourcecode = bvo[i].getVsourcecode(); + if (vsourcecode == null || vsourcecode.isEmpty() || "~".equals(vsourcecode)) { + continue; + } + if (i > 0) { + cghthBuilder.append(","); + } + cghthBuilder.append(vsourcecode); + // 查询采购员名称 + } + cghth = cghthBuilder.toString(); + } + return cghth; + } + private void buildSyncData1(ReportVO[] useVOs) throws BusinessException { for (ReportVO vo : useVOs) { ReportHeaderVO hvo = vo.getHVO(); From 86a309d3f5f474f7ab89582c3abf2684f0a527fd Mon Sep 17 00:00:00 2001 From: mzr Date: Fri, 3 Oct 2025 15:27:34 +0800 Subject: [PATCH 12/32] =?UTF-8?q?=E7=AE=B1=E5=8F=98-=E8=B4=A8=E6=A3=80?= =?UTF-8?q?=E6=8A=A5=E5=91=8A=E6=8E=A8=E5=90=AF=E6=BA=90MES-=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- qc/src/private/nc/bs/qc/c003/maintain/rule/SyncQcQmsRule.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qc/src/private/nc/bs/qc/c003/maintain/rule/SyncQcQmsRule.java b/qc/src/private/nc/bs/qc/c003/maintain/rule/SyncQcQmsRule.java index 003e0483..36d454db 100644 --- a/qc/src/private/nc/bs/qc/c003/maintain/rule/SyncQcQmsRule.java +++ b/qc/src/private/nc/bs/qc/c003/maintain/rule/SyncQcQmsRule.java @@ -121,7 +121,7 @@ public class SyncQcQmsRule implements IRule { singleObj.put("bz", hvo.getVmemo());// 摘要备注,用于填写送检单的补充说明信息 // 查询关联的质检报告-传入启源送检单的明细 HYPubBO hybo = new HYPubBO(); - ReportItemVO[] reportItemVOS = (ReportItemVO[]) hybo.queryByCondition(ReportItemVO.class, " and cfirstid = '" + pk_arriveorder + "'"); + ReportItemVO[] reportItemVOS = (ReportItemVO[]) hybo.queryByCondition(ReportItemVO.class, " cfirstid = '" + pk_arriveorder + "'"); JSONArray contentArray = new JSONArray(); for (ReportItemVO reportItemVO : reportItemVOS) { String pkReportbill = reportItemVO.getPk_reportbill(); From 8cf5bdd374570c471ef7d60ea8c3c8a94d8940fb Mon Sep 17 00:00:00 2001 From: mzr Date: Sun, 5 Oct 2025 10:37:47 +0800 Subject: [PATCH 13/32] =?UTF-8?q?feat(uapbd):=20=E7=AE=B1=E5=8F=98?= =?UTF-8?q?=E5=90=8C=E6=AD=A5=E7=89=A9=E6=96=99=E6=95=B0=E6=8D=AE=E5=88=B0?= =?UTF-8?q?QMS=E7=B3=BB=E7=BB=9F-=E8=B0=83=E6=95=B4=E7=9B=91=E5=90=AC?= =?UTF-8?q?=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../uapbd/material/listener/MaterialToQmsListener.java | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/uapbd/src/private/nccloud/api/uapbd/material/listener/MaterialToQmsListener.java b/uapbd/src/private/nccloud/api/uapbd/material/listener/MaterialToQmsListener.java index 28020a25..e2403d88 100644 --- a/uapbd/src/private/nccloud/api/uapbd/material/listener/MaterialToQmsListener.java +++ b/uapbd/src/private/nccloud/api/uapbd/material/listener/MaterialToQmsListener.java @@ -43,14 +43,8 @@ public class MaterialToQmsListener implements IBusinessListener { 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)) { + if ("1002".equals(eventType) || "1004".equals(eventType) + || "1071".equals(eventType) || "1069".equals(eventType)) { MaterialVO[] useVOs = ArrayClassConvertUtil.convert(objs, MaterialVO.class); configParams = MyHelper.getConfigParams("xb-config", null); if (configParams.isEmpty()) { From 14a4a3cb8a64b969894b90703904d01c48ff52fb Mon Sep 17 00:00:00 2001 From: lihao Date: Sun, 5 Oct 2025 11:17:53 +0800 Subject: [PATCH 14/32] =?UTF-8?q?erp=E4=BB=8Eims=E4=B8=AD=E9=97=B4?= =?UTF-8?q?=E8=A1=A8=E8=8E=B7=E5=8F=96=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ErpIaI2billFromGyImsPlugin.java | 74 +++++++++++++++++-- 1 file changed, 66 insertions(+), 8 deletions(-) diff --git a/uapbd/src/private/nc/bs/uapbd/bip/workplugin/ErpIaI2billFromGyImsPlugin.java b/uapbd/src/private/nc/bs/uapbd/bip/workplugin/ErpIaI2billFromGyImsPlugin.java index 24a5e238..0a3c3e01 100644 --- a/uapbd/src/private/nc/bs/uapbd/bip/workplugin/ErpIaI2billFromGyImsPlugin.java +++ b/uapbd/src/private/nc/bs/uapbd/bip/workplugin/ErpIaI2billFromGyImsPlugin.java @@ -15,11 +15,17 @@ import nc.vo.ia.mi2.entity.I2HeadVO; import nc.vo.ic.m45.entity.PurchaseInBodyVO; import nc.vo.ic.m45.entity.PurchaseInHeadVO; import nc.vo.ic.m45.entity.PurchaseInVO; +import nc.vo.ic.org.OrgInfoQuery; import nc.vo.pub.BusinessException; import nc.vo.pub.lang.UFDate; import nc.vo.pub.lang.UFDouble; import nc.vo.pubapp.pattern.exception.ExceptionUtils; +import nc.vo.scmpub.check.billvalidate.BillVOsCheckRule; import nc.vo.scmpub.res.billtype.ICBillType; +import nccloud.api.impl.ic.m45.check.CheckPurchaseInSaveValidator; +import nccloud.api.impl.ic.m45.fill.PurchaseInSaveFillValue; +import nccloud.openapi.ic.util.ICAPILocationVOUtils; +import nccloud.openapi.scmpub.pub.TransferCodeToPKTool; import org.eclipse.swt.internal.C; import java.util.ArrayList; @@ -41,6 +47,7 @@ public class ErpIaI2billFromGyImsPlugin implements IBackgroundWorkPlugin { List> remain = (List>) imsDao.executeQuery(sql, new MapListProcessor()); if (remain != null && remain.size() > 0) { + try{ List list = new ArrayList(); for (Map map : remain) { HYPubBO hy = new HYPubBO(); @@ -61,7 +68,7 @@ public class ErpIaI2billFromGyImsPlugin implements IBackgroundWorkPlugin { Object pk_org_v = hy.findColValue("org_stockorg_v", "pk_vid", "code = '"+map.get("pk_org")+"' "); - head.setPk_org((String) pk_org_v); // 对应字段pk_org_v + head.setPk_org_v((String) pk_org_v); // 对应字段pk_org_v Object busicode = hy.findColValue("bd_busitype", "pk_busitype", "busicode = '"+map.get("busicode")+"' "); @@ -107,9 +114,11 @@ public class ErpIaI2billFromGyImsPlugin implements IBackgroundWorkPlugin { head.setTaudittime(new UFDate(String.valueOf(map.get("taudittime"))) ); // 日期类型 } + map.put("cpayfinorgoid","C003"); Object cpayfinorgoid = hy.findColValue("org_financeorg", "pk_financeorg", " code = '"+map.get("cpayfinorgoid")+"' and dr='0' "); - - head.setCpayfinorgoid((String) cpayfinorgoid); + if(cpayfinorgoid !=null){ + head.setCpayfinorgoid((String) cpayfinorgoid); + } Object cfanaceorgoid = hy.findColValue("org_financeorg", "pk_financeorg", " code = '"+map.get("cfanaceorgoid")+"' and dr='0' "); @@ -118,7 +127,13 @@ public class ErpIaI2billFromGyImsPlugin implements IBackgroundWorkPlugin { Object cpurorgoid = hy.findColValue("org_purchaseorg", "pk_purchaseorg", " code = '"+map.get("cpurorgoid")+"' and dr='0' "); head.setCpurorgoid((String) cpurorgoid); - head.setCvendorvid((String) map.get("cvendorvid")); + + Object cvendorid = hy.findColValue("bd_supplier", "pk_supplier", " code = '"+map.get("cvendorvid")+"' and dr='0' "); + head.setCvendorid((String)cvendorid); + + Object cvendorvid = hy.findColValue("bd_supplier_v", "pk_supplier_v", " pk_supplier = '"+cvendorid+"' and dr='0' "); + + head.setCvendorvid((String)cvendorvid); head.setDmakedate(new UFDate(String.valueOf(map.get("dmakedate")))); // 日期类型 Object csendcountryid = hy.findColValue("bd_countryzone", "pk_country", " code = '"+"CN"+"' and dr='0' "); @@ -378,10 +393,10 @@ public class ErpIaI2billFromGyImsPlugin implements IBackgroundWorkPlugin { } // 供应商基本信息(查询结果非null时赋值) - String cvendorid = (String) hy1.findColValue("bd_supplierclass", "pk_supplierclass", + String cvendorid1 = (String) hy1.findColValue("bd_supplier", "pk_supplier", " code = '" + body.get("cvendorid") + "' and dr=0 "); - if (cvendorid != null) { - bodyVO.setCvendorid(cvendorid); + if (cvendorid1 != null) { + bodyVO.setCvendorid(cvendorid1); } list1.add(bodyVO); @@ -391,9 +406,52 @@ public class ErpIaI2billFromGyImsPlugin implements IBackgroundWorkPlugin { list.add(vo); } - try{ + + PurchaseInVO[] vos =list.toArray(new PurchaseInVO[list.size()]) ; // InsertBP insertBP=new InsertBP(); // insertBP.insert(list.toArray(new PurchaseInVO[list.size()])); + ICAPILocationVOUtils.setLocationVO(ICBillType.PurchaseIn.getCode(), vos); + // 1、传入数据基本非空校验 + BillVOsCheckRule checker = + new BillVOsCheckRule(new CheckPurchaseInSaveValidator()); + //2025年4月23日15点10分 采购入库单接口项目字段为波浪则清空 sdlizheng --start + for (PurchaseInVO vo : vos) { + PurchaseInBodyVO[] bodys = vo.getBodys(); + if (bodys != null && bodys.length > 0) { + String[] attributeNames = bodys[0].getAttributeNames(); + for (PurchaseInBodyVO body : bodys) { + for (String fildName : attributeNames) { + if (body.getAttributeValue(fildName) != null && "~".equals(body.getAttributeValue(fildName))) { + body.setAttributeValue(fildName, null); + } + } + } + } + + } + //2025年4月23日15点10分 采购入库单接口项目字段为波浪则清空 sdlizheng --end + //添加供应商和交易类型为空赋值 + + checker.check(vos); + + // 翻译货位 + ICAPILocationVOUtils.translate(vos); + + //begin没取到财务组织导致的报错,在这里给财务组织赋值为库存组织 +// for (PurchaseInVO vo : vos) { +// if (vo.getHead().getCfanaceorgoid() != null) { +// continue; +// } +// String cfinanceoid = (new OrgInfoQuery()).getFinanceOrgIDByCalBodyID(vo.getHead().getPk_org()); +// String cfinancevid = (new OrgInfoQuery()).getFinanceOrgVIDByCalBodyID(vo.getHead().getPk_org()); +// vo.getHead().setCfanaceorgoid(cfinanceoid); +// vo.getHead().setCfanaceorgvid(cfinancevid); +// } + //end + + // 3、其他数据填充 +// new PurchaseInSaveFillValue().setDefaultValue(vos); + BillMaintainTool tool = new BillMaintainTool( PurchaseInVO.class, ICBillType.PurchaseIn.getCode()); tool.insert(list.toArray(new PurchaseInVO[list.size()])); From c60bdcc4ecab84295f5b567e876dfc7e5e44e2d4 Mon Sep 17 00:00:00 2001 From: mzr Date: Sun, 5 Oct 2025 16:26:43 +0800 Subject: [PATCH 15/32] =?UTF-8?q?feat(qc):=20=20=E5=9C=A8=E8=B4=A8?= =?UTF-8?q?=E6=A3=80=E6=8A=A5=E5=91=8A=E5=90=8C=E6=AD=A5=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E4=B8=AD=E5=A2=9E=E5=8A=A0=E8=B4=A8=E6=A3=80=E6=8A=A5=E5=91=8A?= =?UTF-8?q?ID=E5=92=8C=E6=98=8E=E7=BB=86ID=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- qc/src/private/nc/bs/qc/c003/maintain/rule/SyncQcQmsRule.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/qc/src/private/nc/bs/qc/c003/maintain/rule/SyncQcQmsRule.java b/qc/src/private/nc/bs/qc/c003/maintain/rule/SyncQcQmsRule.java index 36d454db..774b0ebe 100644 --- a/qc/src/private/nc/bs/qc/c003/maintain/rule/SyncQcQmsRule.java +++ b/qc/src/private/nc/bs/qc/c003/maintain/rule/SyncQcQmsRule.java @@ -141,6 +141,8 @@ public class SyncQcQmsRule implements IRule { itemObj.put("sjsl", reportHeaderVO.getNapplynum().toString()); // 送检数量(设计单位),按设计计量单位统计的送检数量 itemObj.put("jldw", cunitname); // 计量单位 itemObj.put("bz", reportItemVO.getVbdef1()); // 明细备注,用于填写该送检物料的补充说明 + itemObj.put("bipzyid", pkReportbill); // 质检报告ID + itemObj.put("bipqdid", reportItemVO.getPk_reportbill_b()); // 质检报告明细ID contentArray.add(itemObj); } singleObj.put("Content", contentArray); @@ -271,8 +273,8 @@ public class SyncQcQmsRule implements IRule { logger.error("QMS-QC-res = " + result); if (!"true".equals(resultObj.getString("success"))) { - // throw new BusinessException("QMS-QC-error:" + resultObj.getString("msg")); logger.error("QMS-QC-error,result[" + resultObj.toJSONString() + "]"); + throw new BusinessException("QMS-QC-error:" + resultObj.getString("message")); } } From 072acffbfaa6d4a307a316b6466364703fdfcc23 Mon Sep 17 00:00:00 2001 From: mzr Date: Sun, 5 Oct 2025 16:27:24 +0800 Subject: [PATCH 16/32] =?UTF-8?q?feat(material):=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=AF=B9=E7=89=A9=E6=96=99=E6=89=B9=E6=94=B9=E4=BA=8B=E4=BB=B6?= =?UTF-8?q?=E7=9A=84=E5=A4=84=E7=90=86=E5=B9=B6=E4=BC=98=E5=8C=96=E5=9E=8B?= =?UTF-8?q?=E5=8F=B7=E8=A7=84=E6=A0=BC=E5=AD=97=E6=AE=B5-=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E5=AF=B9=E4=BA=8B=E4=BB=B6=E7=B1=BB=E5=9E=8B1061?= =?UTF-8?q?=EF=BC=88=E6=89=B9=E6=94=B9=E5=90=8E=EF=BC=89=E7=9A=84=E6=94=AF?= =?UTF-8?q?=E6=8C=81=20-=20=E4=BC=98=E5=8C=96=E7=89=A9=E6=96=99=E5=9E=8B?= =?UTF-8?q?=E5=8F=B7=E8=A7=84=E6=A0=BC=E5=AD=97=E6=AE=B5=E7=9A=84=E6=8B=BC?= =?UTF-8?q?=E6=8E=A5=E9=80=BB=E8=BE=91=EF=BC=8C=E9=81=BF=E5=85=8D=E7=A9=BA?= =?UTF-8?q?=E6=8C=87=E9=92=88=E5=BC=82=E5=B8=B8=20-=20=E4=BD=BF=E7=94=A8My?= =?UTF-8?q?Helper.skipNull=E6=96=B9=E6=B3=95=E7=A1=AE=E4=BF=9D=E7=89=A9?= =?UTF-8?q?=E6=96=99=E7=B1=BB=E5=9E=8B=E5=92=8C=E8=A7=84=E6=A0=BC=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E5=AE=89=E5=85=A8=E6=8B=BC=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/uapbd/material/listener/MaterialToQmsListener.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/uapbd/src/private/nccloud/api/uapbd/material/listener/MaterialToQmsListener.java b/uapbd/src/private/nccloud/api/uapbd/material/listener/MaterialToQmsListener.java index e2403d88..3009cfb0 100644 --- a/uapbd/src/private/nccloud/api/uapbd/material/listener/MaterialToQmsListener.java +++ b/uapbd/src/private/nccloud/api/uapbd/material/listener/MaterialToQmsListener.java @@ -42,8 +42,8 @@ public class MaterialToQmsListener implements IBusinessListener { String eventType = event.getEventType(); Object[] objs = e.getObjs(); - // EventType是事件编码 1002-新增后 1004-修改后 1071-状态由停用变为启用后 1069-状态由启用变为停用后 - if ("1002".equals(eventType) || "1004".equals(eventType) + // EventType是事件编码 1002-新增后 1004-修改后 1071-状态由停用变为启用后 1069-状态由启用变为停用后 1061批改后 + if ("1002".equals(eventType) || "1004".equals(eventType) || "1061".equals(eventType) || "1071".equals(eventType) || "1069".equals(eventType)) { MaterialVO[] useVOs = ArrayClassConvertUtil.convert(objs, MaterialVO.class); configParams = MyHelper.getConfigParams("xb-config", null); @@ -112,7 +112,8 @@ public class MaterialToQmsListener implements IBusinessListener { contentObj.put("meswlbh", vo.getCode()); // 启源物料编码 contentObj.put("bipwlbh", vo.getCode()); // BIP物料编码 contentObj.put("wlmc", vo.getName()); // 物料名称 - contentObj.put("wlxhgg", vo.getMaterialtype() + vo.getMaterialspec()); // 物料型号规格 + String wlxhgg = MyHelper.skipNull(vo.getMaterialtype()) + MyHelper.skipNull(vo.getMaterialspec()); + contentObj.put("wlxhgg", wlxhgg); // 物料型号规格 contentObj.put("wlfl", mrlTypeName); // 物料分类 contentObj.put("wlbz", "产品"); // 物料标志 contentObj.put("sjjldw", unitMap.get("unitname")); // 设计计量单位 From db004abc7c33e2a764bebd32ddaeac55b43665a5 Mon Sep 17 00:00:00 2001 From: mzr Date: Sun, 5 Oct 2025 16:43:03 +0800 Subject: [PATCH 17/32] =?UTF-8?q?fix(pmo):=20=E5=90=8C=E6=AD=A5QMS?= =?UTF-8?q?=E5=AE=A1=E6=89=B9=E5=90=8E=E5=A4=84=E7=90=86=E9=80=BB=E8=BE=91?= =?UTF-8?q?-=20=E5=A2=9E=E5=8A=A0=E4=BA=A7=E5=93=81=E7=BC=96=E5=8F=B7?= =?UTF-8?q?=E3=80=81=E5=90=8D=E7=A7=B0=E5=92=8C=E5=9E=8B=E5=8F=B7=E8=A7=84?= =?UTF-8?q?=E6=A0=BC=E7=9A=84=E6=B3=A8=E9=87=8A=E8=AF=B4=E6=98=8E=20-=20?= =?UTF-8?q?=E4=BF=AE=E5=A4=8DQMS=E5=90=8C=E6=AD=A5=E5=A4=B1=E8=B4=A5?= =?UTF-8?q?=E6=97=B6=E7=9A=84=E5=BC=82=E5=B8=B8=E6=8A=9B=E5=87=BA=E9=80=BB?= =?UTF-8?q?=E8=BE=91=20-=20=E8=B0=83=E6=95=B4=E9=94=99=E8=AF=AF=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=E8=8E=B7=E5=8F=96=E5=AD=97=E6=AE=B5=E4=BB=8Emsg?= =?UTF-8?q?=E6=94=B9=E4=B8=BAmessage=20-=E4=BF=9D=E7=95=99=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E6=97=A5=E5=BF=97=E8=AE=B0=E5=BD=95=E5=B9=B6=E5=A2=9E?= =?UTF-8?q?=E5=BC=BA=E5=BC=82=E5=B8=B8=E6=8F=90=E7=A4=BA=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pmo/pac0002/bp/rule/AfterApproveSyncQMSRule.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/rule/AfterApproveSyncQMSRule.java b/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/rule/AfterApproveSyncQMSRule.java index 9e0581bb..97a683a6 100644 --- a/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/rule/AfterApproveSyncQMSRule.java +++ b/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/rule/AfterApproveSyncQMSRule.java @@ -87,10 +87,10 @@ public class AfterApproveSyncQMSRule implements IRule { itemObj.put("sgdh", pmoHeadVO.getVbillcode()); itemObj.put("xshth", projectCode); itemObj.put("htqdxh", item.getVfirstrowno()); - itemObj.put("wlbh", mrlmap.get("code")); - itemObj.put("wlmc", mrlmap.get("name")); + itemObj.put("wlbh", mrlmap.get("code"));// 产品编号 + itemObj.put("wlmc", mrlmap.get("name"));// 产品名称 String wlxhgg = MyHelper.skipNull(mrlmap.get("materialspec")) + MyHelper.skipNull(mrlmap.get("materialtype")); - itemObj.put("wlxhgg", wlxhgg); + itemObj.put("wlxhgg", wlxhgg);// 产品型号规格 itemObj.put("jhsl", item.getNastnum().toString()); UFDateTime tplanendtime = item.getTplanendtime(); String tplanendtimeStr = ""; @@ -126,8 +126,8 @@ public class AfterApproveSyncQMSRule implements IRule { logger.error("QMS-PMO-XB-res = " + result); if (!"true".equals(resultObj.getString("success"))) { - // throw new BusinessException("QMS-PMO-XB-error:" + resultObj.getString("msg")); logger.error("QMS-PMO-XB-error,result[" + resultObj.toJSONString() + "]"); + throw new BusinessException("QMS-PMO-XB-error:" + resultObj.getString("message")); } } From 111828326db386c5e839d62699cb5a8129e6a08e Mon Sep 17 00:00:00 2001 From: mzr Date: Sun, 5 Oct 2025 18:03:01 +0800 Subject: [PATCH 18/32] =?UTF-8?q?fix(so):=E9=94=80=E5=94=AE=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E6=8E=A8=E9=80=81=E5=90=AF=E6=BA=90mes=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../approve/AfterApprovingSynchronizeRuleQMS.java | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/so/src/private/nc/bs/so/m30/rule/approve/AfterApprovingSynchronizeRuleQMS.java b/so/src/private/nc/bs/so/m30/rule/approve/AfterApprovingSynchronizeRuleQMS.java index 0f18fa0a..688dce5c 100644 --- a/so/src/private/nc/bs/so/m30/rule/approve/AfterApprovingSynchronizeRuleQMS.java +++ b/so/src/private/nc/bs/so/m30/rule/approve/AfterApprovingSynchronizeRuleQMS.java @@ -115,14 +115,19 @@ public class AfterApprovingSynchronizeRuleQMS implements IRule { itemObj.put("wlbh", mrlmap.get("code")); itemObj.put("wlmc", mrlmap.get("name")); - itemObj.put("wlxhgg", ((String) mrlmap.get("materialspec") != null ? mrlmap.get("materialspec").toString() : "") + ((String) mrlmap.get("materialtype") != null ? mrlmap.get("materialtype").toString() : "")); + String wlxhgg = (mrlmap.get("materialspec") != null ? mrlmap.get("materialspec").toString() : "") + (mrlmap.get("materialtype") != null ? mrlmap.get("materialtype").toString() : ""); + itemObj.put("wlxhgg", wlxhgg); itemObj.put("dhsl", item.getNastnum().doubleValue()); itemObj.put("xsj", item.getNqtorigtaxprice().doubleValue()); itemObj.put("bxzje", item.getNqtorigtaxprice().doubleValue()); - itemObj.put("jhrq", item.getDsenddate().toString().substring(0, 10)); + if (item.getDsenddate() != null) { + itemObj.put("jhrq", item.getDsenddate().toString().substring(0, 10)); + } else { + itemObj.put("jhrq", ""); + } itemObj.put("bz", item.getVrownote()); - Object pk_project = hybo.findColValue("bd_project", "project_name", " pk_project = '" + item.getCprojectid() + "' "); - itemObj.put("xmmc", pk_project); + Object project_name = hybo.findColValue("bd_project", "project_name", " project_name = '" + item.getCprojectid() + "' "); + itemObj.put("xmmc", project_name); contentArray.add(itemObj); } From 4de8c5b102f0a52e872d4c2fa5adb89293f45464 Mon Sep 17 00:00:00 2001 From: mzr Date: Tue, 7 Oct 2025 12:39:13 +0800 Subject: [PATCH 19/32] =?UTF-8?q?feat(bom):=20=E5=AE=9E=E7=8E=B0BOM?= =?UTF-8?q?=E5=90=8C=E6=AD=A5=E5=A4=B1=E8=B4=A5=E5=90=8E=E7=9A=84=E9=94=99?= =?UTF-8?q?=E8=AF=AF=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修改后同步艾普MES的BOM @@ -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; + +/** + * 定时同步推送失败的BOM到艾普MES + * + * @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); + } + } +} From 50838e11bc8eaaacb033eb2bfcec7a53811fe2d6 Mon Sep 17 00:00:00 2001 From: mzr Date: Wed, 8 Oct 2025 10:48:01 +0800 Subject: [PATCH 20/32] =?UTF-8?q?feat(uapbd):=20=E7=89=A9=E6=96=99?= =?UTF-8?q?=E5=90=8C=E6=AD=A5=E8=87=B3=E8=89=BE=E6=99=AEMES=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E5=BC=82=E5=B8=B8=E6=8D=95=E8=8E=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../listener/MaterialToEpicMesListener.java | 64 ++++++++++--------- 1 file changed, 34 insertions(+), 30 deletions(-) diff --git a/uapbd/src/private/nccloud/api/uapbd/material/listener/MaterialToEpicMesListener.java b/uapbd/src/private/nccloud/api/uapbd/material/listener/MaterialToEpicMesListener.java index 25ce8095..ffe16156 100644 --- a/uapbd/src/private/nccloud/api/uapbd/material/listener/MaterialToEpicMesListener.java +++ b/uapbd/src/private/nccloud/api/uapbd/material/listener/MaterialToEpicMesListener.java @@ -46,39 +46,43 @@ public class MaterialToEpicMesListener implements IBusinessListener { Object[] objs = e.getObjs(); // EventType是事件编码 1002-新增后 1004-修改后 1071-状态由停用变为启用后 1069-状态由启用变为停用后 1061批改后 - if ("1002".equals(eventType) || "1004".equals(eventType) || "1061".equals(eventType) || - "1071".equals(eventType) || "1069".equals(eventType)) { - MaterialVO[] useVOs = ArrayClassConvertUtil.convert(objs, MaterialVO.class); - configParams = MyHelper.getConfigParams("Dldz-config", null); - if (configParams.isEmpty()) { - throw new BusinessException("电力电子的艾普MES接口缺少配置"); - } - buildSyncData(useVOs, eventType); - } else if ("1009".equals(eventType)) { - // 物料可见性范围-分配后 1009 - configParams = MyHelper.getConfigParams("Dldz-config", null); - if (configParams.isEmpty()) { - throw new BusinessException("电力电子的艾普MES接口缺少配置"); - } - 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 (MyHelper.checkIfDldzOrg(orgCode, configParams)) { - continue; + try { + if ("1002".equals(eventType) || "1004".equals(eventType) || "1061".equals(eventType) || + "1071".equals(eventType) || "1069".equals(eventType)) { + MaterialVO[] useVOs = ArrayClassConvertUtil.convert(objs, MaterialVO.class); + configParams = MyHelper.getConfigParams("Dldz-config", null); + if (configParams.isEmpty()) { + throw new BusinessException("电力电子的艾普MES接口缺少配置"); } - MaterialVO materialVO = (MaterialVO) hyPub.queryByPrimaryKey(MaterialVO.class, pkMaterial); - voList.add(materialVO); - } - if (!voList.isEmpty()) { - MaterialVO[] useVOs = voList.toArray(new MaterialVO[0]); buildSyncData(useVOs, eventType); - } + } else if ("1009".equals(eventType)) { + // 物料可见性范围-分配后 1009 + configParams = MyHelper.getConfigParams("Dldz-config", null); + if (configParams.isEmpty()) { + throw new BusinessException("电力电子的艾普MES接口缺少配置"); + } + 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 (MyHelper.checkIfDldzOrg(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); + } + } + } catch (BusinessException ex) { + logDl.error("EpicMes-Material-exp:" + ex.getMessage(), ex); } } From a570991e7c3c6334491094febf9ed1b4ac8a8258 Mon Sep 17 00:00:00 2001 From: mzr Date: Wed, 8 Oct 2025 10:49:09 +0800 Subject: [PATCH 21/32] =?UTF-8?q?fix(qc):=20=E6=9B=B4=E6=96=B0=E8=B4=A8?= =?UTF-8?q?=E6=A3=80=E6=8A=A5=E5=91=8A=E8=B5=84=E6=BA=90=E6=8F=8F=E8=BF=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- qc/META-INF/pc_report.rest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qc/META-INF/pc_report.rest b/qc/META-INF/pc_report.rest index 9d9c46b3..8473d139 100644 --- a/qc/META-INF/pc_report.rest +++ b/qc/META-INF/pc_report.rest @@ -1,6 +1,6 @@ - + From 08659ccb92dea24e4f07bc96ccfaf6075affe2c8 Mon Sep 17 00:00:00 2001 From: mzr Date: Wed, 8 Oct 2025 11:13:45 +0800 Subject: [PATCH 22/32] =?UTF-8?q?=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E5=8C=85=E8=B7=AF=E5=BE=84=E7=A7=BB=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nc/bs/uapbd/task/{ => ims}/MaterialOutGyImsPlugin.java | 2 +- .../nc/bs/uapbd/task/{ => ims}/ProductReportGyImsPlugin.java | 2 +- .../nc/bs/uapbd/task/{base => mes/epic}/BomToEpicMesPlugin.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename uapbd/src/private/nc/bs/uapbd/task/{ => ims}/MaterialOutGyImsPlugin.java (99%) rename uapbd/src/private/nc/bs/uapbd/task/{ => ims}/ProductReportGyImsPlugin.java (99%) rename uapbd/src/private/nc/bs/uapbd/task/{base => mes/epic}/BomToEpicMesPlugin.java (99%) diff --git a/uapbd/src/private/nc/bs/uapbd/task/MaterialOutGyImsPlugin.java b/uapbd/src/private/nc/bs/uapbd/task/ims/MaterialOutGyImsPlugin.java similarity index 99% rename from uapbd/src/private/nc/bs/uapbd/task/MaterialOutGyImsPlugin.java rename to uapbd/src/private/nc/bs/uapbd/task/ims/MaterialOutGyImsPlugin.java index cb455a14..a0d17ab5 100644 --- a/uapbd/src/private/nc/bs/uapbd/task/MaterialOutGyImsPlugin.java +++ b/uapbd/src/private/nc/bs/uapbd/task/ims/MaterialOutGyImsPlugin.java @@ -1,4 +1,4 @@ -package nc.bs.uapbd.task; +package nc.bs.uapbd.task.ims; import nc.bs.dao.BaseDAO; import nc.bs.framework.common.NCLocator; diff --git a/uapbd/src/private/nc/bs/uapbd/task/ProductReportGyImsPlugin.java b/uapbd/src/private/nc/bs/uapbd/task/ims/ProductReportGyImsPlugin.java similarity index 99% rename from uapbd/src/private/nc/bs/uapbd/task/ProductReportGyImsPlugin.java rename to uapbd/src/private/nc/bs/uapbd/task/ims/ProductReportGyImsPlugin.java index 69a061e5..bdda63cc 100644 --- a/uapbd/src/private/nc/bs/uapbd/task/ProductReportGyImsPlugin.java +++ b/uapbd/src/private/nc/bs/uapbd/task/ims/ProductReportGyImsPlugin.java @@ -1,4 +1,4 @@ -package nc.bs.uapbd.task; +package nc.bs.uapbd.task.ims; import nc.bs.dao.BaseDAO; import nc.bs.framework.common.NCLocator; diff --git a/uapbd/src/private/nc/bs/uapbd/task/base/BomToEpicMesPlugin.java b/uapbd/src/private/nc/bs/uapbd/task/mes/epic/BomToEpicMesPlugin.java similarity index 99% rename from uapbd/src/private/nc/bs/uapbd/task/base/BomToEpicMesPlugin.java rename to uapbd/src/private/nc/bs/uapbd/task/mes/epic/BomToEpicMesPlugin.java index 8fb22b3e..0b17a7da 100644 --- a/uapbd/src/private/nc/bs/uapbd/task/base/BomToEpicMesPlugin.java +++ b/uapbd/src/private/nc/bs/uapbd/task/mes/epic/BomToEpicMesPlugin.java @@ -1,4 +1,4 @@ -package nc.bs.uapbd.task.base; +package nc.bs.uapbd.task.mes.epic; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; From 017bc22632389582a7547fc4795e03f19ae25cf6 Mon Sep 17 00:00:00 2001 From: mzr Date: Wed, 8 Oct 2025 11:26:12 +0800 Subject: [PATCH 23/32] =?UTF-8?q?fix(qc):=E5=90=AF=E6=BA=90-=E8=B4=A8?= =?UTF-8?q?=E6=A3=80=E6=8A=A5=E5=91=8A-cghth-=E5=80=BC=E6=8B=BC=E6=8E=A5?= =?UTF-8?q?=E4=B8=AD=E5=A2=9E=E5=8A=A0=E9=87=87=E8=B4=AD=E5=91=98=E5=90=8D?= =?UTF-8?q?=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../qc/c003/maintain/rule/SyncQcQmsRule.java | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/qc/src/private/nc/bs/qc/c003/maintain/rule/SyncQcQmsRule.java b/qc/src/private/nc/bs/qc/c003/maintain/rule/SyncQcQmsRule.java index 774b0ebe..2892a595 100644 --- a/qc/src/private/nc/bs/qc/c003/maintain/rule/SyncQcQmsRule.java +++ b/qc/src/private/nc/bs/qc/c003/maintain/rule/SyncQcQmsRule.java @@ -73,9 +73,8 @@ public class SyncQcQmsRule implements IRule { ArriveVO[] arriveVOS = billquery.query(firstIds.toArray(new String[0])); buildSyncData(arriveVOS); } - // 组织数据 - // buildSyncData(reportVOS); } catch (Exception e) { + logger.error("SyncQcQmsRule-exp:" + e.getMessage(), e); ExceptionUtils.wrappException(e); } } @@ -108,7 +107,7 @@ public class SyncQcQmsRule implements IRule { UserVO.CUSERID + " = '" + hvo.getBillmaker() + "'"); JSONObject singleObj = new JSONObject(); // 采购合同号 - String cghth = getCghthVal(bvo); + String cghth = getCghthVal(hvo, bvo); // 启源送检单主表 long cts = System.currentTimeMillis(); singleObj.put("batchid", cts); @@ -150,8 +149,15 @@ public class SyncQcQmsRule implements IRule { } } - private String getCghthVal(ArriveItemVO[] bvo) { + private String getCghthVal(ArriveHeaderVO hvo, ArriveItemVO[] bvo) throws BusinessException { String cghth = ""; + String pkPupsndoc = hvo.getPk_pupsndoc(); + // 查询采购员名称 + String name = ""; + if (pkPupsndoc != null && !pkPupsndoc.isEmpty() && !"~".equals(pkPupsndoc)) { + name = MyHelper.getStrValByCondition(PsndocVO.getDefaultTableName(), PsndocVO.NAME, + PsndocVO.PK_PSNDOC + "'" + pkPupsndoc + "'"); + } if (bvo != null && bvo.length > 0) { StringBuilder cghthBuilder = new StringBuilder(); for (int i = 0; i < bvo.length; i++) { @@ -163,7 +169,9 @@ public class SyncQcQmsRule implements IRule { cghthBuilder.append(","); } cghthBuilder.append(vsourcecode); - // 查询采购员名称 + if (!name.isEmpty()) { + cghthBuilder.append(name); + } } cghth = cghthBuilder.toString(); } From 0a6c25f799d8c67f86a8e5c0e9cf66af695b9cc9 Mon Sep 17 00:00:00 2001 From: mzr Date: Wed, 8 Oct 2025 11:45:22 +0800 Subject: [PATCH 24/32] =?UTF-8?q?fix(qc):=E4=BF=AE=E6=AD=A3SQL=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E6=9D=A1=E4=BB=B6=E6=8B=BC=E6=8E=A5=E9=94=99=E8=AF=AF?= =?UTF-8?q?-=20=E4=BF=AE=E5=A4=8D=E4=BA=86SyncQcQmsRule=E7=B1=BB=E4=B8=AD?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E4=BA=BA=E5=91=98=E5=90=8D=E7=A7=B0=E6=97=B6?= =?UTF-8?q?=E7=9A=84SQL=E8=AF=AD=E6=B3=95=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- qc/src/private/nc/bs/qc/c003/maintain/rule/SyncQcQmsRule.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qc/src/private/nc/bs/qc/c003/maintain/rule/SyncQcQmsRule.java b/qc/src/private/nc/bs/qc/c003/maintain/rule/SyncQcQmsRule.java index 2892a595..b814bf5b 100644 --- a/qc/src/private/nc/bs/qc/c003/maintain/rule/SyncQcQmsRule.java +++ b/qc/src/private/nc/bs/qc/c003/maintain/rule/SyncQcQmsRule.java @@ -156,7 +156,7 @@ public class SyncQcQmsRule implements IRule { String name = ""; if (pkPupsndoc != null && !pkPupsndoc.isEmpty() && !"~".equals(pkPupsndoc)) { name = MyHelper.getStrValByCondition(PsndocVO.getDefaultTableName(), PsndocVO.NAME, - PsndocVO.PK_PSNDOC + "'" + pkPupsndoc + "'"); + PsndocVO.PK_PSNDOC + " = '" + pkPupsndoc + "'"); } if (bvo != null && bvo.length > 0) { StringBuilder cghthBuilder = new StringBuilder(); From 89a7b814944d257a1eb9bb272634b801ecc4dc60 Mon Sep 17 00:00:00 2001 From: mzr Date: Wed, 8 Oct 2025 21:19:38 +0800 Subject: [PATCH 25/32] =?UTF-8?q?=E7=94=B5=E5=8A=9B=E7=94=B5=E5=AD=90-?= =?UTF-8?q?=E8=89=BE=E6=99=AEMES-BOM=E5=92=8C=E7=89=A9=E6=96=99-=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E5=BC=82=E5=B8=B8=E5=A4=84=E7=90=86=E5=8F=8A=E5=AE=9A?= =?UTF-8?q?=E6=97=B6=E9=87=8D=E6=8E=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bom0202/rule/BomSaveAfterEpicMesRule.java | 12 +- .../task/mes/epic/BomToEpicMesPlugin.java | 6 +- .../mes/epic/MaterialToEpicMesPlugin.java | 210 ++++++++++++++++++ .../listener/MaterialToEpicMesListener.java | 47 +++- 4 files changed, 259 insertions(+), 16 deletions(-) create mode 100644 uapbd/src/private/nc/bs/uapbd/task/mes/epic/MaterialToEpicMesPlugin.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 4fc15736..a2dd97fc 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 @@ -53,9 +53,13 @@ public class BomSaveAfterEpicMesRule implements IRule { pushData(data, vos); } } catch (BusinessException e) { - logDl.error("EpicMes-BOM-exp:" + e.getMessage(), e); - handleSyncBomExp(vos, "N", e.getMessage()); - ExceptionUtils.wrappException(e); + String message = e.getMessage(); + logDl.error("EpicMes-BOM-exp:" + message, e); + if (message != null && message.contains("Connection timed out")) { + handleSyncBomExp(vos, "N", message); + } else { + ExceptionUtils.wrappException(e); + } } } } @@ -170,7 +174,7 @@ public class BomSaveAfterEpicMesRule implements IRule { updateSql = updateSql.replace("[errorCode]", errorCode); int updatedRows = getDao().executeUpdate(updateSql); } catch (BusinessException e) { - logDl.error("EpicMes-BOM-updateErrorInfo = " + e.getMessage(), e); + logDl.error("EpicMes-BOM-handleSyncBomExp = " + e.getMessage(), e); } } diff --git a/uapbd/src/private/nc/bs/uapbd/task/mes/epic/BomToEpicMesPlugin.java b/uapbd/src/private/nc/bs/uapbd/task/mes/epic/BomToEpicMesPlugin.java index 0b17a7da..92ef568b 100644 --- a/uapbd/src/private/nc/bs/uapbd/task/mes/epic/BomToEpicMesPlugin.java +++ b/uapbd/src/private/nc/bs/uapbd/task/mes/epic/BomToEpicMesPlugin.java @@ -29,7 +29,7 @@ import java.util.Map; import java.util.Set; /** - * 定时同步推送失败的BOM到艾普MES + * BOM-艾普MES-定时重推失败的数据 * * @author mzr * @date 20251006 @@ -51,7 +51,7 @@ public class BomToEpicMesPlugin implements IBackgroundWorkPlugin { @Override public PreAlertObject executeTask(BgWorkingContext bgWorkingContext) throws BusinessException { try { - String sql = " select * from v_bip_so_cron"; + String sql = " select * from v_mes_bom_cron"; List> pkList = (List>) getDao().executeQuery(sql.toString(), new MapListProcessor()); if (pkList.isEmpty()) { return null; @@ -68,7 +68,7 @@ public class BomToEpicMesPlugin implements IBackgroundWorkPlugin { if (!data.isEmpty()) { pushData(data, vos); } - } + } // MATERIAL } catch (Exception e) { logDl.error("BomToEpicMesPlugin-exp:" + e.getMessage(), e); diff --git a/uapbd/src/private/nc/bs/uapbd/task/mes/epic/MaterialToEpicMesPlugin.java b/uapbd/src/private/nc/bs/uapbd/task/mes/epic/MaterialToEpicMesPlugin.java new file mode 100644 index 00000000..0e83a4cc --- /dev/null +++ b/uapbd/src/private/nc/bs/uapbd/task/mes/epic/MaterialToEpicMesPlugin.java @@ -0,0 +1,210 @@ +package nc.bs.uapbd.task.mes.epic; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.serializer.SerializerFeature; +import nc.bs.dao.BaseDAO; +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.trade.business.HYPubBO; +import nc.bs.uapbd.util.MyHelper; +import nc.bs.uapbd.util.ThirdPartyPostRequestUtil; +import nc.jdbc.framework.processor.ColumnProcessor; +import nc.jdbc.framework.processor.MapListProcessor; +import nc.jdbc.framework.processor.MapProcessor; +import nc.util.mmf.framework.base.MMValueCheck; +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.*; + +/** + * 物料-艾普MES-定时重推失败的数据 + * + * @author mzr + * @date 20251006 + */ +public class MaterialToEpicMesPlugin 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/mrl"; + 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_mes_material_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; + } + HYPubBO hyPub = new HYPubBO(); + List voList = new ArrayList<>(); + for (Map map : pkList) { + String pkMaterial = map.get("pk_material"); + MaterialVO materialVO = (MaterialVO) hyPub.queryByPrimaryKey(MaterialVO.class, pkMaterial); + voList.add(materialVO); + } + if (!voList.isEmpty()) { + MaterialVO[] useVOs = voList.toArray(new MaterialVO[0]); + buildSyncData(useVOs); + } + + } catch (Exception e) { + logDl.error("BomToEpicMesPlugin-exp:" + e.getMessage(), e); + } + return null; + } + + /** + * 构建同步数据 + */ + private void buildSyncData(MaterialVO[] useVOs) throws BusinessException { + for (MaterialVO vo : useVOs) { + String pkMaterial = vo.getPk_material(); + // 判断物料的业务单元是否是电力电子公司,不是则跳过 + String pkOrg = vo.getPk_org(); + String orgCode = MyHelper.transferField(OrgVO.getDefaultTableName(), OrgVO.CODE, OrgVO.PK_ORG, pkOrg); + // 字段值翻译 + // String pk_marbasclass = vo.getPk_marbasclass(); + // String mrlTypeCOde = MyHelper.transferField(MarBasClassVO.getDefaultTableName(), MarBasClassVO.CODE, MarBasClassVO.PK_MARBASCLASS, pk_marbasclass); + // 计量单位 + Map unitMap = getGoodsInfo(pkMaterial); + + // 1=未启用;2=已启用;3=已停用; + Integer enablestate = vo.getEnablestate(); + String statusCode = (3 == enablestate) ? "N" : "Y"; + // 组装数据 + JSONObject singleObj = new JSONObject(); + singleObj.put("id", null);// 唯一标识(主键) + singleObj.put("siteCode", orgCode);// 工厂编码 + singleObj.put("mrlCode", vo.getCode());// 物料编码 + singleObj.put("mrlName", vo.getName());// 物料名称 + singleObj.put("unit", unitMap.get("unitname"));// 单位 + singleObj.put("model", vo.getMaterialtype());// 型号 + singleObj.put("specification", vo.getMaterialspec());// 规格 + singleObj.put("type", getType(""));// 类型(I:新增 U:修改 D:删除) + singleObj.put("deputyUnit", unitMap.get("deputy_unitname"));// 副单位 + singleObj.put("auditCode", "1");// 审核码 + singleObj.put("statusCode", statusCode);// 状态码(Y表示启用,N表示停用) + // singleObj.put("mrlTypeErp", getGoodsProject(pkMaterial));// 物料类型ERP(1:专用件,3:通用件) + singleObj.put("mrlType", getGoodsType(pkMaterial));// 物料分类 制造1 其它0 + singleObj.put("convertRate", unitMap.getOrDefault("convertRate", "1"));// 单位换算率 + // singleObj.put("isCheck", "1");// 是否选中(1:是,0:否) + pushData(singleObj, useVOs); + } + } + + /** + * 推送同步数据 + */ + private void pushData(JSONObject param, MaterialVO[] useVOs) throws BusinessException { + // String jsonString = param.toJSONString(); + // 转json字符串的时候保留null值 + String jsonStr = JSON.toJSONString(param, + SerializerFeature.WriteMapNullValue, + SerializerFeature.WriteNullStringAsEmpty + ); + logDl.error("EpicMes-Material-param = " + jsonStr); + // NCCForUAPLogger.debug("EpicMes-Material-param = " + jsonStr); + String baseUrl = configParams.get("epicMesUrl"); + String requestUrl = baseUrl + reqUrl; + logDl.error("EpicMes-Material-url = " + requestUrl); + String result = ThirdPartyPostRequestUtil.sendPostRequest(requestUrl, jsonStr); + JSONObject resultObj = JSONObject.parseObject(result); + logDl.error("EpicMes-Material-res = " + result); + + if (!"1".equals(resultObj.getString("flag"))) { + // throw new BusinessException("EpicMes-Material-error:" + resultObj.getString("msg")); + logDl.error("EpicMes-Material-error,result[" + resultObj.toJSONString() + "]"); + handleSyncMaterialExp(useVOs, "N", resultObj.getString("msg")); + } else { + handleSyncMaterialExp(useVOs, "Y", ""); + } + } + + private String getType(String eventType) { + // 类型(I:新增 U:修改 D:删除) + Map map = new HashMap<>(); + map.put("1002", "I"); + map.put("1009", "I"); + map.put("1004", "U"); + map.put("1069", "U"); + map.put("1071", "U"); + return map.getOrDefault(eventType, "I"); + } + + 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("EpicMes-Material-getUnitInfo-sql = " + sql); + Map map = (Map) new BaseDAO().executeQuery(sql, new MapProcessor()); + map.put("convertRate", MyHelper.transferSpecialField(map.get("measrate") + "")); + return map; + } + + private String getGoodsType(String pkMaterial) throws BusinessException { + String targetCode = configParams.get("dldzOrg"); + String[] orgItem = targetCode.split(","); + String inStr = SqlUtils.getInStr("b.code", orgItem, Boolean.TRUE); + // 物料-库存信息-物料类型 DR=分销补货;FR=工厂补货;MR=制造件;PR=采购件;OT=委外件;ET=其他 + // mes物料类型 制造1 其它0(ERP多个组织中如果有一个是制造件或虚拟件(其他)就传1) + String mesType = "0"; + // String martype = MyHelper.transferField(MaterialStockVO.getDefaultTableName(), MaterialStockVO.MARTYPE, MaterialStockVO.PK_MATERIAL, pkMaterial); + String countSql = "SELECT count(1)" + + " FROM bd_materialstock a" + + " LEFT JOIN org_stockorg b ON a.pk_org = b.pk_stockorg" + + " WHERE a.dr = 0 AND a.martype IN ('MR','ET') " + + " AND a.pk_material = '[pkMaterial]'" + + " AND " + inStr; + countSql = countSql.replace("[pkMaterial]", pkMaterial); + Integer num = (Integer) new BaseDAO().executeQuery(countSql, new ColumnProcessor()); + if (num > 0) { + mesType = "1"; + } + return mesType; + } + + + /** + * 更新错误信息 + */ + private void handleSyncMaterialExp(MaterialVO[] vos, String errorCode, String errorMsg) { + if (MMValueCheck.isEmpty(vos)) { + return; + } + Set ids = new HashSet<>(); + for (MaterialVO vo : vos) { + String pkMaterial = vo.getPk_material(); + ids.add(pkMaterial); + } + try { + String inSql = SqlUtils.getInStr("pk_material", ids.toArray(new String[0]), Boolean.TRUE); + String updateSql = "update bd_material set def30 = '[errorCode]' where " + inSql; + updateSql = updateSql.replace("[errorCode]", errorCode); + int updatedRows = getDao().executeUpdate(updateSql); + } catch (BusinessException e) { + logDl.error("EpicMes-Material-handleSyncMaterialExp = " + e.getMessage(), e); + } + } +} diff --git a/uapbd/src/private/nccloud/api/uapbd/material/listener/MaterialToEpicMesListener.java b/uapbd/src/private/nccloud/api/uapbd/material/listener/MaterialToEpicMesListener.java index ffe16156..092ae414 100644 --- a/uapbd/src/private/nccloud/api/uapbd/material/listener/MaterialToEpicMesListener.java +++ b/uapbd/src/private/nccloud/api/uapbd/material/listener/MaterialToEpicMesListener.java @@ -15,17 +15,14 @@ import nc.bs.uapbd.util.MyHelper; import nc.bs.uapbd.util.ThirdPartyPostRequestUtil; import nc.jdbc.framework.processor.ColumnProcessor; import nc.jdbc.framework.processor.MapProcessor; +import nc.util.mmf.framework.base.MMValueCheck; import nc.vo.bd.material.MaterialVO; -import nc.vo.bd.material.marbasclass.MarBasClassVO; import nc.vo.bd.material.stock.MaterialStockVO; import nc.vo.fi.pub.SqlUtils; import nc.vo.org.OrgVO; import nc.vo.pub.BusinessException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; /** * 物料新增修改后同步艾普MES的物料 @@ -38,6 +35,14 @@ public class MaterialToEpicMesListener implements IBusinessListener { private static final Log logDl = Log.getInstance(LOG_INFO_NAME); private static final String reqUrl = "/prj-v5-web/ext/api/mrl"; private Map configParams; + private BaseDAO dao; + + public BaseDAO getDao() { + if (dao == null) { + dao = new BaseDAO(); + } + return dao; + } @Override public void doAction(IBusinessEvent event) throws BusinessException { @@ -46,10 +51,11 @@ public class MaterialToEpicMesListener implements IBusinessListener { Object[] objs = e.getObjs(); // EventType是事件编码 1002-新增后 1004-修改后 1071-状态由停用变为启用后 1069-状态由启用变为停用后 1061批改后 + MaterialVO[] useVOs = null; try { if ("1002".equals(eventType) || "1004".equals(eventType) || "1061".equals(eventType) || "1071".equals(eventType) || "1069".equals(eventType)) { - MaterialVO[] useVOs = ArrayClassConvertUtil.convert(objs, MaterialVO.class); + useVOs = ArrayClassConvertUtil.convert(objs, MaterialVO.class); configParams = MyHelper.getConfigParams("Dldz-config", null); if (configParams.isEmpty()) { throw new BusinessException("电力电子的艾普MES接口缺少配置"); @@ -76,13 +82,14 @@ public class MaterialToEpicMesListener implements IBusinessListener { voList.add(materialVO); } if (!voList.isEmpty()) { - MaterialVO[] useVOs = voList.toArray(new MaterialVO[0]); + useVOs = voList.toArray(new MaterialVO[0]); buildSyncData(useVOs, eventType); } } } catch (BusinessException ex) { logDl.error("EpicMes-Material-exp:" + ex.getMessage(), ex); + handleSyncMaterialExp(useVOs, "N", ex.getMessage()); } } @@ -100,8 +107,8 @@ public class MaterialToEpicMesListener implements IBusinessListener { continue; } // 字段值翻译 - String pk_marbasclass = vo.getPk_marbasclass(); - String mrlTypeCOde = MyHelper.transferField(MarBasClassVO.getDefaultTableName(), MarBasClassVO.CODE, MarBasClassVO.PK_MARBASCLASS, pk_marbasclass); + // String pk_marbasclass = vo.getPk_marbasclass(); + // String mrlTypeCOde = MyHelper.transferField(MarBasClassVO.getDefaultTableName(), MarBasClassVO.CODE, MarBasClassVO.PK_MARBASCLASS, pk_marbasclass); // 计量单位 Map unitMap = getGoodsInfo(pkMaterial); @@ -210,4 +217,26 @@ public class MaterialToEpicMesListener implements IBusinessListener { return mesType; } + /** + * 更新错误信息 + */ + private void handleSyncMaterialExp(MaterialVO[] vos, String errorCode, String errorMsg) { + if (MMValueCheck.isEmpty(vos)) { + return; + } + Set ids = new HashSet<>(); + for (MaterialVO vo : vos) { + String pkMaterial = vo.getPk_material(); + ids.add(pkMaterial); + } + try { + String inSql = SqlUtils.getInStr("pk_material", ids.toArray(new String[0]), Boolean.TRUE); + String updateSql = "update bd_material set def30 = '[errorCode]' where " + inSql; + updateSql = updateSql.replace("[errorCode]", errorCode); + int updatedRows = getDao().executeUpdate(updateSql); + } catch (BusinessException e) { + logDl.error("EpicMes-Material-handleSyncMaterialExp = " + e.getMessage(), e); + } + } + } From 9afab8157868a372874f0bc20d4ae3a83366d738 Mon Sep 17 00:00:00 2001 From: mzr Date: Thu, 9 Oct 2025 09:08:04 +0800 Subject: [PATCH 26/32] =?UTF-8?q?feat(msg):=20=E8=B0=83=E6=95=B4=E6=B6=88?= =?UTF-8?q?=E6=81=AF=E5=8F=91=E9=80=81=E9=80=BB=E8=BE=91=E4=BB=A5=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E7=89=A9=E6=96=99=E5=88=86=E7=B1=BB=E8=A7=92=E8=89=B2?= =?UTF-8?q?=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nccloud/api/uapbd/msg/MsgResource.java | 44 +++++++++++++++---- 1 file changed, 36 insertions(+), 8 deletions(-) diff --git a/uapbd/src/public/nccloud/api/uapbd/msg/MsgResource.java b/uapbd/src/public/nccloud/api/uapbd/msg/MsgResource.java index 6c831016..0745fc68 100644 --- a/uapbd/src/public/nccloud/api/uapbd/msg/MsgResource.java +++ b/uapbd/src/public/nccloud/api/uapbd/msg/MsgResource.java @@ -1,10 +1,12 @@ package nccloud.api.uapbd.msg; import com.alibaba.fastjson.JSONObject; +import nc.bs.dao.BaseDAO; import nc.bs.dao.DAOException; import nc.bs.logging.Logger; import nc.bs.trade.business.HYSuperDMO; import nc.bs.uapbd.util.MyHelper; +import nc.jdbc.framework.processor.ColumnProcessor; import nc.vo.fi.pub.SqlUtils; import nc.vo.org.FactoryVO; import nc.vo.pub.BusinessException; @@ -15,7 +17,6 @@ import nc.vo.pubapp.pattern.exception.ExceptionUtils; import nc.vo.sm.UserVO; import nc.vo.uap.rbac.role.RoleVO; import nccloud.api.rest.utils.ResultMessageUtil; -import nccloud.baseapp.core.log.NCCForUAPLogger; import nccloud.bs.pub.pf.PfMessageUtil; import nccloud.commons.lang.StringUtils; import nccloud.ws.rest.resource.AbstractNCCRestResource; @@ -60,6 +61,14 @@ public class MsgResource extends AbstractNCCRestResource { String content = (String) jsonObject.get("content"); String orgCode = (String) jsonObject.get("orgCode"); try { + String pkOrg = MyHelper.transferField(FactoryVO.getDefaultTableName(), FactoryVO.PK_FACTORY, FactoryVO.CODE, orgCode); + if (pkOrg != null) { + return ResultMessageUtil.toJSON(false, "未查询到组织:" + orgCode); + } + String materialCode = (String) jsonObject.get("materialCode"); + if (materialCode == null || materialCode.isEmpty()) { + return ResultMessageUtil.toJSON(false, "传参中缺少物料编码"); + } // 通知消息字段,最大为4000位。 if (content != null && content.length() > 1500) { content = content.substring(0, 1500); @@ -69,7 +78,7 @@ public class MsgResource extends AbstractNCCRestResource { ArrayList userList = new ArrayList<>(); // 根据传递的角色查询要发送消息的用户信息 - String roleId = getMsgRole(orgCode); + String roleId = getMsgRole(pkOrg, materialCode); UserVO[] userVOS = getUserByRole(roleId); if (userVOS == null || userVOS.length == 0) { return ResultMessageUtil.toJSON(false, "未查询到用户"); @@ -129,7 +138,7 @@ public class MsgResource extends AbstractNCCRestResource { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String time = sdf.format(new Date()); strWhere = strWhere.replace("[now]", time); - NCCForUAPLogger.debug("getUserByRole-strWhere = " + strWhere); + // NCCForUAPLogger.debug("getUserByRole-strWhere = " + strWhere); try { vos = (UserVO[]) getSuperDMO().queryByWhereClause(UserVO.class, strWhere); } catch (DAOException e) { @@ -142,9 +151,13 @@ public class MsgResource extends AbstractNCCRestResource { /** * 查询要发消息的角色id */ - private String getMsgRole(String orgCode) throws BusinessException { + private String getMsgRole(String pkOrg, String materialCode) throws BusinessException { String pkRole = ""; - String pkOrg = MyHelper.transferField(FactoryVO.getDefaultTableName(), FactoryVO.PK_FACTORY, FactoryVO.CODE, orgCode); + // 先查询物料分类上配置的角色,如果有则返回,否则查询自定义档案中配置的角色 + pkRole = getGoodsTypeRole(pkOrg, materialCode); + if (pkRole != null && !"~".equals(pkRole) && !pkRole.isEmpty()) { + return pkRole; + } Map configParams = MyHelper.getConfigParams("Dldz-config", null); String strWhere = " dr = 0 "; String msgRoleCode = configParams.getOrDefault("msgRoleCode", ""); @@ -154,12 +167,11 @@ public class MsgResource extends AbstractNCCRestResource { if (msgRoleCode.contains(",")) { String inSql = SqlUtils.getInStr("role_code", msgRoleCode.split(",", -1), Boolean.TRUE); strWhere += " AND " + inSql; - NCCForUAPLogger.debug("多角色-strWhere = " + strWhere); + // NCCForUAPLogger.debug("多角色-strWhere = " + strWhere); } else { strWhere += " AND role_code = '" + msgRoleCode + "'"; } - if (StringUtils.isNotEmpty(orgCode) && !"~".equals(orgCode) && - StringUtils.isNotEmpty(pkOrg) && !"~".equals(pkOrg)) { + if (StringUtils.isNotEmpty(pkOrg) && !"~".equals(pkOrg)) { strWhere += " AND pk_org = '" + pkOrg + "'"; } Set pkRoleSet = new HashSet<>(); @@ -181,4 +193,20 @@ public class MsgResource extends AbstractNCCRestResource { return pkRole; } + private String getGoodsTypeRole(String pkOrg, String materialCode) throws BusinessException { + String pkRole = ""; + String sql = "SELECT marclass.def1" + + " FROM bd_marbasclass marclass" + + " LEFT JOIN bd_material mar ON marclass.pk_marbasclass = mar.pk_marbasclass" + + " LEFT JOIN bd_materialstock marstock ON mar.pk_material = marstock.pk_material" + + " WHERE " + + " marclass.DR = 0" + + " AND marstock.pk_org = '[pkOrg]'" + + " AND mar.CODE = '[materialCode]'"; + sql = sql.replace("[pkOrg]", pkOrg); + sql = sql.replace("[materialCode]", materialCode); + pkRole = (String) new BaseDAO().executeQuery(sql, new ColumnProcessor()); + return pkRole; + } + } From 5ffb10c7b6834129f51b044096746b0122cc96df Mon Sep 17 00:00:00 2001 From: mzr Date: Thu, 9 Oct 2025 09:50:24 +0800 Subject: [PATCH 27/32] =?UTF-8?q?refactor(ims):=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E7=89=A9=E6=96=99=E5=87=BA=E5=BA=93IMS=E6=8F=92=E4=BB=B6?= =?UTF-8?q?=E7=9A=84=E6=95=B0=E6=8D=AE=E5=BA=93=E6=93=8D=E4=BD=9C=20-=20?= =?UTF-8?q?=E5=B0=86executeUpdate=E6=96=B9=E6=B3=95=E7=A7=BB=E8=87=B3ImsDa?= =?UTF-8?q?oUtil=E5=B7=A5=E5=85=B7=E7=B1=BB=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../task/ims/MaterialOutGyImsPlugin.java | 71 +--------------- .../public/nc/bs/uapbd/util/ImsDaoUtil.java | 84 +++++++++++++++++++ 2 files changed, 87 insertions(+), 68 deletions(-) create mode 100644 uapbd/src/public/nc/bs/uapbd/util/ImsDaoUtil.java diff --git a/uapbd/src/private/nc/bs/uapbd/task/ims/MaterialOutGyImsPlugin.java b/uapbd/src/private/nc/bs/uapbd/task/ims/MaterialOutGyImsPlugin.java index a0d17ab5..afb10340 100644 --- a/uapbd/src/private/nc/bs/uapbd/task/ims/MaterialOutGyImsPlugin.java +++ b/uapbd/src/private/nc/bs/uapbd/task/ims/MaterialOutGyImsPlugin.java @@ -7,12 +7,10 @@ import nc.bs.logging.Logger; import nc.bs.pub.pa.PreAlertObject; import nc.bs.pub.taskcenter.BgWorkingContext; import nc.bs.pub.taskcenter.IBackgroundWorkPlugin; +import nc.bs.uapbd.util.ImsDaoUtil; import nc.bs.uapbd.util.MyHelper; import nc.itf.mmpac.pickm.IPickmQueryService; import nc.itf.uap.pf.busiflow.PfButtonClickContext; -import nc.jdbc.framework.JdbcSession; -import nc.jdbc.framework.PersistenceManager; -import nc.jdbc.framework.exception.DbException; import nc.jdbc.framework.processor.MapListProcessor; import nc.pubitf.ic.m4d.api.IMaterialOutMaintainAPI; import nc.util.mmf.busi.service.PFPubService; @@ -32,8 +30,6 @@ import nc.vo.scmpub.res.billtype.MMBillType; import nccloud.baseapp.core.log.NCCForUAPLogger; import java.math.BigDecimal; -import java.sql.Connection; -import java.sql.SQLException; import java.sql.Timestamp; import java.text.SimpleDateFormat; import java.util.*; @@ -152,7 +148,7 @@ public class MaterialOutGyImsPlugin implements IBackgroundWorkPlugin { updateSql = updateSql.replace("[err_msg]", e.getMessage()); updateSql = updateSql.replace("[cgeneralhid]", cgeneralhid); NCCForUAPLogger.debug("MaterialOutGyImsPlugin-updateSql = " + updateSql); - int rows = executeUpdate(updateSql, cgeneralhid); + int rows = ImsDaoUtil.executeUpdate(updateSql, cgeneralhid); NCCForUAPLogger.debug("MaterialOutGyImsPlugin-rows = " + rows); } } @@ -160,7 +156,7 @@ public class MaterialOutGyImsPlugin implements IBackgroundWorkPlugin { // 修改状态为 完成 String inSql = SqlUtils.getInStr("cgeneralhid", imsIdSet.toArray(new String[0]), Boolean.TRUE); String updateSql = "update BIPOutMainTab set status = '2',err_msg = null where " + inSql; - executeUpdate(updateSql, imsIdSet.toString()); + ImsDaoUtil.executeUpdate(updateSql, imsIdSet.toString()); } Logger.error("---end----任务结束运行--"); } catch (Exception e) { @@ -193,66 +189,5 @@ public class MaterialOutGyImsPlugin implements IBackgroundWorkPlugin { } } - private int executeUpdate(String sql, String targetId) throws BusinessException { - - // 2. 直接通过静态工厂方法获取 PersistenceManager - PersistenceManager pm = null; - JdbcSession jdbcSession = null; - Connection conn = null; - int rows = 0; - try { - // 直接调用 PersistenceManager 的静态方法 getInstance() - pm = PersistenceManager.getInstance("gyims"); - pm.setAddTimeStamp(false);// 不添加时间戳ts - - // 2.1 获取 JdbcSession 和 Connection - jdbcSession = pm.getJdbcSession(); - jdbcSession.setSQLTranslator(true); // 保持 SQL 转换 - conn = jdbcSession.getConnection(); - conn.setAutoCommit(false); - logger.info("直接获取PersistenceManager,手动事务开启,targetId:" + targetId); - - // 4. 执行主表+子表操作 (传入共享的 pm) - logger.info("事务内执行更新,targetId:" + targetId); - rows = pm.getJdbcSession().executeUpdate(sql); - logger.info("事务内执行更新,rows:" + rows); - logger.info("事务内操作全部成功,准备提交,targetId:" + targetId); - - } catch (DbException | SQLException e) { // 捕获 DbException 和 SQLException - logger.error("事务执行失败,触发回滚,targetId:" + targetId); - if (conn != null) { - try { - conn.rollback(); - logger.info("事务回滚完成,targetId:" + targetId); - } catch (SQLException rollbackE) { - logger.error("事务回滚异常,targetId:" + targetId); - } - } - throw new BusinessException("备料计划同步事务失败:" + e.getMessage(), e); - - } finally { - if (conn != null) { - try { - conn.commit(); - logger.info("事务提交成功,targetId:" + targetId); - // 恢复自动提交模式,确保不会影响其他操作 - conn.setAutoCommit(true); - } catch (SQLException commitE) { - logger.error("事务提交异常,targetId:" + targetId); - } - } - // 5. 释放 PersistenceManager (至关重要) - if (pm != null) { - try { - pm.release(); // 必须调用 release() 将连接归还给连接池 - logger.info("PersistenceManager 释放完成,targetId:" + targetId); - } catch (Exception releaseE) { - logger.error("PersistenceManager 释放异常", releaseE); - } - } - } - return rows; - } - } diff --git a/uapbd/src/public/nc/bs/uapbd/util/ImsDaoUtil.java b/uapbd/src/public/nc/bs/uapbd/util/ImsDaoUtil.java new file mode 100644 index 00000000..3b1963c8 --- /dev/null +++ b/uapbd/src/public/nc/bs/uapbd/util/ImsDaoUtil.java @@ -0,0 +1,84 @@ +package nc.bs.uapbd.util; + + +import nc.bs.logging.Log; +import nc.jdbc.framework.JdbcSession; +import nc.jdbc.framework.PersistenceManager; +import nc.jdbc.framework.exception.DbException; +import nc.vo.pub.BusinessException; + +import java.sql.Connection; +import java.sql.SQLException; + +/** + * 高压加工车间-IMS-DAO 工具类 + * + * @author mzr + * @date 2025/10/08 + */ +public class ImsDaoUtil { + + private static final String LOG_INFO_NAME = "gymeslog"; + private static final Log logger = Log.getInstance(LOG_INFO_NAME); + + public static int executeUpdate(String sql, String targetId) throws BusinessException { + // 2. 直接通过静态工厂方法获取 PersistenceManager + PersistenceManager pm = null; + JdbcSession jdbcSession = null; + Connection conn = null; + int rows = 0; + try { + // 直接调用 PersistenceManager 的静态方法 getInstance() + pm = PersistenceManager.getInstance("gyims"); + pm.setAddTimeStamp(false);// 不添加时间戳ts + + // 2.1 获取 JdbcSession 和 Connection + jdbcSession = pm.getJdbcSession(); + jdbcSession.setSQLTranslator(true); // 保持 SQL 转换 + conn = jdbcSession.getConnection(); + conn.setAutoCommit(false); + logger.info("直接获取PersistenceManager,手动事务开启,targetId:" + targetId); + + // 4. 执行主表+子表操作 (传入共享的 pm) + logger.info("事务内执行更新,targetId:" + targetId); + rows = pm.getJdbcSession().executeUpdate(sql); + logger.info("事务内执行更新,rows:" + rows); + logger.info("事务内操作全部成功,准备提交,targetId:" + targetId); + + } catch (DbException | SQLException e) { // 捕获 DbException 和 SQLException + logger.error("事务执行失败,触发回滚,targetId:" + targetId); + if (conn != null) { + try { + conn.rollback(); + logger.info("事务回滚完成,targetId:" + targetId); + } catch (SQLException rollbackE) { + logger.error("事务回滚异常,targetId:" + targetId); + } + } + throw new BusinessException("备料计划同步事务失败:" + e.getMessage(), e); + + } finally { + if (conn != null) { + try { + conn.commit(); + logger.info("事务提交成功,targetId:" + targetId); + // 恢复自动提交模式,确保不会影响其他操作 + conn.setAutoCommit(true); + } catch (SQLException commitE) { + logger.error("事务提交异常,targetId:" + targetId); + } + } + // 5. 释放 PersistenceManager (至关重要) + if (pm != null) { + try { + pm.release(); // 必须调用 release() 将连接归还给连接池 + logger.info("PersistenceManager 释放完成,targetId:" + targetId); + } catch (Exception releaseE) { + logger.error("PersistenceManager 释放异常", releaseE); + } + } + } + return rows; + } + +} From bc079f95177c8a7ac60fe807c9cde1d1f79c4b59 Mon Sep 17 00:00:00 2001 From: mzr Date: Thu, 9 Oct 2025 13:39:22 +0800 Subject: [PATCH 28/32] =?UTF-8?q?=E9=AB=98=E5=8E=8Bmes=E5=A4=87=E6=96=99?= =?UTF-8?q?=E8=AE=A1=E5=88=92=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pickm/bp/rule/AfterApproveRuleHighpressureMes.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/mmpac/src/private/nc/bs/mmpac/pickm/bp/rule/AfterApproveRuleHighpressureMes.java b/mmpac/src/private/nc/bs/mmpac/pickm/bp/rule/AfterApproveRuleHighpressureMes.java index d3b9d877..a270ea8a 100644 --- a/mmpac/src/private/nc/bs/mmpac/pickm/bp/rule/AfterApproveRuleHighpressureMes.java +++ b/mmpac/src/private/nc/bs/mmpac/pickm/bp/rule/AfterApproveRuleHighpressureMes.java @@ -62,7 +62,7 @@ public class AfterApproveRuleHighpressureMes implements IRule { HYPubBO hybo = new HYPubBO(); JSONObject list = new JSONObject(); JSONArray jsonArray = new JSONArray(); - String flags = "";//判断是否新增或修改 + String flags = "";// 判断是否新增或修改 for (AggPickmVO vo : useVOs) { PickmHeadVO pickmHeadVO = vo.getParentVO(); PickmItemVO[] itemVOS = (PickmItemVO[]) vo.getChildrenVO(); @@ -75,7 +75,7 @@ public class AfterApproveRuleHighpressureMes implements IRule { JSONObject singleObj = new JSONObject(); // 创建子项数组 JSONArray contentArray = new JSONArray(); - //自定义项19是Y时调用修改口,若不是则调用新增口 + // 自定义项19是Y时调用修改口,若不是则调用新增口 String saleDef = pickmHeadVO.getVdef19() == null ? "" : pickmHeadVO.getVdef19(); if (!saleDef.equals("Y")) { // 更新自定义项19为“Y” @@ -254,10 +254,8 @@ public class AfterApproveRuleHighpressureMes implements IRule { ); logger.error("gyMes-Pickm-param = " + jsonStr); String baseUrl = configParams.get("mesBaseUrl"); - String requestUrl = ""; - if (flags.equals("addOrder")) { - requestUrl = baseUrl + configParams.get("materialRequirementsAdd"); - } else if (flags.equals("updateOrder")) {//调用修改口 + String requestUrl = baseUrl + configParams.get("materialRequirementsAdd"); + if (flags.equals("updateOrder")) {// 调用修改口 requestUrl = baseUrl + configParams.get("materialRequirementsUpdate"); } logger.error("gyMes-Pickm-url = " + requestUrl); From b457962c3a49aa88310d87518d7df78d4f9e882b Mon Sep 17 00:00:00 2001 From: houyi <1398559711@qq.com> Date: Thu, 9 Oct 2025 13:51:14 +0800 Subject: [PATCH 29/32] =?UTF-8?q?=E5=A4=87=E6=96=99=E5=AE=A1=E6=89=B9?= =?UTF-8?q?=E5=90=8E=E6=8E=A8=E9=80=81=E9=AB=98=E5=8E=8BMES=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mmpac/pickm/bp/rule/AfterApproveRuleHighpressureMes.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/mmpac/src/private/nc/bs/mmpac/pickm/bp/rule/AfterApproveRuleHighpressureMes.java b/mmpac/src/private/nc/bs/mmpac/pickm/bp/rule/AfterApproveRuleHighpressureMes.java index a270ea8a..24b6daba 100644 --- a/mmpac/src/private/nc/bs/mmpac/pickm/bp/rule/AfterApproveRuleHighpressureMes.java +++ b/mmpac/src/private/nc/bs/mmpac/pickm/bp/rule/AfterApproveRuleHighpressureMes.java @@ -222,7 +222,10 @@ public class AfterApproveRuleHighpressureMes implements IRule { jsonArray.add(singleObj); list.put("list", jsonArray); } - pushData(list, flags); + if (list != null && !list.isEmpty()) { + pushData(list, flags); + } + } /** From 920842f6b45ee97b8e1e8e69ff35fcdf36726805 Mon Sep 17 00:00:00 2001 From: mzr Date: Thu, 9 Oct 2025 14:04:29 +0800 Subject: [PATCH 30/32] =?UTF-8?q?=E5=AE=A1=E6=89=B9BP=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E8=A7=84=E5=88=99-=E7=94=9F=E4=BA=A7=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=E5=92=8C=E5=A4=87=E6=96=99=E8=AE=A1=E5=88=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nc/bs/mmpac/pickm/bp/PickmApproveBP.java | 4 +--- .../nc/bs/mmpac/pmo/pac0002/bp/PMOApproveBP.java | 13 +++++-------- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/mmpac/src/private/nc/bs/mmpac/pickm/bp/PickmApproveBP.java b/mmpac/src/private/nc/bs/mmpac/pickm/bp/PickmApproveBP.java index 08d4c2be..9f449835 100644 --- a/mmpac/src/private/nc/bs/mmpac/pickm/bp/PickmApproveBP.java +++ b/mmpac/src/private/nc/bs/mmpac/pickm/bp/PickmApproveBP.java @@ -1,7 +1,6 @@ package nc.bs.mmpac.pickm.bp; -import nc.bs.mmpac.pickm.bp.rule.AfterApproveRuleHighpressureIms; import nc.bs.mmpac.pickm.bp.rule.AfterApproveRuleHighpressureMes; import nc.bs.mmpac.pickm.bp.rule.AfterApproveRuleSyncRZWMS; import nc.bs.mmpac.pickm.plugin.PickmPluginPoint; @@ -9,7 +8,6 @@ import nc.bs.mmpac.pickm.rule.PickmApproveCheckStatusRule; import nc.bs.mmpac.pickm.rule.PickmCheckAuditRule; import nc.bs.mmpac.pickm.rule.PickmFbackflustimeCheckRule; import nc.bs.mmpac.pickm.rule.PickmSetStatusRule; -import nc.bs.mmpac.pmo.pac0002.bp.rule.AfterApproveSyncHighpressureMesRule; import nc.bs.mmpub.rule.MMATOMaterialCheckRule; import nc.bs.mmpub.rule.MMVOSagaFrozenValidateRule; import nc.impl.pubapp.pattern.data.bill.template.UpdateBPTemplate; @@ -30,7 +28,7 @@ public class PickmApproveBP { //备料计划审批后推送高压MES processer.addAfterRule(new AfterApproveRuleHighpressureMes()); //备料计划审批后推送高压IMS - processer.addAfterRule(new AfterApproveRuleHighpressureIms()); + // processer.addAfterRule(new AfterApproveRuleHighpressureIms()); } private void addBeforeRule(CompareAroundProcesser processer) { diff --git a/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/PMOApproveBP.java b/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/PMOApproveBP.java index 64e1620c..dbe3b67b 100644 --- a/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/PMOApproveBP.java +++ b/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/PMOApproveBP.java @@ -56,15 +56,11 @@ public class PMOApproveBP { // 审批后推送流程生产订单到艾普MES processer.addAfterRule(new AfterApproveSyncEpicMesRule()); // 审批后推送流程生产订单到启源qms - // processer.addAfterRule(new AfterApproveSyncQMSRule()); -// 流程生产订单审批后推送高压MES - processer.addAfterRule(new AfterApproveSyncHighpressureMesRule()); -// processer.addAfterRule(new AfterApproveSyncQMSRule()); -// 流程生产订单审批后推送高压MES -// processer.addAfterRule(new AfterApproveSyncHighpressureMesRule()); + processer.addAfterRule(new AfterApproveSyncQMSRule()); + // 流程生产订单审批后推送高压MES + processer.addAfterRule(new AfterApproveSyncHighpressureMesRule()); - -// processer.addAfterRule(new AfterApproveSyncEpicQMSRule()); + // processer.addAfterRule(new AfterApproveSyncImsRule("Y")); } @@ -95,5 +91,6 @@ public class PMOApproveBP { processer.addAfterRule(new AfterUnApproveSyncEpicMesRule()); // 生产订单取消审批后推送高压MES processer.addAfterRule(new AfterApproveCancelSyncHighpressureMesRule()); + // processer.addAfterRule(new AfterApproveSyncImsRule("N")); } } From 195bfccc52dc88fd8859bbe00e74c9632ef308a8 Mon Sep 17 00:00:00 2001 From: houyi <1398559711@qq.com> Date: Thu, 9 Oct 2025 14:34:54 +0800 Subject: [PATCH 31/32] =?UTF-8?q?=E5=A4=87=E6=96=99=E3=80=81=E7=94=9F?= =?UTF-8?q?=E4=BA=A7=E8=AE=A2=E5=8D=95=E3=80=81=E9=94=80=E5=94=AE=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=8BMES=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../rule/AfterApproveCancelSyncHighpressureMesRule.java | 4 +++- .../bp/rule/AfterApproveSyncHighpressureMesRule.java | 4 +++- .../so/m30/rule/approve/AfterSoCancelSyncRuleGyMes.java | 5 ++++- .../nc/bs/so/m30/rule/approve/AfterSoSyncRuleGyMes.java | 8 ++++++-- 4 files changed, 16 insertions(+), 5 deletions(-) diff --git a/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/rule/AfterApproveCancelSyncHighpressureMesRule.java b/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/rule/AfterApproveCancelSyncHighpressureMesRule.java index 545f1488..947889f9 100644 --- a/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/rule/AfterApproveCancelSyncHighpressureMesRule.java +++ b/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/rule/AfterApproveCancelSyncHighpressureMesRule.java @@ -101,7 +101,9 @@ public class AfterApproveCancelSyncHighpressureMesRule implements IRule { jsonArray.add(singleObj); list.put("list", jsonArray); } - pushData(list, flags); + if (list != null && !list.isEmpty()) { + pushData(list, flags); + } } /** diff --git a/so/src/private/nc/bs/so/m30/rule/approve/AfterSoCancelSyncRuleGyMes.java b/so/src/private/nc/bs/so/m30/rule/approve/AfterSoCancelSyncRuleGyMes.java index d9d0aae8..75a9dfe2 100644 --- a/so/src/private/nc/bs/so/m30/rule/approve/AfterSoCancelSyncRuleGyMes.java +++ b/so/src/private/nc/bs/so/m30/rule/approve/AfterSoCancelSyncRuleGyMes.java @@ -100,7 +100,10 @@ public class AfterSoCancelSyncRuleGyMes implements IRule { list.put("bipOrderId", result); // 主键ID list.put("bipUpdateBy", bipUpdateBy);// 取消审批人 - pushData(list); + if (list != null && !list.isEmpty()) { + pushData(list); + } + } } diff --git a/so/src/private/nc/bs/so/m30/rule/approve/AfterSoSyncRuleGyMes.java b/so/src/private/nc/bs/so/m30/rule/approve/AfterSoSyncRuleGyMes.java index bd5d8c66..f5d5f8ca 100644 --- a/so/src/private/nc/bs/so/m30/rule/approve/AfterSoSyncRuleGyMes.java +++ b/so/src/private/nc/bs/so/m30/rule/approve/AfterSoSyncRuleGyMes.java @@ -110,7 +110,9 @@ public class AfterSoSyncRuleGyMes implements IRule { itemObj.put("remark", item.getVrownote());// 备注 itemObj.put("bipCreateBy", createName);// 创建人 itemObj.put("customers", customerName);// 客户 - pushData(itemObj); + if (itemObj != null && !itemObj.isEmpty()) { + pushData(itemObj); + } } } else { @@ -131,7 +133,9 @@ public class AfterSoSyncRuleGyMes implements IRule { itemObj.put("remark", item.getVrownote());// 备注 itemObj.put("bipUpdateBy", createName);// 修改人 itemObj.put("customers", customerName);// 客户 - pushData_Update(itemObj); + if (itemObj != null && !itemObj.isEmpty()) { + pushData_Update(itemObj); + } } } From 67acc7b3fbc0ad849ea9cd2e8e6a8b64314b127a Mon Sep 17 00:00:00 2001 From: houyi <1398559711@qq.com> Date: Thu, 9 Oct 2025 14:37:40 +0800 Subject: [PATCH 32/32] =?UTF-8?q?=E7=94=9F=E4=BA=A7=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=E5=AE=A1=E6=89=B9=E5=90=8E=E6=8E=A8=E9=80=81=E9=AB=98=E5=8E=8B?= =?UTF-8?q?MES=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bp/rule/AfterApproveSyncHighpressureMesRule.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/rule/AfterApproveSyncHighpressureMesRule.java b/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/rule/AfterApproveSyncHighpressureMesRule.java index d67c2e94..87b6b49d 100644 --- a/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/rule/AfterApproveSyncHighpressureMesRule.java +++ b/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/rule/AfterApproveSyncHighpressureMesRule.java @@ -237,10 +237,8 @@ public class AfterApproveSyncHighpressureMesRule implements IRule { ); logger.error("gyMes-PMO-param = " + jsonStr); String baseUrl = configParams.get("mesBaseUrl"); - String requestUrl = ""; - if (flags.equals("addOrder")) { - requestUrl = baseUrl + configParams.get("productionOrderAdd"); - } else if (flags.equals("updateOrder")) {//调用修改口 + String requestUrl = baseUrl + configParams.get("productionOrderAdd"); + if (flags.equals("updateOrder")) {//调用修改口 requestUrl = baseUrl + configParams.get("productionOrderUpdate"); } logger.error("gyMes-PMO-url = " + requestUrl);