流程推送优化

feature-LeeD-20221025
李栋 2 years ago
parent 18625f6eaa
commit 368aecf920

@ -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");
}
/*
E9idSet
*/
//根据流程id查询出所有创建人id,封装成Map<String,Set>
ShareManager shareManager = new ShareManager();
Set<String> baseWorkflowIdSet = new HashSet<>();
Map<String, Set<String>> baseWorkflowMap = new HashMap<>();
Map<String, String> 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<String> userIdList = new HashSet<>(Arrays.asList(userIds.split(",")));
baseWorkflowMap.put(workflowId, userIdList);
baseWorkflowName.put(workflowId, workflowname);
}
bb.writeLog("baseWorkflowMap", baseWorkflowMap.toString());
/*
id,Set
idMap<String,Set>
*/
RecordSet rs2 = new RecordSet();
String modelWorkflowSql = "SELECT DISTINCT workflowselect as id FROM uf_workflow_auth";
rs.execute(modelWorkflowSql);
Set<String> modelWorkflowIdSet = new HashSet<>();
Map<String, Set<String>> 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<String> userIdList = new HashSet<>();
while (rs2.next()) {
userIdList.add(rs2.getString("userId"));
}
modeWorkflowMap.put(workflowId, userIdList);
}
bb.writeLog("modeWorkflowMap", modeWorkflowMap.toString());
/*
SetE9Set
*/
//取交集,表示需要更新的流程。再用建模表与交集取差集表示建模表要删除的流程。E9集合与此交集的差集表示要新增的流程
Set<String> updateSet = new HashSet<>(baseWorkflowIdSet);
updateSet.retainAll(modelWorkflowIdSet);
bb.writeLog("updateSet", updateSet.size());
Set<String> deleteSet = new HashSet<>(modelWorkflowIdSet);
deleteSet.removeAll(updateSet);
bb.writeLog("deleteSet", deleteSet.size());
Set<String> 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<String> addSet, Map<String, Set<String>> baseWorkflowMap, Map<String, String> 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<String> 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<String> updateSet, Map<String, Set<String>> baseWorkflowMap, Map<String, Set<String>> modeWorkflowMap, Map<String, String> 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<String> baseUsers = baseWorkflowMap.get(workflowId);
Set<String> modeUsers = modeWorkflowMap.get(workflowId);
//交集,更新为可用
HashSet<String> 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<String> 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<String> 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<String> 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);
}
}
}

@ -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<String> modeWorkflowSet = new HashSet<>();
HashMap<String, String> 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<String> workflowSet = new HashSet<>();
HashMap<String, String> 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<String> 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<List> insertList, List<List> updateList, List<String> 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<String> updateOrAddSet, HashSet<String> modeWorkflowSet, HashMap<String, String> 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<List> insertList = new ArrayList<>();
List<List> updateList = new ArrayList<>();
List<String> 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<String, Object> 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<String, String> 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<String> list = new ArrayList<>();
list.add(workflowSyncFormModeId);
list.add(workflowId);
list.add(workflowName);
insertList.add(list);
} else if (actionType.equals(ACTION_TYPE_UPDATE)) {
List<String> 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);
}
}

@ -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 {
/**
* (01)
*/
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<Map<String, Object>> addWorkflowList = new ArrayList<>();
ArrayList<Map<String, Object>> delWorkflowList = new ArrayList<>();
List<List<Map<String, Object>>> addUserList = new LinkedList<>();
List<List<Map<String, Object>>> 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<String, String> headers = new HashMap<>();
headers.put("Authorization", "Basic " + Base64.getUrlEncoder().encodeToString((accountName + ":" + password).getBytes()));
//调用流程同步方法
if (CollectionUtils.isNotEmpty(addWorkflowList)) {
for (Map<String, Object> 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<String, Object> 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<List<Map<String, Object>>> userLists, HashMap<String, String> headers) {
for (List<Map<String, Object>> userList : userLists) {
Map<String, Object> staffCodeMap = userList.get(0);
Map<String, Object> userConditionMap = userList.get(1);
Map<String, Object> userCondition = (Map<String, Object>) userConditionMap.get("userCondition");
HashSet<String> staffCodeSet = (HashSet<String>) 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<Map<String, Object>> workflowList) {
Map<String, Object> 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<List<Map<String, Object>>> userLists, String timeCondition, String effective) {
List<Map<String, Object>> userList = new LinkedList<>();
Map<String, Object> userCondition = new HashMap<>();
Map<String, Object> staffCodeMap = new HashMap<>();
HashSet<String> 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<String, Object> 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);
}
}

@ -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();
/*
E9idSet
*/
//根据流程id查询出所有创建人id,封装成Map<String,Set>
ShareManager shareManager = new ShareManager();
Set<String> baseWorkflowIdSet = new HashSet<>();
Map<String, Set<String>> baseWorkflowMap = new HashMap<>();
Map<String, String> baseWorkflowName = new HashMap<>();
Map<String, String> 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<String> userIdList = new HashSet<>(Arrays.asList(userIds.split(",")));
baseWorkflowMap.put(workflowId, userIdList);
baseWorkflowName.put(workflowId, workflowname);
baseWorkflowCataCode.put(workflowId, cataCodeName);
}
/*
id,Set
idMap<String,Set>
*/
RecordSet rs2 = new RecordSet();
String modelWorkflowSql = "SELECT DISTINCT workflowselect as id FROM uf_workflow_auth";
rs.execute(modelWorkflowSql);
Set<String> modelWorkflowIdSet = new HashSet<>();
Map<String, Set<String>> modeWorkflowMap = new HashMap<>();
Map<String, String> modeWorkflowCataCode = new HashMap<>();
Map<String, String> 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<String> 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);
}
/*
SetE9Set
*/
HashMap<String, String> headers = new HashMap<>();
headers.put("Authorization", "Basic " + Base64.getUrlEncoder().encodeToString((accountName + ":" + password).getBytes()));
Set<String> updateSet = new HashSet<>(baseWorkflowIdSet);
updateSet.retainAll(modelWorkflowIdSet);
Set<String> deleteSet = new HashSet<>(modelWorkflowIdSet);
deleteSet.removeAll(updateSet);
Set<String> addSet = new HashSet<>(baseWorkflowIdSet);
addSet.removeAll(updateSet);
//人员权限新增同步
if (addSet.size() != 0) {
addWorkflow(bb, addSet, baseWorkflowMap, baseWorkflowName, formModeId);
List<List<Map<String, Object>>> addUserList = new LinkedList<>();
getUserConditionByWorkflow(center, addSet, baseWorkflowName, baseWorkflowCataCode, addUserList);
syncUser(synchronizeUserUrl, addUserList, headers);
}
//人员权限修改同步
if (updateSet.size() != 0) {
HashSet<String> 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<List<Map<String, Object>>> 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<String> needUpdateSet, Map<String, String> modeWorkflowName, Map<String, String> modeWorkflowCataCode, HashMap<String, String> headers) {
String bpm_app_workflowurl = PropBean.getUfPropValue("bpm_app_workflowurl");
String synchronizeFlowUrl = PropBean.getUfPropValue("synchronizeFlowUrl");
for (String workflowId : needUpdateSet) {
Map<String, Object> 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<String> addSet, Map<String, Set<String>> baseWorkflowMap, Map<String, String> 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<List> lists = new ArrayList<>();
Set<String> 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<Object> 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<String> updateWorkflow(BaseBean bb, Set<String> updateSet, Map<String, Set<String>> baseWorkflowMap, Map<String, Set<String>> modeWorkflowMap, Map<String, String> baseWorkflowName, String formModeId) {
bb.writeLog("updateWorkflow-----start");
HashSet<String> 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<String> baseUsers = baseWorkflowMap.get(workflowId);
Set<String> 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<List> addLists = new ArrayList<>();
HashSet<String> 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<Object> 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<String> deleteUsers = new HashSet<>(modeUsers);
deleteUsers.removeAll(baseUsers);
bb.writeLog("deleteUsers-", deleteUsers.size());
if (deleteUsers.size() != 0) {
List<List> deleteLists = new ArrayList<>();
String deleteSql = "DELETE FROM uf_workflow_auth WHERE userselect=? AND workflowselect=?";
for (String deleteUserId : deleteUsers) {
ArrayList<String> 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<String> 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<String> addSet, Map<String, String> baseWorkflowName, Map<String, String> baseWorkflowCataCode, List<List<Map<String, Object>>> userLists) {
for (String flowCode : addSet) {
//没有维护目录的跳过
String cataCode = baseWorkflowCataCode.get(flowCode);
if (StringUtils.isEmpty(cataCode)) {
continue;
}
List<Map<String, Object>> userList = new LinkedList<>();
Map<String, Object> userCondition = new HashMap<>();
Map<String, Object> staffCodeMap = new HashMap<>();
HashSet<String> 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<String, Object> userMap = new HashMap<>();
userMap.put("userCondition", userCondition);
userList.add(userMap);
userLists.add(userList);
}
}
/**
*
*
* @param synchronizeUserUrl
* @param headers
*/
private void syncUser(String synchronizeUserUrl, List<List<Map<String, Object>>> userLists, HashMap<String, String> headers) {
for (List<Map<String, Object>> userList : userLists) {
Map<String, Object> staffCodeMap = userList.get(0);
Map<String, Object> userConditionMap = userList.get(1);
Map<String, Object> userCondition = (Map<String, Object>) userConditionMap.get("userCondition");
HashSet<String> staffCodeSet = (HashSet<String>) 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);
}
}
}
}
Loading…
Cancel
Save