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 new file mode 100644 index 0000000..de3e335 --- /dev/null +++ b/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/PMOApproveBP.java @@ -0,0 +1,81 @@ +package nc.bs.mmpac.pmo.pac0002.bp; + +import nc.bs.mmpac.pmo.pac0002.bp.rule.AfterApprovingSynchronizeRuleRZ; +import nc.bs.mmpac.pmo.pac0002.pluginpoint.PMOPluginPoint; +import nc.bs.mmpac.pmo.pac0002.rule.*; +import nc.bs.mmpac.pmo.pac0002.rule.check.*; +import nc.bs.mmpac.pmo.pac0002.rule.fill.PMOFillApproveValueRule; +import nc.bs.mmpac.pmo.pac0002.rule.psc.PMOCreatePSCPlanRule; +import nc.bs.mmpac.pmo.pac0002.rule.psc.PMOUnApproveCheckNscNumRule; +import nc.bs.mmpub.rule.MMATOMaterialCheckRule; +import nc.bs.mmpub.rule.MMVOSagaFrozenValidateRule; +import nc.impl.pubapp.pattern.rule.ICompareRule; +import nc.impl.pubapp.pattern.rule.IRule; +import nc.impl.pubapp.pattern.rule.processer.CompareAroundProcesser; +import nc.util.mmf.framework.gc.GCUpdateBPTemplate; +import nc.vo.mmpac.pmo.pac0002.entity.PMOAggVO; + +public class PMOApproveBP { + public PMOApproveBP() { + } + + public PMOAggVO[] approve(PMOAggVO[] fullBills, PMOAggVO[] originBills) { + GCUpdateBPTemplate bp = new GCUpdateBPTemplate(PMOPluginPoint.APPROVE); + this.addApproveBeforeRule(bp.getAroundProcesser()); + this.addApproveAfterRule(bp.getAroundProcesser()); + return (PMOAggVO[]) bp.update(fullBills, originBills); + } + + private void addApproveBeforeRule(CompareAroundProcesser processer) { + IRule checkFrozenRule = new MMVOSagaFrozenValidateRule(true); + processer.addBeforeRule(checkFrozenRule); + processer.addBeforeRule(new PMOCheckApproveStatusRule()); + IRule checkDeptRule = new PMOCheckDeptNotNullRule(); + processer.addBeforeRule(checkDeptRule); + IRule approvefillvaluerule = new PMOFillApproveValueRule(false); + processer.addBeforeRule(approvefillvaluerule); + IRule approvecheckrule = new PMOCheckProcedureNotNullRule(); + processer.addBeforeRule(approvecheckrule); + IRule operTypeRule = new PMOCheckApproveOperTypeRule(); + processer.addBeforeRule(operTypeRule); + IRule mmatoMaterialCheckRule = new MMATOMaterialCheckRule((String) null, "cmaterialvid", "cffileid"); + processer.addBeforeRule(mmatoMaterialCheckRule); + } + + private void addApproveAfterRule(CompareAroundProcesser processer) { + IRule pickmrule = new PMOInsertPickmRule(); + processer.addAfterRule(pickmrule); + processer.addAfterRule(new PMOAuditAutoAuditPickmRule()); + processer.addAfterRule(new PMOCreatePSCPlanRule()); + ICompareRule auditSupplyRule = new PMOApproveAuditSupplyRule(); + processer.addAfterRule(auditSupplyRule); + // 审批后推送到睿智系统 + processer.addAfterRule(new AfterApprovingSynchronizeRuleRZ()); + } + + public PMOAggVO[] approveCancel(PMOAggVO[] fullBills, PMOAggVO[] originBills) { + GCUpdateBPTemplate bp = new GCUpdateBPTemplate(PMOPluginPoint.UNAPPROVE); + this.addApproveCancelBeforeRule(bp.getAroundProcesser()); + this.addApproveCancelAfterRule(bp.getAroundProcesser()); + return (PMOAggVO[]) bp.update(fullBills, originBills); + } + + private void addApproveCancelBeforeRule(CompareAroundProcesser processer) { + IRule checkFrozenRule = new MMVOSagaFrozenValidateRule(true); + processer.addBeforeRule(checkFrozenRule); + processer.addBeforeRule(new PMOCheckUnApproveStatusRule()); + PMOUnApproveCheckNscNumRule checkNscNumRule = new PMOUnApproveCheckNscNumRule(); + processer.addBeforeRule(checkNscNumRule); + IRule cancelcheckrule = new PMOCheckApproveCancelRule(); + processer.addBeforeRule(cancelcheckrule); + IRule cancelCheckPutPlanStatusRule = new PMOApproveCancelCheckPutPlanStatusRule(); + processer.addBeforeRule(cancelCheckPutPlanStatusRule); + IRule approvefillvaluerule = new PMOFillApproveValueRule(true); + processer.addBeforeRule(approvefillvaluerule); + } + + private void addApproveCancelAfterRule(CompareAroundProcesser processer) { + ICompareRule auditSupplyRule = new PMOApproveUnAuditSupplyRule(); + processer.addAfterRule(auditSupplyRule); + } +} diff --git a/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/rule/AfterApprovingSynchronizeRuleRZ.java b/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/rule/AfterApprovingSynchronizeRuleRZ.java new file mode 100644 index 0000000..80726f6 --- /dev/null +++ b/mmpac/src/private/nc/bs/mmpac/pmo/pac0002/bp/rule/AfterApprovingSynchronizeRuleRZ.java @@ -0,0 +1,194 @@ +package nc.bs.mmpac.pmo.pac0002.bp.rule; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import nc.bs.dao.BaseDAO; +import nc.bs.logging.Log; +import nc.bs.uapbd.util.ThirdPartyPostRequestUtil; +import nc.impl.pubapp.pattern.rule.IRule; +import nc.jdbc.framework.processor.ColumnProcessor; +import nc.pubitf.para.SysInitQuery; +import nc.vo.cmp.util.StringUtils; +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.OrgVO; +import nc.vo.pub.BusinessException; +import nc.vo.pubapp.pattern.exception.ExceptionUtils; +import nc.vo.pubapp.pattern.pub.SqlBuilder; +import nc.vo.scmpub.util.ArrayUtil; + +import java.util.ArrayList; +import java.util.List; + +/** + * 流程生产订单审批后推送睿智 + */ +public class AfterApprovingSynchronizeRuleRZ implements IRule { + private static final Log log = Log.getInstance("rzmomlog"); + private static final BaseDAO dao = new BaseDAO(); + + @Override + public void process(PMOAggVO[] pmoAggVOS) { + if (ArrayUtil.isEmpty(pmoAggVOS)) { + return; + } + try { + // 检查并筛选生产订单 + List filteredOrders = checkAndFilterBillSrcOrg(pmoAggVOS); + if (filteredOrders.isEmpty()) { + return; + } + + // 推送到睿智系统 + pushToRZMOM(filteredOrders.toArray(new PMOAggVO[0])); + } catch (Exception e) { + log.error("同步生产订单到睿智系统失败: " + e.getMessage(), e); + ExceptionUtils.wrappException(e); + } + } + + /** + * 检查并筛选需要同步的单据 + */ + private List checkAndFilterBillSrcOrg(PMOAggVO[] pmoAggVOS) throws BusinessException { + List aggvoList = new ArrayList<>(); + for (PMOAggVO aggvo : pmoAggVOS) { + String pkOrg = aggvo.getParentVO().getPk_org(); + String orgCode = transferCodeByPk(OrgVO.getDefaultTableName(), pkOrg); + if ("30401".equals(orgCode)) { + aggvoList.add(aggvo); + } + } + return aggvoList; + } + + /** + * 推送数据到睿智MOM系统 + */ + private void pushToRZMOM(PMOAggVO[] pmoAggVOS) throws BusinessException { + String rzwmsip = SysInitQuery.getParaString("GLOBLE00000000000000", "RZWMSIP"); + + JSONObject jsonObject = new JSONObject(); + jsonObject.put("dataflow", "泰开BIP→RZMOMv6"); + jsonObject.put("actionCode", "scdd"); // 生产订单的action code + + JSONObject dataIn = new JSONObject(); + JSONObject dataIn2 = new JSONObject(); + JSONArray details = new JSONArray(); + + // 单笔/批量按明细传 + for (PMOAggVO pmoAggVO : pmoAggVOS) { + PMOHeadVO head = pmoAggVO.getParentVO(); + PMOItemVO[] bodys = pmoAggVO.getChildrenVO(); + + // 构建需要同步的数据 + buildSyncData(head, bodys, details); + } + + dataIn2.put("Details", details); + dataIn.put("Data", dataIn2); + jsonObject.put("data", dataIn); + + log.error("生产订单审批推送锐制请求报文:" + jsonObject.toJSONString()); + + String result = ThirdPartyPostRequestUtil.sendPostRequest(rzwmsip, jsonObject.toJSONString()); + JSONObject resultObj = JSONObject.parseObject(result); + if ("false".equals(resultObj.getString("success"))) { + throw new BusinessException("RZMOM同步失败,原因:" + resultObj.getString("msg")); + } + } + + /** + * 构建同步数据 + */ + private void buildSyncData(PMOHeadVO head, PMOItemVO[] bodys, JSONArray details) throws BusinessException { + String vbillcode = head.getVbillcode(); // 单据号 + + for (PMOItemVO body : bodys) { + JSONObject detailItem = new JSONObject(); + + // 根据映射表设置字段 + detailItem.put("jhmx_wbid", vbillcode); // 第三方系统主键id + detailItem.put("scjh_wbid", vbillcode); // 计划ID + detailItem.put("operate", 1); // 操作状态:1新增/修改 + detailItem.put("scbh", vbillcode); // 计划编号 + + // 计划序号,有则使用实际值,无则设为1 + String rowno = body.getVrowno(); + detailItem.put("jhxh", StringUtils.isEmpty(rowno) ? 1 : Integer.parseInt(rowno)); + + // 第三方系统计划类别id + detailItem.put("jhlb_wbid", head.getVtrantypecode()); + + // 第三方系统产品ID + detailItem.put("wlbm_wbid", body.getCmaterialvid()); + + // 计划数量 + if (body.getNmmastnum() != null) { + detailItem.put("jhsl", body.getNmmastnum().doubleValue()); + } + detailItem.put("jhlx", null); + // 计划员 + detailItem.put("jhy_wbid", null); + + // 上线日期 - 计划开工日期 + if (body.getTplanstarttime() != null) { + detailItem.put("sxrq", body.getTplanstarttime().toString()); + } + + // 完成日期 - 计划完工日期 + if (body.getTplanendtime() != null) { + detailItem.put("wcrq", body.getTplanendtime().toString()); + } + + // 备注说明 + detailItem.put("bzsm", head.getVnote()); + + // 签发标记 - 行状态 + detailItem.put("qfbj", body.getFitemstatus()); + + // 送达地点 - 入库仓库 + detailItem.put("sdck", body.getCinwarehouseid()); + + // 项目编号 + detailItem.put("wlzdycs06", body.getVdef1()); + + // 固定值设置 + detailItem.put("zdscjhlyb", 1); // 自动生成计划来源表 + detailItem.put("jhbhzdsc", 0); // 计划号重新生成 + detailItem.put("bomsdbj", 1); // 生产BOM锁定 + detailItem.put("bsbj", 1); // 包装Bom表锁定 + + // 其他字段映射 + detailItem.put("khbh_wbid", body.getCcustomerid()); // 第三方系统客户id + detailItem.put("cjbz_wbid", body.getCdeptid()); // 第三方系统车间工段ID + + // 销售订单相关 + detailItem.put("xsdd_wbid", body.getVfirstid()); // 第三方系统销售订单主表ID + detailItem.put("ddbh", body.getVsalebillcode()); // 订单编号 + detailItem.put("ddxh", body.getVfirstrowno()); // 订单序号 + + details.add(detailItem); + } + } + + /** + * 根据主键查询编码 + */ + private String transferCodeByPk(String tableName, String pk) throws BusinessException { + if (StringUtils.isEmpty(pk)) { + return null; + } + SqlBuilder sqlBuilder = new SqlBuilder(); + sqlBuilder.append(" select " + OrgVO.CODE); + sqlBuilder.append(" from " + tableName); + sqlBuilder.append(" where "); + sqlBuilder.append(OrgVO.PK_ORG, pk); + Object o = dao.executeQuery(sqlBuilder.toString(), new ColumnProcessor()); + if (o == null) { + throw new BusinessException("未查询到编码信息,sql【" + sqlBuilder + "】"); + } + return o.toString(); + } +}