资金计划优化2

This commit is contained in:
yuxueliang0813 2025-04-22 18:19:08 +08:00
parent 726a8bc9ec
commit 5cc1516ac8
3 changed files with 144 additions and 110 deletions

View File

@ -22,6 +22,7 @@ public class VoucherBillOperation extends AbstractOperationServicePlugIn impleme
String sourcebilltype;
DynamicObject bizbillinfo;
for (DynamicObject pzinfo : dos) {
pzinfo = BusinessDataServiceHelper.loadSingle(pzinfo.getPkValue(), pzinfo.getDataEntityType().getName(), "id,billno,sourcebill,sourcebilltype");
sourcebillid = pzinfo.getLong("sourcebill");
sourcebilltype = pzinfo.getDynamicObject("sourcebilltype").getString("number");
if(recbillName.equals(sourcebilltype)){

View File

@ -54,6 +54,7 @@ public class FundPlanCollectionTask extends AbstractTask implements Plugin {
//调用SAP应收已清接口按照事业部月份计划科目汇总金额
Map<String, BigDecimal> acctamountMap = getSapARClearedData();
if(acctamountMap == null || acctamountMap.isEmpty()){
logger.info("未获取到月份、计划科目汇总金额");
return;
}
ReportDataSDKService reportService = new ReportDataSDKService();//报表服务用于写入或者查询报表数据
@ -92,6 +93,7 @@ public class FundPlanCollectionTask extends AbstractTask implements Plugin {
for(DynamicObject entryinfo : maindimentrys){
accountInfo = entryinfo.getDynamicObject("subjectmem");
if(!accountInfo.getBoolean("isleaf")){
//非叶子节点的数据不处理
continue;
}
accountnum = accountInfo.getString("number");
@ -105,7 +107,7 @@ public class FundPlanCollectionTask extends AbstractTask implements Plugin {
JSONObject mmInfo = new JSONObject();
//PLANREFERENCEAMT 计划参考值 ACTMAT 已执行额度
mmInfo.put("templateMetricType","ACTMAT");//度量值预置类型
mmInfo.put("amount",acctamountMap.get(sybnum+months+accountnum));//写入金额-从SAP接口中汇总
mmInfo.put("amount",acctamountMap.get(months+accountnum));//写入金额-从SAP接口中汇总
mmInfo.put("amountUnit","one");//金额单位 one元 thousand千元 ten_thousand 万元
mms.add(mmInfo);
itemInfo.put("metricMembers",mms);//度量值列表
@ -144,40 +146,49 @@ public class FundPlanCollectionTask extends AbstractTask implements Plugin {
if(data != null){
JSONArray items = data.getJSONArray("IT_ITEM");
Map<String, BigDecimal> acctamountMap = new HashMap<>();
BigDecimal amount;//根据事业部编号+月份+资金计划科目编号汇总的金额
String productnum;//品牌
String sybnum;//事业部编号
BigDecimal amount;//根据事业部编号+月份+资金计划科目编号汇总的金额-最新修改为根据月份+资金计划科目编号
// String productnum;//品牌
// String sybnum;//事业部编号
String months;//月份
String accountnum;//资金计划科目编号
String mapkey;//事业部编号+月份+资金计划科目编号
DynamicObject ppsybinfo;//品牌和事业部关系对象
// DynamicObject ppsybinfo;//品牌和事业部关系对象
for (int i = 0; i < items.size(); i++) {
sapresult = items.getJSONObject(i);
amount = sapresult.getBigDecimal("DMBTR");//已清金额
productnum = sapresult.getString("SPART");//产品组
// productnum = sapresult.getString("SPART");//产品组
months = sapresult.getString("BUDAT");//过账日期
if(JhzjUtils.isEmpty(months)){
logger.info("SAP过账日期为空"+sapresult.toJSONString());
continue;
}
accountnum = xdMembersubjectNumber(sapresult);
if(JhzjUtils.isEmpty(accountnum)){
logger.info("SAP应收已清未找到对应资金科目"+sapresult.toJSONString());
continue;
}
months = JhzjUtils.getFundPeriodBySAPDate(months);
//根据品牌和事业部关系将该笔金额归属到事业部上
ppsybinfo = BusinessDataServiceHelper.loadSingleFromCache(ppsybName,new QFilter[]{new QFilter("shjh_productgroup.number", QCP.equals, productnum)});
if(ppsybinfo != null){
sybnum = ppsybinfo.getDynamicObject("shjh_division").getString("number");
mapkey = sybnum+months+accountnum;
if(acctamountMap.containsKey(mapkey)){
acctamountMap.put(mapkey, JhzjUtils.addTwoAmount(amount,acctamountMap.get(mapkey)));
}else{
acctamountMap.put(mapkey,amount);
}
mapkey = months+accountnum;
amount = sapresult.getBigDecimal("DMBTR");//已清金额
if(acctamountMap.containsKey(mapkey)){
acctamountMap.put(mapkey, JhzjUtils.addTwoAmount(amount,acctamountMap.get(mapkey)));
}else{
//TODO 如果品牌没有对应的事业部时数据放哪里
logger.info("根据SAP的品牌编号未找到对应的品牌和事业部关系"+productnum);
acctamountMap.put(mapkey,amount);
}
//根据品牌和事业部关系将该笔金额归属到事业部上
// ppsybinfo = BusinessDataServiceHelper.loadSingleFromCache(ppsybName,new QFilter[]{new QFilter("shjh_productgroup.number", QCP.equals, productnum)});
// if(ppsybinfo != null){
// sybnum = ppsybinfo.getDynamicObject("shjh_division").getString("number");
// mapkey = sybnum+months+accountnum;
// if(acctamountMap.containsKey(mapkey)){
// acctamountMap.put(mapkey, JhzjUtils.addTwoAmount(amount,acctamountMap.get(mapkey)));
// }else{
// acctamountMap.put(mapkey,amount);
// }
// }else{
// //如果品牌没有对应的事业部时数据放哪里
// logger.info("根据SAP的品牌编号未找到对应的品牌和事业部关系"+productnum);
// }
}
return acctamountMap;
}
@ -258,10 +269,7 @@ public class FundPlanCollectionTask extends AbstractTask implements Plugin {
if(customerinfo != null){
custinfofives = customerinfo.getDynamicObjectCollection("shjh_entry_five");
}
DynamicObjectCollection kmcolls;//科目集合
DynamicObjectCollection custfivecolls;//客户组5集合
DynamicObjectCollection custcolls;//包含客户的集合
DynamicObjectCollection nocustcolls;//不包含客户的集合
boolean kmbhFlag;
boolean custfiveFlag;
boolean custFlag;
@ -269,19 +277,9 @@ public class FundPlanCollectionTask extends AbstractTask implements Plugin {
DynamicObject account;
for (int i = 0; i < accounts.length; i++) {
account = BusinessDataServiceHelper.loadSingle(accounts[i].getPkValue(), payReceName);
kmbhFlag = false;
kmcolls = account.getDynamicObjectCollection("shjh_kjkm");//科目
if(kmcolls.isEmpty()){
//当前配置表没有配置科目即任何科目都可以匹配
kmbhFlag = true;
}else{
//科目上配置有参数需要判断与当前科目是否匹配
for (DynamicObject kminfo : kmcolls) {
if(kminfo.getDynamicObject("fbasedataid").getString("number").equals(kmbh)){
kmbhFlag = true;
break;
}
}
kmbhFlag = getDOInFlag(account,"shjh_kjkm",kmbh);//科目
if(!kmbhFlag){
continue;
}
custfiveFlag = false;
custfivecolls = account.getDynamicObjectCollection("shjh_khzw");//客户组5
@ -308,36 +306,17 @@ public class FundPlanCollectionTask extends AbstractTask implements Plugin {
}
}
}
custFlag = false;
custcolls = account.getDynamicObjectCollection("shjh_bhkh");//包含客户
if(custcolls.isEmpty()){
//当前配置表没有配置客户即任何客户都可以匹配
custFlag = true;
}else{
for (DynamicObject custinfo : custcolls) {
if(custinfo.getDynamicObject("fbasedataid").getString("number").equals(cust)){
custFlag = true;
break;
}
}
if(!custfiveFlag){
continue;
}
nocustcolls = account.getDynamicObjectCollection("shjh_bbhkh");//不包含客户
if(nocustcolls.isEmpty()){
//当前配置表没有配置客户即任何客户都可以匹配
nocustFlag = true;
}else{
nocustFlag = true;
for (DynamicObject nocustinfo : custcolls) {
if(nocustinfo.getDynamicObject("fbasedataid").getString("number").equals(cust)){
nocustFlag = false;
break;
}
}
custFlag = getDOInFlag(account,"shjh_bhkh",cust);//包含客户
if(!custFlag){
continue;
}
if(kmbhFlag && custfiveFlag && custFlag && nocustFlag){
//所有标记都满足则返回
nocustFlag = getDOOutFlag(account,"shjh_bbhkh",cust);//不包含客户
if(nocustFlag){
//最后一个标记满足条件则返回否则会继续循环
return account.getDynamicObject("shjh_membersubject").getString("number");
}
}
@ -350,6 +329,39 @@ public class FundPlanCollectionTask extends AbstractTask implements Plugin {
return null;
}
private boolean getDOInFlag(DynamicObject pzbinfo, String property, String sapvalue){
DynamicObjectCollection kmcolls = pzbinfo.getDynamicObjectCollection(property);//具体的属性可能是科目原因码客户供应商
if(kmcolls.isEmpty()){
//当前配置表没有配置property即任何property都可以匹配
return true;
}else{
//配置有参数需要判断与当前数据是否匹配
for (DynamicObject kminfo : kmcolls) {
if(kminfo.getDynamicObject("fbasedataid").getString("number").equals(sapvalue)){
return true;
}
}
}
return false;
}
//获取基础资料不包含情况下的标记
private boolean getDOOutFlag(DynamicObject pzbinfo, String property, String sapvalue){
DynamicObjectCollection kmcolls = pzbinfo.getDynamicObjectCollection(property);//具体的属性可能是科目原因码客户供应商
if(kmcolls.isEmpty()){
//当前配置表没有配置property即任何property都可以匹配
return true;
}else{
//配置有参数需要判断与当前参数是否匹配已匹配表示在排除范围内
for (DynamicObject kminfo : kmcolls) {
if(kminfo.getDynamicObject("fbasedataid").getString("number").equals(sapvalue)){
return false;
}
}
}
return true;
}
public void addFilterCondition(JSONArray IT_LIST, String field, String low, String high) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("FIELD", field); //字段名称

View File

@ -51,7 +51,8 @@ public class FundPlanPaymentTask extends AbstractTask implements Plugin {
if(collection.length > 0){
//调用SAP应付未清接口按照事业部月份计划科目汇总金额
Map<String, BigDecimal> acctamountMap = getSapAR();
if(acctamountMap == null){
if(acctamountMap == null || acctamountMap.isEmpty()){
logger.info("未获取到月份、计划科目汇总金额");
return;
}
ReportDataSDKService reportService = new ReportDataSDKService();//报表服务用于写入或者查询报表数据
@ -61,7 +62,7 @@ public class FundPlanPaymentTask extends AbstractTask implements Plugin {
String reportPeriodCode;//编报期间的编号
DynamicObject reportOrg;//编报主体对象
DynamicObject accountInfo;//资金计划科目
String sybnum;//事业部编号-编报主体的编号
String sybnum;//编报主体的编号
String months;//月份-科目编制分录中的期间编号
String accountnum;//资金计划科目编号
DynamicObjectCollection maindimentrys;
@ -90,6 +91,7 @@ public class FundPlanPaymentTask extends AbstractTask implements Plugin {
for(DynamicObject entryinfo : maindimentrys){
accountInfo = entryinfo.getDynamicObject("subjectmem");
if(!accountInfo.getBoolean("isleaf")){
//非叶子节点的数据不处理
continue;
}
accountnum = accountInfo.getString("number");
@ -103,7 +105,7 @@ public class FundPlanPaymentTask extends AbstractTask implements Plugin {
JSONObject mmInfo = new JSONObject();
//PLANREFERENCEAMT 计划参考值 ACTMAT 已执行额度
mmInfo.put("templateMetricType","PLANREFERENCEAMT");//度量值预置类型
mmInfo.put("amount",acctamountMap.get(sybnum+months+accountnum));//写入金额-从SAP接口中获取
mmInfo.put("amount",acctamountMap.get(months+accountnum));//写入金额-从SAP接口中获取
mmInfo.put("amountUnit","one");//金额单位 one元 thousand千元 ten_thousand 万元
mms.add(mmInfo);
itemInfo.put("metricMembers",mms);//度量值列表
@ -143,46 +145,53 @@ public class FundPlanPaymentTask extends AbstractTask implements Plugin {
List<DynamicObject> pzblist = getPzb();
if(pzblist.isEmpty()){
//配置表没有对应规则返回null
logger.info("配置表没有对应规则");
logger.info("付款申请单配置表没有对应规则");
return null;
}
JSONArray items = data.getJSONArray("IT_ITEM");
Map<String, BigDecimal> acctamountMap = new HashMap<>();
BigDecimal amount;//根据事业部编号+月份+资金计划科目编号汇总的金额
String deptnum;//部门编号
String sybnum;//事业部编号
BigDecimal amount;//根据事业部编号+月份+资金计划科目编号汇总的金额-最新修改为根据月份+资金计划科目编号
// String deptnum;//部门编号
// String sybnum;//事业部编号
String months;//月份
String accountnum;//资金计划科目编号
String mapkey;//事业部编号+月份+资金计划科目编号
DynamicObject ppsybinfo;//二级部门和事业部关系对象
// DynamicObject ppsybinfo;//二级部门和事业部关系对象
for (int i = 0; i < items.size(); i++) {
sapresult = items.getJSONObject(i);
sapresult.getString("BUKRS");//公司编号
months = sapresult.getString("FAEDT");//到期日
amount = sapresult.getBigDecimal("WRBTR");//未清金额
deptnum = sapresult.getString("ZREQ_DEPT");//二级部门,需求部门
// deptnum = sapresult.getString("ZREQ_DEPT");//二级部门,需求部门
if(JhzjUtils.isEmpty(months)){
logger.info("SAP到期日为空"+sapresult.toJSONString());
continue;
}
accountnum = xdMembersubjectNumber(pzblist, sapresult);
if(JhzjUtils.isEmpty(accountnum)){
logger.info("SAP应付凭证未找到对应资金科目"+sapresult.toJSONString());
continue;
}
months = JhzjUtils.getFundPeriodBySAPDate(months);
//根据二级部门和事业部关系将该笔金额归属到事业部上
ppsybinfo = BusinessDataServiceHelper.loadSingleFromCache(ppsybName,new QFilter[]{new QFilter("shjh_orgdept.number", QCP.equals, deptnum)});
if(ppsybinfo != null){
sybnum = ppsybinfo.getDynamicObject("shjh_division").getString("number");
mapkey = sybnum+months+accountnum;
if(acctamountMap.containsKey(mapkey)){
acctamountMap.put(mapkey, JhzjUtils.addTwoAmount(amount,acctamountMap.get(mapkey)));
}else{
acctamountMap.put(mapkey,amount);
}
mapkey = months+accountnum;
amount = sapresult.getBigDecimal("WRBTR");//未清金额
if(acctamountMap.containsKey(mapkey)){
acctamountMap.put(mapkey, JhzjUtils.addTwoAmount(amount,acctamountMap.get(mapkey)));
}else{
//TODO 如果二级部门没有对应的事业部时数据放哪里
logger.info("根据SAP的二级部门编号未找到对应的二级部门和事业部关系"+deptnum);
acctamountMap.put(mapkey,amount);
}
//根据二级部门和事业部关系将该笔金额归属到事业部上
// ppsybinfo = BusinessDataServiceHelper.loadSingleFromCache(ppsybName,new QFilter[]{new QFilter("shjh_orgdept.number", QCP.equals, deptnum)});
// if(ppsybinfo != null){
// sybnum = ppsybinfo.getDynamicObject("shjh_division").getString("number");
// mapkey = sybnum+months+accountnum;
// if(acctamountMap.containsKey(mapkey)){
// acctamountMap.put(mapkey, JhzjUtils.addTwoAmount(amount,acctamountMap.get(mapkey)));
// }else{
// acctamountMap.put(mapkey,amount);
// }
// }else{
// //如果二级部门没有对应的事业部时数据放哪里
// logger.info("根据SAP的二级部门编号未找到对应的二级部门和事业部关系"+deptnum);
// }
}
return acctamountMap;
}
@ -283,8 +292,8 @@ public class FundPlanPaymentTask extends AbstractTask implements Plugin {
boolean yymFlag;
boolean kmbhFlag;
boolean orgFlag;
boolean bizbigFlag;
boolean bizsmallFlag;
// boolean bizbigFlag;
// boolean bizsmallFlag;
boolean notorgFlag;
boolean suppFlag;
boolean notsuppFlag;
@ -292,43 +301,44 @@ public class FundPlanPaymentTask extends AbstractTask implements Plugin {
String kdbilltype;
boolean billTypeFlag;
boolean notbillTypeFlag;
boolean purGroupFlag;
boolean notpurGroupFlag;
for (int i = 0; i < pzblist.size(); i++) {
pzbinfo = pzblist.get(i);
yymFlag = getDOInFlag(pzbinfo,"shjh_yym",sapresult.getString(""));//原因码
yymFlag = getDOInFlag(pzbinfo,"shjh_yym",sapresult.getString("RSTGR"));//原因码
if(!yymFlag){
continue;
}
kmbhFlag = getDOInFlag(pzbinfo,"shjh_kjkm",sapresult.getString(""));//会计科目
kmbhFlag = getDOInFlag(pzbinfo,"shjh_kjkm",sapresult.getString("SAKNR"));//会计科目
if(!kmbhFlag){
continue;
}
orgFlag = getDOInFlag(pzbinfo,"shjh_companys",sapresult.getString(""));//公司范围
orgFlag = getDOInFlag(pzbinfo,"shjh_companys",sapresult.getString("BUKRS"));//包含公司范围
if(!orgFlag){
continue;
}
suppFlag = getDOInFlag(pzbinfo,"shjh_supplier",sapresult.getString(""));//包含供应商
if(!suppFlag){
continue;
}
bizbigFlag = getDOInFlag(pzbinfo,"shjh_bizbig",sapresult.getString(""));//业务大类
if(!bizbigFlag){
continue;
}
bizsmallFlag = getDOInFlag(pzbinfo,"shjh_bizsmall",sapresult.getString(""));//业务小类
if(!bizsmallFlag){
continue;
}
notsuppFlag = getDOOutFlag(pzbinfo,"shjh_bbhgys",sapresult.getString(""));//不包含供应商
if(!notsuppFlag){
continue;
}
notorgFlag = getDOOutFlag(pzbinfo,"shjh_bbhzz",sapresult.getString(""));//不包含公司
notorgFlag = getDOOutFlag(pzbinfo,"shjh_bbhzz",sapresult.getString("BUKRS"));//不包含公司范围
if(!notorgFlag){
continue;
}
suppFlag = getDOInFlag(pzbinfo,"shjh_supplier",sapresult.getString("LIFNR"));//包含供应商
if(!suppFlag){
continue;
}
notsuppFlag = getDOOutFlag(pzbinfo,"shjh_bbhgys",sapresult.getString("LIFNR"));//不包含供应商
if(!notsuppFlag){
continue;
}
// bizbigFlag = getDOInFlag(pzbinfo,"shjh_bizbig",sapresult.getString(""));//业务大类
// if(!bizbigFlag){
// continue;
// }
// bizsmallFlag = getDOInFlag(pzbinfo,"shjh_bizsmall",sapresult.getString(""));//业务小类
// if(!bizsmallFlag){
// continue;
// }
// getBooleanFlag(pzbinfo,"shjh_czl",sapresult.getString(""));//是否充值类
// getBooleanFlag(pzbinfo,"shjh_zxcg",sapresult.getString(""));//是否自行采购
// getBooleanFlag(pzbinfo,"shjh_zxcg",sapresult.getString("ZZXCG_FLAG"));//是否自行采购
// getBooleanFlag(pzbinfo,"shjh_poisnull",sapresult.getString(""));//PO号是否为空
sapbillno = sapresult.getString("XBLNR");//sap单据号
kdbilltype = JhzjUtils.getBillTypeForSAP(sapbillno);//根据sap单据号获取对应的金蝶单据类型
@ -340,6 +350,17 @@ public class FundPlanPaymentTask extends AbstractTask implements Plugin {
if(!notbillTypeFlag){
continue;
}
purGroupFlag = getDOInFlag(pzbinfo,"shjh_cgz",sapresult.getString("EKGRP"));//包含采购组
if(!purGroupFlag){
continue;
}
notpurGroupFlag = getDOInFlag(pzbinfo,"shjh_bbhcgz",sapresult.getString("EKGRP"));//不包含采购组
if(notpurGroupFlag){
//最后一个标记满足条件则返回否则会继续循环
return pzbinfo.getDynamicObject("shjh_membersubject").getString("number");
}
}
return null;