<%@ 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 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 newFieldInfo = new HashMap<>(); HashMap 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 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 updateParam = new ArrayList<>(); ArrayList 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> wfid_subrequestidMap = new HashMap<>(); HashMap> 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 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 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 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 updateParamList = new ArrayList<>(); List subrequestids = wfid_subrequestidMap.get(wfkey); log.info("subrequestids:{}",subrequestids); HashMap 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> wfid_subrequestidMap, String maxid) { RecordSet rs = new RecordSet(); //用于记录插入日志表的字符串参数list ArrayList logParamStrs = new ArrayList<>(); //主要更新workflow_requestBase的字段 //REQUESTNAME ,REQUESTNAMENEW,REQUESTNAMEHTMLNEW // 先更新主流程 //更新主流程RequestName updateRequestNameByRequestId(newRequestName,requestid,maxid,rs,logParamStrs); //开始更新子流程 for (List 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 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 reqid_oldValueMap, String updateFormSql, ArrayList 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 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 oldFieldInfo, String updateFormSql, ArrayList 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 getFieldSetInfo(String wfkey, HashMap newFieldInfo) { RecordSet rs = new RecordSet(); log.info("getFieldSetInfo:wfkey:{}",wfkey); String[] key = wfkey.split("_"); log.info("getFieldSetInfo:key:{}",wfkey); HashMap 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 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 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 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> getAllSubReqs(String requestids, String mainwfId, Map> 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 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 subrequestids = wfid_subrequestidMap.get(wfid_subrequestidMap); // String join = String.join(",", subrequestids); // getAllSubReqs(join,wfkey.split(",")[1],wfid_subrequestidMap); // } // } // return wfid_subrequestidMap; // } // public static Map> getAllSubReqs(String requestids, String mainwfId, Map> wfid_subrequestidMap) { // // 初始化一个队列来处理请求ID和相应的层级key // Queue> requestQueue = new LinkedList<>(); // // 初始化一个集合来追踪已经处理过的工作流路径 // Set processedKeys = new HashSet<>(); // // // 将初始请求ID和mainwfId放入队列 // requestQueue.add(new AbstractMap.SimpleEntry<>(requestids, mainwfId)); // // // 开始处理队列中的请求ID // while (!requestQueue.isEmpty()) { // Map.Entry 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> wfid_subrequestidMap, Set processedKeys, Queue> 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> getAllSubReqs(String requestids, String mainwfId, Map> wfid_subrequestidMap) { // 初始化一个集合来追踪已经处理过的工作流路径 Set processedKeys = new HashSet<>(); // 开始递归处理主请求 processRequests(requestids, mainwfId, wfid_subrequestidMap, processedKeys); return wfid_subrequestidMap; } private static void processRequests(String requestids, String currentKey, Map> wfid_subrequestidMap, Set 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; } %>