源码文件 仅修改 GetKqReportCmd

新美光HR项目
Chengliang 4 weeks ago
parent 6efd593e65
commit f81928788c

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -0,0 +1,239 @@
package com.engine.kq.biz;
import weaver.cache.*;
import weaver.conn.RecordSet;
import weaver.general.Util;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
/**
*
*/
public class KQReportFieldComInfo extends CacheBase{
protected static String TABLE_NAME = "kq_report_field";
/** sql中的where信息不要以where开始 */
protected static String TABLE_WHERE = null;
/** sql中的order by信息不要以order by开始 */
protected static String TABLE_ORDER = "showorder";
@PKColumn(type = CacheColumnType.NUMBER)
protected static String PK_NAME = "id";
@CacheColumn(name = "fieldname")
protected static int fieldname;
@CacheColumn(name = "fieldlabel")
protected static int fieldlabel;
@CacheColumn(name = "unittype")
protected static int unittype;
@CacheColumn(name = "width")
protected static int width;
@CacheColumn(name = "parentid")
protected static int parentid;
@CacheColumn(name = "isdefinedcolumn")
protected static int isdefinedcolumn;
@CacheColumn(name = "defaultshow")
protected static int defaultshow;
@CacheColumn(name = "isleavetype")
protected static int isleavetype;
@CacheColumn(name = "reporttype")
protected static int reporttype;
@CacheColumn(name = "reporttype1")
protected static int reporttype1;
@CacheColumn(name = "isdataColumn")
protected static int isdataColumn;
@CacheColumn(name = "showDetial")
protected static int showDetial;
@CacheColumn(name = "groupid")
protected static int groupid;
@CacheColumn(name = "isenable")
protected static int isenable;
// #1276494 概述:满足薪酬指标项关联考勤报表列数据需求 By T.W
@CacheColumn(name = "if_salary_need")
protected static int ifSalaryNeed;
@CacheColumn(name = "formula")
protected static int formula;
@CacheColumn(name = "issystem")
protected static int issystem;
@CacheColumn(name = "cascadekey")
protected static int cascadekey;
@CacheColumn(name = "dailyShowOrder")
protected static int dailyShowOrder;
public static ConcurrentHashMap<String, String> cascadekey2fieldname = new ConcurrentHashMap<String, String>();
public static ConcurrentHashMap<String, String> field2Id = new ConcurrentHashMap<String, String>();
@Override
protected CacheMap initCache() throws Exception {
CacheMap localData = createCacheMap();
RecordSet rs = new RecordSet();
cascadekey2fieldname.clear();
field2Id.clear();
// String sql = " select a.id,fieldname,fieldlabel,width,unittype,parentid,isdefinedcolumn,defaultshow,isleavetype," +
// " reporttype,isdatacolumn,showdetial,a.showorder,groupid,isenable,formula,issystem,cascadekey " +
// " from kq_report_field a left join kq_report_field_group b on a.groupid = b.id " +
// " order by b.showorder asc, a.showorder asc ";
// #1276494 概述:满足薪酬指标项关联考勤报表列数据需求 By T.W
String sql = " SELECT id, fieldname,fieldlabel, unittype,width,parentid,isdefinedcolumn,defaultshow,isleavetype,'month' as reporttype, reporttype as reporttype1,isdataColumn," +
" showDetial,groupid,isenable,if_salary_need,formula,issystem,cascadekey,dailyShowOrder FROM kq_report_field where fieldname= 'lastname' ";
rs.executeQuery(sql);
while (rs.next()) {
if(Util.null2String(rs.getString("cascadekey")).length()>0){
String[] arrCascadekey = Util.splitString(rs.getString("cascadekey"),",");
for(int i=0;i<arrCascadekey.length;i++){
cascadekey2fieldname.put(arrCascadekey[i],rs.getString("fieldname"));
}
}
String id = Util.null2String(rs.getString(PK_NAME))+""+Util.null2String(rs.getString("reporttype"));
field2Id.put(Util.null2String(rs.getString("fieldname")),id);
CacheItem cacheItem = createCacheItem();
parseResultSetToCacheItem(rs, cacheItem);
modifyCacheItem(id, cacheItem);
localData.put(id, cacheItem);
}
// #1276494 概述:满足薪酬指标项关联考勤报表列数据需求 By T.W
sql = " SELECT id, fieldname,fieldlabel, unittype,width,parentid,isdefinedcolumn,defaultshow,isleavetype,'month' as reporttype, reporttype as reporttype1,isdataColumn," +
" showDetial,groupid,isenable,if_salary_need,formula,issystem,cascadekey,dailyShowOrder FROM (" +
" SELECT CASE WHEN b.showorder IS NULL THEN 999 ELSE b.showorder END AS tmp_showorder," +
" a.* " +
" FROM kq_report_field a LEFT JOIN kq_report_field_group b ON a.groupid = b.id where reportType in('all','month')) a" +
" ORDER BY a.tmp_showorder ASC, a.showorder ASC ";
rs.executeQuery(sql);
while (rs.next()) {
if(Util.null2String(rs.getString("cascadekey")).length()>0){
String[] arrCascadekey = Util.splitString(rs.getString("cascadekey"),",");
for(int i=0;i<arrCascadekey.length;i++){
cascadekey2fieldname.put(arrCascadekey[i],rs.getString("fieldname"));
}
}
String id = Util.null2String(rs.getString(PK_NAME))+""+Util.null2String(rs.getString("reporttype"));
field2Id.put(Util.null2String(rs.getString("fieldname")),id);
CacheItem cacheItem = createCacheItem();
parseResultSetToCacheItem(rs, cacheItem);
modifyCacheItem(id, cacheItem);
localData.put(id, cacheItem);
}
// #1276494 概述:满足薪酬指标项关联考勤报表列数据需求 By T.W
sql = " SELECT id, fieldname,fieldlabel, unittype,width,parentid,isdefinedcolumn,defaultshow,isleavetype,'daily' as reporttype,reporttype as reporttype1, isdataColumn," +
" showDetial,groupid,isenable,if_salary_need,formula,issystem,cascadekey,dailyShowOrder" +
" FROM kq_report_field a where reportType in('all','daily') ORDER BY dailyShowOrder ASC ";
rs.executeQuery(sql);
while (rs.next()) {
String id = Util.null2String(rs.getString(PK_NAME))+""+Util.null2String(rs.getString("reporttype"));
CacheItem cacheItem = createCacheItem();
parseResultSetToCacheItem(rs, cacheItem);
modifyCacheItem(id, cacheItem);
localData.put(id, cacheItem);
}
return localData;
}
public String getId(){
return (String)getRowValue(PK_INDEX);
}
public String getFieldname() { return (String)getRowValue(fieldname); }
public String getFieldname(String key)
{
return (String)getValue(fieldname,key);
}
public String getFieldlabel() { return (String)getRowValue(fieldlabel); }
public String getFieldlabel(String key)
{
return (String)getValue(fieldlabel,key);
}
public String getUnittype() { return (String)getRowValue(unittype); }
public String getUnittype(String key)
{
return (String)getValue(unittype,key);
}
public String getWidth() { return (String)getRowValue(width); }
public String getWidth(String key)
{
return (String)getValue(width,key);
}
public String getParentid() { return (String)getRowValue(parentid); }
public String getParentid(String key)
{
return (String)getValue(parentid,key);
}
public String getIsDefinedColumn() { return (String)getRowValue(isdefinedcolumn); }
public String getIsDefinedColumn(String key)
{
return (String)getValue(isdefinedcolumn,key);
}
public String getDefaultShow() { return (String)getRowValue(defaultshow); }
public String getDefaultShow(String key)
{
return (String)getValue(defaultshow,key);
}
public String getIsLeaveType() { return (String)getRowValue(isleavetype); }
public String getIsLeaveType(String key) { return (String)getValue(isleavetype,key); }
public String getReportType() { return (String)getRowValue(reporttype); }
public String getReportType(String key) { return (String)getValue(reporttype,key); }
public String getReportType1() { return (String)getRowValue(reporttype1); }
public String getReportType1(String key) { return (String)getValue(reporttype1,key); }
public String getIsdataColumn() { return (String)getRowValue(isdataColumn); }
public String getIsdataColumn(String key) { return (String)getValue(isdataColumn,key); }
public String getShowDetial() { return (String)getRowValue(showDetial); }
public String getShowDetial(String key) { return (String)getValue(showDetial,key); }
public String getGroupid() { return (String)getRowValue(groupid); }
public String getGroupid(String key) { return (String)getValue(groupid,key); }
public String getIsenable() { return (String)getRowValue(isenable); }
public String getIsenable(String key) { return (String)getValue(isenable,key); }
// #1276494 概述:满足薪酬指标项关联考勤报表列数据需求 By T.W
public String getIfSalaryNeed() {
return (String) getRowValue(ifSalaryNeed);
}
public String getIfSalaryNeed(String key) {
return (String) getValue(ifSalaryNeed, key);
}
public String getFormula() { return (String)getRowValue(formula); }
public String getFormula(String key) { return (String)getValue(formula,key); }
public String getIsSystem() { return (String)getRowValue(issystem); }
public String getIsSystem(String key) { return (String)getValue(issystem,key); }
public String getCascadekey() { return (String)getRowValue(cascadekey); }
public String getCascadekey(String key) { return (String)getValue(cascadekey,key); }
public String getDailyShowOrder() { return (String)getRowValue(dailyShowOrder); }
public String getDailyShowOrder(String key) { return (String)getValue(dailyShowOrder,key); }
}

@ -6,6 +6,8 @@ import com.engine.common.biz.AbstractCommonCommand;
import com.engine.common.entity.BizLogContext;
import com.engine.core.interceptor.CommandContext;
import com.engine.kq.biz.*;
import com.engine.xmgsecond.entity.KqFormatTotal;
import com.engine.xmgsecond.util.KqCalulateUtil;
import com.weaver.file.Prop;
import com.engine.kq.util.KQDurationCalculatorUtil;
import com.engine.kq.util.PageUidFactory;
@ -102,6 +104,12 @@ public class GetKQReportCmd extends AbstractCommonCommand<Map<String, Object>> {
List<Object> childColumns = null;
KQReportFieldComInfo kqReportFieldComInfo = new KQReportFieldComInfo();
while (kqReportFieldComInfo.next()){
//QC3685035 考勤汇总表去除严重迟到,严重早退(+对应时长4列
if ("graveBeLate".equals(kqReportFieldComInfo.getFieldname())) continue;
if ("graveLeaveEarly".equals(kqReportFieldComInfo.getFieldname())) continue;
if ("graveBeLateMins".equals(kqReportFieldComInfo.getFieldname())) continue;
if ("graveLeaveEarlyMins".equals(kqReportFieldComInfo.getFieldname())) continue;
if(Util.null2String(kqReportFieldComInfo.getParentid()).length()>0)continue;
if(kqReportFieldComInfo.getFieldname().equals("kqCalendar"))continue;
if(KQReportFieldComInfo.cascadekey2fieldname.keySet().contains(kqReportFieldComInfo.getFieldname()))continue;
@ -398,6 +406,16 @@ public class GetKQReportCmd extends AbstractCommonCommand<Map<String, Object>> {
}
data.put("jobtitleId",tmpJobtitleId);
fieldValue = jobTitlesComInfo.getJobTitlesname(tmpJobtitleId);
}else if("kqGroup".equals(fieldName)){
//QC3685035 考勤月度报表增加所属所属考勤组
KQGroupComInfo kqGroupComInfo = new KQGroupComInfo();
KQGroupMemberComInfo kqGroupMemberComInfo = new KQGroupMemberComInfo();
String groupId = kqGroupMemberComInfo.getKQGroupId(id, toDate);
fieldValue = kqGroupComInfo.getGroupname(groupId);
}else if("absenteeismDays".equals(fieldName)){
//QC3685035 考勤月度报表增加缺勤天数
List<KqFormatTotal> kqFormatTotalList = KqCalulateUtil.abnormalAttendance(id, fromDate, toDate);
fieldValue = String.format("%.1f", kqFormatTotalList.stream().mapToDouble(KqFormatTotal::getAbsenceDays).sum());
} else if(fieldName.equals("rlzqqxs")){
String rlzqqxsTime = getXcqts(fromDate,id);
fieldValue = rlzqqxsTime;

@ -1,17 +1,25 @@
package com.engine.kq.cmd.shiftschedule;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.engine.common.biz.AbstractCommonCommand;
import com.engine.common.biz.SimpleBizLogger;
import com.engine.common.constant.BizLogSmallType4Hrm;
import com.engine.common.constant.BizLogType;
import com.engine.common.entity.BizLogContext;
import com.engine.core.interceptor.CommandContext;
import com.engine.kq.bean.KqShiftscheduleOperateLog;
import com.engine.kq.biz.*;
import com.engine.kq.cmd.shiftmanagement.toolkit.ShiftManagementToolKit;
import com.engine.kq.util.UtilKQ;
import com.ibm.db2.jcc.uw.bb;
import org.apache.commons.lang3.StringUtils;
import weaver.common.DateUtil;
import weaver.conn.BatchRecordSet;
import weaver.conn.DBUtil;
import weaver.conn.RecordSet;
import weaver.general.BaseBean;
import weaver.general.TimeUtil;
import weaver.general.Util;
import weaver.hrm.HrmUserVarify;
import weaver.hrm.User;
@ -23,15 +31,30 @@ import java.util.*;
public class SaveBatchShiftScheduleCmd extends AbstractCommonCommand<Map<String, Object>> {
private SimpleBizLogger logger;
// 添加日志功能
private List<List<Object>> operateLogParams = new ArrayList<>();
// 操作类型 操作人 考勤组名称+id 被修改人 被修改班次日期 被修改班次+id 排班设置行id
private List<Object> operateLogParam = null;
public SaveBatchShiftScheduleCmd(Map<String, Object> params, User user) {
this.user = user;
this.params = params;
this.logger = new SimpleBizLogger();
String data = Util.null2String(params.get("data"));
JSONObject jsonObj = JSON.parseObject(data);
String groupId = Util.null2String(jsonObj.get("groupId"));//考勤组id
BizLogContext bizLogContext = new BizLogContext();
bizLogContext.setLogType(BizLogType.HRM_ENGINE);//模块类型
bizLogContext.setBelongType(BizLogSmallType4Hrm.HRM_ENGINE_Schedule_Set);//所属大类型
bizLogContext.setLogSmallType(BizLogSmallType4Hrm.HRM_ENGINE_Schedule_Set);//当前小类型
bizLogContext.setParams(params);//当前request请求参数
logger.setUser(user);//当前操作人
String mainSql = "select * from kq_group where id = " + groupId + " and (isdelete is null or isdelete <> '1') ";
logger.setMainSql(mainSql, "id");//主表sql
logger.setMainPrimarykey("id");//主日志表唯一key
logger.setMainTargetNameColumn("groupname");
SimpleBizLogger.SubLogInfo subLogInfo1 = logger.getNewSubLogInfo();
String subSql1 = "select * from kq_shiftschedule where groupid = " + groupId + " and (isdelete is null or isdelete <> '1') ";
subLogInfo1.setSubSql(subSql1,"id");
logger.addSubLogInfo(subLogInfo1);
logger.before(bizLogContext);
}
@Override
@ -67,6 +90,12 @@ public class SaveBatchShiftScheduleCmd extends AbstractCommonCommand<Map<String,
String serialId = Util.null2String(jsonObj.get("serialId"));//班次
String shiftcycleId = Util.null2String(jsonObj.get("shiftcycleId"));//排班周期Id
String meetworkDays = Util.null2String(jsonObj.get("meetworkDays"));//遇调配工作日
String serialIdSx = Util.null2String(jsonObj.get("serialIdSx"));//双休班次
String serialIdJjr = Util.null2String(jsonObj.get("serialIdJjr"));//节假日班次
String serialIdXxr = Util.null2String(jsonObj.get("serialIdXxr"));//调配休息日班次
String serialIdGzr = Util.null2String(jsonObj.get("serialIdGzr"));//调配工作日班次
// 某个管理员所拥有的维护人员的权限
List<String> managerRoleUserIdList = new KqShiftScheduleRoleBiz().getUfKqShiftScheduleRoleValue(""+user.getUID(), groupId);
KqMembersValidateBiz kqMembersValidateBiz = new KqMembersValidateBiz();
@ -108,26 +137,24 @@ public class SaveBatchShiftScheduleCmd extends AbstractCommonCommand<Map<String,
excludeidList = Util.splitString2List(excludeid,",");
}
}
String oriDate = "";
Map<String,Object> mapShiftSchedule = new HashMap<>();
sql = " select id, resourceid, kqdate, serialid from kq_shiftschedule where (isdelete is null or isdelete <> '1') and groupid=? ";
Map<String,Object> mapShiftScheduleOri = new HashMap<>();
sql = " select id, resourceid, kqdate from kq_shiftschedule where (isdelete is null or isdelete <> '1') and groupid=? ";
//有客户提下面的sql有性能问题在表数据较多并且该表数据改动较为频率不适合建索引所以对mapShiftSchedule先缓存的数据范围过滤下没必要全表缓存
if("1".equals(shiftScheduleType)){//按天排班
sql += " and kqdate='"+shiftScheduleDate+"' ";
oriDate = shiftScheduleDate;
}else if("2".equals(shiftScheduleType)){
sql += " and kqdate>='"+shiftScheduleBeginDate+"' and kqdate<='"+shiftScheduleEndDate+"' ";
oriDate = shiftScheduleBeginDate;
}
rs.executeQuery(sql,groupId);
while(rs.next()){
mapShiftSchedule.put(rs.getString("kqdate")+"|"+Util.null2String(rs.getString("resourceid")), Util.null2String(rs.getString("id"))+"#"+Util.null2String(rs.getString("serialid")));
mapShiftSchedule.put(rs.getString("kqdate")+"|"+rs.getString("resourceid"),rs.getString("id"));
}
String id = "";
String oldSerialid = "";
boolean needChange = false;
KQShiftManagementComInfo kqShiftScheduleComInfo = new KQShiftManagementComInfo();
ResourceComInfo rci = new ResourceComInfo();
KqShiftscheduleOperateLog bean = null;
if(shiftScheduleType.equals("1")){//按天排班
if(SaveShiftScheduleCmd.isDate(shiftScheduleDate)) {
for(String resourceid:lsGroupMembers){
// 排除无需考勤人员
if(excludeidList != null && excludeidList.contains(resourceid)) {
@ -138,62 +165,38 @@ public class SaveBatchShiftScheduleCmd extends AbstractCommonCommand<Map<String,
continue;
}
}
String shiftScheduleValue = Util.null2String(mapShiftSchedule.get(shiftScheduleDate + "|" + resourceid));
if (!"".equals(shiftScheduleValue)) {
id = shiftScheduleValue.split("#")[0];
oldSerialid = shiftScheduleValue.split("#")[1];
}
id = Util.null2String(mapShiftSchedule.get(shiftScheduleDate+"|"+resourceid));
// 如果超过了有效期,就不存储数据
List<String> validateList = validateResult.get(resourceid);
boolean isInRange = kqMembersValidateBiz.isInRange(shiftScheduleDate, validateList);
if (!isInRange && oldSerialid.length() > 0) {
if (delIds.length() > 0) {
delIds += ",";
}
if(!isInRange) {
if(delIds.length()>0)delIds+=",";
delIds+=id;
bean = new KqShiftscheduleOperateLog(2, user.getLastname(), kqGroupComInfo.getGroupname(groupId) + "(id:" + groupId + ")", rci.getLastname(resourceid),
shiftScheduleDate, ("-1".equals(oldSerialid) ? SystemEnv.getHtmlLabelName(26593, user.getLanguage()) : kqShiftScheduleComInfo.getSerial(oldSerialid) + "(id:" + oldSerialid + ")"), id, "", user.getLanguage());
addLog(bean);
continue;
}
//if(weaver.common.DateUtil.timeInterval(shiftScheduleDate,today)>0)continue;//今天之前的无需处理
if(id.length()>0){
if (serialId.length() == 0 && oldSerialid.length() > 0) {
if (delIds.length() > 0) {
delIds += ",";
}
if(serialId.length()==0){
if(delIds.length()>0)delIds+=",";
delIds+=id;
bean = new KqShiftscheduleOperateLog(2, user.getLastname(), kqGroupComInfo.getGroupname(groupId) + "(id:" + groupId + ")", rci.getLastname(resourceid),
shiftScheduleDate, ("-1".equals(oldSerialid) ? SystemEnv.getHtmlLabelName(26593, user.getLanguage()) : kqShiftScheduleComInfo.getSerial(oldSerialid) + "(id:" + oldSerialid + ")"), id, "", user.getLanguage());
addLog(bean);
}else {
if (!oldSerialid.equals(serialId) && oldSerialid.length() > 0) {
needChange = true;
params = new ArrayList<Object>();
params.add(serialId);
params.add(id);
params.add(shiftScheduleDate);
params.add(resourceid);
paramUpdate.add(params);
bean = new KqShiftscheduleOperateLog(1, user.getLastname(), kqGroupComInfo.getGroupname(groupId) + "(id:" + groupId + ")", rci.getLastname(resourceid),
shiftScheduleDate, ("-1".equals(oldSerialid) ? SystemEnv.getHtmlLabelName(26593, user.getLanguage()) : kqShiftScheduleComInfo.getSerial(oldSerialid) + "(id:" + oldSerialid + ")"), id, ("-1".equals(serialId) ? SystemEnv.getHtmlLabelName(26593, user.getLanguage()) : kqShiftScheduleComInfo.getSerial(serialId) + "(id:" + serialId + ")"), user.getLanguage());
addLog(bean);
}
}
}else{
if (serialId.length() == 0) continue;
if(!oldSerialid.equals(serialId)) {
needChange = true;
if(serialId.length()==0)continue;;
params = new ArrayList<Object>();
params.add(shiftScheduleDate);
params.add(serialId);
params.add(resourceid);
params.add(groupId);
paramInsert.add(params);
bean = new KqShiftscheduleOperateLog(0, user.getLastname(), kqGroupComInfo.getGroupname(groupId) + "(id:" + groupId + ")", rci.getLastname(resourceid),
shiftScheduleDate, "", id, ("-1".equals(serialId) ? SystemEnv.getHtmlLabelName(26593, user.getLanguage()) : kqShiftScheduleComInfo.getSerial(serialId) + "(id:" + serialId + ")"), user.getLanguage());
addLog(bean);
}
}
if (needChange) {
if(DateUtil.timeInterval(shiftScheduleDate,today)>=0) {
formatParams = new ArrayList<>();
formatParams.add(resourceid);
@ -211,8 +214,7 @@ public class SaveBatchShiftScheduleCmd extends AbstractCommonCommand<Map<String,
checkSerialParams.add(shiftScheduleDate);
checkSerialParams.add(serialId);
lscheckSerialParams.add(checkSerialParams);
}
}
mapShiftScheduleOri.put(shiftScheduleDate+"|"+resourceid,serialId);
}
}else if(shiftScheduleType.equals("2")){//按周期排班
List<String> lsDate = new ArrayList<>();
@ -255,55 +257,44 @@ public class SaveBatchShiftScheduleCmd extends AbstractCommonCommand<Map<String,
boolean needShiftSchedule = false;
int dayCount = 0;
for(int i=0;i<lsDate.size();i++) {
needChange = false;
id= "";
oldSerialid = "";
//if(weaver.common.DateUtil.timeInterval(date,today)>0)continue;//今天之前的无需处理
String date = lsDate.get(i);
if(!SaveShiftScheduleCmd.isDate(date)) {
continue;
}
String shiftScheduleValue = Util.null2String(mapShiftSchedule.get(date+"|"+resourceid));
if(!"".equals(shiftScheduleValue)) {
id = shiftScheduleValue.split("#")[0];
oldSerialid = shiftScheduleValue.split("#")[1];
}
id = Util.null2String(mapShiftSchedule.get(date+"|"+resourceid));
// 如果超过了有效期,就不存储数据
List<String> validateList = validateResult.get(resourceid);
boolean isInRange = kqMembersValidateBiz.isInRange(date, validateList);
if(!isInRange) {
if(oldSerialid.length() > 0) {
if (delIds.length() > 0) {
delIds += ",";
}
if(delIds.length()>0)delIds+=",";
delIds+=id;
bean = new KqShiftscheduleOperateLog(2, user.getLastname(), kqGroupComInfo.getGroupname(groupId) + "(id:" + groupId + ")", rci.getLastname(resourceid),
date, ("-1".equals(oldSerialid) ? SystemEnv.getHtmlLabelName(26593, user.getLanguage()) : kqShiftScheduleComInfo.getSerial(oldSerialid) + "(id:" + oldSerialid + ")"), id, "", user.getLanguage());
addLog(bean);
}
continue;
}
needShiftSchedule = true;
int changeType= KQHolidaySetBiz.getChangeType(groupId, date);
if (changeType != 1 && changeType != 3 && !holidayType.equals("1")) {//遇双休日继续排班
if (changeType != 1 && changeType != 3 && holidayType.equals("2")) {//遇双休日继续排班
int weekDay = DateUtil.getWeek(date);
if(weekDay>5){
needShiftSchedule = false;
}
}
if(!meetHolidays.equals("1")){//遇节假日继续排班
if(meetHolidays.equals("2")){//遇节假日继续排班
if(changeType==1){
needShiftSchedule = false;
}
}
if(!meetRestDays.equals("1")){//遇调配休息日继续排班
if(meetRestDays.equals("2")){//遇调配休息日继续排班
if(changeType==3){
needShiftSchedule = false;
}
}
if(meetworkDays.equals("2")){//遇调配工作日日继续排班
if(changeType==2){
needShiftSchedule = false;
}
}
if(needShiftSchedule){
dayCount++;
int idx = dayCount % shiftcycleday;
@ -312,55 +303,58 @@ public class SaveBatchShiftScheduleCmd extends AbstractCommonCommand<Map<String,
} else {
serialId = Util.null2String(shiftcycleserialids[idx-1]);
}
if(id.length()>0){
if(serialId.length()==0 && oldSerialid.length() > 0){
if(delIds.length()>0) {
delIds+=",";
new BaseBean().writeLog("serialId中"+serialId);
if (changeType !=1 && changeType != 3 && holidayType.equals("3")) {//遇双休日指定排班
int weekDay = DateUtil.getWeek(date);
if(weekDay>5){
serialId = serialIdSx;
}
}
if(meetHolidays.equals("3")){//遇节假日指定排班
if(changeType == 1){
serialId = serialIdJjr;
}
}
if(meetRestDays.equals("3")){//遇调配休息日指定排班
if(changeType == 3){
serialId = serialIdXxr;
}
}
if(meetworkDays.equals("3")){//遇调配工作日指定排班
if(changeType == 2){
serialId = serialIdGzr;
}
}
new BaseBean().writeLog("serialId后"+serialId);
if(id.length()>0){
if(serialId.length()==0){
if(delIds.length()>0)delIds+=",";
delIds+=id;
bean = new KqShiftscheduleOperateLog(2, user.getLastname(), kqGroupComInfo.getGroupname(groupId) + "(id:" + groupId + ")", rci.getLastname(resourceid),
date, ("-1".equals(oldSerialid) ? SystemEnv.getHtmlLabelName(26593, user.getLanguage()) : kqShiftScheduleComInfo.getSerial(oldSerialid) + "(id:" + oldSerialid + ")"), id, "",user.getLanguage());
addLog(bean);
}else {
if(!oldSerialid.equals(serialId) && oldSerialid.length() > 0) {
needChange = true;
params = new ArrayList<Object>();
params.add(serialId);
params.add(id);
params.add(date);
params.add(resourceid);
paramUpdate.add(params);
bean = new KqShiftscheduleOperateLog(1,user.getLastname(),kqGroupComInfo.getGroupname(groupId)+"(id:"+groupId+")",rci.getLastname(resourceid),
date, ("-1".equals(oldSerialid) ? SystemEnv.getHtmlLabelName(26593, user.getLanguage()) : kqShiftScheduleComInfo.getSerial(oldSerialid)+"(id:"+oldSerialid+")"), id, ("-1".equals(serialId) ? SystemEnv.getHtmlLabelName(26593, user.getLanguage()) : kqShiftScheduleComInfo.getSerial(serialId)+"(id:"+serialId+")"),user.getLanguage());
addLog(bean);
}
}
}else{
if(serialId.length()>0){
if(!oldSerialid.equals(serialId)) {
needChange = true;
params = new ArrayList<Object>();
params.add(date);
params.add(serialId);
params.add(resourceid);
params.add(groupId);
paramInsert.add(params);
bean = new KqShiftscheduleOperateLog(0, user.getLastname(), kqGroupComInfo.getGroupname(groupId) + "(id:" + groupId + ")", rci.getLastname(resourceid),
date, "", id, ("-1".equals(serialId) ? SystemEnv.getHtmlLabelName(26593, user.getLanguage()) : kqShiftScheduleComInfo.getSerial(serialId) + "(id:" + serialId + ")"), user.getLanguage());
addLog(bean);
}
}
}
mapShiftScheduleOri.put(date+"|"+resourceid,serialId);
}else{
if(oldSerialid.length() > 0) {
deleteCancelParams = new ArrayList<>();
deleteCancelParams.add(resourceid);
deleteCancelParams.add(date);
lsDeleteCancelParams.add(deleteCancelParams);
bean = new KqShiftscheduleOperateLog(2, user.getLastname(), kqGroupComInfo.getGroupname(groupId) + "(id:" + groupId + ")", rci.getLastname(resourceid),
date, ("-1".equals(oldSerialid) ? SystemEnv.getHtmlLabelName(26593, user.getLanguage()) : kqShiftScheduleComInfo.getSerial(oldSerialid) + "(id:" + oldSerialid + ")"), id, "",user.getLanguage());
addLog(bean);
}
}
if(needChange) {
if(DateUtil.timeInterval(date,today)>=0) {
formatParams = new ArrayList<>();
formatParams.add(resourceid);
@ -378,18 +372,255 @@ public class SaveBatchShiftScheduleCmd extends AbstractCommonCommand<Map<String,
checkSerialParams.add(shiftScheduleDate);
checkSerialParams.add(serialId);
lscheckSerialParams.add(checkSerialParams);
}
}
}
//二开获取排班校验规则
String getPbCheckValue = getpbCheckValue(groupId);
BaseBean bb = new BaseBean();
String fromDate = TimeUtil.getMonthBeginDay(oriDate);
String toDate = TimeUtil.getMonthEndDay(oriDate);
List<String> lsDateNew = new ArrayList<>();
Calendar calNew = DateUtil.getCalendar();
boolean isEndNew = false;
for(String date=fromDate; !isEndNew;) {
if(date.equals(toDate)) isEndNew = true;
lsDateNew.add(date);
calNew.setTime(DateUtil.parseToDate(date));
date = DateUtil.getDate(calNew.getTime(), 1);
}
Map<String,Object> mapShiftScheduleAll = new HashMap<>();
Set<String> unSavePerson = new HashSet<>();
if("3".equals(getPbCheckValue) || "2".equals(getPbCheckValue)){
//上四休二校验,生成预排班数据结构
for(String resourceid:lsGroupMembers){
Map<String,Object> mapShiftScheduleChild = new HashMap<>();
String sqlChild = " select id, resourceid, kqdate,serialid from kq_shiftschedule where (isdelete is null or isdelete <> '1') and groupid=? ";
//有客户提下面的sql有性能问题在表数据较多并且该表数据改动较为频率不适合建索引所以对mapShiftSchedule先缓存的数据范围过滤下没必要全表缓存
sqlChild += " and kqdate>='"+fromDate+"' and kqdate<='"+toDate+"' ";
rs.executeQuery(sqlChild,groupId);
while(rs.next()){
mapShiftScheduleChild.put(rs.getString("kqdate")+"|"+rs.getString("resourceid"),rs.getString("serialid"));
}
//生成这个人员这个月的预生成排班
for(int i=0;i<lsDateNew.size();i++) {
String date = lsDateNew.get(i);
String bcidNew = Util.null2String(mapShiftScheduleOri.get(date+"|"+resourceid));
if(StringUtils.isNotBlank(bcidNew)){
//本次排班预生成班次id
mapShiftScheduleAll.put(date+"|"+resourceid,bcidNew);
}else{
//本次排班未预生成id检查历史生成的班次id若历史也没有生效班次且当天不是节假日则不让保存
String bcidOld = Util.null2String(mapShiftScheduleChild.get(date+"|"+resourceid));
if(StringUtils.isNotBlank(bcidOld)){
mapShiftScheduleAll.put(date+"|"+resourceid,bcidOld);
}else{
int changeType = getChangeType(groupId, date);
if(changeType != 1){
//该人员不让保存
unSavePerson.add(resourceid);
}
}
}
}
}
bb.writeLog("unSavePerson"+JSONObject.toJSONString(unSavePerson));
bb.writeLog("mapShiftScheduleAll"+JSONObject.toJSONString(mapShiftScheduleAll));
if("2".equals(getPbCheckValue)){
//获取当月正常工作天数
Integer xcqtsAll = 0;
for (String date : lsDateNew) {
Integer zcgzts = 0;
KQHolidaySetComInfo holidaySetComInfo = new KQHolidaySetComInfo();
String changeTypeNew = holidaySetComInfo.getChangeType(groupId, date);
if("2".equals(changeTypeNew)){
//调配工作日计正常工作天数
zcgzts = 1;
}
if(DateUtil.getWeek(date) != 6 && DateUtil.getWeek(date) != 7){
//不为周六周日
if(!"1".equals(changeTypeNew) && !"3".equals(changeTypeNew)){
//不为节假日和休息日
zcgzts = 1;
}
}
xcqtsAll = xcqtsAll+zcgzts;
}
bb.writeLog("xcqtsAll"+xcqtsAll);
for(String resourceid:lsGroupMembers){
bb.writeLog("resourceid"+resourceid);
Integer bcNum = 0;
//遍历这个人员这个月的预生成排班
for(int i=0;i<lsDateNew.size();i++) {
String date = lsDateNew.get(i);
String bcid = Util.null2String(mapShiftScheduleAll.get(date+"|"+resourceid));
bb.writeLog("dateTwo"+date+"bcid"+bcid);
if(StringUtils.isNotBlank(bcid)){
//班次是否是休息班,是的话往后判断是否是两个连续休息班
boolean checkXxb = checkXxr(bcid);
if(checkXxb){
//是休息班,不统计
bb.writeLog("是休息班,不统计");
}else{
//是工作班,统计
bb.writeLog("是工作班,统计");
bcNum++;
}
}
}
bb.writeLog("bcNum"+bcNum);
if(bcNum != xcqtsAll){
//当月日历工作日天数+调配工作日天数必须等于当月工作班天数,不等于则不让保存
unSavePerson.add(resourceid);
}
}
}
if("3".equals(getPbCheckValue)){
// 校验是否满足上四休二规则从当月第一个连续两天的休息班作为锚点判断此休息班前后排班是否满足固定4天工作+2天休息的模式
// 如果当月存在法定节假日则默认跳过后继续排班。例如:周三为节假日,且当周一为第一天工作日,那么当周的排班结果为:周一~周二:
// 2天工作日、周三跳过、周四~周五2天工作日、周六周日2天休息班
for(String resourceid:lsGroupMembers){
bb.writeLog("resourceid"+resourceid);
//遍历这个人员这个月的预生成排班
for(int i=0;i<lsDateNew.size();i++) {
String date = lsDateNew.get(i);
String bcid = Util.null2String(mapShiftScheduleAll.get(date+"|"+resourceid));
bb.writeLog("date"+date+"bcid"+bcid);
if(StringUtils.isNotBlank(bcid)){
//班次是否是休息班,是的话往后判断是否是两个连续休息班
boolean checkXxb = checkXxr(bcid);
if(checkXxb){
//是休息班,往后找
bb.writeLog("是休息班,往后找");
boolean findNextXxb = true;
Integer day = 1;
while (findNextXxb){
calNew.setTime(DateUtil.parseToDate(date));
String dateNext = DateUtil.getDate(calNew.getTime(), day);
day++;
String bcidNext = Util.null2String(mapShiftScheduleAll.get(dateNext+"|"+resourceid));
bb.writeLog("dateNext"+dateNext+"day"+day+"bcidNext"+bcidNext);
if(StringUtils.isNotBlank(bcidNext)){
//找到了第一个有班次的
bb.writeLog("找到了第一个有班次的");
findNextXxb = false;
boolean checkXxbNext = checkXxr(bcidNext);
if(checkXxbNext){
//再往后找一个班次,该班次需要为工作日
//是休息班,往后找
bb.writeLog("也是休息班,再往后找");
boolean findNextXxb1 = true;
Integer day1 = 1;
while (findNextXxb1){
calNew.setTime(DateUtil.parseToDate(dateNext));
String dateNext1 = DateUtil.getDate(calNew.getTime(), day1);
day1++;
String bcidNext1 = Util.null2String(mapShiftScheduleAll.get(dateNext1+"|"+resourceid));
bb.writeLog("bcidNext1"+bcidNext1+"dateNext1"+dateNext1+"day1"+day1);
if(StringUtils.isNotBlank(bcidNext1)){
//不往后找了
boolean checkXxbNext1 = checkXxr(bcidNext1);
findNextXxb1 = false;
bb.writeLog("checkXxbNext1"+checkXxbNext1);
if(checkXxbNext1){
//存在三个连续的休息班,不符合上四休二
bb.writeLog("存在三个连续的休息班,不符合上四休二");
unSavePerson.add(resourceid);
}else{
i++;
}
}else{
i++;
}
//到最后一天也没找到,暂不处理
if(DateUtil.timeInterval(toDate,dateNext1)>=0){
findNextXxb1 = false;
}
}
//将date作为一个锚点往前找并判断是否满足上四休二
boolean findBefore = true;
Integer dayB = -1;
//工作班数量
Integer gzbnum = 0;
//判断前面是否还有休息班标识
Integer xxbNo = 0;
while (findBefore){
calNew.setTime(DateUtil.parseToDate(date));
String dateBefore = DateUtil.getDate(calNew.getTime(), dayB);
dayB--;
String bcidBefore = Util.null2String(mapShiftScheduleAll.get(dateBefore+"|"+resourceid));
bb.writeLog("bcidBefore"+bcidBefore+"dateBefore"+dateBefore+"dayB"+dayB);
if(StringUtils.isNotBlank(bcidBefore)){
boolean checkXxbBefore = checkXxr(bcidBefore);
if(checkXxbBefore){
//找到了第一个休息班,判断间隔了多少个非休息班,不再找了
bb.writeLog("找到了第一个休息班,判断间隔了多少个非休息班,不再找了");
findBefore = false;
xxbNo = 1;
}else{
gzbnum ++;
}
}
//找到月初一号了,不找了
if(DateUtil.timeInterval(dateBefore,fromDate)>=0){
findBefore = false;
}
}
bb.writeLog("gzbnum"+gzbnum);
if(xxbNo == 1){
//当前锚点前面有休息班若间隔工作班数量不为4则不符合
if(gzbnum != 4){
bb.writeLog("当前锚点前面有休息班若间隔工作班数量不为4则不符合");
unSavePerson.add(resourceid);
}
}else{
//当前锚点是第一个休息班
if(gzbnum>4){
//锚点往前有超过四个工作班,不符合
bb.writeLog("当前锚点是第一个休息班,锚点往前有超过四个工作班,不符合");
unSavePerson.add(resourceid);
}
}
}else{
//找到的不是休息班,也认为不符合上四休二
bb.writeLog("找到的不是休息班,也认为不符合上四休二");
unSavePerson.add(resourceid);
}
}else{
i++;
}
//到最后一天也没找到,暂不处理
if(DateUtil.timeInterval(toDate,dateNext)>=0){
findNextXxb = false;
}
}
}
}
}
}
bb.writeLog("unSavePerson"+JSONObject.toJSONString(unSavePerson));
}
}
bb.writeLog("paramUpdate"+JSONObject.toJSONString(paramUpdate));
sql = " update kq_shiftschedule set serialid=?,isDelete=0 where id = ? ";
for (int i = 0; paramUpdate != null && i < paramUpdate.size(); i++) {
List<Object> update_params = paramUpdate.get(i);
String serialid = Util.null2String(update_params.get(0));
String tmp_id = Util.null2String(update_params.get(1));
String resourceid = Util.null2String(update_params.get(3));
if(unSavePerson.contains(resourceid) && !"1".equals(getPbCheckValue)){
//该人员不符合规则,不生效
}else{
rs.executeUpdate(sql, serialid,tmp_id);
}
}
sql = "insert into kq_shiftschedule (kqdate,serialid,resourceid,groupid,isDelete) values(?,?,?,?,0)";
for (int i = 0; paramInsert != null && i < paramInsert.size(); i++) {
@ -398,9 +629,14 @@ public class SaveBatchShiftScheduleCmd extends AbstractCommonCommand<Map<String,
String serialid = Util.null2String(insert_params.get(1));
String resourceid = Util.null2String(insert_params.get(2));
String groupid = Util.null2String(insert_params.get(3));
if(unSavePerson.contains(resourceid) && !"1".equals(getPbCheckValue)){
//该人员不符合规则,不生效
}else{
rs.executeUpdate(sql, kqdate,serialid,resourceid,groupid);
}
}
if(delIds.length()>0){
List sqlParams = new ArrayList();
Object[] objects= DBUtil.transListIn(delIds,sqlParams);
@ -413,8 +649,12 @@ public class SaveBatchShiftScheduleCmd extends AbstractCommonCommand<Map<String,
List<Object> delete_params = lsDeleteCancelParams.get(i);
String resourceid = Util.null2String(delete_params.get(0));
String kqdate = Util.null2String(delete_params.get(1));
if(unSavePerson.contains(resourceid) && !"1".equals(getPbCheckValue)){
//该人员不符合规则,不生效
}else{
rs.executeUpdate(sql, resourceid,kqdate);
}
}
//删除之前的排的班次,一天只能有一个班次
sql = " update kq_shiftschedule set isdelete =1 where (isdelete is null or isdelete <> '1') and resourceid = ? and kqdate = ? and groupid != "+groupId;
@ -422,8 +662,12 @@ public class SaveBatchShiftScheduleCmd extends AbstractCommonCommand<Map<String,
List<Object> delete_params = lsDeleteParams.get(i);
String resourceid = Util.null2String(delete_params.get(0));
String kqdate = Util.null2String(delete_params.get(1));
if(unSavePerson.contains(resourceid) && !"1".equals(getPbCheckValue)){
//该人员不符合规则,不生效
}else{
rs.executeUpdate(sql, resourceid,kqdate);
}
}
sql = " update kq_shiftschedule set isdelete =1 where (isdelete is null or isdelete <> '1') and resourceid = ? and kqdate = ? and serialid != ? ";
for (int i = 0; lscheckSerialParams != null && i < lscheckSerialParams.size(); i++) {
@ -431,16 +675,33 @@ public class SaveBatchShiftScheduleCmd extends AbstractCommonCommand<Map<String,
String resourceid = Util.null2String(check_params.get(0));
String kqdate = Util.null2String(check_params.get(1));
String serialid = Util.null2String(check_params.get(2));
if(unSavePerson.contains(resourceid) && !"1".equals(getPbCheckValue)){
//该人员不符合规则,不生效
}else{
rs.executeUpdate(sql, resourceid,kqdate,serialid);
}
sql = "insert into kq_shiftscheduleoperate_log(operatetype,operator,kqgroupname,changeduser,changedshiftdate,changedshiftname,kqshiftid) values(?,?,?,?,?,?,?)";
bRs.executeBatchSqlNew(sql, operateLogParams);
}
new KQShiftScheduleComInfo().removeCache();
//刷新报表数据
new KQFormatBiz().format(lsFormatParams,16);
new KQFormatBiz().format(lsFormatParams);
if(unSavePerson.size()>0 && !"1".equals(getPbCheckValue)){
List<String> personNameList = new ArrayList<>();
for(String personid:unSavePerson){
personNameList.add(resourceComInfo.getLastname(personid));
}
String msg = "";
if("2".equals(getPbCheckValue)){
msg = "做五休二";
}else if("3".equals(getPbCheckValue)){
msg = "做四休二";
}
retmap.put("status", "-1");
retmap.put("message", "【"+StringUtils.join(personNameList,",")+"】上述员工当前月份排班不符合"+msg+"规则或存在未排班日期");
return retmap;
}
retmap.put("status", "1");
retmap.put("message", SystemEnv.getHtmlLabelName(18758, user.getLanguage()));
@ -452,16 +713,69 @@ public class SaveBatchShiftScheduleCmd extends AbstractCommonCommand<Map<String,
return retmap;
}
private void addLog(KqShiftscheduleOperateLog bean) {
operateLogParam = new ArrayList<>();
operateLogParam.add(bean.getOperatetype());
operateLogParam.add(bean.getOperator());
operateLogParam.add(bean.getKqgroupname());
operateLogParam.add(bean.getChangeduser());
operateLogParam.add(bean.getChangedshiftdate());
operateLogParam.add(bean.getChangedshiftname());
operateLogParam.add(bean.getKqshiftid());
operateLogParams.add(operateLogParam);
/**
*
* @param serialid
* @return
*/
private static Boolean checkXxr(String serialid){
RecordSet rs = new RecordSet();
String sql = "select * from kq_ShiftManagement where id = "+serialid+" and is_rest = 1";
rs.execute(sql);
Boolean check = false;
if (rs.getCounts()>0){
check = true;
}
return check;
}
/**
* ()
*
* @param groupId ID
* @param date
* @return 1-2-3--1-
*/
public static int getChangeType(String groupId, String date) {
int changeType = -1;//默认没有设置过节假日(节假日设置的类型1-公众假日、2-调配工作日、3-调配休息日)
KQHolidaySetComInfo kqHolidaySetComInfo = new KQHolidaySetComInfo();
String tmpChangetype = kqHolidaySetComInfo.getChangeType(groupId, date);
if(null != tmpChangetype){
changeType = Util.getIntValue(tmpChangetype, -1);
}
return changeType;
}
/**
*
* @param groupid
* @return
*/
private static String getpbCheckValue(String groupid){
RecordSet rs = new RecordSet();
String sql = "select pbcheck from kq_group where id = "+groupid;
rs.execute(sql);
String pbcheck = "";
if (rs.next()){
pbcheck = Util.null2String(rs.getString("pbcheck"));
}
return pbcheck;
}
public static void main(String[] args) {
String fromDate = TimeUtil.getMonthBeginDay("2025-04-07");
String toDate = TimeUtil.getMonthEndDay("2025-04-07");
List<String> lsDate = new ArrayList<>();
Calendar cal = DateUtil.getCalendar();
boolean isEnd = false;
for(String date=toDate; !isEnd;) {
if(date.equals(fromDate)) isEnd = true;
lsDate.add(date);
cal.setTime(DateUtil.parseToDate(date));
date = DateUtil.getDate(cal.getTime(), -1);
}
System.out.println(lsDate);
}
@Override

@ -0,0 +1,59 @@
package com.engine.xmgsecond.entity;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @Author liang.cheng
* @Date 2025/5/14 16:11
* @Description:
* @Version 1.0
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class KqFormatTotal {
private Integer resourceId;
private Integer absenteeism;
private Integer forgotCheck;
private Integer beLateMins;
private Integer gravebeLateMins;
private Integer leaveEearly;
private Integer graveLeaveEarly;
/**
*
*/
private boolean isAbsence;
/**
*
*/
private double absenceDays;
@Override
public String toString() {
return "KqFormatTotal{" +
"resourceId=" + resourceId +
", absenteeism=" + absenteeism +
", forgotCheck=" + forgotCheck +
", beLateMins=" + beLateMins +
", gravebeLateMins=" + gravebeLateMins +
", leaveEearly=" + leaveEearly +
", graveLeaveEarly=" + graveLeaveEarly +
", isAbsence=" + isAbsence +
", absenceDays=" + absenceDays +
'}';
}
}

@ -0,0 +1,98 @@
package com.engine.xmgsecond.util;
import com.engine.xmgsecond.entity.KqFormatTotal;
import weaver.conn.RecordSet;
import weaver.general.BaseBean;
import weaver.general.Util;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.atomic.AtomicInteger;
/**
* @Author liang.cheng
* @Date 2025/5/14 16:16
* @Description:
* @Version 1.0
*/
public class KqCalulateUtil {
/**
* @Description:
* @Author: liang.cheng
* @Date: 2025/5/14 16:22
* @param: [resourceId, fromDate, toDate]
* @return: java.util.List<com.engine.xmgsecond.entity.KqFormatTotal>
*/
public static List<KqFormatTotal> abnormalAttendance(String resourceId,String fromDate,String toDate) {
RecordSet rs = new RecordSet();
List<KqFormatTotal> kqFormatTotalList = new ArrayList<>();
rs.executeQuery("select resourceid, forgotCheck, absenteeism, beLateMins, gravebeLateMins, leaveEearly, " +
" graveLeaveEarly from kq_format_total where resourceid = ? and kqdate >= '"+fromDate+"' and kqdate <= '"+toDate+"'",resourceId);
while (rs.next()) {
boolean isAbsence;
int absenteeism = Util.getIntValue(rs.getString("absenteeism"));
int forgotCheck = Util.getIntValue(rs.getString("forgotCheck"));
int beLateMins = Util.getIntValue(rs.getString("beLateMins"),0);
int gravebeLateMins = Util.getIntValue(rs.getString("gravebeLateMins"),0);
int leaveEearly = Util.getIntValue(rs.getString("leaveEearly"));
int graveLeaveEarly = Util.getIntValue(rs.getString("graveLeaveEarly"));
//规则1
isAbsence = isPositive(absenteeism) ||
isPositive(forgotCheck) ||
sumPositive(leaveEearly, graveLeaveEarly) > 0;
kqFormatTotalList.add(KqFormatTotal.builder()
.resourceId(Util.getIntValue(rs.getString("resourceid")))
.beLateMins(beLateMins)
.gravebeLateMins(gravebeLateMins)
.isAbsence(isAbsence)
.absenceDays(isAbsence ? 1 : 0)
.build());
}
//规则2
AtomicInteger graceCounter = new AtomicInteger(0);
kqFormatTotalList.forEach(record -> {
if (!record.isAbsence()) {
int lateMinutes = sumNullSafe(record.getBeLateMins(), record.getGravebeLateMins());
record.setAbsenceDays(calculateAbsenceDays(lateMinutes, graceCounter));
}
});
rs.writeLog("kqFormatTotalList2:"+kqFormatTotalList.toString());
return kqFormatTotalList;
}
public static boolean isPositive(Integer num) {
return Optional.ofNullable(num).orElse(0) > 0;
}
// 辅助方法:安全求和(处理 null 情况)
public static int sumPositive(Integer a, Integer b) {
return Optional.ofNullable(a).orElse(0) + Optional.ofNullable(b).orElse(0);
}
private static double calculateAbsenceDays(int lateMinutes, AtomicInteger graceCounter) {
if (lateMinutes <= 0) {
return 0;
}
if (graceCounter.get() < 3 && lateMinutes > 0 && lateMinutes <= 15) {
graceCounter.incrementAndGet();
return 0;
}
return (lateMinutes > 0 && lateMinutes <= 240) ? 0.5 : 1;
}
private static int sumNullSafe(Integer a, Integer b) {
return Optional.ofNullable(a).orElse(0) + Optional.ofNullable(b).orElse(0);
}
}
Loading…
Cancel
Save