|
@@ -18,8 +18,11 @@ import java.util.stream.Collectors;
|
|
|
|
|
|
|
|
import com.punchsettle.server.atomic.entity.PunchInMultiTask;
|
|
import com.punchsettle.server.atomic.entity.PunchInMultiTask;
|
|
|
import com.punchsettle.server.atomic.entity.PunchInTaskExt;
|
|
import com.punchsettle.server.atomic.entity.PunchInTaskExt;
|
|
|
|
|
+import com.punchsettle.server.constant.FullAttendancePeriodEnum;
|
|
|
|
|
+import com.punchsettle.server.constant.PunchInExtraMethodEnum;
|
|
|
import com.punchsettle.server.constant.PunchInMethodMultiEnum;
|
|
import com.punchsettle.server.constant.PunchInMethodMultiEnum;
|
|
|
import com.punchsettle.server.constant.RepeatCategoryEnum;
|
|
import com.punchsettle.server.constant.RepeatCategoryEnum;
|
|
|
|
|
+import com.punchsettle.server.service.manager.ICalendarManager;
|
|
|
import org.springframework.beans.BeanUtils;
|
|
import org.springframework.beans.BeanUtils;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
@@ -441,13 +444,12 @@ public class PunchInManagerImpl implements IPunchInManager {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
- * 判断是否是节假日
|
|
|
|
|
- * @param date
|
|
|
|
|
- * @return true:是节假日,false:不是节假日
|
|
|
|
|
|
|
+ * 默认打卡完成率
|
|
|
*/
|
|
*/
|
|
|
- private boolean judgeHoliday(String date) {
|
|
|
|
|
- return false;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ private static final BigDecimal DEFAULT_PUNCH_IN_DONE_RATE = new BigDecimal("101.00");
|
|
|
|
|
+
|
|
|
|
|
+ @Autowired
|
|
|
|
|
+ private ICalendarManager calendarManager;
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
|
public boolean judgeRepeat(PunchInTask punchInTask, String repeatDateStr) {
|
|
public boolean judgeRepeat(PunchInTask punchInTask, String repeatDateStr) {
|
|
@@ -458,12 +460,12 @@ public class PunchInManagerImpl implements IPunchInManager {
|
|
|
|
|
|
|
|
// 法定工作日
|
|
// 法定工作日
|
|
|
if (RepeatCategoryEnum.WORKDAY.equals(punchInTask.getRepeatCategory())) {
|
|
if (RepeatCategoryEnum.WORKDAY.equals(punchInTask.getRepeatCategory())) {
|
|
|
- return !judgeHoliday(repeatDateStr);
|
|
|
|
|
|
|
+ return !calendarManager.judgeHoliday(repeatDateStr);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 法定节假日(含周末)
|
|
// 法定节假日(含周末)
|
|
|
if (RepeatCategoryEnum.HOLIDAY.equals(punchInTask.getRepeatCategory())) {
|
|
if (RepeatCategoryEnum.HOLIDAY.equals(punchInTask.getRepeatCategory())) {
|
|
|
- return !judgeHoliday(repeatDateStr);
|
|
|
|
|
|
|
+ return !calendarManager.judgeHoliday(repeatDateStr);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 自定义
|
|
// 自定义
|
|
@@ -528,11 +530,6 @@ public class PunchInManagerImpl implements IPunchInManager {
|
|
|
return PunchInStatusEnum.UNDONE;
|
|
return PunchInStatusEnum.UNDONE;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- /**
|
|
|
|
|
- * 默认打卡完成率
|
|
|
|
|
- */
|
|
|
|
|
- private static final BigDecimal DEFAULT_PUNCH_IN_DONE_RATE = new BigDecimal("101.00");
|
|
|
|
|
-
|
|
|
|
|
@Override
|
|
@Override
|
|
|
public PunchInStatusEnum judgePunchInStatusInMultiTask(PunchInMultiTask punchInMultiTask, List<PunchInTaskHistory> punchInTaskHistoryList, int multiTaskNum) {
|
|
public PunchInStatusEnum judgePunchInStatusInMultiTask(PunchInMultiTask punchInMultiTask, List<PunchInTaskHistory> punchInTaskHistoryList, int multiTaskNum) {
|
|
|
if (CollectionUtils.isEmpty(punchInTaskHistoryList) || multiTaskNum == 0) {
|
|
if (CollectionUtils.isEmpty(punchInTaskHistoryList) || multiTaskNum == 0) {
|
|
@@ -561,27 +558,106 @@ public class PunchInManagerImpl implements IPunchInManager {
|
|
|
return PunchInStatusEnum.UNDONE;
|
|
return PunchInStatusEnum.UNDONE;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ // TODO 考虑把结算过程记录下来(每个一个积分项、是否双倍结算、是否全勤结算
|
|
|
@Override
|
|
@Override
|
|
|
- public int calculatePointsInTask(PunchInTask punchInTask, PunchInTaskExt punchInTaskExt, PunchInTaskHistory punchInTaskHistory) {
|
|
|
|
|
|
|
+ public int calculatePointsInTask(PunchInTask punchInTask, List<PunchInTaskExt> punchInTaskExtList, PunchInTaskHistory punchInTaskHistory) {
|
|
|
// 未完成打卡,积分为0
|
|
// 未完成打卡,积分为0
|
|
|
if (PunchInStatusEnum.UNDONE.equals(punchInTaskHistory.getPunchInStatus())) {
|
|
if (PunchInStatusEnum.UNDONE.equals(punchInTaskHistory.getPunchInStatus())) {
|
|
|
return 0;
|
|
return 0;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 单个任务积分=基本积分+(可选)额外积分+(可选)连续完成额外积分+法定节假日(含周末)双倍奖励+全勤双倍奖励
|
|
// 单个任务积分=基本积分+(可选)额外积分+(可选)连续完成额外积分+法定节假日(含周末)双倍奖励+全勤双倍奖励
|
|
|
- int points = Optional.ofNullable(punchInTask.getPoints()).orElse(0);
|
|
|
|
|
|
|
+ // 基本积分
|
|
|
|
|
+ int basicPoints = Optional.ofNullable(punchInTask.getPoints()).orElse(0);
|
|
|
|
|
+ basicPoints += calculateExtraPointsInTask(punchInTask, punchInTaskExtList, punchInTaskHistory, calendarManager.judgeHoliday(punchInTaskHistory.getPunchInDate()));
|
|
|
|
|
|
|
|
// 启用了全勤奖励
|
|
// 启用了全勤奖励
|
|
|
|
|
+ int fullAttendancePoints = 0;
|
|
|
if (CommonEnableStatusEnum.ENABLED.equals(punchInTask.getFullAttendanceStatus())) {
|
|
if (CommonEnableStatusEnum.ENABLED.equals(punchInTask.getFullAttendanceStatus())) {
|
|
|
|
|
+ LocalDate punchInDate = LocalDate.parse(punchInTaskHistory.getPunchInDate());
|
|
|
|
|
+ // 结算周期:周,并且结算日是周末,则双倍奖励
|
|
|
|
|
+ if (FullAttendancePeriodEnum.WEEK.equals(punchInTask.getFullAttendancePeriod()) && punchInDate.getDayOfWeek().getValue() == 7) {
|
|
|
|
|
+ fullAttendancePoints = basicPoints;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
|
|
+ // 结算周期:月,结算日是当月最后一天,则双倍奖励
|
|
|
|
|
+ if (FullAttendancePeriodEnum.MONTH.equals(punchInTask.getFullAttendancePeriod()) && punchInDate.lengthOfMonth() == punchInDate.getDayOfMonth()) {
|
|
|
|
|
+ fullAttendancePoints = basicPoints;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // TODO 无法判断容错率,要加一个专门的统计表才行,每周、每月的统计
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 启用了法定节假日(含周末)双倍奖励
|
|
// 启用了法定节假日(含周末)双倍奖励
|
|
|
- if (CommonEnableStatusEnum.ENABLED.equals(punchInTask.getHolidayStatus()) && judgeHoliday(punchInTaskHistory.getPunchInDate())) {
|
|
|
|
|
- points *= 2;
|
|
|
|
|
|
|
+ int holidayPoints = 0;
|
|
|
|
|
+ if (CommonEnableStatusEnum.ENABLED.equals(punchInTask.getHolidayStatus()) && calendarManager.judgeHoliday(punchInTaskHistory.getPunchInDate())) {
|
|
|
|
|
+ holidayPoints = basicPoints;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return basicPoints + fullAttendancePoints + holidayPoints;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 计算额外积分
|
|
|
|
|
+ * @param punchInTask
|
|
|
|
|
+ * @param punchInTaskExtList
|
|
|
|
|
+ * @return
|
|
|
|
|
+ */
|
|
|
|
|
+ private int calculateExtraPointsInTask(PunchInTask punchInTask, List<PunchInTaskExt> punchInTaskExtList, PunchInTaskHistory punchInTaskHistory, boolean holidayFlag) {
|
|
|
|
|
+ // 单次打卡或者没有启用额外积分计算则跳过
|
|
|
|
|
+ if (PunchInExtraMethodEnum.NONE.equals(punchInTask.getExtraMethod())
|
|
|
|
|
+ || PunchInMethodEnum.SINGLE.equals(punchInTask.getPunchInMethod())) {
|
|
|
|
|
+ return 0;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 计算超出部分,
|
|
|
|
|
+ int extraCountTrack = 0;
|
|
|
|
|
+ // 计数打卡
|
|
|
|
|
+ if (PunchInMethodEnum.COUNT.equals(punchInTask.getPunchInMethod())) {
|
|
|
|
|
+ extraCountTrack = punchInTaskHistory.getCountTrack() - (holidayFlag ? punchInTask.getHolidayCountTrack() : punchInTask.getCountTrack());
|
|
|
|
|
+ }
|
|
|
|
|
+ // 计时打卡
|
|
|
|
|
+ if (PunchInMethodEnum.TIMING.equals(punchInTask.getPunchInMethod())) {
|
|
|
|
|
+ // 超出的时间按照时间间隔转换成次数
|
|
|
|
|
+ long timeTrack = punchInTaskHistory.getTimeTrack().until((holidayFlag ? punchInTask.getHolidayTimeTrack() : punchInTask.getTimeTrack()), ChronoUnit.MINUTES);
|
|
|
|
|
+ extraCountTrack = BigDecimal.valueOf(timeTrack).divide(BigDecimal.valueOf(punchInTask.getExtraTimeStep()), 0, RoundingMode.FLOOR).intValue();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 如果等于0则没有超出部分,不用计算
|
|
|
|
|
+ if (extraCountTrack == 0) {
|
|
|
|
|
+ return 0;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 固定计算
|
|
|
|
|
+ if (PunchInExtraMethodEnum.FIXED.equals(punchInTask.getExtraMethod())) {
|
|
|
|
|
+ Integer extraPoints = Optional.ofNullable(punchInTask.getExtraPoints()).orElse(0);
|
|
|
|
|
+ return extraCountTrack * extraPoints;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 区间计算
|
|
|
|
|
+ if (PunchInExtraMethodEnum.INTERVAL.equals(punchInTask.getExtraMethod()) && !CollectionUtils.isEmpty(punchInTaskExtList)) {
|
|
|
|
|
+ int basicPoints = 0;
|
|
|
|
|
+ int prevInitialValue = 0;
|
|
|
|
|
+ for (PunchInTaskExt punchInTaskExt : punchInTaskExtList) {
|
|
|
|
|
+ Integer initialValue = Optional.ofNullable(punchInTaskExt.getInitialValue()).orElse(0);
|
|
|
|
|
+ // 第一轮:initialValue - extraCountTrack的值v1
|
|
|
|
|
+ // 如果v1≤0则超出initialValue范围,使用initialValue计算;
|
|
|
|
|
+ // 如果v1>0则在initialValue范围内 使用extraCountTrack
|
|
|
|
|
+ // 后续轮:本轮initialValue - extraCountTrack的值v1、
|
|
|
|
|
+ // 如果v1≤0则超出本轮initialValue范围,使用上一轮initialValue-本轮initialValue的值v2计算;
|
|
|
|
|
+ // 如果v1>0则在本轮initialValue范围内 使用extraCountTrack-上一轮initialValue的值v3计算
|
|
|
|
|
+ // 下面的代码不适合第一轮的计算
|
|
|
|
|
+ if (initialValue - extraCountTrack <= 0) {
|
|
|
|
|
+ basicPoints = punchInTaskExt.getExtraPoints() * Math.abs(prevInitialValue - initialValue);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ basicPoints = punchInTaskExt.getExtraPoints() * (extraCountTrack - prevInitialValue);
|
|
|
|
|
+ }
|
|
|
|
|
+ prevInitialValue = initialValue;
|
|
|
|
|
+ }
|
|
|
|
|
+ return basicPoints;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- return points;
|
|
|
|
|
|
|
+ return 0;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// TODO 多任务结算
|
|
// TODO 多任务结算
|