HistoryDevByCx/二开源码/京福/jg/.svn/pristine/0c/0c32f5a96bd8eeb780b52ac57e4...

1407 lines
65 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.engine.kq.cmd.attendanceEvent;
import com.alibaba.fastjson.JSON;
import com.engine.kq.biz.KQAttFlowSetBiz;
import com.engine.kq.biz.KQAttProcSetComInfo;
import com.engine.kq.biz.KQLeaveRulesComInfo;
import com.engine.kq.enums.KqSplitFlowTypeEnum;
import com.engine.kq.log.KQLog;
import com.engine.kq.util.KQTransMethod;
import com.engine.kq.wfset.util.SplitSelectSet;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import org.apache.commons.lang3.StringUtils;
import weaver.common.DateUtil;
import weaver.common.StringUtil;
import weaver.conn.RecordSet;
import weaver.general.Util;
import weaver.hrm.User;
import weaver.systeminfo.SystemEnv;
import weaver.workflow.workflow.WorkflowRequestComInfo;
public class CheckRuleUtil {
public String[] ori_str = new String[]{"#requestname_link#","#requestname#"};
public String[] ori_count_str = new String[]{"#num_type#","#num_count#"};
private KQLog kqLog = new KQLog();
public void checkRule(Set<Entry<String, Object>> checkRuleDataSet,
Map<String, Object> retmap, User user, String kqtype, int requestid,int nodetype,String attid) {
try{
if(attid.length() == 0 || Util.getIntValue(attid) < 0 || kqtype.length() == 0 || Util.getIntValue(kqtype) < 0){
return ;
}
RecordSet rs = new RecordSet();
RecordSet rs1 = new RecordSet();
RecordSet rs2 = new RecordSet();
String workflowid = "";
String wf_sql = "select * from kq_att_proc_set where id = ?";
rs.executeQuery(wf_sql, attid);
if(rs.next()){
workflowid = rs.getString("field001");
}
String sql = "select * from kq_att_checkrule_set where attid=? ";
rs.executeQuery(sql, attid);
while (rs.next()){
if(!retmap.isEmpty() && retmap.containsKey("status")){
if("-1".equalsIgnoreCase(Util.null2String(retmap.get("status")))){
return;
}
}
String ruleid = rs.getString("ruleid");
String rule_type_uuid = rs.getString("rule_type_uuid");
String type_sql = "select * from kq_att_checkrule_type where uuid=? and att_type=? ";
rs1.executeQuery(type_sql, rule_type_uuid,kqtype);
if(rs1.next()){
String rule_table = rs1.getString("rule_table");
if("kq_att_duplicate_rule".equalsIgnoreCase(rule_table)){
//如果是重复校验,走重复校验的逻辑
String table_sql = "select * from "+rule_table+" where id=? ";
rs2.executeQuery(table_sql, ruleid);
if(rs2.next()){
check_duplicate_rule(checkRuleDataSet,retmap, user, kqtype, requestid,nodetype,workflowid,rs2);
}
}else if("kq_att_frequency_rule".equalsIgnoreCase(rule_table)){
//如果是次数校验,走次数校验的逻辑
String table_sql = "select * from "+rule_table+" where id=? ";
rs2.executeQuery(table_sql, ruleid);
if(rs2.next()){
check_frequency_rule(checkRuleDataSet,retmap, user, kqtype, requestid,nodetype,attid,rs2);
}
}
}
}
}catch (Exception e){
StringWriter errorsWriter = new StringWriter();
e.printStackTrace(new PrintWriter(errorsWriter));
kqLog.info(errorsWriter.toString());
}
}
/**
* 补卡流程,有两种控制:
* 重复校验只需要控制打卡日期时间是否重复了
* 次数校验需要控制,每日,每周,每月可提交的补卡次数
* 当前是次数校验
* @param checkRuleDataSet
* @param retmap
* @param user
* @param kqtype
* @param requestid
* @param nodetype
* @param attid
* @param rs2
*/
private void check_frequency_rule(Set<Entry<String, Object>> checkRuleDataSet, Map<String, Object> retmap, User user, String kqtype, int requestid, int nodetype, String attid,
RecordSet rs2) throws Exception{
// 校验类型
String frequency_rule = rs2.getString("frequency_rule");
String frequency_rule_content = new KQTransMethod().getFrequencyContent(frequency_rule,user.getLanguage());
// 校验次数
String frequency_rule_count = rs2.getString("frequency_rule_count");
if(frequency_rule_count.length() == 0 || Util.getIntValue(frequency_rule_count) <= 0){
return ;
}
// 校验强度
String frequency_level = rs2.getString("frequency_level");
if("2".equalsIgnoreCase(frequency_level)){
//不校验
return ;
}
// 提示语句
String frequency_message = Util.null2String(rs2.getString("frequency_message"));
RecordSet rs = new RecordSet();
KQAttFlowSetBiz kqAttFlowSetBiz = new KQAttFlowSetBiz();
Map<String,String> daterangeMap = Maps.newConcurrentMap();
List<Map<String,String>> dataList = Lists.newArrayList();
for (Entry<String, Object> entry : checkRuleDataSet) {
String duplicateValue = Util.null2String(entry.getValue());
String[] duplicateValues = duplicateValue.split("_",-1);
if (duplicateValues.length == 3) {
Map<String,String> dataMap = Maps.newConcurrentMap();
String resourceId = duplicateValues[0];
String signdate = duplicateValues[1];
if(resourceId.length() == 0 || signdate.length() == 0){
continue;
}
String dateRange = getDateRangeByFrequency_rule(frequency_rule,signdate);
if(daterangeMap.containsKey(dateRange)){
int tmp = Util.getIntValue(Util.null2s(daterangeMap.get(dateRange),"1"));
daterangeMap.put(dateRange, ""+(1+tmp));
}else{
daterangeMap.put(dateRange, "1");
}
dataMap.put("resourceId", resourceId);
dataMap.put("signdate", signdate);
dataMap.put("dateRange", dateRange);
dataList.add(dataMap);
}
}
if(!daterangeMap.isEmpty()){
for(Map.Entry<String,String> me : daterangeMap.entrySet()){
String key = me.getKey();
int tmp = Util.getIntValue(Util.null2s(daterangeMap.get(key),"1"));
if(tmp > Util.getIntValue(frequency_rule_count)){
retmap.put("status", "-1");
if("1".equalsIgnoreCase(frequency_level)){
//弱控
retmap.put("status", "-2");
}
String[] replace_str = new String[]{frequency_rule_content,frequency_rule_count};
frequency_message = StringUtils.replaceEach(frequency_message, ori_count_str,replace_str);
retmap.put("message", frequency_message);
return ;
}
}
}
for(Map<String,String> mapData : dataList){
String resourceId = mapData.get("resourceId");
String signdate = mapData.get("signdate");
String dateRange = mapData.get("dateRange");
String custome_sql = "";
if(dateRange.length() > 0 && dateRange.split("_").length == 2){
String daterange_start = dateRange.split("_")[0];
String daterange_end = dateRange.split("_")[1];
if(daterange_start.length() > 0 && daterange_end.length() > 0){
custome_sql = " detail_signdate between '"+daterange_start+"' and '"+daterange_end+"'";
}
}
if(custome_sql.length() == 0){
continue;
}
Map<String, Object> params = Maps.newHashMap();
params.put("typeselect", "6");
params.put("tabKey", "3");
params.put("kqtype", kqtype);
params.put("isMyKQ", "1");
params.put("custome_sql", custome_sql);
params.put("resourceId", resourceId);
params.put("not_start_node", "1");
if(requestid > 0){
params.put("not_requestId", requestid);
}
params.put("isNoAccount", "1");
Map<String,String> sqlMap = kqAttFlowSetBiz.getFLowSql(params,user);
String backfields = " * ";
// String backfields = " count(requestid) as cnt_request ";
String fromSql = Util.null2String(sqlMap.get("from"));
String sqlWhere = Util.null2String(sqlMap.get("where"));
String allSql = "select "+ backfields + fromSql+sqlWhere;
kqLog.info("check_frequency_rule:allSql:"+allSql);
int request_count = 0;
Map<String,Integer> tmpdatas = new HashMap<>();
rs.executeQuery(allSql);
while (rs.next()){
String detail_signdate = Util.null2String(rs.getString("detail_signdate"));
String detail_signtype = Util.null2String(rs.getString("detail_signtype"));
String detail_signtime = Util.null2String(rs.getString("detail_signtime"));
String detail_requestid = Util.null2String(rs.getString("requestid"));
String key = detail_requestid+"#"+detail_signdate+"#"+detail_signtime+"#"+detail_signtype;
if(tmpdatas.get(key)!=null){
continue;
}else{
request_count ++;
tmpdatas.put(key,1);
}
}
int cur_flow_count = 0;
if(daterangeMap.containsKey(dateRange)){
cur_flow_count = Util.getIntValue(Util.null2s(daterangeMap.get(dateRange),"0"));
}
kqLog.info("check_frequency_rule:request_count:"+request_count+":cur_flow_count:"+cur_flow_count);
if((request_count+cur_flow_count) > Util.getIntValue(frequency_rule_count)){
retmap.put("status", "-1");
if("1".equalsIgnoreCase(frequency_level)){
//弱控
retmap.put("status", "-2");
}
String[] replace_str = new String[]{frequency_rule_content,frequency_rule_count};
frequency_message = StringUtils.replaceEach(frequency_message, ori_count_str,replace_str);
retmap.put("message", frequency_message);
return;
}
// if(rs.next()){
// int request_count = Util.getIntValue(rs.getString("cnt_request"));
// int cur_flow_count = 0;
// if(daterangeMap.containsKey(dateRange)){
// cur_flow_count = Util.getIntValue(Util.null2s(daterangeMap.get(dateRange),"0"));
// }
//
// if((request_count+cur_flow_count) > Util.getIntValue(frequency_rule_count)){
// retmap.put("status", "-1");
// if("1".equalsIgnoreCase(frequency_level)){
// //弱控
// retmap.put("status", "-2");
// }
// String[] replace_str = new String[]{frequency_rule_content,frequency_rule_count};
// frequency_message = StringUtils.replaceEach(frequency_message, ori_count_str,replace_str);
// retmap.put("message", frequency_message);
// return;
// }
// }
}
}
/**
* 根据校验规则 和当前得到
* @param frequency_rule
* @param signdate
*/
public String getDateRangeByFrequency_rule(String frequency_rule, String signdate) {
String daterange_start = "";
String daterange_end = "";
if("0".equalsIgnoreCase(frequency_rule)){
//每日
daterange_start = signdate;
daterange_end = signdate;
}else if("1".equalsIgnoreCase(frequency_rule)){
//每周
daterange_start = DateUtil.getFirstDayOfWeek(signdate);
daterange_end = DateUtil.getLastDayOfWeek(signdate);
}else if("2".equalsIgnoreCase(frequency_rule)){
//每月
daterange_start = DateUtil.getFirstDayOfMonth(signdate);
daterange_end = DateUtil.getLastDayOfMonth(signdate);
}else if("3".equalsIgnoreCase(frequency_rule)){
//每季度
daterange_start = DateUtil.getFirstDayOfQuarter(signdate);
daterange_end = DateUtil.getLastDayOfQuarter(signdate);
}else if("4".equalsIgnoreCase(frequency_rule)){
//每年
daterange_start = DateUtil.getFirstDayOfYear(signdate);
daterange_end = DateUtil.getLastDayOfYear(signdate);
}
String key = daterange_start+"_"+daterange_end;
return key;
}
/**
* 重复校验的处理
* @param checkRuleDataSet
* @param retmap
* @param user
* @param kqtype
* @param requestid
* @param nodetype
* @param workflowid
* @param rs2
*/
private void check_duplicate_rule(Set<Entry<String, Object>> checkRuleDataSet,
Map<String, Object> retmap, User user, String kqtype, int requestid, int nodetype,
String workflowid, RecordSet rs2) throws Exception{
List<String> wfids = Lists.newArrayList();
// 校验类型
String duplicate_rule = rs2.getString("duplicate_rule");
// 校验强度
String duplicate_level = rs2.getString("duplicate_level");
if("2".equalsIgnoreCase(duplicate_level)){
//不校验
return ;
}
// 提示语句
String duplicate_message = Util.null2String(rs2.getString("duplicate_message"),SystemEnv.getHtmlLabelName(516397,weaver.general.Util.getIntValue(user.getLanguage())));
//补卡流程只需要有自己流程比较,不会和其他流程相互比较的
if("0".equalsIgnoreCase(duplicate_rule)){
//同流程
wfids.add(workflowid);
}else if("1".equalsIgnoreCase(duplicate_rule)){
//各个流程之间
// 需校验流程路径
String duplicate_wfids = rs2.getString("duplicate_wfids");
if(duplicate_wfids.length() > 0){
String[] duplicate_wfidArr = duplicate_wfids.split(",");
for(String wfid : duplicate_wfidArr){
wfids.add(wfid);
}
}
}else{
wfids.add(workflowid);
}
kqLog.info("check_duplicate_rule:wfids:"+wfids+":duplicate_rule:"+duplicate_rule+":duplicate_level:"+duplicate_level);
if(kqtype.equalsIgnoreCase(""+KqSplitFlowTypeEnum.LEAVE.getFlowtype())){
for (Entry<String, Object> entry : checkRuleDataSet) {
String duplicateValue = Util.null2String(entry.getValue());
String[] duplicateValues = duplicateValue.split("_",-1);
if(duplicateValues.length == 6){
String newLeaveType = duplicateValues[5];
if("3".equals(newLeaveType)){
//哺乳假不校验
return ;
}
}
}
}
boolean isCard = false;
boolean isEvection = false;
boolean isProcess = false;
if(kqtype.equalsIgnoreCase(""+KqSplitFlowTypeEnum.CARD.getFlowtype())){
isCard = true;
}else if(kqtype.equalsIgnoreCase(""+KqSplitFlowTypeEnum.EVECTION.getFlowtype())){
isEvection = true;
}else if(kqtype.equalsIgnoreCase(""+KqSplitFlowTypeEnum.PROCESSCHANGE.getFlowtype())){
isProcess = true;
}else{
}
if(isCard){
doWhenisDuplicateCard(checkRuleDataSet,requestid,wfids,user,duplicate_message,retmap);
}else if(isEvection){
doWhenisDuplicateEvection(checkRuleDataSet,requestid,wfids,user,duplicate_message,retmap);
}else if(isProcess){
doWhenisDuplicateProcess(checkRuleDataSet,requestid,wfids,user,duplicate_message,retmap);
}else{
doWhenisCommonDuplicate(checkRuleDataSet,requestid,wfids,user,duplicate_message,retmap);
}
if("1".equalsIgnoreCase(duplicate_level)){
//弱控
if(!retmap.isEmpty()){
retmap.put("status", "-2");
}
}
}
/**
* 考勤变更流程,因为有字段不同,需要单独处理
* @param checkRuleDataSet
* @param requestid
* @param wfids
* @param user
* @param duplicate_message
* @param retmap
*/
private void doWhenisDuplicateProcess(Set<Entry<String, Object>> checkRuleDataSet, int requestid,
List<String> wfids, User user, String duplicate_message,
Map<String, Object> retmap) throws Exception{
String process_changerequestid = "";
String process_resourceId = "";
String process_tablename = "";
Map<String,String> wftypeMap = Maps.newHashMap();
RecordSet rs = new RecordSet();
Map<String, List<String>> mapSqls = Maps.newHashMap();
Map<String,List<Map<String,String>>> duplicateMaps = Maps.newHashMap();
for (Entry<String, Object> entry : checkRuleDataSet) {
String duplicateValue = Util.null2String(entry.getValue());
String[] duplicateValues = duplicateValue.split("_",-1);
if(duplicateValues.length == 10){
String resourceId = duplicateValues[0];
String fromDate = duplicateValues[1];
String fromTime = duplicateValues[2];
String toDate = duplicateValues[3];
String toTime = duplicateValues[4];
String changerequestid = duplicateValues[5];
String attendancefromDate = duplicateValues[6];
String attendancefromTime = duplicateValues[7];
String attendancetoDate = duplicateValues[8];
String attendancetoTime = duplicateValues[9];
if(fromDate.length() == 0 || fromTime.length() == 0 || toDate.length() == 0 || toTime.length() == 0){
continue;
}
process_changerequestid = changerequestid;
process_resourceId = resourceId;
long fromdatetime_long = DateUtil.getCalendar(fromDate+" "+fromTime).getTimeInMillis();
long todatetime_long = DateUtil.getCalendar(toDate+" "+toTime).getTimeInMillis();
if(attendancetoDate.length() == 0 || attendancefromTime.length() == 0 || attendancetoDate.length() == 0 || attendancetoTime.length() == 0){
continue;
}
long attendance_fromdatetime_long = DateUtil.getCalendar(attendancefromDate+" "+attendancefromTime).getTimeInMillis();
long attendance_todatetime_long = DateUtil.getCalendar(attendancetoDate+" "+attendancetoTime).getTimeInMillis();
buildMap4Process(duplicateMaps,resourceId,fromdatetime_long,todatetime_long,attendance_fromdatetime_long,attendance_todatetime_long);
for(String wfid : wfids){
Map<String, Object> params = Maps.newHashMap();
buildSql(mapSqls, user, wfid, fromDate, toDate, resourceId, requestid,params,wftypeMap);
}
}
}
//如果变更明细里原数据和变更数据完全一致也需要记录下
List<String> same_processList = Lists.newArrayList();
//变更流程的明细数量是不是和被变更流程的明细数量一致
boolean isSameProcess = false;
if(!duplicateMaps.isEmpty() && process_changerequestid.length() > 0){
Map<String, Object> otherparams = Maps.newHashMap();
otherparams.put("resourceId", process_resourceId);
otherparams.put("requestid", process_changerequestid);
GetProcessChangeTypeCmd processChangeTypeCmd = new GetProcessChangeTypeCmd(otherparams, user);
Map<String, Object> retmaps = processChangeTypeCmd.execute(null);
if(retmaps != null && !retmaps.isEmpty()){
if(retmaps.containsKey("process_type") && retmaps.containsKey("process_tablename")){
process_tablename = Util.null2String(retmaps.get("process_tablename"));
}
}
List<String> processList = Lists.newArrayList();
String process_sql = "select * from "+process_tablename+" where requestid=? and resourceid=? and status=0 ";
rs.executeQuery(process_sql, process_changerequestid,process_resourceId);
//这种情况就是变更流程只是变更了一部分流程数据的话,需要考虑一种特殊情况就是
//当前被变更的流程和当前变更流程明细之间存在冲突的可能
while (rs.next()){
String fromdatedb = rs.getString("fromdatedb");
String fromtimedb = rs.getString("fromtimedb");
String todatedb = rs.getString("todatedb");
String totimedb = rs.getString("totimedb");
long fromdatetime_long = DateUtil.getCalendar(fromdatedb+" "+fromtimedb).getTimeInMillis();
long todatetime_long = DateUtil.getCalendar(todatedb+" "+totimedb).getTimeInMillis();
String key = fromdatetime_long+"_"+todatetime_long;
if(!processList.contains(key)){
processList.add(key);
}
}
for(Entry<String,List<Map<String,String>>> me : duplicateMaps.entrySet()){
boolean is_process_less = false;
List<Map<String,String>> values = me.getValue();
if(processList.size() != values.size()){
is_process_less = true;
}else{
isSameProcess = true;
}
//针对当前流程本身,如果是明细表,多条明细之间也需要校验
for(int i = 0 ; i < values.size() ; i++){
long fromdatetime_long = StringUtil.parseToLong(values.get(i).get("fromdatetime_long"));
long todatetime_long = StringUtil.parseToLong(values.get(i).get("todatetime_long"));
long attendance_fromdatetime_long = StringUtil.parseToLong(values.get(i).get("attendance_fromdatetime_long"));
long attendance_todatetime_long = StringUtil.parseToLong(values.get(i).get("attendance_todatetime_long"));
if(is_process_less){
String tmp_key = fromdatetime_long+"_"+todatetime_long;
if(fromdatetime_long == attendance_fromdatetime_long && todatetime_long == attendance_todatetime_long){
//如果变更时间和原时间完全一致,不作处理
same_processList.add(tmp_key);
}else{
if(processList.contains(tmp_key)){
retmap.put("status", "-1");
String e_duplicate_message= duplicate_message;
String mobile_duplicate_message= duplicate_message;
String[] replace_str = new String[]{new KQTransMethod().getWorkFlowUrl(process_changerequestid),new WorkflowRequestComInfo().getRequestName(process_changerequestid)};
String[] mobile_replace_str = new String[]{new KQTransMethod().getWorkFlowUrl4mobile(process_changerequestid),new WorkflowRequestComInfo().getRequestName(process_changerequestid)};
String[] e_replace_str = new String[]{new WorkflowRequestComInfo().getRequestName(process_changerequestid),new WorkflowRequestComInfo().getRequestName(process_changerequestid)};
mobile_duplicate_message = StringUtils.replaceEach(mobile_duplicate_message, ori_str,mobile_replace_str);
duplicate_message = StringUtils.replaceEach(duplicate_message, ori_str,replace_str);
e_duplicate_message = StringUtils.replaceEach(e_duplicate_message, ori_str,e_replace_str);
retmap.put("message", duplicate_message);
retmap.put("mobile_message", mobile_duplicate_message);
//给小e用的
retmap.put("e_message", e_duplicate_message);
return;
}
}
}
if(values.size() > 1){
for(int j = i+1 ; j < values.size() ;j++){
long j_fromdatetime_long = StringUtil.parseToLong(values.get(j).get("fromdatetime_long"));
long j_todatetime_long = StringUtil.parseToLong(values.get(j).get("todatetime_long"));
if(todatetime_long <= j_fromdatetime_long || fromdatetime_long >= j_todatetime_long){
//这样表示流程不交叉
}else{
retmap.put("status", "-1");
retmap.put("message", SystemEnv.getHtmlLabelName(516400,user.getLanguage()));
return;
}
}
}
}
}
}
kqLog.info("doWhenisDuplicateProcess:mapSqls:"+mapSqls);
boolean isLeave = false;
boolean isProcess = false;
if(retmap.isEmpty() && !mapSqls.isEmpty()){
RecordSet rs1 = new RecordSet();
for(Entry<String,List<String>> me : mapSqls.entrySet()){
String resourceId = me.getKey();
if(duplicateMaps.containsKey(resourceId)){
List<String> values = me.getValue();
for(int i = 0 ; i <values.size() ; i++){
String tmp_sql = values.get(i);
rs.executeQuery(tmp_sql);
while (rs.next()){
String tmp_wftype = "";
if(wftypeMap.containsKey(tmp_sql)){
tmp_wftype = wftypeMap.get(tmp_sql);
}
String fromDate_field = "fromDate";
String fromTime_field = "fromTime";
String toDate_field = "toDate";
String toTime_field = "toTime";
if(tmp_wftype.equalsIgnoreCase(KqSplitFlowTypeEnum.PROCESSCHANGE.getFlowtype()+"")){
fromDate_field = "detail_fromDate";
fromTime_field = "detail_fromTime";
toDate_field = "detail_toDate";
toTime_field = "detail_toTime";
}
String related_requestid = rs.getString("requestid");
String flow_fromDate = rs.getString(fromDate_field);
String flow_fromTime = rs.getString(fromTime_field);
String flow_toDate = rs.getString(toDate_field);
String flow_toTime = rs.getString(toTime_field);
Map<String,String> specialMap = getSpecialMap(tmp_wftype,related_requestid,rs,resourceId, user,flow_fromDate,flow_fromTime,flow_toDate,flow_toTime);
if(specialMap != null && !specialMap.isEmpty()){
isLeave = Util.null2String(specialMap.get("isLeave")).equalsIgnoreCase("1");
isProcess = Util.null2String(specialMap.get("isProcess")).equalsIgnoreCase("1");
if(!isLeave){
flow_fromDate = Util.null2String(specialMap.get("fromdatedb"));
flow_fromTime = Util.null2String(specialMap.get("fromtimedb"));
flow_toDate = Util.null2String(specialMap.get("todatedb"));
flow_toTime = Util.null2String(specialMap.get("totimedb"));
related_requestid = Util.null2String(specialMap.get("related_requestid"));
}
if(isProcess){
if(process_changerequestid.equalsIgnoreCase(related_requestid)){
if(isSameProcess){
continue;
}else{
if(flow_fromDate.length() > 0 && flow_fromTime.length() > 0 && flow_toDate.length() > 0 && flow_toTime.length() > 0) {
long todatetime_long = DateUtil.getCalendar(flow_toDate+" "+flow_toTime).getTimeInMillis();
long fromdatetime_long = DateUtil.getCalendar(flow_fromDate+" "+flow_fromTime).getTimeInMillis();
String tmp_key = fromdatetime_long+"_"+todatetime_long;
if(!same_processList.isEmpty()){
if(same_processList.contains(tmp_key)){
continue;
}
}
}
}
}
}
}
if(flow_fromDate.length() > 0 && flow_fromTime.length() > 0 && flow_toDate.length() > 0 && flow_toTime.length() > 0){
long flow_fromdatetime_long = DateUtil.getCalendar(flow_fromDate+" "+flow_fromTime).getTimeInMillis();
long flow_todatetime_long = DateUtil.getCalendar(flow_toDate+" "+flow_toTime).getTimeInMillis();
List<Map<String,String>> duplicateVals = duplicateMaps.get(resourceId);
checkDuplicateFlow(duplicateVals,retmap,flow_fromdatetime_long,flow_todatetime_long,duplicate_message,related_requestid,
isLeave,resourceId);
if(!retmap.isEmpty()){
return ;
}
}
}
}
}
}
}
}
/**
* 出差流程,因为有陪同人的概念,需要特殊处理
* @param checkRuleDataSet
* @param requestid
* @param wfids
* @param user
* @param duplicate_message
* @param retmap
*/
private void doWhenisDuplicateEvection(Set<Entry<String, Object>> checkRuleDataSet, int requestid,
List<String> wfids, User user, String duplicate_message,
Map<String, Object> retmap) throws Exception{
Map<String,String> wftypeMap = Maps.newHashMap();
RecordSet rs = new RecordSet();
KQAttProcSetComInfo kqAttProcSetComInfo = new KQAttProcSetComInfo();
Map<String, List<String>> mapSqls = Maps.newHashMap();
Map<String,List<Map<String,String>>> duplicateMaps = Maps.newHashMap();
List<Map<String,String>> duplicateLists = Lists.newArrayList();
List<String> sqls = Lists.newArrayList();
KQAttFlowSetBiz kqAttFlowSetBiz = new KQAttFlowSetBiz();
for (Entry<String, Object> entry : checkRuleDataSet) {
String duplicateValue = Util.null2String(entry.getValue());
String[] duplicateValues = duplicateValue.split("_",-1);
if(duplicateValues.length == 6){
String resourceId = duplicateValues[0];
String fromDate = duplicateValues[1];
String fromTime = duplicateValues[2];
String toDate = duplicateValues[3];
String toTime = duplicateValues[4];
String companion = duplicateValues[5];
if(fromDate.length() == 0 || fromTime.length() == 0 || toDate.length() == 0 || toTime.length() == 0){
continue;
}
long fromdatetime_long = DateUtil.getCalendar(fromDate+" "+fromTime).getTimeInMillis();
long todatetime_long = DateUtil.getCalendar(toDate+" "+toTime).getTimeInMillis();
buildMap(duplicateMaps,resourceId,fromdatetime_long,todatetime_long);
if(companion.length() > 0) {
Map<String,String> duplicateMap = Maps.newConcurrentMap();
duplicateMap.put("fromdatetime_long", ""+fromdatetime_long);
duplicateMap.put("todatetime_long", ""+todatetime_long);
String[] companions = companion.split(",");
for (int i = 0; i < companions.length; i++) {
if(resourceId.equalsIgnoreCase(companions[i])){
continue;
}
if(!duplicateMaps.containsKey(companions[i])){
duplicateLists = Lists.newArrayList();
duplicateLists.add(duplicateMap);
duplicateMaps.put(companions[i], duplicateLists);
}else{
List<Map<String,String>> tmpList = duplicateMaps.get(companions[i]);
tmpList.add(duplicateMap);
}
}
}
for(String wfid : wfids){
String tmp_wftype = kqAttProcSetComInfo.getkqType(wfid);
Map<String, Object> params = Maps.newHashMap();
buildSql(mapSqls, user, wfid, fromDate, toDate, resourceId, requestid,params,wftypeMap);
if(companion.length() > 0){
String[] companions = companion.split(",");
for(int i = 0 ; i < companions.length ; i++){
if(tmp_wftype.equalsIgnoreCase(KqSplitFlowTypeEnum.EVECTION.getFlowtype()+"")){
if (rs.getDBType().equalsIgnoreCase("oracle")||rs.getDBType().equalsIgnoreCase("postgresql")) {
params.put("custome_sql", " resourceId='"+companions[i]+"' or ','||to_char(companion)||',' like '%," + companions[i] + ",%' ");
} else if (rs.getDBType().equalsIgnoreCase("mysql")) {
params.put("custome_sql", " resourceId='"+companions[i]+"' or CONCAT(CONCAT(',',companion),',') like '%," + companions[i] + ",%' ");
} else {
params.put("custome_sql", " resourceId='"+companions[i]+"' or ','+cast(companion as varchar(max))+',' like '%," + companions[i] + ",%' ");
}
}else{
params.put("resourceId", companions[i]);
}
params.put("isNoAccount", "1");
Map<String,String> companion_sqlMap = kqAttFlowSetBiz.getFLowSql(params,user);
String companion_backfields = " * ";
String companion_fromSql = Util.null2String(companion_sqlMap.get("from"));
String companion_sqlWhere = Util.null2String(companion_sqlMap.get("where"));
String companion_allSql = "select "+ companion_backfields + companion_fromSql+companion_sqlWhere;
wftypeMap.put(companion_allSql,tmp_wftype);
if(!mapSqls.containsKey(companions[i])){
//存一下sql对应的考勤流程类型
sqls = Lists.newArrayList();
sqls.add(companion_allSql);
mapSqls.put(companions[i],sqls);
}else{
List<String> tmp_sqls = mapSqls.get(companions[i]);
tmp_sqls.add(companion_allSql);
}
}
}
}
}
}
if(!duplicateMaps.isEmpty()){
for(Entry<String,List<Map<String,String>>> me : duplicateMaps.entrySet()){
List<Map<String,String>> values = me.getValue();
if(values.size() > 1){
//针对当前流程本身,如果是明细表,多条明细之间也需要校验
for(int i = 0 ; i < values.size() ; i++){
long fromdatetime_long = StringUtil.parseToLong(values.get(i).get("fromdatetime_long"));
long todatetime_long = StringUtil.parseToLong(values.get(i).get("todatetime_long"));
for(int j = i+1 ; j < values.size() ;j++){
long j_fromdatetime_long = StringUtil.parseToLong(values.get(j).get("fromdatetime_long"));
long j_todatetime_long = StringUtil.parseToLong(values.get(j).get("todatetime_long"));
if(todatetime_long <= j_fromdatetime_long || fromdatetime_long >= j_todatetime_long){
//这样表示流程不交叉
}else{
retmap.put("status", "-1");
retmap.put("message", SystemEnv.getHtmlLabelName(516400,user.getLanguage()));
return;
}
}
}
}
}
}
kqLog.info("doWhenisDuplicateEvection:mapSqls:"+mapSqls);
boolean isLeave = false;
if(retmap.isEmpty() && !mapSqls.isEmpty()){
for(Entry<String,List<String>> me : mapSqls.entrySet()){
String resourceId = me.getKey();
if(duplicateMaps.containsKey(resourceId)){
List<String> values = me.getValue();
for(int i = 0 ; i <values.size() ; i++){
String tmp_sql = values.get(i);
rs.executeQuery(tmp_sql);
while (rs.next()){
String tmp_wftype = "";
if(wftypeMap.containsKey(tmp_sql)){
tmp_wftype = wftypeMap.get(tmp_sql);
}
String fromDate_field = "fromDate";
String fromTime_field = "fromTime";
String toDate_field = "toDate";
String toTime_field = "toTime";
if(tmp_wftype.equalsIgnoreCase(KqSplitFlowTypeEnum.PROCESSCHANGE.getFlowtype()+"")){
fromDate_field = "detail_fromDate";
fromTime_field = "detail_fromTime";
toDate_field = "detail_toDate";
toTime_field = "detail_toTime";
}
String related_requestid = rs.getString("requestid");
String flow_fromDate = rs.getString(fromDate_field);
String flow_fromTime = rs.getString(fromTime_field);
String flow_toDate = rs.getString(toDate_field);
String flow_toTime = rs.getString(toTime_field);
Map<String,String> specialMap = getSpecialMap(tmp_wftype,related_requestid,rs,resourceId, user,
flow_fromDate, flow_fromTime, flow_toDate, flow_toTime);
if(specialMap != null && !specialMap.isEmpty()){
isLeave = Util.null2String(specialMap.get("isLeave")).equalsIgnoreCase("1");
if(!isLeave){
flow_fromDate = Util.null2String(specialMap.get("fromdatedb"));
flow_fromTime = Util.null2String(specialMap.get("fromtimedb"));
flow_toDate = Util.null2String(specialMap.get("todatedb"));
flow_toTime = Util.null2String(specialMap.get("totimedb"));
related_requestid = Util.null2String(specialMap.get("related_requestid"));
}
}
if(flow_fromDate.length() > 0 && flow_fromTime.length() > 0 && flow_toDate.length() > 0 && flow_toTime.length() > 0){
long flow_fromdatetime_long = DateUtil.getCalendar(flow_fromDate+" "+flow_fromTime).getTimeInMillis();
long flow_todatetime_long = DateUtil.getCalendar(flow_toDate+" "+flow_toTime).getTimeInMillis();
List<Map<String,String>> duplicateVals = duplicateMaps.get(resourceId);
checkDuplicateFlow(duplicateVals,retmap,flow_fromdatetime_long,flow_todatetime_long,duplicate_message,related_requestid,
isLeave, resourceId);
if(!retmap.isEmpty()){
return ;
}
}
}
}
}
}
}
}
/**
* 遍历循环考勤变更表,直到找到最后被变更的流程数据
* @param related_requestid 每次变更后的requestid
* @param tablename
* @param loopLevel
* @param resourceId
* @param ori_related_requestid 最原始的考勤流程requestid
* @param flow_fromDate
* @param flow_fromTime
* @param flow_toDate
* @param flow_toTime
* @return
*/
public Map<String, String> getProcessChange(String related_requestid, String tablename,
int loopLevel, String resourceId, String ori_related_requestid,
String flow_fromDate, String flow_fromTime, String flow_toDate, String flow_toTime) {
RecordSet rs = new RecordSet();
String sql = "select distinct leavebackrequestid,status,fromdatedb,fromtimedb,todatedb,totimedb from "+tablename+" "
+ "where requestid=? and resourceId=? and fromdatedb=? and fromtimedb=? and todatedb=? and totimedb=? ";
if(loopLevel == 1){
//只有第一次的时候,可以得到原始变更开始日期时间,结束日期时间
rs.executeQuery(sql, related_requestid,resourceId,flow_fromDate,flow_fromTime,flow_toDate,flow_toTime);
}else {
//后面递归的时候,从中间表里就得不到之前的原始变更开始日期时间,结束日期时间了
sql = "select distinct leavebackrequestid,status,fromdatedb,fromtimedb,todatedb,totimedb from "+tablename+" "
+ "where requestid=? and resourceId=? ";
rs.executeQuery(sql, related_requestid,resourceId);
}
if(rs.next()){
String leavebackrequestid = rs.getString("leavebackrequestid");
String fromdatedb = rs.getString("fromdatedb");
String fromtimedb = rs.getString("fromtimedb");
String todatedb = rs.getString("todatedb");
String totimedb = rs.getString("totimedb");
String status = rs.getString("status");
if("1".equalsIgnoreCase(status)){
if(leavebackrequestid.length() > 0 && leavebackrequestid.indexOf(",") > -1){
leavebackrequestid = leavebackrequestid.substring(1);
}
//如果递归超过50次说明这个流程至少变更了50次那就放过他
if (loopLevel > 50){
return null;
}
loopLevel++;
return getProcessChange(leavebackrequestid, tablename,loopLevel, resourceId,ori_related_requestid,
fromdatedb, fromtimedb, todatedb, totimedb);
}else {
Map<String, String> new_datetimeMap = Maps.newHashMap();
if(leavebackrequestid.length() > 0){
if(leavebackrequestid.indexOf(",") > -1){
leavebackrequestid = leavebackrequestid.substring(1);
}
// if(leavebackrequestid.equalsIgnoreCase(ori_related_requestid)){
// new_datetimeMap.put("fromdatedb", "");
// new_datetimeMap.put("fromtimedb", "");
// new_datetimeMap.put("todatedb", "");
// new_datetimeMap.put("totimedb", "");
// return new_datetimeMap;
// }
new_datetimeMap.put("fromdatedb", fromdatedb);
new_datetimeMap.put("fromtimedb", fromtimedb);
new_datetimeMap.put("todatedb", todatedb);
new_datetimeMap.put("totimedb", totimedb);
new_datetimeMap.put("related_requestid", related_requestid);
}
return new_datetimeMap;
}
}else{
if(loopLevel > 1){
//如果变更表里有数据,最后又没查询到了,表示被撤销了
Map<String, String> new_datetimeMap = Maps.newHashMap();
new_datetimeMap.put("fromdatedb", "");
new_datetimeMap.put("fromtimedb", "");
new_datetimeMap.put("todatedb", "");
new_datetimeMap.put("totimedb", "");
return new_datetimeMap;
}
}
return Maps.newHashMap();
}
/**
* 非补卡,出差流程,即需要开始日期时间 结束日期时间的流程
* @param checkRuleDataSet
* @param requestid
* @param wfids
* @param user
* @param duplicate_message
* @param retmap
*/
public void doWhenisCommonDuplicate(Set<Entry<String, Object>> checkRuleDataSet, int requestid,
List<String> wfids, User user, String duplicate_message,
Map<String, Object> retmap) throws Exception{
KQLeaveRulesComInfo kqLeaveRulesComInfo = new KQLeaveRulesComInfo();
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
Map<String,String> wftypeMap = Maps.newHashMap();
RecordSet rs = new RecordSet();
Map<String, List<String>> mapSqls = Maps.newHashMap();
Map<String,List<Map<String,String>>> duplicateMaps = Maps.newHashMap();
for (Entry<String, Object> entry : checkRuleDataSet) {
String duplicateValue = Util.null2String(entry.getValue());
String[] duplicateValues = duplicateValue.split("_",-1);
if(duplicateValues.length >= 5){
String resourceId = duplicateValues[0];
String fromDate = duplicateValues[1];
String fromTime = duplicateValues[2];
String toDate = duplicateValues[3];
String toTime = duplicateValues[4];
if(fromDate.length() == 0 || fromTime.length() == 0 || toDate.length() == 0 || toTime.length() == 0){
continue;
}
String repeatTime = "0";
if(duplicateValues.length == 6){
String newLeaveType = duplicateValues[5];
if(newLeaveType.length() > 0){
repeatTime = Util.null2String(kqLeaveRulesComInfo.getRepeatTime(newLeaveType));
}
}
if("1".equals(repeatTime)){
LocalDate localFromDate = LocalDate.parse(fromDate);
LocalDate localToDate = LocalDate.parse(toDate);
long betweenDays = localToDate.toEpochDay() - localFromDate.toEpochDay();
for (int i = 0; i <= betweenDays; i++) {
LocalDate curLocalDate = localFromDate.plusDays(i);
String date = curLocalDate.format(dateFormatter);
long fromdatetime_long = DateUtil.getCalendar(date+" "+fromTime).getTimeInMillis();
long todatetime_long = DateUtil.getCalendar(date+" "+toTime).getTimeInMillis();
buildMap(duplicateMaps, resourceId, fromdatetime_long, todatetime_long);
for(String wfid : wfids){
Map<String, Object> params = Maps.newHashMap();
buildSql(mapSqls, user, wfid, date, date, resourceId, requestid, params, wftypeMap);
}
}
}else{
long fromdatetime_long = DateUtil.getCalendar(fromDate+" "+fromTime).getTimeInMillis();
long todatetime_long = DateUtil.getCalendar(toDate+" "+toTime).getTimeInMillis();
buildMap(duplicateMaps, resourceId, fromdatetime_long, todatetime_long);
for(String wfid : wfids){
Map<String, Object> params = Maps.newHashMap();
buildSql(mapSqls, user, wfid, fromDate, toDate, resourceId, requestid, params, wftypeMap);
}
}
}
}
if(!duplicateMaps.isEmpty()){
for(Entry<String,List<Map<String,String>>> me : duplicateMaps.entrySet()){
List<Map<String,String>> values = me.getValue();
if(values.size() > 1){
//针对当前流程本身,如果是明细表,多条明细之间也需要校验
for(int i = 0 ; i < values.size() ; i++){
long fromdatetime_long = StringUtil.parseToLong(values.get(i).get("fromdatetime_long"));
long todatetime_long = StringUtil.parseToLong(values.get(i).get("todatetime_long"));
for(int j = i+1 ; j < values.size() ;j++){
long j_fromdatetime_long = StringUtil.parseToLong(values.get(j).get("fromdatetime_long"));
long j_todatetime_long = StringUtil.parseToLong(values.get(j).get("todatetime_long"));
if(todatetime_long <= j_fromdatetime_long || fromdatetime_long >= j_todatetime_long){
//这样表示流程不交叉
}else{
retmap.put("status", "-1");
retmap.put("message", SystemEnv.getHtmlLabelName(516400,user.getLanguage()));
return;
}
}
}
}
}
}
boolean isLeave = false;
if(retmap.isEmpty() && !mapSqls.isEmpty()){
RecordSet rs1 = new RecordSet();
for(Entry<String,List<String>> me : mapSqls.entrySet()){
String resourceId = me.getKey();
if(duplicateMaps.containsKey(resourceId)){
List<String> values = me.getValue();
for(int i = 0 ; i <values.size() ; i++){
String tmp_sql = values.get(i);
rs.executeQuery(tmp_sql);
while (rs.next()){
String tmp_wftype = "";
if(wftypeMap.containsKey(tmp_sql)){
tmp_wftype = wftypeMap.get(tmp_sql);
}
String newLeaveType_field = "newLeaveType";
String fromDate_field = "fromDate";
String fromTime_field = "fromTime";
String toDate_field = "toDate";
String toTime_field = "toTime";
if(tmp_wftype.equalsIgnoreCase(KqSplitFlowTypeEnum.PROCESSCHANGE.getFlowtype()+"")){
fromDate_field = "detail_fromDate";
fromTime_field = "detail_fromTime";
toDate_field = "detail_toDate";
toTime_field = "detail_toTime";
}
String related_requestid = rs.getString("requestid");
String flow_fromDate = rs.getString(fromDate_field);
String flow_fromTime = rs.getString(fromTime_field);
String flow_toDate = rs.getString(toDate_field);
String flow_toTime = rs.getString(toTime_field);
String repeatTime = "0";
Map<String,String> specialMap = getSpecialMap(tmp_wftype,related_requestid,rs,resourceId, user,
flow_fromDate, flow_fromTime, flow_toDate, flow_toTime);
if(specialMap != null && !specialMap.isEmpty()){
isLeave = Util.null2String(specialMap.get("isLeave")).equalsIgnoreCase("1");
if(!isLeave){
flow_fromDate = Util.null2String(specialMap.get("fromdatedb"));
flow_fromTime = Util.null2String(specialMap.get("fromtimedb"));
flow_toDate = Util.null2String(specialMap.get("todatedb"));
flow_toTime = Util.null2String(specialMap.get("totimedb"));
related_requestid = Util.null2String(specialMap.get("related_requestid"));
}
if(isLeave){
String flow_newLeaveType = Util.null2String(rs.getString(newLeaveType_field));
if(flow_newLeaveType.length() > 0){
repeatTime = kqLeaveRulesComInfo.getRepeatTime(flow_newLeaveType);
}
}
}
if(flow_fromDate.length() > 0 && flow_fromTime.length() > 0 && flow_toDate.length() > 0 && flow_toTime.length() > 0){
List<Map<String,String>> duplicateVals = duplicateMaps.get(resourceId);
if("1".equals(repeatTime)){
//被校验的流程是重复时段的话
LocalDate localFromDate = LocalDate.parse(flow_fromDate);
LocalDate localToDate = LocalDate.parse(flow_toDate);
long betweenDays = localToDate.toEpochDay() - localFromDate.toEpochDay();
for (int j = 0; j <= betweenDays; j++) {
LocalDate curLocalDate = localFromDate.plusDays(j);
String date = curLocalDate.format(dateFormatter);
long flow_fromdatetime_long = DateUtil.getCalendar(date+" "+flow_fromTime).getTimeInMillis();
long flow_todatetime_long = DateUtil.getCalendar(date+" "+flow_toTime).getTimeInMillis();
checkDuplicateFlow(duplicateVals,retmap,flow_fromdatetime_long,flow_todatetime_long,duplicate_message,related_requestid,isLeave,
resourceId);
if(!retmap.isEmpty()){
return ;
}
}
}else{
long flow_fromdatetime_long = DateUtil.getCalendar(flow_fromDate+" "+flow_fromTime).getTimeInMillis();
long flow_todatetime_long = DateUtil.getCalendar(flow_toDate+" "+flow_toTime).getTimeInMillis();
checkDuplicateFlow(duplicateVals,retmap,flow_fromdatetime_long,flow_todatetime_long,duplicate_message,related_requestid,isLeave,
resourceId);
if(!retmap.isEmpty()){
return ;
}
}
}
}
}
}
}
}
}
public boolean getLeaveBack(String related_requestid, long fromdatetime_long,
long todatetime_long, String resourceId) {
List<Long> all_long = Lists.newArrayList();
boolean isInLeaveBack = false;
RecordSet rs = new RecordSet();
String sql = "select distinct fromDatedb,fromTimedb,toDatedb,toTimedb from kq_flow_split_leaveback where leavebackrequestid=? and resourceId=? order by fromDatedb,fromTimedb,toDatedb,toTimedb\n ";
rs.executeQuery(sql, related_requestid,resourceId);
while (rs.next()){
String flow_fromDate = rs.getString("fromDatedb");
String flow_fromTime = rs.getString("fromTimedb");
String flow_toDate = rs.getString("toDatedb");
String flow_toTime = rs.getString("toTimedb");
long flow_fromdatetime_long = DateUtil.getCalendar(flow_fromDate+" "+flow_fromTime).getTimeInMillis();
long flow_todatetime_long = DateUtil.getCalendar(flow_toDate+" "+flow_toTime).getTimeInMillis();
if(!all_long.contains(flow_fromdatetime_long)){
all_long.add(flow_fromdatetime_long);
}else{
all_long.remove(flow_fromdatetime_long);
}
if(!all_long.contains(flow_todatetime_long)){
all_long.add(flow_todatetime_long);
}else{
all_long.remove(flow_todatetime_long);
}
}
for(int i = 0 ; i < all_long.size() ;){
long flow_fromdatetime_long = all_long.get(i);
long flow_todatetime_long = all_long.get(i+1);
//如果当前重复的区间刚好在销假区间内
if(fromdatetime_long >= flow_fromdatetime_long && fromdatetime_long <= flow_todatetime_long
&& todatetime_long >= flow_fromdatetime_long && todatetime_long <= flow_todatetime_long ){
isInLeaveBack = true;
break;
}
i = i +2;
}
return isInLeaveBack;
}
/**
* 补卡流程,有两种控制:
* 重复校验只需要控制打卡日期时间是否重复了
* 次数校验需要控制,每日,每周,每月可提交的补卡次数
* 当前是重复校验
* @param checkRuleDataSet
* @param requestid
* @param wfids
* @param user
*/
public void doWhenisDuplicateCard(Set<Entry<String, Object>> checkRuleDataSet, int requestid,
List<String> wfids, User user, String duplicate_message,
Map<String, Object> retmap) throws Exception{
RecordSet rs = new RecordSet();
KQAttProcSetComInfo kqAttProcSetComInfo = new KQAttProcSetComInfo();
Map<String, List<String>> mapSqls = Maps.newHashMap();
Map<String,List<String>> duplicateMaps = Maps.newHashMap();
List<String> duplicateLists = Lists.newArrayList();
List<String> sqls = Lists.newArrayList();
KQAttFlowSetBiz kqAttFlowSetBiz = new KQAttFlowSetBiz();
for (Entry<String, Object> entry : checkRuleDataSet) {
String duplicateValue = Util.null2String(entry.getValue());
String[] duplicateValues = duplicateValue.split("_",-1);
if(duplicateValues.length == 3){
String resourceId = duplicateValues[0];
String signdate = duplicateValues[1];
String signtime = duplicateValues[2];
if(resourceId.length() == 0 || signdate.length() == 0 || signtime.length() == 0){
continue;
}
String signdate_time = signdate+"_"+signtime;
if(duplicateMaps.containsKey(resourceId)){
List<String> tmp_duplicateLists =duplicateMaps.get(resourceId);
if(tmp_duplicateLists.contains(signdate_time)){
retmap.put("status", "-1");
retmap.put("message", SystemEnv.getHtmlLabelName(516400,user.getLanguage()));
return;
}
}else{
duplicateLists = Lists.newArrayList();
duplicateLists.add(signdate_time);
duplicateMaps.put(resourceId, duplicateLists);
}
for(String wfid : wfids){
Map<String, Object> params = Maps.newHashMap();
params.put("typeselect", "6");
params.put("tabKey", "3");
params.put("kqtype", kqAttProcSetComInfo.getkqType(wfid));
params.put("isMyKQ", "1");
params.put("workflowid", wfid);
params.put("custome_sql", " detail_signdate='"+signdate+"' and detail_signtime='"+signtime+"' ");
params.put("resourceId", resourceId);
params.put("not_start_node", "1");
if(requestid > 0){
params.put("not_requestId", requestid);
}
params.put("isNoAccount", "1");
Map<String,String> sqlMap = kqAttFlowSetBiz.getFLowSql(params,user);
String backfields = " * ";
String fromSql = Util.null2String(sqlMap.get("from"));
String sqlWhere = Util.null2String(sqlMap.get("where"));
String allSql = "select "+ backfields + fromSql+sqlWhere;
rs.executeQuery(allSql);
kqLog.info("doWhenisDuplicateCard:allSql:"+allSql);
if(rs.next()){
String mobile_duplicate_message= duplicate_message;
String related_requestid = rs.getString("requestid");
String e_duplicate_message= duplicate_message;
String[] replace_str = new String[]{new KQTransMethod().getWorkFlowUrl(related_requestid),new WorkflowRequestComInfo().getRequestName(related_requestid)};
String[] mobile_replace_str = new String[]{new KQTransMethod().getWorkFlowUrl4mobile(related_requestid),new WorkflowRequestComInfo().getRequestName(related_requestid)};
String[] e_replace_str = new String[]{new WorkflowRequestComInfo().getRequestName(related_requestid),new WorkflowRequestComInfo().getRequestName(related_requestid)};
mobile_duplicate_message = StringUtils.replaceEach(mobile_duplicate_message, ori_str,mobile_replace_str);
duplicate_message = StringUtils.replaceEach(duplicate_message, ori_str,replace_str);
e_duplicate_message = StringUtils.replaceEach(e_duplicate_message, ori_str,e_replace_str);
retmap.put("status", "-1");
retmap.put("message", duplicate_message);
retmap.put("mobile_message", mobile_duplicate_message);
//给小e用的
retmap.put("e_message", e_duplicate_message);
return;
}
if(mapSqls.containsKey(resourceId)){
List<String> tmp_sqls = mapSqls.get(resourceId);
tmp_sqls.add(allSql);
}else{
sqls = Lists.newArrayList();
sqls.add(allSql);
mapSqls.put(resourceId,sqls);
}
}
}
}
}
/**
* 根据规则组装查询sql
* @param mapSqls
* @param user
* @param wfid
* @param fromDate
* @param toDate
* @param resourceId
* @param requestid
* @param params
*/
public void buildSql(Map<String, List<String>> mapSqls, User user, String wfid, String fromDate,
String toDate, String resourceId, int requestid,
Map<String, Object> params,Map<String,String> wftypeMap){
RecordSet rs = new RecordSet();
KQAttProcSetComInfo kqAttProcSetComInfo = new KQAttProcSetComInfo();
KQAttFlowSetBiz kqAttFlowSetBiz = new KQAttFlowSetBiz();
List<String> sqls = Lists.newArrayList();
String tmp_wftype = kqAttProcSetComInfo.getkqType(wfid);
params.put("typeselect", "6");
params.put("tabKey", "3");
params.put("kqtype", tmp_wftype);
params.put("isMyKQ", "1");
params.put("resourceId", resourceId);
if(tmp_wftype.equalsIgnoreCase(KqSplitFlowTypeEnum.EVECTION.getFlowtype()+"")){
params.put("fromDate", fromDate);
params.put("toDate", toDate);
if (rs.getDBType().equalsIgnoreCase("oracle")||rs.getDBType().equalsIgnoreCase("postgresql")) {
params.put("custome_sql", " (resourceId='"+resourceId+"' or ','||to_char(companion)||',' like '%," + resourceId + ",%') ");
} else if (rs.getDBType().equalsIgnoreCase("mysql")) {
params.put("custome_sql", " (resourceId='"+resourceId+"' or CONCAT(CONCAT(',',companion),',') like '%," + resourceId + ",%') ");
} else {
params.put("custome_sql", " (resourceId='"+resourceId+"' or ','+cast(companion as varchar(max))+',' like '%," + resourceId + ",%') ");
}
params.put("resourceId", "");
}else if(tmp_wftype.equalsIgnoreCase(KqSplitFlowTypeEnum.PROCESSCHANGE.getFlowtype()+"")){
params.put("custome_sql", " ( detail_fromDate between '"+fromDate+"' and '"+toDate+"' or detail_toDate between '"+fromDate+"' and '"+toDate+"' "
+ " or '"+fromDate+"' between detail_fromDate and detail_toDate or '"+toDate+"' between detail_fromDate and detail_toDate) "
+" ");
}else{
params.put("fromDate", fromDate);
params.put("toDate", toDate);
}
params.put("not_start_node", "1");
params.put("workflowid", wfid);
if(requestid > 0){
params.put("not_requestId", requestid);
}
params.put("isNoAccount", "1");
Map<String,String> sqlMap = kqAttFlowSetBiz.getFLowSql(params,user);
String backfields = " * ";
String fromSql = Util.null2String(sqlMap.get("from"));
String sqlWhere = Util.null2String(sqlMap.get("where"));
String allSql = "select "+ backfields + fromSql+sqlWhere;
//存一下sql对应的考勤流程类型
wftypeMap.put(allSql,tmp_wftype);
if(mapSqls.containsKey(resourceId)){
List<String> tmp_sqls = mapSqls.get(resourceId);
tmp_sqls.add(allSql);
}else{
sqls = Lists.newArrayList();
sqls.add(allSql);
mapSqls.put(resourceId,sqls);
}
}
/**
* 组装人员和开始结束日期时间的map集合
* @param duplicateMaps
* @param resourceId
* @param fromdatetime_long
* @param todatetime_long
*/
public void buildMap(Map<String, List<Map<String, String>>> duplicateMaps, String resourceId,
long fromdatetime_long, long todatetime_long) {
Map<String,String> duplicateMap = Maps.newConcurrentMap();
List<Map<String,String>> duplicateLists = Lists.newArrayList();
duplicateMap.put("fromdatetime_long", ""+fromdatetime_long);
duplicateMap.put("todatetime_long", ""+todatetime_long);
if(duplicateMaps.containsKey(resourceId)){
List<Map<String,String>> tmp_duplicateLists =duplicateMaps.get(resourceId);
tmp_duplicateLists.add(duplicateMap);
}else{
duplicateLists = Lists.newArrayList();
duplicateLists.add(duplicateMap);
duplicateMaps.put(resourceId, duplicateLists);
}
}
/**
* 组装人员和开始结束日期时间的map集合
* @param duplicateMaps
* @param resourceId
* @param fromdatetime_long
* @param todatetime_long
* @param attendance_fromdatetime_long
* @param attendance_todatetime_long
*/
public void buildMap4Process(Map<String, List<Map<String, String>>> duplicateMaps,
String resourceId,
long fromdatetime_long, long todatetime_long, long attendance_fromdatetime_long,
long attendance_todatetime_long) {
Map<String,String> duplicateMap = Maps.newConcurrentMap();
List<Map<String,String>> duplicateLists = Lists.newArrayList();
duplicateMap.put("fromdatetime_long", ""+fromdatetime_long);
duplicateMap.put("todatetime_long", ""+todatetime_long);
duplicateMap.put("attendance_fromdatetime_long", ""+attendance_fromdatetime_long);
duplicateMap.put("attendance_todatetime_long", ""+attendance_todatetime_long);
if(duplicateMaps.containsKey(resourceId)){
List<Map<String,String>> tmp_duplicateLists =duplicateMaps.get(resourceId);
tmp_duplicateLists.add(duplicateMap);
}else{
duplicateLists = Lists.newArrayList();
duplicateLists.add(duplicateMap);
duplicateMaps.put(resourceId, duplicateLists);
}
}
public void checkDuplicateFlow(List<Map<String, String>> duplicateVals,
Map<String, Object> retmap, long flow_fromdatetime_long, long flow_todatetime_long,
String duplicate_message, String related_requestid, boolean isLeave,
String resourceId) {
for(int j = 0 ; j < duplicateVals.size() ;j++){
Map<String, String> duplicateMap = duplicateVals.get(j);
long fromdatetime_long = StringUtil.parseToLong(duplicateMap.get("fromdatetime_long"));
long todatetime_long = StringUtil.parseToLong(duplicateMap.get("todatetime_long"));
if(duplicateMap.containsKey("attendance_fromdatetime_long") && duplicateMap.containsKey("attendance_todatetime_long")){
//考勤变更流程独有的
long attendance_fromdatetime_long = StringUtil.parseToLong(duplicateMap.get("attendance_fromdatetime_long"));
long attendance_todatetime_long = StringUtil.parseToLong(duplicateMap.get("attendance_todatetime_long"));
//这样说明重复的流程刚好是被变更的这条数据
if(flow_fromdatetime_long == attendance_fromdatetime_long && flow_todatetime_long == attendance_todatetime_long){
continue;
}
}
if(todatetime_long <= flow_fromdatetime_long || fromdatetime_long >= flow_todatetime_long){
//这样表示流程不交叉
}else{
if(isLeave){
long back_fromdatetime_long = fromdatetime_long;
long back_todatetime_long = todatetime_long;
if(fromdatetime_long < flow_fromdatetime_long){
back_fromdatetime_long = flow_fromdatetime_long;
}
if(todatetime_long > flow_todatetime_long){
back_todatetime_long = flow_todatetime_long;
}
boolean isInLeaveBack = getLeaveBack(related_requestid,back_fromdatetime_long,back_todatetime_long,resourceId);
if(isInLeaveBack){
continue;
}
}
retmap.put("status", "-1");
String mobile_duplicate_message= duplicate_message;
String e_duplicate_message= duplicate_message;
String[] replace_str = new String[]{new KQTransMethod().getWorkFlowUrl(related_requestid),new WorkflowRequestComInfo().getRequestName(related_requestid)};
String[] mobile_replace_str = new String[]{new KQTransMethod().getWorkFlowUrl4mobile(related_requestid),new WorkflowRequestComInfo().getRequestName(related_requestid)};
String[] e_replace_str = new String[]{new WorkflowRequestComInfo().getRequestName(related_requestid),new WorkflowRequestComInfo().getRequestName(related_requestid)};
mobile_duplicate_message = StringUtils.replaceEach(mobile_duplicate_message, ori_str,mobile_replace_str);
duplicate_message = StringUtils.replaceEach(duplicate_message, ori_str,replace_str);
e_duplicate_message = StringUtils.replaceEach(e_duplicate_message, ori_str,e_replace_str);
retmap.put("message", duplicate_message);
retmap.put("mobile_message", mobile_duplicate_message);
//给小e用的
retmap.put("e_message", e_duplicate_message);
return;
}
}
}
/**
* 出差,公出流程会受到归档后的变更流程影响
* 请假流程会受到归档后的销假流程影响
* @param tmp_wftype
* @param related_requestid
* @param rs
* @param resourceId
* @param user
* @param flow_fromDate
* @param flow_fromTime
* @param flow_toDate
* @param flow_toTime
*/
public Map<String, String> getSpecialMap(String tmp_wftype,
String related_requestid, RecordSet rs, String resourceId, User user,
String flow_fromDate, String flow_fromTime, String flow_toDate, String flow_toTime) {
Map<String, String> specialMap = Maps.newHashMap();
if(tmp_wftype.equalsIgnoreCase(KqSplitFlowTypeEnum.EVECTION.getFlowtype()+"")){
specialMap = getProcessChange(related_requestid,KqSplitFlowTypeEnum.EVECTION.getTablename(),1,resourceId,related_requestid,flow_fromDate,flow_fromTime,flow_toDate,flow_toTime);
}else if(tmp_wftype.equalsIgnoreCase(KqSplitFlowTypeEnum.OUT.getFlowtype()+"")){
specialMap = getProcessChange(related_requestid,KqSplitFlowTypeEnum.OUT.getTablename(),1,resourceId,related_requestid,
flow_fromDate, flow_fromTime, flow_toDate, flow_toTime);
}else if(tmp_wftype.equalsIgnoreCase(KqSplitFlowTypeEnum.PROCESSCHANGE.getFlowtype()+"")){
String changerequestid = rs.getString("changerequestid");
Map<String, Object> params = Maps.newHashMap();
params.put("resourceId", resourceId);
params.put("requestid", changerequestid);
params.put("isAll", "1");
GetProcessChangeTypeCmd processChangeTypeCmd = new GetProcessChangeTypeCmd(params, user);
Map<String, Object> retmaps = processChangeTypeCmd.execute(null);
if(retmaps != null && !retmaps.isEmpty()){
if(retmaps.containsKey("process_tablename")){
String process_tablename = Util.null2String(retmaps.get("process_tablename"));
if(process_tablename != null && process_tablename.length() > 0){
specialMap = getProcessChange(related_requestid,process_tablename,1,resourceId,related_requestid,
flow_fromDate, flow_fromTime, flow_toDate, flow_toTime);
if(!specialMap.isEmpty()){
specialMap.put("isProcess", "1");
}
}
}
}
}else if(tmp_wftype.equalsIgnoreCase(KqSplitFlowTypeEnum.LEAVE.getFlowtype()+"")) {
specialMap.put("isLeave", "1");
}
return specialMap;
}
}