|
|
|
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();
|
|
|
|
ArrayList<Map<String, Object>> addWorkflowList = new ArrayList<>();
|
|
|
|
ArrayList<Map<String, Object>> delWorkflowList = new ArrayList<>();
|
|
|
|
ArrayList<Map<String, Object>> addUserList = new ArrayList<>();
|
|
|
|
ArrayList<Map<String, Object>> 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)) {
|
|
|
|
workflowSql += " AND modedatamodifydatetime >= ?";
|
|
|
|
recordSet.execute(workflowSql, timeCondition);
|
|
|
|
} else {
|
|
|
|
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(center, cataCode, flowCode, flowName, ACTION_TYPE_ADD, addUserList, timeCondition);
|
|
|
|
} else if (EFFECTIVE_NO.equals(effective)) {
|
|
|
|
//拼接无效流程请求参数
|
|
|
|
concatWorkflowCondition(center, cataCode, flowCode, flowName, ACTION_TYPE_DELETE, delWorkflowList);
|
|
|
|
//无效流程关联的人员参数拼接
|
|
|
|
getUserConditionByWorkflow(center, cataCode, flowCode, flowName, ACTION_TYPE_DELETE, delUserList, timeCondition);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
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);
|
|
|
|
bb.writeLog("增加流程", data);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (CollectionUtils.isNotEmpty(delWorkflowList)) {
|
|
|
|
for (Map<String, Object> workflowMap : delWorkflowList) {
|
|
|
|
String data = HttpUtils.doPost(synchronizeFlowUrl, workflowMap, headers);
|
|
|
|
bb.writeLog("删除流程", data);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
//调用人员同步方法
|
|
|
|
if (CollectionUtils.isNotEmpty(addUserList)) {
|
|
|
|
for (Map<String, Object> workflowMap : addUserList) {
|
|
|
|
String data = HttpUtils.doPost(synchronizeUserUrl, workflowMap, headers);
|
|
|
|
bb.writeLog("增加人员", data);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (CollectionUtils.isNotEmpty(delUserList)) {
|
|
|
|
for (Map<String, Object> workflowMap : delUserList) {
|
|
|
|
String data = HttpUtils.doPost(synchronizeUserUrl, workflowMap, headers);
|
|
|
|
bb.writeLog("删除人员", data);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 组装流程同步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/spa/workflow/static4mobileform/index.html#/req?iscreate=1&workflowid=" + flowCode);
|
|
|
|
workflowList.add(workflowMap);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 组装人员同步API请求参数
|
|
|
|
*
|
|
|
|
* @param cataCode
|
|
|
|
* @param flowCode
|
|
|
|
* @param flowName
|
|
|
|
* @param actionType
|
|
|
|
* @param userList
|
|
|
|
* @param timeCondition
|
|
|
|
*/
|
|
|
|
private void getUserConditionByWorkflow(String center, String cataCode, String flowCode, String flowName, String actionType, ArrayList<Map<String, Object>> userList, String timeCondition) {
|
|
|
|
Map<String, Object> usermap = new HashMap<>();
|
|
|
|
StringBuilder staffCodeBuilder = new StringBuilder();
|
|
|
|
String userSql = "SELECT workcode as staffCode FROM uf_workflow_aut WHERE workflowselect=?";
|
|
|
|
if (StringUtils.isNotEmpty(timeCondition)) {
|
|
|
|
userSql += " AND modedatamodifydatetime >=" + timeCondition;
|
|
|
|
}
|
|
|
|
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 (?,?,?,?,?)";
|
|
|
|
recordSet.executeUpdate(sql, IdGenerator.getNextId(timeNodeTable), formmodeid, syncType, currentTime, timeNodeUse);
|
|
|
|
}
|
|
|
|
}
|