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

<%@ 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;
}
%>