科目接口优化

This commit is contained in:
yuxueliang0813 2025-04-24 16:56:40 +08:00
parent 296faf0ad9
commit 5f7ea89952
1 changed files with 60 additions and 78 deletions

View File

@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import kd.bos.context.RequestContext; import kd.bos.context.RequestContext;
import kd.bos.dataentity.OperateOption;
import kd.bos.dataentity.entity.DynamicObject; import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.dataentity.entity.DynamicObjectCollection; import kd.bos.dataentity.entity.DynamicObjectCollection;
import kd.bos.exception.KDException; import kd.bos.exception.KDException;
@ -13,6 +14,7 @@ import kd.bos.orm.query.QFilter;
import kd.bos.schedule.executor.AbstractTask; import kd.bos.schedule.executor.AbstractTask;
import kd.bos.servicehelper.BusinessDataServiceHelper; import kd.bos.servicehelper.BusinessDataServiceHelper;
import kd.bos.servicehelper.QueryServiceHelper; import kd.bos.servicehelper.QueryServiceHelper;
import kd.bos.servicehelper.operation.OperationServiceHelper;
import kd.bos.servicehelper.operation.SaveServiceHelper; import kd.bos.servicehelper.operation.SaveServiceHelper;
import kd.sdk.plugin.Plugin; import kd.sdk.plugin.Plugin;
import okhttp3.OkHttpClient; import okhttp3.OkHttpClient;
@ -29,12 +31,13 @@ import java.util.Map;
*/ */
public class DobeDWaccountTask extends AbstractTask implements Plugin { public class DobeDWaccountTask extends AbstractTask implements Plugin {
private static Log log = LogFactory.getLog(DobeDWaccountTask.class); private static final Log logger = LogFactory.getLog(DobeDWaccountTask.class);
private static final String entityName = "recos_stdcostaccount";//标准成本科目实体 供应链库 表名 t_recos_scostaccount private static final String entityName = "recos_stdcostaccount";//标准成本科目实体 供应链库 表名 t_recos_scostaccount
private static final String acctViewEntity = "bd_accountview";//会计科目实体 财务库 表名 T_BD_Account private static final String acctViewEntity = "bd_accountview";//会计科目实体 财务库 表名 T_BD_Account
private static final String dw_menthod = "mdm_costsubject";
// private static final String accEntity = "costaccountentry";//科目分录实体 供应链库 表名 t_recos_costaccount // private static final String accEntity = "costaccountentry";//科目分录实体 供应链库 表名 t_recos_costaccount
// private static final String projectEntity = "repmd_projectbill";//项目实体 表名 t_repmd_projectbill // private static final String projectEntity = "repmd_projectbill";//项目实体 表名 t_repmd_projectbill
private static final String dw_menthod = "mdm_costsubject";
@Override @Override
public void execute(RequestContext requestContext, Map<String, Object> map) throws KDException { public void execute(RequestContext requestContext, Map<String, Object> map) throws KDException {
@ -46,140 +49,118 @@ public class DobeDWaccountTask extends AbstractTask implements Plugin {
.header("Authorization", DobeDWUtils.appCode) .header("Authorization", DobeDWUtils.appCode)
.build(); .build();
String resultData = null; String resultData;
try { try {
Response response = client.newCall(request).execute(); Response response = client.newCall(request).execute();
resultData = response.body().string(); resultData = response.body().string();
log.info("成本科目接口返回结果:\n{}", resultData); logger.info("成本科目接口返回结果:\n{}", resultData);
} catch (IOException e) { } catch (IOException e) {
log.info(String.format("成本科目接口异常:%s", e.getMessage())); logger.info(String.format("成本科目接口异常:%s", e.getMessage()));
throw new RuntimeException(e); throw new RuntimeException(e);
} }
JSONObject json_body = JSON.parseObject(resultData); JSONObject json_body = JSON.parseObject(resultData);
//定时任务获取的参数和参数值是配置调度程序和作业的时候设置根据参数值保存从数仓获取到的完整json
if(map != null && "yes".equals(map.get("savedwjson"))){
DobeDWUtils.saveLog("savedwjson1","科目接口",resultData,null,true,"定时任务");
}
//接口返回的数据进行了分页 //接口返回的数据进行了分页
// int totalNum = json_body.getIntValue("totalNum");//分页-SQL查询总数据量 // int totalNum = json_body.getIntValue("totalNum");//分页-SQL查询总数据量
//解析接口返回值与系统数据比较
// String projectnumber = json_body.getString("projectnumber");
// DynamicObject projectinfo = QueryServiceHelper.queryOne(projectEntity,"id,billno",new QFilter[]{new QFilter("billno","=",projectnumber)});
// if(projectinfo == null){
// log.info(String.format("成本科目接口异常未根据项目编号找到对应项目:%s", projectnumber));
// return;
// }
//根据id查找标准成本科目的表头信息 //根据id查找标准成本科目的表头信息
long bzkmid = 2012525353133704192l;//测试id long bzkmid;
// long bzkmid = 2037039962179791872l;//正式id String accountId = requestContext.getAccountId();//获取账套ID
if("2008012388581769216".equals(accountId)){
bzkmid = 2012525353133704192L;//测试id
}else{
bzkmid = 2037039962179791872L;//正式id
}
DynamicObject billinfo = BusinessDataServiceHelper.loadSingle(entityName,new QFilter[]{new QFilter("id","=",bzkmid)}); DynamicObject billinfo = BusinessDataServiceHelper.loadSingle(entityName,new QFilter[]{new QFilter("id","=",bzkmid)});
if(billinfo == null){ if(billinfo == null){
//根据标准科目id未找到对应记录 //根据标准科目id未找到对应记录
DobeDWUtils.saveLog(bzkmid+"","数仓成本科目同步","","根据标准科目ID未找到对应记录"+bzkmid,false,"定时任务"); DobeDWUtils.saveLog(bzkmid+"","数仓成本科目同步","","根据标准科目ID未找到对应记录"+bzkmid,false,"定时任务");
return; return;
} }
String acctid = null; // String acctid = null;//成本科目数仓id
String number = null; String number;//成本科目编号
String name = null; String name;//成本科名称
// String longnumber = null; // String ciaccountflag = null; //科目类别 非建安科目and建安科目
// String longname = null;
// String ciaccountflag = null;
// String apportionway = null; // String apportionway = null;
// String taxrate = null; // String taxrate = null;
// String isleaf = null; String kjkm_num;//会计科目编号
String kjkm_num = null; String kjkm_name;//会计科目名称
String kjkm_name = null; String parentnumber;//成本科目父级编号
String parentid = null; DynamicObject acctinfo;//成本科目对象
DynamicObject acctinfo = null; DynamicObject parentAcctinfo;//父级成本科目对象
// DynamicObject mapAcctinfo = null; DynamicObject acctViewinfo;//会计科目对象
DynamicObject acctViewinfo = null;
Map<String,DynamicObject> parentAccts = new HashMap<>();//现有成本科目集合 Map<String,DynamicObject> parentAccts = new HashMap<>();//现有成本科目集合
// Map<String,DynamicObject> mappingAccts = new HashMap<>();//现有成本科目映射集合
Map<String,DynamicObject> acctViewMap = new HashMap<>();//会计科目缓存 Map<String,DynamicObject> acctViewMap = new HashMap<>();//会计科目缓存
JSONArray detailsJson = json_body.getJSONArray("data"); JSONArray detailsJson = json_body.getJSONArray("data");
DynamicObjectCollection doDetails = billinfo.getDynamicObjectCollection("costaccountentry"); DynamicObjectCollection doDetails = billinfo.getDynamicObjectCollection("costaccountentry");//标准科目分录数据
for (int i = 0; i < doDetails.size(); i++) { for (int i = 0; i < doDetails.size(); i++) {
acctinfo = doDetails.get(i); acctinfo = doDetails.get(i);
//以数仓科目id作为key科目对象为value //以数仓科目id作为key科目对象为value
parentAccts.put(acctinfo.getString("caentry_srcid"),acctinfo); // parentAccts.put(acctinfo.getString("caentry_srcid"),acctinfo);
if(acctinfo.getBoolean("caentry_enable")){
//只加载已启用的科目
parentAccts.put(acctinfo.getString("caentry_number"),acctinfo);
}
} }
// DynamicObjectCollection mapDetails = billinfo.getDynamicObjectCollection("accountmapentry");
// for (int i = 0; i < mapDetails.size(); i++) {
// mapAcctinfo = mapDetails.get(i);
// //以成本科目长编码作为key映射对象为value
// mappingAccts.put(mapAcctinfo.getString("amentry_longnumber"),mapAcctinfo);
// }
//循环入参判断哪些科目该修改哪些该新增 //循环入参判断哪些科目该修改哪些该新增
for (int i = 0; i < detailsJson.size(); i++) { for (int i = 0; i < detailsJson.size(); i++) {
json_body = detailsJson.getJSONObject(i); json_body = detailsJson.getJSONObject(i);
acctid = json_body.getString("costsubject_id");//科目id // acctid = json_body.getString("costsubject_id");//科目id
number = json_body.getString("costsubject_code");//科目编号 number = json_body.getString("costsubject_code");//科目编号
name = json_body.getString("costsubject_name");//科目名称 name = json_body.getString("costsubject_name");//科目名称
kjkm_num = json_body.getString("accsubject_code");//会计科目编码 kjkm_num = json_body.getString("accsubject_code");//会计科目编码
kjkm_name = json_body.getString("accsubject_name");//会计科目名称 kjkm_name = json_body.getString("accsubject_name");//会计科目名称
// longnumber = json_body.getString("longnumber");//科目长编号
// longname = json_body.getString("longname");//科目长名称
// ciaccountflag = json_body.getString("ciaccountflag");//科目类别 非建安科目and建安科目 // ciaccountflag = json_body.getString("ciaccountflag");//科目类别 非建安科目and建安科目
// apportionway = json_body.getString("apportionway");//分摊方式 // apportionway = json_body.getString("apportionway");//分摊方式
// taxrate = json_body.getString("taxrate");//税率 // taxrate = json_body.getString("taxrate");//税率
// isleaf = json_body.getString("isleaf");//是否叶子节点 parentnumber = json_body.getString("costsubject_pcode");//科目父级code
// level = json_body.getString("level");//科目级次 if(DobeDWUtils.isEmpty(number) || DobeDWUtils.isEmpty(name) || DobeDWUtils.isEmpty(parentnumber)){
parentid = json_body.getString("costsubject_pcode");//科目父级code //根节点数仓不体现所有科目都会有父级科目编号没有的不处理
if(DobeDWUtils.isEmpty(number) || DobeDWUtils.isEmpty(name) || DobeDWUtils.isEmpty(acctid)){ logger.info(String.format("成本科目入参为空异常:%s", json_body.toJSONString()));
//如果组织ID和组织编码 名称是空的则跳过此记录
log.info(String.format("成本科目入参为空异常:%s", json_body.toJSONString()));
continue; continue;
} }
// else if(Integer.parseInt(level) >= 2 && DobeDWUtils.isEmpty(parentid)){
// log.info(String.format("成本科目级次大于等于2但是无对应的父级科目ID%s", json_body.toJSONString()));
// continue;
// }
//先从现有科目集合中获取未获取到则新增 //先从现有科目集合中获取未获取到则新增
acctinfo = parentAccts.get(acctid); acctinfo = parentAccts.get(number);
if(acctinfo == null){ if(acctinfo == null){
acctinfo = doDetails.addNew(); acctinfo = doDetails.addNew();
acctinfo.set("caentry_srcid", acctid);//源ID 用于存储数仓的科目id // acctinfo.set("caentry_srcid", number);//源ID 用于存储数仓的科目id
// acctinfo.set("caentry_project", projectinfo.getLong("id"));//项目 // acctinfo.set("caentry_project", projectinfo.getLong("id"));//项目
acctinfo.set("caentry_enable", true);//默认 启用 acctinfo.set("caentry_enable", true);//默认 启用
acctinfo.set("caentry_isstdaccount", true);//是否标准科目 acctinfo.set("caentry_isstdaccount", true);//是否标准科目
acctinfo.set("caentry_standlibflag", true);//是否标准科目库 acctinfo.set("caentry_standlibflag", true);//是否标准科目库
acctinfo.set("caentry_isleaf", "1");//是否叶子节点新增默认为true acctinfo.set("caentry_isleaf", true);//是否叶子节点新增默认为true
acctinfo.set("caentry_longnumber", number);//科目长编号 acctinfo.set("caentry_ciaccountflag", "1");//科目类别 建安 1 非建安 0 默认都是建安类
acctinfo.set("caentry_fullname", name);//科目长名称 // acctinfo.set("caentry_longnumber", number);//科目长编号
// acctinfo.set("caentry_fullname", name);//科目长名称
//将此次新增的科目放到现有科目集合中方便后续科目能获取到父级科目 //将此次新增的科目放到现有科目集合中方便后续科目能获取到父级科目
parentAccts.put(number,acctinfo); parentAccts.put(number,acctinfo);
} }
//已存在做更新 编号名称长编号名称科目类别等 //已存在做更新 编号名称长编号名称科目类别等
acctinfo.set("caentry_number", number); acctinfo.set("caentry_number", number);
acctinfo.set("caentry_name", name); acctinfo.set("caentry_name", name);
acctinfo.set("caentry_ciaccountflag", "1");//科目类别 建安 1 非建安 0 默认都是建安类
// acctinfo.set("caentry_apportionway", null);//分摊方式 基础资料 // acctinfo.set("caentry_apportionway", null);//分摊方式 基础资料
// acctinfo.set("caentry_taxrate", taxrate);//税率 // acctinfo.set("caentry_taxrate", taxrate);//税率
//创建组织 caentry_createorg //创建组织 caentry_createorg
//组织 caentry_org //组织 caentry_org
//业务组织 caentry_useorg //业务组织 caentry_useorg
//处理父级科目 //处理父级科目
if(parentAccts.get(parentid) != null){ parentAcctinfo = parentAccts.get(parentnumber);
acctinfo.set("pid", parentAccts.get(parentid).getLong("id"));//设置父级科目 if(parentAcctinfo != null){
acctinfo.set("pid", parentAcctinfo.getLong("id"));//设置父级科目
//如果数仓不指定长编码和长名称则需要在此处手动处理 //如果数仓不指定长编码和长名称则需要在此处手动处理
acctinfo.set("caentry_longnumber", parentAccts.get(parentid).getString("caentry_longnumber")+"."+number); acctinfo.set("caentry_longnumber", parentAcctinfo.getString("caentry_longnumber")+"."+number);
acctinfo.set("caentry_fullname", parentAccts.get(parentid).getString("caentry_fullname")+"_"+name); acctinfo.set("caentry_fullname", parentAcctinfo.getString("caentry_fullname")+"_"+name);
//科目级次=父级科目级次+1 //科目级次=父级科目级次+1
acctinfo.set("caentry_level", parentAccts.get(parentid).getInt("caentry_level")+1); acctinfo.set("caentry_level", parentAcctinfo.getInt("caentry_level")+1);
//父级科目的是否叶子节点为否 //父级科目的是否叶子节点为否
parentAccts.get(parentid).set("caentry_isleaf", "0");//是否叶子节点 parentAcctinfo.set("caentry_isleaf", false);//是否叶子节点为否
}else{ }else{
//没有父节点的是根节点级次是1 logger.info("根据父级科目编号未找到对应科目"+parentnumber);
acctinfo.set("caentry_level", 1);
} }
//处理成本科目与会计科目的映射关系--该关系并不是有个分表来存储如下代码注释
// mapAcctinfo = mappingAccts.get(acctinfo.getString("caentry_longnumber"));
// if(mapAcctinfo == null){
// //根据科目长编码未找到对应映射关系则新增一个映射关系
// mapAcctinfo = mapDetails.addNew();
// mapAcctinfo.set("amentry_longnumber",acctinfo.getString("caentry_longnumber"));//科目长编码
// mapAcctinfo.set("amentry_name",name);//科目名称
// mapAcctinfo.set("amentry_isleaf",acctinfo.getString("caentry_isleaf"));//是否叶子
// mapAcctinfo.set("amentry_ciaccountflag","1");//科目类别 建安 1 非建安 0 默认都是建安类
// mapAcctinfo.set("amentry_enable",true);//是否启用 默认启用
// mapAcctinfo.set("amentry_level",acctinfo.getInt("caentry_level"));//级次
// }
//设置对应会计科目字段id //设置对应会计科目字段id
if(!DobeDWUtils.isEmpty(kjkm_num)){ if(!DobeDWUtils.isEmpty(kjkm_num)){
acctViewinfo = acctViewMap.get(kjkm_num); acctViewinfo = acctViewMap.get(kjkm_num);
@ -187,14 +168,15 @@ public class DobeDWaccountTask extends AbstractTask implements Plugin {
acctViewinfo = QueryServiceHelper.queryOne(acctViewEntity,"id,number,longnumber",new QFilter[]{new QFilter("longnumber","=",kjkm_num)}); acctViewinfo = QueryServiceHelper.queryOne(acctViewEntity,"id,number,longnumber",new QFilter[]{new QFilter("longnumber","=",kjkm_num)});
} }
if(acctViewinfo == null){ if(acctViewinfo == null){
DobeDWUtils.saveLog(acctinfo.getString("caentry_longnumber"),"数仓项目同步",json_body.toString(),"会计科目在金蝶中找不到:"+kjkm_num+kjkm_name,false,"定时任务"); DobeDWUtils.saveLog(number,"数仓科目同步",json_body.toString(),kjkm_num+" 会计科目在金蝶中找不到:"+kjkm_name,false,"定时任务");
}else{ }else{
acctViewMap.put(kjkm_num,acctViewinfo); acctViewMap.put(kjkm_num,acctViewinfo);
// mapAcctinfo.set("amentry_account",acctViewinfo.getLong("id"));
acctinfo.set("caentry_account",acctViewinfo.getLong("id")); acctinfo.set("caentry_account",acctViewinfo.getLong("id"));
} }
} }
} }
SaveServiceHelper.save(new DynamicObject[]{billinfo}); // SaveServiceHelper.save(new DynamicObject[]{billinfo});
//调用保存操作
OperationServiceHelper.executeOperate("save",entityName,new DynamicObject[]{billinfo}, OperateOption.create());
} }
} }