com.engine.kq 无需提交备案 属于编译文件
一次性需求 补充考勤异常提醒2024.12.01 - 2024.12.08 之间未开启开关丢失的提醒
This commit is contained in:
parent
3349b6a2e4
commit
3e5b0e0b08
|
|
@ -0,0 +1,74 @@
|
|||
package com.engine.kq.bean;
|
||||
|
||||
/**
|
||||
* 排班制考勤组----排班设置权限(数据存储在建模表中)
|
||||
*/
|
||||
public class KqLockAttenda {
|
||||
private String LOCK_COM;
|
||||
|
||||
private String LOCK_SUBCOM;
|
||||
|
||||
private String LOCK_DEPT;
|
||||
|
||||
private String LOCK_RESOURCE;
|
||||
|
||||
private String LOCK_FROMDATE;
|
||||
private String LOCK_TODATE;
|
||||
private String LOCK_LOCK;
|
||||
|
||||
public String getLOCK_COM() {
|
||||
return LOCK_COM;
|
||||
}
|
||||
|
||||
public void setLOCK_COM(String LOCK_COM) {
|
||||
this.LOCK_COM = LOCK_COM;
|
||||
}
|
||||
|
||||
public String getLOCK_SUBCOM() {
|
||||
return LOCK_SUBCOM;
|
||||
}
|
||||
|
||||
public void setLOCK_SUBCOM(String LOCK_SUBCOM) {
|
||||
this.LOCK_SUBCOM = LOCK_SUBCOM;
|
||||
}
|
||||
|
||||
public String getLOCK_DEPT() {
|
||||
return LOCK_DEPT;
|
||||
}
|
||||
|
||||
public void setLOCK_DEPT(String LOCK_DEPT) {
|
||||
this.LOCK_DEPT = LOCK_DEPT;
|
||||
}
|
||||
|
||||
public String getLOCK_RESOURCE() {
|
||||
return LOCK_RESOURCE;
|
||||
}
|
||||
|
||||
public void setLOCK_RESOURCE(String LOCK_RESOURCE) {
|
||||
this.LOCK_RESOURCE = LOCK_RESOURCE;
|
||||
}
|
||||
|
||||
public String getLOCK_FROMDATE() {
|
||||
return LOCK_FROMDATE;
|
||||
}
|
||||
|
||||
public void setLOCK_FROMDATE(String LOCK_FROMDATE) {
|
||||
this.LOCK_FROMDATE = LOCK_FROMDATE;
|
||||
}
|
||||
|
||||
public String getLOCK_TODATE() {
|
||||
return LOCK_TODATE;
|
||||
}
|
||||
|
||||
public void setLOCK_TODATE(String LOCK_TODATE) {
|
||||
this.LOCK_TODATE = LOCK_TODATE;
|
||||
}
|
||||
|
||||
public String getLOCK_LOCK() {
|
||||
return LOCK_LOCK;
|
||||
}
|
||||
|
||||
public void setLOCK_LOCK(String LOCK_LOCK) {
|
||||
this.LOCK_LOCK = LOCK_LOCK;
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,860 @@
|
|||
package com.engine.kq.biz;
|
||||
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.engine.kq.cmd.attendanceButton.ButtonStatusEnum;
|
||||
import com.engine.kq.entity.TimeScopeEntity;
|
||||
import com.engine.kq.entity.TimeSignScopeEntity;
|
||||
import com.engine.kq.entity.WorkTimeEntity;
|
||||
import com.engine.kq.log.KQLog;
|
||||
import com.engine.kq.util.UtilKQ;
|
||||
import com.engine.kq.wfset.util.KQSignUtil;
|
||||
import com.google.common.collect.Lists;
|
||||
|
||||
import java.io.PrintWriter;
|
||||
import java.io.StringWriter;
|
||||
|
||||
import weaver.common.DateUtil;
|
||||
import weaver.conn.RecordSet;
|
||||
import weaver.general.BaseBean;
|
||||
import weaver.general.Util;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* 获取班次打卡数据
|
||||
*/
|
||||
public class KQFormatSignData extends BaseBean {
|
||||
private KQLog kqLog = new KQLog();
|
||||
|
||||
public List<Object> getSignInfo(String userId, TimeScopeEntity signTimeScope,
|
||||
TimeScopeEntity workTimeScope, String kqDate, String preDate,
|
||||
String nextDate, KQTimesArrayComInfo kqTimesArrayComInfo) {
|
||||
return getSignInfo(userId, signTimeScope, workTimeScope, kqDate, preDate, nextDate, kqTimesArrayComInfo,
|
||||
Lists.newArrayList(), "");
|
||||
}
|
||||
|
||||
public List<Object> getSignInfo(String userId, TimeScopeEntity signTimeScope,
|
||||
TimeScopeEntity workTimeScope, String kqDate, String preDate,
|
||||
String nextDate, KQTimesArrayComInfo kqTimesArrayComInfo, ArrayList<String> hostIps, String uuid) {
|
||||
return getSignInfo(userId, signTimeScope, workTimeScope, kqDate, preDate, nextDate, kqTimesArrayComInfo, hostIps, uuid, 0, 0);
|
||||
}
|
||||
|
||||
public List<Object> getSignInfo(String userId, TimeScopeEntity signTimeScope,
|
||||
TimeScopeEntity workTimeScope, String kqDate, String preDate,
|
||||
String nextDate, KQTimesArrayComInfo kqTimesArrayComInfo, ArrayList<String> hostIps, String uuid, int shiftCount, int shiftI) {
|
||||
return getSignInfo(userId, signTimeScope, workTimeScope, kqDate, preDate, nextDate, kqTimesArrayComInfo, hostIps, uuid, shiftCount, shiftI, 0);
|
||||
}
|
||||
|
||||
/***
|
||||
* 获取班次打卡数据
|
||||
* @param userId
|
||||
* @param signTimeScope
|
||||
* @param workTimeScope
|
||||
* @param kqDate
|
||||
* @param preDate
|
||||
* @param nextDate
|
||||
* @param kqTimesArrayComInfo
|
||||
* @return
|
||||
*/
|
||||
public List<Object> getSignInfo(String userId, TimeScopeEntity signTimeScope,
|
||||
TimeScopeEntity workTimeScope, String kqDate, String preDate,
|
||||
String nextDate, KQTimesArrayComInfo kqTimesArrayComInfo, ArrayList<String> hostIps, String uuid, int shiftCount, int shiftI, int signoutOnlyoff) {
|
||||
kqLog.info("in getSignInfo ::userId" + userId + "kqDate==" + kqDate + ":hostIps:" + hostIps + ":uuid::" + uuid + " in ");
|
||||
List<Object> lsCheckInfo = new ArrayList<>();
|
||||
String count4NoonStartDateTime = "";
|
||||
String count4NoonEndDateTime = "";
|
||||
try {
|
||||
Map<String, Object> checkInfo = null;
|
||||
String base_sql = "";
|
||||
RecordSet rs = new RecordSet();
|
||||
String dbtype = rs.getDBType();
|
||||
|
||||
//获取工作上下班时间
|
||||
String workBeginDateTime = workTimeScope.getBeginTimeAcross() ? nextDate : kqDate;
|
||||
workBeginDateTime += " " + kqTimesArrayComInfo.turn48to24Time(workTimeScope.getBeginTime()) + ":00";
|
||||
kqLog.info("in getSignInfo ::userId" + userId + "kqDate==" + kqDate + ":hostIps:" + hostIps + ":uuid::" + uuid + "::workBeginDateTime::" + workBeginDateTime);
|
||||
|
||||
//获取工作上下班时间
|
||||
String workEndDateTime = workTimeScope.getEndTimeAcross() ? nextDate : kqDate;
|
||||
workEndDateTime += " " + kqTimesArrayComInfo.turn48to24Time(workTimeScope.getEndTime()) + ":00";
|
||||
kqLog.info("in getSignInfo ::userId" + userId + "kqDate==" + kqDate + ":hostIps:" + hostIps + ":uuid::" + uuid + "::workEndDateTime::" + workEndDateTime);
|
||||
|
||||
Map<String, String> flow_deduct_card_map = getflowDeductCardSql(userId, kqDate, workTimeScope.getBeginTime(), workTimeScope.getEndTime());
|
||||
|
||||
kqLog.info("in getSignInfo ::userId" + userId + "kqDate==" + kqDate + ":hostIps:" + hostIps + ":uuid::" + uuid + "::flow_deduct_card_map::" + flow_deduct_card_map);
|
||||
kqLog.info("in getSignInfo ::userId" + userId + "kqDate==" + kqDate + ":hostIps:" + hostIps + ":uuid::" + uuid + "::signTimeScope::" + JSON.toJSONString(signTimeScope));
|
||||
|
||||
List<Map<String, String>> sqlConditions = getCanSignInfo(signTimeScope, kqDate, preDate, nextDate, kqTimesArrayComInfo, workTimeScope, shiftCount, shiftI, signoutOnlyoff);
|
||||
base_sql = signSignSql(rs);
|
||||
new KQLog().info("sqlConditions:(userId:" + userId + ":base_sql" + base_sql + ":::userId" + userId + "kqDate==" + kqDate + ":hostIps:" + hostIps + ":uuid::" + uuid + "::flow_deduct_card_map::" + flow_deduct_card_map + "::sqlConditions::" + JSONObject.toJSONString(sqlConditions));
|
||||
if (sqlConditions != null && !sqlConditions.isEmpty()) {
|
||||
kqLog.info("userId="+userId + ",kqDate="+kqDate+":sqlConditions:"+ JSONObject.toJSONString(sqlConditions));
|
||||
if(shiftCount == 2) {
|
||||
String fieldName = "";
|
||||
if(shiftI == 0) {
|
||||
fieldName = "signEndDateTime";
|
||||
/*
|
||||
1、设置了上班结束打卡或者下班开始打卡,那么sqlConditions的如下
|
||||
sqlConditions:[
|
||||
{"signEndDateTime":"2024-08-28 10:00:59","signBeginDateTime":"2024-08-28 06:00:00","type":"signin"},
|
||||
{"signEndDateTime":"2024-08-28 12:40:59","signBeginDateTime":"2024-08-28 11:40:00","type":"signoff"}
|
||||
]
|
||||
2、没有设置上班结束或者下班开始,那么sqlConditions的如下
|
||||
sqlConditions:[
|
||||
{"signEndDateTime":"2024-08-28 12:40:59","signBeginDateTime":"2024-08-28 06:00:00"}
|
||||
]
|
||||
*/
|
||||
Map<String, String> sqlMap = sqlConditions.get((null!=sqlConditions && sqlConditions.size()>0)?(sqlConditions.size()-1):0);
|
||||
String type = Util.null2String(sqlMap.get("type"));
|
||||
if(type.length() > 0){
|
||||
if("signoff".equalsIgnoreCase(type)){
|
||||
count4NoonEndDateTime = Util.null2String(sqlMap.get(fieldName));
|
||||
if (sqlConditions.size() >= 2) {
|
||||
sqlMap = sqlConditions.get(1);
|
||||
count4NoonStartDateTime = workEndDateTime;
|
||||
count4NoonEndDateTime = Util.null2String(sqlMap.get("signEndDateTime"));
|
||||
}
|
||||
}else if("signin".equalsIgnoreCase(type)){
|
||||
//暂不处理
|
||||
}
|
||||
}else{
|
||||
count4NoonStartDateTime = workEndDateTime;
|
||||
count4NoonEndDateTime = Util.null2String(sqlMap.get(fieldName));
|
||||
}
|
||||
} else if(shiftI == 1) {
|
||||
fieldName = "signBeginDateTime";
|
||||
Map<String, String> sqlMap = sqlConditions.get(0);
|
||||
String type = Util.null2String(sqlMap.get("type"));
|
||||
if(type.length() > 0){
|
||||
if("signoff".equalsIgnoreCase(type)){
|
||||
//暂不处理
|
||||
}else if("signin".equalsIgnoreCase(type)){
|
||||
count4NoonStartDateTime = Util.null2String(sqlMap.get("signBeginDateTime"));
|
||||
if (count4NoonStartDateTime.length() == 19) {
|
||||
count4NoonStartDateTime = count4NoonStartDateTime.substring(0, 17) + "00";
|
||||
}
|
||||
count4NoonEndDateTime = workBeginDateTime;
|
||||
}
|
||||
}else{
|
||||
count4NoonStartDateTime = Util.null2String(sqlMap.get(fieldName));
|
||||
if (count4NoonStartDateTime.length() == 19) {
|
||||
count4NoonStartDateTime = count4NoonStartDateTime.substring(0, 17) + "00";
|
||||
}
|
||||
count4NoonEndDateTime = workBeginDateTime;
|
||||
}
|
||||
}
|
||||
// Map<String, String> sqlMap = sqlConditions.get(0);
|
||||
// count4NoonStartDateTime = Util.null2String(sqlMap.get(fieldName));
|
||||
// if (count4NoonStartDateTime.length() == 19) {
|
||||
// count4NoonStartDateTime = count4NoonStartDateTime.substring(0, 17) + "00";
|
||||
// }
|
||||
// sqlMap = sqlConditions.get(0);
|
||||
// count4NoonEndDateTime = Util.null2String(sqlMap.get(fieldName));
|
||||
// if (sqlConditions.size() >= 2) {
|
||||
// sqlMap = sqlConditions.get(1);
|
||||
// count4NoonEndDateTime = Util.null2String(sqlMap.get(fieldName));
|
||||
// }
|
||||
}
|
||||
|
||||
boolean hasSignIn = false;
|
||||
for (Map<String, String> sqlMap : sqlConditions) {
|
||||
String sql = "";
|
||||
String orderSql = "";
|
||||
int idx = 0;
|
||||
String signBeginDateTime = Util.null2String(sqlMap.get("signBeginDateTime"));
|
||||
String signEndDateTime = Util.null2String(sqlMap.get("signEndDateTime"));
|
||||
String type = Util.null2String(sqlMap.get("type"));
|
||||
String signoutOnlyoff_flag = Util.null2String(sqlMap.get("signoutOnlyoff"));
|
||||
if (type.length() > 0) {
|
||||
if ("signoff".equalsIgnoreCase(type)) {
|
||||
orderSql = " order by signdate desc, signtime desc ";
|
||||
} else if ("signin".equalsIgnoreCase(type)) {
|
||||
orderSql = " order by signdate asc, signtime asc ";
|
||||
}
|
||||
if ("oracle".equalsIgnoreCase(dbtype)) {
|
||||
sql = "select * from (" + base_sql + " " + orderSql + ") a where rownum=1";
|
||||
} else if ("mysql".equalsIgnoreCase(dbtype)) {
|
||||
sql = "select * from (" + base_sql + " " + orderSql + ") a limit 0,1";
|
||||
} else if ("postgresql".equalsIgnoreCase(dbtype)) {
|
||||
sql = "select * from (" + base_sql + " " + orderSql + ") a limit 1 offset 0";
|
||||
} else if ("sqlserver".equalsIgnoreCase(dbtype)) {
|
||||
sql = "select top 1 * from (" + base_sql + ") a " + " " + orderSql;
|
||||
} else {
|
||||
sql = "select * from (" + base_sql + " " + orderSql + ") a where rownum=1";
|
||||
}
|
||||
} else {
|
||||
orderSql = " order by signdate asc, signtime asc ";
|
||||
sql = base_sql + " " + orderSql;
|
||||
}
|
||||
rs.executeQuery(sql, userId, signBeginDateTime, signEndDateTime);
|
||||
new KQLog().info("getSignInfo:(userId:" + userId + ":signBeginDateTime:" +
|
||||
signBeginDateTime + ":signEndDateTime:" + signEndDateTime + "):sql" + sql + ":counts:" + rs.getCounts() + ":::userId" + userId + "kqDate==" + kqDate + ":hostIps:" + hostIps + ":uuid::" + uuid + "::flow_deduct_card_map::" + flow_deduct_card_map);
|
||||
while (rs.next()) {
|
||||
String signId = Util.null2String(rs.getString("id"));
|
||||
String signdate = Util.null2String(rs.getString("signdate"));
|
||||
String signtime = Util.null2String(rs.getString("signtime"));
|
||||
|
||||
checkInfo = new HashMap<>();
|
||||
checkInfo.put("signId", signId);//签到签退标识
|
||||
checkInfo.put("signDate", signdate);//签到签退日期
|
||||
checkInfo.put("signTime", signtime);//签到签退时间
|
||||
String signDateTime = signdate + " " + signtime;
|
||||
idx++;
|
||||
if (type.length() > 0) {
|
||||
if ("signin".equalsIgnoreCase(type)) {
|
||||
checkInfo.put("signType", "1");
|
||||
if (workBeginDateTime.length() > 0) {
|
||||
checkInfo.put("signStatus", UtilKQ.getSignStatus("1", signDateTime, workBeginDateTime));
|
||||
}
|
||||
if (!Util.null2String(checkInfo.get("signStatus")).equalsIgnoreCase(ButtonStatusEnum.NORMAL.getStatusCode())) {
|
||||
if (flow_deduct_card_map.containsKey("signin")) {
|
||||
String deduct_signintime = Util.null2String(flow_deduct_card_map.get("signin"));
|
||||
if (deduct_signintime.length() > 0) {
|
||||
signDateTime = signdate + " " + deduct_signintime;
|
||||
checkInfo.put("deduct_signintime", deduct_signintime);//流程抵扣作为打卡时间
|
||||
checkInfo.put("signStatus", UtilKQ.getSignStatus("1", signDateTime, workBeginDateTime));
|
||||
}
|
||||
}
|
||||
}
|
||||
lsCheckInfo.add(checkInfo);
|
||||
} else {
|
||||
checkInfo.put("signType", "2");
|
||||
if (workEndDateTime.length() > 0) {
|
||||
checkInfo.put("signStatus", UtilKQ.getSignStatus("2", signDateTime, workEndDateTime));
|
||||
}
|
||||
if (!Util.null2String(checkInfo.get("signStatus")).equalsIgnoreCase(ButtonStatusEnum.NORMAL.getStatusCode())) {
|
||||
if (flow_deduct_card_map.containsKey("signoff")) {
|
||||
String deduct_signofftime = Util.null2String(flow_deduct_card_map.get("signoff"));
|
||||
if (deduct_signofftime.length() > 0) {
|
||||
signDateTime = signdate + " " + deduct_signofftime;
|
||||
checkInfo.put("deduct_signofftime", deduct_signofftime);//流程抵扣作为打卡时间
|
||||
checkInfo.put("signStatus", UtilKQ.getSignStatus("2", signDateTime, workEndDateTime));
|
||||
}
|
||||
}
|
||||
}
|
||||
lsCheckInfo.add(checkInfo);
|
||||
}
|
||||
} else {
|
||||
if (signoutOnlyoff_flag.length()>0) {
|
||||
if("signin".equals(signoutOnlyoff_flag) && idx == 1){
|
||||
checkInfo.put("signType", "1");
|
||||
if (workBeginDateTime.length() > 0) {
|
||||
checkInfo.put("signStatus", UtilKQ.getSignStatus("1", signDateTime, workBeginDateTime));
|
||||
}
|
||||
if (!Util.null2String(checkInfo.get("signStatus")).equalsIgnoreCase(ButtonStatusEnum.NORMAL.getStatusCode())) {
|
||||
if (flow_deduct_card_map.containsKey("signin")) {
|
||||
String deduct_signintime = Util.null2String(flow_deduct_card_map.get("signin"));
|
||||
if (deduct_signintime.length() > 0) {
|
||||
signDateTime = signdate + " " + deduct_signintime;
|
||||
checkInfo.put("deduct_signintime", deduct_signintime);//流程抵扣作为打卡时间
|
||||
checkInfo.put("signStatus", UtilKQ.getSignStatus("1", signDateTime, workBeginDateTime));
|
||||
}
|
||||
}
|
||||
}
|
||||
lsCheckInfo.add(checkInfo);
|
||||
hasSignIn = true;
|
||||
}
|
||||
if("signoff".equals(signoutOnlyoff_flag)){
|
||||
if ((hasSignIn && idx == rs.getCounts() && idx > 1) || (!hasSignIn && idx == rs.getCounts())) {//第一条可能是签到卡需要处理下,否则可能会导致一条上班卡同时识别为上班卡和下班卡
|
||||
checkInfo.put("signType", "2");
|
||||
if (workEndDateTime.length() > 0) {
|
||||
checkInfo.put("signStatus", UtilKQ.getSignStatus("2", signDateTime, workEndDateTime));
|
||||
}
|
||||
if (!Util.null2String(checkInfo.get("signStatus")).equalsIgnoreCase(ButtonStatusEnum.NORMAL.getStatusCode())) {
|
||||
if (flow_deduct_card_map.containsKey("signoff")) {
|
||||
String deduct_signofftime = Util.null2String(flow_deduct_card_map.get("signoff"));
|
||||
if (deduct_signofftime.length() > 0) {
|
||||
signDateTime = signdate + " " + deduct_signofftime;
|
||||
checkInfo.put("deduct_signofftime", deduct_signofftime);//流程抵扣作为打卡时间
|
||||
checkInfo.put("signStatus", UtilKQ.getSignStatus("2", signDateTime, workEndDateTime));
|
||||
}
|
||||
}
|
||||
}
|
||||
lsCheckInfo.add(checkInfo);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (idx == 1) {//第一条算签到
|
||||
checkInfo.put("signType", "1");
|
||||
if (workBeginDateTime.length() > 0) {
|
||||
checkInfo.put("signStatus", UtilKQ.getSignStatus("1", signDateTime, workBeginDateTime));
|
||||
}
|
||||
if (!Util.null2String(checkInfo.get("signStatus")).equalsIgnoreCase(ButtonStatusEnum.NORMAL.getStatusCode())) {
|
||||
if (flow_deduct_card_map.containsKey("signin")) {
|
||||
String deduct_signintime = Util.null2String(flow_deduct_card_map.get("signin"));
|
||||
if (deduct_signintime.length() > 0) {
|
||||
signDateTime = signdate + " " + deduct_signintime;
|
||||
checkInfo.put("deduct_signintime", deduct_signintime);//流程抵扣作为打卡时间
|
||||
checkInfo.put("signStatus", UtilKQ.getSignStatus("1", signDateTime, workBeginDateTime));
|
||||
}
|
||||
}
|
||||
}
|
||||
lsCheckInfo.add(checkInfo);
|
||||
hasSignIn = true;
|
||||
} else if (idx == rs.getCounts()) {//最后一条算签退
|
||||
checkInfo.put("signType", "2");
|
||||
if (workEndDateTime.length() > 0) {
|
||||
checkInfo.put("signStatus", UtilKQ.getSignStatus("2", signDateTime, workEndDateTime));
|
||||
}
|
||||
if (!Util.null2String(checkInfo.get("signStatus")).equalsIgnoreCase(ButtonStatusEnum.NORMAL.getStatusCode())) {
|
||||
if (flow_deduct_card_map.containsKey("signoff")) {
|
||||
String deduct_signofftime = Util.null2String(flow_deduct_card_map.get("signoff"));
|
||||
if (deduct_signofftime.length() > 0) {
|
||||
signDateTime = signdate + " " + deduct_signofftime;
|
||||
checkInfo.put("deduct_signofftime", deduct_signofftime);//流程抵扣作为打卡时间
|
||||
checkInfo.put("signStatus", UtilKQ.getSignStatus("2", signDateTime, workEndDateTime));
|
||||
}
|
||||
}
|
||||
}
|
||||
lsCheckInfo.add(checkInfo);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
//如果签到,签退不成对,流程抵扣异常存在,那么需要判断下是不是可以补足
|
||||
if (lsCheckInfo.size() < 2 && !flow_deduct_card_map.isEmpty()) {
|
||||
if (lsCheckInfo.isEmpty()) {
|
||||
if (flow_deduct_card_map.containsKey("signin")) {
|
||||
String deduct_signintime = Util.null2String(flow_deduct_card_map.get("signin"));
|
||||
if (deduct_signintime.length() > 0) {
|
||||
checkInfo = new HashMap<>();
|
||||
String[] workBeginDateTimes = workBeginDateTime.split(" ");
|
||||
String tmp_workBeginDate = workBeginDateTimes[0];
|
||||
String tmp_workBeginTime = workBeginDateTimes[1];
|
||||
checkInfo.put("signType", "1");
|
||||
checkInfo.put("signDate", tmp_workBeginDate);//签到签退日期
|
||||
checkInfo.put("signTime", "");//签到签退时间
|
||||
checkInfo.put("deduct_signintime", tmp_workBeginTime);//流程抵扣作为打卡时间
|
||||
checkInfo.put("signStatus", ButtonStatusEnum.NORMAL.getStatusCode());
|
||||
lsCheckInfo.add(checkInfo);
|
||||
}
|
||||
}
|
||||
if (flow_deduct_card_map.containsKey("signoff")) {
|
||||
String deduct_signofftime = Util.null2String(flow_deduct_card_map.get("signoff"));
|
||||
if (deduct_signofftime.length() > 0) {
|
||||
checkInfo = new HashMap<>();
|
||||
String[] workEndDateTimes = workEndDateTime.split(" ");
|
||||
String tmp_workEndDate = workEndDateTimes[0];
|
||||
String tmp_workEndTime = workEndDateTimes[1];
|
||||
checkInfo.put("signType", "2");
|
||||
checkInfo.put("signDate", tmp_workEndDate);//签到签退日期
|
||||
checkInfo.put("signTime", "");//签到签退时间
|
||||
checkInfo.put("deduct_signofftime", tmp_workEndTime);//流程抵扣作为打卡时间
|
||||
checkInfo.put("signStatus", ButtonStatusEnum.NORMAL.getStatusCode());
|
||||
lsCheckInfo.add(checkInfo);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
Map<String, Object> checkCardMap = (Map<String, Object>) lsCheckInfo.get(0);
|
||||
if (!checkCardMap.isEmpty()) {
|
||||
String signType = Util.null2String(checkCardMap.get("signType"));
|
||||
if ("1".equalsIgnoreCase(signType)) {
|
||||
//如果签到数据有了,检测下是不是有签退的流程抵扣打卡
|
||||
if (flow_deduct_card_map.containsKey("signoff")) {
|
||||
String deduct_signofftime = Util.null2String(flow_deduct_card_map.get("signoff"));
|
||||
if (deduct_signofftime.length() > 0) {
|
||||
checkInfo = new HashMap<>();
|
||||
String[] workEndDateTimes = workEndDateTime.split(" ");
|
||||
String tmp_workEndDate = workEndDateTimes[0];
|
||||
String tmp_workEndTime = workEndDateTimes[1];
|
||||
checkInfo.put("signType", "2");
|
||||
checkInfo.put("signDate", tmp_workEndDate);//签到签退日期
|
||||
checkInfo.put("signTime", "");//签到签退时间
|
||||
checkInfo.put("deduct_signofftime", tmp_workEndTime);//流程抵扣作为打卡时间
|
||||
checkInfo.put("signStatus", ButtonStatusEnum.NORMAL.getStatusCode());
|
||||
lsCheckInfo.add(checkInfo);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (flow_deduct_card_map.containsKey("signin")) {
|
||||
String deduct_signintime = Util.null2String(flow_deduct_card_map.get("signin"));
|
||||
if (deduct_signintime.length() > 0) {
|
||||
checkInfo = new HashMap<>();
|
||||
String[] workBeginDateTimes = workBeginDateTime.split(" ");
|
||||
String tmp_workBeginDate = workBeginDateTimes[0];
|
||||
String tmp_workBeginTime = workBeginDateTimes[1];
|
||||
checkInfo.put("signType", "1");
|
||||
checkInfo.put("signDate", tmp_workBeginDate);//签到签退日期
|
||||
checkInfo.put("signTime", "");//签到签退时间
|
||||
checkInfo.put("deduct_signintime", tmp_workBeginTime);//流程抵扣作为打卡时间
|
||||
checkInfo.put("signStatus", ButtonStatusEnum.NORMAL.getStatusCode());
|
||||
lsCheckInfo.add(checkInfo);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// 上午的签退取中间时段的第一次打卡
|
||||
if (shiftCount == 2 && shiftI == 0) {
|
||||
String noonSignTimeSql = KQSignUtil.buildSignSql(count4NoonStartDateTime, count4NoonEndDateTime);
|
||||
String baseSql = "select * from hrmschedulesign where 1=1 and isInCom='1' and userid=" + userId + " ";
|
||||
String sql = baseSql;
|
||||
sql += " and " + noonSignTimeSql + " order by signdate, signtime";
|
||||
rs.executeQuery(sql);
|
||||
if (rs.next()) {
|
||||
String signId = Util.null2String(rs.getString("id"));
|
||||
String signDate = Util.null2String(rs.getString("signdate"));
|
||||
String signTime = Util.null2String(rs.getString("signtime"));
|
||||
String signDateTime = signDate + " " + signTime;
|
||||
for (int j = 0; lsCheckInfo != null && j < lsCheckInfo.size(); j++) {
|
||||
Map<String, Object> checkInfoInner = (Map<String, Object>) lsCheckInfo.get(j);
|
||||
if (checkInfoInner.get("signType").equals("2")) {//签退
|
||||
String signDateInner = Util.null2String(checkInfoInner.get("signDate"));
|
||||
String signTimeInner = Util.null2String(checkInfoInner.get("signTime"));
|
||||
String deduct_signofftime = Util.null2String(checkInfoInner.get("deduct_signofftime"));
|
||||
if (!"".equals(signTimeInner)) {
|
||||
String signDateTimeInner = signDateInner + " " + signTimeInner;
|
||||
if (signDateTime.compareTo(signDateTimeInner) < 0) {
|
||||
checkInfoInner.put("signId", signId);//签到签退标识
|
||||
checkInfoInner.put("signType", "2");
|
||||
checkInfoInner.put("signDate", signDateInner);//签到签退日期
|
||||
checkInfoInner.put("signTime", signTime);//签到签退时间
|
||||
checkInfoInner.put("deduct_signofftime", deduct_signofftime);//流程抵扣作为打卡时间
|
||||
checkInfoInner.put("signStatus", ButtonStatusEnum.NORMAL.getStatusCode());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (shiftCount == 2 && shiftI == 1) { // 下午的签到取中间时段的第二次打卡
|
||||
String noonSignTimeSql = KQSignUtil.buildSignSql(count4NoonStartDateTime, count4NoonEndDateTime);
|
||||
String baseSql = "select * from hrmschedulesign where 1=1 and isInCom='1' and userid=" + userId + " ";
|
||||
String sql = baseSql;
|
||||
sql += " and " + noonSignTimeSql + " order by signdate, signtime";
|
||||
rs.executeQuery(sql);
|
||||
int count = 0;
|
||||
int counts = rs.getCounts();
|
||||
if (counts == 1) {
|
||||
// lsCheckInfo.clear();
|
||||
}
|
||||
while (rs.next()) {
|
||||
if (count == 0) {
|
||||
count++;
|
||||
continue;
|
||||
}
|
||||
String signId = Util.null2String(rs.getString("id"));
|
||||
String signTime = Util.null2String(rs.getString("signtime"));
|
||||
for (int j = 0; lsCheckInfo != null && j < lsCheckInfo.size(); j++) {
|
||||
Map<String, Object> checkInfoInner = (Map<String, Object>) lsCheckInfo.get(j);
|
||||
if (checkInfoInner.get("signType").equals("1")) {//签退
|
||||
String signDateInner = Util.null2String(checkInfoInner.get("signDate"));
|
||||
String signTimeInner = Util.null2String(checkInfoInner.get("signTime"));
|
||||
String deduct_signofftime = Util.null2String(checkInfoInner.get("deduct_signofftime"));
|
||||
checkInfoInner.put("signId", signId);//签到签退标识
|
||||
checkInfoInner.put("signType", "1");
|
||||
checkInfoInner.put("signDate", signDateInner);//签到签退日期
|
||||
checkInfoInner.put("signTime", signTime);//签到签退时间
|
||||
checkInfoInner.put("deduct_signofftime", deduct_signofftime);//流程抵扣作为打卡时间
|
||||
checkInfoInner.put("signStatus", ButtonStatusEnum.NORMAL.getStatusCode());
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
|
||||
kqLog.info("报表错:getSignInfo:");
|
||||
StringWriter errorsWriter = new StringWriter();
|
||||
e.printStackTrace(new PrintWriter(errorsWriter));
|
||||
kqLog.info(errorsWriter.toString());
|
||||
}
|
||||
|
||||
//writeLog(sql,userId +"=="+ signBeginDateTime+"=="+signEndDateTime);
|
||||
return lsCheckInfo;
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据上下班时间获取到是否有流程抵扣打卡的数据
|
||||
*
|
||||
* @param userId
|
||||
* @param kqDate
|
||||
* @param workBeginDateTime
|
||||
* @param workEndDateTime
|
||||
*/
|
||||
public Map<String, String> getflowDeductCardSql(String userId, String kqDate, String workBeginDateTime, String workEndDateTime) {
|
||||
Map<String, String> flow_deduct_card_map = new HashMap<>();
|
||||
RecordSet rs = new RecordSet();
|
||||
String flow_deduct_card_sql = "select * from kq_flow_deduct_card where 1=1 and (isclear is null or isclear<>1) ";
|
||||
if (userId.length() > 0) {
|
||||
flow_deduct_card_sql += " and resourceid=" + userId;
|
||||
}
|
||||
if (kqDate.length() > 0) {
|
||||
flow_deduct_card_sql += " and belongDate='" + kqDate + "'";
|
||||
}
|
||||
if (workBeginDateTime.length() > 0) {
|
||||
flow_deduct_card_sql += " and workBeginTime='" + workBeginDateTime + "'";
|
||||
}
|
||||
if (workEndDateTime.length() > 0) {
|
||||
flow_deduct_card_sql += " and workEndTime='" + workEndDateTime + "'";
|
||||
}
|
||||
rs.executeQuery(flow_deduct_card_sql);
|
||||
while (rs.next()) {
|
||||
String signtype = rs.getString("signtype");
|
||||
if ("1".equalsIgnoreCase(signtype)) {
|
||||
flow_deduct_card_map.put("signin", workBeginDateTime);
|
||||
}
|
||||
if ("2".equalsIgnoreCase(signtype)) {
|
||||
flow_deduct_card_map.put("signoff", workEndDateTime);
|
||||
}
|
||||
}
|
||||
return flow_deduct_card_map;
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据打卡的范围生成上班,下班数据获取的sql
|
||||
*
|
||||
* @param signTimeScope
|
||||
* @param kqDate
|
||||
* @param preDate
|
||||
* @param nextDate
|
||||
* @param kqTimesArrayComInfo
|
||||
* @return
|
||||
*/
|
||||
public List<Map<String, String>> getCanSignInfo(TimeScopeEntity signTimeScope, String kqDate, String preDate, String nextDate, KQTimesArrayComInfo kqTimesArrayComInfo) {
|
||||
return getCanSignInfo(signTimeScope, kqDate, preDate, nextDate, kqTimesArrayComInfo, null);
|
||||
}
|
||||
|
||||
public List<Map<String, String>> getCanSignInfo(TimeScopeEntity signTimeScope, String kqDate, String preDate, String nextDate, KQTimesArrayComInfo kqTimesArrayComInfo,TimeScopeEntity workTimeScope,int signoutOnlyoff) {
|
||||
return getCanSignInfo(signTimeScope, kqDate, preDate, nextDate, kqTimesArrayComInfo, workTimeScope, 0, 0, signoutOnlyoff);
|
||||
}
|
||||
|
||||
public List<Map<String, String>> getCanSignInfo(TimeScopeEntity signTimeScope, String kqDate, String preDate, String nextDate, KQTimesArrayComInfo kqTimesArrayComInfo, TimeScopeEntity workTimeScope) {
|
||||
return getCanSignInfo(signTimeScope, kqDate, preDate, nextDate, kqTimesArrayComInfo, workTimeScope, 0, 0);
|
||||
}
|
||||
|
||||
public List<Map<String, String>> getCanSignInfo(TimeScopeEntity signTimeScope, String kqDate, String preDate, String nextDate, KQTimesArrayComInfo kqTimesArrayComInfo, TimeScopeEntity workTimeScope, int shiftCount, int shiftI) {
|
||||
return getCanSignInfo(signTimeScope, kqDate, preDate, nextDate, kqTimesArrayComInfo, workTimeScope, shiftCount, shiftI, 0);
|
||||
}
|
||||
|
||||
public List<Map<String, String>> getCanSignInfo(TimeScopeEntity signTimeScope, String kqDate, String preDate, String nextDate, KQTimesArrayComInfo kqTimesArrayComInfo, TimeScopeEntity workTimeScope, int shiftCount, int shiftI, int signoutOnlyoff) {
|
||||
|
||||
List<Map<String, String>> sqlConditions = new ArrayList<>();
|
||||
Map<String, String> conditionMap = new HashMap<>();
|
||||
|
||||
TimeSignScopeEntity timeSignScopeEntity = signTimeScope.getTimeSignScopeEntity();
|
||||
|
||||
String signBeginDateTime = "";
|
||||
String signEndDateTime = "";
|
||||
signBeginDateTime = signTimeScope.getBeginTimeAcross() ? nextDate : kqDate;
|
||||
if (signTimeScope.isBeginTimePreAcross()) {
|
||||
signBeginDateTime = preDate;
|
||||
}
|
||||
signBeginDateTime += " " + kqTimesArrayComInfo.turn48to24Time(signTimeScope.getBeginTime()) + ":00";
|
||||
|
||||
signEndDateTime = signTimeScope.getEndTimeAcross() ? nextDate : kqDate;
|
||||
|
||||
// if (workTimeScope != null && workTimeScope.getEndTimeAcross() && signTimeScope.getEndTimeAcross() ) {
|
||||
// if(workTimeScope.getEndTime().compareTo(signTimeScope.getEndTime())>=0){
|
||||
// signEndDateTime = DateUtil.addDate(kqDate, 2);//下下一天日期;
|
||||
// }
|
||||
// }
|
||||
signEndDateTime += " " + kqTimesArrayComInfo.turn48to24Time(signTimeScope.getEndTime()) + ":59";
|
||||
|
||||
|
||||
if (timeSignScopeEntity == null) {
|
||||
//没有设置 签到最晚时间和签退最早时间,比如是09:00-18:00,打卡范围是【08:00---19:00】
|
||||
if (signoutOnlyoff == 1 && workTimeScope != null) {//开启了下班后只能签退的按钮,那么考勤格式化的打卡数据查询范围也搞一下
|
||||
String signBeginDateEndTime = "";
|
||||
String signEndDateStartTime = "";
|
||||
String workEndTime = workTimeScope.getEndTime();
|
||||
boolean workEndTimeAcross = workTimeScope.getEndTimeAcross();
|
||||
|
||||
String workEndTimeNew = kqTimesArrayComInfo.getTimesByArrayindex(kqTimesArrayComInfo.getArrayindexByTimes(workEndTime) - 1);//17:59
|
||||
signBeginDateEndTime = workEndTimeAcross ? nextDate : kqDate;
|
||||
signBeginDateEndTime += " " + kqTimesArrayComInfo.turn48to24Time(workEndTimeNew) + ":59";//17:59:59
|
||||
|
||||
conditionMap = new HashMap<>();
|
||||
conditionMap.put("signBeginDateTime", signBeginDateTime);//08:00:00
|
||||
conditionMap.put("signEndDateTime", signBeginDateEndTime);//17:59:59
|
||||
// conditionMap.put("type", "signin");
|
||||
conditionMap.put("signoutOnlyoff", "signin");
|
||||
sqlConditions.add(conditionMap);
|
||||
|
||||
conditionMap = new HashMap<>();
|
||||
conditionMap.put("signBeginDateTime", signBeginDateTime);//08:00:00,这里为什么从上班开始打卡时间起算,因为存在上班有打卡,连续打卡的情况,那么需要将除上班卡之后的打卡都识别为下班卡
|
||||
conditionMap.put("signEndDateTime", signEndDateTime);//19:00:59
|
||||
//这里不能传type=signoff,否则上班打卡可能会同时识别为上班卡和下班卡
|
||||
conditionMap.put("signoutOnlyoff", "signoff");
|
||||
sqlConditions.add(conditionMap);
|
||||
|
||||
} else {//走标准原逻辑
|
||||
conditionMap = new HashMap<>();
|
||||
conditionMap.put("signBeginDateTime", signBeginDateTime);
|
||||
conditionMap.put("signEndDateTime", signEndDateTime);
|
||||
sqlConditions.add(conditionMap);
|
||||
}
|
||||
|
||||
} else {
|
||||
String beginTimeEnd = timeSignScopeEntity.getBeginTimeEnd();
|
||||
boolean beginTimeEndAcross = timeSignScopeEntity.isBeginTimeEndAcross();
|
||||
|
||||
String endTimeStart = timeSignScopeEntity.getEndTimeStart();
|
||||
boolean endTimeStartAcross = timeSignScopeEntity.isEndTimeStartAcross();
|
||||
|
||||
if (beginTimeEnd.length() > 0) {
|
||||
//如果设置了 上班结束时间
|
||||
if (endTimeStart.length() > 0) {
|
||||
//设置了下班开始时间
|
||||
String signBeginDateEndTime = "";
|
||||
String signEndDateStartTime = "";
|
||||
signBeginDateEndTime = beginTimeEndAcross ? nextDate : kqDate;
|
||||
signBeginDateEndTime += " " + kqTimesArrayComInfo.turn48to24Time(beginTimeEnd) + ":59";
|
||||
|
||||
//张总表示设了打卡归属,以设置的为准,这个开关相当于不起作用,代码含泪注释
|
||||
// if(signoutOnlyoff == 1 && workTimeScope != null){//开启了下班后只能签退的按钮,那么考勤格式化的打卡数据查询范围也搞一下
|
||||
// String workEndTime = workTimeScope.getEndTime();
|
||||
// boolean workEndTimeAcross = workTimeScope.getEndTimeAcross();
|
||||
// signBeginDateEndTime = workEndTimeAcross ? nextDate : kqDate;
|
||||
// signBeginDateEndTime+=" "+kqTimesArrayComInfo.turn48to24Time(workEndTime)+":59";
|
||||
// conditionMap = new HashMap<>();
|
||||
// conditionMap.put("signBeginDateTime", signBeginDateTime);
|
||||
// conditionMap.put("signEndDateTime", signBeginDateEndTime);
|
||||
// conditionMap.put("type", "signin");
|
||||
// sqlConditions.add(conditionMap);
|
||||
//
|
||||
// conditionMap = new HashMap<>();
|
||||
// conditionMap.put("signBeginDateTime", signBeginDateEndTime);
|
||||
// conditionMap.put("signEndDateTime", signEndDateTime);
|
||||
// conditionMap.put("type", "signoff");
|
||||
// sqlConditions.add(conditionMap);
|
||||
//
|
||||
// }else{
|
||||
conditionMap = new HashMap<>();
|
||||
conditionMap.put("signBeginDateTime", signBeginDateTime);
|
||||
conditionMap.put("signEndDateTime", signBeginDateEndTime);
|
||||
conditionMap.put("type", "signin");
|
||||
sqlConditions.add(conditionMap);
|
||||
|
||||
signEndDateStartTime = endTimeStartAcross ? nextDate : kqDate;
|
||||
signEndDateStartTime += " " + kqTimesArrayComInfo.turn48to24Time(endTimeStart) + ":00";
|
||||
|
||||
conditionMap = new HashMap<>();
|
||||
conditionMap.put("signBeginDateTime", signEndDateStartTime);
|
||||
conditionMap.put("signEndDateTime", signEndDateTime);
|
||||
conditionMap.put("type", "signoff");
|
||||
sqlConditions.add(conditionMap);
|
||||
// }
|
||||
} else {
|
||||
//没有设置下班开始时间
|
||||
String signBeginDateEndTime = "";
|
||||
String signEndDateStartTime = "";
|
||||
signBeginDateEndTime = beginTimeEndAcross ? nextDate : kqDate;
|
||||
signBeginDateEndTime += " " + kqTimesArrayComInfo.turn48to24Time(beginTimeEnd) + ":59";
|
||||
|
||||
conditionMap = new HashMap<>();
|
||||
conditionMap.put("signBeginDateTime", signBeginDateTime);
|
||||
conditionMap.put("signEndDateTime", signBeginDateEndTime);
|
||||
conditionMap.put("type", "signin");
|
||||
sqlConditions.add(conditionMap);
|
||||
|
||||
//如果设置了上班结束时间,相当于下班开始时间也被限定了
|
||||
String endTimeByBeginTime = kqTimesArrayComInfo.getTimesByArrayindex(kqTimesArrayComInfo.getArrayindexByTimes(beginTimeEnd) + 1);
|
||||
signEndDateStartTime = beginTimeEndAcross ? nextDate : kqDate;
|
||||
signEndDateStartTime += " " + kqTimesArrayComInfo.turn48to24Time(endTimeByBeginTime) + ":00";
|
||||
|
||||
conditionMap = new HashMap<>();
|
||||
conditionMap.put("signBeginDateTime", signEndDateStartTime);
|
||||
conditionMap.put("signEndDateTime", signEndDateTime);
|
||||
conditionMap.put("type", "signoff");
|
||||
sqlConditions.add(conditionMap);
|
||||
}
|
||||
} else if (endTimeStart.length() > 0) {
|
||||
//如果没有设置上班结束时间,设置了下班开始时间
|
||||
String signBeginDateEndTime = "";
|
||||
String signEndDateStartTime = "";
|
||||
|
||||
//如果设置了下班开始时间,相当于上班结束时间也被限定了
|
||||
String BeginTimeByendTime = kqTimesArrayComInfo.getTimesByArrayindex(kqTimesArrayComInfo.getArrayindexByTimes(endTimeStart) - 1);
|
||||
signBeginDateEndTime = endTimeStartAcross ? nextDate : kqDate;
|
||||
signBeginDateEndTime += " " + kqTimesArrayComInfo.turn48to24Time(BeginTimeByendTime) + ":59";
|
||||
|
||||
conditionMap = new HashMap<>();
|
||||
conditionMap.put("signBeginDateTime", signBeginDateTime);
|
||||
conditionMap.put("signEndDateTime", signBeginDateEndTime);
|
||||
conditionMap.put("type", "signin");
|
||||
sqlConditions.add(conditionMap);
|
||||
|
||||
signEndDateStartTime = endTimeStartAcross ? nextDate : kqDate;
|
||||
signEndDateStartTime += " " + kqTimesArrayComInfo.turn48to24Time(endTimeStart) + ":00";
|
||||
|
||||
conditionMap = new HashMap<>();
|
||||
conditionMap.put("signBeginDateTime", signEndDateStartTime);
|
||||
conditionMap.put("signEndDateTime", signEndDateTime);
|
||||
conditionMap.put("type", "signoff");
|
||||
sqlConditions.add(conditionMap);
|
||||
}
|
||||
}
|
||||
return sqlConditions;
|
||||
}
|
||||
|
||||
public String signSignSql(RecordSet rs) {
|
||||
String sql = "";
|
||||
if (rs.getDBType().equals("oracle")) {
|
||||
sql = " select id,signdate,signtime from hrmschedulesign where isincom=1 and userid = ? and signdate||' '||signtime >= ? and signdate||' '||signtime <= ? " +
|
||||
" ";
|
||||
} else if ("sqlserver".equals(rs.getDBType())) {
|
||||
sql = " select id,signdate,signtime from hrmschedulesign where isincom=1 and userid = ? and signdate + ' ' + signtime >= ? and signdate + ' ' + signtime <= ? " +
|
||||
" ";
|
||||
} else {
|
||||
sql = " select id,signdate,signtime from hrmschedulesign where isincom=1 and userid = ? and concat(signdate,' ',signtime) >= ? and concat(signdate,' ',signtime) <= ? " +
|
||||
" ";
|
||||
}
|
||||
return sql;
|
||||
}
|
||||
|
||||
public List<Object> getSignInfoForAll(String userId, String signBeginDateTime, String signEndDateTime, String workBeginDateTime, String workEndDateTime) {
|
||||
List<Object> lsCheckInfo = new ArrayList<>();
|
||||
Map<String, Object> checkInfo = null;
|
||||
String sql = "";
|
||||
RecordSet rs = new RecordSet();
|
||||
|
||||
int idx = 0;
|
||||
if (rs.getDBType().equals("oracle")) {
|
||||
sql = " select id,signdate,signtime from hrmschedulesign where isincom=1 and userid = ? and signdate||' '||signtime >= ? and signdate||' '||signtime <= ? " +
|
||||
" order by signdate asc, signtime asc ";
|
||||
} else if ("sqlserver".equals(rs.getDBType())) {
|
||||
sql = " select id,signdate,signtime from hrmschedulesign where isincom=1 and userid = ? and signdate + ' ' + signtime >= ? and signdate + ' ' + signtime <= ? " +
|
||||
" order by signdate asc, signtime asc ";
|
||||
} else {
|
||||
sql = " select id,signdate,signtime from hrmschedulesign where isincom=1 and userid = ? and concat(signdate,' ',signtime) >= ? and concat(signdate,' ',signtime) <= ? " +
|
||||
" order by signdate asc, signtime asc ";
|
||||
}
|
||||
rs.executeQuery(sql, userId, signBeginDateTime, signEndDateTime);
|
||||
//writeLog(sql,userId +"=="+ signBeginDateTime+"=="+signEndDateTime);
|
||||
while (rs.next()) {
|
||||
String signId = Util.null2String(rs.getString("id"));
|
||||
String signdate = Util.null2String(rs.getString("signdate"));
|
||||
String signtime = Util.null2String(rs.getString("signtime"));
|
||||
|
||||
checkInfo = new HashMap<>();
|
||||
checkInfo.put("signId", signId);//签到签退标识
|
||||
checkInfo.put("signDate", signdate);//签到签退日期
|
||||
checkInfo.put("signTime", signtime);//签到签退时间
|
||||
String signDateTime = signdate + " " + signtime;
|
||||
|
||||
idx++;
|
||||
if (idx % 2 == 1) {
|
||||
checkInfo.put("signType", "1");
|
||||
} else {
|
||||
checkInfo.put("signType", "2");
|
||||
}
|
||||
lsCheckInfo.add(checkInfo);
|
||||
}
|
||||
return lsCheckInfo;
|
||||
}
|
||||
|
||||
public List<Object> getNonWorkSignInfo(String userId, String preDate, String kqDate,
|
||||
List<TimeScopeEntity> pre_lsSignTime,
|
||||
List<TimeScopeEntity> next_lsSignTime) {
|
||||
List<Object> lsCheckInfo = new ArrayList<>();
|
||||
Map<String, Object> checkInfo = null;
|
||||
RecordSet rs = new RecordSet();
|
||||
String pre_Worktime4Today = "";
|
||||
if (!pre_lsSignTime.isEmpty()) {
|
||||
TimeScopeEntity pre_signTimeScope = pre_lsSignTime.get(pre_lsSignTime.size() - 1);
|
||||
if (pre_signTimeScope.getEndTimeAcross()) {
|
||||
pre_Worktime4Today = pre_signTimeScope.getEndTime();
|
||||
}
|
||||
}
|
||||
String next_Worktime4Today = "";
|
||||
if (!next_lsSignTime.isEmpty()) {
|
||||
TimeScopeEntity next_signTimeScope = next_lsSignTime.get(next_lsSignTime.size() - 1);
|
||||
if (next_signTimeScope.isBeginTimePreAcross()) {
|
||||
next_Worktime4Today = next_signTimeScope.getBeginTime();
|
||||
}
|
||||
}
|
||||
String sql = "select * from hrmschedulesign where userid=" + userId + " and signdate = '" + kqDate + "' ";
|
||||
if (pre_Worktime4Today.length() > 0) {
|
||||
if (pre_Worktime4Today.length() == 5) {
|
||||
pre_Worktime4Today += ":59";
|
||||
}
|
||||
sql += " and signtime > '" + pre_Worktime4Today + "'";
|
||||
}
|
||||
if (next_Worktime4Today.length() > 0) {
|
||||
if (next_Worktime4Today.length() == 5) {
|
||||
next_Worktime4Today += ":00";
|
||||
}
|
||||
sql += " and signtime < '" + next_Worktime4Today + "'";
|
||||
}
|
||||
sql += " order by signdate asc,signtime asc ";
|
||||
rs.executeQuery(sql);
|
||||
int idx = 0;
|
||||
while (rs.next()) {
|
||||
String signId = Util.null2String(rs.getString("id"));
|
||||
String signdate = Util.null2String(rs.getString("signdate"));
|
||||
String signtime = Util.null2String(rs.getString("signtime"));
|
||||
|
||||
checkInfo = new HashMap<>();
|
||||
checkInfo.put("signId", signId);//签到签退标识
|
||||
checkInfo.put("signDate", signdate);//签到签退日期
|
||||
checkInfo.put("signTime", signtime);//签到签退时间
|
||||
idx++;
|
||||
if (idx == 1) {//第一条算签到
|
||||
checkInfo.put("signType", "1");
|
||||
lsCheckInfo.add(checkInfo);
|
||||
} else if (idx == rs.getCounts()) {//最后一条算签退
|
||||
checkInfo.put("signType", "2");
|
||||
lsCheckInfo.add(checkInfo);
|
||||
}
|
||||
}
|
||||
return lsCheckInfo;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取班次上班时段
|
||||
* @param serial
|
||||
* @param status
|
||||
* @param record
|
||||
* @return
|
||||
*/
|
||||
private static String getBcTimes(String serial,String status,String record){
|
||||
RecordSet rs = new RecordSet();
|
||||
String sql = "select times from kq_ShiftOnOffWorkSections where serialid = "+serial+" and (isdelete is null or isdelete <> '1') and onoffworktype = '"+status+"' and record = "+record;
|
||||
rs.execute(sql);
|
||||
String times = "";
|
||||
if (rs.next()){
|
||||
times = Util.null2String(rs.getString("times"));
|
||||
}
|
||||
return times;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取打卡数量
|
||||
* @param userId
|
||||
* @param date
|
||||
* @param end
|
||||
* @return
|
||||
*/
|
||||
private static Integer checkDkCount(String userId,String date,String end){
|
||||
RecordSet rs = new RecordSet();
|
||||
String sql = "select count(*) as num from HrmScheduleSign where userid = "+userId+" and signdate = '"+date+"' and signtime < '"+end+"'";
|
||||
rs.execute(sql);
|
||||
Integer dkCount = 0;
|
||||
if (rs.next()){
|
||||
dkCount = Util.getIntValue(rs.getString("num"));
|
||||
}
|
||||
return dkCount;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取上午最后一笔卡
|
||||
* @param userId
|
||||
* @param date
|
||||
* @param end
|
||||
* @return
|
||||
*/
|
||||
private static String getSignTimeNew(String userId,String date,String end){
|
||||
RecordSet rs = new RecordSet();
|
||||
String sql = "select signtime from HrmScheduleSign where userid = "+userId+" and signdate = '"+date+"' and signtime < '"+end+"' order by signtime desc limit 1";
|
||||
rs.execute(sql);
|
||||
String signTimeB = "";
|
||||
if (rs.next()){
|
||||
signTimeB = Util.null2String(rs.getString("signtime"));
|
||||
}
|
||||
return signTimeB;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,220 @@
|
|||
package com.engine.kq.biz;
|
||||
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.cloudstore.dev.api.bean.MessageBean;
|
||||
import com.cloudstore.dev.api.bean.MessageType;
|
||||
import com.cloudstore.dev.api.util.Util_Message;
|
||||
import com.engine.kq.entity.KQGroupEntity;
|
||||
import com.engine.kq.log.KQLog;
|
||||
import com.engine.msgcenter.biz.ConfigManager;
|
||||
import com.engine.msgcenter.biz.WeaMessageTypeConfig;
|
||||
import com.google.common.collect.Sets;
|
||||
import com.weaver.general.Util;
|
||||
import weaver.common.DateUtil;
|
||||
import weaver.conn.RecordSet;
|
||||
import weaver.general.BaseBean;
|
||||
import weaver.hrm.common.Tools;
|
||||
import weaver.hrm.resource.ResourceComInfo;
|
||||
import weaver.interfaces.schedule.BaseCronJob;
|
||||
import weaver.systeminfo.SystemEnv;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
public class KQYesterdayAbnormalRemindJob extends BaseCronJob {
|
||||
|
||||
private BaseBean log = new BaseBean();
|
||||
|
||||
private KQLog kqLog = new KQLog();
|
||||
|
||||
public void execute() {
|
||||
String currentDate = Tools.getCurrentDate();
|
||||
String yesterDay = DateUtil.addDate(currentDate, -1);
|
||||
kqLog.info(">>>>>>>>>>>>>>>>KQYesterdayAbnormalRemindJob>>>>>>>>>>>>>>begin>>>>>>>>>>>>>>>>");
|
||||
handleKqRemind(yesterDay);
|
||||
kqLog.info(">>>>>>>>>>>>>>>>KQYesterdayAbnormalRemindJob>>>>>>>>>>>>>>end>>>>>>>>>>>>>>>>");
|
||||
}
|
||||
|
||||
private void handleKqRemind(String date) {
|
||||
try {
|
||||
ResourceComInfo resourceComInfo = new ResourceComInfo();
|
||||
KQGroupMemberComInfo kqGroupMemberComInfo = new KQGroupMemberComInfo();
|
||||
Map<String, StringBuilder> managerMessages = new HashMap<>();
|
||||
Map<String, StringBuilder> managerMessagesUUID = new HashMap<>();
|
||||
Map<String, Map<String, Double>> yesterdayAbnormalData = new KqYesterdayAbnormalRemindBiz().getYesterdayAbnormalData(date, date);
|
||||
String curDateTime = DateUtil.getDateTime();
|
||||
RecordSet recordSet = new RecordSet();
|
||||
for(Map.Entry<String, Map<String, Double>> entry : yesterdayAbnormalData.entrySet()) {
|
||||
String resourceId = entry.getKey();
|
||||
Map<String, Double> value = entry.getValue();
|
||||
|
||||
KQGroupEntity kQGroupEntity = kqGroupMemberComInfo.getUserKQGroupInfo(resourceId, date);
|
||||
String abnormalremind = Util.null2String(kQGroupEntity.getAbnormalremind());
|
||||
if(!"1".equals(abnormalremind)){
|
||||
kqLog.info(">>>>>>>>>>>>>>>>KQYesterdayAbnormalRemindJob>>>>>>>>>>>>>>abnormalremind is closed>>>>>>>>>>>>>>>>"+resourceId);
|
||||
continue;
|
||||
}
|
||||
|
||||
kqLog.info(">>>>>>>>>>>>>>>>KQYesterdayAbnormalRemindJob>>>>>>>>>>>>>>value>>>>>>>>>>>>>>>>"+value);
|
||||
double late = value.get("late") == null ? 0.0 : value.get("late");
|
||||
double leaveearly = value.get("leaveearly") == null ? 0.0 : value.get("leaveearly");
|
||||
double absent = value.get("absent") == null ? 0.0 : value.get("absent");
|
||||
double forgot = value.get("forgot") == null ? 0.0 : value.get("forgot");
|
||||
double gravelate = value.get("gravelate") == null ? 0.0 : value.get("gravelate");
|
||||
double graveleaveearly = value.get("graveleaveearly") == null ? 0.0 : value.get("graveleaveearly");
|
||||
String content = getLabelName(97) +":"+date+" " + getLabelName(1867)+":"+resourceComInfo.getLastname(resourceId) +" "+ getLabelName(24770)+":";
|
||||
StringBuffer remindContentStr = new StringBuffer();
|
||||
StringBuffer sb = new StringBuffer();
|
||||
|
||||
if(late > 0) {
|
||||
sb.append(getLabelName(20081)) ;//迟到
|
||||
remindContentStr.append(getLabelName(390055)).append(":").append(late).append(getLabelName(518516));
|
||||
}
|
||||
|
||||
if(gravelate > 0){
|
||||
if(sb.length() > 0) {
|
||||
sb.append( ",");
|
||||
}
|
||||
sb.append(getLabelName(500546)) ;//严重迟到
|
||||
if(remindContentStr.length() >0) {
|
||||
remindContentStr.append(",");
|
||||
}
|
||||
remindContentStr.append(getLabelName(390056)).append(":").append(gravelate).append(getLabelName(518516));
|
||||
}
|
||||
|
||||
if(leaveearly > 0){
|
||||
if(sb.length() > 0) {
|
||||
sb.append( ",");
|
||||
}
|
||||
sb.append(getLabelName(20082)) ;//早退
|
||||
if(remindContentStr.length() >0) {
|
||||
remindContentStr.append(",");
|
||||
}
|
||||
remindContentStr.append(getLabelName(390057)).append(":").append(leaveearly).append(getLabelName(518516));
|
||||
}
|
||||
|
||||
if(graveleaveearly > 0){
|
||||
if(sb.length() > 0) {
|
||||
sb.append( ",");
|
||||
}
|
||||
sb.append(getLabelName(500547)) ;//严重早退
|
||||
if(remindContentStr.length() >0) {
|
||||
remindContentStr.append(",");
|
||||
}
|
||||
remindContentStr.append(getLabelName(390058)).append(":").append(graveleaveearly).append(getLabelName(518516));
|
||||
}
|
||||
|
||||
if(absent > 0) {
|
||||
if(sb.length() > 0) {
|
||||
sb.append( ",");
|
||||
}
|
||||
sb.append( getLabelName(20085));//旷工
|
||||
|
||||
if(remindContentStr.length() >0) {
|
||||
remindContentStr.append(",");
|
||||
}
|
||||
remindContentStr.append(getLabelName(390059)).append(":").append(absent).append(getLabelName(518516));
|
||||
}
|
||||
if(forgot > 0) {
|
||||
if(sb.length() > 0) {
|
||||
sb.append( ",");
|
||||
}
|
||||
sb.append(getLabelName(20086));//漏签
|
||||
|
||||
if(remindContentStr.length() >0) {
|
||||
remindContentStr.append(",");
|
||||
}
|
||||
remindContentStr.append(getLabelName(20086)).append(getLabelName(21551)).append(":").append(forgot).append(getLabelName(518516));
|
||||
}
|
||||
if(sb.length() > 0) {
|
||||
content += sb.toString();
|
||||
content += "<br>"+remindContentStr.toString();
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
kqLog.info(">>>>>>>>>>>>>>>>KQYesterdayAbnormalRemindJob>>>>>>>>>>>>>>content>>>>>>>>>>>>>>>>"+content);
|
||||
String uuid = UUID.randomUUID().toString().replace("-", "");
|
||||
|
||||
appNotification(resourceId, content, uuid);
|
||||
insertMessageLog(resourceId, content, resourceId, curDateTime, uuid, recordSet);
|
||||
|
||||
|
||||
String managerID = resourceComInfo.getManagerID(resourceId);
|
||||
if (managerID != null && !"".equals(managerID) && Util.getIntValue(managerID, 0) > 0) {
|
||||
String managerUUID = "";
|
||||
if(managerMessagesUUID.containsKey(managerID)) {
|
||||
managerUUID = managerMessagesUUID.get(managerID).toString();
|
||||
} else {
|
||||
managerUUID = UUID.randomUUID().toString().replace("-", "");
|
||||
managerMessagesUUID.put(managerID, new StringBuilder(managerUUID));
|
||||
}
|
||||
insertMessageLog(resourceId, content, managerID, curDateTime, managerUUID, recordSet);
|
||||
managerMessages.putIfAbsent(managerID, new StringBuilder());
|
||||
managerMessages.get(managerID).append(content).append("<br><br>");
|
||||
|
||||
}
|
||||
}
|
||||
// 统一发送给上级
|
||||
for (Map.Entry<String, StringBuilder> entry : managerMessages.entrySet()) {
|
||||
String managerID = entry.getKey();
|
||||
String content = entry.getValue().toString();
|
||||
String managerUUID = managerMessagesUUID.get(managerID).toString();
|
||||
appNotification(managerID, content, managerUUID);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.writeLog(e);
|
||||
}
|
||||
}
|
||||
|
||||
private static String getLabelName(int labelId) {
|
||||
return SystemEnv.getHtmlLabelName(labelId, weaver.general.ThreadVarLanguage.getLang());
|
||||
}
|
||||
|
||||
private void insertMessageLog(String resourceId, String content, String receiverId, String sendTime, String uuid, RecordSet rs) {
|
||||
|
||||
String sql = "INSERT INTO abnormalremindmsg_log (resourceId, content, sendTime, receiverId,uuid) VALUES (?, ?, ?, ?, ?)";
|
||||
try {
|
||||
rs.executeUpdate(sql, resourceId, content, sendTime, receiverId, uuid);
|
||||
} catch (Exception e) {
|
||||
log.writeLog(e);
|
||||
kqLog.info("KQYesterdayAbnormalRemindJob::insertMessageLog: error inserting log for resourceId=" + resourceId + ", receiverId=" + receiverId, e);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void appNotification(String resourceId,String content, String uuid) {
|
||||
try {
|
||||
String detailTitle = "539214";
|
||||
String title = content;
|
||||
int createrId = 1;
|
||||
String pcUrl = "/spa/hrm/static4attendance/index.html#/attendance/abnormalremindMsg?uuid="+uuid;
|
||||
String mobileUrl = "/spa/hrm/static4mobile/index.html#/abnormalremindMsg?uuid="+uuid;
|
||||
ConfigManager configManager = new ConfigManager();
|
||||
// 2、默认规则检查用户配置,返回后台自定义消息类型和对应通过配置的用户
|
||||
// @param singPath 与需求变更之前的path参数含义一致,代表该消息类型详细配置中唯一标志值,各模块参考自己的值(有疑问请联系云商店-田泽法)
|
||||
// @param userid 按默认规则检查的用户配置信息(检查多人参考重载方法)
|
||||
Map<WeaMessageTypeConfig, List<String>> accessConfig = configManager.defaultRuleCheckConfig(MessageType.HRM_KQ_REMIND, resourceId, null);
|
||||
|
||||
// 3、遍历自定义消息类型集合
|
||||
for (Map.Entry<WeaMessageTypeConfig, List<String>> entry : accessConfig.entrySet()) {
|
||||
// 4、构造消息实体
|
||||
MessageBean bean = Util_Message.createMessage(MessageType.HRM_KQ_REMIND, 0, title, detailTitle, content, pcUrl, mobileUrl, createrId);
|
||||
|
||||
// 5、获取新的自定义消息类型
|
||||
WeaMessageTypeConfig config = entry.getKey();
|
||||
|
||||
// 6、新的自定义消息类型相关信息通知到消息实体bean上
|
||||
bean.setMessageConfig(config);
|
||||
|
||||
// 7、设置检查配置通过需要发送消息的用户
|
||||
bean.setUserList(Sets.newHashSet(entry.getValue()));
|
||||
|
||||
// 8、发送消息
|
||||
Util_Message.sendAndpublishMessage(bean);
|
||||
kqLog.info("in>>>>KQYesterdayAbnormalRemindJob>>>>>>appNotification=bean::"+ JSON.toJSONString(bean));
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.writeLog(e);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,90 @@
|
|||
package com.engine.kq.biz;
|
||||
|
||||
import com.engine.kq.log.KQLog;
|
||||
import weaver.conn.RecordSet;
|
||||
import weaver.general.Util;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 考勤异常提醒公共接口
|
||||
*/
|
||||
public class KqYesterdayAbnormalRemindBiz {
|
||||
|
||||
private KQLog kqLog = new KQLog();
|
||||
/**
|
||||
* 获取昨天考勤异常相关数据
|
||||
* @return
|
||||
*/
|
||||
public Map<String, Map<String, Double>> getYesterdayAbnormalData(String fromDate, String toDate) {
|
||||
return getYesterdayAbnormalData(fromDate, toDate, null);
|
||||
}
|
||||
|
||||
public Map<String, Map<String, Double>> getYesterdayAbnormalData(String fromDate, String toDate, String resourceId) {
|
||||
kqLog.info("KqAbnormalRemindBiz::getYesterdayAbnormalData:fromDate"+fromDate+":toDate:"+toDate+":resourceId:"+resourceId);
|
||||
RecordSet rs = new RecordSet();
|
||||
Map<String, Map<String, Double>> yesterdayAbnormalMap = new HashMap<>();
|
||||
String forgotBeginWorkCheck_field = " sum(b.forgotBeginWorkCheck) ";
|
||||
|
||||
if(rs.getDBType().equalsIgnoreCase("oracle") || rs.getDBType().equalsIgnoreCase("gs")) {
|
||||
forgotBeginWorkCheck_field = " sum(nvl(b.forgotbeginworkcheckmins,0)) ";
|
||||
}else if((rs.getDBType()).equalsIgnoreCase("mysql")){
|
||||
forgotBeginWorkCheck_field = " sum(ifnull(b.forgotbeginworkcheckmins,0)) ";
|
||||
}else {
|
||||
forgotBeginWorkCheck_field = " sum(isnull(b.forgotbeginworkcheckmins,0)) ";
|
||||
}
|
||||
String backFields = " a.id,a.lastname,a.workcode,a.dsporder,b.resourceid,a.subcompanyid1 as subcompanyid,a.departmentid,a.jobtitle," +
|
||||
" sum(b.beLateMins) as beLateMins, " +
|
||||
" sum(b.graveBeLateMins) as graveBeLateMins," +
|
||||
" sum(b.leaveEarlyMins) as leaveEarlyMins, " +
|
||||
" sum(b.graveLeaveEarlyMins) as graveLeaveEarlyMins, " +
|
||||
" sum(b.absenteeismMins) as absenteeismMins, sum(b.forgotcheckmins)+"+forgotBeginWorkCheck_field+" as forgotCheckMins ";
|
||||
|
||||
if(rs.getDBType().equals("oracle")){
|
||||
backFields = "/*+ index(kq_format_total IDX_KQ_FORMAT_TOTAL_KQDATE) */ "+backFields;
|
||||
}
|
||||
String sqlFrom = " from hrmresource a, kq_format_detail b where a.id= b.resourceid and b.kqdate >='"+fromDate+"' and b.kqdate <='"+toDate+"'";
|
||||
if(resourceId != null) {
|
||||
sqlFrom += " and (a.accounttype = 0 or a.accounttype is null) and a.id="+resourceId;
|
||||
}
|
||||
String groupBy = " group by a.id,a.lastname,a.workcode,a.dsporder,b.resourceid,a.subcompanyid1,a.departmentid,a.jobtitle ";
|
||||
String sql = backFields + sqlFrom + groupBy;
|
||||
sql = " select " + sql;
|
||||
kqLog.info("KqAbnormalRemindBiz::sql:"+sql);
|
||||
rs.executeQuery(sql);
|
||||
while (rs.next()) {
|
||||
Map<String, Double> abnormalDataMap = new HashMap<>();
|
||||
String userId = rs.getString("id");
|
||||
double beLateMins = Util.getDoubleValue(rs.getString("beLateMins"), 0.0);//迟到
|
||||
double graveBeLateMins = Util.getDoubleValue(rs.getString("graveBeLateMins"), 0.0);//严重迟到
|
||||
double leaveEarlyMins = Util.getDoubleValue(rs.getString("leaveEarlyMins"), 0.0);//早退
|
||||
double graveLeaveEarlyMins = Util.getDoubleValue(rs.getString("graveLeaveEarlyMins"), 0.0);//严重早退
|
||||
double absenteeismMins = Util.getDoubleValue(rs.getString("absenteeismMins"), 0.0);//旷工
|
||||
double forgotCheck = Util.getDoubleValue(rs.getString("forgotCheckMins"), 0.0);//漏签
|
||||
if(beLateMins> 0) {
|
||||
abnormalDataMap.put("late", beLateMins);
|
||||
}
|
||||
if(graveBeLateMins> 0) {
|
||||
abnormalDataMap.put("gravelate", graveBeLateMins);
|
||||
}
|
||||
if(leaveEarlyMins> 0) {
|
||||
abnormalDataMap.put("leaveearly", leaveEarlyMins);
|
||||
}
|
||||
if(graveLeaveEarlyMins> 0) {
|
||||
abnormalDataMap.put("graveleaveearly", graveLeaveEarlyMins);
|
||||
}
|
||||
if(absenteeismMins> 0) {
|
||||
abnormalDataMap.put("absent", absenteeismMins);
|
||||
}
|
||||
if(forgotCheck> 0) {
|
||||
abnormalDataMap.put("forgot", forgotCheck);
|
||||
}
|
||||
if(!abnormalDataMap.isEmpty()) {
|
||||
yesterdayAbnormalMap.put(userId, abnormalDataMap);
|
||||
}
|
||||
}
|
||||
kqLog.info("KqAbnormalRemindBiz::getYesterdayAbnormalData:yesterdayAbnormalMap"+yesterdayAbnormalMap);
|
||||
return yesterdayAbnormalMap;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,805 @@
|
|||
package com.engine.kq.biz.chain.shiftinfo;
|
||||
|
||||
import com.engine.kq.entity.TimeScopeEntity;
|
||||
import com.google.common.collect.Lists;
|
||||
import com.google.common.collect.Maps;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 1、首先有个KQTimesArrayComInfo缓存类,这个类把00:00-23:59的时间点都转换成了0-1439的数值
|
||||
* 我把这个数值视作下标index
|
||||
*
|
||||
* 2、假如班次设置的工作时段是
|
||||
* 8:00-12:00
|
||||
* 13:00-18:00
|
||||
* 22:00-次日4:00
|
||||
*
|
||||
* 3、...
|
||||
*
|
||||
* 4、那么restTimes表示的就是休息时段15:00-16:00对应的数组下标{[100,200]},举个栗子而已
|
||||
*
|
||||
* 5、那么workIndex表示的就是休息时段8:00-12:00...对应的数组下标{[50,80],[90,180],[250,280]},workIndexTime存的就是时间点举个栗子而已
|
||||
*
|
||||
* 6、那么halfWorkIndex表示的就是半天规则情况下需要用到的数组下标
|
||||
* 上面的例子里的工作时长的15个小时,所以半天的话,需要从8:00-16:30,只要是满足小于这个范围段内的都是半天,大于的就是1天了
|
||||
* halfWorkIndex对应的数组下标就是{[50,70]},halfWorkIndexTime存的就是时间点举个栗子而已
|
||||
*
|
||||
* 7、那么wholeWorkIndex表示的就是整天规则情况下需要用到的数组下标,我只需要知道workIndex就可以了。wholeWorkIndexTime存的就是时间点
|
||||
*
|
||||
*/
|
||||
public class ShiftInfoBean {
|
||||
/**
|
||||
* 指定开始时间
|
||||
*/
|
||||
private String splitFromTime;
|
||||
/**
|
||||
* 指定结束时间
|
||||
*/
|
||||
private String splitToTime;
|
||||
|
||||
/**
|
||||
* 指定日期 因为流程时段区间已经被拆分成一天一条了
|
||||
*/
|
||||
private String splitDate;
|
||||
/**
|
||||
* 要返回当天的工作时间区间对应的数组下标 这个是不包含跨天的
|
||||
*/
|
||||
private List<int[]> workIndex;
|
||||
|
||||
/**
|
||||
* 要返回当天的工作时间区间对应的数组下标 这个是包含跨天的
|
||||
*/
|
||||
private List<int[]> workAcrossIndex;
|
||||
|
||||
/**
|
||||
* 要返回当天的工作时间区间对应的时间 这个是包含跨天的
|
||||
*/
|
||||
private List<String[]> workAcrossTime;
|
||||
|
||||
/**
|
||||
* 当天打卡时段时间:多少分钟可以开始签到签退的
|
||||
*/
|
||||
private List<String[][]> workMinsAcrossIndex;
|
||||
/**
|
||||
* 要返回的休息时间区间对应的数组下标 不包含跨天
|
||||
*/
|
||||
private List<int[]> restIndex;
|
||||
/**
|
||||
* 要返回的休息时间区间对应的数组下标 包含跨天的
|
||||
*/
|
||||
private List<int[]> restAcrossIndex;
|
||||
/**
|
||||
* 要返回的半天规则时间区间对应的数组下标
|
||||
* 这里有值的话是三个,最早的开始时间 中间时间 最晚的下班时间
|
||||
*/
|
||||
private List<int[]> halfWorkIndex;
|
||||
|
||||
/**
|
||||
* 工作时长
|
||||
*/
|
||||
private int workmins;
|
||||
|
||||
private int signoutOnlyoff;
|
||||
|
||||
/**
|
||||
* 加班用的前日期是何种类型
|
||||
*/
|
||||
private int changeType;
|
||||
|
||||
/**
|
||||
* 当前日期的班次
|
||||
*/
|
||||
private String serialid;
|
||||
|
||||
/**
|
||||
* 指定日期的前一天,因为存在跨天,昨天数据可能也需要在今天统计
|
||||
*/
|
||||
private String preSplitDate;
|
||||
|
||||
/**
|
||||
* 这个返回的是前一天的班次存在跨天,跨到今天的工作时段区间
|
||||
*/
|
||||
private List<int[]> preWorkIndex;
|
||||
|
||||
/**
|
||||
* 要返回前一天天的工作时间区间对应的数组下标 这个是包含跨天的
|
||||
*/
|
||||
private List<int[]> preWorkAcrossIndex;
|
||||
|
||||
/**
|
||||
* 要返回前一天打卡时段信息:多少分钟可以开始签到签退的
|
||||
*/
|
||||
private List<String[][]> preWorkMinsAcrossIndex;
|
||||
|
||||
/**
|
||||
* 映射前一天的跨天和时间区间下标
|
||||
*/
|
||||
private Map<String,String> preWorktimeAcrossMap;
|
||||
/**
|
||||
* 要返回前一天的休息时间区间对应的数组下标
|
||||
*/
|
||||
private List<int[]> preRestIndex;
|
||||
/**
|
||||
* 要返回的前一天的半天规则时间区间对应的数组下标
|
||||
* 这里有值的话是三个,开始时间 中间时间 下班时间
|
||||
*/
|
||||
private List<int[]> preHalfWorkIndex;
|
||||
|
||||
/**
|
||||
* 前一天的工作时长
|
||||
*/
|
||||
private int preWorkmins;
|
||||
|
||||
/**
|
||||
* 前一个日期的班次
|
||||
*/
|
||||
private String preSerialid;
|
||||
|
||||
/**
|
||||
* 得到实际时长分钟数
|
||||
*/
|
||||
private double D_Mins;
|
||||
|
||||
/**
|
||||
* 流程判断的各种规则
|
||||
* 半天小时的
|
||||
*/
|
||||
private String minimumUnit;
|
||||
|
||||
/**
|
||||
* 流程用的时候存的值
|
||||
*/
|
||||
private String duration;
|
||||
|
||||
/**
|
||||
* 针对时段跨天 流程跨天的情况,23:59-24:00差一分钟的处理
|
||||
*/
|
||||
private String oneMoreMinute;
|
||||
|
||||
/**
|
||||
* 当前时间段
|
||||
*/
|
||||
private int[] curMins;
|
||||
|
||||
/**
|
||||
* 当前时间段
|
||||
*/
|
||||
private int[] preMins;
|
||||
|
||||
/**
|
||||
* 存储所有的工作时间
|
||||
*/
|
||||
private List<String> allWorkTime;
|
||||
|
||||
/**
|
||||
* 存储所有的跨天时间
|
||||
*/
|
||||
private List<String> allAcrossWorkTime;
|
||||
/**
|
||||
* 存储所有的休息时间
|
||||
*/
|
||||
private List<String> allRestTime;
|
||||
|
||||
/**
|
||||
* 存储所有的休息时间
|
||||
*/
|
||||
private List<String> allAcrossRestTime;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 存储所有的工作时间
|
||||
*/
|
||||
private List<String> preAllWorkTime;
|
||||
|
||||
/**
|
||||
* 存储所有的跨天时间
|
||||
*/
|
||||
private List<String> preAllAcrossWorkTime;
|
||||
/**
|
||||
* 存储所有的休息时间
|
||||
*/
|
||||
private List<String> preAllRestTime;
|
||||
|
||||
/**
|
||||
* 存储所有的休息时间
|
||||
*/
|
||||
private List<String> preAllAcrossRestTime;
|
||||
|
||||
/**
|
||||
* 是否是自由班製
|
||||
*/
|
||||
private boolean isfree;
|
||||
/**
|
||||
* 自由班制签到开始时间
|
||||
*/
|
||||
private String freeSignStart;
|
||||
/**
|
||||
* 自由班制工作时长
|
||||
*/
|
||||
private String freeWorkMins;
|
||||
/**
|
||||
* 自由班制应该签退时间
|
||||
*/
|
||||
private String freeSignEnd;
|
||||
/**
|
||||
* 自由班制 半天中间点
|
||||
*/
|
||||
private String freeSignMiddle;
|
||||
|
||||
|
||||
/**
|
||||
* 当前班次作为当前班次存在,在0-48小时内的工作时段下标
|
||||
*/
|
||||
private List<int[]> workLongTimeIndex;
|
||||
|
||||
/**
|
||||
* 当前班次作为当前班次存在,在0-48小时内的工作时段下标
|
||||
*/
|
||||
private List<int[]> restLongTimeIndex;
|
||||
|
||||
/**
|
||||
* 存储所有的工作时间 48小时制休息时段
|
||||
*/
|
||||
private List<String> allLongWorkTime;
|
||||
|
||||
/**
|
||||
* 判断当前班次是否存在跨天
|
||||
*/
|
||||
private String isAcross;
|
||||
|
||||
/**
|
||||
* 判断前一天班次是否存在跨天
|
||||
*/
|
||||
private String isPreAcross;
|
||||
|
||||
private Map<String,Object> shiftRuleMap;
|
||||
|
||||
/**
|
||||
* 和kqformdate里的workTimeEntity用到的保持一致
|
||||
*/
|
||||
private List<TimeScopeEntity> signTime;//允许打卡时间
|
||||
/**
|
||||
* 和kqformdate里的workTimeEntity用到的保持一致
|
||||
*/
|
||||
private List<TimeScopeEntity> workTime;//工作时间
|
||||
|
||||
/**
|
||||
* 半天计算规则
|
||||
*/
|
||||
private String halfcalrule;
|
||||
|
||||
/**
|
||||
* 自定义 半天计算规则 时间点
|
||||
*/
|
||||
private String halfcalpoint;
|
||||
|
||||
private String halfcalpoint2cross;
|
||||
|
||||
/**
|
||||
* 存储每一段工作时段内的工作时长
|
||||
*/
|
||||
private List<Integer> eachWorkMins;
|
||||
/**
|
||||
* 是否是非工作日 1表示是非工作日班次
|
||||
*/
|
||||
private int restShift;
|
||||
|
||||
/**
|
||||
* 昨天应出勤折算天数
|
||||
*/
|
||||
private String preConvertAttendDay = "";
|
||||
|
||||
/**
|
||||
* 应出勤折算天数
|
||||
*/
|
||||
private String convertAttendDay = "";
|
||||
|
||||
public ShiftInfoBean() {
|
||||
this.splitFromTime = "";
|
||||
this.splitToTime = "";
|
||||
this.splitDate = "";
|
||||
this.workIndex = new ArrayList<>();
|
||||
this.workAcrossIndex = new ArrayList<>();
|
||||
this.restIndex = new ArrayList<>();
|
||||
this.restAcrossIndex = new ArrayList<>();
|
||||
this.halfWorkIndex = new ArrayList<>();
|
||||
this.workmins = 0;
|
||||
this.signoutOnlyoff = 0;
|
||||
this.preSplitDate = "";
|
||||
this.preWorkIndex = new ArrayList<>();
|
||||
this.preWorkAcrossIndex = new ArrayList<>();
|
||||
this.preWorktimeAcrossMap = new HashMap<>();
|
||||
this.preRestIndex = new ArrayList<>();
|
||||
this.preHalfWorkIndex = new ArrayList<>();
|
||||
this.preWorkmins = 0;
|
||||
this.D_Mins = 0.0;
|
||||
this.minimumUnit = "";
|
||||
this.duration = "";
|
||||
this.oneMoreMinute = "";
|
||||
this.preWorkMinsAcrossIndex = new ArrayList<>();
|
||||
this.workMinsAcrossIndex = new ArrayList<>();
|
||||
this.preSerialid = "";
|
||||
this.serialid = "";
|
||||
this.workAcrossTime = new ArrayList<>();
|
||||
this.isfree = false;
|
||||
this.freeSignStart = "";
|
||||
this.freeWorkMins = "";
|
||||
this.freeSignEnd = "";
|
||||
this.freeSignMiddle = "";
|
||||
|
||||
this.workLongTimeIndex = new ArrayList<>();
|
||||
this.restLongTimeIndex = new ArrayList<>();
|
||||
this.allLongWorkTime = new ArrayList<>();
|
||||
this.isAcross = "";
|
||||
this.isPreAcross = "";
|
||||
this.shiftRuleMap = Maps.newHashMap();
|
||||
this.workTime = Lists.newArrayList();
|
||||
this.signTime = Lists.newArrayList();
|
||||
this.halfcalrule = "";
|
||||
this.halfcalpoint = "";
|
||||
this.halfcalpoint2cross = "";
|
||||
this.eachWorkMins = new ArrayList<>();
|
||||
}
|
||||
|
||||
public String getSplitDate() {
|
||||
return splitDate;
|
||||
}
|
||||
|
||||
public void setSplitDate(String splitDate) {
|
||||
this.splitDate = splitDate;
|
||||
}
|
||||
|
||||
public String getSplitFromTime() {
|
||||
return splitFromTime;
|
||||
}
|
||||
|
||||
public void setSplitFromTime(String splitFromTime) {
|
||||
this.splitFromTime = splitFromTime;
|
||||
}
|
||||
|
||||
public String getSplitToTime() {
|
||||
return splitToTime;
|
||||
}
|
||||
|
||||
public void setSplitToTime(String splitToTime) {
|
||||
this.splitToTime = splitToTime;
|
||||
}
|
||||
|
||||
public List<int[]> getWorkIndex() {
|
||||
return workIndex;
|
||||
}
|
||||
|
||||
public void setWorkIndex(List<int[]> workIndex) {
|
||||
this.workIndex = workIndex;
|
||||
}
|
||||
|
||||
public List<int[]> getRestIndex() {
|
||||
return restIndex;
|
||||
}
|
||||
|
||||
public void setRestIndex(List<int[]> restIndex) {
|
||||
this.restIndex = restIndex;
|
||||
}
|
||||
|
||||
public List<int[]> getHalfWorkIndex() {
|
||||
return halfWorkIndex;
|
||||
}
|
||||
|
||||
public void setHalfWorkIndex(List<int[]> halfWorkIndex) {
|
||||
this.halfWorkIndex = halfWorkIndex;
|
||||
}
|
||||
|
||||
public double getD_Mins() {
|
||||
return D_Mins;
|
||||
}
|
||||
|
||||
public void setD_Mins(double d_Mins) {
|
||||
D_Mins = d_Mins;
|
||||
}
|
||||
|
||||
public String getPreSplitDate() {
|
||||
return preSplitDate;
|
||||
}
|
||||
|
||||
public void setPreSplitDate(String preSplitDate) {
|
||||
this.preSplitDate = preSplitDate;
|
||||
}
|
||||
|
||||
public List<int[]> getPreWorkIndex() {
|
||||
return preWorkIndex;
|
||||
}
|
||||
|
||||
public void setPreWorkIndex(List<int[]> preWorkIndex) {
|
||||
this.preWorkIndex = preWorkIndex;
|
||||
}
|
||||
|
||||
public List<int[]> getWorkAcrossIndex() {
|
||||
return workAcrossIndex;
|
||||
}
|
||||
|
||||
public void setWorkAcrossIndex(List<int[]> workAcrossIndex) {
|
||||
this.workAcrossIndex = workAcrossIndex;
|
||||
}
|
||||
|
||||
public int getWorkmins() {
|
||||
return workmins;
|
||||
}
|
||||
|
||||
public void setWorkmins(int workmins) {
|
||||
this.workmins = workmins;
|
||||
}
|
||||
|
||||
public int getSignoutOnlyoff() {
|
||||
return signoutOnlyoff;
|
||||
}
|
||||
|
||||
public void setSignoutOnlyoff(int signoutOnlyoff) {
|
||||
this.signoutOnlyoff = signoutOnlyoff;
|
||||
}
|
||||
|
||||
public String getMinimumUnit() {
|
||||
return minimumUnit;
|
||||
}
|
||||
|
||||
public void setMinimumUnit(String minimumUnit) {
|
||||
this.minimumUnit = minimumUnit;
|
||||
}
|
||||
|
||||
public List<int[]> getPreHalfWorkIndex() {
|
||||
return preHalfWorkIndex;
|
||||
}
|
||||
|
||||
public void setPreHalfWorkIndex(List<int[]> preHalfWorkIndex) {
|
||||
this.preHalfWorkIndex = preHalfWorkIndex;
|
||||
}
|
||||
|
||||
public List<int[]> getPreWorkAcrossIndex() {
|
||||
return preWorkAcrossIndex;
|
||||
}
|
||||
|
||||
public void setPreWorkAcrossIndex(List<int[]> preWorkAcrossIndex) {
|
||||
this.preWorkAcrossIndex = preWorkAcrossIndex;
|
||||
}
|
||||
|
||||
public Map<String, String> getPreWorktimeAcrossMap() {
|
||||
return preWorktimeAcrossMap;
|
||||
}
|
||||
|
||||
public void setPreWorktimeAcrossMap(
|
||||
Map<String, String> preWorktimeAcrossMap) {
|
||||
this.preWorktimeAcrossMap = preWorktimeAcrossMap;
|
||||
}
|
||||
|
||||
public List<int[]> getPreRestIndex() {
|
||||
return preRestIndex;
|
||||
}
|
||||
|
||||
public void setPreRestIndex(List<int[]> preRestIndex) {
|
||||
this.preRestIndex = preRestIndex;
|
||||
}
|
||||
|
||||
public int getPreWorkmins() {
|
||||
return preWorkmins;
|
||||
}
|
||||
|
||||
public void setPreWorkmins(int preWorkmins) {
|
||||
this.preWorkmins = preWorkmins;
|
||||
}
|
||||
|
||||
public List<int[]> getRestAcrossIndex() {
|
||||
return restAcrossIndex;
|
||||
}
|
||||
|
||||
public void setRestAcrossIndex(List<int[]> restAcrossIndex) {
|
||||
this.restAcrossIndex = restAcrossIndex;
|
||||
}
|
||||
|
||||
public String getDuration() {
|
||||
return duration;
|
||||
}
|
||||
|
||||
public void setDuration(String duration) {
|
||||
this.duration = duration;
|
||||
}
|
||||
|
||||
public String getOneMoreMinute() {
|
||||
return oneMoreMinute;
|
||||
}
|
||||
|
||||
public void setOneMoreMinute(String oneMoreMinute) {
|
||||
this.oneMoreMinute = oneMoreMinute;
|
||||
}
|
||||
|
||||
public List<String[][]> getWorkMinsAcrossIndex() {
|
||||
return workMinsAcrossIndex;
|
||||
}
|
||||
|
||||
public void setWorkMinsAcrossIndex(List<String[][]> workMinsAcrossIndex) {
|
||||
this.workMinsAcrossIndex = workMinsAcrossIndex;
|
||||
}
|
||||
|
||||
public List<String[][]> getPreWorkMinsAcrossIndex() {
|
||||
return preWorkMinsAcrossIndex;
|
||||
}
|
||||
|
||||
public void setPreWorkMinsAcrossIndex(List<String[][]> preWorkMinsAcrossIndex) {
|
||||
this.preWorkMinsAcrossIndex = preWorkMinsAcrossIndex;
|
||||
}
|
||||
|
||||
public String getSerialid() {
|
||||
return serialid;
|
||||
}
|
||||
|
||||
public void setSerialid(String serialid) {
|
||||
this.serialid = serialid;
|
||||
}
|
||||
|
||||
public String getPreSerialid() {
|
||||
return preSerialid;
|
||||
}
|
||||
|
||||
public void setPreSerialid(String preSerialid) {
|
||||
this.preSerialid = preSerialid;
|
||||
}
|
||||
|
||||
public int[] getCurMins() {
|
||||
return curMins;
|
||||
}
|
||||
|
||||
public void setCurMins(int[] curMins) {
|
||||
this.curMins = curMins;
|
||||
}
|
||||
|
||||
public int[] getPreMins() {
|
||||
return preMins;
|
||||
}
|
||||
|
||||
public void setPreMins(int[] preMins) {
|
||||
this.preMins = preMins;
|
||||
}
|
||||
|
||||
public List<String[]> getWorkAcrossTime() {
|
||||
return workAcrossTime;
|
||||
}
|
||||
|
||||
public void setWorkAcrossTime(List<String[]> workAcrossTime) {
|
||||
this.workAcrossTime = workAcrossTime;
|
||||
}
|
||||
|
||||
public int getChangeType() {
|
||||
return changeType;
|
||||
}
|
||||
|
||||
public void setChangeType(int changeType) {
|
||||
this.changeType = changeType;
|
||||
}
|
||||
|
||||
public List<String> getAllWorkTime() {
|
||||
return allWorkTime;
|
||||
}
|
||||
|
||||
public void setAllWorkTime(List<String> allWorkTime) {
|
||||
this.allWorkTime = allWorkTime;
|
||||
}
|
||||
|
||||
public List<String> getAllAcrossWorkTime() {
|
||||
return allAcrossWorkTime;
|
||||
}
|
||||
|
||||
public void setAllAcrossWorkTime(List<String> allAcrossWorkTime) {
|
||||
this.allAcrossWorkTime = allAcrossWorkTime;
|
||||
}
|
||||
|
||||
public List<String> getAllRestTime() {
|
||||
return allRestTime;
|
||||
}
|
||||
|
||||
public void setAllRestTime(List<String> allRestTime) {
|
||||
this.allRestTime = allRestTime;
|
||||
}
|
||||
|
||||
public List<String> getAllAcrossRestTime() {
|
||||
return allAcrossRestTime;
|
||||
}
|
||||
|
||||
public void setAllAcrossRestTime(List<String> allAcrossRestTime) {
|
||||
this.allAcrossRestTime = allAcrossRestTime;
|
||||
}
|
||||
|
||||
public List<String> getPreAllWorkTime() {
|
||||
return preAllWorkTime;
|
||||
}
|
||||
|
||||
public void setPreAllWorkTime(List<String> preAllWorkTime) {
|
||||
this.preAllWorkTime = preAllWorkTime;
|
||||
}
|
||||
|
||||
public List<String> getPreAllAcrossWorkTime() {
|
||||
return preAllAcrossWorkTime;
|
||||
}
|
||||
|
||||
public void setPreAllAcrossWorkTime(List<String> preAllAcrossWorkTime) {
|
||||
this.preAllAcrossWorkTime = preAllAcrossWorkTime;
|
||||
}
|
||||
|
||||
public List<String> getPreAllRestTime() {
|
||||
return preAllRestTime;
|
||||
}
|
||||
|
||||
public void setPreAllRestTime(List<String> preAllRestTime) {
|
||||
this.preAllRestTime = preAllRestTime;
|
||||
}
|
||||
|
||||
public List<String> getPreAllAcrossRestTime() {
|
||||
return preAllAcrossRestTime;
|
||||
}
|
||||
|
||||
public void setPreAllAcrossRestTime(List<String> preAllAcrossRestTime) {
|
||||
this.preAllAcrossRestTime = preAllAcrossRestTime;
|
||||
}
|
||||
|
||||
public boolean isIsfree() {
|
||||
return isfree;
|
||||
}
|
||||
|
||||
public void setIsfree(boolean isfree) {
|
||||
this.isfree = isfree;
|
||||
}
|
||||
|
||||
public String getFreeSignStart() {
|
||||
return freeSignStart;
|
||||
}
|
||||
|
||||
public void setFreeSignStart(String freeSignStart) {
|
||||
this.freeSignStart = freeSignStart;
|
||||
}
|
||||
|
||||
public String getFreeWorkMins() {
|
||||
return freeWorkMins;
|
||||
}
|
||||
|
||||
public void setFreeWorkMins(String freeWorkMins) {
|
||||
this.freeWorkMins = freeWorkMins;
|
||||
}
|
||||
|
||||
public String getFreeSignEnd() {
|
||||
return freeSignEnd;
|
||||
}
|
||||
|
||||
public void setFreeSignEnd(String freeSignEnd) {
|
||||
this.freeSignEnd = freeSignEnd;
|
||||
}
|
||||
|
||||
public String getFreeSignMiddle() {
|
||||
return freeSignMiddle;
|
||||
}
|
||||
|
||||
public void setFreeSignMiddle(String freeSignMiddle) {
|
||||
this.freeSignMiddle = freeSignMiddle;
|
||||
}
|
||||
|
||||
public List<int[]> getWorkLongTimeIndex() {
|
||||
return workLongTimeIndex;
|
||||
}
|
||||
|
||||
public void setWorkLongTimeIndex(List<int[]> workLongTimeIndex) {
|
||||
this.workLongTimeIndex = workLongTimeIndex;
|
||||
}
|
||||
|
||||
public List<int[]> getRestLongTimeIndex() {
|
||||
return restLongTimeIndex;
|
||||
}
|
||||
|
||||
public void setRestLongTimeIndex(List<int[]> restLongTimeIndex) {
|
||||
this.restLongTimeIndex = restLongTimeIndex;
|
||||
}
|
||||
|
||||
public List<String> getAllLongWorkTime() {
|
||||
return allLongWorkTime;
|
||||
}
|
||||
|
||||
public void setAllLongWorkTime(List<String> allLongWorkTime) {
|
||||
this.allLongWorkTime = allLongWorkTime;
|
||||
}
|
||||
|
||||
public String getIsAcross() {
|
||||
return isAcross;
|
||||
}
|
||||
|
||||
public void setIsAcross(String isAcross) {
|
||||
this.isAcross = isAcross;
|
||||
}
|
||||
|
||||
public String getIsPreAcross() {
|
||||
return isPreAcross;
|
||||
}
|
||||
|
||||
public void setIsPreAcross(String isPreAcross) {
|
||||
this.isPreAcross = isPreAcross;
|
||||
}
|
||||
|
||||
public Map<String, Object> getShiftRuleMap() {
|
||||
return shiftRuleMap;
|
||||
}
|
||||
|
||||
public void setShiftRuleMap(Map<String, Object> shiftRuleMap) {
|
||||
this.shiftRuleMap = shiftRuleMap;
|
||||
}
|
||||
|
||||
public List<TimeScopeEntity> getSignTime() {
|
||||
return signTime;
|
||||
}
|
||||
|
||||
public void setSignTime(List<TimeScopeEntity> signTime) {
|
||||
this.signTime = signTime;
|
||||
}
|
||||
|
||||
public List<TimeScopeEntity> getWorkTime() {
|
||||
return workTime;
|
||||
}
|
||||
|
||||
public void setWorkTime(List<TimeScopeEntity> workTime) {
|
||||
this.workTime = workTime;
|
||||
}
|
||||
|
||||
public String getHalfcalrule() {
|
||||
return halfcalrule;
|
||||
}
|
||||
|
||||
public void setHalfcalrule(String halfcalrule) {
|
||||
this.halfcalrule = halfcalrule;
|
||||
}
|
||||
|
||||
public List<Integer> getEachWorkMins() {
|
||||
return eachWorkMins;
|
||||
}
|
||||
|
||||
public void setEachWorkMins(List<Integer> eachWorkMins) {
|
||||
this.eachWorkMins = eachWorkMins;
|
||||
}
|
||||
|
||||
public String getHalfcalpoint() {
|
||||
return halfcalpoint;
|
||||
}
|
||||
|
||||
public void setHalfcalpoint(String halfcalpoint) {
|
||||
this.halfcalpoint = halfcalpoint;
|
||||
}
|
||||
|
||||
public String getHalfcalpoint2cross() {
|
||||
return halfcalpoint2cross;
|
||||
}
|
||||
|
||||
public void setHalfcalpoint2cross(String halfcalpoint2cross) {
|
||||
this.halfcalpoint2cross = halfcalpoint2cross;
|
||||
}
|
||||
|
||||
public int getRestShift() {
|
||||
return restShift;
|
||||
}
|
||||
|
||||
public void setRestShift(int restShift) {
|
||||
this.restShift = restShift;
|
||||
}
|
||||
|
||||
public String getConvertAttendDay() {
|
||||
return convertAttendDay;
|
||||
}
|
||||
|
||||
public void setConvertAttendDay(String convertAttendDay) {
|
||||
this.convertAttendDay = convertAttendDay;
|
||||
}
|
||||
|
||||
public String getPreConvertAttendDay() {
|
||||
return preConvertAttendDay;
|
||||
}
|
||||
|
||||
public void setPreConvertAttendDay(String preConvertAttendDay) {
|
||||
this.preConvertAttendDay = preConvertAttendDay;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,235 @@
|
|||
package com.engine.kq.entity;
|
||||
|
||||
public class KQGroupEntity {
|
||||
private String id;
|
||||
private String groupname;
|
||||
private String excludeid;
|
||||
private String excludecount;
|
||||
private String subcompanyid;
|
||||
private String kqtype;
|
||||
private String serialids;
|
||||
private String weekday;
|
||||
private String signstart;
|
||||
private String workhour;
|
||||
private String isdelete;
|
||||
private String signintype;
|
||||
private String ipscope;
|
||||
private String locationcheck;
|
||||
private String locationcheckscope;
|
||||
private String wificheck;
|
||||
private String outsidesign;
|
||||
|
||||
private String outsignapprove;
|
||||
private String validity;
|
||||
private String validityfromdate;
|
||||
private String validityenddate;
|
||||
private String locationfacecheck;
|
||||
private String locationshowaddress;
|
||||
private String wififacecheck;
|
||||
private String calmethod;
|
||||
private String abnormalremind;
|
||||
|
||||
public String getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(String id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getGroupname() {
|
||||
return groupname;
|
||||
}
|
||||
|
||||
public void setGroupname(String groupname) {
|
||||
this.groupname = groupname;
|
||||
}
|
||||
|
||||
public String getExcludeid() {
|
||||
return excludeid;
|
||||
}
|
||||
|
||||
public void setExcludeid(String excludeid) {
|
||||
this.excludeid = excludeid;
|
||||
}
|
||||
|
||||
public String getExcludecount() {
|
||||
return excludecount;
|
||||
}
|
||||
|
||||
public void setExcludecount(String excludecount) {
|
||||
this.excludecount = excludecount;
|
||||
}
|
||||
|
||||
public String getSubcompanyid() {
|
||||
return subcompanyid;
|
||||
}
|
||||
|
||||
public void setSubcompanyid(String subcompanyid) {
|
||||
this.subcompanyid = subcompanyid;
|
||||
}
|
||||
|
||||
public String getKqtype() {
|
||||
return kqtype;
|
||||
}
|
||||
|
||||
public void setKqtype(String kqtype) {
|
||||
this.kqtype = kqtype;
|
||||
}
|
||||
|
||||
public String getSerialids() {
|
||||
return serialids;
|
||||
}
|
||||
|
||||
public void setSerialids(String serialids) {
|
||||
this.serialids = serialids;
|
||||
}
|
||||
|
||||
public String getWeekday() {
|
||||
return weekday;
|
||||
}
|
||||
|
||||
public void setWeekday(String weekday) {
|
||||
this.weekday = weekday;
|
||||
}
|
||||
|
||||
public String getSignstart() {
|
||||
return signstart;
|
||||
}
|
||||
|
||||
public void setSignstart(String signstart) {
|
||||
this.signstart = signstart;
|
||||
}
|
||||
|
||||
public String getWorkhour() {
|
||||
return workhour;
|
||||
}
|
||||
|
||||
public void setWorkhour(String workhour) {
|
||||
this.workhour = workhour;
|
||||
}
|
||||
|
||||
public String getIsdelete() {
|
||||
return isdelete;
|
||||
}
|
||||
|
||||
public void setIsdelete(String isdelete) {
|
||||
this.isdelete = isdelete;
|
||||
}
|
||||
|
||||
public String getSignintype() {
|
||||
return signintype;
|
||||
}
|
||||
|
||||
public void setSignintype(String signintype) {
|
||||
this.signintype = signintype;
|
||||
}
|
||||
|
||||
public String getIpscope() {
|
||||
return ipscope;
|
||||
}
|
||||
|
||||
public void setIpscope(String ipscope) {
|
||||
this.ipscope = ipscope;
|
||||
}
|
||||
|
||||
public String getLocationcheck() {
|
||||
return locationcheck;
|
||||
}
|
||||
|
||||
public void setLocationcheck(String locationcheck) {
|
||||
this.locationcheck = locationcheck;
|
||||
}
|
||||
|
||||
public String getLocationcheckscope() {
|
||||
return locationcheckscope;
|
||||
}
|
||||
|
||||
public void setLocationcheckscope(String locationcheckscope) {
|
||||
this.locationcheckscope = locationcheckscope;
|
||||
}
|
||||
|
||||
public String getOutsidesign() {
|
||||
return outsidesign;
|
||||
}
|
||||
|
||||
public String getOutsignapprove() {return outsignapprove;}
|
||||
|
||||
public String getValidity() {
|
||||
return validity;
|
||||
}
|
||||
|
||||
public void setValidity(String validity) {
|
||||
this.validity = validity;
|
||||
}
|
||||
|
||||
public String getValidityfromdate() {
|
||||
return validityfromdate;
|
||||
}
|
||||
|
||||
public void setValidityfromdate(String validityfromdate) {
|
||||
this.validityfromdate = validityfromdate;
|
||||
}
|
||||
|
||||
public String getValidityenddate() {
|
||||
return validityenddate;
|
||||
}
|
||||
|
||||
public void setValidityenddate(String validityenddate) {
|
||||
this.validityenddate = validityenddate;
|
||||
}
|
||||
|
||||
public void setOutsidesign(String outsidesign) {this.outsidesign = outsidesign;}
|
||||
public void setOutsignapprove(String outsignapprove) {
|
||||
this.outsignapprove = outsignapprove;
|
||||
}
|
||||
|
||||
public String getWificheck() {
|
||||
return wificheck;
|
||||
}
|
||||
|
||||
public void setWificheck(String wificheck) {
|
||||
this.wificheck = wificheck;
|
||||
}
|
||||
|
||||
public String getLocationfacecheck() {
|
||||
return locationfacecheck;
|
||||
}
|
||||
|
||||
public void setLocationfacecheck(String locationfacecheck) {
|
||||
this.locationfacecheck = locationfacecheck;
|
||||
}
|
||||
|
||||
public String getLocationshowaddress() {
|
||||
return locationshowaddress;
|
||||
}
|
||||
|
||||
public void setLocationshowaddress(String locationshowaddress) {
|
||||
this.locationshowaddress = locationshowaddress;
|
||||
}
|
||||
|
||||
public String getWififacecheck() {
|
||||
return wififacecheck;
|
||||
}
|
||||
|
||||
public void setWififacecheck(String wififacecheck) {
|
||||
this.wififacecheck = wififacecheck;
|
||||
}
|
||||
|
||||
public String getCalmethod() {
|
||||
return calmethod;
|
||||
}
|
||||
|
||||
public void setCalmethod(String calmethod) {
|
||||
this.calmethod = calmethod;
|
||||
}
|
||||
|
||||
public String getAbnormalremind() {
|
||||
return this.abnormalremind;
|
||||
}
|
||||
|
||||
public void setAbnormalremind( String abnormalremind) {
|
||||
this.abnormalremind = abnormalremind;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,189 @@
|
|||
package com.engine.kq.entity;
|
||||
|
||||
/**
|
||||
* 考勤报表明细实体类
|
||||
*/
|
||||
public class KQShiftRuleEntity {
|
||||
private String userId = "";
|
||||
private String kqDate = "";
|
||||
private int belatemins = 0;
|
||||
private int gravebelatemins = 0;
|
||||
private int leaveearlymins = 0;
|
||||
private int graveleaveearlymins = 0;
|
||||
private int absenteeismmins = 0;
|
||||
private int forgotcheckmins = 0;
|
||||
private int forgotBeginWorkCheckMins = 0;//上班漏签
|
||||
private int earlyInMins = 0;//早到分钟数
|
||||
private int lateOutMins = 0;//晚走分钟数
|
||||
private String nosign_is_absent = "1";
|
||||
private String nosign_ishandle = "0";
|
||||
private String signInTime;
|
||||
private String signOutTime;
|
||||
private String early_one_mins;
|
||||
//上午旷工
|
||||
private boolean isAMAbsent = false;
|
||||
//下午旷工
|
||||
private boolean isPMAbsent = false;
|
||||
private int on_absenteeismMins;
|
||||
private int off_absenteeismMins;
|
||||
|
||||
public int getForgotBeginWorkCheckMins() {
|
||||
return forgotBeginWorkCheckMins;
|
||||
}
|
||||
|
||||
public void setForgotBeginWorkCheckMins(int forgotBeginWorkCheckMins) {
|
||||
this.forgotBeginWorkCheckMins = forgotBeginWorkCheckMins;
|
||||
}
|
||||
|
||||
public int getBelatemins() {
|
||||
return belatemins;
|
||||
}
|
||||
|
||||
public void setBelatemins(int belatemins) {
|
||||
this.belatemins = belatemins;
|
||||
}
|
||||
|
||||
public int getGravebelatemins() {
|
||||
return gravebelatemins;
|
||||
}
|
||||
|
||||
public void setGravebelatemins(int gravebelatemins) {
|
||||
this.gravebelatemins = gravebelatemins;
|
||||
}
|
||||
|
||||
public int getLeaveearlymins() {
|
||||
return leaveearlymins;
|
||||
}
|
||||
|
||||
public void setLeaveearlymins(int leaveearlymins) {
|
||||
this.leaveearlymins = leaveearlymins;
|
||||
}
|
||||
|
||||
public int getGraveleaveearlymins() {
|
||||
return graveleaveearlymins;
|
||||
}
|
||||
|
||||
public void setGraveleaveearlymins(int graveleaveearlymins) {
|
||||
this.graveleaveearlymins = graveleaveearlymins;
|
||||
}
|
||||
|
||||
public int getAbsenteeismmins() {
|
||||
return absenteeismmins;
|
||||
}
|
||||
|
||||
public void setAbsenteeismmins(int absenteeismmins) {
|
||||
this.absenteeismmins = absenteeismmins;
|
||||
}
|
||||
|
||||
public int getForgotcheckmins() {
|
||||
return forgotcheckmins;
|
||||
}
|
||||
|
||||
public void setForgotcheckmins(int forgotcheckmins) {
|
||||
this.forgotcheckmins = forgotcheckmins;
|
||||
}
|
||||
|
||||
public int getEarlyInMins() {
|
||||
return earlyInMins;
|
||||
}
|
||||
|
||||
public void setEarlyInMins(int earlyInMins) {
|
||||
this.earlyInMins = earlyInMins;
|
||||
}
|
||||
|
||||
public int getLateOutMins() {
|
||||
return lateOutMins;
|
||||
}
|
||||
|
||||
public void setLateOutMins(int lateOutMins) {
|
||||
this.lateOutMins = lateOutMins;
|
||||
}
|
||||
|
||||
public String getUserId() {
|
||||
return userId;
|
||||
}
|
||||
|
||||
public void setUserId(String userId) {
|
||||
this.userId = userId;
|
||||
}
|
||||
|
||||
public String getKqDate() {
|
||||
return kqDate;
|
||||
}
|
||||
|
||||
public void setKqDate(String kqDate) {
|
||||
this.kqDate = kqDate;
|
||||
}
|
||||
|
||||
public String getNosign_is_absent() {
|
||||
return nosign_is_absent;
|
||||
}
|
||||
|
||||
public void setNosign_is_absent(String nosign_is_absent) {
|
||||
this.nosign_is_absent = nosign_is_absent;
|
||||
}
|
||||
|
||||
public String getNosign_ishandle() {
|
||||
return nosign_ishandle;
|
||||
}
|
||||
|
||||
public void setNosign_ishandle(String nosign_ishandle) {
|
||||
this.nosign_ishandle = nosign_ishandle;
|
||||
}
|
||||
|
||||
public String getSignInTime() {
|
||||
return signInTime;
|
||||
}
|
||||
|
||||
public void setSignInTime(String signInTime) {
|
||||
this.signInTime = signInTime;
|
||||
}
|
||||
|
||||
public String getSignOutTime() {
|
||||
return signOutTime;
|
||||
}
|
||||
|
||||
public void setSignOutTime(String signOutTime) {
|
||||
this.signOutTime = signOutTime;
|
||||
}
|
||||
|
||||
public String getEarly_one_mins() {
|
||||
return early_one_mins;
|
||||
}
|
||||
|
||||
public void setEarly_one_mins(String early_one_mins) {
|
||||
this.early_one_mins = early_one_mins;
|
||||
}
|
||||
|
||||
public boolean isAMAbsent() {
|
||||
return isAMAbsent;
|
||||
}
|
||||
|
||||
public void setAMAbsent(boolean AMAbsent) {
|
||||
isAMAbsent = AMAbsent;
|
||||
}
|
||||
|
||||
public boolean isPMAbsent() {
|
||||
return isPMAbsent;
|
||||
}
|
||||
|
||||
public void setPMAbsent(boolean PMAbsent) {
|
||||
isPMAbsent = PMAbsent;
|
||||
}
|
||||
|
||||
public int getOn_absenteeismMins() {
|
||||
return on_absenteeismMins;
|
||||
}
|
||||
|
||||
public void setOn_absenteeismMins(int on_absenteeismMins) {
|
||||
this.on_absenteeismMins = on_absenteeismMins;
|
||||
}
|
||||
|
||||
public int getOff_absenteeismMins() {
|
||||
return off_absenteeismMins;
|
||||
}
|
||||
|
||||
public void setOff_absenteeismMins(int off_absenteeismMins) {
|
||||
this.off_absenteeismMins = off_absenteeismMins;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,220 @@
|
|||
package com.engine.kq.entity;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/***
|
||||
* 工作时间
|
||||
*/
|
||||
public class WorkTimeEntity {
|
||||
private String groupId;//所属考勤组
|
||||
private String groupName;//所属考勤组
|
||||
private String kqType;//考勤类型
|
||||
private String serialId;//班次
|
||||
private Map<String,Object> shiftRuleInfo;//班次人性化规则
|
||||
private List<TimeScopeEntity> signTime;//允许打卡时间
|
||||
private List<TimeScopeEntity> workTime;//工作时间
|
||||
private List<TimeScopeEntity> restTime;//休息时间
|
||||
private int workMins;//工作时长
|
||||
private String isAcross;//是否跨天
|
||||
private String signstart;//自由工时开始打卡时间
|
||||
private boolean isExclude;//无需考勤人员
|
||||
private String calmethod;//自由班制计算方式
|
||||
private int signoutOnlyoff;
|
||||
|
||||
private List<String> halfWorkTime;//半天
|
||||
|
||||
private List<int[]> halfWorkIndex;
|
||||
|
||||
/**
|
||||
* 是否是非工作日 1表示是非工作日班次
|
||||
*/
|
||||
private int nonWorkShift;
|
||||
/**
|
||||
* 当前日期类型
|
||||
* playday 休息日
|
||||
* work 工作日
|
||||
* holiday 节假日
|
||||
*/
|
||||
private String dayType;
|
||||
|
||||
/**
|
||||
* 应出勤折算天数
|
||||
*/
|
||||
private String convertAttendDay = "";
|
||||
|
||||
public String getGroupId() {
|
||||
return groupId;
|
||||
}
|
||||
|
||||
public void setGroupId(String groupId) {
|
||||
this.groupId = groupId;
|
||||
}
|
||||
|
||||
public String getGroupName() {
|
||||
return groupName;
|
||||
}
|
||||
|
||||
public void setGroupName(String groupName) {
|
||||
this.groupName = groupName;
|
||||
}
|
||||
|
||||
public String getKQType() {
|
||||
return kqType;
|
||||
}
|
||||
|
||||
public void setKQType(String kqType) {
|
||||
this.kqType = kqType;
|
||||
}
|
||||
|
||||
public String getSerialId() {
|
||||
return serialId;
|
||||
}
|
||||
|
||||
public void setSerialId(String serialId) {
|
||||
this.serialId = serialId;
|
||||
}
|
||||
|
||||
public Map<String, Object> getShiftRuleInfo() {
|
||||
return shiftRuleInfo;
|
||||
}
|
||||
|
||||
public void setShiftRuleInfo(Map<String, Object> shiftRuleInfo) {
|
||||
this.shiftRuleInfo = shiftRuleInfo;
|
||||
}
|
||||
|
||||
public List<TimeScopeEntity> getWorkTime() {
|
||||
return workTime;
|
||||
}
|
||||
|
||||
public void setWorkTime(List<TimeScopeEntity> workTime) {
|
||||
this.workTime = workTime;
|
||||
}
|
||||
|
||||
public List<TimeScopeEntity> getRestTime() {
|
||||
return restTime;
|
||||
}
|
||||
|
||||
public void setRestTime(List<TimeScopeEntity> restTime) {
|
||||
this.restTime = restTime;
|
||||
}
|
||||
|
||||
public int getWorkMins() {
|
||||
return workMins;
|
||||
}
|
||||
|
||||
public void setWorkMins(int workMins) {
|
||||
this.workMins = workMins;
|
||||
}
|
||||
|
||||
public String getIsAcross() {
|
||||
return isAcross;
|
||||
}
|
||||
|
||||
public void setIsAcross(String isAcross) {
|
||||
this.isAcross = isAcross;
|
||||
}
|
||||
|
||||
public String getSignStart() {
|
||||
return signstart;
|
||||
}
|
||||
|
||||
public void setSignStart(String signstart) {
|
||||
this.signstart = signstart;
|
||||
}
|
||||
|
||||
public List<TimeScopeEntity> getSignTime() {
|
||||
return signTime;
|
||||
}
|
||||
|
||||
public void setSignTime(List<TimeScopeEntity> signTime) {
|
||||
this.signTime = signTime;
|
||||
}
|
||||
|
||||
public boolean getIsExclude() {
|
||||
return isExclude;
|
||||
}
|
||||
|
||||
public void setIsExclude(boolean isExclude) {
|
||||
this.isExclude = isExclude;
|
||||
}
|
||||
|
||||
public String getCalmethod() {
|
||||
return calmethod;
|
||||
}
|
||||
|
||||
public void setCalmethod(String calmethod) {
|
||||
this.calmethod = calmethod;
|
||||
}
|
||||
|
||||
public int getNonWorkShift() {
|
||||
return nonWorkShift;
|
||||
}
|
||||
|
||||
public void setNonWorkShift(int restShift) {
|
||||
this.nonWorkShift = restShift;
|
||||
}
|
||||
|
||||
public String getDayType() {
|
||||
return dayType;
|
||||
}
|
||||
|
||||
public void setDayType(String dayType) {
|
||||
this.dayType = dayType;
|
||||
}
|
||||
|
||||
public String getConvertAttendDay() {
|
||||
return convertAttendDay;
|
||||
}
|
||||
|
||||
public void setConvertAttendDay(String convertAttendDay) {
|
||||
this.convertAttendDay = convertAttendDay;
|
||||
}
|
||||
|
||||
public int getSignoutOnlyoff() {
|
||||
return signoutOnlyoff;
|
||||
}
|
||||
|
||||
public void setSignoutOnlyoff(int signoutOnlyoff) {
|
||||
this.signoutOnlyoff = signoutOnlyoff;
|
||||
}
|
||||
|
||||
public List<String> getHalfWorkTime() {
|
||||
return halfWorkTime;
|
||||
}
|
||||
|
||||
public void setHalfWorkTime(List<String> halfWorkTime) {
|
||||
this.halfWorkTime = halfWorkTime;
|
||||
}
|
||||
|
||||
public List<int[]> getHalfWorkIndex() {
|
||||
return halfWorkIndex;
|
||||
}
|
||||
|
||||
public void setHalfWorkIndex(List<int[]> halfWorkIndex) {
|
||||
this.halfWorkIndex = halfWorkIndex;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "WorkTimeEntity{" +
|
||||
"groupId='" + groupId + '\'' +
|
||||
", groupName='" + groupName + '\'' +
|
||||
", kqType='" + kqType + '\'' +
|
||||
", serialId='" + serialId + '\'' +
|
||||
", shiftRuleInfo=" + shiftRuleInfo +
|
||||
", signTime=" + signTime +
|
||||
", workTime=" + workTime +
|
||||
", restTime=" + restTime +
|
||||
", workMins=" + workMins +
|
||||
", isAcross='" + isAcross + '\'' +
|
||||
", signstart='" + signstart + '\'' +
|
||||
", isExclude=" + isExclude +
|
||||
", calmethod='" + calmethod + '\'' +
|
||||
", signoutOnlyoff=" + signoutOnlyoff +
|
||||
", nonWorkShift=" + nonWorkShift +
|
||||
", dayType='" + dayType + '\'' +
|
||||
", convertAttendDay='" + convertAttendDay + '\'' +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue