package shkd.bamp.base.task; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.util.TypeUtils; import kd.bos.context.RequestContext; import kd.bos.dataentity.OperateOption; import kd.bos.dataentity.entity.DynamicObject; 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.operation.OperationServiceHelper; import kd.bos.servicehelper.operation.SaveServiceHelper; import kd.sdk.plugin.Plugin; import shkd.utils.DobeDWUtils; import java.util.Date; import java.util.Map; public class DobeDWaccountViewTask extends AbstractTask implements Plugin { private static final String entityName = "bd_accountview";//会计科目实体 财务库 表名 T_BD_Account // private static final String acctTableName = "bd_accounttable";//科目表 private static final String acctTypeName = "bd_accounttype";//科目类型 private static final String hswdName = "bd_asstacttype";//核算维度 private static final String orgName = "bos_org";//业务单元 private static Log log = LogFactory.getLog(DobeDWaccountViewTask.class); private static final String dw_menthod = "mdm_arog"; @Override public void execute(RequestContext requestContext, Map map) throws KDException { JSONObject json_body = new JSONObject(); json_body.put("totalNum","1"); JSONObject json_detail = new JSONObject(); json_detail.put("number","5404"); json_detail.put("name","战略渠道支出2"); json_detail.put("hsorgid","dobe"); json_detail.put("acctType","05"); json_detail.put("sytype","非损益类科目"); json_detail.put("yefx","1"); json_detail.put("acctsx",""); json_detail.put("hswd","0005"); json_detail.put("bbhs","nocurrency"); json_detail.put("parentNumber",""); json_detail.put("isleaf","true"); json_detail.put("level","1"); JSONArray array = new JSONArray(); array.add(json_detail); json_body.put("data",array); handleAccount(json_body); } private void handleAccount(JSONObject json_body) { //解析接口返回值,与系统数据比较 JSONArray detailsJson = json_body.getJSONArray("data"); String number = null;//科目编号 String name = null;//科目名称 String hsorgid = null;//所属核算组织 // String dwid = null;//数仓会计科目id String isleaf = null;//是否叶子节点 String level = null;//层级 String acctType = null;//科目类型 资产 负债 成本 损益 共同 String sytype = null;//损益类型 String yefx = null;//余额方向 借1 贷-1 String acctsx = null;//科目金额类属性 现金、银行、现金等价物 String hswd = null;//核算维度 基础资料 String bbhs = null;//币别核算 不核算外币 核算所有外币 指定核算币别(需要指定币别ISO) String parentNumber = null;//父级科目编号 DynamicObject hsorgInfo = null; DynamicObject acctInfo = null; DynamicObject acctTypeInfo = null; DynamicObject parentAcctInfo = null; DynamicObject hswdInfo = null; DynamicObject checkitementryInfo = null; for (int i = 0; i < detailsJson.size(); i++) { json_body = detailsJson.getJSONObject(i); number = json_body.getString("number"); name = json_body.getString("name"); hsorgid = json_body.getString("hsorgid"); acctType = json_body.getString("acctType"); sytype = json_body.getString("sytype"); hswd = json_body.getString("hswd"); bbhs = json_body.getString("bbhs"); level = json_body.getString("level"); isleaf = json_body.getString("isleaf"); yefx = json_body.getString("yefx"); if(DobeDWUtils.isEmpty(number) || DobeDWUtils.isEmpty(name) || DobeDWUtils.isEmpty(hsorgid)){ log.info(String.format("会计科目接口入参为空异常:%s", json_body.toJSONString())); continue; } //根据数仓id查找项目是否已存在 acctInfo = BusinessDataServiceHelper.loadSingle(entityName,new QFilter[]{new QFilter("number","=",number)}); if(acctInfo != null){ //处理科目更新逻辑,此时能修改哪些字段?币别核算 核算维度(扩大范围是可以的,调整了维度不建议使用) // acctInfo.set("accounttable", 1318154893474663424l);//科目表fid // acctInfo.set("level", Integer.valueOf(level));//级次 // acctInfo.set("enddate", TypeUtils.castToDate("2999-12-31")); // acctInfo.set("dc", yefx);//余额方向 // acctInfo.set("masterid", acctInfo.getString("id"));//主数据内码 // acctInfo.set("accrualdirection", "nocontrol");//科目录入方向控制 不控制nocontrol 借方debit 贷方credit // acctInfo.set("orgcontrollevel", Integer.valueOf(level));//控制级次 // acctInfo.set("isleaf", Boolean.valueOf(isleaf));//明细科目 // acctInfo.set("status", "C"); // acctInfo.set("ismanual", true); // acctInfo.set("isassist", true); // acctInfo.set("creator", 2010985207800271872L); // SaveServiceHelper.update(acctInfo); // OperationServiceHelper.executeOperate("submit",entityName,new DynamicObject[]{acctInfo}, OperateOption.create()); }else{ //不存在,做新增 根据实体名称创建动态对象 acctInfo = BusinessDataServiceHelper.newDynamicObject(entityName); acctInfo.set("accounttable", 1318154893474663424L);//科目表fid,上正式时,注意此ID acctInfo.set("number", number); acctInfo.set("name", name); if(!DobeDWUtils.isEmpty(parentNumber)){ //父级科目编号不为空,则还原父级科目对象 parentAcctInfo = BusinessDataServiceHelper.loadSingleFromCache(entityName,new QFilter[]{new QFilter("number","=",parentNumber)}); if(parentAcctInfo != null){ acctInfo.set("longnumber", number); acctInfo.set("fullname", parentAcctInfo.getString("fullname")+"_"+name); acctInfo.set("parent", parentAcctInfo.getLong("id")); }else{ log.info(String.format("数仓传入的父级科目编号在金蝶中找不到:%s", parentNumber)); DobeDWUtils.saveLog(number,"数仓会计科目同步",json_body.toString(),"数仓传入的父级科目编号在金蝶中找不到:"+parentNumber,false,"定时任务"); continue; } }else{ acctInfo.set("longnumber", number); acctInfo.set("fullname", name); } //创建组织 hsorgInfo = BusinessDataServiceHelper.loadSingleFromCache(orgName,new QFilter[]{new QFilter("number","=",hsorgid)}); if(hsorgInfo != null){ acctInfo.set("createorg", hsorgInfo.getLong("id"));//创建组织 acctInfo.set("org", hsorgInfo.getLong("id"));//管理组织 acctInfo.set("useorg", hsorgInfo.getLong("id"));//核算组织 }else{ log.info(String.format("数仓传入的科目所属组织在金蝶中找不到:%s", hsorgid)); DobeDWUtils.saveLog(number,"数仓会计科目同步",json_body.toString(),"数仓传入的科目所属组织在金蝶中找不到:"+hsorgid,false,"定时任务"); continue; } //科目类型 acctTypeInfo = BusinessDataServiceHelper.loadSingleFromCache(acctTypeName,new QFilter[]{new QFilter("number","=",acctType)}); if(acctTypeInfo != null){ acctInfo.set("accounttype", acctTypeInfo.getLong("id")); }else{ log.info(String.format("数仓传入的科目类型在金蝶中找不到:%s", acctType)); DobeDWUtils.saveLog(number,"数仓会计科目同步",json_body.toString(),"数仓传入的科目类型在金蝶中找不到:"+acctType,false,"定时任务"); continue; } //核算维度 if(!DobeDWUtils.isEmpty(hswd)){ hswdInfo = BusinessDataServiceHelper.loadSingleFromCache(hswdName,new QFilter[]{new QFilter("number","=",hswd)}); if(hswdInfo != null){ checkitementryInfo = acctInfo.getDynamicObjectCollection("checkitementry").addNew(); checkitementryInfo.set("asstactitem",hswdInfo.getLong("id")); if(Boolean.valueOf(isleaf)){ checkitementryInfo.set("isrequire", true);//必录 checkitementryInfo.set("isdetail", true);//明细 }else{ checkitementryInfo.set("isrequire", false);//必录 checkitementryInfo.set("isdetail", false);//明细 } acctInfo.set("isassist", true);//主表的isassist是否包含核算项目为是 }else{ log.info(String.format("数仓传入的核算维度在金蝶中找不到:%s", hswd)); DobeDWUtils.saveLog(number,"数仓会计科目同步",json_body.toString(),"数仓传入的核算维度在金蝶中找不到:"+hswd,false,"定时任务"); continue; } } //币别核算--外币核算类型 acctInfo.set("acctcurrency", bbhs);//不核算外币nocurrency 指定核算币别descurrency 核算所有币别allcurrency //如果是指定核算币别 if("descurrency".equals(bbhs)){ //处理具体币别分录数据 } acctInfo.set("ctrlstrategy", "5");//控制策略 全局共享 acctInfo.set("control", "nocontrol");//受控系统 nocontrol 无 应付 应收 资产 //损益类型 acctInfo.set("pltype", getSY(sytype)); acctInfo.set("dc", yefx);//余额方向 acctInfo.set("level", Integer.valueOf(level));//级次 acctInfo.set("isleaf", Boolean.valueOf(isleaf));//明细科目 acctInfo.set("startdate", new Date());//版本化日期 acctInfo.set("enddate", TypeUtils.castToDate("2999-12-31"));//失效日期 acctInfo.set("accrualdirection", "nocontrol");//科目录入方向控制 不控制nocontrol 借方debit 贷方credit acctInfo.set("orgcontrollevel", Integer.valueOf(level));//控制级次 acctInfo.set("isallowca", false);//允许公司增加下级科目 由接口同步 为false时控制级次可以不设置 acctInfo.set("ismanual", false);//手工录入 由接口同步 acctInfo.set("iscash", getAcctSX("cash",acctsx));//现金科目 acctInfo.set("isbank", getAcctSX("bank",acctsx));//银行科目 acctInfo.set("iscashequivalent", getAcctSX("cashequivalent",acctsx));//现金等价物 acctInfo.set("isjournal", false);//登日记账 现金等价物时需要勾选 acctInfo.set("enable", 1);//是否启用 acctInfo.set("status", "C");//单据状态 A保存 B已提交 C已审核 acctInfo.set("creator", 43007523L);//创建人默认指定为金小蝶 //手动指定科目的金蝶id long kmId = ID.genLongId(); acctInfo.set("id", kmId); acctInfo.set("masterid", kmId);//主数据内码,系统不会根据id自动生成,需要手动设置 //保存数据:直接保存入库,不走操作校验 SaveServiceHelper.save(new DynamicObject[]{acctInfo}); } } } private boolean getAcctSX(String mb,String acctsx){ if("cash".equals(mb) && "现金科目".equals(acctsx)){ return true; }else if("bank".equals(mb) && "银行科目".equals(acctsx)){ return true; }else if("cashequivalent".equals(mb) && "现金等价物".equals(acctsx)){ return true; } return false; } private String getSY(String sytype){ String typevalue = null; switch (sytype){ case "收入要素": typevalue = "1"; case "成本要素": typevalue = "2"; case "管理费用": typevalue = "3"; case "销售费用": typevalue = "4"; case "财务费用": typevalue = "5"; case "其它损益类型": typevalue = "6"; case "非损益类科目": typevalue = "0"; default: typevalue = "0"; } return typevalue; } }