diff --git a/src/weaver/interfaces/dito/job/WorkflowAuthModelingCronJob.java b/src/weaver/interfaces/dito/job/WorkflowAuthModelingCronJob.java deleted file mode 100644 index 3e3faa5b..00000000 --- a/src/weaver/interfaces/dito/job/WorkflowAuthModelingCronJob.java +++ /dev/null @@ -1,189 +0,0 @@ -package weaver.interfaces.dito.job; - -import weaver.conn.RecordSet; -import weaver.general.BaseBean; -import weaver.general.TimeUtil; -import weaver.interfaces.schedule.BaseCronJob; -import weaver.share.ShareManager; - -import java.util.*; - -/** - * @version 1.0 - * @Title ecology-9 - * @Company 泛微软件 - * @CreateDate 2022/11/14 - * @Description ${description} - * @Author Lee - */ -public class WorkflowAuthModelingCronJob extends BaseCronJob { - @Override - public void execute() { - BaseBean bb = new BaseBean(); - bb.writeLog("start WorkflowAuthModelingCronJob"); - RecordSet rs = new RecordSet(); - //查询模块id - String formModeIdSql = "SELECT DISTINCT formmodeid FROM uf_workflow_auth"; - rs.execute(formModeIdSql); - String formModeId = ""; - if (rs.next()) { - formModeId = rs.getString("formmodeid"); - } - /* - 查询出所有E9有效流程id,Set - */ - //根据流程id查询出所有创建人id,封装成Map - ShareManager shareManager = new ShareManager(); - Set baseWorkflowIdSet = new HashSet<>(); - Map> baseWorkflowMap = new HashMap<>(); - Map baseWorkflowName = new HashMap<>(); - String baseWorkflowSql = "SELECT id,workflowname FROM workflow_base WHERE ISVALID = 1"; - rs.execute(baseWorkflowSql); - while (rs.next()) { - String workflowId = rs.getString("id"); - String workflowname = rs.getString("workflowname"); - 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); - } - bb.writeLog("baseWorkflowMap", baseWorkflowMap.toString()); - - /* - 查询出所有建模表流程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<>(); - while (rs.next()) { - String workflowId = rs.getString("id"); - modelWorkflowIdSet.add(workflowId); - String modelUserSql = "SELECT userselect as userId FROM uf_workflow_auth WHERE workflowselect=?"; - rs2.executeQuery(modelUserSql, workflowId); - Set userIdList = new HashSet<>(); - while (rs2.next()) { - userIdList.add(rs2.getString("userId")); - } - modeWorkflowMap.put(workflowId, userIdList); - } - bb.writeLog("modeWorkflowMap", modeWorkflowMap.toString()); - /* - 建模表流程Set与E9有效流程Set取集 - */ - //取交集,表示需要更新的流程。再用建模表与交集取差集,表示建模表要删除的流程。E9集合与此交集的差集表示要新增的流程 - Set updateSet = new HashSet<>(baseWorkflowIdSet); - updateSet.retainAll(modelWorkflowIdSet); - bb.writeLog("updateSet", updateSet.size()); - Set deleteSet = new HashSet<>(modelWorkflowIdSet); - deleteSet.removeAll(updateSet); - bb.writeLog("deleteSet", deleteSet.size()); - Set addSet = new HashSet<>(baseWorkflowIdSet); - addSet.removeAll(updateSet); - bb.writeLog("addSet", addSet.size()); - deleteWorkflow(bb, deleteSet); - updateWorkflow(bb, updateSet, baseWorkflowMap, modeWorkflowMap, baseWorkflowName,formModeId); - addWorkflow(bb, addSet, baseWorkflowMap, baseWorkflowName,formModeId); - } - - /** - * 新增流程 - * @param bb - * @param addSet - * @param baseWorkflowMap - * @param baseWorkflowName - * @param formModeId - */ - private void addWorkflow(BaseBean bb, Set addSet, Map> baseWorkflowMap, Map baseWorkflowName, String formModeId) { - bb.writeLog("addWorkflow-----start"); - 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,workcode) values (?,?,?,?,?,?,?,?)"; - for (String workflowId : addSet) { - Set userIds = baseWorkflowMap.get(workflowId); - for (String addUserId : userIds) { - String workflowName = baseWorkflowName.get(workflowId); - String workCodeQuery = "SELECT workcode FROM hrmresource WHERE id=?"; - rs2.executeQuery(workCodeQuery, addUserId); - if (rs2.next()) { - String workCode = rs2.getString("workcode"); - rs.executeUpdate(addSql, addUserId, 0, formModeId, currentDate, onlyCurrentTime, workflowId, workflowName, workCode); - } - } - } - - } - - /** - * 更新建模表数据 - * @param bb - * @param updateSet - * @param baseWorkflowMap - * @param modeWorkflowMap - * @param baseWorkflowName - * @param formModeId - */ - private void updateWorkflow(BaseBean bb, Set updateSet, Map> baseWorkflowMap, Map> modeWorkflowMap, Map baseWorkflowName, String formModeId) { - bb.writeLog("updateWorkflow-----start"); - RecordSet rs = new RecordSet(); - RecordSet rs2 = new RecordSet(); - String currentTime = TimeUtil.getCurrentTimeString(); - 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); - //交集,更新为可用 - HashSet diffUsers = new HashSet<>(baseUsers); - String updateSql = "UPDATE uf_workflow_auth SET modedatamodifydatetime=?,effective=0 WHERE userselect=? AND workflowselect=?"; - diffUsers.retainAll(modeUsers); - for (String diffUserId : diffUsers) { - rs.executeUpdate(updateSql, currentTime, diffUserId, workflowId); - } - //建模users与交集取差集,删除 - HashSet deleteUsers = new HashSet<>(modeUsers); - deleteUsers.removeAll(diffUsers); - String deleteSql = "UPDATE uf_workflow_auth SET modedatamodifydatetime=?,effective=1 WHERE userselect=? AND workflowselect=?"; - for (String deleteUserId : deleteUsers) { - rs.executeUpdate(deleteSql, currentTime, deleteUserId, workflowId); - } - - //e9users与交集取差集,新增 - HashSet addUsers = new HashSet<>(baseUsers); - addUsers.removeAll(diffUsers); - String addSql = "INSERT INTO uf_workflow_auth (userselect,effective,formmodeid,modedatacreatedate,modedatacreatetime,workflowselect,workflowname,workcode) values (?,?,?,?,?,?,?,?)"; - for (String addUserId : addUsers) { - String workCodeQuery = "SELECT workcode FROM hrmresource WHERE id=?"; - rs2.executeQuery(workCodeQuery, addUserId); - if (rs2.next()) { - String workcode = rs2.getString("workcode"); - rs.executeUpdate(addSql, addUserId, 0, formModeId, currentDate, onlyCurrentTime, workflowId, workflowName, workcode); - } - } - } - } - - /** - * 删除建模表数据(假删) - * - * @param baseBean - * @param deleteSet - */ - private void deleteWorkflow(BaseBean baseBean, Set deleteSet) { - RecordSet rs = new RecordSet(); - String currentTime = TimeUtil.getCurrentTimeString(); - String sql = "UPDATE uf_workflow_auth SET modedatamodifydatetime=?,effective=1 WHERE workflowselect=?"; - for (String id : deleteSet) { - boolean flag = rs.executeUpdate(sql, currentTime, id); - baseBean.writeLog("deleteWorkflow-----" + id + "------" + flag); - } - } -} diff --git a/src/weaver/interfaces/dito/job/WorkflowSyncCornJob.java b/src/weaver/interfaces/dito/job/WorkflowSyncCornJob.java new file mode 100644 index 00000000..4176f34e --- /dev/null +++ b/src/weaver/interfaces/dito/job/WorkflowSyncCornJob.java @@ -0,0 +1,150 @@ +package weaver.interfaces.dito.job; + +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import weaver.conn.RecordSet; +import weaver.general.Util; +import weaver.interfaces.dito.comInfo.PropBean; +import weaver.interfaces.dito.util.HttpUtils; +import weaver.interfaces.schedule.BaseCronJob; + +import java.util.*; + +import static com.engine.dito.ssologin.constant.DitoConstant.*; + +/** + * @version 1.0 + * @Title ecology-9 + * @Company 泛微软件 + * @CreateDate 2022/12/26 + * @Description 流程同步建模 + * @Author Lee + */ +public class WorkflowSyncCornJob extends BaseCronJob { + private static final Log logger = LogFactory.getLog(WorkflowSyncCornJob.class); + + @Override + public void execute() { + logger.info("WorkflowSyncModeCornJob start"); + try { + String workflowSyncFormModeId = PropBean.getUfPropValue("workflowSyncFormModeId"); + RecordSet rs = new RecordSet(); + //建模表有效流程id + String modelWorkflowSql = "SELECT workflowselect,workflowname FROM uf_sync_workflow"; + rs.execute(modelWorkflowSql); + HashSet modeWorkflowSet = new HashSet<>(); + HashMap modeWorkflowInfo = new HashMap<>(); + while (rs.next()) { + String modeWorkFlowId = rs.getString("workflowselect"); + String modeWorkFlowName = rs.getString("workflowname"); + modeWorkflowSet.add(modeWorkFlowId); + modeWorkflowInfo.put(modeWorkFlowId, modeWorkFlowName); + } + + //系统有效流程id + String baseWorkflowSql = "SELECT id,workflowname FROM workflow_base WHERE ISVALID = 1"; + rs.execute(baseWorkflowSql); + HashSet workflowSet = new HashSet<>(); + HashMap workflowInfo = new HashMap<>(); + while (rs.next()) { + String workflowId = rs.getString("id"); + String workflowName = rs.getString("workflowname"); + workflowInfo.put(workflowId, workflowName); + workflowSet.add(workflowId); + } + + //系统有效流程新增或修改,无法判断流程更改了什么,新增后再更新 + syncWorkflow(ACTION_TYPE_ADD, workflowSyncFormModeId, workflowSet, modeWorkflowSet, workflowInfo); + syncWorkflow(ACTION_TYPE_UPDATE, workflowSyncFormModeId, workflowSet, modeWorkflowSet, workflowInfo); + //建模表的差集需要删除 + Set deleteSet = new HashSet<>(modeWorkflowSet); + deleteSet.removeAll(workflowSet); + if (deleteSet.size() != 0) { + syncWorkflow(ACTION_TYPE_DELETE, workflowSyncFormModeId, deleteSet, modeWorkflowSet, modeWorkflowInfo); + } + } catch (Exception e) { + logger.info("WorkflowSyncModeCornJob:" + e.getMessage()); + } + } + + /** + * 建模表流程同步 + * + * @param actionType + * @param insertList + * @param updateList + * @param deleteList + */ + private void syncModeWorkflow(String actionType, List insertList, List updateList, List deleteList) { + RecordSet recordSet = new RecordSet(); + if (actionType.equals(ACTION_TYPE_ADD) && CollectionUtils.isNotEmpty(insertList)) { + String insertSql = "INSERT INTO uf_sync_workflow (formmodeid,workflowselect,workflowname) values (?,?,?)"; + recordSet.executeBatchSql(insertSql, insertList); + } else if (actionType.equals(ACTION_TYPE_UPDATE) && CollectionUtils.isNotEmpty(updateList)) { + String updateSql = "UPDATE uf_sync_workflow set workflowname=? where workflowselect=?"; + recordSet.executeBatchSql(updateSql, updateList); + } else if (actionType.equals(ACTION_TYPE_DELETE) && CollectionUtils.isNotEmpty(deleteList)) { + String deleteSql = "DELETE FROM uf_sync_workflow where workflowselect=?"; + for (String deleteID : deleteList) { + recordSet.executeUpdate(deleteSql, deleteID); + } + } + } + + /** + * @param actionType + * @param updateOrAddSet + * @param modeWorkflowSet + * @param workflowInfo 流程信息 + */ + private void syncWorkflow(String actionType, String workflowSyncFormModeId, Set updateOrAddSet, HashSet modeWorkflowSet, HashMap workflowInfo) { + String center = PropBean.getUfPropValue("newWorkflowCenter"); + String bpm_app_workflowurl = PropBean.getUfPropValue("bpm_app_workflowurl"); + String synchronizeFlowUrl = PropBean.getUfPropValue("synchronizeFlowUrl"); + String accountName = PropBean.getUfPropValue("username"); + String password = PropBean.getUfPropValue("passwd"); + RecordSet rs = new RecordSet(); + List insertList = new ArrayList<>(); + List updateList = new ArrayList<>(); + List deleteList = new ArrayList<>(); + for (String workflowId : updateOrAddSet) { + //查询要推送到哪个目录下 + String cataCodeSql = "select cataCodeName from uf_syncCataCode where flowCode=?"; + rs.executeQuery(cataCodeSql, workflowId); + String cataCode = ""; + if (rs.next()) { + cataCode = Util.null2String(rs.getString("cataCodeName")); + } + Map workflowMap = new HashMap<>(); + workflowMap.put("flowCode", workflowId); + String workflowName = workflowInfo.get(workflowId); + workflowMap.put("flowName", workflowName); + workflowMap.put("actionType", actionType); + workflowMap.put("cataCode", cataCode); + 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); + + HashMap headers = new HashMap<>(); + headers.put("Authorization", "Basic " + Base64.getUrlEncoder().encodeToString((accountName + ":" + password).getBytes())); + String data = HttpUtils.doPost(synchronizeFlowUrl, workflowMap, headers); + logger.info("syncWorkflow:" + workflowId + data); + if (actionType.equals(ACTION_TYPE_ADD) && !modeWorkflowSet.contains(workflowId)) { + List list = new ArrayList<>(); + list.add(workflowSyncFormModeId); + list.add(workflowId); + list.add(workflowName); + insertList.add(list); + } else if (actionType.equals(ACTION_TYPE_UPDATE)) { + List list = new ArrayList<>(); + list.add(workflowName); + list.add(workflowId); + updateList.add(list); + } else if (actionType.equals(ACTION_TYPE_DELETE)) { + deleteList.add(workflowId); + } + } + syncModeWorkflow(actionType, insertList, updateList, deleteList); + } +} diff --git a/src/weaver/interfaces/dito/job/WorkflowSyncCronJob.java b/src/weaver/interfaces/dito/job/WorkflowSyncCronJob.java deleted file mode 100644 index a1c3b97c..00000000 --- a/src/weaver/interfaces/dito/job/WorkflowSyncCronJob.java +++ /dev/null @@ -1,305 +0,0 @@ -package weaver.interfaces.dito.job; - -import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang.StringUtils; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import weaver.conn.RecordSet; -import weaver.conn.util.IdGenerator; -import weaver.general.BaseBean; -import weaver.general.TimeUtil; -import weaver.general.Util; -import weaver.interfaces.dito.comInfo.PropBean; -import weaver.interfaces.schedule.BaseCronJob; -import weaver.interfaces.dito.util.HttpUtils; - -import java.util.*; - -import static com.engine.dito.ssologin.constant.DitoConstant.*; - -/** - * @version 1.0 - * @Title ecology-9 - * @Company 泛微软件 - * @CreateDate 2022/10/27 - * @Description 新建流程推送门(包含发起人权限) - * @Author Lee - */ -public class WorkflowSyncCronJob extends BaseCronJob { - /** - * 推送类型(0全量、1增量) - */ - private String syncType; - private static final Log logger = LogFactory.getLog(WorkflowSyncCronJob.class); - String bpm_app_workflowurl = PropBean.getUfPropValue("bpm_app_workflowurl"); - @Override - public void execute() { - BaseBean bb = new BaseBean(); - bb.writeLog("WorkflowSyncCronJob start"); - try { - //推送流程url - String synchronizeFlowUrl = PropBean.getUfPropValue("synchronizeFlowUrl"); -// String synchronizeFlowUrl = bb.getPropValue("PORTAL_INFO", "synchronizeFlowUrl"); - //同步人员权限url - String synchronizeUserUrl = PropBean.getUfPropValue("synchronizeUserUrl"); -// String synchronizeUserUrl = bb.getPropValue("PORTAL_INFO", "synchronizeUserUrl"); - //新建流程推送到目录code - String center = PropBean.getUfPropValue("newWorkflowCenter"); - String workflowAuthTable = PropBean.getUfPropValue("workflowAuthTable"); - String timeNodeTable = PropBean.getUfPropValue("timeNodeTable"); - String accountName = PropBean.getUfPropValue("username"); - String password = PropBean.getUfPropValue("passwd"); - String timeNodeFormModeId = PropBean.getUfPropValue("timeNodeFormModeId"); - //全量同步使用全量同步方法 - if (SYNC_ALL.equals(syncType)) { - bb.writeLog("WorkflowSyncCronJob ALL start"); - String currentTime = TimeUtil.getCurrentTimeString(); - allSynchronizeWorkflow(bb, synchronizeFlowUrl, synchronizeUserUrl, center, workflowAuthTable, accountName, password); - writeTimeNode(bb, timeNodeTable, currentTime, SYNC_ALL, TIME_NODE_USE_WORKFLOW_SYNC, timeNodeFormModeId); - } - //增量同步使用增量同步方法 - if (SYNC_INCREMENT.equals(syncType)) { - bb.writeLog("WorkflowSyncCronJob INCREMENT start"); - String currentTime = TimeUtil.getCurrentTimeString(); - IncrementSynchronizeWorkflow(bb, synchronizeFlowUrl, synchronizeUserUrl, center, workflowAuthTable, timeNodeTable, accountName, password); - writeTimeNode(bb, timeNodeTable, currentTime, SYNC_INCREMENT, TIME_NODE_USE_WORKFLOW_SYNC, timeNodeFormModeId); - } - } catch (Exception e) { - bb.writeLog("流程推送异常", e.getMessage()); - } - } - - - // 增量同步 - private void IncrementSynchronizeWorkflow(BaseBean bb, String synchronizeFlowUrl, String synchronizeUserUrl, String center, String workflowAuthTable, String timeNodeTable, String accountName, String password) { - RecordSet recordSet = new RecordSet(); - //查询时间节点表,上次流程推送增量同步的时间 - String timeSql = "select timenode from " + timeNodeTable + " where type=? and useto=? order by timenode desc"; - recordSet.executeQuery(timeSql, SYNC_INCREMENT, TIME_NODE_USE_WORKFLOW_SYNC); - String preTime = ""; - if (recordSet.next()) { - preTime = recordSet.getString("timenode"); - } - syncWorkflowByCondition(synchronizeFlowUrl, synchronizeUserUrl, center, workflowAuthTable, accountName, password, preTime); - } - - // 全量同步 - private void allSynchronizeWorkflow(BaseBean bb, String synchronizeFlowUrl, String synchronizeUserUrl, String center, String workflowAuthTable, String accountName, String password) { - syncWorkflowByCondition(synchronizeFlowUrl, synchronizeUserUrl, center, workflowAuthTable, accountName, password, null); - } - - /** - * 根据不同条件请求同步方法 - */ - private void syncWorkflowByCondition(String synchronizeFlowUrl, String synchronizeUserUrl, String center, String workflowAuthTable, String accountName, String password, String timeCondition) { - logger.info("syncWorkflow-start:" + TimeUtil.getCurrentTimeString()); - RecordSet recordSet = new RecordSet(); - RecordSet recordSet2 = new RecordSet(); - RecordSet recordSet3 = new RecordSet(); - ArrayList> addWorkflowList = new ArrayList<>(); - ArrayList> delWorkflowList = new ArrayList<>(); - List>> addUserList = new LinkedList<>(); - List>> delUserList = new LinkedList<>(); - //查询建模所有流程 - String workflowSql = "SELECT DISTINCT workflowselect as flowCode,workflowname as flowName,effective FROM " + workflowAuthTable + - " WHERE effective IN (SELECT DISTINCT effective FROM " + workflowAuthTable + ")"; - if (StringUtils.isNotEmpty(timeCondition)) { - String[] time = timeCondition.split(" "); - timeCondition = "'" + timeCondition + "'"; - workflowSql += " AND (modedatamodifydatetime >= " + timeCondition + " OR modedatacreatedate >= '" + time[0] + "' AND modedatacreatetime>= '" + time[1] + "')"; - } - recordSet.execute(workflowSql); - //区分有效和无效的流程 - while (recordSet.next()) { - String effective = recordSet.getString("effective"); - String flowCode = recordSet.getString("flowCode"); - String flowName = recordSet.getString("flowName"); - String cataCode = ""; - //查询要推送到哪个目录下 - String cataCodeSql = "select cataCodeName from uf_syncCataCode where flowCode=?"; - recordSet3.executeQuery(cataCodeSql, flowCode); - if (recordSet3.next()) { - cataCode = Util.null2String(recordSet3.getString("cataCodeName")); - } - if (EFFECTIVE_YES.equals(effective)) { - //拼接有效流程请求参数 - concatWorkflowCondition(center, cataCode, flowCode, flowName, ACTION_TYPE_ADD, addWorkflowList); - //有效流程关联的人员参数拼接 - getUserConditionByWorkflow(workflowAuthTable, center, cataCode, flowCode, flowName, ACTION_TYPE_ADD_USER, addUserList, timeCondition, effective); - } else if (EFFECTIVE_NO.equals(effective)) { - //拼接无效流程请求参数,如果有流程还有效则不删除 - if (!workflowHasEffective(workflowAuthTable, recordSet2, flowCode)) { - concatWorkflowCondition(center, cataCode, flowCode, flowName, ACTION_TYPE_DELETE, delWorkflowList); - } - //无效流程关联的人员参数拼接 - getUserConditionByWorkflow(workflowAuthTable, center, cataCode, flowCode, flowName, ACTION_TYPE_DELETE_USER, delUserList, timeCondition, effective); - } - } - logger.info("syncWorkflow-end:" + TimeUtil.getCurrentTimeString()); - HashMap headers = new HashMap<>(); - headers.put("Authorization", "Basic " + Base64.getUrlEncoder().encodeToString((accountName + ":" + password).getBytes())); - //调用流程同步方法 - if (CollectionUtils.isNotEmpty(addWorkflowList)) { - for (Map workflowMap : addWorkflowList) { - String data = HttpUtils.doPost(synchronizeFlowUrl, workflowMap, headers); - logger.info("addworkflow" + workflowMap.get("flowCode") + data); - //无法判断流程的更改类型,所以在流程变动同时修改 - workflowMap.put("actionType", ACTION_TYPE_UPDATE); - data = HttpUtils.doPost(synchronizeFlowUrl, workflowMap, headers); - logger.info("updateworkflow" + workflowMap.get("flowCode") + data); - } - } - logger.info("delUserList-start:" + TimeUtil.getCurrentTimeString()); - logger.info("delUserList-size:" + delUserList.size()); - //删除人员要在删除流程之前执行 - if (CollectionUtils.isNotEmpty(delUserList)) { - addOrDeleteUser(synchronizeUserUrl, delUserList, headers); - } - logger.info("delUserList-end:" + TimeUtil.getCurrentTimeString()); - logger.info("delWorkflowList-start:" + TimeUtil.getCurrentTimeString()); - if (CollectionUtils.isNotEmpty(delWorkflowList)) { - for (Map workflowMap : delWorkflowList) { - String data = HttpUtils.doPost(synchronizeFlowUrl, workflowMap, headers); - logger.info("deleteworkflow" + workflowMap.get("staffCode") + data); - } - } - logger.info("delWorkflowList-end:" + TimeUtil.getCurrentTimeString()); - logger.info("addUserList-start:" + TimeUtil.getCurrentTimeString()); - logger.info("addUserList-size:" + addUserList.size()); - if (CollectionUtils.isNotEmpty(addUserList)) { - addOrDeleteUser(synchronizeUserUrl, addUserList, headers); - } - logger.info("addUserList-end:" + TimeUtil.getCurrentTimeString()); - } - - /** - * 同步删除或者新增人员 - * - * @param synchronizeUserUrl - * @param headers - */ - private void addOrDeleteUser(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("staffCode", stringBuilder.toString()); - logger.info("synchronizeUser-start" + TimeUtil.getCurrentTimeString()); - String data = HttpUtils.doPost(synchronizeUserUrl, userCondition, headers); - logger.info("synchronizeUser-data" + data); - logger.info("synchronizeUser-end" + TimeUtil.getCurrentTimeString()); - stringBuilder.delete(0, stringBuilder.length()); - } - stringBuilder.append(staffCode).append("|"); - } - //最后字段可能没有超限,再同步最后的人员 - if (stringBuilder.length() < 10000) { - userCondition.put("staffCode", stringBuilder.toString()); - logger.info("synchronizeUser-last-start" + TimeUtil.getCurrentTimeString()); - String data = HttpUtils.doPost(synchronizeUserUrl, userCondition, headers); - logger.info("synchronizeUser-last-data" + data); - logger.info("synchronizeUser-last-end" + TimeUtil.getCurrentTimeString()); - logger.info("addOrDeleteUser-" + data); - } - } - } - - /** - * 查询还在使用中的流程 - * - * @param workflowAuthTable - * @param recordSet2 - * @param flowCode - * @return - */ - private boolean workflowHasEffective(String workflowAuthTable, RecordSet recordSet2, String flowCode) { - String querySql = "SELECT count(*) FROM " + workflowAuthTable + " WHERE workflowselect=? AND effective=?"; - recordSet2.executeQuery(querySql, flowCode, EFFECTIVE_YES); - return recordSet2.next(); - } - - /** - * 组装流程同步API请求参数 - * - * @param cataCode - * @param flowCode - * @param flowName - * @param actionType - * @param workflowList - */ - private void concatWorkflowCondition(String center, String cataCode, String flowCode, String flowName, String actionType, ArrayList> workflowList) { - Map workflowMap = new HashMap<>(); - workflowMap.put("flowCode", flowCode); - workflowMap.put("flowName", flowName); - workflowMap.put("actionType", actionType); - workflowMap.put("cataCode", cataCode); - workflowMap.put("center", center); - workflowMap.put("urlPc", "/bpm/workflow/request/CreateRequestForward.jsp?workflowid=" + flowCode); - workflowMap.put("urlApp", bpm_app_workflowurl+"/spa/workflow/static4mobileform/index.html#/req?iscreate=1&workflowid=" + flowCode); - workflowList.add(workflowMap); - } - - /** - * 组装人员同步API请求参数 - * - * @param workflowAuthTable - * @param cataCode - * @param flowCode - * @param flowName - * @param actionType - * @param timeCondition - */ - private void getUserConditionByWorkflow(String workflowAuthTable, String center, String cataCode, String flowCode, String flowName, String actionType, List>> userLists, String timeCondition, String effective) { - List> userList = new LinkedList<>(); - Map userCondition = new HashMap<>(); - Map staffCodeMap = new HashMap<>(); - HashSet staffCodeSet = new HashSet<>(); - String userSql = "SELECT workcode as staffCode FROM " + workflowAuthTable + " WHERE workflowselect=? AND effective=?"; - RecordSet rs = new RecordSet(); - rs.executeQuery(userSql, flowCode, effective); - while (rs.next()) { - staffCodeSet.add(rs.getString("staffCode")); - } - staffCodeMap.put("staffCodeSet", staffCodeSet); - userList.add(staffCodeMap); - //组建人员同步map - userCondition.put("flowCode", flowCode); - userCondition.put("flowName", flowName); - //同步所需参数一并拼接 - userCondition.put("actionType", actionType); - userCondition.put("center", center); - userCondition.put("cataCode", cataCode); - Map userMap = new HashMap<>(); - userMap.put("userCondition", userCondition); - userList.add(userMap); - userLists.add(userList); - } - - /** - * 将同步时间写入时间节点表 - * - * @param timeNodeTable 表名 - * @param syncType 同步类型 - * @param timeNodeUse 同步作用 - * @param formmodeid 模块id - */ - private void writeTimeNode(BaseBean bb, String timeNodeTable, String currentTime, String syncType, String timeNodeUse, String formmodeid) throws Exception { - RecordSet recordSet = new RecordSet(); - String sql = ""; - String dbType = recordSet.getDBType(); - if ("mysql".equalsIgnoreCase(dbType)) { - sql = "insert into " + timeNodeTable + " (id,formmodeid,type,timenode,useto) values (?,?,?,?,?)"; - } else if ("oracle".equalsIgnoreCase(dbType)) { - sql = "insert into " + timeNodeTable + " (id,formmodeid,type,timenode,useto) values (?,?,?,?,?)"; - } else if ("sqlserver".equalsIgnoreCase(dbType)) { - sql = "SET IDENTITY_INSERT " + timeNodeTable + " ON insert into " + timeNodeTable + " (id,formmodeid,type,timenode,useto) values (?,?,?,?,?)"; - } - boolean b = recordSet.executeUpdate(sql, IdGenerator.getNextId(timeNodeTable), formmodeid, syncType, currentTime, timeNodeUse); - bb.writeLog("writeTimeNode result:" + b); - } -} diff --git a/src/weaver/interfaces/dito/job/WorkflowUserCronJob.java b/src/weaver/interfaces/dito/job/WorkflowUserCronJob.java new file mode 100644 index 00000000..19cb583d --- /dev/null +++ b/src/weaver/interfaces/dito/job/WorkflowUserCronJob.java @@ -0,0 +1,387 @@ +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; + +/** + * @version 1.0 + * @Title ecology-9 + * @Company 泛微软件 + * @CreateDate 2022/11/14 + * @Description 流程及人员权限同步建模 + * @Author Lee + */ +public class WorkflowUserCronJob extends BaseCronJob { + private static final Log logger = LogFactory.getLog(WorkflowUserCronJob.class); + + @Override + public void execute() { + BaseBean bb = new BaseBean(); + bb.writeLog("start WorkflowAuthModelingCronJob"); + try { + 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"); + + RecordSet rs = new RecordSet(); + /* + 查询出所有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); + bb.writeLog("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); + logger.info("deleteWorkflowByHttp:" + workflowId); + String data = HttpUtils.doPost(synchronizeFlowUrl, workflowMap, headers); + logger.info("deleteWorkflowByHttp-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) { + bb.writeLog("addWorkflow-----start"); + 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); + } + bb.writeLog("addWorkflow-----", lists.size()); + 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,则跳过 + bb.writeLog("workflowId-", workflowId); + bb.writeLog("baseUsers-", baseUsers.size()); + bb.writeLog("modeUsers-", modeUsers.size()); + if (baseUsers.containsAll(modeUsers) && baseUsers.size() == modeUsers.size()) { + continue; + } + //有变动的流程 + needUpdateSet.add(workflowId); + bb.writeLog("modeUsers-", needUpdateSet.size()); + + //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); + bb.writeLog("deleteUsers-", deleteUsers.size()); + 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); + } + bb.writeLog("deleteUsers-", deleteUsers.size()); + boolean b1 = rs.executeBatchSql(deleteSql, deleteLists); + bb.writeLog("deleteUsers-FLAG", b1); + + } + } + 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); + logger.info("deleteWorkflow-----" + b); + } + } + + /** + * 组装人员同步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()) { + staffCodeSet.add(rs.getString("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()); + logger.info("synchronizeUser-start" + TimeUtil.getCurrentTimeString()); + String data = HttpUtils.doPost(synchronizeUserUrl, userCondition, headers); + logger.info("synchronizeUser-data" + data); + logger.info("synchronizeUser-end" + TimeUtil.getCurrentTimeString()); + stringBuilder.delete(0, stringBuilder.length()); + } + stringBuilder.append(staffCode).append("|"); + } + //最后字段可能没有超限,再同步最后的人员 + if (stringBuilder.length() < 10000) { + userCondition.put("staffIds", stringBuilder.toString()); + logger.info("synchronizeUser-last-start" + TimeUtil.getCurrentTimeString()); + String data = HttpUtils.doPost(synchronizeUserUrl, userCondition, headers); + logger.info("synchronizeUser-last-data" + data); + logger.info("synchronizeUser-last-end" + TimeUtil.getCurrentTimeString()); + logger.info("addOrDeleteUser-" + data); + } + } + } +}