From 43c63c683198411c3a344f9a5f8c121c21aab170 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=AD=A3=40=E7=94=A8=E5=8F=8B?= Date: Fri, 20 Jun 2025 09:11:01 +0800 Subject: [PATCH] =?UTF-8?q?patch=5Fdev=5F5=E6=8E=A5=E5=8F=A3=E6=8E=A8?= =?UTF-8?q?=E9=80=81=E9=94=90=E5=88=B6=E4=BC=98=E5=8C=96=5FV18=5F=E9=94=80?= =?UTF-8?q?=E5=94=AE=E5=87=BA=E5=BA=93=E9=80=80=E8=B4=A7=E5=8F=8A=E5=A7=94?= =?UTF-8?q?=E5=A4=96=E5=A4=87=E6=96=99=E8=AE=A1=E5=88=92=E9=80=BB=E8=BE=91?= =?UTF-8?q?=5Fsdlizheng=5F20250619?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../rule/AfterSigningSynchronizeRuleRZ.java | 59 ++++++-- .../bp/rule/AfterApproveRuleSyncRZWMS.java | 127 +++++++++++++++++- 2 files changed, 172 insertions(+), 14 deletions(-) diff --git a/ic/src/private/nc/bs/ic/m4c/sign/rule/AfterSigningSynchronizeRuleRZ.java b/ic/src/private/nc/bs/ic/m4c/sign/rule/AfterSigningSynchronizeRuleRZ.java index ee814ea..d66feb9 100644 --- a/ic/src/private/nc/bs/ic/m4c/sign/rule/AfterSigningSynchronizeRuleRZ.java +++ b/ic/src/private/nc/bs/ic/m4c/sign/rule/AfterSigningSynchronizeRuleRZ.java @@ -16,8 +16,11 @@ import nc.vo.ic.m4c.entity.SaleOutHeadVO; import nc.vo.ic.m4c.entity.SaleOutVO; import nc.vo.org.OrgVO; import nc.vo.pub.BusinessException; +import nc.vo.pub.lang.UFBoolean; import nc.vo.pub.lang.UFDate; +import nc.vo.pub.lang.UFDouble; import nc.vo.pubapp.pattern.exception.ExceptionUtils; +import nc.vo.pubapp.pattern.pub.MathTool; import nc.vo.pubapp.pattern.pub.SqlBuilder; import nc.vo.scmpub.util.ArrayUtil; @@ -73,14 +76,24 @@ public class AfterSigningSynchronizeRuleRZ implements IRule { JSONObject dataIn = new JSONObject(); JSONObject dataIn2 = new JSONObject(); JSONArray details = new JSONArray(); - jsonObject.put("dataflow", "用友BIP→RZMOMv6"); - jsonObject.put("actionCode", "cpfhtzdb"); + //根据行数量正负拆分数组-并判断 + UFBoolean isPosValue=checkNumSymbol(saleOutVOS); //单笔/批量按明细传 for (SaleOutVO saleOutVO : saleOutVOS) { SaleOutHeadVO head = saleOutVO.getHead(); SaleOutBodyVO[] bodys = saleOutVO.getBodys(); // 构建需要同步的数据 - buildSyncData(head, bodys, details); + buildSyncData(head, bodys, details,isPosValue); + + } + if(isPosValue.booleanValue()){ + //正向 + jsonObject.put("dataflow", "用友BIP→RZMOMv6"); + jsonObject.put("actionCode", "cpfhtzdb"); + }else{ + //反向 + jsonObject.put("dataflow", "用友BIP→RZMOMv6"); + jsonObject.put("actionCode", "thsqb"); } dataIn2.put("Details", details); dataIn.put("Data", dataIn2); @@ -96,7 +109,27 @@ public class AfterSigningSynchronizeRuleRZ implements IRule { } } - private void buildSyncData(SaleOutHeadVO head, SaleOutBodyVO[] bodys, JSONArray details) throws BusinessException { + private UFBoolean checkNumSymbol(SaleOutVO[] saleOutVOS) throws BusinessException { + UFBoolean hasPositive = UFBoolean.FALSE; + UFBoolean hasNegative = UFBoolean.FALSE; + + for (SaleOutVO saleOutVO : saleOutVOS) { + SaleOutBodyVO[] bodys = saleOutVO.getBodys(); + for (SaleOutBodyVO body : bodys){ + if(MathTool.compareTo(body.getNshouldassistnum(), UFDouble.ZERO_DBL)>=0){ + hasPositive=UFBoolean.TRUE; + }else{ + hasNegative=UFBoolean.TRUE; + } + } + } + if(hasPositive.booleanValue()&&hasNegative.booleanValue()){ + throw new BusinessException("销售出库签字推送锐制失败,原因:签字不允许存在正负数量的单据"); + } + return hasPositive; + } + + private void buildSyncData(SaleOutHeadVO head, SaleOutBodyVO[] bodys, JSONArray details,UFBoolean isPosValue) throws BusinessException { String vbillcode = head.getVbillcode();//单据号 String vtrantypecode = head.getVtrantypecode();//出入库类型编码 @@ -115,7 +148,12 @@ public class AfterSigningSynchronizeRuleRZ implements IRule { singleObj.put("wbid", cgeneralhid + "_" + cgeneralbid + "_" + vtrantypecode);//第三方系统主键id singleObj.put("wbpid", cgeneralhid);//第三方系统分组id singleObj.put("operate", 1);//operate int 操作状态 必填 1新增/修改、2删除(删除时只需上传wbid) - singleObj.put("djly", 1013);//djly varchar(20) 来源单据 + if(isPosValue.booleanValue()){ + singleObj.put("djly", 1013);//djly varchar(20) 来源单据 + }else { + singleObj.put("djly", 1012);//djly varchar(20) 来源单据 + } + singleObj.put("djbh_id", cgeneralhid);//单据id singleObj.put("djbh", vbillcode);//单据编号 singleObj.put("djxh", crowno);//单据序号 @@ -125,9 +163,14 @@ public class AfterSigningSynchronizeRuleRZ implements IRule { //第三方系统物料名称id--编码 singleObj.put("wlbm_wbid", cmaterialvid); - //单据数量 - singleObj.put("djsl", body.getNshouldassistnum().getDouble()); + if(isPosValue.booleanValue()){ + //单据数量 + singleObj.put("djsl", body.getNshouldassistnum().getDouble()); + }else { + //单据数量 + singleObj.put("djsl", MathTool.abs(body.getNshouldassistnum()).getDouble()); //负数取绝对值 + } //第三方系统客户id--编码 singleObj.put("khbh_wbid", casscustid); //订单编号 @@ -143,7 +186,7 @@ public class AfterSigningSynchronizeRuleRZ implements IRule { // 添加两个字段 项目号 和 项目名称 使用 vbdef1 和 vbdef10 singleObj.put("wlzdycs06", transferCodeByPk("bd_defdoc", DefdocVO.CODE, DefdocVO.PK_DEFDOC, body.getVbdef1())); - singleObj.put("wlzdycs11", transferCodeByPk("bd_defdoc", DefdocVO.NAME, DefdocVO.PK_DEFDOC, body.getVbdef10())); + singleObj.put("wlzdycs11", body.getVbdef10()); //签发标记 singleObj.put("qfbj", 1); //操作状态 1新增/修改、2删除(删除时只需上传wbid) diff --git a/mmpac/src/private/nc/bs/mmpac/pickm/bp/rule/AfterApproveRuleSyncRZWMS.java b/mmpac/src/private/nc/bs/mmpac/pickm/bp/rule/AfterApproveRuleSyncRZWMS.java index c316653..b65ae8e 100644 --- a/mmpac/src/private/nc/bs/mmpac/pickm/bp/rule/AfterApproveRuleSyncRZWMS.java +++ b/mmpac/src/private/nc/bs/mmpac/pickm/bp/rule/AfterApproveRuleSyncRZWMS.java @@ -11,12 +11,14 @@ 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.bd.stordoc.StordocVO; 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.pub.lang.UFBoolean; import nc.vo.pubapp.pattern.exception.ExceptionUtils; import nc.vo.pubapp.pattern.pub.SqlBuilder; import nc.vo.scmpub.util.ArrayUtil; @@ -41,13 +43,36 @@ public class AfterApproveRuleSyncRZWMS implements IRule { if (newAggPickmVOS.isEmpty()) { return; } - pushToRZMOM(newAggPickmVOS.toArray(new AggPickmVO[0])); + Boolean is55A2=checkSrcBillType(newAggPickmVOS); + if(is55A2){ + //来源生产订单 + pushToRZMOMBy55A2(newAggPickmVOS.toArray(new AggPickmVO[0])); + }else{ + //来源委外订单 + pushToRZMOMBy61(newAggPickmVOS.toArray(new AggPickmVO[0])); + } } catch (Exception e) { ExceptionUtils.wrappException(e); } } - private void buildSyncData(PickmHeadVO head, PickmItemVO[] bodys, JSONArray details) throws BusinessException { + private Boolean checkSrcBillType(List newAggPickmVOS) throws BusinessException { + UFBoolean is61=UFBoolean.FALSE; + UFBoolean is55A2=UFBoolean.FALSE; + for (AggPickmVO aggPickmVO : newAggPickmVOS) { + String vfirstbilltype = aggPickmVO.getParentVO().getVfirstbilltype(); + if("61".equals(vfirstbilltype)){ + is61=UFBoolean.TRUE; + }else if("55A2".equals(vfirstbilltype)){ + is55A2=UFBoolean.TRUE; + } + } + if(is55A2.booleanValue()&&is61.booleanValue()){ + throw new BusinessException("备料计划推送锐制失败,原因:不允许源头单据类型为生产订单和委外订单的单据同时审批"); + } + return is55A2.booleanValue(); + } + private void buildSyncDataBy55A2(PickmHeadVO head, PickmItemVO[] bodys, JSONArray details) throws BusinessException { Integer fsourcetype = head.getFsourcetype(); if(fsourcetype!=0){ return; @@ -79,7 +104,7 @@ public class AfterApproveRuleSyncRZWMS implements IRule { //bomlx int BOM类型 必填 默认=0,即传入生产BOM(1为包装BOM)。 singleObj.put("bomlx", 0); - singleObj.put("dwyl", body.getNunituseastnum().getDouble()); // 单位用量 + singleObj.put("dwyl", body.getNunituseastnum().getDouble()); // 单位用量nunituseastnum singleObj.put("djyl", body.getNplanoutastnum().getDouble()); // 单据用量 singleObj.put("clyl", body.getNplanoutastnum().getDouble()); // 材料用量 @@ -98,20 +123,84 @@ public class AfterApproveRuleSyncRZWMS implements IRule { } } + private void buildSyncDataBy61(PickmHeadVO head, PickmItemVO[] bodys, JSONArray details) throws BusinessException { + Integer fsourcetype = head.getFsourcetype(); + if(fsourcetype!=1){ + return; + } + for (PickmItemVO body : bodys) { + JSONObject singleObj = new JSONObject(); + String vsourcebillcode = head.getVsourcebillcode(); + String wlbm_wbid =body.getCbmaterialvid(); + + String scgx_wbid =head.getVstdprocid(); + //wbid varchar (200) 第三方系统主键id + singleObj.put("wbid", head.getCpickmid()+"_"+body.getCpickm_bid()); // 第三方系统主键id + //wbzbid varchar (200) 第三方系统分组id + singleObj.put("wbpid", head.getCpickmid()); + //operate int 操作状态 必填 1新增/修改、2删除(删除时只需上传wbid) + singleObj.put("operate", "1"); + //djly varchar(20) 来源单据 必填 取值read_djlyb中编号 + //领料通知默认1011 + singleObj.put("djly", "1011"); + + //_id varchar(50) 单据id 必填 后台该单据类型的唯一ID + singleObj.put("djbh_id", head.getCpickmid()); + + //djbh varchar(100) 单据编号 必填 前台单据编号 + singleObj.put("djbh", head.getVbillcode()); + + //djxh numeric(5) 单据序号 必填 前台单据序号 + singleObj.put("djxh", body.getVrowno()); + + //djrq datetime 单据日期 必填 + singleObj.put("djrq", head.getDmakedate()); + + //wlbm_wbid varchar(100) 第三方系统物料名称id 必填 物料编码的后台ID + singleObj.put("wlbm_wbid", wlbm_wbid); + + //scjh_wbid varchar(100) 第三方系统生产计划ID 必填 生产计划号外部ID,一般ERP系统的生产订单号。 + singleObj.put("scjh_wbid", head.getCsourcebillid()); + + //jhxh numeric(5) 计划序号 -生产订单行号 + singleObj.put("jhxh", head.getVsourcebillrowno()); + + //djsl numeric(18,3) 单据数量 必填 + singleObj.put("djsl", body.getNpscnum().getDouble()); + + //sddd varchar(510) 送达地点 必填 传仓库名称,要求上位ERP仓库名称不重复。 + singleObj.put("sddd", transferCodeByPk(StordocVO.getDefaultTableName(), StordocVO.NAME, StordocVO.PK_STORDOC, body.getCoutstockid())); + + //ckbh_wbid varchar(100) 第三方系统仓库id 必填 储区根据仓库默认,同仓库多储区时,两者必填; + singleObj.put("ckbh_wbid",transferCodeByPk(StordocVO.getDefaultTableName(), StordocVO.CODE, StordocVO.PK_STORDOC, body.getCoutstockid())); + + //qfbj int 签发标记 必填 默认1;上位系统审核传至MOM 1 + singleObj.put("qfbj", 1); + + //cght_wbid varchar(100) 第三方系统合同id 必填 委外订单 + singleObj.put("cght_wbid", head.getVfirstbillcode()); + details.add(singleObj); + + } + } private List checkAndFilterBillSrcOrg(AggPickmVO[] aggPickmVOS) throws BusinessException { List aggvoList = new ArrayList<>(); for (AggPickmVO aggvo : aggPickmVOS) { String pkOrg = aggvo.getParentVO().getPk_org(); String orgCode = transferCodeByPk(OrgVO.getDefaultTableName(), OrgVO.CODE, OrgVO.PK_ORG, pkOrg); + //过滤上游不是生产订单和委外订单的备料计划 + String vfirstbilltype = aggvo.getParentVO().getVfirstbilltype(); if ("C022".equals(orgCode)&& 1 == aggvo.getParentVO().getFbillstatus()&&aggvo.getChildrenVO()!=null && aggvo.getChildrenVO().length > 0) { - aggvoList.add(aggvo); + if("61".equals(vfirstbilltype)||"55A2".equals(vfirstbilltype)){ + aggvoList.add(aggvo); + } } } return aggvoList; } - private void pushToRZMOM(AggPickmVO[] aggPickmVOS) throws BusinessException { + private void pushToRZMOMBy55A2(AggPickmVO[] aggPickmVOS) throws BusinessException { String rzwmsip = SysInitQuery.getParaString("GLOBLE00000000000000", "RZWMSIP"); JSONObject jsonObject = new JSONObject(); JSONObject dataIn = new JSONObject(); @@ -123,7 +212,7 @@ public class AfterApproveRuleSyncRZWMS implements IRule { for (AggPickmVO aggPickmVO : aggPickmVOS) { PickmHeadVO head = aggPickmVO.getParentVO(); PickmItemVO[] bodys = (PickmItemVO[]) aggPickmVO.getChildrenVO(); - buildSyncData(head, bodys, details); + buildSyncDataBy55A2(head, bodys, details); } dataIn2.put("Details", details); dataIn.put("Data", dataIn2); @@ -138,7 +227,33 @@ public class AfterApproveRuleSyncRZWMS implements IRule { log.error("RZMOM同步成功,返回参数【"+resultObj.toJSONString()+"】"); } } + private void pushToRZMOMBy61(AggPickmVO[] aggPickmVOS) throws BusinessException { + String rzwmsip = SysInitQuery.getParaString("GLOBLE00000000000000", "RZWMSIP"); + JSONObject jsonObject = new JSONObject(); + JSONObject dataIn = new JSONObject(); + JSONObject dataIn2 = new JSONObject(); + JSONArray details = new JSONArray(); + jsonObject.put("dataflow", "用友BIP→RZMOMv6"); + jsonObject.put("actionCode", "wwfhtzdb"); + for (AggPickmVO aggPickmVO : aggPickmVOS) { + PickmHeadVO head = aggPickmVO.getParentVO(); + PickmItemVO[] bodys = (PickmItemVO[]) aggPickmVO.getChildrenVO(); + buildSyncDataBy61(head, bodys, details); + } + dataIn2.put("Details", details); + dataIn.put("Data", dataIn2); + jsonObject.put("data", dataIn); + 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); + }else{ + log.error("RZMOM同步成功,返回参数【"+resultObj.toJSONString()+"】"); + } + } private String transferCodeByPk(String tableName, String selectField, String pkField, String pk) throws BusinessException { if (StringUtils.isEmpty(pk)) { return null;