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