diff --git a/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/PMOInsertBP.java b/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/PMOInsertBP.java index 82d3690..ba76e5c 100644 --- a/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/PMOInsertBP.java +++ b/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/PMOInsertBP.java @@ -1,55 +1,15 @@ package nc.bs.mmpac.pmo.pac0002.bp; -import java.util.ArrayList; -import java.util.List; +import nc.bs.mmpac.pmo.pac0002.bp.rule.BeforePmoBomRule; +import nc.bs.mmpac.pmo.pac0002.bp.rule.saveBeforeCheckRule; import nc.bs.mmpac.pmo.pac0002.pluginpoint.PMOPluginPoint; -import nc.bs.mmpac.pmo.pac0002.rule.PMOATOCheckRule; -import nc.bs.mmpac.pmo.pac0002.rule.PMOATPUpdateRule; -import nc.bs.mmpac.pmo.pac0002.rule.PMOCffileidInserAndUpdatetRule; -import nc.bs.mmpac.pmo.pac0002.rule.PMOCreatePickmWhenInsertRule; -import nc.bs.mmpac.pmo.pac0002.rule.PMOInsertSaveApproveRule; -import nc.bs.mmpac.pmo.pac0002.rule.PMOMarkWrSNWhenInsertRule; -import nc.bs.mmpac.pmo.pac0002.rule.PMOSNDupCheckRule; -import nc.bs.mmpac.pmo.pac0002.rule.PMOSaveSNWhenInsertRule; -import nc.bs.mmpac.pmo.pac0002.rule.PMOSplitByTaskDetailsRule; -import nc.bs.mmpac.pmo.pac0002.rule.PMOSyncSNWhenInsertRule; -import nc.bs.mmpac.pmo.pac0002.rule.check.CheckMaterialIsEnableRule; -import nc.bs.mmpac.pmo.pac0002.rule.check.PMOCheckCinwarehouseidRule; -import nc.bs.mmpac.pmo.pac0002.rule.check.PMOCheckDMODuplicateRule; -import nc.bs.mmpac.pmo.pac0002.rule.check.PMOCheckDateLogicRule; -import nc.bs.mmpac.pmo.pac0002.rule.check.PMOCheckMaterialPermissionRule; -import nc.bs.mmpac.pmo.pac0002.rule.check.PMOCheckNrwxisLogicRule; -import nc.bs.mmpac.pmo.pac0002.rule.check.PMOCheckParentStatusRule; -import nc.bs.mmpac.pmo.pac0002.rule.check.PMOCheckProcedureDateLogicRule; -import nc.bs.mmpac.pmo.pac0002.rule.check.PMOCheckProcedureDupRule; -import nc.bs.mmpac.pmo.pac0002.rule.check.PMOCheckProcedurePSCRule; -import nc.bs.mmpac.pmo.pac0002.rule.check.PMOCheckProcedureratioRule; -import nc.bs.mmpac.pmo.pac0002.rule.check.PMOCheckProdurepointRule; -import nc.bs.mmpac.pmo.pac0002.rule.check.PMOCheckSCDuplicateRule; -import nc.bs.mmpac.pmo.pac0002.rule.check.PMOCheckSNNumAndUnitRule; -import nc.bs.mmpac.pmo.pac0002.rule.check.PMOCheckSaveNotNullRule; -import nc.bs.mmpac.pmo.pac0002.rule.check.PMOProcedureChkPntRule; -import nc.bs.mmpac.pmo.pac0002.rule.fill.PMOFillBatchCodeRule; -import nc.bs.mmpac.pmo.pac0002.rule.fill.PMOFillFirstMOInfoRule; -import nc.bs.mmpac.pmo.pac0002.rule.fill.PMOFillInsertBatchValueRule; -import nc.bs.mmpac.pmo.pac0002.rule.fill.PMOFillInsertDefaultValueRule; -import nc.bs.mmpac.pmo.pac0002.rule.fill.PMOFillInsertPlanTimeByProcedureRule; -import nc.bs.mmpac.pmo.pac0002.rule.fill.PMOFillMaterialRelationRule; -import nc.bs.mmpac.pmo.pac0002.rule.fill.PMOFillPushDefaultValueRule; -import nc.bs.mmpac.pmo.pac0002.rule.fill.PMOFillPushVersionRule; -import nc.bs.mmpac.pmo.pac0002.rule.fill.PMOFillSNPkAndCodeRule; +import nc.bs.mmpac.pmo.pac0002.rule.*; +import nc.bs.mmpac.pmo.pac0002.rule.check.*; +import nc.bs.mmpac.pmo.pac0002.rule.fill.*; import nc.bs.mmpac.pmo.pac0002.rule.grand.PMOCreatePlanOutputRule; import nc.bs.mmpac.pmo.pac0002.rule.grand.PMOCreateProcedureRule; import nc.bs.mmpac.pmo.pac0002.rule.grand.PMOSyncPlanmmNumRule; -import nc.bs.mmpac.pmo.pac0002.rule.rewrite.RewriteInsertNum4MPS; -import nc.bs.mmpac.pmo.pac0002.rule.rewrite.RewriteInsertNum4PMO; -import nc.bs.mmpac.pmo.pac0002.rule.rewrite.RewriteInsertNum4PSCRecive; -import nc.bs.mmpac.pmo.pac0002.rule.rewrite.RewriteInsertNum4PSM; -import nc.bs.mmpac.pmo.pac0002.rule.rewrite.RewriteInsertNum4Renovate; -import nc.bs.mmpac.pmo.pac0002.rule.rewrite.RewriteInsertNum4SFC; -import nc.bs.mmpac.pmo.pac0002.rule.rewrite.RewriteInsertNum4SO; -import nc.bs.mmpac.pmo.pac0002.rule.rewrite.RewriteInsertNum4TO; -import nc.bs.mmpac.pmo.pac0002.bp.rule.saveBeforeCheckRule; +import nc.bs.mmpac.pmo.pac0002.rule.rewrite.*; import nc.bs.mmpub.rule.MMATOMaterialCheckRule; import nc.bs.mmpub.rule.MMAutoMaterialAssignRule; import nc.bs.mmpub.rule.MMBillTypeIsLockCheckRule; @@ -60,17 +20,16 @@ import nc.impl.pubapp.bd.userdef.UserDefSaveRule; import nc.impl.pubapp.pattern.rule.IRule; import nc.impl.pubapp.pattern.rule.processer.AroundProcesser; import nc.pubitf.sn.doc.param.SnDocParam; -import nc.util.mmf.busi.rule.MMBillCodeCheckAndTrantypeRule; -import nc.util.mmf.busi.rule.MMCheckMaterialProdModeRule; -import nc.util.mmf.busi.rule.MMCheckMaterialVirtualRule; -import nc.util.mmf.busi.rule.MMCreateBillcodeAndTrantypecodeRule; -import nc.util.mmf.busi.rule.MMRowNoCheckRule; +import nc.util.mmf.busi.rule.*; import nc.util.mmf.framework.gc.GCBillCloneUtil; import nc.util.mmf.framework.gc.GCBillInsert; import nc.util.mmf.framework.gc.GCInsertBPTemplate; import nc.vo.mmpac.pmo.pac0002.entity.PMOAggVO; import nc.vo.mmpac.pmo.pac0002.util.PmoSagaUtil; +import java.util.ArrayList; +import java.util.List; + public class PMOInsertBP { public PMOAggVO[] insert(PMOAggVO[] bills, boolean issub, boolean isPush) { AroundProcesser processer = new AroundProcesser(PMOPluginPoint.INSERT); @@ -234,6 +193,8 @@ public class PMOInsertBP { IRule saveBeforeCheckRule = new saveBeforeCheckRule(); processer.addBeforeRule(saveBeforeCheckRule); + + processer.addBeforeRule(new BeforePmoBomRule()); } private void addBeforeRuleSagasCheck(AroundProcesser processer, boolean issub, boolean isPush) { diff --git a/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/rule/BeforePmoBomRule.java b/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/rule/BeforePmoBomRule.java index 10016af..c996c11 100644 --- a/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/rule/BeforePmoBomRule.java +++ b/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/rule/BeforePmoBomRule.java @@ -3,13 +3,13 @@ package nc.bs.mmpac.pmo.pac0002.bp.rule; import nc.bs.logging.Logger; import nc.bs.uapbd.util.MyHelper; import nc.impl.pubapp.pattern.rule.IRule; +import nc.vo.am.common.util.StringUtils; import nc.vo.bd.bom.bom0202.entity.BomVO; import nc.vo.mmpac.pmo.pac0002.entity.PMOAggVO; import nc.vo.mmpac.pmo.pac0002.entity.PMOHeadVO; import nc.vo.mmpac.pmo.pac0002.entity.PMOItemVO; import nc.vo.org.FactoryVO; import nc.vo.pub.BusinessException; -import nc.vo.am.common.util.StringUtils; import nc.vo.pubapp.pattern.exception.ExceptionUtils; import java.util.Map; @@ -18,7 +18,7 @@ import java.util.Map; * 流程生产订单赋值生产BOM字段 * * @author mzr - * @date 2025/7/15 + * @date 2025/8/25 */ public class BeforePmoBomRule implements IRule { @@ -46,11 +46,12 @@ public class BeforePmoBomRule implements IRule { if ("30".equals(pmoItemVO.getVsrctype())) { // BOM状态 (FBomBillstatusEnum) 是否需要判断BOM的状态 // 根据bom版本号查询BOM(销售订单号+行号) - String bomVersion = pmoItemVO.getVsrccode() + pmoItemVO.getVsrcrowno(); + String bomVersion = pmoItemVO.getVsrccode() + "-" + pmoItemVO.getVsrcrowno(); String whereSql = BomVO.PK_ORG + " = '" + pkOrg + "' AND " + BomVO.HVERSION + " = '" + bomVersion + "'"; + // NCCForUAPLogger.debug("whereSql:" + whereSql); String bomId = MyHelper.getStrValByCondition(BomVO.TABLE_NAME, BomVO.CBOMID, whereSql); if (StringUtils.isEmpty(bomId)) { - throw new BusinessException("未找到对应的BOM"); + throw new BusinessException("未找到版本号(" + bomVersion + ")对应的BOM"); } pmoItemVO.setVbomversion(bomVersion); // 生产BOM版本号 pmoItemVO.setCbomversionid(bomId); // 生产BOM版本 diff --git a/qc/src/private/nc/impl/qc/c003/approve/action/rule/SyncQcQmsRule.java b/qc/src/private/nc/impl/qc/c003/approve/action/rule/SyncQcQmsRule.java new file mode 100644 index 0000000..b50a9c7 --- /dev/null +++ b/qc/src/private/nc/impl/qc/c003/approve/action/rule/SyncQcQmsRule.java @@ -0,0 +1,160 @@ +package nc.impl.qc.c003.approve.action.rule; + +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; +import nc.impl.pubapp.pattern.rule.IRule; +import nc.vo.bd.material.MaterialVO; +import nc.vo.org.OrgVO; +import nc.vo.pub.BusinessException; +import nc.vo.pubapp.pattern.exception.ExceptionUtils; +import nc.vo.qc.c003.entity.ReportHeaderVO; +import nc.vo.qc.c003.entity.ReportItemVO; +import nc.vo.qc.c003.entity.ReportVO; +import nccloud.baseapp.core.log.NCCForUAPLogger; + +import java.util.Map; + +/** + * 箱变-质检报告推启源MES + * + * @author mzr + * @date 2025/8/26 + */ +public class SyncQcQmsRule implements IRule { + + private static final String LOG_INFO_NAME = "qyMesLog"; + private static final Log logger = Log.getInstance(LOG_INFO_NAME); + private static final String reqUrl = "/IF_QyErpApi.ashx?action=addsjd"; + private Map configParams; + + @Override + public void process(ReportVO[] reportVOS) { + try { + if (reportVOS == null || reportVOS.length == 0) { + return; + } + configParams = MyHelper.getConfigParams("xb-config", null); + if (configParams.isEmpty()) { + throw new BusinessException("箱变的QMS接口缺少配置"); + } + buildSyncData(reportVOS); + } catch (Exception e) { + ExceptionUtils.wrappException(e); + } + } + + /** + * 构建同步数据 + */ + private void buildSyncData(ReportVO[] useVOs) throws BusinessException { + BaseDAO baseDAO = new BaseDAO(); + for (ReportVO vo : useVOs) { + ReportHeaderVO hvo = vo.getHVO(); + ReportItemVO[] bvo = vo.getBVO(); + // 判断物料的业务单元是否是箱变公司,不是则跳过 + String pkOrg = hvo.getPk_org(); + String orgCode = MyHelper.transferField(OrgVO.getDefaultTableName(), OrgVO.CODE, OrgVO.PK_ORG, pkOrg); + if (checkIfOrg(orgCode, configParams)) { + continue; + } + // 组装数据 + JSONObject singleObj = new JSONObject(); + long cts = System.currentTimeMillis(); + singleObj.put("batchid", cts); + singleObj.put("csdh", hvo.getVapplybillcode());// 送检单号,采购送检单的唯一标识编号 + singleObj.put("sjrq", hvo.getDapplydate().toString());// 送检日期,格式建议为 yyyy-MM-dd + singleObj.put("wlgysid", "");// 供应商编码 + singleObj.put("wlgysmc", "");// 供应商名称 + singleObj.put("sjr", hvo.getPk_applyer());// 送检人,负责提交送检单的人员姓名 + singleObj.put("cghth", "");// 采购合同号,关联对应的采购合同 + singleObj.put("bz", "");// 摘要备注,用于填写送检单的补充说明信息 + + String pkMaterial = hvo.getPk_material(); + Map materialMap = MyHelper.getMapValByCondition(MaterialVO.getDefaultTableName(), "code,name,materialspec,materialtype", + "pk_material = '" + pkMaterial + "'"); + // 处理Content数组 + JSONArray contentArray = new JSONArray(); + for (ReportItemVO item : bvo) { + JSONObject itemObj = new JSONObject(); + itemObj.put("wlbh", materialMap.getOrDefault("code", "")); // 物料编码 + itemObj.put("wlmc", materialMap.getOrDefault("name", "")); // 物料名称 + String materialtype = materialMap.getOrDefault("materialtype", "") + ""; + String materialspec = materialMap.getOrDefault("materialspec", "") + ""; + itemObj.put("wlxhgg", materialtype + materialspec); // 物料型号规格 + itemObj.put("sjsl", ""); // 送检数量(设计单位),按设计计量单位统计的送检数量 + itemObj.put("jldw", ""); // 计量单位 + itemObj.put("bz", ""); // 明细备注,用于填写该送检物料的补充说明 + contentArray.add(itemObj); + } + + singleObj.put("Content", contentArray); +/* { + "batchid": "10002", + "csdh": "SJ202405001", + "sjrq": "2024-05-20", + "wlgysid": "GY001", + "wlgysmc": "XX 金属材料有限公司", + "sjr": "张三", + "cghth": "HT202405003", + "bz": "紧急送检,需优先检测", + "Content": [ + { + "wlbh": "ACC26711", + "wlmc": "铜排", + "wlxhgg": "15558190831", + "jldw": "米", + "sjsl": "50", + "bz": "无特殊要求" + } + ] + }*/ + pushData(singleObj); + } + } + + /** + * 推送同步数据 + */ + private void pushData(JSONObject param) throws BusinessException { + // String jsonString = param.toJSONString(); + // 转json字符串的时候保留null值 + String jsonStr = JSON.toJSONString(param, + SerializerFeature.WriteMapNullValue, + SerializerFeature.WriteNullStringAsEmpty + ); + logger.error("QMS-QC-param = " + jsonStr); + NCCForUAPLogger.debug("QMS-QC-param = " + jsonStr); + String baseUrl = configParams.get("qmsBaseUrl"); + String requestUrl = baseUrl + reqUrl; + logger.error("QMS-QC-url = " + requestUrl); + String result = ThirdPartyPostRequestUtil.sendPostRequest(requestUrl, jsonStr); + JSONObject resultObj = JSONObject.parseObject(result); + logger.error("QMS-QC-res = " + result); + + if (!"success".equals(resultObj.getString("success"))) { + // throw new BusinessException("QMS-QC-error:" + resultObj.getString("msg")); + logger.error("QMS-QC-error,result[" + resultObj.toJSONString() + "]"); + } + } + + private boolean checkIfOrg(String code, Map configParams) throws BusinessException { + String targetCode = configParams.get("xbOrg"); + 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; + } + +} diff --git a/uapbd/src/private/nc/bs/bd/bom/bom0202/rule/BomUpdateAfterEpicMesRule.java b/uapbd/src/private/nc/bs/bd/bom/bom0202/rule/BomUpdateAfterEpicMesRule.java new file mode 100644 index 0000000..d3641b0 --- /dev/null +++ b/uapbd/src/private/nc/bs/bd/bom/bom0202/rule/BomUpdateAfterEpicMesRule.java @@ -0,0 +1,120 @@ +package nc.bs.bd.bom.bom0202.rule; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.serializer.SerializerFeature; +import nc.bs.logging.Log; +import nc.bs.uapbd.util.MyHelper; +import nc.bs.uapbd.util.ThirdPartyPostRequestUtil; +import nc.impl.pubapp.pattern.rule.IRule; +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.org.OrgVO; +import nc.vo.pub.BusinessException; +import nc.vo.pub.CircularlyAccessibleValueObject; +import nc.vo.pubapp.pattern.exception.ExceptionUtils; +import nccloud.baseapp.core.log.NCCForUAPLogger; + +import java.util.Map; + +/** + * BOM修改后同步艾普MES的BOM + * + * @author mzr + * @date 2025/08/29 + */ +public class BomUpdateAfterEpicMesRule implements IRule { + private static final String LOG_INFO_NAME = "dldzlog"; + private static final Log logDl = Log.getInstance(LOG_INFO_NAME); + private static final String reqUrl = ""; + private Map configParams; + + @Override + public void process(AggBomVO[] vos) { + if (!MMValueCheck.isEmpty(vos)) { + try { + configParams = MyHelper.getConfigParams("Dldz-config", null); + JSONArray data = buildSyncData(vos); + pushData(data); + } catch (BusinessException e) { + ExceptionUtils.wrappException(e); + } + } + } + + /** + * 构建同步数据 + */ + private JSONArray buildSyncData(AggBomVO[] useVOs) throws BusinessException { + JSONArray data = new JSONArray(); + for (AggBomVO vo : useVOs) { + // 判断物料的业务单元是否是电力电子公司,不是则跳过 + BomVO hvo = (BomVO) vo.getParentVO(); + 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; + } + String hfmaterialid = hvo.getHfmaterialid();// 父项物料编码 + String hcprojectid = hvo.getHcprojectid();// 项目 + String hversion = hvo.getHversion();// BOM版本号 + for (BomItemVO childrenVO : childrenVOs) { + String cmaterialid = childrenVO.getCmaterialid(); + // 组装数据 + JSONObject singleObj = new JSONObject(); + singleObj.put("mitm", ""); // 制造物料编码(ERP父项物料编码) + singleObj.put("sitm", ""); // 子物料编码 + singleObj.put("orderNum", ""); // 合同号(ERP项目) + singleObj.put("qana", childrenVO.getNassitemnum()); // 数量(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) 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); + + if (!"1".equals(resultObj.getString("flag"))) { + // throw new BusinessException("EpicMes-BOM-error:" + resultObj.getString("msg")); + logDl.error("EpicMes-BOM-error,result[" + resultObj.toJSONString() + "]"); + } + } +}