feat(sc/m61, mmpac/pickm): 新增委外订单和生产bom审批后同步至RZMOM的功能

- 新增 AfterApproceRuleSyncRZWMSProcess 类实现销售出库单审批后同步至RZMOM
- 新增 AfterApproveRuleSyncRZWMS 类实现生产领料单审批后同步至RZMOM
- 新增 PickmApproveBP 类实现生产领料单批量审批
- 新增 SCOrderApproveAction 类实现销售订单审批
This commit is contained in:
maolei 2025-05-17 17:42:59 +08:00
parent 61fe3c2d6b
commit faa18d08c2
5 changed files with 428 additions and 1 deletions

View File

@ -100,6 +100,8 @@ public class AfterSignRuleSyncMesProcess implements IRule<GeneralOutVO> {
requestData.put("operation_type", "I");// 固定给I 操作
requestData.put("info", info);
obmlog.debug("其它出库requestData:" + requestData.toJSONString());
IHttpPostOtherSys httpService = NCLocator.getInstance().lookup(IHttpPostOtherSys.class);
httpService.sendToExternalSystem("/GTHINKING/AjaxService/N_KCSJJS/101527004.ashx/gt_rec_api_qtckdj", requestData);
}
// 调拨出库/转库单
if (generalOutVO.getHead().getVtrantypecode().equals("4I-02")) {
@ -167,7 +169,7 @@ public class AfterSignRuleSyncMesProcess implements IRule<GeneralOutVO> {
obmlog.debug("其它出库requestData:" + requestData.toJSONString());
IHttpPostOtherSys httpService = NCLocator.getInstance().lookup(IHttpPostOtherSys.class);
httpService.sendToExternalSystem("test", requestData);
httpService.sendToExternalSystem("/GTHINKING/AjaxService/N_KCSJJS/101527009.ashx/gt_rec_api_dbckdj", requestData);
}
}

View File

@ -0,0 +1,55 @@
package nc.bs.mmpac.pickm.bp;
import nc.bs.mmpac.pickm.plugin.PickmPluginPoint;
import nc.bs.mmpac.pickm.rule.PickmApproveCheckStatusRule;
import nc.bs.mmpac.pickm.rule.PickmCheckAuditRule;
import nc.bs.mmpac.pickm.rule.PickmFbackflustimeCheckRule;
import nc.bs.mmpac.pickm.rule.PickmSetStatusRule;
import nc.bs.mmpub.rule.MMATOMaterialCheckRule;
import nc.bs.mmpub.rule.MMVOSagaFrozenValidateRule;
import nc.impl.pubapp.pattern.data.bill.template.UpdateBPTemplate;
import nc.impl.pubapp.pattern.data.bill.tool.BillTransferTool;
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.base.MMValueCheck;
import nc.vo.mmpac.pickm.entity.AggPickmVO;
import nc.vo.mmpac.pickm.enumeration.FbillstatusEnum;
public class PickmApproveBP {
private void addAfterRule(CompareAroundProcesser<AggPickmVO> processer) {
}
private void addBeforeRule(CompareAroundProcesser<AggPickmVO> processer) {
ICompareRule<AggPickmVO> pickmstatusFilterRule = new PickmApproveCheckStatusRule(true);
processer.addBeforeRule(pickmstatusFilterRule);
IRule<AggPickmVO> sagasCheckrule = new MMVOSagaFrozenValidateRule(true);
processer.addBeforeRule(sagasCheckrule);
IRule<AggPickmVO> pickmAuditCheckRule = new PickmCheckAuditRule();
processer.addBeforeRule(pickmAuditCheckRule);
IRule<AggPickmVO> mmatoMaterialCheckRule = new MMATOMaterialCheckRule("cmaterialvid", (String) null, "cffileid");
processer.addBeforeRule(mmatoMaterialCheckRule);
IRule<AggPickmVO> checkFbackFlusTime = new PickmFbackflustimeCheckRule();
processer.addBeforeRule(checkFbackFlusTime);
IRule<AggPickmVO> pickmSetStatusRule = new PickmSetStatusRule(FbillstatusEnum.AUDIT_STATE);
processer.addBeforeRule(pickmSetStatusRule);
}
public AggPickmVO[] batchApprovePickm(AggPickmVO[] vos) {
if (MMValueCheck.isEmpty(vos)) {
return null;
} else {
UpdateBPTemplate<AggPickmVO> bpTemplate = new UpdateBPTemplate(PickmPluginPoint.APPROVE);
BillTransferTool<AggPickmVO> transTool = new BillTransferTool(vos);
this.addBeforeRule(bpTemplate.getAroundProcesser());
this.addAfterRule(bpTemplate.getAroundProcesser());
AggPickmVO[] fullBills = (AggPickmVO[]) transTool.getClientFullInfoBill();
AggPickmVO[] originBills = (AggPickmVO[]) transTool.getOriginBills();
AggPickmVO[] retBills = (AggPickmVO[]) bpTemplate.update(fullBills, originBills);
return retBills;
}
}
}

View File

@ -0,0 +1,127 @@
package nc.bs.mmpac.pickm.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.bd.material.MaterialVO;
import nc.vo.bd.rt.rt0004.entity.RcVO;
import nc.vo.cmp.util.StringUtils;
import nc.vo.mmpac.pickm.entity.AggPickmVO;
import nc.vo.mmpac.pickm.entity.PickmHeadVO;
import nc.vo.mmpac.pickm.entity.PickmItemVO;
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 AfterApproveRuleSyncRZWMS implements IRule<AggPickmVO> {
private static Log log = Log.getInstance("rzmomlog");
private static BaseDAO dao = new BaseDAO();
@Override
public void process(AggPickmVO[] vos) {
if (ArrayUtil.isEmpty(vos)) {
return;
}
try {
// 检查并筛选领料组织
List<AggPickmVO> newAggPickmVOS = checkAndFilterBillSrcOrg(vos);
if (newAggPickmVOS.isEmpty()) {
return;
}
pushToRZMOM(newAggPickmVOS.toArray(new AggPickmVO[0]));
} catch (Exception e) {
ExceptionUtils.wrappException(e);
}
}
private void buildSyncData(PickmHeadVO head, PickmItemVO[] bodys, JSONArray details) throws BusinessException {
for (PickmItemVO body : bodys) {
JSONObject singleObj = new JSONObject();
String vsourcebillcode = head.getVsourcebillcode();
String wlbm_wbid = transferCodeByPk(MaterialVO.getDefaultTableName(), MaterialVO.CODE, MaterialVO.PK_MATERIAL, body.getCbmaterialvid());
String scgx_wbid = transferCodeByPk(RcVO.getDefaultTableName(), RcVO.VRCCODE, RcVO.CRCID, head.getVstdprocid());
String wbid = vsourcebillcode + "_" + wlbm_wbid + "_" + scgx_wbid;
singleObj.put("scgx_wbid", scgx_wbid); // 第三方系统使用工序id
singleObj.put("scjh_wbid", vsourcebillcode); // 第三方系统生产计划ID
singleObj.put("dwyl", body.getNplanoutastnum()); // 单位用量
singleObj.put("djyl", body.getNplanoutastnum()); // 单据用量
singleObj.put("clyl", body.getNplanoutastnum()); // 材料用量
singleObj.put("wlbm_wbid", wlbm_wbid); // 第三方系统材料id
singleObj.put("wbid", wbid); // 第三方系统主键id
details.add(singleObj);
}
}
private List<AggPickmVO> checkAndFilterBillSrcOrg(AggPickmVO[] aggPickmVOS) throws BusinessException {
List<AggPickmVO> aggvoList = new ArrayList<>();
for (AggPickmVO aggvo : aggPickmVOS) {
String pkOrg = aggvo.getParentVO().getPk_org(); // 假设领料组织在表头
String orgCode = transferCodeByPk(OrgVO.getDefaultTableName(), OrgVO.CODE, OrgVO.PK_ORG, pkOrg);
if ("30401".equals(orgCode)) { // 示例组织编码
aggvoList.add(aggvo);
}
}
return aggvoList;
}
private void pushToRZMOM(AggPickmVO[] aggPickmVOS) throws BusinessException {
String rzwmsip = SysInitQuery.getParaString("GLOBLE00000000000000", "RZWMSIP");
JSONObject jsonObject = new JSONObject();
JSONObject data = new JSONObject();
JSONObject dataIn = new JSONObject();
JSONObject dataIn2 = new JSONObject();
JSONArray details = new JSONArray();
jsonObject.put("dataflow", "泰开BIP→RZMOMv6");
jsonObject.put("actionCode", "cpfhtzdb");
for (AggPickmVO aggPickmVO : aggPickmVOS) {
PickmHeadVO head = aggPickmVO.getParentVO();
PickmItemVO[] bodys = (PickmItemVO[]) aggPickmVO.getChildrenVO();
buildSyncData(head, bodys, details);
}
dataIn2.put("Details", details);
dataIn.put("Data", dataIn2);
data.put("data", dataIn);
jsonObject.put("data", data);
log.error("生产BOW推送锐制请求报文" + jsonObject.toJSONString());
String result = ThirdPartyPostRequestUtil.sendPostRequest(rzwmsip, jsonObject.toJSONString());
JSONObject resultObj = JSONObject.parseObject(result);
if (resultObj == null || !"true".equals(resultObj.getString("success"))) {
String errorMsg = resultObj == null ? "接口返回为空" : resultObj.getString("msg");
throw new BusinessException("RZ同步失败原因" + errorMsg);
}
}
private String transferCodeByPk(String tableName, String selectField, String pkField, String pk) throws BusinessException {
if (StringUtils.isEmpty(pk)) {
return null;
}
SqlBuilder sqlBuilder = new SqlBuilder();
sqlBuilder.append(" select " + selectField);
sqlBuilder.append(" from " + tableName);
sqlBuilder.append(" where ");
sqlBuilder.append(pkField, pk);
Object o = dao.executeQuery(sqlBuilder.toString(), new ColumnProcessor());
if (o == null) {
throw new BusinessException("未查询到编码信息sql【" + sqlBuilder + "");
}
return o.toString();
}
}

View File

@ -0,0 +1,141 @@
package nc.bs.sc.m61.referred.rule.pm;
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.bd.material.MaterialVO;
import nc.vo.bd.psn.PsndocVO;
import nc.vo.bd.stordoc.StordocVO;
import nc.vo.bd.supplier.SupplierVO;
import nc.vo.cmp.util.StringUtils;
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.sc.m61.entity.SCOrderHeaderVO;
import nc.vo.sc.m61.entity.SCOrderItemVO;
import nc.vo.sc.m61.entity.SCOrderVO;
import nc.vo.scmpub.util.ArrayUtil;
import java.util.ArrayList;
import java.util.List;
public class AfterApproceRuleSyncRZWMSProcess implements IRule<SCOrderVO> {
private static Log log = Log.getInstance("rzmomlog");
private static BaseDAO dao = new BaseDAO();
@Override
public void process(SCOrderVO[] vos) {
if (ArrayUtil.isEmpty(vos)) {
return;
}
try {
//检查并筛选销售出库单据为互感器公司
List<SCOrderVO> newSCOrderVOS = checkAndFilterBillSrcOrg(vos);
if (newSCOrderVOS == null || newSCOrderVOS.size() < 1) {
return;
}
pushToRZMOM(newSCOrderVOS.toArray(new SCOrderVO[0]));
} catch (Exception e) {
ExceptionUtils.wrappException(e);
}
}
private void buildSyncData(SCOrderHeaderVO head, SCOrderItemVO[] bodys, JSONArray details) throws BusinessException {
for (SCOrderItemVO body : bodys) {
JSONObject singleObj = new JSONObject();
// 单据类型
singleObj.put("cgjh_wbid", body.getVsrctrantype());
singleObj.put("cgxh", body.getVsrcrowno());
singleObj.put("cgbh", body.getVsrccode());
singleObj.put("bzsm", body.getVbmemo());
singleObj.put("cght_wbid", head.getVbillcode());
singleObj.put("htxsbh", head.getVbillcode());
// 供应商
singleObj.put("zbxx_gycs_wbid", transferCodeByPk(SupplierVO.getDefaultTableName(), SupplierVO.CODE, SupplierVO.PK_SUPPLIER, head.getPk_supplier()));
// 仓库
singleObj.put("sdck", transferCodeByPk(StordocVO.getDefaultTableName(), StordocVO.CODE, StordocVO.PK_STORDOC, body.getPk_recvstordoc()));
// 物料
singleObj.put("wlbm_wbid", transferCodeByPk(MaterialVO.getDefaultTableName(), MaterialVO.CODE, MaterialVO.PK_MATERIAL, body.getPk_material()));
singleObj.put("cgsl", body.getNqtunitnum());
singleObj.put("jhrq", body.getDplanarrvdate());
singleObj.put("zbxx_cgrq", head.getDbilldate().toString());
singleObj.put("cgrq", head.getDbilldate()).toString();
singleObj.put("htxh", body.getCrowno());
// 业务员
singleObj.put("zbxx_cgy_wbid", transferCodeByPk(PsndocVO.getDefaultTableName(), PsndocVO.CODE, PsndocVO.PK_PSNDOC, head.getCemployeeid()));
details.add(singleObj);
}
}
private List<SCOrderVO> checkAndFilterBillSrcOrg(SCOrderVO[] SCOrderVOS) throws BusinessException {
List<SCOrderVO> aggvoList = new ArrayList<>();
for (SCOrderVO aggvo : SCOrderVOS) {
String pkOrg = aggvo.getParentVO().getPk_org();
String orgCode = transferCodeByPk(OrgVO.getDefaultTableName(), OrgVO.CODE, OrgVO.PK_ORG, pkOrg);
if ("30401".equals(orgCode)) {
aggvoList.add(aggvo);
}
}
return aggvoList;
}
private void pushToRZMOM(SCOrderVO[] SCOrderVOS) throws BusinessException {
String rzwmsip = SysInitQuery.getParaString("GLOBLE00000000000000", "RZWMSIP");
JSONObject jsonObject = new JSONObject();
JSONObject data = new JSONObject();
JSONObject dataIn = new JSONObject();
JSONObject dataIn2 = new JSONObject();
JSONArray details = new JSONArray();
jsonObject.put("dataflow", "泰开BIP→RZMOMv6");
jsonObject.put("actionCode", "cpfhtzdb");
//单笔/批量按明细传
for (SCOrderVO SCOrderVO : SCOrderVOS) {
SCOrderHeaderVO head = SCOrderVO.getParentVO();
SCOrderItemVO[] bodys = SCOrderVO.getChildrenVO();
// 构建需要同步的数据
buildSyncData(head, bodys, details);
}
dataIn2.put("Details", details);
dataIn.put("Data", dataIn2);
data.put("data", dataIn);
jsonObject.put("data", data);
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 String transferCodeByPk(String tableName, String selectField, String pkField, String pk) throws BusinessException {
if (StringUtils.isEmpty(pk)) {
return null;
}
SqlBuilder sqlBuilder = new SqlBuilder();
sqlBuilder.append(" select " + selectField);
sqlBuilder.append(" from " + tableName);
sqlBuilder.append(" where ");
sqlBuilder.append(pkField, pk);
Object o = dao.executeQuery(sqlBuilder.toString(), new ColumnProcessor());
if (o == null) {
throw new BusinessException("未查询到编码信息sql【" + sqlBuilder + "");
}
return o.toString();
}
}

View File

@ -0,0 +1,102 @@
package nc.impl.sc.m61.action.approve;
import nc.bs.pub.compiler.AbstractCompiler2;
import nc.bs.sc.m61.referred.rule.ic.ApproveSupplyRule;
import nc.bs.sc.m61.referred.rule.pm.AfterApproceRuleSyncRZWMSProcess;
import nc.bs.sc.m61.referred.rule.pm.SCOrderApprovePMSupplyRule;
import nc.bs.sc.m61.referred.rule.pm.SCOrderRewritePMStartDateRule;
import nc.bs.sc.plugin.SCOrderPluginPoint;
import nc.bs.scmpub.pf.PfParameterUtil;
import nc.bs.scmpub.rule.VOSagaFrozenValidateRule;
import nc.impl.pubapp.pattern.data.bill.BillUpdate;
import nc.impl.pubapp.pattern.rule.processer.CompareAroundProcesser;
import nc.impl.sc.m61.action.approve.rule.*;
import nc.itf.sc.m61.compenstate.IScOrderPmSagasCompensate;
import nc.itf.sc.reference.ic.ATPServices;
import nc.vo.pub.BusinessException;
import nc.vo.pubapp.pattern.exception.ExceptionUtils;
import nc.vo.sc.m61.entity.SCOrderVO;
import nc.vo.sc.m61.entity.context.SCOrderContxt;
import nc.vo.sc.pub.enumeration.SCBillStatus;
import nc.vo.scmpub.msg.rule.UpdateMsgStatusRule;
import nc.vo.scmpub.res.billtype.SCBillType;
import nc.vo.scmpub.util.AppInfoContext;
import nccloud.commons.lang.ArrayUtils;
import nccloud.pubitf.pu.pub.util.PuSagasUtil;
import nccloud.pubitf.sc.pub.util.SCOperationEnum;
import nccloud.pubitf.sc.pub.util.SCSagasOperationEnum;
import nccloud.pubitf.sc.pub.util.ScSagasUtil;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
public class SCOrderApproveAction {
private void addRule(CompareAroundProcesser<SCOrderVO> prcr) {
prcr.addBeforeRule(new VOSagaFrozenValidateRule(true));
prcr.addBeforeFinalRule(new ApproveStatusChkRule());
prcr.addBeforeFinalRule(new SupplierFrozeChkRule());
prcr.addBeforeFinalRule(new UpdateMsgStatusRule("pk_order"));
prcr.addBeforeRule(new ApproveFlowCheckMnyRule());
prcr.addAfterFinalRule(new UpdatePFlowInfoRule());
prcr.addAfterRule(new FilterOrderByStatusRule(SCBillStatus.APPROVED.toInt()));
prcr.addAfterRule(new SCOrderRewritePMStartDateRule(true));
prcr.addAfterRule(new ApproveSupplyRule());
prcr.addAfterRule(new SCOrderApprovePMSupplyRule());
prcr.addAfterRule(new AfterApproceRuleSyncRZWMSProcess());
}
public SCOrderVO[] approve(SCOrderVO[] vos, SCOrderContxt contxt, AbstractCompiler2 script) {
if (ArrayUtils.isEmpty(vos)) {
return vos;
} else {
PfParameterUtil<SCOrderVO> util = new PfParameterUtil(script == null ? null : script.getPfParameterVO(), vos);
SCOrderVO[] originBills = (SCOrderVO[]) util.getOrginBills();
SCOrderVO[] clientBills = (SCOrderVO[]) util.getClientFullInfoBill();
CompareAroundProcesser<SCOrderVO> prcr = new CompareAroundProcesser(SCOrderPluginPoint.APPROVE);
this.addRule(prcr);
prcr.before(clientBills, originBills);
if (null != script) {
try {
script.procFlowBacth(script.getPfParameterVO());
} catch (Exception e) {
ExceptionUtils.wrappException(e);
}
}
this.atpBeforeUpdate(clientBills);
try {
AppInfoContext.setProductCode(SCSagasOperationEnum.OREDERAPPROVE.getResCommon());
AppInfoContext.setResId(SCSagasOperationEnum.OREDERAPPROVE.getResId());
ScSagasUtil.frozenAndAddSaga(vos, "scorderApprove", SCBillType.Order.getCode());
Map<String, Serializable> paramMap = new HashMap();
paramMap.put("actionname", "scorderApprove");
paramMap.put("hid", originBills[0].getParentVO().getPrimaryKey());
paramMap.put(SCOperationEnum.APPROVER, originBills[0].getParentVO().getApprover());
paramMap.put(SCOperationEnum.TAUDITTIME, originBills[0].getParentVO().getTaudittime());
paramMap.put(SCOperationEnum.FBILLSTATUS, originBills[0].getParentVO().getFstatusflag());
PuSagasUtil.compensate(IScOrderPmSagasCompensate.class, paramMap);
} catch (BusinessException e) {
ExceptionUtils.wrappException(e);
}
BillUpdate<SCOrderVO> update = new BillUpdate();
SCOrderVO[] updateVOs = (SCOrderVO[]) update.update(clientBills, originBills);
prcr.after(clientBills, originBills);
this.atpAfterUpdate(updateVOs);
return updateVOs;
}
}
private void atpAfterUpdate(SCOrderVO[] updateVOs) {
ATPServices.modifyATPAfter(SCBillType.Order.getCode(), updateVOs);
}
private void atpBeforeUpdate(SCOrderVO[] clientBills) {
ATPServices.modifyATPBefore(SCBillType.Order.getCode(), clientBills);
}
}