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.

1090 lines
51 KiB
Java

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.

package com.engine.kq.cmd.myattendance;
import com.api.hrm.bean.KQReportType;
import com.engine.common.biz.AbstractCommonCommand;
import com.engine.common.entity.BizLogContext;
import com.engine.core.interceptor.CommandContext;
import com.engine.kq.biz.*;
import com.engine.kq.entity.WorkTimeEntity;
import com.engine.kq.enums.KqSplitFlowTypeEnum;
import com.engine.kq.wfset.util.SplitActionUtil;
import com.engine.kq.wfset.util.SplitSelectSet;
import org.apache.commons.lang3.StringUtils;
import weaver.common.DateUtil;
import weaver.conn.RecordSet;
import weaver.general.BaseBean;
import weaver.general.Util;
import weaver.hrm.HrmUserVarify;
import weaver.hrm.User;
import weaver.hrm.resource.ResourceComInfo;
import weaver.systeminfo.SystemEnv;
import java.util.*;
/**
* 前台--人事--我的考勤
*/
public class GetHrmKQMonthReportInfoCmd extends AbstractCommonCommand<Map<String, Object>> {
public GetHrmKQMonthReportInfoCmd(Map<String, Object> params, User user) {
this.user = user;
this.params = params;
}
private static boolean isIndirectSuperId(String id,String checkSuperId,ResourceComInfo info){
int loopBreakTimes = 20 ;
for(String loopId = id;
isRightResourceId(loopId) && (loopBreakTimes--)>0 ;
loopId = info.getManagerID(loopId)){
if(isDirectSuperId(loopId,checkSuperId,info)) return true ;
}
return false ;
}
private static boolean isDirectSuperId(String id,String checkSuperId,ResourceComInfo info){
String superId = Util.null2String(info.getManagerID(id)) ;
return isRightResourceId(superId) && superId.equals(checkSuperId) ;
}
private static boolean isRightResourceId(String id){
return StringUtils.isNotBlank(id) && !"0".equals(id) ;
}
/**
* 判断是否是组员或者考勤文员管理的人员
* @param id
* @param checkSuperId
* @return
*/
private static boolean isTeamMembers(String id,String checkSuperId){
boolean isMember = false;
String sql = " select id from cus_fielddata where id=? and field89=? ";
RecordSet rs = new RecordSet();
rs.executeQuery(sql,id,checkSuperId);
if(rs.next()){
isMember = true;
}
String kqwySql = " select b.id from hrmdepartmentdefined a,hrmresource b " +
"where a.kqwy=? and a.deptid=b.departmentid and b.id=?";
rs.executeQuery(kqwySql,checkSuperId,id);
if(rs.next()){
isMember = true;
}
return isMember;
}
@Override
public BizLogContext getLogContext() {
return null;
}
@Override
public Map<String, Object> execute(CommandContext commandContext) {
Map<String, Object> resultMap = new HashMap<String, Object>();
try {
String nowdate = DateUtil.getCurrentDate();
String type = Util.null2String(params.get("type"));//是查看一年的数据还是一月的数据1-年、2-月
String typevalue = Util.null2String(params.get("typevalue"));//指定的年份或者指定的月份
String fromDate = Util.null2String(params.get("fromDate"));//指定日期起点
String toDate = Util.null2String(params.get("toDate"));//指定日期终点
int subCompanyId = Util.getIntValue((String) params.get("subCompanyId"), 0);//指定查看的人员的所属分部
int departmentId = Util.getIntValue((String) params.get("departmentId"), 0);//指定查看的人员的所属部门
String resourceId = Util.null2String(params.get("resourceId"));//指定查看的人员ID
String status = Util.null2String(params.get("status"));//?
/**
* 若未指定查看人员,则默认为当前登录人员
*/
if (resourceId.length() == 0) {
resourceId = "" + user.getUID();
}
ResourceComInfo resourceComInfo = new ResourceComInfo();
if (subCompanyId == 0 || departmentId == 0) {
subCompanyId = Util.getIntValue(resourceComInfo.getSubCompanyID(resourceId), 0);
departmentId = Util.getIntValue(resourceComInfo.getDepartmentID(resourceId), 0);
}
String lastName = resourceComInfo.getResourcename(resourceId);
if (resourceId.equals("" + user.getUID())) {
resultMap.put("title", SystemEnv.getHtmlLabelName(513535, user.getLanguage()));
} else {
resultMap.put("title", SystemEnv.getHtmlLabelName(515563, user.getLanguage()).replace("{name}", lastName));
}
/**
* 判断是否有权限查看
*/
//if (!resourceId.equals("" + user.getUID()) && !isIndirectSuperId(resourceId, user.getUID() + "", resourceComInfo) && !HrmUserVarify.checkUserRight("HrmResource:Absense", user, departmentId)) {
// resultMap.put("status", "-1");
// resultMap.put("hasRight", false);
// return resultMap;
//}
//二开线长查看组员考勤
if (!resourceId.equals("" + user.getUID()) && !isTeamMembers(resourceId, user.getUID() + "") && !isIndirectSuperId(resourceId, user.getUID() + "", resourceComInfo) && !HrmUserVarify.checkUserRight("HrmResource:Absense", user, departmentId)) {
resultMap.put("status", "-1");
resultMap.put("hasRight", false);
return resultMap;
}
/**
* 获取指定日期范围的起点和终点
*/
if (type.equals("1")) {//年
if (typevalue.length() == 0 || typevalue.length() != 4) {
typevalue = DateUtil.getYear();
}
fromDate = typevalue + "-01-01";
toDate = DateUtil.getLastDayOfYear(DateUtil.parseToDate(fromDate));
} else if (type.equals("2")) {//月
if (typevalue.length() == 0) {
typevalue = DateUtil.getYear() + "-" + DateUtil.getMonth();
}
fromDate = typevalue + "-01";
toDate = DateUtil.getLastDayOfMonthToString(DateUtil.parseToDate(fromDate));
}
/**获取今天的日期*/
Calendar today = Calendar.getInstance();
String currentdate = Util.add0(today.get(Calendar.YEAR), 4) + "-"
+ Util.add0(today.get(Calendar.MONTH) + 1, 2) + "-"
+ Util.add0(today.get(Calendar.DAY_OF_MONTH), 2);
/**判断是否在考勤日历上显示签到签退数据*/
boolean showSign = true;
String settingSql = "select * from KQ_SETTINGS where main_key='showSignOnCalendar'";
RecordSet rs = new RecordSet();
rs.executeQuery(settingSql);
if (rs.next()) {
String main_val = rs.getString("main_val");
showSign = main_val.equals("1");
}
//签到签退明细
Map<String,Object> signInfoMap = getSignInfo();
List<Map<String, Object>> signInfoList = new ArrayList<Map<String, Object>>();
//休息明细(统计工作日)
List<String> isNotRestList = new ArrayList<String>();
//迟到明细
List<String> beLateList = new ArrayList<String>();
//早退明细
List<String> leaveEarlyList = new ArrayList<String>();
//旷工明细
List<String> absentList = new ArrayList<String>();
//漏签明细
List<String> noSignList = new ArrayList<String>();
//请假明细
Map<String, Object> leaveMap = getFlowData(KqSplitFlowTypeEnum.LEAVE.getFlowtype());
//出差明细
Map<String, Object> evectionMap = getFlowData(KqSplitFlowTypeEnum.EVECTION.getFlowtype());
//公出明细
Map<String, Object> outDaysMap = getFlowData(KqSplitFlowTypeEnum.OUT.getFlowtype());
//加班明细
Map<String, Object> overtimeMap = getFlowData(KqSplitFlowTypeEnum.OVERTIME.getFlowtype());
//调配工作日
List<String> workdayList = new ArrayList<String>();
//调配休息日、公众假日
List<String> holidayList = new ArrayList<String>();
//二开 获取加班打卡数据
Map<String, Object> overtimSignMap = getOvertimeSignInfo(fromDate,toDate);
//获取节假日
List<Map<String, Object>> tempList = KQHolidaySetBiz.getHolidaySetListByScope(resourceId, fromDate, toDate);
for (Map<String, Object> tempMap : tempList) {
String date = Util.null2String(tempMap.get("date"));
int changeType = Util.getIntValue((String) tempMap.get("type"), 1);
if (changeType == 1 || changeType == 3) {
holidayList.add(date);
} else if (changeType == 2) {
workdayList.add(date);
}
}
String sql = "select * from kq_format_detail where resourceId=" + resourceId + " and KQDate>='" + fromDate + "' and KQDate<='" + toDate + "' order by kqDate";
RecordSet recordSet = new RecordSet();
RecordSet detailRs = new RecordSet();
recordSet.executeQuery(sql);
KQWorkTime kqWorkTime = new KQWorkTime();
while (recordSet.next()) {
String kqDate = recordSet.getString("kqDate");
String serialId = recordSet.getString("serialId");
WorkTimeEntity workTime = kqWorkTime.getWorkTime(resourceId,kqDate);
if (!isNotRestList.contains(kqDate) && !serialId.equals("")) {
isNotRestList.add(kqDate);
}else if(Util.null2String(workTime.getKQType()).equals("3")){
if(workTime!=null&&Util.getIntValue(workTime.getWorkMins())>0) {
isNotRestList.add(kqDate);
// groupid = Util.null2String(workTime.getGroupId());
// signstart = Util.null2String(workTime.getSignStart());//签到开始时间
// workMins = Util.getIntValue(Util.null2String(workTime.getWorkMins()));//工作时长
}
}
int beLate = recordSet.getInt("beLateMins");//迟到
int graveBeLate = recordSet.getInt("graveBeLateMins");//严重迟到
int leaveEarly = recordSet.getInt("leaveEarlyMins");//早退
int graveLeaveEarly = recordSet.getInt("graveLeaveEarlyMins");//严重早退
int absenteeism = recordSet.getInt("absenteeismMins");//旷工
int forgotCheck = recordSet.getInt("forgotCheckMins");//下班打卡漏签
int forgotBeginWorkCheckMins = recordSet.getInt("forgotBeginWorkCheckMins");//上班打卡漏签
if (absenteeism > 0) {//旷工
absentList.add(kqDate);
} else {
if (beLate > 0 || graveBeLate > 0) { //迟到
beLateList.add(kqDate);
}
if (leaveEarly > 0 || graveLeaveEarly > 0) {//早退
leaveEarlyList.add(kqDate);
}
if (forgotCheck > 0 || forgotBeginWorkCheckMins > 0) {//漏签
noSignList.add(kqDate);
}
}
}
Map<String, Object> year = new HashMap<String, Object>();
Map<String, Object> month = new HashMap<String, Object>();
Map<String, Object> day = new HashMap<String, Object>();
List<Object> types = new ArrayList<Object>();
List<Map<String, Object>> lsWorkflow = new ArrayList<Map<String, Object>>();
Map<String, Object> workflow = new HashMap<String, Object>();
boolean isEnd = false;
for (String date = fromDate; !isEnd; ) {
String tmpMonth = "" + Util.getIntValue(date.split("-")[1]);
String tmpDay = "" + Util.getIntValue(date.split("-")[2]);
if (date.compareTo(toDate) >= 0) {
isEnd = true;
}
/*如果是按年份查看*/
if (type.equals("1")) {
if (!year.containsKey(tmpMonth)) {
month = new HashMap<String, Object>();
year.put(tmpMonth, month);
}
}
day = new HashMap<String, Object>();
month.put(tmpDay, day);
if (isNotRestList.contains(date)) {
day.put("isWorkDay", true);
} else {
day.put("isWorkDay", false);
}
if (type.equals("1")) {
day.put("tip", "");
}
if (holidayList.contains(date)) {
day.put("tip", SystemEnv.getHtmlLabelName(125806, user.getLanguage()));
day.put("isWorkDay", false);
} else if (workdayList.contains(date)) {
day.put("tip", SystemEnv.getHtmlLabelName(125807, user.getLanguage()));
day.put("isWorkDay", true);
}
day.put("date", date);
types = new ArrayList<Object>();
if (type.equals("2")) {
day.put("types", types);
}
lsWorkflow = new ArrayList<Map<String, Object>>();
/*只有月视图才显示流程数据、只有月视图才把签到签退信息显示在日历上*/
if (type.equals("2") && showSign) {
signInfoList = (List)signInfoMap.get(date);
if (signInfoList != null && signInfoList.size() > 0) {
day.put("signInfo", signInfoList);
}
}
/*只有月视图才显示流程数据*/
if (type.equals("2")) {
day.put("workflow", lsWorkflow);
}
boolean isNormal = true;
//迟到明细
if (beLateList.contains(date)) {
if (!types.contains(KQReportType.BELATE)) {
types.add(KQReportType.BELATE);
isNormal = false;
}
}
//旷工明细
if (absentList.contains(date)) {
if (!types.contains(KQReportType.ABSENT)) {
types.add(KQReportType.ABSENT);
isNormal = false;
}
}
//早退明细
if (leaveEarlyList.contains(date)) {
if (!types.contains(KQReportType.LEAVEEARLY)) {
types.add(KQReportType.LEAVEEARLY);
isNormal = false;
}
}
//漏签明细
if (noSignList.contains(date)) {
if (!types.contains(KQReportType.NOSIGN)) {
types.add(KQReportType.NOSIGN);
isNormal = false;
}
}
//请假明细
if (leaveMap.containsKey(resourceId + "|" + date)) {
if (!types.contains(KQReportType.LEAVE)) {
types.add(KQReportType.LEAVE);
isNormal = false;
}
tempList = (List<Map<String, Object>>) leaveMap.get(resourceId + "|" + date);
for (Map<String, Object> tempMap : tempList) {
lsWorkflow.add(tempMap);
}
}
//加班明细 二开增加打卡判断,有打卡才显示
if (!Util.null2String(overtimeMap.get(resourceId + "|" + date)).equals("") && overtimSignMap.containsKey(resourceId + "|" + date) ) {
if (!types.contains(KQReportType.OVERTIME)) {
types.add(KQReportType.OVERTIME);
}
tempList = (List<Map<String, Object>>) overtimeMap.get(resourceId + "|" + date);
for (Map<String, Object> tempMap : tempList) {
lsWorkflow.add(tempMap);
}
}
//外出明细
if (evectionMap.containsKey(resourceId + "|" + date)) {
if (!types.contains(KQReportType.EVECTION)) {
types.add(KQReportType.EVECTION);
isNormal = false;
}
tempList = (List<Map<String, Object>>) evectionMap.get(resourceId + "|" + date);
for (Map<String, Object> tempMap : tempList) {
lsWorkflow.add(tempMap);
}
}
//公出明细
if (outDaysMap.containsKey(resourceId + "|" + date)) {
if (!types.contains(KQReportType.OUTDAYS)) {
types.add(KQReportType.OUTDAYS);
isNormal = false;
}
tempList = (List<Map<String, Object>>) outDaysMap.get(resourceId + "|" + date);
for (Map<String, Object> tempMap : tempList) {
lsWorkflow.add(tempMap);
}
}
if (isNotRestList.contains(date) && DateUtil.isInDateRange(date, fromDate, nowdate)) {
if (isNormal) {
types.add(KQReportType.NORMAL);
}
}
if (type.equals("1")) {
day.put("type", types.size() > 0 ? types.get(0) : "NORMAL");
}
date = DateUtil.getDate(date, 1);
}
if (type.equals("1")) {
resultMap.put("result", year);
} else {
resultMap.put("result", month);
}
resultMap.put("status", "1");
} catch (Exception e) {
resultMap.put("api_status", false);
resultMap.put("api_errormsg", e.getMessage());
writeLog(e);
}
return resultMap;
}
/**
* 获取指定人员在指定时间范围内的流程集合
*
* @return
*/
public Map<String, Object> getFlowData(int flowType) {
Map<String, Object> resultMap = new HashMap<String, Object>();
try {
String nowdate = DateUtil.getCurrentDate();
String type = Util.null2String(params.get("type"));//是查看一年的数据还是一月的数据1-年、2-月
String typevalue = Util.null2String(params.get("typevalue"));//指定的年份或者指定的月份
String fromDate = Util.null2String(params.get("fromDate"));//指定日期起点
String toDate = Util.null2String(params.get("toDate"));//指定日期终点
int subCompanyId = Util.getIntValue((String) params.get("subCompanyId"), 0);//指定查看的人员的所属分部
int departmentId = Util.getIntValue((String) params.get("departmentId"), 0);//指定查看的人员的所属部门
String resourceId = Util.null2String(params.get("resourceId"));//指定查看的人员ID
String status = Util.null2String(params.get("status"));//?
/**
* 若未指定查看人员,则默认为当前登录人员
*/
if (resourceId.length() == 0) {
resourceId = "" + user.getUID();
}
/**
* 获取指定日期的起点和终点
*/
if (type.equals("1")) {//年
if (typevalue.length() == 0 || typevalue.length() != 4) {
typevalue = DateUtil.getYear();
}
fromDate = typevalue + "-01-01";
toDate = DateUtil.getLastDayOfYear(DateUtil.parseToDate(fromDate));
} else if (type.equals("2")) {//月
if (typevalue.length() == 0) {
typevalue = DateUtil.getYear() + "-" + DateUtil.getMonth();
}
fromDate = typevalue + "-01";
toDate = DateUtil.getLastDayOfMonthToString(DateUtil.parseToDate(fromDate));
}
/**获取销假*/
List<String> leaveBackList = getLeaveDate();
KQExitRulesComInfo exitRulesComInfo = new KQExitRulesComInfo();
KQTravelRulesComInfo travelRulesComInfo = new KQTravelRulesComInfo();
KQLeaveRulesComInfo rulesComInfo = new KQLeaveRulesComInfo();
KQTimeSelectionComInfo kqTimeSelectionComInfo = new KQTimeSelectionComInfo();
KQWorkTime kqWorkTime = new KQWorkTime();
boolean showOnHoliday = true;//非工作日是否显示流程(出差、公出、请假)
String timeselection = "1";
String selectiontype = "";
String typeName = "";
KQReportType workflowType = null;
switch (flowType) {
case 3://加班
typeName = SystemEnv.getHtmlLabelName(6151, user.getLanguage());
workflowType = KQReportType.OVERTIME;
selectiontype = ""+KqSplitFlowTypeEnum.OVERTIME.getFlowtype();
timeselection = KQOvertimeRulesBiz.getTimeselection();
break;
case 2://公出
typeName = SystemEnv.getHtmlLabelName(24058, user.getLanguage());
workflowType = KQReportType.OUTDAYS;
showOnHoliday = exitRulesComInfo.getComputingMode("1").equals("2");
selectiontype = ""+KqSplitFlowTypeEnum.OUT.getFlowtype();
timeselection = KQExitRulesBiz.getTimeselection();
break;
case 1://出差
typeName = SystemEnv.getHtmlLabelName(20084, user.getLanguage());
workflowType = KQReportType.EVECTION;
showOnHoliday = travelRulesComInfo.getComputingMode("1").equals("2");
selectiontype = ""+KqSplitFlowTypeEnum.EVECTION.getFlowtype();
timeselection = KQTravelRulesBiz.getTimeselection();
break;
case 0://请假
typeName = SystemEnv.getHtmlLabelName(670, user.getLanguage());
workflowType = KQReportType.LEAVE;
selectiontype = ""+KqSplitFlowTypeEnum.LEAVE.getFlowtype();
break;
default:
break;
}
/**
* 获取数据集合
*/
List<Map<String, Object>> workflowList = new ArrayList<Map<String, Object>>();
Map<String, Object> workflowMap = new HashMap<String, Object>();
Map<String, Object> paramsMap = new HashMap<String, Object>();
paramsMap.put("typeselect", "6");
paramsMap.put("tabKey", "1");
paramsMap.put("kqtype", "" + flowType);
paramsMap.put("resourceId", resourceId);
paramsMap.put("fromDate", fromDate);
paramsMap.put("toDate", toDate);
paramsMap.put("isMyKQ", "1");
paramsMap.put("isNoAccount","1");
KQAttFlowSetBiz kqAttFlowSetBiz = new KQAttFlowSetBiz();
Map<String, String> sqlMap = kqAttFlowSetBiz.getFLowSql(paramsMap, user);
String sqlFrom = sqlMap.get("from");
String sqlWhere = sqlMap.get("where");
String sql = "select * " + sqlFrom + sqlWhere;
RecordSet recordSet = new RecordSet();
recordSet.executeQuery(sql);
while (recordSet.next()) {
String requestId = recordSet.getString("requestId");
double duration = Util.getDoubleValue(recordSet.getString("duration"), 0.00);
double backDuration = 0.00;
int durationrule = recordSet.getInt("durationrule");
String fromDateTemp = recordSet.getString("fromDate");
String fromTimeTemp = recordSet.getString("fromTime");
String toDateTemp = recordSet.getString("toDate");
String toTimeTemp = recordSet.getString("toTime");
String belongdate = Util.null2String(recordSet.getString("belongdate"));
String leaveRulesId = "";
String filterholidays = "";
String count = String.format("%.2f", duration) + "(" + ((durationrule == 3||durationrule == 5||durationrule == 6) ? SystemEnv.getHtmlLabelName(391, user.getLanguage()) : SystemEnv.getHtmlLabelName(1925, user.getLanguage())) + ")";
if(flowType == 3){
count = String.format("%.2f", duration) + "(" + ((durationrule == 3||durationrule == 5||durationrule == 6) ? SystemEnv.getHtmlLabelName(391, user.getLanguage()) : SystemEnv.getHtmlLabelName(1925, user.getLanguage())) + ")";
}
if (flowType == 0) {
backDuration = Util.getDoubleValue(recordSet.getString("backDuraion"), 0.00);
if (backDuration > 0) {
count = String.format("%.2f", duration) + "(" + (SystemEnv.getHtmlLabelName(24473, user.getLanguage()) + ":" + String.format("%.2f", backDuration)) + ")" + ((durationrule == 3||durationrule == 5||durationrule == 6) ? SystemEnv.getHtmlLabelName(391, user.getLanguage()) : SystemEnv.getHtmlLabelName(1925, user.getLanguage()));
}
leaveRulesId = recordSet.getString("newleavetype");
String computingMode = rulesComInfo.getComputingMode(leaveRulesId);
if("2".equalsIgnoreCase(computingMode)){
//按照自然日计算
showOnHoliday = true;
filterholidays= rulesComInfo.getFilterHolidays(leaveRulesId);
} else {
showOnHoliday = false;
}
typeName = Util.formatMultiLang(rulesComInfo.getLeaveName(leaveRulesId), "" + user.getLanguage());
}
String start = fromDateTemp + " " + fromTimeTemp;
String end = toDateTemp + " " + toTimeTemp;
if (2 == durationrule || 4 == durationrule) {
if (2 == durationrule) {
if(leaveRulesId.length() > 0){
timeselection = rulesComInfo.getTimeSelection(leaveRulesId);
}
if("1".equalsIgnoreCase(timeselection)){
Map<String,String> half_map = kqTimeSelectionComInfo.getTimeselections(selectiontype,leaveRulesId,durationrule+"");
String cus_am = SystemEnv.getHtmlLabelName(16689, user.getLanguage());
String cus_pm = SystemEnv.getHtmlLabelName(16690, user.getLanguage());
if(half_map != null && !half_map.isEmpty()){
cus_am = Util.null2String(half_map.get("half_on"));
cus_pm = Util.null2String(half_map.get("half_off"));
}
if (fromTimeTemp.equalsIgnoreCase(SplitSelectSet.forenoon_start)) {
start = fromDateTemp + " " + cus_am;
} else if (fromTimeTemp.equalsIgnoreCase(SplitSelectSet.forenoon_end)) {
start = fromDateTemp + " " + cus_pm;
}
if (toTimeTemp.equalsIgnoreCase(SplitSelectSet.afternoon_start)) {
end = toDateTemp + " " + cus_am;
} else if (toTimeTemp.equalsIgnoreCase(SplitSelectSet.afternoon_end)) {
end = toDateTemp + " " + cus_pm;
}
}
}
if (4 == durationrule) {
if (fromTimeTemp.equalsIgnoreCase(SplitSelectSet.forenoon_start)) {
start = fromDateTemp + " " + SystemEnv.getHtmlLabelName(390728, user.getLanguage());
}
if (toTimeTemp.equalsIgnoreCase(SplitSelectSet.afternoon_end)) {
end = toDateTemp + " " + SystemEnv.getHtmlLabelName(390728, user.getLanguage());
}
}
}
//二开 修改加班归属只判断flowType=3 加班类型,其他类型走原逻辑
if(flowType==0 || flowType==1 || flowType==3 ){
boolean isWorkDay = kqWorkTime.isWorkDay(resourceId, belongdate);
if (!leaveBackList.contains(resourceId + "|" + belongdate + "|" + requestId)) {
workflowList = (ArrayList<Map<String, Object>>) resultMap.get(resourceId + "|" + belongdate);
if (null == workflowList) {
workflowList = new ArrayList<Map<String, Object>>();
}
workflowMap = new HashMap<String, Object>();
workflowMap.put("count", count);
workflowMap.put("start", start);
workflowMap.put("end", end);
workflowMap.put("type", typeName);
workflowMap.put("workflowtype", workflowType);
workflowMap.put("requestId", requestId);
workflowMap.put("belongdate", belongdate);
workflowMap.put("title", "<a href=javaScript:openFullWindowHaveBarForWFList('/workflow/request/ViewRequestForwardSPA.jsp?requestid=" + requestId + "&ismonitor=1&isovertime=0'," + requestId + ");>" + typeName + "</a>");
workflowList.add(workflowMap);
if (!(!isWorkDay && !showOnHoliday)) {
SplitActionUtil splitActionUtil = new SplitActionUtil();
boolean is_filterholidays = splitActionUtil.check_filterholidays(filterholidays, resourceId, belongdate, 1);
if(!is_filterholidays){
resultMap.put(resourceId + "|" + belongdate, workflowList);
}
}
}
}else {
boolean isEnd = false;
for (String date = fromDateTemp; !isEnd; ) {
if (date.equals(toDateTemp)) {
isEnd = true;
}
boolean isWorkDay = kqWorkTime.isWorkDay(resourceId, date);
if(!isWorkDay && !showOnHoliday) {
date = DateUtil.getDate(date, 1);
continue;
}
if (!leaveBackList.contains(resourceId + "|" + date + "|" + requestId)) {
workflowList = (ArrayList<Map<String, Object>>) resultMap.get(resourceId + "|" + date);
if (null == workflowList) {
workflowList = new ArrayList<Map<String, Object>>();
}
workflowMap = new HashMap<String, Object>();
workflowMap.put("count", count);
workflowMap.put("start", start);
workflowMap.put("end", end);
workflowMap.put("type", typeName);
workflowMap.put("workflowtype", workflowType);
workflowMap.put("requestId", requestId);
workflowMap.put("belongdate", belongdate);
workflowMap.put("title", "<a href=javaScript:openFullWindowHaveBarForWFList('/workflow/request/ViewRequestForwardSPA.jsp?requestid=" + requestId + "&ismonitor=1&isovertime=0'," + requestId + ");>" + typeName + "</a>");
workflowList.add(workflowMap);
if (!(!isWorkDay && !showOnHoliday)) {
SplitActionUtil splitActionUtil = new SplitActionUtil();
boolean is_filterholidays = splitActionUtil.check_filterholidays(filterholidays, resourceId, date, 1);
if(!is_filterholidays){
resultMap.put(resourceId + "|" + date, workflowList);
}
}
}
date = DateUtil.getDate(date, 1);
}
}
}
} catch (Exception e) {
writeLog(e);
}
return resultMap;
}
/**
* 获取请完假之后又销掉的日期
*
* @return
*/
private List<String> getLeaveDate() {
List<String> resultList = new ArrayList<String>();
try {
String nowdate = DateUtil.getCurrentDate();
String type = Util.null2String(params.get("type"));//是查看一年的数据还是一月的数据1-年、2-月
String typevalue = Util.null2String(params.get("typevalue"));//指定的年份或者指定的月份
String fromDate = Util.null2String(params.get("fromDate"));//指定日期起点
String toDate = Util.null2String(params.get("toDate"));//指定日期终点
int subCompanyId = Util.getIntValue((String) params.get("subCompanyId"), 0);//指定查看的人员的所属分部
int departmentId = Util.getIntValue((String) params.get("departmentId"), 0);//指定查看的人员的所属部门
String resourceId = Util.null2String(params.get("resourceId"));//指定查看的人员ID
String status = Util.null2String(params.get("status"));//?
/**
* 若未指定查看人员,则默认为当前登录人员
*/
if (resourceId.length() == 0) {
resourceId = "" + user.getUID();
}
/**
* 获取指定日期的起点和终点
*/
if (type.equals("1")) {//年
if (typevalue.length() == 0 || typevalue.length() != 4) {
typevalue = DateUtil.getYear();
}
fromDate = typevalue + "-01-01";
toDate = DateUtil.getLastDayOfYear(DateUtil.parseToDate(fromDate));
} else if (type.equals("2")) {//月
if (typevalue.length() == 0) {
typevalue = DateUtil.getYear() + "-" + DateUtil.getMonth();
}
fromDate = typevalue + "-01";
toDate = DateUtil.getLastDayOfMonthToString(DateUtil.parseToDate(fromDate));
}
String leaveBackTableName = KqSplitFlowTypeEnum.LEAVEBACK.getTablename();
String leaveTableName = KqSplitFlowTypeEnum.LEAVE.getTablename();
String sql = " select requestId,resourceId,belongDate,duration,durationRule," +
" (select sum(duration) from " + leaveBackTableName + " where " + leaveBackTableName + ".leavebackrequestid=" + leaveTableName + ".requestid " +
" and " + leaveBackTableName + ".newleavetype=" + leaveTableName + ".newleavetype " +
" and " + leaveBackTableName + ".belongdate=" + leaveTableName + ".belongDate ) as backDuration " +
" from " + leaveTableName + " where 1=1 ";
if (!resourceId.equals("")) {
sql += " and " + leaveTableName + ".resourceId=" + resourceId;
}
if (fromDate.length() > 0 && toDate.length() > 0) {
sql += " and " + leaveTableName + ".belongdate between'" + fromDate + "' and '" + toDate + "' ";
}
RecordSet recordSet = new RecordSet();
recordSet.executeQuery(sql);
while (recordSet.next()) {
String requestId = recordSet.getString("requestId");
String belongDate = recordSet.getString("belongDate");
double duration = Util.getDoubleValue(recordSet.getString("duration"), 0.00);
if (duration <= 0) {
continue;
}
double backDuration = Util.getDoubleValue(recordSet.getString("backDuration"), 0.00);
if (backDuration >= duration) {
resultList.add(resourceId + "|" + belongDate + "|" + requestId);
}
}
} catch (Exception e) {
writeLog(e);
}
return resultList;
}
/**
* 获取某段时间内的所有签到签退信息
*
* @return
*/
private Map<String, Object> getSignInfo() {
Map<String, Object> resultMap = new HashMap<String, Object>();
try {
String type = Util.null2String(params.get("type"));//是查看一年的数据还是一月的数据1-年、2-月
String typevalue = Util.null2String(params.get("typevalue"));//指定的年份或者指定的月份
String fromDate = Util.null2String(params.get("fromDate"));//指定日期起点
String toDate = Util.null2String(params.get("toDate"));//指定日期终点
String resourceId = Util.null2String(params.get("resourceId"));//指定查看的人员ID
/**
* 若未指定查看人员,则默认为当前登录人员
*/
if (resourceId.length() == 0) {
resourceId = "" + user.getUID();
}
/**
* 获取指定日期的起点和终点
*/
if (type.equals("1")) {//年
if (typevalue.length() == 0 || typevalue.length() != 4) {
typevalue = DateUtil.getYear();
}
fromDate = typevalue + "-01-01";
toDate = DateUtil.getLastDayOfYear(DateUtil.parseToDate(fromDate));
} else if (type.equals("2")) {//月
if (typevalue.length() == 0) {
typevalue = DateUtil.getYear() + "-" + DateUtil.getMonth();
}
fromDate = typevalue + "-01";
toDate = DateUtil.getLastDayOfMonthToString(DateUtil.parseToDate(fromDate));
}
/**
* 判断是否显示补打卡数据
*/
RecordSet recordSet = new RecordSet();
boolean showCard = false;
String settingSql = "select * from KQ_SETTINGS where main_key='showSignFromCard'";
recordSet.executeQuery(settingSql);
if (recordSet.next()) {
String main_val = recordSet.getString("main_val");
showCard = main_val.equals("1");
}
SignInfo signInfo = null;
Map<String, SignInfo> signInfoMap = new LinkedHashMap<String, SignInfo>();
String sql = "SELECT a.kqdate,a.resourceId,a.serialNumber,a.serialId,'signIn' signType,a.signInDate signDate,a.signInTime signTime,b.clientAddress,b.addr FROM KQ_FORMAT_DETAIL a LEFT JOIN HrmScheduleSign b ON a.signInId=b.id WHERE 1=1 AND resourceId=" + resourceId + "\n ";
if (!showCard) {
sql += " AND (signFrom is null or signFrom not like 'card%') ";
}
if (!"".equals(fromDate)) {
sql += " AND kqDate>='" + fromDate + "' ";
}
if (!"".equals(toDate)) {
sql += " AND kqDate<='" + toDate + "' ";
}
sql += " UNION ALL\n " +
"SELECT a.kqdate,a.resourceId,a.serialNumber,a.serialId,'signOut' signType,a.signOutDate signDate,a.signOutTime signTime,b.clientAddress,b.addr FROM KQ_FORMAT_DETAIL a LEFT JOIN HrmScheduleSign b ON a.signOutId=b.id WHERE 1=1 AND resourceId=" + resourceId + "\n ";
if (!showCard) {
sql += " AND (signFrom is null or signFrom not like 'card%') ";
}
if (!"".equals(fromDate)) {
sql += " AND kqDate>='" + fromDate + "' ";
}
if (!"".equals(toDate)) {
sql += " AND kqDate<='" + toDate + "' ";
}
sql += "ORDER BY kqDate,resourceId,serialNumber,signType ";
recordSet.executeQuery(sql);
while (recordSet.next()) {
String kqDate = Util.null2String(recordSet.getString("kqDate"));
String signType = Util.null2String(recordSet.getString("signType"));
String signDate = Util.null2String(recordSet.getString("signDate"));
String signTime = Util.null2String(recordSet.getString("signTime"));
String serialId = Util.null2String(recordSet.getString("serialId"));
int serialNumber = Util.getIntValue(recordSet.getString("serialNumber"), 0);
signInfo = signInfoMap.get(kqDate);
if (signInfo == null) {
signInfo = new SignInfo();
}
signInfo.setSerialId("" + serialId);
if ("signIn".equals(signType)) {
if (serialNumber == 2) {
signInfo.setNeedSign3(true);
signInfo.setSignInTime3(signTime);
} else if (serialNumber == 1) {
signInfo.setNeedSign2(true);
signInfo.setSignInTime2(signTime);
} else {
signInfo.setNeedSign1(true);
signInfo.setSignInTime1(signTime);
}
} else {
if (serialNumber == 2) {
signInfo.setNeedSign3(true);
signInfo.setSignOutTime3(signTime);
} else if (serialNumber == 1) {
signInfo.setNeedSign2(true);
signInfo.setSignOutTime2(signTime);
} else {
signInfo.setNeedSign1(true);
signInfo.setSignOutTime1(signTime);
}
}
signInfoMap.put(kqDate,signInfo);
}
Map<String, Object> itemMap = null;
List<Map<String, Object>> itemList = null;
for (Map.Entry entry : signInfoMap.entrySet()) {
String kqDate = (String) entry.getKey();
signInfo = (SignInfo) entry.getValue();
String serialId = Util.null2String(signInfo.getSerialId());
boolean needSign1 = signInfo.isNeedSign1();
String signInTime1 = Util.null2String(signInfo.getSignInTime1());
String signOutTime1 = Util.null2String(signInfo.getSignOutTime1());
boolean needSign2 = signInfo.isNeedSign2();
String signInTime2 = Util.null2String(signInfo.getSignInTime2());
String signOutTime2 = Util.null2String(signInfo.getSignOutTime2());
boolean needSign3 = signInfo.isNeedSign3();
String signInTime3 = Util.null2String(signInfo.getSignInTime3());
String signOutTime3 = Util.null2String(signInfo.getSignOutTime3());
itemList = new ArrayList<Map<String, Object>>();
if (serialId.equals("") || serialId.equals("0")) {
if (signInTime1.equals("") && signOutTime1.equals("")) {
continue;
} else {
itemMap = new HashMap<String, Object>();
itemMap.put("title", SystemEnv.getHtmlLabelName(512504, user.getLanguage()));
if (signInTime1.equals("")) {
itemMap.put("signTime", SystemEnv.getHtmlLabelName(25994, user.getLanguage()));
} else {
itemMap.put("signTime", signInTime1);
}
itemList.add(itemMap);
itemMap = new HashMap<String, Object>();
itemMap.put("title", SystemEnv.getHtmlLabelName(512505, user.getLanguage()));
if (signOutTime1.equals("")) {
itemMap.put("signTime", SystemEnv.getHtmlLabelName(25994, user.getLanguage()));
} else {
itemMap.put("signTime", signOutTime1);
}
itemList.add(itemMap);
resultMap.put(kqDate,itemList);
}
} else {
itemMap = new HashMap<String, Object>();
itemMap.put("title", SystemEnv.getHtmlLabelName(512504, user.getLanguage()));
if (signInTime1.equals("")) {
itemMap.put("signTime", SystemEnv.getHtmlLabelName(25994, user.getLanguage()));
} else {
itemMap.put("signTime", signInTime1);
}
itemList.add(itemMap);
itemMap = new HashMap<String, Object>();
itemMap.put("title", SystemEnv.getHtmlLabelName(512505, user.getLanguage()));
if (signOutTime1.equals("")) {
itemMap.put("signTime", SystemEnv.getHtmlLabelName(25994, user.getLanguage()));
} else {
itemMap.put("signTime", signOutTime1);
}
itemList.add(itemMap);
if (needSign2) {
itemMap = new HashMap<String, Object>();
itemMap.put("title", SystemEnv.getHtmlLabelName(512504, user.getLanguage()));
if (signInTime2.equals("")) {
itemMap.put("signTime", SystemEnv.getHtmlLabelName(25994, user.getLanguage()));
} else {
itemMap.put("signTime", signInTime2);
}
itemList.add(itemMap);
itemMap = new HashMap<String, Object>();
itemMap.put("title", SystemEnv.getHtmlLabelName(512505, user.getLanguage()));
if (signOutTime2.equals("")) {
itemMap.put("signTime", SystemEnv.getHtmlLabelName(25994, user.getLanguage()));
} else {
itemMap.put("signTime", signOutTime2);
}
itemList.add(itemMap);
}
if (needSign3) {
itemMap = new HashMap<String, Object>();
itemMap.put("title", SystemEnv.getHtmlLabelName(512504, user.getLanguage()));
if (signInTime3.equals("")) {
itemMap.put("signTime", SystemEnv.getHtmlLabelName(25994, user.getLanguage()));
} else {
itemMap.put("signTime", signInTime3);
}
itemList.add(itemMap);
itemMap = new HashMap<String, Object>();
itemMap.put("title", SystemEnv.getHtmlLabelName(512505, user.getLanguage()));
if (signOutTime3.equals("")) {
itemMap.put("signTime", SystemEnv.getHtmlLabelName(25994, user.getLanguage()));
} else {
itemMap.put("signTime", signOutTime3);
}
itemList.add(itemMap);
}
BaseBean bb = new BaseBean();
//所有的休息班次id
String xxrSerialId = bb.getPropValue("hskq_main","xxrSerialId");
if(Arrays.asList(xxrSerialId.split(",")).contains(serialId)){
//是休息班的班次
if("".equals(signInTime1) && "".equals(signOutTime1)){
//休息班且无上下班打卡记录时,不显示未打卡字样
itemList = new ArrayList<Map<String, Object>>();
}
}
resultMap.put(kqDate,itemList);
}
}
} catch (Exception e) {
writeLog(e);
}
return resultMap;
}
/**
* 判断是否有加班打卡
* @param fromDate
* @param toDate
* @return
*/
public Map<String,Object> getOvertimeSignInfo(String fromDate,String toDate){
Map<String, Object> overtiemInfo = new HashMap<>();
RecordSet rs = new RecordSet();
rs.executeQuery(" select resourceid,belongdate,duration_min from kq_flow_overtime " +
"where belongdate>=? and belongdate<=? and fromtimedb is not null ",fromDate,toDate);
while(rs.next()){
String resourceid = Util.null2String(rs.getString("resourceid"));
String belongdate = Util.null2String(rs.getString("belongdate"));
String duration_min = Util.null2String(rs.getString("duration_min"));
overtiemInfo.put(resourceid+"|"+belongdate,duration_min);
}
return overtiemInfo;
}
class SignInfo {
private String serialId;
private boolean needSign1 = false;
private String signInTime1;
private String signOutTime1;
private boolean needSign2 = false;
private String signInTime2;
private String signOutTime2;
private boolean needSign3 = false;
private String signInTime3;
private String signOutTime3;
public SignInfo() {
}
public String getSerialId() {
return serialId;
}
public void setSerialId(String serialId) {
this.serialId = serialId;
}
public boolean isNeedSign1() {
return needSign1;
}
public void setNeedSign1(boolean needSign1) {
this.needSign1 = needSign1;
}
public String getSignInTime1() {
return signInTime1;
}
public void setSignInTime1(String signInTime1) {
this.signInTime1 = signInTime1;
}
public String getSignOutTime1() {
return signOutTime1;
}
public void setSignOutTime1(String signOutTime1) {
this.signOutTime1 = signOutTime1;
}
public boolean isNeedSign2() {
return needSign2;
}
public void setNeedSign2(boolean needSign2) {
this.needSign2 = needSign2;
}
public String getSignInTime2() {
return signInTime2;
}
public void setSignInTime2(String signInTime2) {
this.signInTime2 = signInTime2;
}
public String getSignOutTime2() {
return signOutTime2;
}
public void setSignOutTime2(String signOutTime2) {
this.signOutTime2 = signOutTime2;
}
public boolean isNeedSign3() {
return needSign3;
}
public void setNeedSign3(boolean needSign3) {
this.needSign3 = needSign3;
}
public String getSignInTime3() {
return signInTime3;
}
public void setSignInTime3(String signInTime3) {
this.signInTime3 = signInTime3;
}
public String getSignOutTime3() {
return signOutTime3;
}
public void setSignOutTime3(String signOutTime3) {
this.signOutTime3 = signOutTime3;
}
}
}