feat(mmpac): 生产订单审批后同步到睿智系统- 新增 AfterApprovingSynchronizeRuleRZ 类实现审批后同步功能

- 在 PMOApproveBP 类中添加同步规则到审批流程
- 实现了对特定组织的生产订单进行筛选和数据转换
- 通过 HTTP 请求将数据推送到睿智系统
This commit is contained in:
张明 2025-05-17 17:54:11 +08:00
parent faa18d08c2
commit a3d1f7bc69
2 changed files with 275 additions and 0 deletions

View File

@ -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);
}
}

View File

@ -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();
}
}