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.db.DB; import kd.bos.db.DBRoute; import kd.bos.exception.KDException; 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.math.BigDecimal; import java.math.RoundingMode; import java.util.Date; import java.util.Map; /** * 后台任务插件 */ public class DobeDWprojectTask extends AbstractTask implements Plugin { //项目f7的基础资料是单独的表 t_repmd_project private static final String entityName = "repmd_projectbill";//表名 t_repmd_projectbill private static final String orgName = "bos_org";//表名 t_org_org private static Log log = LogFactory.getLog(DobeDWprojectTask.class); private static final String dw_menthod = "mdm_projectinfo"; private static final Long accttableid = 1318154893474663424l; @Override public void execute(RequestContext requestContext, Map map) throws KDException { OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder().url(DobeDWUtils.dwUrl+dw_menthod) .post(DobeDWUtils.createRequestBody("project",1)) .header("Content-Type", "application/json") .header("Authorization", DobeDWUtils.appCode) .build(); String resultData = null; Response response = null; try { response = client.newCall(request).execute(); resultData = response.body().string(); log.info("项目接口返回结果:\n{}", resultData); } catch (IOException e) { log.info(String.format("项目接口异常:%s", e.getMessage())); throw new RuntimeException(e); } JSONObject json_body = JSON.parseObject(resultData); //接口返回的数据进行了分页 int totalNum = json_body.getIntValue("totalNum");//分页-SQL查询总数据量 handleProject(json_body); int queryCount = DobeDWUtils.getQueryCount(totalNum); if(queryCount > 1){ //查询次数不止一次,需要分页查询 for (int i = 2; i <= queryCount; i++) { request = new Request.Builder().url(DobeDWUtils.dwUrl+dw_menthod) .post(DobeDWUtils.createRequestBody("project",i)) .header("Content-Type", "application/json") .header("Authorization", DobeDWUtils.appCode) .build(); try { response = client.newCall(request).execute(); resultData = response.body().string(); } catch (IOException e) { log.info(String.format("项目接口异常:%s", e.getMessage())); throw new RuntimeException(e); } json_body = JSON.parseObject(resultData); handleProject(json_body); } } } private void handleProject(JSONObject json_body) { //解析接口返回值,与系统数据比较 JSONArray detailsJson = json_body.getJSONArray("data"); String fbillno = null;//项目编号 String fbillname = null;//项目名称 // String fprojectstageid = null;//项目阶段 repmd_projectstages t_repmd_projectstage 用户自行在界面上选择 // String fversionnum = null;//版本号 // String fisleaf = null;//是否叶子节点 String faddress = null;//项目地址 String project_stage = null;//业务体系--二开字段,用于工作流发起判断(新拓 成熟) String forgid = null;//所属组织-行政组织的编号 Date project_getdate = null;//项目获取时间 String fdwid = null;//数仓项目id--二开字段,唯一标识 String ywlx = null;//业务类型--二开字段,仅记录数仓数据 DynamicObject orginfo = null; DynamicObject projectinfo = null; String updateSql = "UPDATE t_org_org SET fk_qeug_combofield=? WHERE fnumber=?;"; String updateF7Sql = "UPDATE t_repmd_project SET fk_qeug_combofield=? WHERE fnumber=?;"; // DynamicObject projectstageinfo = null; for (int i = 0; i < detailsJson.size(); i++) { json_body = detailsJson.getJSONObject(i); fbillno = json_body.getString("project_code"); fbillname = json_body.getString("project_name"); faddress = json_body.getString("addr"); // fisleaf = json_body.getString("fisleaf"); forgid = json_body.getString("org_code"); project_getdate = json_body.getDate("project_getdate"); project_stage = json_body.getString("project_stage"); ywlx = json_body.getString("project_stage_detail"); fdwid = json_body.getString("project_id"); if(DobeDWUtils.isEmpty(fbillno) || DobeDWUtils.isEmpty(fbillname) || DobeDWUtils.isEmpty(fdwid)){ log.info(String.format("项目接口入参为空异常:%s", json_body.toJSONString())); continue; } //根据数仓id查找项目是否已存在 projectinfo = BusinessDataServiceHelper.loadSingle(entityName,new QFilter[]{new QFilter("qeug_dwid","=",fdwid)}); //项目阶段表名:t_repmd_projectstage // projectstageinfo = QueryServiceHelper.queryOne("repmd_projectstages","id,number",new QFilter[]{new QFilter("number","=",fprojectstageid)}); if(projectinfo != null){ if("C".equals(projectinfo.getString("billstatus"))){ //如果项目已审核,则不进行项目建立的数据修改;只更新项目F7的业务体系字段 if("新拓园区".equals(project_stage)){ DB.update(DBRoute.of("scm"), updateF7Sql, new Object[]{"XTYQ",fbillno}); }else if("成熟园区".equals(project_stage)){ DB.update(DBRoute.of("scm"), updateF7Sql, new Object[]{"CSYQ",fbillno}); } continue; } //已存在,做更新 名称 阶段 版本号等信息;组织、编号、是否叶子节点不能更新;需要前台操作 projectinfo.set("billno", fbillno); projectinfo.set("longnumber", fbillno);//长编码 projectinfo.set("billname", fbillname); projectinfo.set("fullname", fbillname);//项目全称 // if(projectstageinfo != null){ // projectinfo.set("projectstage", projectstageinfo.getLong("id"));//项目阶段 // } projectinfo.set("address", faddress); projectinfo.set("acquiredate", project_getdate); projectinfo.set("qeug_ywlx", ywlx); // projectinfo.set("billstatus", "A");//单据状态 A保存 B已提交 C已审核 // projectinfo.set("showflag", true);//是否列表显示 // projectinfo.set("enable", 1);//是否启用 // projectinfo.set("islatestversion", true);//是否最新版 projectinfo.set("mainprojectid", projectinfo.getLong("id"));//主项目ID if("新拓园区".equals(project_stage)){ projectinfo.set("qeug_combofield", "XTYQ"); }else if("成熟园区".equals(project_stage)){ projectinfo.set("qeug_combofield", "CSYQ"); } //如果项目原所属组织为空,则更新,不能将原组织有值的直接更新,防止数据和权限发生变化 if(projectinfo.getDynamicObject("org") == null){ orginfo = BusinessDataServiceHelper.loadSingle(orgName,new QFilter[]{new QFilter("number","=",forgid)}); if(orginfo != null){ projectinfo.set("org", orginfo);//项目所属组织 projectinfo.set("purchaseorg", orginfo);//项目采购组织同所属组织 //核算组织默认和所属组织保持一致 projectinfo.set("fiorg", orginfo); }else{ log.info(String.format("数仓传入的项目所属组织在金蝶中找不到:%s", forgid)); DobeDWUtils.saveLog(fbillno,"数仓项目同步",json_body.toString(),"数仓传入的项目所属组织在金蝶中找不到:"+forgid,false,"定时任务"); } } if(projectinfo.getDynamicObject("account") == null){ projectinfo.set("account", accttableid);//会计科目表默认新准则会计科目表 } //TODO 数仓新增两个面积字段 20250221 // projectinfo.set("qeug_decimalfield1", json_body.getBigDecimal("addr"));//原始可出租面积 // projectinfo.set("qeug_decimalfield3", json_body.getBigDecimal("addr"));//原始建筑面积 // projectinfo.set("qeug_textfield2", calcDFL(json_body.getBigDecimal("addr"), // json_body.getBigDecimal("addr")).toString());//原始得房率=可出租/建筑面积*100% projectinfo.set("qeug_textfield1", json_body.getString("project_oriname"));//项目原名称 projectinfo.set("manageway", getManageway(json_body.getString("investment_model")));//投资模式 projectinfo.set("landusage", getLandusage(json_body.getString("land_usage")));//用地性质 projectinfo.set("acquiredate", json_body.getDate("project_gettime"));//项目获取时间 //原保存逻辑直接存入数据库,现在改成调用保存操作 // SaveServiceHelper.update(projectinfo); OperationServiceHelper.executeOperate("save",entityName,new DynamicObject[]{projectinfo}, OperateOption.create()); }else{ //不存在,做新增 根据实体名称创建动态对象 projectinfo = BusinessDataServiceHelper.newDynamicObject(entityName); projectinfo.set("billno", fbillno); projectinfo.set("qeug_dwid", fdwid); projectinfo.set("longnumber", fbillno);//长编码 projectinfo.set("billname", fbillname); projectinfo.set("fullname", fbillname);//项目全称 // if(!DobeDWUtils.isEmpty(fparentid)){ // projectinfo.set("parent", null);//上级项目id // projectinfo.set("parentname", null);//上级项目名称 // } projectinfo.set("bizdate", new Date());//业务日期 projectinfo.set("showflag", true);//是否列表显示 // if(projectstageinfo != null){ // projectinfo.set("projectstage", projectstageinfo.getLong("id"));//项目阶段 // } projectinfo.set("address", faddress); projectinfo.set("acquiredate", project_getdate); orginfo = BusinessDataServiceHelper.loadSingle(orgName,new QFilter[]{new QFilter("number","=",forgid)}); if(orginfo != null){ projectinfo.set("org", orginfo);//项目所属组织 projectinfo.set("purchaseorg", orginfo);//项目采购组织同所属组织 //核算组织默认和所属组织保持一致 projectinfo.set("fiorg", orginfo); }else{ log.info(String.format("数仓传入的项目所属组织在金蝶中找不到:%s", forgid)); DobeDWUtils.saveLog(fbillno,"数仓项目同步",json_body.toString(),"数仓传入的项目所属组织在金蝶中找不到:"+forgid,false,"定时任务"); } projectinfo.set("account", accttableid);//会计科目表默认新准则会计科目表 projectinfo.set("isleaf", true); projectinfo.set("enable", 1);//是否启用 // projectinfo.set("islatestversion", true);//是否最新版-审核之后系统控制的,不需要在此处设置 projectinfo.set("billstatus", "A");//单据状态 A保存 B已提交 C已审核 projectinfo.set("versionnum", "V1.0");//版本号 默认值 projectinfo.set("creator", 43007523L);//创建人默认指定为金小蝶 if("新拓园区".equals(project_stage)){ projectinfo.set("qeug_combofield", "XTYQ"); }else if("成熟园区".equals(project_stage)){ projectinfo.set("qeug_combofield", "CSYQ"); } projectinfo.set("qeug_ywlx", ywlx); //TODO 数仓新增两个面积字段 20250221 // projectinfo.set("qeug_decimalfield1", json_body.getBigDecimal("addr"));//原始可出租面积 // projectinfo.set("qeug_decimalfield3", json_body.getBigDecimal("addr"));//原始建筑面积 // projectinfo.set("qeug_textfield2", calcDFL(json_body.getBigDecimal("addr"), // json_body.getBigDecimal("addr")).toString());//原始得房率=可出租/建筑面积*100% projectinfo.set("qeug_textfield1", json_body.getString("project_oriname"));//项目原名称 projectinfo.set("manageway", getManageway(json_body.getString("investment_model")));//投资模式 projectinfo.set("landusage", getLandusage(json_body.getString("land_usage")));//用地性质 projectinfo.set("acquiredate", json_body.getDate("project_gettime"));//项目获取时间 //保存数据:直接保存入库,不走操作校验 // SaveServiceHelper.save(new DynamicObject[]{projectinfo}); OperationServiceHelper.executeOperate("save",entityName,new DynamicObject[]{projectinfo}, OperateOption.create()); } //获得组织对象后,将本项目的体系字段更新到组织的体系上面 if(!DobeDWUtils.isEmpty(project_stage) && !DobeDWUtils.isEmpty(forgid)){ // updateSql = "UPDATE t_org_org SET fk_qeug_combofield=? WHERE fnumber=?;"; if("新拓园区".equals(project_stage)){ DB.update(DBRoute.of("sys"), updateSql, new Object[]{"XTYQ",forgid}); }else if("成熟园区".equals(project_stage)){ DB.update(DBRoute.of("sys"), updateSql, new Object[]{"CSYQ",forgid}); } } } } private BigDecimal calcDFL(BigDecimal b1, BigDecimal b2){ //原始得房率=可出租 b1/建筑面积 b2*100% if(b1 == null || b2 == null){ return BigDecimal.ZERO; }else{ return b1.divide(b2,4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100)); } } private String getManageway(String manageway){ //根据数仓入参返回金蝶的投资模式 String typevalue; switch (manageway){ case "收入要素": typevalue = "1"; case "成本要素": typevalue = "2"; case "管理费用": typevalue = "3"; default: typevalue = "0"; } return typevalue; } private String getLandusage(String landusage){ //根据数仓入参返回金蝶的用地性质 String typevalue; switch (landusage){ case "收入要素": typevalue = "1"; case "成本要素": typevalue = "2"; case "管理费用": typevalue = "3"; default: typevalue = "0"; } return typevalue; } }