package weaver.interfaces.dito.job; import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import weaver.conn.RecordSet; import weaver.general.BaseBean; import weaver.general.TimeUtil; import weaver.interfaces.dito.comInfo.PropBean; import weaver.interfaces.dito.util.HttpUtils; import weaver.interfaces.schedule.BaseCronJob; import weaver.share.ShareManager; import java.util.*; import static com.engine.dito.ssologin.constant.DitoConstant.ACTION_TYPE_ADD_USER; import static com.engine.dito.ssologin.constant.DitoConstant.ACTION_TYPE_DELETE; import static com.engine.dito.ssologin.constant.DitoConstant.SYNC_ALL; /** * @version 1.0 * @Title ecology-9 * @Company 泛微软件 * @CreateDate 2022/11/14 * @Description 流程及人员权限同步建模 * @Author Lee */ public class WorkflowUserCronJob extends BaseCronJob { private String isAll; private static final Log logger = LogFactory.getLog(WorkflowUserCronJob.class); @Override public void execute() { BaseBean bb = new BaseBean(); bb.writeLog("start WorkflowAuthModelingCronJob"); RecordSet rs = new RecordSet(); try { //全量则删除建模表数据重新同步 if (StringUtils.isNotEmpty(isAll) && SYNC_ALL.equals(isAll)) { bb.writeLog("DELETE ALL uf_workflow_auth"); rs.execute("delete from uf_workflow_auth"); } String center = PropBean.getUfPropValue("newWorkflowCenter"); String formModeId = PropBean.getUfPropValue("uf_workflow_auth_formModeId"); String synchronizeUserUrl = PropBean.getUfPropValue("synchronizeUserUrl"); String accountName = PropBean.getUfPropValue("username"); String password = PropBean.getUfPropValue("passwd"); /* 查询出所有E9有效流程id,Set */ //根据流程id查询出所有创建人id,封装成Map ShareManager shareManager = new ShareManager(); Set baseWorkflowIdSet = new HashSet<>(); Map> baseWorkflowMap = new HashMap<>(); Map baseWorkflowName = new HashMap<>(); Map baseWorkflowCataCode = new HashMap<>(); String baseWorkflowSql = "SELECT w.id,w.workflowname,u.cataCodeName FROM workflow_base w " + "left join uf_syncCataCode u on w.id=u.flowCode WHERE w.ISVALID = 1"; rs.execute(baseWorkflowSql); while (rs.next()) { String workflowId = rs.getString("id"); String workflowname = rs.getString("workflowname"); String cataCodeName = rs.getString("cataCodeName"); baseWorkflowIdSet.add(workflowId); String userIds = shareManager.getWorkflowCreater(Integer.parseInt(workflowId)); Set userIdList = new HashSet<>(Arrays.asList(userIds.split(","))); baseWorkflowMap.put(workflowId, userIdList); baseWorkflowName.put(workflowId, workflowname); baseWorkflowCataCode.put(workflowId, cataCodeName); } /* 查询出所有建模表流程id,Set 并将创建人与流程id封装成Map */ RecordSet rs2 = new RecordSet(); String modelWorkflowSql = "SELECT DISTINCT workflowselect as id FROM uf_workflow_auth"; rs.execute(modelWorkflowSql); Set modelWorkflowIdSet = new HashSet<>(); Map> modeWorkflowMap = new HashMap<>(); Map modeWorkflowCataCode = new HashMap<>(); Map modeWorkflowName = new HashMap<>(); while (rs.next()) { String workflowId = rs.getString("id"); modelWorkflowIdSet.add(workflowId); String modelUserSql = "SELECT w.userselect as userId,w.workflowname,u.cataCodeName FROM uf_workflow_auth w " + "left join uf_syncCataCode u on w.workflowselect=u.flowCode WHERE w.workflowselect =?"; rs2.executeQuery(modelUserSql, workflowId); Set userIdList = new HashSet<>(); while (rs2.next()) { userIdList.add(rs2.getString("userId")); String workflowName = rs2.getString("workflowname"); String cataCodeName = rs2.getString("cataCodeName"); modeWorkflowCataCode.put(workflowId, cataCodeName); modeWorkflowName.put(workflowId, workflowName); } modeWorkflowMap.put(workflowId, userIdList); } /* 建模表流程Set与E9有效流程Set取集 */ HashMap headers = new HashMap<>(); headers.put("Authorization", "Basic " + Base64.getUrlEncoder().encodeToString((accountName + ":" + password).getBytes())); Set updateSet = new HashSet<>(baseWorkflowIdSet); updateSet.retainAll(modelWorkflowIdSet); Set deleteSet = new HashSet<>(modelWorkflowIdSet); deleteSet.removeAll(updateSet); Set addSet = new HashSet<>(baseWorkflowIdSet); addSet.removeAll(updateSet); //人员权限新增同步 if (addSet.size() != 0) { addWorkflow(bb, addSet, baseWorkflowMap, baseWorkflowName, formModeId); List>> addUserList = new LinkedList<>(); getUserConditionByWorkflow(center, addSet, baseWorkflowName, baseWorkflowCataCode, addUserList); syncUser(synchronizeUserUrl, addUserList, headers); } //人员权限修改同步 if (updateSet.size() != 0) { HashSet needUpdateSet = updateWorkflow(bb, updateSet, baseWorkflowMap, modeWorkflowMap, baseWorkflowName, formModeId); logger.info("needUpdateSet-size:" + needUpdateSet.size()); //先删除流程再重新同步人员权限 if (needUpdateSet.size() != 0) { //删除流程 syncWorkflowByHttp(ACTION_TYPE_DELETE, center, needUpdateSet, modeWorkflowName, modeWorkflowCataCode, headers); List>> updateUserList = new LinkedList<>(); getUserConditionByWorkflow(center, needUpdateSet, baseWorkflowName, baseWorkflowCataCode, updateUserList); //重新同步流程及人员权限 syncWorkflowByHttp(ACTION_TYPE_ADD_USER, center, needUpdateSet, modeWorkflowName, modeWorkflowCataCode, headers); syncUser(synchronizeUserUrl, updateUserList, headers); } } //失效流程删除人员关联 if (deleteSet.size() != 0) { deleteWorkflow(bb, deleteSet); } } catch (Exception e) { logger.info("WorkflowAuthModelingCronJob-Exception:" + e.getMessage()); } } /** * 同步流程至第三方 * * @param action * @param center * @param needUpdateSet * @param modeWorkflowName * @param modeWorkflowCataCode * @param headers */ private void syncWorkflowByHttp(String action, String center, HashSet needUpdateSet, Map modeWorkflowName, Map modeWorkflowCataCode, HashMap headers) { String bpm_app_workflowurl = PropBean.getUfPropValue("bpm_app_workflowurl"); String synchronizeFlowUrl = PropBean.getUfPropValue("synchronizeFlowUrl"); for (String workflowId : needUpdateSet) { Map workflowMap = new HashMap<>(); workflowMap.put("flowCode", workflowId); workflowMap.put("flowName", modeWorkflowName.get(workflowId)); workflowMap.put("actionType", action); workflowMap.put("cataCode", modeWorkflowCataCode.get(workflowId)); workflowMap.put("center", center); workflowMap.put("urlPc", "/bpm/workflow/request/CreateRequestForward.jsp?workflowid=" + workflowId); workflowMap.put("urlApp", bpm_app_workflowurl + "/spa/workflow/static4mobileform/index.html#/req?iscreate=1&workflowid=" + workflowId); String data = HttpUtils.doPost(synchronizeFlowUrl, workflowMap, headers); logger.info("syncWorkflowByHttp-resultData:" + data); } } /** * 新增流程 * * @param bb * @param addSet * @param baseWorkflowMap * @param baseWorkflowName * @param formModeId */ private void addWorkflow(BaseBean bb, Set addSet, Map> baseWorkflowMap, Map baseWorkflowName, String formModeId) { String staffIdField = PropBean.getUfPropValue("staffIdFieldByCus"); RecordSet rs = new RecordSet(); RecordSet rs2 = new RecordSet(); String currentDate = TimeUtil.getCurrentDateString(); String onlyCurrentTime = TimeUtil.getOnlyCurrentTimeString(); String addSql = "INSERT INTO uf_workflow_auth (userselect,effective,formmodeid,modedatacreatedate,modedatacreatetime,workflowselect,workflowname,staffid) values (?,?,?,?,?,?,?,?)"; for (String workflowId : addSet) { List lists = new ArrayList<>(); Set userIds = baseWorkflowMap.get(workflowId); for (String addUserId : userIds) { String workflowName = baseWorkflowName.get(workflowId); String workCodeQuery = "SELECT " + staffIdField + " as staffId FROM cus_fielddata WHERE id=? and SCOPEID=-1"; rs2.executeQuery(workCodeQuery, addUserId); String staffId = ""; if (rs2.next()) { staffId = rs2.getString("staffId"); } ArrayList list = new ArrayList<>(); list.add(addUserId); list.add(0); list.add(formModeId); list.add(currentDate); list.add(onlyCurrentTime); list.add(workflowId); list.add(workflowName); list.add(staffId); lists.add(list); } rs.executeBatchSql(addSql, lists); } } /** * 更新建模表数据 * * @param bb * @param updateSet * @param baseWorkflowMap * @param modeWorkflowMap * @param baseWorkflowName * @param formModeId */ private HashSet updateWorkflow(BaseBean bb, Set updateSet, Map> baseWorkflowMap, Map> modeWorkflowMap, Map baseWorkflowName, String formModeId) { bb.writeLog("updateWorkflow-----start"); HashSet needUpdateSet = new HashSet<>(); String staffIdField = PropBean.getUfPropValue("staffIdFieldByCus"); RecordSet rs = new RecordSet(); RecordSet rs2 = new RecordSet(); String currentDate = TimeUtil.getCurrentDateString(); String onlyCurrentTime = TimeUtil.getOnlyCurrentTimeString(); //对比人员Set for (String workflowId : updateSet) { String workflowName = baseWorkflowName.get(workflowId); Set baseUsers = baseWorkflowMap.get(workflowId); Set modeUsers = modeWorkflowMap.get(workflowId); //如果差集集为0,则跳过 if (baseUsers.containsAll(modeUsers) && baseUsers.size() == modeUsers.size()) { continue; } //有变动的流程 needUpdateSet.add(workflowId); //e9users与建模流程人员取差集,新增 List addLists = new ArrayList<>(); HashSet diffUsers = new HashSet<>(baseUsers); diffUsers.removeAll(modeUsers); if (diffUsers.size() != 0) { String addSql = "INSERT INTO uf_workflow_auth (userselect,effective,formmodeid,modedatacreatedate,modedatacreatetime,workflowselect,workflowname,staffid) values (?,?,?,?,?,?,?,?)"; for (String addUserId : diffUsers) { String workCodeQuery = "SELECT " + staffIdField + " as staffId FROM cus_fielddata WHERE id=? and SCOPEID=-1"; rs2.executeQuery(workCodeQuery, addUserId); String staffId = ""; if (rs2.next()) { staffId = rs2.getString("staffId"); } ArrayList list = new ArrayList<>(); list.add(addUserId); list.add(0); list.add(formModeId); list.add(currentDate); list.add(onlyCurrentTime); list.add(workflowId); list.add(workflowName); list.add(staffId); addLists.add(list); } boolean b2 = rs.executeBatchSql(addSql, addLists); } //建模users与现流程人员取差集,删除 HashSet deleteUsers = new HashSet<>(modeUsers); deleteUsers.removeAll(baseUsers); if (deleteUsers.size() != 0) { List deleteLists = new ArrayList<>(); String deleteSql = "DELETE FROM uf_workflow_auth WHERE userselect=? AND workflowselect=?"; for (String deleteUserId : deleteUsers) { ArrayList list = new ArrayList<>(); list.add(deleteUserId); list.add(workflowId); deleteLists.add(list); } boolean b1 = rs.executeBatchSql(deleteSql, deleteLists); } } return needUpdateSet; } /** * 删除建模表数据 * * @param baseBean * @param deleteSet */ private void deleteWorkflow(BaseBean baseBean, Set deleteSet) { RecordSet rs = new RecordSet(); String sql = "DELETE FROM uf_workflow_auth WHERE workflowselect=?"; for (String id : deleteSet) { boolean b = rs.executeUpdate(sql, id); } } /** * 组装人员同步API请求参数 * * @param addSet * @param baseWorkflowName * @param baseWorkflowCataCode */ private void getUserConditionByWorkflow(String center, Set addSet, Map baseWorkflowName, Map baseWorkflowCataCode, List>> userLists) { for (String flowCode : addSet) { //没有维护目录的跳过 String cataCode = baseWorkflowCataCode.get(flowCode); if (StringUtils.isEmpty(cataCode)) { continue; } List> userList = new LinkedList<>(); Map userCondition = new HashMap<>(); Map staffCodeMap = new HashMap<>(); HashSet staffCodeSet = new HashSet<>(); String userSql = "SELECT staffid FROM uf_workflow_auth WHERE workflowselect=?"; RecordSet rs = new RecordSet(); rs.executeQuery(userSql, flowCode); while (rs.next()) { String staffid = rs.getString("staffid"); if (StringUtils.isNotEmpty(staffid)) { staffCodeSet.add(staffid); } } staffCodeMap.put("staffCodeSet", staffCodeSet); userList.add(staffCodeMap); //组建人员同步map userCondition.put("flowCode", flowCode); userCondition.put("flowName", baseWorkflowName.get(flowCode)); //同步所需参数一并拼接 userCondition.put("actionType", ACTION_TYPE_ADD_USER); userCondition.put("center", center); userCondition.put("cataCode", cataCode); Map userMap = new HashMap<>(); userMap.put("userCondition", userCondition); userList.add(userMap); userLists.add(userList); } } /** * 人员同步方法 * * @param synchronizeUserUrl * @param headers */ private void syncUser(String synchronizeUserUrl, List>> userLists, HashMap headers) { for (List> userList : userLists) { Map staffCodeMap = userList.get(0); Map userConditionMap = userList.get(1); Map userCondition = (Map) userConditionMap.get("userCondition"); HashSet staffCodeSet = (HashSet) staffCodeMap.get("staffCodeSet"); StringBuilder stringBuilder = new StringBuilder(); for (String staffCode : staffCodeSet) { //超出字段长度限制请求接口后清空一次 if (stringBuilder.length() >= 10000) { userCondition.put("staffIds", stringBuilder.toString()); String data = HttpUtils.doPost(synchronizeUserUrl, userCondition, headers); logger.info("synchronizeUser-data" + data); stringBuilder.delete(0, stringBuilder.length()); } stringBuilder.append(staffCode).append("|"); } //最后字段可能没有超限,再同步最后的人员 if (stringBuilder.length() != 0) { userCondition.put("staffIds", stringBuilder.toString()); String data = HttpUtils.doPost(synchronizeUserUrl, userCondition, headers); logger.info("synchronizeUser-last-data" + data); } } } }