184 lines
9.4 KiB
Java
184 lines
9.4 KiB
Java
package shkd.bamp.base.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.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.org.model.OrgParam;
|
||
import kd.bos.orm.query.QFilter;
|
||
import kd.bos.schedule.executor.AbstractTask;
|
||
import kd.bos.servicehelper.QueryServiceHelper;
|
||
import kd.bos.servicehelper.org.OrgUnitServiceHelper;
|
||
import kd.bos.servicehelper.org.OrgViewType;
|
||
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.*;
|
||
|
||
/**
|
||
* 后台任务插件 yxl 20240830
|
||
*/
|
||
public class DobeDWorgTask extends AbstractTask implements Plugin {
|
||
|
||
private static final String entityName = "bos_org";//系统库 表名 t_org_org
|
||
private static Log log = LogFactory.getLog(DobeDWorgTask.class);
|
||
|
||
private static final String dw_menthod = "mdm_arog";
|
||
|
||
@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("",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查询总数据量
|
||
//解析接口返回值,与系统数据比较
|
||
handleOrg(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("",i))
|
||
.header("Content-Type", "application/json")
|
||
.header("Authorization", DobeDWUtils.appCode)
|
||
.build();
|
||
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);
|
||
}
|
||
json_body = JSON.parseObject(resultData);
|
||
handleOrg(json_body);
|
||
}
|
||
}
|
||
}
|
||
|
||
private void handleOrg(JSONObject json_body) {
|
||
JSONArray detailsJson = json_body.getJSONArray("data");
|
||
// List<OrgParam> paramList = new ArrayList<>();
|
||
OrgParam param = null;
|
||
DynamicObject parentOrg = null;
|
||
DynamicObject currentOrg = null;
|
||
String orgNumber = null;
|
||
String orgName = null;
|
||
String orgID = null;
|
||
String parentId = null;
|
||
String person_charge = null;//部门下的负责人的工号
|
||
String updateSql = null;
|
||
for (int i = 0; i < detailsJson.size(); i++) {
|
||
json_body = detailsJson.getJSONObject(i);
|
||
orgNumber = json_body.getString("org_code");
|
||
orgName = json_body.getString("org_name");
|
||
orgID = json_body.getString("org_id");
|
||
// String orgLevel = json_body.getString("org_level");//组织层级
|
||
parentId = json_body.getString("org_parentid");
|
||
person_charge = json_body.getString("person_chargecode");
|
||
if(DobeDWUtils.isEmpty(orgID) || DobeDWUtils.isEmpty(orgNumber) || DobeDWUtils.isEmpty(orgName)
|
||
|| DobeDWUtils.isEmpty(parentId)){
|
||
//如果组织ID和组织编码 名称是空的,则跳过此记录
|
||
log.info(String.format("组织入参为空异常:%s", json_body.toJSONString()));
|
||
continue;
|
||
}
|
||
//根据组织ID查找系统现有数据是否存在,这种写法会抛异常,需要关注原因
|
||
currentOrg = QueryServiceHelper.queryOne(entityName,"id,number,name",new QFilter[]{new QFilter("fyzjorgid","=",orgID)});
|
||
if(currentOrg != null){
|
||
//根据组织下的负责人id去人员分录表中更新负责人标记,先去除这个部门下人员的负责人标记,再更新
|
||
if(!DobeDWUtils.isEmpty(person_charge)){
|
||
updateSql = "UPDATE t_SEC_UserPosition SET fisincharge=? WHERE fdptid in (select fid from t_org_org where fyzjorgid=?);";
|
||
DB.update(DBRoute.of("sys"), updateSql, new Object[]{0,orgID});
|
||
updateSql = "UPDATE t_SEC_UserPosition SET fisincharge=? WHERE fdptid in (select fid from t_org_org where fyzjorgid=?) and fid in (select fid from t_sec_user where fnumber=?);";
|
||
DB.update(DBRoute.of("sys"), updateSql, new Object[]{1,orgID,person_charge});
|
||
}
|
||
//已存在,做更新
|
||
if(orgNumber.equals(currentOrg.getString("number")) && orgName.equals(currentOrg.getString("name"))){
|
||
//编号和名称都没有变化,无需更新
|
||
continue;
|
||
}
|
||
param = new OrgParam();
|
||
param.setId(currentOrg.getLong("id"));
|
||
param.setName(orgName);
|
||
param.setNumber(orgNumber);
|
||
OrgUnitServiceHelper.update(param);
|
||
if (!param.isSuccess()) {
|
||
log.info(String.format("组织修改异常:%s", param.getMsg()));
|
||
}
|
||
}else{
|
||
//根据父级ID获取父级组织对象,组织的主数据id存在于星瀚组织的fyzjorgid字段中
|
||
parentOrg = QueryServiceHelper.queryOne(entityName,"id,number,name",new QFilter[]{new QFilter("fyzjorgid","=",parentId)});
|
||
if(parentOrg == null){
|
||
log.info(String.format("根据数仓组织父级ID未在金蝶中找到对应组织:%s", parentId));
|
||
continue;
|
||
}
|
||
/* 新增单个视图方案的组织 */
|
||
param = new OrgParam();
|
||
param.setParentId(parentOrg.getLong("id"));//上级组织的金蝶ID
|
||
param.setName(orgName);
|
||
param.setYzjOrgId(orgID);//云之家组织内码字段,用于保存组织的外部ID
|
||
param.setNumber(orgNumber);
|
||
param.setOrgPatternId(4);//组织形态ID,默认ID为4L(部门)1为公司;当前组织是公司还是部门需要有字段可以体现
|
||
// param.setCustomOrgId(Long.parseLong(orgID));//组织自定义ID,用于保存第三方系统的ID,并非额外字段保存,而是直接更新id字段
|
||
param.setDuty(OrgViewType.Admin);//组织属性-行政组织
|
||
//设置组织属性-单个视图
|
||
// Map<String, Object> proMap = new HashMap<>();
|
||
// proMap.put("uniformsocialcreditcode", "add0001");//统一社会信用代码
|
||
// param.setPropertyMap(proMap);//组织关联属性map
|
||
// paramList.add(param);
|
||
|
||
// 设置多视图参数
|
||
// TreeMap<String, OrgDutyView> multiViewMap = new TreeMap<>();
|
||
// OrgDutyView dutyView = new OrgDutyView();
|
||
// dutyView.setParentId(0L);//上级组织的金蝶ID
|
||
// multiViewMap.put(OrgViewType.ControlUnit, dutyView);
|
||
// param.setMultiViewMap(multiViewMap);//多职能参数 支持一次更新多种业务视图方案;键为视图方案编码(参照本页参数说明的OrgViewType),值为OrgDutyView对象
|
||
// paramList.add(param);
|
||
|
||
// 执行并判断结果,如下是微服务模式调用,会提示服务找不到
|
||
// IOrgService orgService = ServiceFactory.getService(OrgService.class);
|
||
// orgService.add(paramList);
|
||
OrgUnitServiceHelper.add(param);
|
||
if (!param.isSuccess()) {
|
||
log.info(String.format("组织新增异常:%s", param.getMsg()));
|
||
}
|
||
//部门新增时,不用去更新部门下的负责人
|
||
}
|
||
}
|
||
}
|
||
// for (OrgParam result : paramList) {
|
||
// // 根据操作结果提示用户或执行其他处理
|
||
// if (!result.isSuccess()) {
|
||
// log.info(String.format("组织保存异常:%s", result.getMsg()));
|
||
// }
|
||
// }
|
||
} |