考勤分析

zm_dev
liuliang 2 years ago
parent 0290e1f04f
commit 33341430f6

@ -0,0 +1,8 @@
2023-10-24 00:28:21,221 [main] [com.engine.attendance.attendanceanalysis.cmd.AbsenteeismCmd] [INFO] - absenteeismCmd attendanceItems : [[{zdhsl=180, xmlx=2, zysd=1, zxhsl=60}, {zdhsl=180, xmlx=2, zysd=1, zxhsl=60}, {zdhsl=60, xmlx=1, zysd=1, zxhsl=0}]]
2023-10-24 00:29:46,847 [main] [com.engine.attendance.attendanceanalysis.cmd.AbsenteeismCmd] [INFO] - absenteeismCmd attendanceItems : [[{zdhsl=180, xmlx=1, zysd=1, zxhsl=60}, {zdhsl=180, xmlx=2, zysd=1, zxhsl=60}, {zdhsl=60, xmlx=2, zysd=1, zxhsl=0}]]
2023-10-24 00:33:14,365 [main] [com.engine.attendance.attendanceanalysis.cmd.AbsenteeismCmd] [INFO] - absenteeismCmd attendanceItems : [[{zdhsl=180, xmlx=2, zysd=1, zxhsl=60}]]
2023-10-24 00:33:33,275 [main] [com.engine.attendance.attendanceanalysis.cmd.AbsenteeismCmd] [INFO] - absenteeismCmd attendanceItems : [[{zdhsl=60, xmlx=2, zysd=1, zxhsl=0}]]
2023-10-26 17:08:22,114 [main] [com.engine.attendance.attendanceanalysis.cmd.AbsenteeismCmd] [INFO] - absenteeismCmd attendanceItems : [[{zdhsl=60, xmlx=2, zysd=1, zxhsl=0}]]
2023-10-26 17:09:45,677 [main] [com.engine.attendance.attendanceanalysis.cmd.AbsenteeismCmd] [INFO] - absenteeismCmd attendanceItems : [[{zdhsl=60, xmlx=2, zysd=1, zxhsl=0}]]
2023-10-26 17:10:16,663 [main] [com.engine.attendance.attendanceanalysis.cmd.AbsenteeismCmd] [INFO] - absenteeismCmd attendanceItems : [[{zdhsl=60, xmlx=2, zysd=1, zxhsl=0}]]
2023-10-27 16:45:00,661 [main] [com.engine.attendance.attendanceanalysis.cmd.AbsenteeismCmd] [INFO] - absenteeismCmd attendanceItems : [[{zdhsl=60, xmlx=2, zysd=1, zxhsl=0}]]

@ -1,4 +1,4 @@
package com.api.attendance.attendancePlan.web; package com.api.attendance.attendancePlan;
import com.engine.attendance.attendanceplan.web.AttendancePlanAction; import com.engine.attendance.attendanceplan.web.AttendancePlanAction;

@ -1,4 +1,4 @@
package com.api.attendance.persongroup.web; package com.api.attendance.persongroup;
import com.engine.attendance.component.persongroup.web.PersonGroupAction; import com.engine.attendance.component.persongroup.web.PersonGroupAction;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;

@ -1,4 +1,4 @@
package com.api.attendance.persongroup.web; package com.api.attendance.persongroup;
import com.engine.attendance.component.persongroup.web.SchedulingResultsAction; import com.engine.attendance.component.persongroup.web.SchedulingResultsAction;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;

@ -1,23 +1,27 @@
package com.engine.attendance.attendanceanalysis.cmd; package com.engine.attendance.attendanceanalysis.cmd;
import com.engine.attendance.enums.AttendanceItemTypeEnum;
import com.engine.common.biz.AbstractCommonCommand; import com.engine.common.biz.AbstractCommonCommand;
import com.engine.common.entity.BizLogContext; import com.engine.common.entity.BizLogContext;
import com.engine.core.interceptor.CommandContext; import com.engine.core.interceptor.CommandContext;
import lombok.extern.slf4j.Slf4j;
import weaver.general.Util; import weaver.general.Util;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
* *
*/ */
public class absenteeismCmd extends AbstractCommonCommand<Map<String,Object>> { @Slf4j
public class AbsenteeismCmd extends AbstractCommonCommand<Map<String,Object>> {
@Override @Override
public BizLogContext getLogContext() { public BizLogContext getLogContext() {
return null; return null;
} }
public absenteeismCmd(Map<String,Object> params){ public AbsenteeismCmd(Map<String,Object> params){
this.params=params; this.params=params;
} }
@ -25,31 +29,29 @@ public class absenteeismCmd extends AbstractCommonCommand<Map<String,Object>> {
public Map<String, Object> execute(CommandContext commandContext) { public Map<String, Object> execute(CommandContext commandContext) {
//作用时段 //作用时段
String workfor = Util.null2String(params.get("workfor")); String workfor = Util.null2String(params.get("workfor"));
String time = Util.null2String(params.get("time")); int time = Util.null2String(params.get("time")).equals("")? 0:Util.getIntValue(Util.null2String(params.get("time")));
String userId = Util.null2String(params.get("userId")); Map<String, Object> resultMap = new HashMap<>();
String itemType = Util.null2String(params.get("itemType"));
List<Map<String,Object>> attendanceItems = (List<Map<String,Object>>)params.get("attendanceItems"); List<Map<String,Object>> attendanceItems = (List<Map<String,Object>>)params.get("attendanceItems");
attendanceItems.stream().filter(e -> { attendanceItems = attendanceItems.stream().filter(e -> {
//项目类型 //项目类型
String xmlx = Util.null2String(e.get("xmlx")); String xmlx = Util.null2String(e.get("xmlx"));
//作用时段 //作用时段
String zysd = Util.null2String(e.get("zysd")); String zysd = Util.null2String(e.get("zysd"));
//最小核算分钟数(不包含) //最小核算分钟数(不包含)
String zxhsl = Util.null2String(e.get("zxhsl")); int zxhsl = Util.null2String(e.get("zxhsl")).equals("")?0:Util.getIntValue(Util.null2String(e.get("zxhsl")));
//最大核算分钟数(包含) //最大核算分钟数(包含)
String zdhsl = Util.null2String(e.get("zdhsl")); int zdhsl = Util.null2String(e.get("zdhsl")).equals("")?0:Util.getIntValue(Util.null2String(e.get("zdhsl")));
if( .equals(xmlx) && workfor.equals(zysd)){
if(AttendanceItemTypeEnum.ABSENTEESIM.getKey().equals(xmlx) && workfor.equals(zysd) && time > zxhsl && time<=zdhsl) {
return true;
} }
return false; return false;
}).collect(Collectors.toList()); }).collect(Collectors.toList());
log.info("absenteeismCmd attendanceItems : [{}]",attendanceItems);
resultMap.put("attendanceItems",attendanceItems);
return null; return resultMap;
} }
} }

@ -0,0 +1,145 @@
package com.engine.attendance.attendanceanalysis.cmd;
import com.engine.attendance.enums.ClassSegmentTypeEnum;
import com.engine.common.biz.AbstractCommonCommand;
import com.engine.common.entity.BizLogContext;
import com.engine.common.util.DateUtil;
import com.engine.core.interceptor.CommandContext;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import weaver.general.Util;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class GetClockInTimeCmd extends AbstractCommonCommand<Map<String,Object>> {
public GetClockInTimeCmd(Map<String, Object> params){
this.params=params;
}
@Override
public BizLogContext getLogContext() {
return null;
}
@Override
public Map<String, Object> execute(CommandContext commandContext) {
//打卡日期
String needGetDate = Util.null2String(params.get("date"));
//打卡数据
Map<String, List<Map<String,Object>>> clockInTimeCollect = (Map<String, List<Map<String,Object>>>)params.get("clockInTimeCollect");
//班次数据
Map<String, List<Map<String,Object>>> schedulingResultCollect = (Map<String, List<Map<String,Object>>>)params.get("schedulingResultCollect");
Map<String, Object> resultMap = Maps.newHashMap();
List<Map<String, Object>> resultList = Lists.newArrayList();
//当天打卡日期集合
List<Map<String,Object>> needGetDateList = clockInTimeCollect.get(needGetDate);
//当天班次
List<Map<String,Object>> needGetDateScheduling = schedulingResultCollect.get(needGetDate);
//前一天的打卡集合
List<Map<String,Object>> beforeNeedGetDateList = clockInTimeCollect.get(DateUtil.beforeDay(needGetDate,1));
//前一天班次
List<Map<String,Object>> beforeNeedGetDateScheduling = schedulingResultCollect.get(DateUtil.beforeDay(needGetDate,1));
//后一天的打卡集合
List<Map<String,Object>> afterNeedGetDateList = clockInTimeCollect.get(DateUtil.AfterDay(needGetDate,1));
//后一天班次
List<Map<String,Object>> afterNeedGetDateScheduling = schedulingResultCollect.get(DateUtil.AfterDay(needGetDate,1));
if (needGetDateList == null || needGetDateScheduling== null){
return resultMap;
}else if (beforeNeedGetDateList == null && afterNeedGetDateList == null){
resultList = needGetDateList;
}else if (beforeNeedGetDateList != null && afterNeedGetDateList == null){//前一天有打卡数据,后一天没有打卡数据
if (beforeNeedGetDateScheduling == null){
resultMap.put("resultList",needGetDateList);
return resultMap;
}
//前一天是否跨天 1:跨天
String beforesfkt = Util.null2String(beforeNeedGetDateScheduling.get(0).get("sfkt"));
//当天是否跨天 1跨天
String nowsfkt = Util.null2String(beforeNeedGetDateScheduling.get(0).get("sfkt"));
if (!"1".equals(beforesfkt) && !"1".equals(nowsfkt)){
resultList = needGetDateList;
}else if ("1".equals(beforesfkt) && !"1".equals(nowsfkt)){
//前一天跨天,当天没有跨天
}else if (!"1".equals(beforesfkt) && "1".equals(nowsfkt)){
//前一天没有跨天,当天跨天
}else if ("1".equals(beforesfkt) && "1".equals(nowsfkt)){
//前一天跨天,当天也跨天
}
}else if (beforeNeedGetDateList == null && afterNeedGetDateList != null){ //前一天没有打卡数据,后一天有打卡数据
if (afterNeedGetDateList == null){
resultMap.put("resultList",needGetDateList);
return resultMap;
}
}else if (beforeNeedGetDateList !=null && afterNeedGetDateList != null){
//前后一天都有打卡数据
}
resultMap.put("resultList",resultList);
return resultMap;
}
/**
*
* @param beforeNeedGetDateScheduling
* @param beforeNeedGetDateList
* @param needGetDateScheduling
* @param needGetDateList
* @return
*/
public List<Map<String,Object>> computeStartTime(List<Map<String,Object>> beforeNeedGetDateScheduling,List<Map<String,Object>> beforeNeedGetDateList,
List<Map<String,Object>> needGetDateScheduling,List<Map<String,Object>> needGetDateList){
//前一天是否跨天 1:跨天
String beforesfkt = Util.null2String(beforeNeedGetDateScheduling.get(0).get("sfkt"));
//当天是否跨天 1跨天
String nowsfkt = Util.null2String(needGetDateScheduling.get(0).get("sfkt"));
if (!"1".equals(beforesfkt) && !"1".equals(nowsfkt)){
return needGetDateList;
}else if ("1".equals(beforesfkt) && !"1".equals(nowsfkt)){
//前一天跨天,当天没有跨天
beforeNeedGetDateScheduling = beforeNeedGetDateScheduling.stream().filter(e -> {
if (ClassSegmentTypeEnum.WORK_TIME.getKey().equals(e.get("bdlx")) ||
ClassSegmentTypeEnum.EARLY_OVERTIME.getKey().equals(e.get("bdlx")) || ClassSegmentTypeEnum.EXTENDED_OVERTIME.getKey().equals(e.get("bdlx"))){
return true;
}else {
return false;
}
}).collect(Collectors.toList());
Map<String,Object> lastDataMap = beforeNeedGetDateScheduling.get(beforeNeedGetDateScheduling.size()-1);
}else if (!"1".equals(beforesfkt) && "1".equals(nowsfkt)){
//前一天没有跨天,当天跨天
}else if ("1".equals(beforesfkt) && "1".equals(nowsfkt)){
//前一天跨天,当天也跨天
}
return null;
}
/**
*
* @return
*/
public List<Map<String,Object>> computeEndTime(List<Map<String,Object>> beforeNeedGetDateScheduling,List<Map<String,Object>> beforeNeedGetDateList,
List<Map<String,Object>> needGetDateScheduling,List<Map<String,Object>> needGetDateList){
return null;
}
}

@ -0,0 +1,91 @@
package com.engine.attendance.attendanceanalysis.cmd;
import com.engine.attendance.enums.SystemItemEnum;
import com.engine.common.biz.AbstractCommonCommand;
import com.engine.common.entity.BizLogContext;
import com.engine.common.util.DbTools;
import com.engine.core.interceptor.CommandContext;
import com.google.common.collect.Maps;
import weaver.conn.RecordSet;
import weaver.general.Util;
import java.util.List;
import java.util.Map;
/**
*
*/
public class UpdateAttendanceResultsCmd extends AbstractCommonCommand<Map<String,Object>> {
@Override
public BizLogContext getLogContext() {
return null;
}
public UpdateAttendanceResultsCmd(Map<String,Object> params){
this.params=params;
}
@Override
public Map<String, Object> execute(CommandContext commandContext) {
String userId = Util.null2String(params.get("userId"));
String date = Util.null2String(params.get("date"));
//项目
String item = Util.null2String(params.get("item"));
//项目时长
String itemduration = Util.null2String(params.get("itemduration"));
Map<String,Object> resultMap = Maps.newHashMap();
RecordSet rs = new RecordSet();
//班次信息
if (params.get("classInfo") == null){
//当天没有排班,计入异常
noScheduling(params,rs);
return resultMap;
}
List<Map<String,Object>> classInfo = (List<Map<String,Object>>)params.get("classInfo");
String sql = "select ygid,rq,bc,xm1,xm2,xm3,xm4,xm5,xm6,xm7,xm8,j1,c1,j2,c2,j3,c3,j4,c4,j5,c5,j6,c6,j7,c7,j8,c8 from uf_jcl_kq_cqjg where ygid=? and rq=?";
List<Map<String,Object>> dataList = DbTools.getSqlToList(sql,userId,date);
if (dataList.size() >0){
//有出勤结果
int index = 0;
int i = 0;
while (index==0){
i++;
if (dataList.get(0).get("xm"+i) != null || !"".equals(dataList.get(0).get("xm"+i))){
index = i;
}
}
sql = "update uf_jcl_kq_cqjg set xm"+index+"=?,sc"+index+"=? where ygid=? and rq=?";
DbTools.update(rs,sql,item,itemduration,userId,date);
}else {
//没有出勤结果
sql = "select subcompanyid1,departmentid,jobtitle from hrmresource where id=?";
List<Map<String,Object>> userList = DbTools.getSqlToList(sql,userId);
sql = "insert into uf_jcl_kq_cqjg (szjg,ygid,fbid,bm,zw,rq,bc,bcbdxx,cqzt,cqsc,xm1,sc1) values (?,?,?,?,?,?,?,?,?,?,?,?)";
DbTools.update(rs,sql,userList.get(0).get("subcompanyid1"),userId,userList.get(0).get("subcompanyid1"),userList.get(0).get("departmentid"),
userList.get(0).get("jobtitle"),date,classInfo.get(0).get("bcxx"),classInfo.get(0).get("bcsdxx"),1,0,item,itemduration);
}
return resultMap;
}
/**
*
* @param params
*/
public void noScheduling(Map<String,Object> params, RecordSet rs){
String userId = Util.null2String(params.get("userId"));
String date = Util.null2String(params.get("date"));
String sql = "select subcompanyid1,departmentid,jobtitle from hrmresource where id=?";
List<Map<String,Object>> userList = DbTools.getSqlToList(sql,userId);
sql = "insert into uf_jcl_kq_cqjg (szjg,ygid,fbid,bm,zw,rq,xm1,cqzt) values (?,?,?,?,?,?,?,?)";
DbTools.update(rs,sql,userList.get(0).get("subcompanyid1"),userId,userList.get(0).get("subcompanyid1"),
userList.get(0).get("departmentid"),userList.get(0).get("jobtitle"),date, SystemItemEnum.NO_SCHEDULING.getKey(),1);
}
}

@ -32,7 +32,7 @@ public class AttendanceAnalysisJob extends BaseCronJob {
Map<String, List<Map<String,Object>>> collect = dataList.stream().collect(Collectors.groupingBy(e -> Util.null2String(e.get("userid")))); Map<String, List<Map<String,Object>>> collect = dataList.stream().collect(Collectors.groupingBy(e -> Util.null2String(e.get("userid"))));
collect.entrySet().forEach(e -> { collect.entrySet().forEach(e -> {
attendanceAnalysisService.attendanceAnalysis(e.getKey(),e.getValue());
}); });
log.info("********AttendanceAnalysisJob end********"); log.info("********AttendanceAnalysisJob end********");
} }

@ -0,0 +1,15 @@
package com.engine.attendance.attendanceanalysis.service;
import java.util.Map;
/**
* service
*/
public interface BeLateService {
/**
*
* @param params
* @return
*/
Map<String,Object> fullDayAbsenteeism(Map<String,Object> params);
}

@ -0,0 +1,16 @@
package com.engine.attendance.attendanceanalysis.service;
import java.util.List;
import java.util.Map;
/**
* service
*/
public interface ForgetClockInService {
/**
*
* @param params
* @return
*/
Map<String, Object> ForgetClockInAllDays(Map<String,Object> params);
}

@ -0,0 +1,23 @@
package com.engine.attendance.attendanceanalysis.service;
import java.util.List;
import java.util.Map;
/**
* service
*/
public interface UtilService {
/**
*
* @param params
* @return
*/
Map<String, List<Map<String,Object>>> getSchedulingInFormation(Map<String,Object> params);
/**
*
* @param params
* @return
*/
List<Map<String,Object>> getClockInTime(Map<String,Object> params);
}

@ -0,0 +1,15 @@
package com.engine.attendance.attendanceanalysis.service.impl;
import com.engine.attendance.attendanceanalysis.service.BeLateService;
import com.engine.core.impl.Service;
import java.util.Map;
public class BeLateServiceImpl extends Service implements BeLateService {
@Override
public Map<String, Object> fullDayAbsenteeism(Map<String, Object> params) {
return null;
}
}

@ -0,0 +1,19 @@
package com.engine.attendance.attendanceanalysis.service.impl;
import com.engine.attendance.attendanceanalysis.cmd.UpdateAttendanceResultsCmd;
import com.engine.attendance.attendanceanalysis.service.ForgetClockInService;
import com.engine.attendance.enums.SystemItemEnum;
import com.engine.core.impl.Service;
import java.util.Map;
public class ForgetClockInServiceImpl extends Service implements ForgetClockInService {
@Override
public Map<String, Object> ForgetClockInAllDays(Map<String, Object> params) {
params.put("item", SystemItemEnum.MISSING_CLOCK_IN);
params.put("itemduration", 1);
Map<String,Object> result = commandExecutor.execute(new UpdateAttendanceResultsCmd(params));
return result;
}
}

@ -0,0 +1,56 @@
package com.engine.attendance.attendanceanalysis.service.impl;
import com.engine.attendance.attendanceanalysis.cmd.GetClockInTimeCmd;
import com.engine.attendance.attendanceanalysis.cmd.UpdateAttendanceResultsCmd;
import com.engine.attendance.attendanceanalysis.service.UtilService;
import com.engine.attendance.component.persongroup.service.SchedulingResultsService;
import com.engine.attendance.component.persongroup.service.impl.SchedulingResultsServiceImpl;
import com.engine.common.util.DateUtil;
import com.engine.common.util.DbTools;
import com.engine.common.util.ServiceUtil;
import com.engine.core.impl.Service;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import lombok.extern.slf4j.Slf4j;
import weaver.general.Util;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Slf4j
public class UtilServiceImpl extends Service implements UtilService {
private SchedulingResultsService schedulingResultsService = ServiceUtil.getService(SchedulingResultsServiceImpl.class);
@Override
public Map<String, List<Map<String,Object>>> getSchedulingInFormation(Map<String, Object> params) {
Map<String,Object> schedulingResultsMap = schedulingResultsService.queryDataTable(params);
List<Map<String,Object>> schedulingResultsList = (List<Map<String,Object>>)schedulingResultsMap.get("data");
Map<String,String> schedulingMap = schedulingResultsList.stream().collect(Collectors.toMap(e-> Util.null2String(e.get("bcxx")), e->Util.null2String(e.get("bcrq"))));
String sql = "select a.id bcxx,a.bcsdxx,a.sfkt,b.bdlx,b.kssj dtkssj,b.jssj dtjssj,b.ksdk,b.jsdk,b.tqdkfzs,b.thdkfzs from uf_jcl_kq_bcxx a left join uf_jcl_kq_bcxx_dt1 b on a.id=b.mainid where a.id in (";
String bcxxIds = "";
for (Map.Entry<String,String> entry :schedulingMap.entrySet()){
bcxxIds +=entry.getKey() +",";
}
bcxxIds = bcxxIds.substring(0,bcxxIds.length()-1);
sql = sql +bcxxIds+") order by b.kssj";
List<Map<String,Object>> dataList = DbTools.getSqlToList(sql);
Map<String,List<Map<String,Object>>> dataMap = dataList.stream().collect(Collectors.groupingBy(e->Util.null2String(e.get("bcxx"))));
Map<String,List<Map<String,Object>>> resultMap = Maps.newHashMap();
dataMap.entrySet().forEach(e -> {
resultMap.put(schedulingMap.get(e.getKey()),e.getValue());
});
log.info("SchedulingResults : [{}]",resultMap);
return resultMap;
}
@Override
public List<Map<String, Object>> getClockInTime(Map<String, Object> params) {
Map<String,Object> result = commandExecutor.execute(new GetClockInTimeCmd(params));
List<Map<String, Object>> resultList = (List<Map<String, Object>>)result.get("resultList");
return resultList;
}
}

@ -1,10 +1,21 @@
package com.engine.attendance.attendanceanalysis.wrapper; package com.engine.attendance.attendanceanalysis.wrapper;
import com.engine.attendance.attendanceanalysis.service.BeLateService;
import com.engine.attendance.attendanceanalysis.service.ForgetClockInService;
import com.engine.attendance.attendanceanalysis.service.UtilService;
import com.engine.attendance.attendanceanalysis.service.impl.BeLateServiceImpl;
import com.engine.attendance.attendanceanalysis.service.impl.ForgetClockInServiceImpl;
import com.engine.attendance.attendanceanalysis.service.impl.UtilServiceImpl;
import com.engine.attendance.attendanceplan.service.AttendancePlanService; import com.engine.attendance.attendanceplan.service.AttendancePlanService;
import com.engine.attendance.attendanceplan.service.impl.AttendancePlanServiceImpl; import com.engine.attendance.attendanceplan.service.impl.AttendancePlanServiceImpl;
import com.engine.attendance.component.persongroup.service.SchedulingResultsService;
import com.engine.attendance.component.persongroup.service.impl.SchedulingResultsServiceImpl;
import com.engine.attendance.enums.WorkForTimeEnum;
import com.engine.common.util.DateUtil; import com.engine.common.util.DateUtil;
import com.engine.common.util.DbTools;
import com.engine.common.util.ServiceUtil; import com.engine.common.util.ServiceUtil;
import com.engine.core.impl.Service; import com.engine.core.impl.Service;
import com.google.common.collect.Maps;
import weaver.general.Util; import weaver.general.Util;
import java.util.HashMap; import java.util.HashMap;
@ -18,15 +29,18 @@ import java.util.stream.Collectors;
public class AttendanceAnalysisWrapper extends Service { public class AttendanceAnalysisWrapper extends Service {
private AttendancePlanService basicsetService = ServiceUtil.getService(AttendancePlanServiceImpl.class); private AttendancePlanService basicsetService = ServiceUtil.getService(AttendancePlanServiceImpl.class);
private BeLateService beLateService = ServiceUtil.getService(BeLateServiceImpl.class);
private UtilService utilService = ServiceUtil.getService(UtilServiceImpl.class);
private ForgetClockInService forgetClockInService = ServiceUtil.getService(ForgetClockInServiceImpl.class);
public void attendanceAnalysis(String userId, List<Map<String,Object>> dataList){ public void attendanceAnalysis(String userId, List<Map<String,Object>> dataList){
String beforeThreeDayDate = DateUtil.getCurrentDateMinusDay(3); String beforeThreeDayDate = DateUtil.getCurrentDateMinusDay(3);
String beforeTwoDayDate = DateUtil.getCurrentDateMinusDay(1); String beforeTwoDayDate = DateUtil.getCurrentDateMinusDay(2);
String beforeOneDayDate = DateUtil.getCurrentDateMinusDay(1); String beforeOneDayDate = DateUtil.getCurrentDateMinusDay(1);
Map<String, List<Map<String,Object>>> collect = dataList.stream().collect(Collectors.groupingBy(e -> Util.null2String(e.get("signdate")))); Map<String, List<Map<String,Object>>> collect = dataList.stream().collect(Collectors.groupingBy(e -> Util.null2String(e.get("signdate"))));
/**获得人员考勤项目*/ /**获得人员考勤项目*/
Map<String,Object> paramMap = new HashMap<>(); Map<String,Object> paramMap = Maps.newHashMap();
paramMap.put("startDate",""); paramMap.put("startDate","");
paramMap.put("endDate",""); paramMap.put("endDate","");
paramMap.put("resourceId","85"); paramMap.put("resourceId","85");
@ -34,39 +48,56 @@ public class AttendanceAnalysisWrapper extends Service {
Map<String,Object> dataMap = basicsetService.getAttendanceItemsByPerson(paramMap); Map<String,Object> dataMap = basicsetService.getAttendanceItemsByPerson(paramMap);
List<Map<String,Object>> attendanceItems = (List<Map<String,Object>>)dataMap.get("data"); List<Map<String,Object>> attendanceItems = (List<Map<String,Object>>)dataMap.get("data");
/** 获取人员班次*/
Map<String,Object> classesParamMap = Maps.newHashMap();
classesParamMap.put("tableName","uf_pbjg");
classesParamMap.put("startDate",beforeThreeDayDate);
classesParamMap.put("endDate",beforeOneDayDate);
classesParamMap.put("pblx","0");
classesParamMap.put("pbdx",userId);
classesParamMap.put("current","1");
classesParamMap.put("pageSize",1);
classesParamMap.put("recurrence",1);
Map<String,List<Map<String,Object>>> schedulingResultsMap = utilService.getSchedulingInFormation(paramMap);
/**获得人员加班计划*/
String sql = "select jbry,ksrq,kssj,jsrq,jssj,jbsc, from uf_jcl_kq_jbjh_dt1 where jbry=? and ksrq>=? and ksrq<=? and jbcx=1";
Map<String,List<Map<String,Object>>> overtimePlanMap = DbTools.getSqlToList(sql,userId,beforeOneDayDate,beforeThreeDayDate).stream().collect(Collectors.groupingBy(e -> Util.null2String(e.get("ksrq"))));
Map<String,Object> forgetClockInParam = Maps.newHashMap();
forgetClockInParam.put("classInfo",schedulingResultsMap.get(beforeOneDayDate));
forgetClockInParam.put("userId",schedulingResultsMap.get(beforeOneDayDate));
/**计算获取前一天和第二天打卡数据*/
if (collect.size() == 0){ if (collect.size() == 0){
//没有打卡数据,前一天记为全天旷工 //没有打卡数据,漏打卡
forgetClockInParam.put("date",beforeOneDayDate);
forgetClockInService.ForgetClockInAllDays(forgetClockInParam);
}else if (collect.size() == 1){ }else if (collect.size() == 1){
//有1天有打卡数据 //有1天有打卡数据
if (collect.get(beforeOneDayDate) != null){ if (collect.get(beforeOneDayDate) != null){
//打卡数据为前一天 //前一天有打卡记录
}else { }else {
//否则前一天记为全天旷工 //否则前一天记为漏打卡
} }
}else if (collect.size() == 2){ }else if (collect.size() == 2){
//有2天有打卡数据 //有2天有打卡数据
//计算前一天考勤 if (collect.get(beforeOneDayDate) == null){
if (collect.get(beforeOneDayDate) != null){ //前一天漏打卡
//打卡数据为前一天
}else { }else if(collect.get(beforeOneDayDate) != null && collect.get(beforeTwoDayDate) == null){
//否则前一天记为全天旷工 //前一天有打卡记录,第二天没有打卡记录
}
//计算第二天数据 }else if (collect.get(beforeTwoDayDate) != null && collect.get(beforeOneDayDate) != null){
if (collect.get(beforeTwoDayDate) != null && collect.get(beforeOneDayDate) != null){ //前一天有打卡,第二天有打卡记录
} }

@ -69,12 +69,13 @@ public class GetDatatableRecurrenceCmd extends AbstractCommonCommand<Map<String,
String queryryfz = "select a.mainid,a.empid,a.filters,a.bdate,a.edate from uf_ryqz_dt1 a,(select pbdxryfz from uf_pbjg where dxlx=1 group by pbdxryfz) b where a.mainid =b.pbdxryfz and a.bdate <= '"+currentTime+"'"; String queryryfz = "select a.mainid,a.empid,a.filters,a.bdate,a.edate from uf_ryqz_dt1 a,(select pbdxryfz from uf_pbjg where dxlx=1 group by pbdxryfz) b where a.mainid =b.pbdxryfz and a.bdate <= '"+currentTime+"'";
List<Map<String,Object>> personGroupData = DbTools.getSqlToList(queryryfz); List<Map<String,Object>> personGroupData = DbTools.getSqlToList(queryryfz);
Set<String> personnelGroupIds = PersongroupCommonUtil.getPersonnelGroupingByPerson(personGroupData,pbdx,null,null); Set<String> personnelGroupIds = PersongroupCommonUtil.getPersonnelGroupingByPerson(personGroupData,pbdx,null,null);
querySqlbyPbdx = sql +conditions + " and pbdxryfz in (?)"; querySqlbyPbdx = sql +conditions + " and pbdxryfz in (";
log.info("递归查询人员-人员分组节点sql:{},personnelGroupIds:{}",querySqlbyPbdx,personnelGroupIds); log.info("递归查询人员-人员分组节点sql:{},personnelGroupIds:{}",querySqlbyPbdx,personnelGroupIds);
if(personnelGroupIds.size() > 0){ if(personnelGroupIds.size() > 0){
param.clear(); param.clear();
param.addAll(Dateparam); param.addAll(Dateparam);
param.add(String.join(",",personnelGroupIds)); querySqlbyPbdx = querySqlbyPbdx + String.join(",",personnelGroupIds)+")";
log.info("递归查询人员-人员分组节点sql:{}",querySqlbyPbdx);
dataList = DbTools.getSqlToList(querySqlbyPbdx,param.toArray()); dataList = DbTools.getSqlToList(querySqlbyPbdx,param.toArray());
} }
if (dataList.size() == 0){ if (dataList.size() == 0){
@ -85,11 +86,12 @@ public class GetDatatableRecurrenceCmd extends AbstractCommonCommand<Map<String,
pdeptids = new DepartmentComInfo().getAllParentDepartId(Util.null2String(dataMap.get("departmentid")), pdeptids); pdeptids = new DepartmentComInfo().getAllParentDepartId(Util.null2String(dataMap.get("departmentid")), pdeptids);
pdeptids = Util.null2String(dataMap.get("departmentid")) + pdeptids; pdeptids = Util.null2String(dataMap.get("departmentid")) + pdeptids;
log.info("pdeptids : [{}]",pdeptids); log.info("pdeptids : [{}]",pdeptids);
querySqlbyPbdx = sql + conditions + " and pbdxbm in (?)"; querySqlbyPbdx = sql + conditions + " and pbdxbm in (";
log.info("递归查询人员-部门节点sql:{},pdeptids:{}",querySqlbyPbdx,pdeptids); log.info("递归查询人员-部门节点sql:{},pdeptids:{}",querySqlbyPbdx,pdeptids);
param.clear(); param.clear();
param.addAll(Dateparam); param.addAll(Dateparam);
param.add(pdeptids); // param.add(pdeptids);
querySqlbyPbdx = querySqlbyPbdx + pdeptids+")";
dataList = DbTools.getSqlToList(querySqlbyPbdx,param.toArray()); dataList = DbTools.getSqlToList(querySqlbyPbdx,param.toArray());
if (dataList.size() == 0){ if (dataList.size() == 0){
//查询人员分部 //查询人员分部
@ -99,7 +101,6 @@ public class GetDatatableRecurrenceCmd extends AbstractCommonCommand<Map<String,
param.addAll(Dateparam); param.addAll(Dateparam);
param.add(dataMap.get("subcompanyid1")); param.add(dataMap.get("subcompanyid1"));
dataList = DbTools.getSqlToList(querySqlbyPbdx,param.toArray()); dataList = DbTools.getSqlToList(querySqlbyPbdx,param.toArray());
} }
} }
} }

@ -2,15 +2,21 @@ package com.engine.attendance.enums;
import com.finance.toolkit.BaseEnum; import com.finance.toolkit.BaseEnum;
public enum AttendanceItemType implements BaseEnum { public enum AttendanceItemTypeEnum implements BaseEnum {
LATE("0","迟到"), LATE("0","迟到"),
LEAVE_EARLY("1","早退"), LEAVE_EARLY("1","早退"),
ABSENTEESIM("2","旷工"),; ABSENTEESIM("2","旷工"),
HOLIDAY("3","假期"),
WORK_OVERTIME("4","加班"),
EVECTION("5","出差"),
PUNCH_IN_AGAIN("6","补打卡"),
ALLOWANCE("7","津贴"),
OTHER("8","其他");
private String key; private String key;
private String value; private String value;
AttendanceItemType(String key,String value){ AttendanceItemTypeEnum(String key, String value){
this.key=key; this.key=key;
this.value=value; this.value=value;
} }

@ -0,0 +1,34 @@
package com.engine.attendance.enums;
import com.finance.toolkit.BaseEnum;
/**
*
*/
public enum ClassSegmentTypeEnum implements BaseEnum {
WORK_TIME("0","工作时段"),
REST_AND_DINE("1","休息就餐"),
EXTENDED_OVERTIME("2","延长加班"),
EARLY_OVERTIME("3","早到加班"),
REST_PERIOD("4","休息时段"),
DINING_PERIOD("5","就餐时段");
private String key;
private String value;
ClassSegmentTypeEnum(String key, String value){
this.key=key;
this.value=value;
}
@Override
public String getKey() {
return this.key;
}
@Override
public String getValue() {
return this.value;
}
}

@ -0,0 +1,36 @@
package com.engine.attendance.enums;
import com.finance.toolkit.BaseEnum;
/**
*
*/
public enum SystemItemEnum implements BaseEnum {
NORMAL("1","正常"),
WORK_DAY("2","工作日"),
REST_DAY("3","假日"),
HOLIDAY("4","节日"),
ABNORMAL("5","异常"),
NO_SCHEDULING("6","没有排班"),
MISSING_CLOCK_IN("7","漏打卡"),
ALGORITHM_MISSING("100","算法缺失");
private String key;
private String value;
SystemItemEnum(String key, String value){
this.key=key;
this.value=value;
}
@Override
public String getKey() {
return this.key;
}
@Override
public String getValue() {
return this.value;
}
}

@ -0,0 +1,33 @@
package com.engine.attendance.enums;
import com.finance.toolkit.BaseEnum;
public enum WorkForTimeEnum implements BaseEnum {
ALL_TIME("0","所有时段"),
WORK_TIME("1","工作时段"),
DELAY_TO_WORK_OVERTIME("2","延长加班"),
EARLY_TO_WORK_OVERTIME("3","早到加班"),
PLAN_WORK_OVERTIME("4","计划加班"),
LEAVE_TIME("5","请假时段"),
EVECTION("6","外出出差");
private String key;
private String value;
WorkForTimeEnum(String key, String value){
this.key=key;
this.value=value;
}
@Override
public String getKey() {
return this.key;
}
@Override
public String getValue() {
return this.value;
}
}

@ -22,6 +22,17 @@ public class DateUtil {
return localDateTime.plusMonths(1).format(yyyyMM); return localDateTime.plusMonths(1).format(yyyyMM);
} }
public static String beforeDay(String time,long day){
LocalDateTime localDateTime = LocalDate.parse(time, yyyyMMdd).atStartOfDay();
return localDateTime.minusDays(day).format(yyyyMMdd);
}
public static String AfterDay(String time,long day){
LocalDateTime localDateTime = LocalDate.parse(time, yyyyMMdd).atStartOfDay();
return localDateTime.plusDays(day).format(yyyyMMdd);
}
public static String nowMonth(String time){ public static String nowMonth(String time){
LocalDateTime localDateTime = LocalDate.parse(time, yyyyMMdd).atStartOfDay(); LocalDateTime localDateTime = LocalDate.parse(time, yyyyMMdd).atStartOfDay();
return localDateTime.format(yyyyMM); return localDateTime.format(yyyyMM);

Binary file not shown.

@ -1,10 +1,11 @@
import com.engine.common.util.CommonUtil; import com.engine.attendance.attendanceanalysis.cmd.AbsenteeismCmd;
import com.engine.attendance.enums.SystemItemEnum;
import com.engine.common.util.DateUtil; import com.engine.common.util.DateUtil;
import com.google.common.collect.Maps;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit; import java.time.temporal.ChronoUnit;
import java.util.*; import java.util.*;
@ -12,9 +13,33 @@ import java.util.*;
public class Test { public class Test {
public static void main(String[] args) { public static void main(String[] args) {
// Map<String,Object> params = Maps.newHashMap();
// List<Map<String,Object>> attendanceItems = new ArrayList<>();
System.out.println(DateUtil.getCurrentDateMinusDay(1)); // Map<String,Object> map = new HashMap<>();
// map.put("xmlx","1");
// map.put("zysd","1");
// map.put("zxhsl","60");
// map.put("zdhsl","180");
// Map<String,Object> map2 = new HashMap<>();
// map2.put("xmlx","2");
// map2.put("zysd","1");
// map2.put("zxhsl","60");
// map2.put("zdhsl","180");
// Map<String,Object> map3 = new HashMap<>();
// map3.put("xmlx","2");
// map3.put("zysd","1");
// map3.put("zxhsl","0");
// map3.put("zdhsl","60");
// attendanceItems.add(map);
// attendanceItems.add(map2);
// attendanceItems.add(map3);
// params.put("attendanceItems",attendanceItems);
// params.put("workfor","1");
// params.put("time","50");
// new AbsenteeismCmd(params).execute(null);
System.out.println(DateUtil.AfterDay("2023-10-27",1));
// List<Map<String,Object>> personGroupOrganizationList = Lists.newArrayList(); // List<Map<String,Object>> personGroupOrganizationList = Lists.newArrayList();
// personGroupOrganizationList.add(new HashMap(){{put("dx","4-夜班人员");}}); // personGroupOrganizationList.add(new HashMap(){{put("dx","4-夜班人员");}});
// personGroupOrganizationList.add(new HashMap(){{put("dx","8-测试条件录入");}}); // personGroupOrganizationList.add(new HashMap(){{put("dx","8-测试条件录入");}});

Loading…
Cancel
Save