dobe_comic8/main/java/shkd/repc/task/DobeDWaccountTask.java

185 lines
10 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package shkd.repc.task;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import kd.bos.context.RequestContext;
import kd.bos.dataentity.OperateOption;
import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.dataentity.entity.DynamicObjectCollection;
import kd.bos.exception.KDException;
import kd.bos.id.ID;
import kd.bos.logging.Log;
import kd.bos.logging.LogFactory;
import kd.bos.orm.query.QFilter;
import kd.bos.schedule.executor.AbstractTask;
import kd.bos.servicehelper.BusinessDataServiceHelper;
import kd.bos.servicehelper.QueryServiceHelper;
import kd.bos.servicehelper.operation.OperationServiceHelper;
import kd.bos.servicehelper.operation.SaveServiceHelper;
import kd.sdk.plugin.Plugin;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import shkd.utils.DobeDWUtils;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
/**
* 后台任务插件
*/
public class DobeDWaccountTask extends AbstractTask implements Plugin {
private static final Log logger = LogFactory.getLog(DobeDWaccountTask.class);
private static final String entityName = "recos_stdcostaccount";//标准成本科目实体 供应链库 表名 t_recos_scostaccount
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 projectEntity = "repmd_projectbill";//项目实体 表名 t_repmd_projectbill
@Override
public void execute(RequestContext requestContext, Map<String, Object> map) throws KDException {
//调用数仓查询接口
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url(DobeDWUtils.dwUrl+dw_menthod)
.post(DobeDWUtils.createRequestBody("account",1))
.header("Content-Type", "application/json")
.header("Authorization", DobeDWUtils.appCode)
.build();
String resultData;
try {
Response response = client.newCall(request).execute();
resultData = response.body().string();
logger.info("成本科目接口返回结果:\n{}", resultData);
} catch (IOException e) {
logger.info(String.format("成本科目接口异常:%s", e.getMessage()));
throw new RuntimeException(e);
}
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查询总数据量
//根据id查找标准成本科目的表头信息
long bzkmid;
String accountId = requestContext.getAccountId();//获取账套ID
if("2008012388581769216".equals(accountId)){
bzkmid = 2012525353133704192L;//测试id
}else{
bzkmid = 2037039962179791872L;//正式id
}
logger.info("accountId "+accountId);
DynamicObject billinfo = BusinessDataServiceHelper.loadSingle(entityName,new QFilter[]{new QFilter("id","=",bzkmid)});
if(billinfo == null){
//根据标准科目id未找到对应记录
DobeDWUtils.saveLog(bzkmid+"","数仓成本科目同步","","根据标准科目ID未找到对应记录"+bzkmid,false,"定时任务");
return;
}
// String acctid = null;//成本科目数仓id
String number;//成本科目编号
String name;//成本科名称
// String ciaccountflag = null; //科目类别 非建安科目and建安科目
// String apportionway = null;
// String taxrate = null;
String kjkm_num;//会计科目编号
String kjkm_name;//会计科目名称
String parentnumber;//成本科目父级编号
DynamicObject acctinfo;//成本科目对象
DynamicObject parentAcctinfo;//父级成本科目对象
DynamicObject acctViewinfo;//会计科目对象
Map<String,DynamicObject> parentAccts = new HashMap<>();//现有成本科目集合
Map<String,DynamicObject> acctViewMap = new HashMap<>();//会计科目缓存
JSONArray detailsJson = json_body.getJSONArray("data");
DynamicObjectCollection doDetails = billinfo.getDynamicObjectCollection("costaccountentry");//标准科目分录数据
for (int i = 0; i < doDetails.size(); i++) {
acctinfo = doDetails.get(i);
//以数仓科目id作为key科目对象为value
// parentAccts.put(acctinfo.getString("caentry_srcid"),acctinfo);
if(acctinfo.getBoolean("caentry_enable")){
//只加载已启用的科目
parentAccts.put(acctinfo.getString("caentry_number"),acctinfo);
}
}
//循环入参,判断哪些科目该修改,哪些该新增
for (int i = 0; i < detailsJson.size(); i++) {
json_body = detailsJson.getJSONObject(i);
// acctid = json_body.getString("costsubject_id");//科目id
number = json_body.getString("costsubject_code");//科目编号
name = json_body.getString("costsubject_name");//科目名称
kjkm_num = json_body.getString("accsubject_code");//会计科目编码
kjkm_name = json_body.getString("accsubject_name");//会计科目名称
// ciaccountflag = json_body.getString("ciaccountflag");//科目类别 非建安科目and建安科目
// apportionway = json_body.getString("apportionway");//分摊方式
// taxrate = json_body.getString("taxrate");//税率
parentnumber = json_body.getString("costsubject_pcode");//科目父级code
if(DobeDWUtils.isEmpty(number) || DobeDWUtils.isEmpty(name) || DobeDWUtils.isEmpty(parentnumber)){
//根节点数仓不体现,故,所有科目都会有父级科目编号,没有的不处理
logger.info(String.format("成本科目入参为空异常:%s", json_body.toJSONString()));
continue;
}
//先从现有科目集合中获取,未获取到则新增
acctinfo = parentAccts.get(number);
if(acctinfo == null){
acctinfo = doDetails.addNew();
// acctinfo.set("caentry_srcid", number);//源ID 用于存储数仓的科目id
// acctinfo.set("caentry_project", projectinfo.getLong("id"));//项目
acctinfo.set("caentry_enable", true);//默认 启用
acctinfo.set("caentry_isstdaccount", true);//是否标准科目
acctinfo.set("caentry_standlibflag", true);//是否标准科目库
acctinfo.set("caentry_isleaf", true);//是否叶子节点新增默认为true
acctinfo.set("caentry_ciaccountflag", "1");//科目类别 建安 1 非建安 0 默认都是建安类
//新增时指定一个ID防止父级和子级都创建的情况下子级拿不到父级id而报错
acctinfo.set("id", ID.genLongId());
// acctinfo.set("caentry_longnumber", number);//科目长编号
// acctinfo.set("caentry_fullname", name);//科目长名称
//将此次新增的科目放到现有科目集合中,方便后续科目能获取到父级科目
parentAccts.put(number,acctinfo);
}
//已存在,做更新 编号、名称、长编号、名称、科目类别等
acctinfo.set("caentry_number", number);
acctinfo.set("caentry_name", name);
// acctinfo.set("caentry_apportionway", null);//分摊方式 基础资料
// acctinfo.set("caentry_taxrate", taxrate);//税率
//创建组织 caentry_createorg
//组织 caentry_org
//业务组织 caentry_useorg
//处理父级科目
parentAcctinfo = parentAccts.get(parentnumber);
if(parentAcctinfo != null){
acctinfo.set("pid", parentAcctinfo.getLong("id"));//设置父级科目
//如果数仓不指定长编码和长名称,则需要在此处手动处理
acctinfo.set("caentry_longnumber", parentAcctinfo.getString("caentry_longnumber")+"."+number);
acctinfo.set("caentry_fullname", parentAcctinfo.getString("caentry_fullname")+"_"+name);
//科目级次=父级科目级次+1
acctinfo.set("caentry_level", parentAcctinfo.getInt("caentry_level")+1);
//父级科目的是否叶子节点为否
parentAcctinfo.set("caentry_isleaf", false);//是否叶子节点为否
}else{
logger.info("根据父级科目编号未找到对应科目"+parentnumber);
}
//设置对应会计科目字段id
if(!DobeDWUtils.isEmpty(kjkm_num)){
acctViewinfo = acctViewMap.get(kjkm_num);
if(acctViewinfo == null){
acctViewinfo = QueryServiceHelper.queryOne(acctViewEntity,"id,number,longnumber",new QFilter[]{new QFilter("longnumber","=",kjkm_num)});
}
if(acctViewinfo == null){
DobeDWUtils.saveLog(number,"数仓科目同步",json_body.toString(),kjkm_num+" 会计科目在金蝶中找不到:"+kjkm_name,false,"定时任务");
}else{
acctViewMap.put(kjkm_num,acctViewinfo);
acctinfo.set("caentry_account",acctViewinfo.getLong("id"));
}
}
}
// SaveServiceHelper.save(new DynamicObject[]{billinfo});
//调用保存操作
OperationServiceHelper.executeOperate("save",entityName,new DynamicObject[]{billinfo}, OperateOption.create());
}
}