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.

464 lines
22 KiB
Plaintext

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<%@ page import="com.wbi.util.ParamUtil" %>
<%@ page import="weaver.conn.RecordSet" %>
<%@ page import="weaver.workflow.workflow.WorkflowComInfo" %>
<%@ page import="weaver.workflow.workflow.WorkflowBillComInfo" %>
<%@ page import="weaver.conn.BatchRecordSet" %>
<%@ page import="weaver.general.StringUtil" %>
<%@ page import="weaver.general.Util" %>
<%@ page import="org.slf4j.LoggerFactory" %>
<%@ page import="org.slf4j.Logger" %>
<%@ page import="java.util.*" %>
<%@ page import="weaver.hrm.HrmUserVarify" %>
<%@page contentType="text/html; charset=UTF-8" %>
<%
Logger log = LoggerFactory.getLogger("CustomBusiness");
Map<String, Object> param = ParamUtil.request2Map(request);
String requestid = Util.null2String(param.get("requestid"));
String workflowid = Util.null2String(param.get("workflowid"));
Object formid = param.get("formid");
Object nodeid = param.get("nodeid");
log.info("requestparam:{}", param);
HashMap<String, String> newFieldInfo = new HashMap<>();
HashMap<String, String> oldFieldInfo = new HashMap<>();
int userid = HrmUserVarify.getUser(request, response).getUID();
String clientIp = getClientIp(request);
String newRequestName = "";
//判断下是否需要修改流程标题
if (!StringUtil.isEmpty(Util.null2String(param.get("field_requestName")))){
newRequestName = Util.null2String(param.get("field_requestName"));
}
//将字段信息封装进fieldInfo
param.forEach((k, v) -> {
if (k.startsWith("field_")) {
String fieldName = k.split("_")[1];
if (!"requestName".equals(fieldName)){
newFieldInfo.put(fieldName, Util.null2String(v));
}
}
});
HashMap<Object, Object> map = new HashMap<>();
map.put("requestid", requestid);
map.put("workflowid", workflowid);
map.put("formid", formid);
map.put("nodeid", nodeid);
//获取表单名称
WorkflowComInfo wf = new WorkflowComInfo();
WorkflowBillComInfo wcInfo = new WorkflowBillComInfo();
String formId = wf.getFormId(workflowid);
String tablename = wcInfo.getTablename(formId);
// 查询数据,记录原始数据;
RecordSet rs = new RecordSet();
rs.executeQuery("select * from " + tablename + " where requestid = ? ", requestid);
log.info("查询数据sql:select * from " + tablename + " where requestid = {} ", requestid);
if (rs.next()) {
for (String fieldName : newFieldInfo.keySet()) {
String oldValue = rs.getString(fieldName);
oldFieldInfo.put(fieldName, oldValue);
}
}
//更新主流程表单数据 -- start
ArrayList<String> updateParam = new ArrayList<>();
ArrayList<String> updateField = new ArrayList<>();
for (String fieldName : newFieldInfo.keySet()) {
updateField.add(fieldName + " = ? ");
updateParam.add(newFieldInfo.get(fieldName));
}
updateParam.add(requestid);
String updateFormSql = String.format(" UPDATE %s SET %s WHERE requestid = ? ", tablename, String.join(",", updateField));
log.info("updateFormSql:{}", updateFormSql);
log.info("updateParam.toArray():{}", updateParam.toArray());
rs.executeUpdate(updateFormSql, updateParam.toArray());
log.info("updateFormSql.getExceptionMsg:{}", rs.getExceptionMsg());
//记录日志
String maxid = insertMainReqLog(requestid, oldFieldInfo, updateFormSql, updateParam ,userid,clientIp);
//更新主流程表单数据 -- end
// 开始处理子流程数据 -- start
//查询出当前流程的所有子流程
//获取当前流程的子流程
//封装一个map,key为流程id,value为请求id的List
HashMap<String, List<String>> wfid_subrequestidMap = new HashMap<>();
HashMap<String, List<String>> subrequestid_wfidMap = new HashMap<>();
// rs.executeQuery("select * from WORKFLOW_REQUESTBASE where MAINREQUESTID = ?", requestid);
// while (rs.next()) {
// String subworkflowid = rs.getString("WORKFLOWID");
// if (wfid_subrequestidMap.get(subworkflowid) == null) {
// ArrayList<String> subrequestids = new ArrayList<>();
// subrequestids.add(rs.getString("REQUESTID"));
// wfid_subrequestidMap.put(subworkflowid, subrequestids);
// } else {
// wfid_subrequestidMap.get(subworkflowid).add(rs.getString("REQUESTID"));
// }
// }
getAllSubReqs(requestid,workflowid,wfid_subrequestidMap);
log.info("wfid_subrequestidMap:{}", wfid_subrequestidMap);
String sep = Util.getSeparator() + "";
BatchRecordSet batchRecordSet = new BatchRecordSet();
ArrayList<String> updateSetfield = null;
for (String wfkey : wfid_subrequestidMap.keySet()) {
String[] key = wfkey.split("_");
// String mainwfid = sp[0];
String subwfid = key[key.length-1];
String subformId = wf.getFormId(subwfid);
String subTablename = wcInfo.getTablename(subformId);
updateField = new ArrayList<>();
updateSetfield = new ArrayList<>();
String updateParamStr = "";
// 查询当前流程和子流程的字段对应关系
Map<String, String> fieldSetInfo = getFieldSetInfo(wfkey,newFieldInfo);
log.info("fieldSetInfo:{}", fieldSetInfo);
for (String fieldName : newFieldInfo.keySet()) {
if (fieldSetInfo.get(fieldName) != null) {
String subfieldName = fieldSetInfo.get(fieldName);
updateField.add(subfieldName + " = ?");
updateSetfield.add(subfieldName);
if (StringUtil.isEmpty(updateParamStr)) {
updateParamStr = newFieldInfo.get(fieldName);
} else {
updateParamStr += sep + newFieldInfo.get(fieldName);
}
}
}
if (updateSetfield.size() == 0 ){
continue;
}
String updateSubReqFormSql = String.format(" UPDATE %s SET %s WHERE requestid = ? ", subTablename, String.join(",", updateField));
log.info("updateSubReqFormSql:{}", updateSubReqFormSql);
//开始处理子流程
String updateSetfieldStr = String.join(",", updateSetfield);
ArrayList<String> updateParamList = new ArrayList<>();
List<String> subrequestids = wfid_subrequestidMap.get(wfkey);
log.info("subrequestids:{}",subrequestids);
HashMap<String, String> reqid_oldValueMap = new HashMap<>();
for (String subrequestid : subrequestids) {
// 查询下原始数据
String oldValueStr = "";
rs.executeQuery("select " + updateSetfieldStr + "from "+subTablename+" where requestid = ? ", subrequestid);
rs.next();
for (String field : updateSetfield) {
if (StringUtil.isEmpty(oldValueStr)) {
oldValueStr = field + "=" + rs.getString(field);
} else {
oldValueStr += "," + field + "=" + rs.getString(field);
}
}
reqid_oldValueMap.put(subrequestid,oldValueStr);
//更新字段参数
String paramStr = updateParamStr + sep + subrequestid;
log.info("paramStr:{}", paramStr);
updateParamList.add(paramStr);
}
batchRecordSet.executeSqlBatchNew(updateSubReqFormSql, updateParamList);
insertsubReqLog(maxid,reqid_oldValueMap,updateSubReqFormSql,updateParamList,batchRecordSet);
}
// out.print(rs.getMsg());
//表单字段处理结束,开始处理流程标题
if(!StringUtil.isEmpty(newRequestName)){
updateRequestNameAllReq(newRequestName,requestid,wfid_subrequestidMap,maxid)
}
%>
<%!
//更新涉及到的流程的流程标题
private void updateRequestNameAllReq(String newRequestName, String requestid, HashMap<String, List<String>> wfid_subrequestidMap, String maxid) {
RecordSet rs = new RecordSet();
//用于记录插入日志表的字符串参数list
ArrayList<String> logParamStrs = new ArrayList<>();
//主要更新workflow_requestBase的字段
//REQUESTNAME ,REQUESTNAMENEW,REQUESTNAMEHTMLNEW
// 先更新主流程
//更新主流程RequestName
updateRequestNameByRequestId(newRequestName,requestid,maxid,rs,logParamStrs);
//开始更新子流程
for (List<String> value : wfid_subrequestidMap.values()) {
for (String subreqid : value) {
updateRequestNameByRequestId(newRequestName,subreqid,maxid,rs,logParamStrs);
}
}
String sql = "insert into uf_updateFormLog_dt1 (mainid,lcid,xgqdz,xgsql,sqlcs) values (?,?,?,?,?) ";
BatchRecordSet batchRecordSet = new BatchRecordSet();
boolean b = batchRecordSet.executeSqlBatchNew(sql, logParamStrs);
log.info("updateRequestNameAllReq.executeSqlBatchNew.result:{}",b);
}
private void updateRequestNameByRequestId(String newRequestName, String requestid,String maxid, RecordSet rs, ArrayList<String> logParamStrs) {
log.info("updateRequestNameByRequestId:requestid:{}",requestid);
rs.executeQuery("select REQUESTNAME ,REQUESTNAMENEW,REQUESTNAMEHTMLNEW from workflow_requestBase where requestid = ?" , requestid);
rs.next();
String requestname = Util.null2String(rs.getString("REQUESTNAME"));
String requestnamenew = Util.null2String(rs.getString("REQUESTNAMENEW"));
String requestnamehtmlnew = Util.null2String(rs.getString("REQUESTNAMEHTMLNEW"));
// 通过字符串替换获取新的标题
String update_requestnamenew = requestnamenew.replaceAll(requestname, newRequestName);
String update_requestnamehtmlnew = requestnamehtmlnew.replaceAll(requestname, newRequestName);
String updateSql = "update workflow_requestBase set REQUESTNAME = ? ,REQUESTNAMENEW = ? ,REQUESTNAMEHTMLNEW = ? where requestid = ?";
rs.executeUpdate(updateSql,newRequestName,update_requestnamenew,update_requestnamehtmlnew,requestid);
//拼接日志表的参数
String sep = Util.getSeparator() + "";
//
String param = maxid
+ sep + requestid
+ sep + "requestname:"+requestname + ",requestnamenew:"+requestnamenew+",requestnamehtmlnew"+requestnamehtmlnew
+ sep + updateSql
+ sep + newRequestName +"|"+ update_requestnamenew +"|"+ update_requestnamehtmlnew+"|"+requestid;
logParamStrs.add(param);
}
private void insertsubReqLog(String maxid, HashMap<String, String> reqid_oldValueMap, String updateFormSql, ArrayList<String> updateParam, BatchRecordSet batchRecordSet) {
log.info("insertsubReqLog:maxid:{}",maxid);
// RecordSet rs = new RecordSet();
String sql = "insert into uf_updateFormLog_dt1 (mainid,lcid,xgqdz,xgsql,sqlcs) values (?,?,?,?,?) ";
String sep = Util.getSeparator() + "";
ArrayList<String> insertParam = new ArrayList<>();
for (String paramStr : updateParam) {
String reqid = paramStr.substring(paramStr.lastIndexOf(sep) + 1);
String oldValue = reqid_oldValueMap.get(reqid);
String noSepParamStr = paramStr.replaceAll(sep,"|");
String insertParamStr = maxid + sep + reqid + sep + oldValue + sep + updateFormSql + sep + noSepParamStr;
insertParam.add(insertParamStr);
// rs.executeUpdate(sql,maxid,reqid,oldValue,updateFormSql,paramStr);
}
log.info("insertsubReqLog:insertParam.size:{}",insertParam.size());
boolean b = batchRecordSet.executeSqlBatchNew(sql, insertParam);
log.info("batchRecordSet.executeSqlBatchNew.result:{}",b);
}
private String insertMainReqLog(String requestid, HashMap<String, String> oldFieldInfo, String updateFormSql, ArrayList<String> updateParam, int userid, String clientIp) {
String maxid = "";
try {
RecordSet rs = new RecordSet();
rs.executeUpdate("insert into uf_updateFormLog (lcid , xgqdz ,xgsql,sqlcs,ip,czr) values (?,?,?,?,?,?)",requestid,oldFieldInfo.toString(),updateFormSql,String.join("|",updateParam),clientIp,userid);
rs.executeQuery("select max(id) id from uf_updateFormLog ");
rs.next();
maxid = Util.null2String(rs.getString("id"));
}catch (Exception e){
log.info("insertMainReqLog:error:{}",e.getMessage());
}
return maxid;
}
static Logger log = LoggerFactory.getLogger("CustomBusiness");
WorkflowComInfo wf = new WorkflowComInfo();
WorkflowBillComInfo wcInfo = new WorkflowBillComInfo();
private Map<String, String> getFieldSetInfo(String wfkey, HashMap<String, String> newFieldInfo) {
RecordSet rs = new RecordSet();
log.info("getFieldSetInfo:wfkey:{}",wfkey);
String[] key = wfkey.split("_");
log.info("getFieldSetInfo:key:{}",wfkey);
HashMap<String, String> fieldSetInfo = new HashMap<>();
for (int i = key.length - 1; i >= 1 ; i--) {
String mainwfid = key[i-1];;
String subwfid = key[i];
log.info("mainwfid:{}",mainwfid);
log.info("subwfid:{}",subwfid);
String activeVersionID = "";
rs.executeQuery("select ACTIVEVERSIONID from WORKFLOW_BASE where id = ? ", subwfid);
if (rs.next()) {
activeVersionID = rs.getString("ACTIVEVERSIONID");
}
log.info("activeVersionID:{}", activeVersionID);
rs.executeQuery("select * from WORKFLOW_BASE where ACTIVEVERSIONID = ? ", activeVersionID);
ArrayList<String> subwfids = new ArrayList<>();
while (rs.next()) {
subwfids.add(rs.getString("id"));
}
log.info("subwfids:{}", subwfids);
String setid = "";
rs.executeQuery("select * from workflow_subwfset where MAINWORKFLOWID = ? and SUBWORKFLOWID in ( " + String.join(",", subwfids) + " )", mainwfid);
if (rs.next()) {
setid = rs.getString("id");
}
log.info("setid:{}", setid);
rs.executeQuery("select b.FIELDNAME mainwfField,c.FIELDNAME subwfField, " +
" b.fieldhtmltype mainfieldhtmltype, " +
" c.fieldhtmltype subfieldhtmltype " +
" from workflow_subwfsetdetail a left join WORKFLOW_BILLFIELD b " +
" on a.MAINWORKFLOWFIELDID = b.ID " +
" left join WORKFLOW_BILLFIELD c " +
" on a.SUBWORKFLOWFIELDID = c.ID " +
" where SUBWFSETID = ? ", setid);
HashMap<String, String> tempfieldSetInfo = new HashMap<>();
while (rs.next()) {
//todo
//这里通过fieldhtmltype字段类型判断是否需要更新,如果字段类型不同就忽略,
//后期需优化,着急上线,先用这个方法简单判断下
String mainfieldhtmltype = Util.null2String(rs.getString("mainfieldhtmltype"));
String subfieldhtmltype = Util.null2String(rs.getString("subfieldhtmltype"));
if (mainfieldhtmltype.equals(subfieldhtmltype)) {
tempfieldSetInfo.put(rs.getString("mainwfField"), rs.getString("subwfField"));
}
}
if (fieldSetInfo.size() == 0){
fieldSetInfo = tempfieldSetInfo;
}else{
HashMap<String, String> map = new HashMap<>();
for (String mainwffield : tempfieldSetInfo.keySet()) {
String subwffield = tempfieldSetInfo.get(mainwffield);
map.put(mainwffield,fieldSetInfo.get(subwffield));
}
fieldSetInfo = map;
}
log.info("getFieldSetInfo:fieldSetInfo:{}",fieldSetInfo);
}
return fieldSetInfo;
}
/****
* 使用递归查询获取当前流程的所有子流程
* @return key 主流程wfid_子流程wfid value 子流程requestid的list
*/
// private static Map<String, List<String>> getAllSubReqs(String requestids, String mainwfId, Map<String, List<String>> wfid_subrequestidMap) {
//
// RecordSet rs = new RecordSet();
// rs.executeQuery("select * from WORKFLOW_REQUESTBASE where MAINREQUESTID in ( "+requestids+" )");
// int size = wfid_subrequestidMap.size();
// while (rs.next()) {
// String subworkflowid = rs.getString("WORKFLOWID");
// String wfIdKey = mainwfId + "_" + subworkflowid;
// if (wfid_subrequestidMap.get(wfIdKey) == null) {
// ArrayList<String> subrequestids = new ArrayList<>();
// subrequestids.add(rs.getString("REQUESTID"));
// wfid_subrequestidMap.put(wfIdKey, subrequestids);
// } else {
// wfid_subrequestidMap.get(wfIdKey).add(rs.getString("REQUESTID"));
// }
// }
// if (size != wfid_subrequestidMap.size()) {
// for (String wfkey : wfid_subrequestidMap.keySet()) {
// List<String> subrequestids = wfid_subrequestidMap.get(wfid_subrequestidMap);
// String join = String.join(",", subrequestids);
// getAllSubReqs(join,wfkey.split(",")[1],wfid_subrequestidMap);
// }
// }
// return wfid_subrequestidMap;
// }
// public static Map<String, List<String>> getAllSubReqs(String requestids, String mainwfId, Map<String, List<String>> wfid_subrequestidMap) {
// // 初始化一个队列来处理请求ID和相应的层级key
// Queue<Map.Entry<String, String>> requestQueue = new LinkedList<>();
// // 初始化一个集合来追踪已经处理过的工作流路径
// Set<String> processedKeys = new HashSet<>();
//
// // 将初始请求ID和mainwfId放入队列
// requestQueue.add(new AbstractMap.SimpleEntry<>(requestids, mainwfId));
//
// // 开始处理队列中的请求ID
// while (!requestQueue.isEmpty()) {
// Map.Entry<String, String> entry = requestQueue.poll();
// String currentRequestIds = entry.getKey();
// String currentKey = entry.getValue();
//
// processRequests(currentRequestIds, currentKey, wfid_subrequestidMap, processedKeys, requestQueue);
// }
//
// return wfid_subrequestidMap;
// }
//
// private static void processRequests(String requestids, String currentKey, Map<String, List<String>> wfid_subrequestidMap, Set<String> processedKeys, Queue<Map.Entry<String, String>> requestQueue) {
// RecordSet rs = new RecordSet();
// rs.executeQuery("select * from WORKFLOW_REQUESTBASE where MAINREQUESTID in (" + requestids + ")");
//
// // 处理查询结果集并更新映射表
// while (rs.next()) {
// String subworkflowid = rs.getString("WORKFLOWID");
// String newKey = currentKey + "_" + subworkflowid;
// String requestId = rs.getString("REQUESTID");
//
// // 如果该工作流路径还没有被处理过,处理并加入映射表
// if (!processedKeys.contains(newKey)) {
// processedKeys.add(newKey);
// wfid_subrequestidMap.computeIfAbsent(newKey, k -> new ArrayList<>()).add(requestId);
//
// // 将新的子请求ID和新生成的key放入队列中以便后续处理
// requestQueue.add(new AbstractMap.SimpleEntry<>(requestId, newKey));
// } else {
// // 如果已经处理过则只更新映射表中的请求ID列表
// wfid_subrequestidMap.get(newKey).add(requestId);
// }
// }
// }
public static Map<String, List<String>> getAllSubReqs(String requestids, String mainwfId, Map<String, List<String>> wfid_subrequestidMap) {
// 初始化一个集合来追踪已经处理过的工作流路径
Set<String> processedKeys = new HashSet<>();
// 开始递归处理主请求
processRequests(requestids, mainwfId, wfid_subrequestidMap, processedKeys);
return wfid_subrequestidMap;
}
private static void processRequests(String requestids, String currentKey, Map<String, List<String>> wfid_subrequestidMap, Set<String> processedKeys) {
RecordSet rs = new RecordSet();
rs.executeQuery("select * from WORKFLOW_REQUESTBASE where MAINREQUESTID in (" + requestids + ")");
// 处理查询结果集并更新映射表
while (rs.next()) {
String subworkflowid = rs.getString("WORKFLOWID");
String newKey = currentKey + "_" + subworkflowid;
String requestId = rs.getString("REQUESTID");
// 如果该工作流路径还没有被处理过,处理并加入映射表
if (!processedKeys.contains(newKey)) {
processedKeys.add(newKey);
wfid_subrequestidMap.computeIfAbsent(newKey, k -> new ArrayList<>()).add(requestId);
// 递归处理子请求构建下一层的key
processRequests(requestId, newKey, wfid_subrequestidMap, processedKeys);
} else {
// 如果已经处理过则只更新映射表中的请求ID列表
wfid_subrequestidMap.get(newKey).add(requestId);
}
}
}
public static String getClientIp(HttpServletRequest request) {
String ip = request.getHeader("X-Forwarded-For");
if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_CLIENT_IP");
}
if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
return ip;
}
%>