package weaver.interfaces.job; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang.StringUtils; import weaver.conn.RecordSet; import weaver.conn.util.IdGenerator; import weaver.general.BaseBean; import weaver.general.TimeUtil; import weaver.interfaces.schedule.BaseCronJob; import weaver.interfaces.util.HttpUtils; import java.util.*; import static com.engine.ditoSsologin.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; @Override public void execute() { BaseBean bb = new BaseBean(); bb.writeLog("开始推送流程"); try { //推送流程url String synchronizeFlowUrl = bb.getPropValue("PORTAL_INFO", "synchronizeFlowUrl"); //同步人员权限url String synchronizeUserUrl = bb.getPropValue("PORTAL_INFO", "synchronizeUserUrl"); //新建流程推送到目录code String catalogueCode = bb.getPropValue("PORTAL_INFO", "catalogueCode"); String center = bb.getPropValue("PORTAL_INFO", "center"); String workflowAuthTable = bb.getPropValue("PORTAL_INFO", "workflowAuthTable"); String timeNodeTable = bb.getPropValue("PORTAL_INFO", "timeNodeTable"); String accountName = bb.getPropValue("PORTAL_INFO", "username"); String password = bb.getPropValue("PORTAL_INFO", "passwd"); String timeNodeFormModeId = bb.getPropValue("PORTAL_INFO", "timeNodeFormModeId"); //全量同步使用全量同步方法 if (SYNC_ALL.equals(syncType)) { String currentTime = TimeUtil.getCurrentTimeString(); allSynchronizeWorkflow(bb, synchronizeFlowUrl, synchronizeUserUrl, center, catalogueCode, workflowAuthTable, accountName, password); writeTimeNode(timeNodeTable, currentTime, SYNC_ALL, TIME_NODE_USE_WORKFLOW_SYNC, timeNodeFormModeId); } //增量同步使用增量同步方法 if (SYNC_INCREMENT.equals(syncType)) { String currentTime = TimeUtil.getCurrentTimeString(); IncrementSynchronizeWorkflow(bb, synchronizeFlowUrl, synchronizeUserUrl, center, catalogueCode, workflowAuthTable, timeNodeTable, accountName, password); writeTimeNode(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 cataCode, 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(bb, synchronizeFlowUrl, synchronizeUserUrl, center, cataCode, workflowAuthTable, accountName, password, preTime); } // 全量同步 private void allSynchronizeWorkflow(BaseBean bb, String synchronizeFlowUrl, String synchronizeUserUrl, String center, String cataCode, String workflowAuthTable, String accountName, String password) { syncWorkflowByCondition(bb, synchronizeFlowUrl, synchronizeUserUrl, center, cataCode, workflowAuthTable, accountName, password, null); } /** * 根据不同条件请求同步方法 */ private void syncWorkflowByCondition(BaseBean bb, String synchronizeFlowUrl, String synchronizeUserUrl, String center, String cataCode, String workflowAuthTable, String accountName, String password, String timeCondition) { RecordSet recordSet = new RecordSet(); RecordSet recordSet2 = new RecordSet(); ArrayList> addWorkflowList = new ArrayList<>(); ArrayList> delWorkflowList = new ArrayList<>(); ArrayList> addUserList = new ArrayList<>(); ArrayList> delUserList = new ArrayList<>(); //查询建模所有流程 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)) { timeCondition = "'" + timeCondition + "'"; workflowSql += " AND (modedatamodifydatetime >= " + timeCondition + " OR modedatacreatedate+ ' '+ modedatacreatetime>= " + timeCondition + ")"; } recordSet.execute(workflowSql); //区分有效和无效的流程 while (recordSet.next()) { String effective = recordSet.getString("effective"); String flowCode = recordSet.getString("flowCode"); String flowName = recordSet.getString("flowName"); 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); } 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); } } 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); bb.writeLog("增加流程", data); //无法判断流程的更改类型,所以在流程变动同时修改 workflowMap.put("actionType", ACTION_TYPE_UPDATE); data = HttpUtils.doPost(synchronizeFlowUrl, workflowMap, headers); bb.writeLog("修改流程", data); } } //删除人员要在删除流程之前执行 if (CollectionUtils.isNotEmpty(delUserList)) { for (Map workflowMap : delUserList) { String data = HttpUtils.doPost(synchronizeUserUrl, workflowMap, headers); bb.writeLog("删除人员", data); } } if (CollectionUtils.isNotEmpty(delWorkflowList)) { for (Map workflowMap : delWorkflowList) { String data = HttpUtils.doPost(synchronizeFlowUrl, workflowMap, headers); bb.writeLog("删除流程", data); } } //调用人员同步方法 if (CollectionUtils.isNotEmpty(addUserList)) { for (Map workflowMap : addUserList) { String data = HttpUtils.doPost(synchronizeUserUrl, workflowMap, headers); bb.writeLog("增加人员", data); } } } /** * 查询还在使用中的流程 * * @param workflowAuthTable * @param recordSet2 * @param flowCode * @return */ private boolean workflowHasEffective(String workflowAuthTable, RecordSet recordSet2, String flowCode) { String querySql = "SELECT top 1 id 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/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 userList * @param timeCondition */ private void getUserConditionByWorkflow(String workflowAuthTable, String center, String cataCode, String flowCode, String flowName, String actionType, ArrayList> userList, String timeCondition) { Map usermap = new HashMap<>(); StringBuilder staffCodeBuilder = new StringBuilder(); String userSql = "SELECT workcode as staffCode FROM " + workflowAuthTable + " WHERE workflowselect=?"; RecordSet rs = new RecordSet(); rs.executeQuery(userSql, flowCode); while (rs.next()) { staffCodeBuilder.append(rs.getString("staffCode")).append("|"); } usermap.put("flowCode", flowCode); usermap.put("flowName", flowName); //同步所需参数一并拼接 usermap.put("actionType", actionType); usermap.put("center", center); usermap.put("cataCode", cataCode); usermap.put("staffCode", staffCodeBuilder.toString()); userList.add(usermap); } /** * 将同步时间写入时间节点表 * * @param timeNodeTable 表名 * @param syncType 同步类型 * @param timeNodeUse 同步作用 * @param formmodeid 模块id */ private void writeTimeNode(String timeNodeTable, String currentTime, String syncType, String timeNodeUse, String formmodeid) throws Exception { RecordSet recordSet = new RecordSet(); String sql = "SET IDENTITY_INSERT " + timeNodeTable + " ON insert into " + timeNodeTable + " (id,formmodeid,type,timenode,useto) values (?,?,?,?,?)"; 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 (?,?,?,?,?)"; } recordSet.executeUpdate(sql, IdGenerator.getNextId(timeNodeTable), formmodeid, syncType, currentTime, timeNodeUse); } }