zm_dev
liuliang 2 years ago
parent d850d60447
commit fae56112e3

@ -774,3 +774,5 @@
2023-11-28 19:57:25,603 [main] [com.engine.common.util.Utils] [INFO] - 请假外出时间 右边
2023-11-28 20:02:25,544 [Timer-0] [A2] [INFO] - rootPath == null
2023-11-28 20:02:25,545 [Timer-0] [A2] [INFO] - filePath == nullWEB-INF\prop\isSyncLog4j.properties
2023-12-05 21:53:39,011 [Timer-0] [A2] [INFO] - rootPath == null
2023-12-05 21:53:39,021 [Timer-0] [A2] [INFO] - filePath == nullWEB-INF\prop\isSyncLog4j.properties

@ -14,6 +14,8 @@ import com.google.common.collect.Maps;
import lombok.extern.slf4j.Slf4j;
import weaver.general.Util;
import java.time.ZoneOffset;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@ -22,10 +24,11 @@ import java.util.stream.Collectors;
*
*/
@Slf4j
public class GetClockInPointCmd extends AbstractCommonCommand<Map<String,Object>> {
public GetClockInPointCmd(Map<String,Object> params){
this.params=params;
public class GetClockInPointCmd extends AbstractCommonCommand<Map<String, Object>> {
public GetClockInPointCmd(Map<String, Object> params) {
this.params = params;
}
@Override
public BizLogContext getLogContext() {
return null;
@ -35,241 +38,417 @@ public class GetClockInPointCmd extends AbstractCommonCommand<Map<String,Object>
public Map<String, Object> execute(CommandContext commandContext) {
Map<String, Object> resultMap = Maps.newHashMap();
String analysisDate = Util.null2String(params.get("analysisDate"));
List<Map<String, Object>> needClockInSchedule = (List<Map<String, Object>>)params.get("needClockInSchedule");
List<Map<String, Object>> clockInTimeList = (List<Map<String, Object>>)params.get("clockInTimeList");
List<Map<String, Map<String,Object>>> clcokInTimeData = getClockInPoint(analysisDate,needClockInSchedule,clockInTimeList);
resultMap.put("clcokInTimeData",clcokInTimeData);
List<Map<String, Object>> scheduleResult = (List<Map<String, Object>>) params.get("scheduleResult");
List<Map<String, Object>> clockInTimeList = (List<Map<String, Object>>) params.get("clockInTimeList");
List<Map<String, Object>> askForLeaveAndEvctionScheduleList = (List<Map<String, Object>>) params.get("askForLeaveAndEvctionSchedule");
List<Map<String, Object>> needClockInList = scheduleResult.stream().filter(e -> !ClassSegmentTypeEnum.REST_AND_DINE.getKey().equals(e.get("bdlx")) && !ClassSegmentTypeEnum.REST_PERIOD.getKey().equals(e.get("bdlx")) &&
!ClassSegmentTypeEnum.DINING_PERIOD.getKey().equals(e.get("bdlx")) ).collect(Collectors.toList());
/**
*
*/
log.info("未重新计算卡点时 老的scheduleResult : [{}],askForLeaveAndEvctionScheduleList:[{}]",scheduleResult,askForLeaveAndEvctionScheduleList);
if (needClockInList.size() > 0 && askForLeaveAndEvctionScheduleList.size() > 0) {
String startTime = analysisDate + " " + needClockInList.get(0).get("dtkssj").toString();
String endStartTime = analysisDate + " " + needClockInList.get(needClockInList.size()-1).get("dtkssj").toString();
String endTime = analysisDate + " " + needClockInList.get(needClockInList.size()-1).get("dtjssj").toString();
if (DateUtil.getTime(endStartTime).compareTo(DateUtil.getTime(endTime)) > 0) {
endTime = DateUtil.AfterDay(analysisDate, 1) + " " + needClockInList.get(needClockInList.size()-1).get("dtjssj");
}
for (Map<String, Object> askForLeaveAndEvctionSchedule :askForLeaveAndEvctionScheduleList){
String dtkssj = analysisDate + " " + askForLeaveAndEvctionSchedule.get("dtkssj");
String dtjssj = analysisDate + " " + askForLeaveAndEvctionSchedule.get("dtjssj");
if (DateUtil.getTime(dtkssj).compareTo(DateUtil.getTime(dtjssj)) > 0) {
dtjssj = DateUtil.AfterDay(analysisDate, 1) + " " + askForLeaveAndEvctionSchedule.get("dtjssj");
}
if (DateUtil.getTime(dtkssj).compareTo(DateUtil.getTime(startTime))<0 || DateUtil.getTime(dtkssj).compareTo(DateUtil.getTime(endTime)) > 0){
askForLeaveAndEvctionSchedule.put("ksdk",CheckBoxEnum.UNCHECKED.getKey());
}
if (DateUtil.getTime(dtjssj).compareTo(DateUtil.getTime(endTime))>0 || DateUtil.getTime(dtjssj).compareTo(DateUtil.getTime(startTime))<0){
askForLeaveAndEvctionSchedule.put("jsdk",CheckBoxEnum.UNCHECKED.getKey());
}
}
}
/**
*
*/
for (Map<String, Object> askForLeaveAndEvctionMap :askForLeaveAndEvctionScheduleList){
String evctiondtkssj = analysisDate + " " +Util.null2String(askForLeaveAndEvctionMap.get("dtkssj"));
String evctionksdk = Util.null2String(askForLeaveAndEvctionMap.get("ksdk"));
String evctiondtjssj = analysisDate + " " +Util.null2String(askForLeaveAndEvctionMap.get("dtjssj"));
String evctionjsdk = Util.null2String(askForLeaveAndEvctionMap.get("jsdk"));
if (DateUtil.getTime(evctiondtkssj).compareTo(DateUtil.getTime(evctiondtjssj)) > 0) {
evctiondtjssj = DateUtil.AfterDay(analysisDate, 1) + " " + Util.null2String(askForLeaveAndEvctionMap.get("dtjssj"));
}
List<String> lists = Lists.newArrayList();
for (int i=0;i<scheduleResult.size();i++){
String dtkssj = analysisDate + " " +Util.null2String(scheduleResult.get(i).get("dtkssj"));
String dtjssj = analysisDate + " " +Util.null2String(scheduleResult.get(i).get("dtjssj"));
String bdlx = Util.null2String(scheduleResult.get(i).get("bdlx"));
if (DateUtil.getTime(dtkssj).compareTo(DateUtil.getTime(dtjssj)) > 0) {
dtjssj = DateUtil.AfterDay(analysisDate, 1) + " " + Util.null2String(scheduleResult.get(i).get("dtjssj"));
}
if (DateUtil.getTime(evctiondtkssj).compareTo(DateUtil.getTime(dtkssj)) <= 0 && DateUtil.getTime(evctiondtjssj).compareTo(DateUtil.getTime(dtkssj)) >=0
&& !ClassSegmentTypeEnum.REST_AND_DINE.getKey().equals(bdlx) && !ClassSegmentTypeEnum.REST_PERIOD.getKey().equals(bdlx) && !ClassSegmentTypeEnum.DINING_PERIOD.getKey().equals(bdlx)){
lists.add(scheduleResult.get(i).get("dtkssj")+"-"+ClockPointEnum.START.getKey()+"-"+Util.null2String(scheduleResult.get(i).get("ksdk")));
}
if (DateUtil.getTime(evctiondtkssj).compareTo(DateUtil.getTime(dtjssj)) <= 0 && DateUtil.getTime(evctiondtjssj).compareTo(DateUtil.getTime(dtjssj)) >=0
&& !ClassSegmentTypeEnum.REST_AND_DINE.getKey().equals(bdlx) && !ClassSegmentTypeEnum.REST_PERIOD.getKey().equals(bdlx) && !ClassSegmentTypeEnum.DINING_PERIOD.getKey().equals(bdlx)){
lists.add(scheduleResult.get(i).get("dtjssj")+"-"+ClockPointEnum.END.getKey()+"-"+Util.null2String(scheduleResult.get(i).get("jsdk")));
}
}
//新打卡
List<String> newNeedClockLists = Lists.newArrayList();
if (lists.size() == 1){
String str = lists.get(0);
if (ClockPointEnum.START.getKey().equals(str.split("-")[1]) && CheckBoxEnum.CHECKED.getKey().equals(evctionjsdk)){
newNeedClockLists.add(str.split("-")[0]+"-"+str.split("-")[1]+"-0");
}else if (ClockPointEnum.END.getKey().equals(str.split("-")[1]) && CheckBoxEnum.CHECKED.getKey().equals(evctionksdk)){
newNeedClockLists.add(str.split("-")[0]+"-"+str.split("-")[1]+"-0");
}
}else if (lists.size() > 1){
for(int i=0;i<lists.size();i++){
String str = lists.get(i);
if (i ==0){
if (CheckBoxEnum.CHECKED.getKey().equals(evctionksdk) || ClockPointEnum.START.getKey().equals(str.split("-")[1])){
newNeedClockLists.add(str.split("-")[0]+"-"+str.split("-")[1]+"-0");
}
}else if (i == lists.size()-1){
if (CheckBoxEnum.CHECKED.getKey().equals(evctionjsdk) || ClockPointEnum.END.getKey().equals(str.split("-")[1])){
newNeedClockLists.add(str.split("-")[0]+"-"+str.split("-")[1]+"-0");
}
}else {
newNeedClockLists.add(str.split("-")[0]+"-"+str.split("-")[1]+"-0");
}
}
}
for (int i=0;i<scheduleResult.size();i++){
String dtkssj = Util.null2String(scheduleResult.get(i).get("dtkssj"));
String dtjssj = Util.null2String(scheduleResult.get(i).get("dtjssj"));
for (String newNeedClock : newNeedClockLists){
if (ClockPointEnum.START.getKey().equals(newNeedClock.split("-")[1])){
if (newNeedClock.split("-")[0].equals(dtkssj)){
scheduleResult.get(i).put("ksdk",newNeedClock.split("-")[2]);
}
}else if (ClockPointEnum.END.getKey().equals(newNeedClock.split("-")[1])){
if (newNeedClock.split("-")[0].equals(dtjssj)){
scheduleResult.get(i).put("jsdk",newNeedClock.split("-")[2]);
}
}
}
}
}
log.info("经过重新计算卡点时 新的scheduleResult : [{}],askForLeaveAndEvctionScheduleList:[{}]",scheduleResult,askForLeaveAndEvctionScheduleList);
if (askForLeaveAndEvctionScheduleList.size() > 0){
scheduleResult.addAll(askForLeaveAndEvctionScheduleList);
scheduleResult = scheduleResult.stream().sorted(Comparator.comparing(e->DateUtil.getTime(analysisDate+" "+e.get("dtkssj")).toInstant(ZoneOffset.of("+8")).toEpochMilli())).collect(Collectors.toList());
}
List<Map<String, Map<String, Object>>> clcokInTimeData = getClockInPoint(analysisDate, scheduleResult, clockInTimeList);
resultMap.put("clcokInTimeData", clcokInTimeData);
return resultMap;
}
/**
*
* @param analysisDate
* @param needClockInSchedule
* @param clockInTimeList
* @return
*
* @param analysisDate
* @param scheduleResult
* @param clockInTimeList
* @return {2023-11-12 09:00|0|3|2023-11-12 09:15={signtime=09:11:00, id=48, userid=53, signdate=2023-11-12}}
* ||| = map
*/
public static List<Map<String, Map<String,Object>>> getClockInPoint(String analysisDate, List<Map<String, Object>> needClockInSchedule, List<Map<String, Object>> clockInTimeList){
List<Map<String,Map<String,Object>>> clcokInTimeData = Lists.newArrayList();
for (Map<String, Object> needClockIn :needClockInSchedule){
if (CheckBoxEnum.CHECKED.getKey().equals(needClockIn.get("ksdk"))){
String dtkssj = analysisDate+" "+needClockIn.get("dtkssj");
String dtjssj = analysisDate+" "+needClockIn.get("dtjssj");
if (DateUtil.getTime(dtkssj).compareTo(DateUtil.getTime(dtjssj)) > 0){
dtjssj = DateUtil.AfterDay(analysisDate,1) +" "+needClockIn.get("dtjssj");
public static List<Map<String, Map<String, Object>>> getClockInPoint(String analysisDate, List<Map<String, Object>> scheduleResult, List<Map<String, Object>> clockInTimeList) {
/**
*
*/
List<Map<String, Map<String, Object>>> clcokInTimeData = Lists.newArrayList();
for (Map<String, Object> needClockIn : scheduleResult) {
if (CheckBoxEnum.CHECKED.getKey().equals(needClockIn.get("ksdk"))) {
String dtkssj = analysisDate + " " + needClockIn.get("dtkssj");
String dtjssj = analysisDate + " " + needClockIn.get("dtjssj");
if (DateUtil.getTime(dtkssj).compareTo(DateUtil.getTime(dtjssj)) > 0) {
dtjssj = DateUtil.AfterDay(analysisDate, 1) + " " + needClockIn.get("dtjssj");
}
int tqdkfzs = Integer.valueOf(Util.null2String(needClockIn.get("tqdkfzs")));
Map<String,Map<String,Object>> ksdkNearestClcokInTime = Utils.getNearestClcokInTimeCmd(dtkssj,clockInTimeList);
Map<String, Map<String, Object>> ksdkNearestClcokInTime = Utils.getNearestClcokInTimeCmd(dtkssj, clockInTimeList);
String timeType = ClockPointEnum.EMPTY.getKey();
Map<String,Map<String,Object>> clcokInTimeMap = Maps.newHashMap();
if (ksdkNearestClcokInTime.get(ClockPointEnum.EQUAL.getKey()) != null){
timeType=ClockPointEnum.EQUAL.getKey();
Map<String, Map<String, Object>> clcokInTimeMap = Maps.newHashMap();
if (ksdkNearestClcokInTime.get(ClockPointEnum.EQUAL.getKey()) != null) {
timeType = ClockPointEnum.EQUAL.getKey();
}
if (ClockPointEnum.EMPTY.getKey().equals(timeType) && ksdkNearestClcokInTime.get(ClockPointEnum.BEFORE.getKey()) != null){
String clockInTime = ksdkNearestClcokInTime.get(ClockPointEnum.BEFORE.getKey()).get("signdate") +" "+ksdkNearestClcokInTime.get(ClockPointEnum.BEFORE.getKey()).get("signtime");
if (DateUtil.getTime(clockInTime).compareTo(DateUtil.getTime(DateUtil.beforeMinutes(dtkssj,tqdkfzs))) >=0){
if (ClockPointEnum.EMPTY.getKey().equals(timeType) && ksdkNearestClcokInTime.get(ClockPointEnum.BEFORE.getKey()) != null) {
String clockInTime = ksdkNearestClcokInTime.get(ClockPointEnum.BEFORE.getKey()).get("signdate") + " " + ksdkNearestClcokInTime.get(ClockPointEnum.BEFORE.getKey()).get("signtime");
if (DateUtil.getTime(clockInTime).compareTo(DateUtil.getTime(DateUtil.beforeMinutes(dtkssj, tqdkfzs))) >= 0) {
//打卡时间大于等于最早打卡时间
timeType=ClockPointEnum.BEFORE.getKey();
timeType = ClockPointEnum.BEFORE.getKey();
}
}
if (ClockPointEnum.EMPTY.getKey().equals(timeType) && ksdkNearestClcokInTime.get(ClockPointEnum.AFTER.getKey()) != null){
String clockInTime = ksdkNearestClcokInTime.get(ClockPointEnum.AFTER.getKey()).get("signdate") +" "+ksdkNearestClcokInTime.get(ClockPointEnum.AFTER.getKey()).get("signtime");
if (DateUtil.getTime(clockInTime).compareTo(DateUtil.getTime(dtjssj)) < 0){
if (ClockPointEnum.EMPTY.getKey().equals(timeType) && ksdkNearestClcokInTime.get(ClockPointEnum.AFTER.getKey()) != null) {
String clockInTime = ksdkNearestClcokInTime.get(ClockPointEnum.AFTER.getKey()).get("signdate") + " " + ksdkNearestClcokInTime.get(ClockPointEnum.AFTER.getKey()).get("signtime");
if (DateUtil.getTime(clockInTime).compareTo(DateUtil.getTime(dtjssj)) < 0) {
//打卡时间小于结束时间
timeType=ClockPointEnum.AFTER.getKey();
timeType = ClockPointEnum.AFTER.getKey();
}
}
clcokInTimeMap.put(dtkssj+"|"+ClockPointEnum.START.getKey()+"|"+timeType,ksdkNearestClcokInTime.get(timeType));
clcokInTimeMap.put(dtkssj + "|" + ClockPointEnum.START.getKey() + "|" + timeType, ksdkNearestClcokInTime.get(timeType));
clcokInTimeData.add(clcokInTimeMap);
}
if (CheckBoxEnum.CHECKED.getKey().equals(needClockIn.get("jsdk"))){
String dtkssj = analysisDate+" "+needClockIn.get("dtkssj");
String dtjssj = analysisDate+" "+needClockIn.get("dtjssj");
if (CheckBoxEnum.CHECKED.getKey().equals(needClockIn.get("jsdk"))) {
String dtkssj = analysisDate + " " + needClockIn.get("dtkssj");
String dtjssj = analysisDate + " " + needClockIn.get("dtjssj");
int thdkfzs = Integer.valueOf(Util.null2String(needClockIn.get("thdkfzs")));
if (DateUtil.getTime(dtkssj).compareTo(DateUtil.getTime(dtjssj)) > 0){
dtjssj = DateUtil.AfterDay(analysisDate,1) +" "+needClockIn.get("dtjssj");
if (DateUtil.getTime(dtkssj).compareTo(DateUtil.getTime(dtjssj)) > 0) {
dtjssj = DateUtil.AfterDay(analysisDate, 1) + " " + needClockIn.get("dtjssj");
}
Map<String,Map<String,Object>> jsdkNearestClcokInTime = Utils.getNearestClcokInTimeCmd(dtjssj,clockInTimeList);
Map<String, Map<String, Object>> jsdkNearestClcokInTime = Utils.getNearestClcokInTimeCmd(dtjssj, clockInTimeList);
String timeType = ClockPointEnum.EMPTY.getKey();
Map<String,Map<String,Object>> clcokInTimeMap = Maps.newHashMap();
if (jsdkNearestClcokInTime.get(ClockPointEnum.EQUAL.getKey()) != null){
timeType=ClockPointEnum.EQUAL.getKey();
Map<String, Map<String, Object>> clcokInTimeMap = Maps.newHashMap();
if (jsdkNearestClcokInTime.get(ClockPointEnum.EQUAL.getKey()) != null) {
timeType = ClockPointEnum.EQUAL.getKey();
}
if (ClockPointEnum.EMPTY.getKey().equals(timeType) && jsdkNearestClcokInTime.get(ClockPointEnum.AFTER.getKey()) != null){
String clockInTime = jsdkNearestClcokInTime.get(ClockPointEnum.AFTER.getKey()).get("signdate") +" "+jsdkNearestClcokInTime.get(ClockPointEnum.AFTER.getKey()).get("signtime");
if (DateUtil.getTime(clockInTime).compareTo(DateUtil.getTime(DateUtil.AfterMinutes(dtjssj,thdkfzs))) <=0){
timeType=ClockPointEnum.AFTER.getKey();
if (ClockPointEnum.EMPTY.getKey().equals(timeType) && jsdkNearestClcokInTime.get(ClockPointEnum.AFTER.getKey()) != null) {
String clockInTime = jsdkNearestClcokInTime.get(ClockPointEnum.AFTER.getKey()).get("signdate") + " " + jsdkNearestClcokInTime.get(ClockPointEnum.AFTER.getKey()).get("signtime");
if (DateUtil.getTime(clockInTime).compareTo(DateUtil.getTime(DateUtil.AfterMinutes(dtjssj, thdkfzs))) <= 0) {
timeType = ClockPointEnum.AFTER.getKey();
}
}
if (ClockPointEnum.EMPTY.getKey().equals(timeType) && jsdkNearestClcokInTime.get(ClockPointEnum.BEFORE.getKey()) != null){
String clockInTime = jsdkNearestClcokInTime.get(ClockPointEnum.BEFORE.getKey()).get("signdate") +" "+jsdkNearestClcokInTime.get(ClockPointEnum.BEFORE.getKey()).get("signtime");
if (DateUtil.getTime(clockInTime).compareTo(DateUtil.getTime(dtkssj)) >0){
timeType=ClockPointEnum.BEFORE.getKey();
if (ClockPointEnum.EMPTY.getKey().equals(timeType) && jsdkNearestClcokInTime.get(ClockPointEnum.BEFORE.getKey()) != null) {
String clockInTime = jsdkNearestClcokInTime.get(ClockPointEnum.BEFORE.getKey()).get("signdate") + " " + jsdkNearestClcokInTime.get(ClockPointEnum.BEFORE.getKey()).get("signtime");
if (DateUtil.getTime(clockInTime).compareTo(DateUtil.getTime(dtkssj)) > 0) {
timeType = ClockPointEnum.BEFORE.getKey();
}
}
clcokInTimeMap.put(dtjssj+"|"+ClockPointEnum.END.getKey()+"|"+timeType,jsdkNearestClcokInTime.get(timeType));
clcokInTimeMap.put(dtjssj + "|" + ClockPointEnum.END.getKey() + "|" + timeType, jsdkNearestClcokInTime.get(timeType));
clcokInTimeData.add(clcokInTimeMap);
}
}
//当弹性上下班时
if (needClockInSchedule.size() > 0){
clcokInTimeData = clcokInTimeData.stream().sorted(Comparator.comparing(e->{
//卡点
String point = "";
//当天打卡数据
for (Map.Entry<String,Map<String,Object>> entry :e.entrySet()){
point = entry.getKey();
}
return DateUtil.getTime(point.split("\\|")[0]).toInstant(ZoneOffset.of("+8")).toEpochMilli();
})).collect(Collectors.toList());
/**
*
*/
if (scheduleResult.size() > 0) {
//上下班弹性,
List<Map<String, Object>> workScheduleList = scheduleResult.stream().filter(e -> ClassSegmentTypeEnum.WORK_TIME.getKey().equals(e.get("bdlx")) || ClassSegmentTypeEnum.EXTENDED_OVERTIME.getKey().equals(e.get("bdlx"))
|| ClassSegmentTypeEnum.EARLY_OVERTIME.getKey().equals(e.get("bdlx"))).collect(Collectors.toList());
//请假和外出集合
List<Map<String, Object>> leaveAndEvctionList = scheduleResult.stream().filter(e -> ClassSegmentTypeEnum.ASK_FOR_LEAVE.getKey().equals(e.get("bdlx")) ||
ClassSegmentTypeEnum.EVECTION.getKey().equals(e.get("bdlx"))).collect(Collectors.toList());
//是否弹性
String sfdx = Util.null2String(needClockInSchedule.get(0).get("sfdx"));
//最大弹性分钟
int zddxfz = Integer.valueOf(Util.null2String(needClockInSchedule.get(0).get("zddxfz")));
//弹性核算
int dxhs = Integer.valueOf(Util.null2String(needClockInSchedule.get(0).get("dxhs")));
String sfdx = Util.null2String(workScheduleList.get(0).get("sfdx"));
//上班是否需要打卡
String ifToWorkClock = Util.null2String(workScheduleList.get(0).get("ksdk"));
//下班是否需要打卡
String ifToCloseClock = Util.null2String(workScheduleList.get(workScheduleList.size()-1).get("jsdk"));
if (CheckBoxEnum.CHECKED.getKey().equals(sfdx)){
//上下班弹性
List<Map<String, Object>> needClockInStartList = needClockInSchedule.stream().filter(e -> ClassSegmentTypeEnum.WORK_TIME.getKey().equals(e.get("bdlx")) && CheckBoxEnum.CHECKED.getKey().equals(e.get("ksdk"))).collect(Collectors.toList());
//第一条工作时段、早上加班必须要求打卡并且上班之前没有请假
if (workScheduleList.size() > 0 && CheckBoxEnum.CHECKED.getKey().equals(sfdx)) {
//最大弹性分钟
int zddxfz = Integer.valueOf(Util.null2String(workScheduleList.get(0).get("zddxfz")));
//弹性核算
int dxhs = Integer.valueOf(Util.null2String(workScheduleList.get(0).get("dxhs")));
Map<String, Object> ksdkMap = workScheduleList.get(0);
String kssjStart = analysisDate + " " + Util.null2String(ksdkMap.get("dtkssj"));
String jssjStart = analysisDate + " " + Util.null2String(ksdkMap.get("dtjssj"));
List<Map<String, Object>> needClockInEndList = needClockInSchedule.stream().filter(e -> ClassSegmentTypeEnum.WORK_TIME.getKey().equals(e.get("bdlx")) && CheckBoxEnum.CHECKED.getKey().equals(e.get("jsdk"))).collect(Collectors.toList());
if (needClockInStartList.size()>0 && needClockInEndList.size()>0){
Map<String, Object> ksdkMap = needClockInStartList.get(0);
String kssjStart = analysisDate + " " +Util.null2String(ksdkMap.get("dtkssj"));
String jssjStart = analysisDate +" "+Util.null2String(ksdkMap.get("dtjssj"));
Map<String, Object> jsdkMap = workScheduleList.get(workScheduleList.size() - 1);
int thdkfzs = Integer.valueOf(Util.null2String(jsdkMap.get("thdkfzs")));
String kssjEnd = analysisDate + " " + Util.null2String(jsdkMap.get("dtkssj"));
String jssjEnd = analysisDate + " " + Util.null2String(jsdkMap.get("dtjssj"));
Map<String, Object> jsdkMap = needClockInEndList.get(needClockInEndList.size()-1);
int thdkfzs = Integer.valueOf(Util.null2String(jsdkMap.get("thdkfzs")));
String kssjEnd = analysisDate + " " +Util.null2String(jsdkMap.get("dtkssj"));
String jssjEnd = analysisDate +" "+Util.null2String(jsdkMap.get("dtjssj"));
if (ksdkMap != jsdkMap) {
if (DateUtil.getTime(kssjStart).compareTo(DateUtil.getTime(jssjStart)) > 0) {
kssjStart = DateUtil.beforeDay(analysisDate, 1) + " " + Util.null2String(ksdkMap.get("dtkssj"));
}
if (DateUtil.getTime(kssjEnd).compareTo(DateUtil.getTime(jssjEnd)) > 0) {
jssjEnd = DateUtil.AfterDay(analysisDate, 1) + " " + Util.null2String(jsdkMap.get("dtjssj"));
}
} else {
jssjEnd = DateUtil.AfterDay(analysisDate, 1) + " " + Util.null2String(jsdkMap.get("dtjssj"));
}
if (ksdkMap != jsdkMap){
if (DateUtil.getTime(kssjStart).compareTo(DateUtil.getTime(jssjStart)) > 0){
kssjStart = DateUtil.beforeDay(analysisDate,1)+" "+Util.null2String(ksdkMap.get("dtkssj"));
//弹性上班时间
String flexibleWorkTime = "";
//弹性下班时间
String flexibleOffWorkTime="";
if (leaveAndEvctionList.size() >0){
//第一笔请假、外出时间
Map<String, Object> leaveAndEvctionMap = leaveAndEvctionList.get(0);
String leaveAndEvctionkssj = analysisDate + " " + Util.null2String(leaveAndEvctionMap.get("dtkssj"));
//最大开始弹性时间
String minkssjStart = DateUtil.beforeMinutes(kssjStart,zddxfz);
String maxkssjStart = DateUtil.AfterMinutes(kssjStart,zddxfz);
//请假开始时间在最大开始弹性时间之内
if (DateUtil.getTime(leaveAndEvctionkssj).compareTo(DateUtil.getTime(maxkssjStart))<=0){
//弹性上班卡
flexibleWorkTime = leaveAndEvctionkssj;
if (DateUtil.getTime(leaveAndEvctionkssj).compareTo(DateUtil.getTime(minkssjStart)) <0){
flexibleWorkTime=minkssjStart;
}
if (DateUtil.getTime(kssjEnd).compareTo(DateUtil.getTime(jssjEnd)) > 0){
jssjEnd = DateUtil.AfterDay(analysisDate,1)+" "+Util.null2String(jsdkMap.get("dtjssj"));
//弹性下班时间点
int betweenToWorkTime = DateUtil.getBetWeenMinutes(flexibleWorkTime, kssjStart);
//弹性下班时间点
flexibleOffWorkTime = jssjEnd;
if (betweenToWorkTime >= 0) {
flexibleOffWorkTime = DateUtil.beforeMinutes(flexibleOffWorkTime, Math.abs(betweenToWorkTime));
} else if (betweenToWorkTime < 0) {
flexibleOffWorkTime = DateUtil.AfterMinutes(flexibleOffWorkTime, Math.abs(betweenToWorkTime));
}
}else {
jssjEnd = DateUtil.AfterDay(analysisDate,1)+" "+Util.null2String(jsdkMap.get("dtjssj"));
}
//弹性上班卡
String flexibleWork = "";
for (int i=0;i<clcokInTimeData.size();i++){
Map<String,Map<String,Object>> clcokInTimeMap = clcokInTimeData.get(i);
//卡点
String point = "";
//当天打卡数据
Map<String,Object> clcokInTime = null;
for (Map.Entry<String,Map<String,Object>> entry :clcokInTimeMap.entrySet()){
point = entry.getKey();
clcokInTime = entry.getValue();
}
//需要计算的班次打卡时间点
String pointTime = point.split("\\|")[0];
//start开始打卡时间点end结束打卡时间点
String pointType = point.split("\\|")[1];
//empty:漏卡equal:打卡时间和班次时间相等before打卡时间在班次时间之前after打卡时间在班次时间之后
String timeType = point.split("\\|")[2];
}
//弹性上班卡
for (int i = 0; i < clcokInTimeData.size(); i++) {
Map<String, Map<String, Object>> clcokInTimeMap = clcokInTimeData.get(i);
//卡点
String point = "";
//当天打卡数据
Map<String, Object> clcokInTime = null;
for (Map.Entry<String, Map<String, Object>> entry : clcokInTimeMap.entrySet()) {
point = entry.getKey();
clcokInTime = entry.getValue();
}
//需要计算的班次打卡时间点
String pointTime = point.split("\\|")[0];
//start开始打卡时间点end结束打卡时间点
String pointType = point.split("\\|")[1];
//empty:漏卡equal:打卡时间和班次时间相等before打卡时间在班次时间之前after打卡时间在班次时间之后
String timeType = point.split("\\|")[2];
if (pointTime.equals(kssjStart) && ClockPointEnum.START.getKey().equals(pointType) && clcokInTime != null){
String signTime = clcokInTime.get("signdate")+" "+clcokInTime.get("signtime");
//该卡点是弹性开始时间
if (ClockPointEnum.BEFORE.getKey().equals(timeType)){
int betWeenTime = DateUtil.getBetWeenMinutes(signTime,kssjStart);
if (pointTime.equals(kssjStart) && ClockPointEnum.START.getKey().equals(pointType) && clcokInTime != null
&& CheckBoxEnum.CHECKED.getKey().equals(ifToWorkClock)) {
String signTime = clcokInTime.get("signdate") + " " + clcokInTime.get("signtime");
//该卡点是弹性开始时间
if ("".equals(flexibleWorkTime) ){
//弹性上班期间未被请假开始时间占据
if (ClockPointEnum.BEFORE.getKey().equals(timeType)) {
int betWeenTime = DateUtil.getBetWeenMinutes(signTime, kssjStart);
String newPonit = point;
if (betWeenTime <= zddxfz){
betWeenTime = Double.valueOf(Utils.getItemdurationDown(5.0, AccountingUnitEnum.MINUTES.getKey(),betWeenTime,AccountingUnitEnum.MINUTES)).intValue();
flexibleWork = DateUtil.beforeMinutes(kssjStart,betWeenTime);
newPonit = pointTime+"|"+pointType+"|"+ClockPointEnum.EQUAL.getKey()+"|"+flexibleWork;
}else if (betWeenTime > zddxfz){
newPonit = point +"|"+DateUtil.beforeMinutes(kssjStart,zddxfz);
flexibleWork = DateUtil.beforeMinutes(kssjStart,zddxfz);
if (betWeenTime <= zddxfz) {
betWeenTime = Double.valueOf(Utils.getItemdurationDown(dxhs, AccountingUnitEnum.MINUTES.getKey(), betWeenTime, AccountingUnitEnum.MINUTES)).intValue();
flexibleWorkTime = DateUtil.beforeMinutes(kssjStart, betWeenTime);
newPonit = pointTime + "|" + pointType + "|" + ClockPointEnum.EQUAL.getKey() + "|" + flexibleWorkTime;
} else if (betWeenTime > zddxfz) {
flexibleWorkTime = DateUtil.beforeMinutes(kssjStart, zddxfz);
newPonit = point + "|" + flexibleWorkTime;
}
clcokInTimeMap.remove(point);
clcokInTimeMap.put(newPonit,clcokInTime);
}else if (ClockPointEnum.AFTER.getKey().equals(timeType)){
clcokInTimeMap.put(newPonit, clcokInTime);
} else if (ClockPointEnum.AFTER.getKey().equals(timeType)) {
//迟到
String newPonit = point;
int betWeenTime = DateUtil.getBetWeenMinutes(kssjStart,signTime);
if (betWeenTime <= zddxfz){
betWeenTime = Double.valueOf(Utils.getItemduration(5.0, AccountingUnitEnum.MINUTES.getKey(),betWeenTime,AccountingUnitEnum.MINUTES)).intValue();
flexibleWork = DateUtil.AfterMinutes(kssjStart,betWeenTime);
newPonit = pointTime+"|"+pointType+"|"+ClockPointEnum.EQUAL.getKey()+"|"+flexibleWork;
}else if (betWeenTime > zddxfz){
newPonit = point +"|"+DateUtil.AfterMinutes(kssjStart,zddxfz);
flexibleWork = DateUtil.AfterMinutes(kssjStart,zddxfz);
int betWeenTime = DateUtil.getBetWeenMinutes(kssjStart, signTime);
if (betWeenTime <= zddxfz) {
betWeenTime = Double.valueOf(Utils.getItemduration(dxhs, AccountingUnitEnum.MINUTES.getKey(), betWeenTime, AccountingUnitEnum.MINUTES)).intValue();
flexibleWorkTime = DateUtil.AfterMinutes(kssjStart, betWeenTime);
newPonit = pointTime + "|" + pointType + "|" + ClockPointEnum.EQUAL.getKey() + "|" + flexibleWorkTime;
} else if (betWeenTime > zddxfz) {
flexibleWorkTime = DateUtil.AfterMinutes(kssjStart, zddxfz);
newPonit = point + "|" + flexibleWorkTime;
}
clcokInTimeMap.remove(point);
clcokInTimeMap.put(newPonit,clcokInTime);
clcokInTimeMap.put(newPonit, clcokInTime);
}
}else if (pointTime.equals(jssjEnd) && ClockPointEnum.END.getKey().equals(pointType) && clcokInTime != null){
//该卡点是弹性下班点
int betweenToWorkTime = DateUtil.getBetWeenMinutes(flexibleWork,kssjStart);
}else {
//弹性上班期间被请假开始时间占据
String newPonit = point +"|"+flexibleWorkTime;
clcokInTimeMap.remove(point);
clcokInTimeMap.put(newPonit, clcokInTime);
}
} else if (pointTime.equals(jssjEnd) && ClockPointEnum.END.getKey().equals(pointType) && CheckBoxEnum.CHECKED.getKey().equals(ifToCloseClock)) {
//该卡点是弹性下班点
if ("".equals(flexibleOffWorkTime) && !"".equals(flexibleWorkTime)){
int betweenToWorkTime = DateUtil.getBetWeenMinutes(flexibleWorkTime, kssjStart);
//弹性下班时间点
String flexibleOffWork = jssjEnd;
if (betweenToWorkTime >=0){
flexibleOffWork = DateUtil.beforeMinutes(flexibleOffWork,Math.abs(betweenToWorkTime));
}else if (betweenToWorkTime < 0){
flexibleOffWork = DateUtil.AfterMinutes(flexibleOffWork,Math.abs(betweenToWorkTime));
flexibleOffWorkTime = jssjEnd;
if (betweenToWorkTime >= 0) {
flexibleOffWorkTime = DateUtil.beforeMinutes(flexibleOffWorkTime, Math.abs(betweenToWorkTime));
} else if (betweenToWorkTime < 0) {
flexibleOffWorkTime = DateUtil.AfterMinutes(flexibleOffWorkTime, Math.abs(betweenToWorkTime));
}
}
if (!"".equals(flexibleOffWorkTime)){
//根据弹性下班时间点重新计算
Map<String,Map<String,Object>> jsdkNearestClcokInTime = Utils.getNearestClcokInTimeCmd(flexibleOffWork,clockInTimeList);
Map<String, Map<String, Object>> jsdkNearestClcokInTime = Utils.getNearestClcokInTimeCmd(flexibleOffWorkTime, clockInTimeList);
String newtimeType = ClockPointEnum.EMPTY.getKey();
if (jsdkNearestClcokInTime.get(ClockPointEnum.EQUAL.getKey()) != null){
newtimeType=ClockPointEnum.EQUAL.getKey();
if (jsdkNearestClcokInTime.get(ClockPointEnum.EQUAL.getKey()) != null) {
newtimeType = ClockPointEnum.EQUAL.getKey();
}
if (ClockPointEnum.EMPTY.getKey().equals(newtimeType) && jsdkNearestClcokInTime.get(ClockPointEnum.AFTER.getKey()) != null){
String clockInTime = jsdkNearestClcokInTime.get(ClockPointEnum.AFTER.getKey()).get("signdate") +" "+jsdkNearestClcokInTime.get(ClockPointEnum.AFTER.getKey()).get("signtime");
if (DateUtil.getTime(clockInTime).compareTo(DateUtil.getTime(DateUtil.AfterMinutes(flexibleOffWork,thdkfzs))) <=0){
newtimeType=ClockPointEnum.AFTER.getKey();
if (ClockPointEnum.EMPTY.getKey().equals(newtimeType) && jsdkNearestClcokInTime.get(ClockPointEnum.AFTER.getKey()) != null) {
String clockInTime = jsdkNearestClcokInTime.get(ClockPointEnum.AFTER.getKey()).get("signdate") + " " + jsdkNearestClcokInTime.get(ClockPointEnum.AFTER.getKey()).get("signtime");
if (DateUtil.getTime(clockInTime).compareTo(DateUtil.getTime(DateUtil.AfterMinutes(flexibleOffWorkTime, thdkfzs))) <= 0) {
newtimeType = ClockPointEnum.AFTER.getKey();
}
}
if (ClockPointEnum.EMPTY.getKey().equals(newtimeType) && jsdkNearestClcokInTime.get(ClockPointEnum.BEFORE.getKey()) != null){
String clockInTime = jsdkNearestClcokInTime.get(ClockPointEnum.BEFORE.getKey()).get("signdate") +" "+jsdkNearestClcokInTime.get(ClockPointEnum.BEFORE.getKey()).get("signtime");
if (DateUtil.getTime(clockInTime).compareTo(DateUtil.getTime(kssjEnd)) >0){
newtimeType=ClockPointEnum.BEFORE.getKey();
if (ClockPointEnum.EMPTY.getKey().equals(newtimeType) && jsdkNearestClcokInTime.get(ClockPointEnum.BEFORE.getKey()) != null) {
String clockInTime = jsdkNearestClcokInTime.get(ClockPointEnum.BEFORE.getKey()).get("signdate") + " " + jsdkNearestClcokInTime.get(ClockPointEnum.BEFORE.getKey()).get("signtime");
if (DateUtil.getTime(clockInTime).compareTo(DateUtil.getTime(kssjEnd)) > 0) {
newtimeType = ClockPointEnum.BEFORE.getKey();
}
}
String newPonit = jssjEnd+"|"+ClockPointEnum.END.getKey()+"|"+newtimeType+"|"+flexibleOffWork;
String newPonit = jssjEnd + "|" + ClockPointEnum.END.getKey() + "|" + newtimeType + "|" + flexibleOffWorkTime;
clcokInTimeMap.remove(point);
clcokInTimeMap.put(newPonit,jsdkNearestClcokInTime.get(newtimeType));
clcokInTimeMap.put(newPonit, jsdkNearestClcokInTime.get(newtimeType));
}
}
}
}
}
//当有2笔需要打卡时可能会有打卡歧义的情况歧义情况取2个时间点的中间值当打卡时间小于中间值归属前一个打卡大于则相反
if (clcokInTimeData.size() >1){
for (int i=0;i<clcokInTimeData.size()-1;i++){
Map<String,Map<String,Object>> beforeClcokInTimeData = clcokInTimeData.get(i);
Map<String,Map<String,Object>> afterClcokInTimeData = clcokInTimeData.get(i+1);
Map<String,Object> beforeClcokInTimeMap = null;
/**
* 22
*/
if (clcokInTimeData.size() > 1) {
for (int i = 0; i < clcokInTimeData.size() - 1; i++) {
Map<String, Map<String, Object>> beforeClcokInTimeData = clcokInTimeData.get(i);
Map<String, Map<String, Object>> afterClcokInTimeData = clcokInTimeData.get(i + 1);
Map<String, Object> beforeClcokInTimeMap = null;
String beforeClcokInTime = "";
String afterClcokInTime = "";
Map<String,Object> afterClcokInTimeMap = null;
for (Map.Entry<String,Map<String,Object>> beforeEntry :beforeClcokInTimeData.entrySet()){
Map<String, Object> afterClcokInTimeMap = null;
for (Map.Entry<String, Map<String, Object>> beforeEntry : beforeClcokInTimeData.entrySet()) {
beforeClcokInTimeMap = beforeEntry.getValue();
beforeClcokInTime = beforeEntry.getKey();
}
for (Map.Entry<String,Map<String,Object>> afterEntry :afterClcokInTimeData.entrySet()){
for (Map.Entry<String, Map<String, Object>> afterEntry : afterClcokInTimeData.entrySet()) {
afterClcokInTimeMap = afterEntry.getValue();
afterClcokInTime = afterEntry.getKey();
}
//重复
if (beforeClcokInTimeMap != null && beforeClcokInTimeMap == afterClcokInTimeMap ){
if (beforeClcokInTimeMap != null && beforeClcokInTimeMap == afterClcokInTimeMap) {
String beforeTime = beforeClcokInTime.split("\\|")[0];
String afterTime = afterClcokInTime.split("\\|")[0];
long betWeenMinutes = DateUtil.getBetWeenMinutes(beforeTime,afterTime);
long betWeenMinutes = DateUtil.getBetWeenMinutes(beforeTime, afterTime);
String middileTime = DateUtil.AfterMinutes(beforeTime,betWeenMinutes/2);
String middileTime = DateUtil.AfterMinutes(beforeTime, betWeenMinutes / 2);
String signdateTime = beforeClcokInTimeMap.get("signdate") +" "+beforeClcokInTimeMap.get("signtime");
String signdateTime = beforeClcokInTimeMap.get("signdate") + " " + beforeClcokInTimeMap.get("signtime");
if (DateUtil.getTime(signdateTime).compareTo(DateUtil.getTime(middileTime)) <=0){
if (DateUtil.getTime(signdateTime).compareTo(DateUtil.getTime(middileTime)) <= 0) {
//该打卡归属前一个打卡点
afterClcokInTimeData.put(afterClcokInTime,null);
}else if (DateUtil.getTime(signdateTime).compareTo(DateUtil.getTime(middileTime)) >0){
afterClcokInTimeData.put(afterClcokInTime, null);
} else if (DateUtil.getTime(signdateTime).compareTo(DateUtil.getTime(middileTime)) > 0) {
//该打卡归属后一个打卡点
beforeClcokInTimeData.put(beforeClcokInTime,null);
beforeClcokInTimeData.put(beforeClcokInTime, null);
}
}
}

@ -9,6 +9,7 @@ import com.engine.common.util.DbTools;
import com.engine.core.interceptor.CommandContext;
import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;
import weaver.conn.RecordSetTrans;
import weaver.general.Util;
import java.util.List;
@ -146,6 +147,32 @@ public class recordDataCmd extends AbstractCommonCommand<Map<String,Object>> {
DbTools.update(sql,insertDatas.toArray());
}
updateWorkOverTimeDate(userId,analysisDate);
return null;
}
public void updateWorkOverTimeDate(String userId,String date){
String sql = "select id from uf_jcl_kq_cqjg where ygid=? and rq=?";
List<Map<String,Object>> dataList = DbTools.getSqlToList(sql,userId,date);
if (dataList.size() > 0){
String id = Util.null2String(dataList.get(0).get("id"));
RecordSetTrans rst = new RecordSetTrans();
rst.setAutoCommit(false);
try {
sql = "delete from uf_jcl_kq_jbjg where lyid=?";
rst.executeUpdate(sql,id);
sql = "delete from uf_jcl_kq_jqye where lyid=?";
rst.executeUpdate(sql,id);
sql = "update uf_jcl_kq_jbjg set lyid =? where lyid=?";
rst.executeUpdate(sql,id,userId+"-"+DateUtil.getCurrentDate());
sql = "update uf_jcl_kq_jqye set lyid =? where lyid=?";
rst.executeUpdate(sql,id,userId+"-"+DateUtil.getCurrentDate());
rst.commit();
}catch (Exception e){
rst.rollback();
log.error("updateWorkOverTimeDate error :{}",e);
}
}
}
}

@ -89,7 +89,10 @@ public class AbnormalAttendanceServiceImpl extends Service implements AbnormalAt
saveWorkTimeBeLateParam.put("betweenMinutes",between);
saveWorkTimeBeLateParam.put("itemType", AttendanceItemTypeEnum.LATE);
saveWorkTimeBeLateParam.put("hsdw",hsdw);
saveWorkTimeBeLateParam.put("hsl",hsl);
saveWorkTimeBeLateParam.put("kczgsc",kczgsc);
saveWorkTimeBeLateParam.put("classStartTime",classStartTime);
saveWorkTimeBeLateParam.put("classEndTime",clockInTime);
resultList.add(saveWorkTimeBeLateParam);
}
@ -133,7 +136,10 @@ public class AbnormalAttendanceServiceImpl extends Service implements AbnormalAt
saveWorkTimeBeLateParam.put("betweenMinutes",between);
saveWorkTimeBeLateParam.put("itemType", AttendanceItemTypeEnum.LATE);
saveWorkTimeBeLateParam.put("hsdw",hsdw);
saveWorkTimeBeLateParam.put("hsl",hsl);
saveWorkTimeBeLateParam.put("kczgsc",kczgsc);
saveWorkTimeBeLateParam.put("classStartTime",classStartTime);
saveWorkTimeBeLateParam.put("classEndTime",clockInTime);
resultList.add(saveWorkTimeBeLateParam);
}
@ -177,6 +183,9 @@ public class AbnormalAttendanceServiceImpl extends Service implements AbnormalAt
saveWorkTimeBeLateParam.put("itemType", AttendanceItemTypeEnum.LATE);
saveWorkTimeBeLateParam.put("hsdw",hsdw);
saveWorkTimeBeLateParam.put("kczgsc",kczgsc);
saveWorkTimeBeLateParam.put("hsl",hsl);
saveWorkTimeBeLateParam.put("classStartTime",classStartTime);
saveWorkTimeBeLateParam.put("classEndTime",clockInTime);
resultList.add(saveWorkTimeBeLateParam);
}
@ -256,6 +265,9 @@ public class AbnormalAttendanceServiceImpl extends Service implements AbnormalAt
saveWorkTimeBeLateParam.put("itemType", AttendanceItemTypeEnum.LEAVE_EARLY);
saveWorkTimeBeLateParam.put("hsdw",hsdw);
saveWorkTimeBeLateParam.put("kczgsc",kczgsc);
saveWorkTimeBeLateParam.put("hsl",hsl);
saveWorkTimeBeLateParam.put("classStartTime",clockInTime);
saveWorkTimeBeLateParam.put("classEndTime",classEndTime);
resultList.add(saveWorkTimeBeLateParam);
}
@ -301,6 +313,9 @@ public class AbnormalAttendanceServiceImpl extends Service implements AbnormalAt
saveWorkTimeBeLateParam.put("itemType", AttendanceItemTypeEnum.LEAVE_EARLY);
saveWorkTimeBeLateParam.put("hsdw",hsdw);
saveWorkTimeBeLateParam.put("kczgsc",kczgsc);
saveWorkTimeBeLateParam.put("hsl",hsl);
saveWorkTimeBeLateParam.put("classStartTime",clockInTime);
saveWorkTimeBeLateParam.put("classEndTime",classEndTime);
resultList.add(saveWorkTimeBeLateParam);
}
@ -345,6 +360,9 @@ public class AbnormalAttendanceServiceImpl extends Service implements AbnormalAt
saveWorkTimeBeLateParam.put("itemType", AttendanceItemTypeEnum.LEAVE_EARLY);
saveWorkTimeBeLateParam.put("hsdw",hsdw);
saveWorkTimeBeLateParam.put("kczgsc",kczgsc);
saveWorkTimeBeLateParam.put("hsl",hsl);
saveWorkTimeBeLateParam.put("classStartTime",clockInTime);
saveWorkTimeBeLateParam.put("classEndTime",classEndTime);
resultList.add(saveWorkTimeBeLateParam);
}

@ -1,6 +1,8 @@
package com.engine.attendance.attendanceanalysis.service.impl;
import com.engine.attendance.attendanceanalysis.service.AskForLeaveService;
import com.engine.attendance.enums.AccountingUnitEnum;
import com.engine.attendance.enums.AttendanceItemTypeEnum;
import com.engine.attendance.enums.CheckBoxEnum;
import com.engine.attendance.enums.WorkForTimeEnum;
import com.engine.common.util.DateUtil;
@ -31,13 +33,26 @@ public class AskForLeaveServiceImpl extends Service implements AskForLeaveServic
List<Map<String,Object>> offsetAskForLeaveAnomaly = Lists.newArrayList();
for (int i=0;i<abnormalClockInList.size();i++){
String pointTime = Util.null2String(abnormalClockInList.get(i).get("pointTime"));
String bdlx = Util.null2String(abnormalClockInList.get(i).get("bdlx"));
if (zysd.contains(Utils.getWorkFor(bdlx)) || zysd.contains(WorkForTimeEnum.ALL_TIME.getKey())){
if (DateUtil.getTime(kssj).compareTo(DateUtil.getTime(pointTime)) <=0 &&
DateUtil.getTime(jssj).compareTo(DateUtil.getTime(pointTime)) >=0){
AttendanceItemTypeEnum itemType = (AttendanceItemTypeEnum)abnormalClockInList.get(i).get("itemType");
String classStartTime = Util.null2String(abnormalClockInList.get(i).get("classStartTime"));
String classEndTime = Util.null2String(abnormalClockInList.get(i).get("classEndTime"));
if ((zysd.contains(Utils.getWorkFor(bdlx)) || zysd.contains(WorkForTimeEnum.ALL_TIME.getKey())) &&
!AttendanceItemTypeEnum.MISSE_CARD.equals(itemType)){
Map<String,Object> leaveMap = Maps.newHashMap();
leaveMap.put("kssj",kssj);
leaveMap.put("jssj",jssj);
int betweenTime = DateUtil.getBetWeenMinutes(classStartTime,classEndTime);
int intersectionTime = Utils.getIntersectionTime(classStartTime,classEndTime,leaveMap);
if (betweenTime == intersectionTime){
offsetAskForLeaveAnomaly.add(abnormalClockInList.get(i));
}else {
String hsdw = Util.null2String(abnormalClockInList.get(i).get("hsdw"));
int hsl = Integer.valueOf(Util.null2String(abnormalClockInList.get(i).get("hsl")));
double itemduration = Utils.getItemduration(hsl,hsdw,betweenTime-intersectionTime, AccountingUnitEnum.MINUTES);
abnormalClockInList.get(i).put("itemduration",itemduration);
}
}
}
abnormalClockInList.removeAll(offsetAskForLeaveAnomaly);

@ -1,6 +1,8 @@
package com.engine.attendance.attendanceanalysis.service.impl;
import com.engine.attendance.attendanceanalysis.service.EvectionService;
import com.engine.attendance.enums.AccountingUnitEnum;
import com.engine.attendance.enums.AttendanceItemTypeEnum;
import com.engine.attendance.enums.CheckBoxEnum;
import com.engine.attendance.enums.WorkForTimeEnum;
import com.engine.common.util.DateUtil;
@ -29,12 +31,25 @@ public class EvectionServiceImpl extends Service implements EvectionService {
List<Map<String,Object>> offsetEvectionAnomaly = Lists.newArrayList();
for (int i=0;i<abnormalClockInList.size();i++){
String pointTime = Util.null2String(abnormalClockInList.get(i).get("pointTime"));
String bdlx = Util.null2String(abnormalClockInList.get(i).get("bdlx"));
if (zysd.contains(Utils.getWorkFor(bdlx)) || zysd.contains(WorkForTimeEnum.ALL_TIME.getKey())) {
if (DateUtil.getTime(kssj).compareTo(DateUtil.getTime(pointTime)) <= 0 &&
DateUtil.getTime(jssj).compareTo(DateUtil.getTime(pointTime)) >= 0) {
AttendanceItemTypeEnum itemType = (AttendanceItemTypeEnum)abnormalClockInList.get(i).get("itemType");
String classStartTime = Util.null2String(abnormalClockInList.get(i).get("classStartTime"));
String classEndTime = Util.null2String(abnormalClockInList.get(i).get("classEndTime"));
if ((zysd.contains(Utils.getWorkFor(bdlx)) || zysd.contains(WorkForTimeEnum.ALL_TIME.getKey())) &&
!AttendanceItemTypeEnum.MISSE_CARD.equals(itemType)) {
Map<String,Object> leaveMap = Maps.newHashMap();
leaveMap.put("kssj",kssj);
leaveMap.put("jssj",jssj);
int betweenTime = DateUtil.getBetWeenMinutes(classStartTime,classEndTime);
int intersectionTime = Utils.getIntersectionTime(classStartTime,classEndTime,leaveMap);
if (betweenTime == intersectionTime){
offsetEvectionAnomaly.add(abnormalClockInList.get(i));
}else {
String hsdw = Util.null2String(abnormalClockInList.get(i).get("hsdw"));
int hsl = Integer.valueOf(Util.null2String(abnormalClockInList.get(i).get("hsl")));
double itemduration = Utils.getItemduration(hsl,hsdw,betweenTime-intersectionTime, AccountingUnitEnum.MINUTES);
abnormalClockInList.get(i).put("itemduration",itemduration);
}
}
}

@ -16,11 +16,9 @@ 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.conn.RecordSet;
import weaver.general.Util;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.stream.Collectors;
@Slf4j
@ -132,11 +130,11 @@ public class UtilServiceImpl extends Service implements UtilService {
map.put("dtjssj",overtimePlan.get("jssj"));
map.put("ksdk","0");
map.put("jsdk","0");
map.put("tqdkfzs","30");
map.put("thdkfzs","30");
map.put("sfdx","0");
map.put("zddxfz","0");
map.put("dxhs","0");
map.put("tqdkfzs","60");
map.put("thdkfzs","60");
map.put("sfdx",Util.null2String(dataList.get(0).get("sfdx")));
map.put("zddxfz",Util.null2String(dataList.get(0).get("zddxfz")));
map.put("dxhs",Util.null2String(dataList.get(0).get("dxhs")));
map.put("rqlx",dateMap.get(e.getKey()));
map.put("edxss",overtimePlan.get("jbsc"));
if (attendanceItems.size() >0){

@ -3,7 +3,6 @@ package com.engine.attendance.attendanceanalysis.service.impl;
import com.engine.attendance.attendanceanalysis.cmd.item.WorkOvertimeItemCmd;
import com.engine.attendance.attendanceanalysis.service.WorkOverTimeService;
import com.engine.attendance.enums.*;
import com.engine.common.util.CommonUtil;
import com.engine.common.util.DateUtil;
import com.engine.common.util.DbTools;
import com.engine.common.util.Utils;
@ -380,6 +379,7 @@ public class WorkOverTimeServiceImpl extends Service implements WorkOverTimeServ
insertParam.put("sjjssj",realityEndime.split(" ")[1]);
insertParam.put("sjjbsc",itemduration);
insertParam.put("jbjgly","4");
insertParam.put("lyid",userId+"-"+DateUtil.getCurrentDate());
insertParam.put("zt","1");
Utils.InsertFormTable("uf_jcl_kq_jbjg",insertParam,(Map<String,String>)params.get("formmodeIdMap"));
@ -391,6 +391,7 @@ public class WorkOverTimeServiceImpl extends Service implements WorkOverTimeServ
Map<String,Object> insertHoliDayParam = Maps.newHashMap();
insertHoliDayParam.put("ygid",userId);
insertHoliDayParam.put("jqid",workTimeBeLateItems.get(0).get("zrdjb"));
insertHoliDayParam.put("lyid",userId+"-"+DateUtil.getCurrentDate());
//转入的假期额度生效日期
String yesxrq = Util.null2String(workTimeBeLateItems.get(0).get("yesxrq"));
if ("0".equals(yesxrq)){
@ -407,47 +408,47 @@ public class WorkOverTimeServiceImpl extends Service implements WorkOverTimeServ
String yekyzq = Util.null2String(workTimeBeLateItems.get(0).get("yekyzq"));
if ("0".equals(yekyzq)){
//一个月
insertHoliDayParam.put("jzrq",DateUtil.nextMonth(analysisDate,1,DateUtil.yyyyMMdd));
insertHoliDayParam.put("jzrq",DateUtil.nextMonth(insertHoliDayParam.get("sxrq").toString(),1,DateUtil.yyyyMMdd));
}else if ("1".equals(yekyzq)){
//两个月
insertHoliDayParam.put("jzrq",DateUtil.nextMonth(analysisDate,2,DateUtil.yyyyMMdd));
insertHoliDayParam.put("jzrq",DateUtil.nextMonth(insertHoliDayParam.get("sxrq").toString(),2,DateUtil.yyyyMMdd));
}else if ("2".equals(yekyzq)){
//三个月
insertHoliDayParam.put("jzrq",DateUtil.nextMonth(analysisDate,3,DateUtil.yyyyMMdd));
insertHoliDayParam.put("jzrq",DateUtil.nextMonth(insertHoliDayParam.get("sxrq").toString(),3,DateUtil.yyyyMMdd));
}else if ("3".equals(yekyzq)){
//六个月
insertHoliDayParam.put("jzrq",DateUtil.nextMonth(analysisDate,6,DateUtil.yyyyMMdd));
insertHoliDayParam.put("jzrq",DateUtil.nextMonth(insertHoliDayParam.get("sxrq").toString(),6,DateUtil.yyyyMMdd));
}else if ("4".equals(yekyzq)){
//十二个月
insertHoliDayParam.put("jzrq",DateUtil.nextMonth(analysisDate,12,DateUtil.yyyyMMdd));
insertHoliDayParam.put("jzrq",DateUtil.nextMonth(insertHoliDayParam.get("sxrq").toString(),12,DateUtil.yyyyMMdd));
}else if ("5".equals(yekyzq)){
//季度
insertHoliDayParam.put("jzrq",DateUtil.nextMonth(analysisDate,3,DateUtil.yyyyMMdd));
insertHoliDayParam.put("jzrq",DateUtil.nextMonth(insertHoliDayParam.get("sxrq").toString(),3,DateUtil.yyyyMMdd));
}else if ("6".equals(yekyzq)){
//半年
insertHoliDayParam.put("jzrq",DateUtil.nextMonth(analysisDate,6,DateUtil.yyyyMMdd));
insertHoliDayParam.put("jzrq",DateUtil.nextMonth(insertHoliDayParam.get("sxrq").toString(),6,DateUtil.yyyyMMdd));
}else if ("7".equals(yekyzq)){
//一年
insertHoliDayParam.put("jzrq",DateUtil.nextMonth(analysisDate,12,DateUtil.yyyyMMdd));
insertHoliDayParam.put("jzrq",DateUtil.nextMonth(insertHoliDayParam.get("sxrq").toString(),12,DateUtil.yyyyMMdd));
}
insertHoliDayParam.put("ktsc",itemduration);
String zdyqsc = Util.null2String(workTimeBeLateItems.get(0).get("zdyqsc"));
if ("0".equals(zdyqsc)){
//一个月
insertHoliDayParam.put("yqsxrq",DateUtil.nextMonth(analysisDate,1,DateUtil.yyyyMMdd));
insertHoliDayParam.put("yqsxrq",DateUtil.nextMonth(insertHoliDayParam.get("jzrq").toString(),1,DateUtil.yyyyMMdd));
}else if ("1".equals(zdyqsc)){
//两个月
insertHoliDayParam.put("yqsxrq",DateUtil.nextMonth(analysisDate,2,DateUtil.yyyyMMdd));
insertHoliDayParam.put("yqsxrq",DateUtil.nextMonth(insertHoliDayParam.get("jzrq").toString(),2,DateUtil.yyyyMMdd));
}else if ("2".equals(zdyqsc)){
//三个月
insertHoliDayParam.put("yqsxrq",DateUtil.nextMonth(analysisDate,3,DateUtil.yyyyMMdd));
insertHoliDayParam.put("yqsxrq",DateUtil.nextMonth(insertHoliDayParam.get("jzrq").toString(),3,DateUtil.yyyyMMdd));
}else if ("3".equals(zdyqsc)){
//半年
insertHoliDayParam.put("yqsxrq",DateUtil.nextMonth(analysisDate,6,DateUtil.yyyyMMdd));
insertHoliDayParam.put("yqsxrq",DateUtil.nextMonth(insertHoliDayParam.get("jzrq").toString(),6,DateUtil.yyyyMMdd));
}else if ("4".equals(zdyqsc)){
//一年
insertHoliDayParam.put("yqsxrq",DateUtil.nextMonth(analysisDate,12,DateUtil.yyyyMMdd));
insertHoliDayParam.put("yqsxrq",DateUtil.nextMonth(insertHoliDayParam.get("jzrq").toString(),12,DateUtil.yyyyMMdd));
}
Utils.InsertFormTable("uf_jcl_kq_jqye",insertHoliDayParam,(Map<String,String>)params.get("formmodeIdMap"));

@ -1,14 +1,11 @@
package com.engine.attendance.attendanceanalysis.wrapper;
import com.engine.attendance.attendanceanalysis.cmd.GetClockInPointCmd;
import com.engine.attendance.attendanceanalysis.service.ForgetClockInService;
import com.engine.attendance.attendanceanalysis.service.UtilService;
import com.engine.attendance.attendanceanalysis.service.impl.ForgetClockInServiceImpl;
import com.engine.attendance.attendanceanalysis.service.impl.UtilServiceImpl;
import com.engine.attendance.enums.AccountingUnitEnum;
import com.engine.attendance.enums.CheckBoxEnum;
import com.engine.attendance.enums.ClassSegmentTypeEnum;
import com.engine.attendance.enums.ClockPointEnum;
import com.engine.common.util.DateUtil;
import com.engine.common.util.DbTools;
import com.engine.common.util.ServiceUtil;
@ -172,6 +169,7 @@ public class AttendanceAnalysisWrapper extends Service {
sql = "select hsl,hsdw,lgsbxydk,tqlghlfzs,fgsbxydk,thfghlfzs,tybcndbjlhbjs,zdycbcndfgzsd,zdycrqqjndxxb,zysd from uf_jcl_kq_kqxm where id=?";
List<Map<String,Object>> askForLeaveAndEvctionSchedule = Lists.newArrayList();
for (Map<String,Object> askForLeaveData : askForLeaveList){
Map<String,Object> askForLeaveItem = DbTools.getSqlToMap(sql,askForLeaveData.get("jqlx"));
//全天请假
@ -188,10 +186,11 @@ public class AttendanceAnalysisWrapper extends Service {
}
askForLeaveItems.put(askForLeaveData.get("jqlx").toString(),askForLeaveItem);
List<Map<String, Object>> finalScheduleResult = scheduleResult;
Map<String,Object> askForLeaveMap = new HashMap(){{
put("bcxx",scheduleResult.get(0).get("bcxx"));
put("bcsdxx",scheduleResult.get(0).get("bcsdxx"));
put("edsc",scheduleResult.get(0).get("edsc"));
put("bcxx", finalScheduleResult.get(0).get("bcxx"));
put("bcsdxx", finalScheduleResult.get(0).get("bcsdxx"));
put("edsc", finalScheduleResult.get(0).get("edsc"));
put("bdlx", ClassSegmentTypeEnum.EVECTION.getKey());
put("dtkssj",askForLeaveData.get("kssj"));
put("dtjssj",askForLeaveData.get("jssj"));
@ -199,14 +198,13 @@ public class AttendanceAnalysisWrapper extends Service {
put("jsdk",askForLeaveItem.get("lgsbxydk"));
put("tqdkfzs","60");
put("thdkfzs","60");
put("sfdx","1");
put("zddxfz",askForLeaveItem.get("tqlghlfzs"));
put("dxhs",askForLeaveItem.get("thfghlfzs"));
put("tqlghlfzs",askForLeaveItem.get("tqlghlfzs"));
put("thfghlfzs",askForLeaveItem.get("thfghlfzs"));
}};
if (!"".equals(Util.null2String(askForLeaveData.get("kssj"))) && !"".equals(Util.null2String(askForLeaveData.get("jssj"))) &&(CheckBoxEnum.CHECKED.getKey().equals(askForLeaveItem.get("lgsbxydk")) || CheckBoxEnum.CHECKED.getKey().equals(askForLeaveItem.get("fgsbxydk")))){
needClockInSchedule.add(askForLeaveMap);
scheduleResult.add(askForLeaveMap);
if (!"".equals(Util.null2String(askForLeaveData.get("kssj"))) && !"".equals(Util.null2String(askForLeaveData.get("jssj")))){
//scheduleResult.add(askForLeaveMap);
askForLeaveAndEvctionSchedule.add(askForLeaveMap);
}
}
for (Map<String,Object> evectionData :evectionList){
@ -224,10 +222,11 @@ public class AttendanceAnalysisWrapper extends Service {
return;
}
evectionItems.put(evectionData.get("cclx").toString(),evectionItem);
List<Map<String, Object>> finalScheduleResult1 = scheduleResult;
Map<String,Object> evectionMap = new HashMap(){{
put("bcxx",scheduleResult.get(0).get("bcxx"));
put("bcsdxx",scheduleResult.get(0).get("bcsdxx"));
put("edsc",scheduleResult.get(0).get("edsc"));
put("bcxx", finalScheduleResult1.get(0).get("bcxx"));
put("bcsdxx", finalScheduleResult1.get(0).get("bcsdxx"));
put("edsc", finalScheduleResult1.get(0).get("edsc"));
put("bdlx", ClassSegmentTypeEnum.ASK_FOR_LEAVE.getKey());
put("dtkssj",evectionData.get("kssj"));
put("dtjssj",evectionData.get("jssj"));
@ -235,22 +234,22 @@ public class AttendanceAnalysisWrapper extends Service {
put("jsdk",evectionItem.get("lgsbxydk"));
put("tqdkfzs","60");
put("thdkfzs","60");
put("sfdx","1");
put("zddxfz",evectionItem.get("tqlghlfzs"));
put("dxhs",evectionItem.get("thfghlfzs"));
put("tqlghlfzs",evectionItem.get("tqlghlfzs"));
put("thfghlfzs",evectionItem.get("thfghlfzs"));
}};
if (!"".equals(Util.null2String(evectionData.get("kssj"))) && !"".equals(Util.null2String(evectionData.get("jssj"))) && (CheckBoxEnum.CHECKED.getKey().equals(evectionItem.get("lgsbxydk")) || CheckBoxEnum.CHECKED.getKey().equals(evectionItem.get("fgsbxydk")))){
needClockInSchedule.add(evectionMap);
scheduleResult.add(evectionMap);
if (!"".equals(Util.null2String(evectionData.get("kssj"))) && !"".equals(Util.null2String(evectionData.get("jssj")))){
//scheduleResult.add(evectionMap);
askForLeaveAndEvctionSchedule.add(evectionMap);
}
}
needClockInSchedule = needClockInSchedule.stream().sorted(Comparator.comparing(e->DateUtil.getTime(analysisDate+" "+e.get("dtkssj")).toInstant(ZoneOffset.of("+8")).toEpochMilli())).collect(Collectors.toList());
scheduleResult = scheduleResult.stream().sorted(Comparator.comparing(e->DateUtil.getTime(analysisDate+" "+e.get("dtkssj")).toInstant(ZoneOffset.of("+8")).toEpochMilli())).collect(Collectors.toList());
Map<String,Object> clcokInTimeDataParam = Maps.newHashMap();
clcokInTimeDataParam.put("analysisDate",analysisDate);
clcokInTimeDataParam.put("needClockInSchedule",needClockInSchedule);
clcokInTimeDataParam.put("scheduleResult",scheduleResult);
clcokInTimeDataParam.put("clockInTimeList",clockInTimeList);
clcokInTimeDataParam.put("askForLeaveAndEvctionSchedule",askForLeaveAndEvctionSchedule);
List<Map<String,Map<String,Object>>> clcokInTimeData = utilService.getClockInPointCmd(clcokInTimeDataParam);
Map<String,Object> recordAbnormalParam = Maps.newHashMap();

@ -428,12 +428,40 @@ public class Utils<T> {
log.info("请假外出时间 左边");
}else if (DateUtil.getTime(kssj).compareTo(DateUtil.getTime(leavekssj)) >=0 && DateUtil.getTime(jssj).compareTo(DateUtil.getTime(leavejssj)) <=0){
//请假外出时间中间
betweenMinutes = 0;
betweenMinutes = DateUtil.getBetWeenMinutes(kssj,jssj);
log.info("加班实际在请假外出时间中间");
}
return betweenMinutes;
}
/**
* mapkssjjssj
* @return
*/
public static int getIntersectionTime(String kssj,String jssj,Map<String, Object> map){
String leavekssj = map.get("kssj").toString();
String leavejssj = map.get("jssj").toString();
int betweenMinutes=0;
if (DateUtil.getTime(kssj).compareTo(DateUtil.getTime(leavekssj)) <=0 && DateUtil.getTime(jssj).compareTo(DateUtil.getTime(leavejssj)) >=0){
//时间在中间
betweenMinutes = DateUtil.getBetWeenMinutes(leavekssj,leavejssj);
log.info("时间在中间,被包含");
}else if (DateUtil.getTime(kssj).compareTo(DateUtil.getTime(leavekssj)) <=0 && DateUtil.getTime(jssj).compareTo(DateUtil.getTime(leavejssj)) <=0 && DateUtil.getTime(jssj).compareTo(DateUtil.getTime(leavekssj)) >=0){
//时间 右边
betweenMinutes = DateUtil.getBetWeenMinutes(leavekssj,jssj);
log.info("时间 右边");
}else if (DateUtil.getTime(kssj).compareTo(DateUtil.getTime(leavekssj)) >=0 && DateUtil.getTime(jssj).compareTo(DateUtil.getTime(leavejssj)) >=0 && DateUtil.getTime(kssj).compareTo(DateUtil.getTime(leavejssj)) <=0){
//时间 左边
betweenMinutes = DateUtil.getBetWeenMinutes(kssj,leavejssj);
log.info("时间 左边");
}else if (DateUtil.getTime(kssj).compareTo(DateUtil.getTime(leavekssj)) >=0 && DateUtil.getTime(jssj).compareTo(DateUtil.getTime(leavejssj)) <=0){
//请假外出时间中间
betweenMinutes = DateUtil.getBetWeenMinutes(kssj,jssj);
log.info("时间在中间,包含");
}
return betweenMinutes;
}
public static Map<String,String> getFormmodeIdMap(){
String sql = "select modeid,tablename from uf_jcl_form_table ";
List<Map<String,Object>> dataList = DbTools.getSqlToList(sql);

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

@ -1,6 +1,7 @@
import com.engine.attendance.attendanceanalysis.cmd.GetClockInTimeItemCmd;
import com.engine.attendance.enums.AttendanceItemTypeEnum;
import com.engine.common.util.DateUtil;
import com.engine.common.util.Utils;
import com.google.common.collect.Lists;
@ -14,7 +15,9 @@ import java.util.stream.Collectors;
public class Test {
public static void main(String[] args) {
System.out.println("18:13:00".substring(0,5));
List<Integer> list = Lists.newArrayList();
aa(list);
System.out.println(list);
// Map<String,Object> params = Maps.newHashMap();
// List<Map<String,Object>> attendanceItems = new ArrayList<>();
// Map<String,Object> map = new HashMap<>();
@ -60,7 +63,8 @@ public class Test {
// }
// System.out.println("aaaa");
System.out.println(DateUtil.getBetWeenMinutes("2023-11-25 20:45:00","2023-11-25 21:00"));
System.out.println(AttendanceItemTypeEnum.MISSE_CARD.equals(AttendanceItemTypeEnum.MISSE_CARD));
//System.out.println(Util.getIntValue(""));
// List<Map<String,Object>> beforeleaveDate = Lists.newArrayList();
// for (int i=beforeleaveDate.size()-1;i>=0;i--){
@ -434,8 +438,13 @@ public class Test {
params.put("clockInTimeCollect",collect);
params.put("schedulingResultCollect",schedulingResultsMap);
Map<String, Object> beforeOneDayClockInTimeList = new GetClockInTimeItemCmd(params).execute(null);
System.out.println(beforeOneDayClockInTimeList);
}
public static void aa(List<Integer> list){
list.add(1);
list.add(5);
list.add(4);
list = list.stream().filter(e -> e <=4).collect(Collectors.toList());
}
}

Loading…
Cancel
Save