feat(mmpac): 生产订单审批后同步到睿智系统- 新增 AfterApprovingSynchronizeRuleRZ 类实现审批后同步功能
- 在 PMOApproveBP 类中添加同步规则到审批流程 - 实现了对特定组织的生产订单进行筛选和数据转换 - 通过 HTTP 请求将数据推送到睿智系统
This commit is contained in:
		
							parent
							
								
									faa18d08c2
								
							
						
					
					
						commit
						a3d1f7bc69
					
				|  | @ -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<PMOAggVO> bp = new GCUpdateBPTemplate(PMOPluginPoint.APPROVE); | ||||
|         this.addApproveBeforeRule(bp.getAroundProcesser()); | ||||
|         this.addApproveAfterRule(bp.getAroundProcesser()); | ||||
|         return (PMOAggVO[]) bp.update(fullBills, originBills); | ||||
|     } | ||||
| 
 | ||||
|     private void addApproveBeforeRule(CompareAroundProcesser<PMOAggVO> processer) { | ||||
|         IRule<PMOAggVO> checkFrozenRule = new MMVOSagaFrozenValidateRule(true); | ||||
|         processer.addBeforeRule(checkFrozenRule); | ||||
|         processer.addBeforeRule(new PMOCheckApproveStatusRule()); | ||||
|         IRule<PMOAggVO> checkDeptRule = new PMOCheckDeptNotNullRule(); | ||||
|         processer.addBeforeRule(checkDeptRule); | ||||
|         IRule<PMOAggVO> approvefillvaluerule = new PMOFillApproveValueRule(false); | ||||
|         processer.addBeforeRule(approvefillvaluerule); | ||||
|         IRule<PMOAggVO> approvecheckrule = new PMOCheckProcedureNotNullRule(); | ||||
|         processer.addBeforeRule(approvecheckrule); | ||||
|         IRule<PMOAggVO> operTypeRule = new PMOCheckApproveOperTypeRule(); | ||||
|         processer.addBeforeRule(operTypeRule); | ||||
|         IRule<PMOAggVO> mmatoMaterialCheckRule = new MMATOMaterialCheckRule((String) null, "cmaterialvid", "cffileid"); | ||||
|         processer.addBeforeRule(mmatoMaterialCheckRule); | ||||
|     } | ||||
| 
 | ||||
|     private void addApproveAfterRule(CompareAroundProcesser<PMOAggVO> processer) { | ||||
|         IRule<PMOAggVO> pickmrule = new PMOInsertPickmRule(); | ||||
|         processer.addAfterRule(pickmrule); | ||||
|         processer.addAfterRule(new PMOAuditAutoAuditPickmRule()); | ||||
|         processer.addAfterRule(new PMOCreatePSCPlanRule()); | ||||
|         ICompareRule<PMOAggVO> auditSupplyRule = new PMOApproveAuditSupplyRule(); | ||||
|         processer.addAfterRule(auditSupplyRule); | ||||
|         // ÉóÅúºóÍÆË͵½î£ÖÇϵͳ | ||||
|         processer.addAfterRule(new AfterApprovingSynchronizeRuleRZ()); | ||||
|     } | ||||
| 
 | ||||
|     public PMOAggVO[] approveCancel(PMOAggVO[] fullBills, PMOAggVO[] originBills) { | ||||
|         GCUpdateBPTemplate<PMOAggVO> bp = new GCUpdateBPTemplate(PMOPluginPoint.UNAPPROVE); | ||||
|         this.addApproveCancelBeforeRule(bp.getAroundProcesser()); | ||||
|         this.addApproveCancelAfterRule(bp.getAroundProcesser()); | ||||
|         return (PMOAggVO[]) bp.update(fullBills, originBills); | ||||
|     } | ||||
| 
 | ||||
|     private void addApproveCancelBeforeRule(CompareAroundProcesser<PMOAggVO> processer) { | ||||
|         IRule<PMOAggVO> checkFrozenRule = new MMVOSagaFrozenValidateRule(true); | ||||
|         processer.addBeforeRule(checkFrozenRule); | ||||
|         processer.addBeforeRule(new PMOCheckUnApproveStatusRule()); | ||||
|         PMOUnApproveCheckNscNumRule checkNscNumRule = new PMOUnApproveCheckNscNumRule(); | ||||
|         processer.addBeforeRule(checkNscNumRule); | ||||
|         IRule<PMOAggVO> cancelcheckrule = new PMOCheckApproveCancelRule(); | ||||
|         processer.addBeforeRule(cancelcheckrule); | ||||
|         IRule<PMOAggVO> cancelCheckPutPlanStatusRule = new PMOApproveCancelCheckPutPlanStatusRule(); | ||||
|         processer.addBeforeRule(cancelCheckPutPlanStatusRule); | ||||
|         IRule<PMOAggVO> approvefillvaluerule = new PMOFillApproveValueRule(true); | ||||
|         processer.addBeforeRule(approvefillvaluerule); | ||||
|     } | ||||
| 
 | ||||
|     private void addApproveCancelAfterRule(CompareAroundProcesser<PMOAggVO> processer) { | ||||
|         ICompareRule<PMOAggVO> auditSupplyRule = new PMOApproveUnAuditSupplyRule(); | ||||
|         processer.addAfterRule(auditSupplyRule); | ||||
|     } | ||||
| } | ||||
|  | @ -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<PMOAggVO> { | ||||
|     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<PMOAggVO> 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<PMOAggVO> checkAndFilterBillSrcOrg(PMOAggVO[] pmoAggVOS) throws BusinessException { | ||||
|         List<PMOAggVO> 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(); | ||||
|     } | ||||
| } | ||||
		Loading…
	
		Reference in New Issue