You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
haojing/src/weaver/interfaces/job/WorkflowSyncCronJob.java

208 lines
9.9 KiB
Java

package weaver.interfaces.job;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import weaver.conn.RecordSet;
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.dito.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;
@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 workflowAuthTable = bb.getPropValue("PORTAL_INFO", "workflowAuthTable");
String timeNodeTable = bb.getPropValue("PORTAL_INFO", "timeNodeTable");
String accountName = bb.getPropValue("PORTAL_INFO", "accountName");
String password = bb.getPropValue("PORTAL_INFO", "password");
String timeNodeFormModeId = bb.getPropValue("PORTAL_INFO", "timeNodeFormModeId");
//全量同步使用全量同步方法
if (SYNC_ALL.equals(syncType)) {
String currentTime = TimeUtil.getCurrentTimeString();
allSynchronizeWorkflow(bb, synchronizeFlowUrl, synchronizeUserUrl, 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, 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 cataCode, String workflowAuthTable, String timeNodeTable, String accountName, String password) {
RecordSet recordSet = new RecordSet();
//查询时间节点表,上次流程推送增量同步的时间
String timeSql = "select tbsj from " + timeNodeTable + " where tblx=? and zy=? order by tbsj desc";
recordSet.executeQuery(timeSql, SYNC_INCREMENT, TIME_NODE_USE_WORKFLOW_SYNC);
String preTime = "";
if (recordSet.next()) {
preTime = recordSet.getString("tbsj");
}
syncWorkflowByCondition(bb, synchronizeFlowUrl, synchronizeUserUrl, cataCode, workflowAuthTable, accountName, password, preTime);
}
// 全量同步
private void allSynchronizeWorkflow(BaseBean bb, String synchronizeFlowUrl, String synchronizeUserUrl, String cataCode, String workflowAuthTable, String accountName, String password) {
syncWorkflowByCondition(bb, synchronizeFlowUrl, synchronizeUserUrl, cataCode, workflowAuthTable, accountName, password, null);
}
/**
*
*/
private void syncWorkflowByCondition(BaseBean bb, String synchronizeFlowUrl, String synchronizeUserUrl, 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 >=" + timeCondition;
}
recordSet.execute(workflowSql);
//区分有效和无效的流程
while (recordSet.next()) {
String effective = recordSet.getString("effective");
3 years ago
String flowcode = recordSet.getString("flowcode");
String flowname = recordSet.getString("flowname");
if (EFFECTIVE_YES.equals(effective)) {
//拼接有效流程请求参数
concatWorkflowCondition(cataCode, flowcode, flowname, ACTION_TYPE_ADD, addWorkflowList);
//有效流程关联的人员参数拼接
getUserConditionByWorkflow(cataCode, flowcode, flowname, ACTION_TYPE_ADD, addUserList, timeCondition);
} else if (EFFECTIVE_NO.equals(effective)) {
//拼接无效流程请求参数
concatWorkflowCondition(cataCode, flowcode, flowname, ACTION_TYPE_DELETE, delWorkflowList);
//无效流程关联的人员参数拼接
getUserConditionByWorkflow(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 : addUserList) {
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);
}
}
}
3 years ago
/**
* API
3 years ago
*
3 years ago
* @param cataCode
* @param flowcode
* @param flowname
* @param actionType
* @param workflowList
*/
private void concatWorkflowCondition(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("urPC", "/bpm/workflow/request/CreateRequestForward.jsp?workflowid=" + flowcode);
workflowMap.put("urApp", "/bpm/spa/workflow/static4mobileform/index.html#/req?iscreate=1&workflowid=" + flowcode);
workflowList.add(workflowMap);
}
3 years ago
/**
* API
3 years ago
*
3 years ago
* @param cataCode
* @param flowcode
* @param flowname
* @param actionType
* @param userList
* @param timeCondition
*/
private void getUserConditionByWorkflow(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("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) {
RecordSet recordSet = new RecordSet();
String sql = "insert into " + timeNodeTable + "(id,formmodeid,tblx,tbsj,zy) values(?,?,?,?,?)";
recordSet.executeUpdate(sql, UUID.randomUUID(), formmodeid, syncType, currentTime, timeNodeUse);
}
}