diff --git a/main/java/shjh/jhzj7/fi/fi/webapi/AdminOrgControler.java b/main/java/shjh/jhzj7/fi/fi/webapi/AdminOrgControler.java index a8d1e65..161b779 100644 --- a/main/java/shjh/jhzj7/fi/fi/webapi/AdminOrgControler.java +++ b/main/java/shjh/jhzj7/fi/fi/webapi/AdminOrgControler.java @@ -58,6 +58,9 @@ public class AdminOrgControler { JSONArray itemsJson = new JSONArray();//返回值明细集合 JSONObject itemInfo;//返回值明细对象 JSONArray detailsJson = json_obj.getJSONArray("items"); + if(detailsJson == null){ + return CustomApiResult.fail("400","未识别到items参数"); + } // //处理入参的排序,按照deptLevel正序 // detailsJson.sort(Comparator.comparing(json -> ((JSONObject) json).getString("deptLevel"))); String orgNumber; @@ -100,7 +103,7 @@ public class AdminOrgControler { continue; } param = new OrgParam(); - param.setName(orgName); + param.setName(orgName.replace("_","-")); param.setNumber(orgNumber); param.setOrgPatternId(4);//组织形态ID,默认ID为4L(部门)1为公司;当前组织是公司还是部门需要有字段可以体现 param.setDuty(OrgViewType.Admin);//组织属性-行政组织 diff --git a/main/java/shjh/jhzj7/fi/fi/webapi/AspAccountControler.java b/main/java/shjh/jhzj7/fi/fi/webapi/AspAccountControler.java index d52f3b5..0659403 100644 --- a/main/java/shjh/jhzj7/fi/fi/webapi/AspAccountControler.java +++ b/main/java/shjh/jhzj7/fi/fi/webapi/AspAccountControler.java @@ -47,6 +47,8 @@ public class AspAccountControler { private static final Map mapObject = new HashMap<>();//公司对象集合 private static final Map hsxmMaps = new HashMap<>();//核算维度对象集合 + private String insertSql = "insert into T_BD_Account_U (fdataid,fuseorgid) values (?,?);"; + /** * @param bizParam 入参json格式数据 * @return 自定义返回值 @@ -67,8 +69,9 @@ public class AspAccountControler { JSONArray itemsJson = new JSONArray();//返回值明细集合 JSONObject itemInfo;//返回值明细对象 //根据科目基本信息得到科目编号和JSONObject - Map baseMaps = getBaseMap(json_obj.getJSONArray("items")); +// Map baseMaps = getBaseMap(json_obj.getJSONArray("items")); JSONArray companysJson = json_obj.getJSONArray("companys"); + JSONArray detailsJson = json_obj.getJSONArray("items"); String number;//科目编号 String name;//科目名称 // String isleaf;//是否叶子节点 @@ -78,35 +81,30 @@ public class AspAccountControler { String bbhs;//币别核算 不核算外币 核算所有外币 指定核算币别(需要指定币别ISO) String acctType;//科目类型 资产负债类 损益类 String descurrencynum;//指定币别编号 - DynamicObject hsorgInfo; +// DynamicObject hsorgInfo; DynamicObject acctInfo; DynamicObject acctTypeInfo; - DynamicObject parentAcctInfo; - JSONObject company_body; +// DynamicObject parentAcctInfo; JSONObject json_body; - String companynum; DynamicObjectCollection docbb; DynamicObject bbInfo; String bbiso; - String insertSql = "insert into T_BD_Account_U(fdataid,fuseorgid) values (?,?);"; + Map acctids = new HashMap<>();//科目编号和ID对应关系 Map accountMaps = new HashMap<>();//将科目编号与对象关联 //先根据基础信息在集团层面生成科目,不考虑核算维度,使用逐级分配 //再根据公司信息进行科目分配 //最后处理每个公司下科目的核算维度和禁用状态 - for (int i = 0; i < companysJson.size(); i++) { - company_body = companysJson.getJSONObject(i); - number = company_body.getString("code"); - json_body = baseMaps.get(number); - if(json_body == null){ - continue; - } - companynum = company_body.getString("companynum");//公司编号 + for (int i = 0; i < detailsJson.size(); i++) { + json_body = companysJson.getJSONObject(i); + number = json_body.getString("code"); +// json_body = baseMaps.get(number); +// companynum = company_body.getString("companynum");//公司编号 name = json_body.getString("name"); acctType = json_body.getString("type"); bbhs = json_body.getString("acctcurrency"); descurrencynum = json_body.getString("descurrencynum"); - if(EsbUtils.isEmpty(number) || EsbUtils.isEmpty(name) || EsbUtils.isEmpty(acctType) || EsbUtils.isEmpty(bbhs) || EsbUtils.isEmpty(companynum)){ + if(EsbUtils.isEmpty(number) || EsbUtils.isEmpty(name) || EsbUtils.isEmpty(acctType) || EsbUtils.isEmpty(bbhs)){ log.error(String.format("会计科目接口入参为空异常:%s", json_body.toJSONString())); itemInfo = new JSONObject(); itemInfo.put("code",number); @@ -122,13 +120,13 @@ public class AspAccountControler { itemsJson.add(itemInfo); continue; } - //根据科目编号和公司编号查找对应科目是否已存在 + //根据科目编号和集团ID查找对应科目是否已存在 acctInfo = BusinessDataServiceHelper.loadSingle(entityName,new QFilter[]{new QFilter("number","=",number), - new QFilter("createorg.number","=", companynum)}); + new QFilter("createorg.id","=", JhzjUtils.GROUPID)}); // acctInfo = BusinessDataServiceHelper.loadSingle(entityName,new QFilter[]{new QFilter("number","=",number)}); if(acctInfo != null){ //处理科目更新逻辑,此时能修改哪些字段?名称 币别核算 核算维度 是否可用 - if("0".equals(company_body.getString("companystatus")) || "0".equals(json_body.getString("status"))){ + if("0".equals(json_body.getString("status"))){ acctInfo.set("enable", 0);//科目禁用处理 } acctInfo.set("name", name); @@ -160,15 +158,15 @@ public class AspAccountControler { itemsJson.add(itemInfo); continue; } - hsorgInfo = getOrgInfo(companynum); - if(hsorgInfo == null){ - log.error(String.format("公司编号在金蝶中未找到对应组织:%s", companynum)); - itemInfo = new JSONObject(); - itemInfo.put("code",number); - itemInfo.put("error","公司编号在金蝶中未找到对应组织:"+companynum); - itemsJson.add(itemInfo); - continue; - } +// hsorgInfo = getOrgInfo(companynum); +// if(hsorgInfo == null){ +// log.error(String.format("公司编号在金蝶中未找到对应组织:%s", companynum)); +// itemInfo = new JSONObject(); +// itemInfo.put("code",number); +// itemInfo.put("error","公司编号在金蝶中未找到对应组织:"+companynum); +// itemsJson.add(itemInfo); +// continue; +// } //不存在,做新增 根据实体名称创建动态对象 acctInfo = BusinessDataServiceHelper.newDynamicObject(entityName); acctInfo.set("accounttable", EsbUtils.ACCTABLE);//科目表fid,上正式时,注意此ID @@ -180,10 +178,10 @@ public class AspAccountControler { acctInfo.set("fullname", name); // acctInfo.set("parent", parentAcctInfo.getLong("id")); //创建组织 -// acctInfo.set("createorg", JhzjUtils.GROUPID);//创建组织 -// acctInfo.set("org", JhzjUtils.GROUPID);//管理组织 - acctInfo.set("createorg", hsorgInfo.getLong("id"));//创建组织 - acctInfo.set("org", hsorgInfo.getLong("id"));//管理组织 + acctInfo.set("createorg", JhzjUtils.GROUPID);//创建组织 + acctInfo.set("org", JhzjUtils.GROUPID);//管理组织 +// acctInfo.set("createorg", hsorgInfo.getLong("id"));//创建组织 +// acctInfo.set("org", hsorgInfo.getLong("id"));//管理组织 //科目类型 acctInfo.set("accounttype", acctTypeInfo.getLong("id")); //币别核算--外币核算类型 @@ -230,25 +228,32 @@ public class AspAccountControler { //处理科目使用范围 DB.update(DBRoute.of("sys"), insertSql, new Object[]{kmId,JhzjUtils.GROUPID}); } - accountMaps.put(number+companynum,acctInfo); + acctids.put(number,acctInfo.getLong("id")); + accountMaps.put(number,acctInfo); } - //处理科目分配 EsbUtils.handleAssign(companysJson, acctids, entityName); - - //处理核算维度 + //处理科目在每个公司生成 + handleAccountCompany(accountMaps,companysJson); + //处理每个公司下科目的核算维度和禁用状态 JSONArray asstacttypesJson = json_obj.getJSONArray("asstacttypes"); String hsxm;//核算维度名称 基础资料 DynamicObject hsxmInfo;//核算维度对象 DynamicObjectCollection dochswd; + String companynum; DynamicObject checkitementryInfo = null; for (int i = 0; i < asstacttypesJson.size(); i++) { json_body = asstacttypesJson.getJSONObject(i); hsxm = json_body.getString("asstactname"); + number = json_body.getString("code"); if(EsbUtils.isEmpty(hsxm)){ + log.error(String.format("核算维度为空:%s", number)); + itemInfo = new JSONObject(); + itemInfo.put("code",number); + itemInfo.put("error","核算维度为空"+number); + itemsJson.add(itemInfo); continue; } - number = json_body.getString("code"); companynum = json_body.getString("companynum"); //根据科目核算维度中的科目编号和公司编号获取对应科目对象,不存在的不处理 acctInfo = accountMaps.get(number+companynum); @@ -297,6 +302,93 @@ public class AspAccountControler { } } + private void handleAccountCompany(Map accountMaps,JSONArray companysJson){ + Map baseMaps = new HashMap<>(); + JSONObject json_body; + DynamicObject oldAcctInfo; + DynamicObject newAcctInfo; + DynamicObject hsorgInfo; + String compnum; + String acctnum; + for (int i = 0; i < companysJson.size(); i++) { + json_body = companysJson.getJSONObject(i); + acctnum = json_body.getString("code");//科目编号 + compnum = json_body.getString("companynum");//公司编号 + if(EsbUtils.isEmpty(acctnum) || EsbUtils.isEmpty(compnum)){ + continue; + } + oldAcctInfo = accountMaps.get(acctnum); + if(oldAcctInfo == null){ + continue; + } + newAcctInfo = BusinessDataServiceHelper.loadSingle(entityName,new QFilter[]{new QFilter("number","=",acctnum), + new QFilter("createorg.number","=", compnum)}); + if(newAcctInfo == null){ + hsorgInfo = getOrgInfo(compnum); + if(hsorgInfo == null){ + continue; + } + //复制对象,修改其中的某些属性,比如id和组织id + newAcctInfo = copydo(oldAcctInfo,hsorgInfo); + } + baseMaps.put(acctnum+compnum, newAcctInfo); + } + } + + private DynamicObject copydo(DynamicObject olddo, DynamicObject hsorgInfo){ + DynamicObject newAcctInfo = BusinessDataServiceHelper.newDynamicObject(entityName); + newAcctInfo.set("accounttable", EsbUtils.ACCTABLE);//科目表fid,上正式时,注意此ID + newAcctInfo.set("number", olddo.getString("number")); + newAcctInfo.set("name", olddo.getString("name")); + newAcctInfo.set("longnumber", olddo.getString("longnumber")); + newAcctInfo.set("fullname", olddo.getString("fullname")); + newAcctInfo.set("createorg", hsorgInfo.getLong("id"));//创建组织 + newAcctInfo.set("org", hsorgInfo.getLong("id"));//管理组织 + //科目类型 + newAcctInfo.set("accounttype", olddo.getDynamicObject("accounttype").getLong("id")); + //币别核算--外币核算类型 + newAcctInfo.set("acctcurrency", olddo.getString("acctcurrency"));//不核算外币nocurrency 指定核算币别descurrency 核算所有币别allcurrency + //如果是指定核算币别 + if("descurrency".equals(olddo.getString("acctcurrency"))){ + //处理具体币别分录数据,根据逗号进行分割 + DynamicObjectCollection olddocbb = olddo.getDynamicObjectCollection("currencyentry"); + DynamicObjectCollection newdocbb = newAcctInfo.getDynamicObjectCollection("currencyentry"); + DynamicObject oldentryinfo; + for (int j = 0; j < olddocbb.size(); j++) { + oldentryinfo = olddocbb.get(j); + newdocbb.addNew().set("currency",oldentryinfo.getDynamicObject("currency").getLong("id")); + } + } + //损益类型 + newAcctInfo.set("pltype", olddo.getString("pltype")); + + newAcctInfo.set("ctrlstrategy", "1");//控制策略 5全局共享 7私有 1逐级分配 + newAcctInfo.set("control", "nocontrol");//受控系统 nocontrol 无 应付 应收 资产 + newAcctInfo.set("dc", 1);//余额方向 默认为借 + newAcctInfo.set("level", 1);//级次 默认为1 + newAcctInfo.set("isleaf", true);//明细科目 默认为是 + newAcctInfo.set("startdate", new Date());//版本化日期 + newAcctInfo.set("enddate", TypeUtils.castToDate("2999-12-31"));//失效日期 + newAcctInfo.set("accrualdirection", "nocontrol");//科目录入方向控制 不控制nocontrol 借方debit 贷方credit + newAcctInfo.set("orgcontrollevel", 1);//控制级次 默认为1 + newAcctInfo.set("isallowca", false);//允许公司增加下级科目 由接口同步 为false时控制级次可以不设置 + newAcctInfo.set("ismanual", false);//手工录入 由接口同步 + newAcctInfo.set("iscash", false);//现金科目 默认false sap不区分 + newAcctInfo.set("isbank", false);//银行科目 默认false sap不区分 + newAcctInfo.set("iscashequivalent", false);//现金等价物 默认false sap不区分 + newAcctInfo.set("isjournal", false);//登日记账 现金等价物时需要勾选 + newAcctInfo.set("enable", 1);//是否启用 + newAcctInfo.set("status", "C");//单据状态 A保存 B已提交 C已审核 + newAcctInfo.set("creator", RequestContext.get().getCurrUserId());//创建人 + //手动指定科目的金蝶id + newAcctInfo.set("id", ID.genLongId()); + newAcctInfo.set("masterid", olddo.getLong("id"));//主数据内码,系统不会根据id自动生成,需要手动设置 + SaveServiceHelper.save(new DynamicObject[]{newAcctInfo}); + //处理科目使用范围 + DB.update(DBRoute.of("sys"), insertSql, new Object[]{newAcctInfo.getLong("id"),JhzjUtils.GROUPID}); + return newAcctInfo; + } + private DynamicObject getHsxmInfo(String hsxmname){ //核算维度对象集合 DynamicObject orginfo = hsxmMaps.get(hsxmname);