|
@@ -9,6 +9,7 @@ import java.time.YearMonth;
|
|
|
import java.time.temporal.ChronoUnit;
|
|
import java.time.temporal.ChronoUnit;
|
|
|
import java.util.ArrayList;
|
|
import java.util.ArrayList;
|
|
|
import java.util.Arrays;
|
|
import java.util.Arrays;
|
|
|
|
|
+import java.util.Comparator;
|
|
|
import java.util.List;
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
import java.util.Map;
|
|
|
import java.util.Objects;
|
|
import java.util.Objects;
|
|
@@ -17,8 +18,15 @@ import java.util.function.Function;
|
|
|
import java.util.stream.Collectors;
|
|
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.PunchInMultiTaskExt;
|
|
|
|
|
+import com.punchsettle.server.atomic.entity.PunchInMultiTaskHistory;
|
|
|
|
|
+import com.punchsettle.server.atomic.entity.PunchInStatsMonth;
|
|
|
|
|
+import com.punchsettle.server.atomic.entity.PunchInStatsWeek;
|
|
|
|
|
+import com.punchsettle.server.atomic.entity.PunchInStatus;
|
|
|
import com.punchsettle.server.atomic.entity.PunchInTaskExt;
|
|
import com.punchsettle.server.atomic.entity.PunchInTaskExt;
|
|
|
|
|
+import com.punchsettle.server.constant.ConsecutiveStatusEnum;
|
|
|
import com.punchsettle.server.constant.FullAttendancePeriodEnum;
|
|
import com.punchsettle.server.constant.FullAttendancePeriodEnum;
|
|
|
|
|
+import com.punchsettle.server.constant.PunchInDimensionEnum;
|
|
|
import com.punchsettle.server.constant.PunchInExtraMethodEnum;
|
|
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;
|
|
@@ -558,34 +566,44 @@ public class PunchInManagerImpl implements IPunchInManager {
|
|
|
return PunchInStatusEnum.UNDONE;
|
|
return PunchInStatusEnum.UNDONE;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- // TODO 考虑把结算过程记录下来(每个一个积分项、是否双倍结算、是否全勤结算
|
|
|
|
|
@Override
|
|
@Override
|
|
|
- public int calculatePointsInTask(PunchInTask punchInTask, List<PunchInTaskExt> punchInTaskExtList, PunchInTaskHistory punchInTaskHistory) {
|
|
|
|
|
|
|
+ public int calculatePointsInTask(PunchInTask punchInTask, List<PunchInTaskExt> punchInTaskExts, PunchInTaskHistory punchInTaskHistory, PunchInStatsWeek punchInStatsWeek, PunchInStatsMonth punchInStatsMonth, PunchInStatus punchInStatus) {
|
|
|
// 未完成打卡,积分为0
|
|
// 未完成打卡,积分为0
|
|
|
if (PunchInStatusEnum.UNDONE.equals(punchInTaskHistory.getPunchInStatus())) {
|
|
if (PunchInStatusEnum.UNDONE.equals(punchInTaskHistory.getPunchInStatus())) {
|
|
|
return 0;
|
|
return 0;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ // 单次打卡中使用的拓展信息
|
|
|
|
|
+ List<PunchInTaskExt> punchInExtList = punchInTaskExts.stream().filter(v -> PunchInDimensionEnum.ONE_DAY.equals(v.getDimension())).collect(Collectors.toList());
|
|
|
|
|
+ // 打卡任务使用的拓展信息
|
|
|
|
|
+ List<PunchInTaskExt> punchInTaskExtList = punchInTaskExts.stream().filter(v -> PunchInDimensionEnum.MULTI_DAY.equals(v.getDimension())).collect(Collectors.toList());
|
|
|
|
|
+
|
|
|
// 单个任务积分=基本积分+(可选)额外积分+(可选)连续完成额外积分+法定节假日(含周末)双倍奖励+全勤双倍奖励
|
|
// 单个任务积分=基本积分+(可选)额外积分+(可选)连续完成额外积分+法定节假日(含周末)双倍奖励+全勤双倍奖励
|
|
|
// 基本积分
|
|
// 基本积分
|
|
|
int basicPoints = Optional.ofNullable(punchInTask.getPoints()).orElse(0);
|
|
int basicPoints = Optional.ofNullable(punchInTask.getPoints()).orElse(0);
|
|
|
- basicPoints += calculateExtraPointsInTask(punchInTask, punchInTaskExtList, punchInTaskHistory, calendarManager.judgeHoliday(punchInTaskHistory.getPunchInDate()));
|
|
|
|
|
|
|
+
|
|
|
|
|
+ // 额外积分
|
|
|
|
|
+ basicPoints += calculateExtraPointsInTask(punchInTask, punchInExtList, punchInTaskHistory, calendarManager.judgeHoliday(punchInTaskHistory.getPunchInDate()));
|
|
|
|
|
|
|
|
// 启用了全勤奖励
|
|
// 启用了全勤奖励
|
|
|
int fullAttendancePoints = 0;
|
|
int fullAttendancePoints = 0;
|
|
|
if (CommonEnableStatusEnum.ENABLED.equals(punchInTask.getFullAttendanceStatus())) {
|
|
if (CommonEnableStatusEnum.ENABLED.equals(punchInTask.getFullAttendanceStatus())) {
|
|
|
LocalDate punchInDate = LocalDate.parse(punchInTaskHistory.getPunchInDate());
|
|
LocalDate punchInDate = LocalDate.parse(punchInTaskHistory.getPunchInDate());
|
|
|
- // 结算周期:周,并且结算日是周末,则双倍奖励
|
|
|
|
|
|
|
+ // 结算周期:周,并且结算日是周末,则双倍奖励;
|
|
|
if (FullAttendancePeriodEnum.WEEK.equals(punchInTask.getFullAttendancePeriod()) && punchInDate.getDayOfWeek().getValue() == 7) {
|
|
if (FullAttendancePeriodEnum.WEEK.equals(punchInTask.getFullAttendancePeriod()) && punchInDate.getDayOfWeek().getValue() == 7) {
|
|
|
- fullAttendancePoints = basicPoints;
|
|
|
|
|
|
|
+ int undoneCount = punchInStatsWeek.getPunchInTotalCount() - punchInStatsWeek.getPunchInDoneCount();
|
|
|
|
|
+ if (undoneCount <= punchInTask.getFullAttendanceFaultToleranceCnt()) {
|
|
|
|
|
+ fullAttendancePoints = basicPoints;
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- // 结算周期:月,结算日是当月最后一天,则双倍奖励
|
|
|
|
|
|
|
+ // 结算周期:月,结算日是当月最后一天,则双倍奖励;
|
|
|
if (FullAttendancePeriodEnum.MONTH.equals(punchInTask.getFullAttendancePeriod()) && punchInDate.lengthOfMonth() == punchInDate.getDayOfMonth()) {
|
|
if (FullAttendancePeriodEnum.MONTH.equals(punchInTask.getFullAttendancePeriod()) && punchInDate.lengthOfMonth() == punchInDate.getDayOfMonth()) {
|
|
|
- fullAttendancePoints = basicPoints;
|
|
|
|
|
|
|
+ int undoneCount = punchInStatsMonth.getPunchInTotalCount() - punchInStatsMonth.getPunchInDoneCount();
|
|
|
|
|
+ if (undoneCount <= punchInTask.getFullAttendanceFaultToleranceCnt()) {
|
|
|
|
|
+ fullAttendancePoints = basicPoints;
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
- // TODO 无法判断容错率,要加一个专门的统计表才行,每周、每月的统计
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// 启用了法定节假日(含周末)双倍奖励
|
|
// 启用了法定节假日(含周末)双倍奖励
|
|
@@ -594,7 +612,37 @@ public class PunchInManagerImpl implements IPunchInManager {
|
|
|
holidayPoints = basicPoints;
|
|
holidayPoints = basicPoints;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- return basicPoints + fullAttendancePoints + holidayPoints;
|
|
|
|
|
|
|
+ // 连续完成额外积分
|
|
|
|
|
+ int taskPoints = 0;
|
|
|
|
|
+ if (CommonEnableStatusEnum.ENABLED.equals(punchInTask.getTaskPointsStatus()) && ConsecutiveStatusEnum.CONSECUTIVE.equals(punchInStatus.getConsecutiveStatus())) {
|
|
|
|
|
+ // punchInTaskExtList 根据InitialValue倒序排列
|
|
|
|
|
+ punchInTaskExtList.sort(Comparator.comparing(PunchInTaskExt::getInitialValue).reversed());
|
|
|
|
|
+ // 第二轮标志
|
|
|
|
|
+ boolean secondRound = false;
|
|
|
|
|
+ // 上一轮的值
|
|
|
|
|
+ int prevInitialValue = 0;
|
|
|
|
|
+ for (PunchInTaskExt punchInTaskExt : punchInTaskExtList) {
|
|
|
|
|
+ // 比较结果
|
|
|
|
|
+ int compareValue = punchInStatus.getConsecutiveDay().compareTo(punchInTaskExt.getInitialValue());
|
|
|
|
|
+ // 如果连续日期小于initialValue,则跳过
|
|
|
|
|
+ if (compareValue == -1) {
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
|
|
+ // 额外奖励数
|
|
|
|
|
+ int extraCount = 0;
|
|
|
|
|
+ // 如果连续日期大于等于initialValue,则进行第一次计算,并把第二轮标志位设置为true,第二轮/后续轮只需要用上一轮的值进行计算
|
|
|
|
|
+ if (secondRound) {
|
|
|
|
|
+ extraCount = prevInitialValue - punchInTaskExt.getInitialValue();
|
|
|
|
|
+ } else if (compareValue >= 0) {
|
|
|
|
|
+ extraCount = punchInStatus.getConsecutiveDay() - punchInTaskExt.getInitialValue() + 1;
|
|
|
|
|
+ secondRound = true;
|
|
|
|
|
+ }
|
|
|
|
|
+ taskPoints += punchInTaskExt.getExtraPoints() * extraCount;
|
|
|
|
|
+ prevInitialValue = punchInTaskExt.getInitialValue();
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return basicPoints + fullAttendancePoints + holidayPoints + taskPoints;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -660,5 +708,90 @@ public class PunchInManagerImpl implements IPunchInManager {
|
|
|
return 0;
|
|
return 0;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- // TODO 多任务结算
|
|
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public int calculatePointsInMultiTask(PunchInMultiTask punchInMultiTask, List<PunchInMultiTaskExt> punchInMultiTaskExts, PunchInMultiTaskHistory punchInMultiTaskHistory, PunchInStatus punchInStatus) {
|
|
|
|
|
+ // 未完成打卡或没有启用多任务积分计算,积分为0
|
|
|
|
|
+ if (PunchInStatusEnum.UNDONE.equals(punchInMultiTaskHistory.getPunchInStatus())
|
|
|
|
|
+ || CommonEnableStatusEnum.ENABLED.equals(punchInMultiTask.getTaskPointsStatus())) {
|
|
|
|
|
+ return 0;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 单次打卡中使用的拓展信息
|
|
|
|
|
+ List<PunchInMultiTaskExt> punchInExtList = punchInMultiTaskExts.stream().filter(v -> PunchInDimensionEnum.ONE_DAY.equals(v.getDimension())).collect(Collectors.toList());
|
|
|
|
|
+ // 打卡任务使用的拓展信息
|
|
|
|
|
+ List<PunchInMultiTaskExt> punchInTaskExtList = punchInMultiTaskExts.stream().filter(v -> PunchInDimensionEnum.MULTI_DAY.equals(v.getDimension())).collect(Collectors.toList());
|
|
|
|
|
+
|
|
|
|
|
+ // 多个任务积分=多任务基本积分+多任务额外积分+连续完成额外积分
|
|
|
|
|
+ // 基本积分
|
|
|
|
|
+ int basicPoints = punchInMultiTask.getPoints();
|
|
|
|
|
+
|
|
|
|
|
+ // 额外积分
|
|
|
|
|
+ int extraPoints = 0;
|
|
|
|
|
+ // 额外次数
|
|
|
|
|
+ int extractCount = punchInMultiTaskHistory.getPunchInDoneCount() - punchInMultiTask.getPunchInDoneCount();
|
|
|
|
|
+ // 固定计算
|
|
|
|
|
+ if (PunchInExtraMethodEnum.FIXED.equals(punchInMultiTask.getExtraMethod())) {
|
|
|
|
|
+ extraPoints = extractCount * punchInMultiTask.getExtraPoints();
|
|
|
|
|
+ }
|
|
|
|
|
+ // 区间计算
|
|
|
|
|
+ if (PunchInExtraMethodEnum.INTERVAL.equals(punchInMultiTask.getExtraMethod()) && !CollectionUtils.isEmpty(punchInMultiTaskExts)) {
|
|
|
|
|
+ // punchInTaskExtList 根据InitialValue倒序排列
|
|
|
|
|
+ punchInExtList.sort(Comparator.comparing(PunchInMultiTaskExt::getInitialValue).reversed());
|
|
|
|
|
+ // 第二轮标志
|
|
|
|
|
+ boolean secondRound = false;
|
|
|
|
|
+ // 上一轮的值
|
|
|
|
|
+ int prevInitialValue = 0;
|
|
|
|
|
+ for (PunchInMultiTaskExt punchInTaskExt : punchInTaskExtList) {
|
|
|
|
|
+ // 比较结果
|
|
|
|
|
+ int compareValue = Integer.compare(extractCount, punchInTaskExt.getInitialValue());
|
|
|
|
|
+ // 如果连续日期小于initialValue,则跳过
|
|
|
|
|
+ if (compareValue == -1) {
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
|
|
+ // 额外奖励数
|
|
|
|
|
+ int tempExtraCount = 0;
|
|
|
|
|
+ // 如果连续日期大于等于initialValue,则进行第一次计算,并把第二轮标志位设置为true,第二轮/后续轮只需要用上一轮的值进行计算
|
|
|
|
|
+ if (secondRound) {
|
|
|
|
|
+ tempExtraCount = prevInitialValue - punchInTaskExt.getInitialValue();
|
|
|
|
|
+ } else if (compareValue >= 0) {
|
|
|
|
|
+ tempExtraCount = extractCount - punchInTaskExt.getInitialValue() + 1;
|
|
|
|
|
+ secondRound = true;
|
|
|
|
|
+ }
|
|
|
|
|
+ extraPoints += punchInTaskExt.getExtraPoints() * tempExtraCount;
|
|
|
|
|
+ prevInitialValue = punchInTaskExt.getInitialValue();
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 连续完成额外积分
|
|
|
|
|
+ int taskPoints = 0;
|
|
|
|
|
+ if (CommonEnableStatusEnum.ENABLED.equals(punchInMultiTask.getTaskPointsStatus()) && ConsecutiveStatusEnum.CONSECUTIVE.equals(punchInStatus.getConsecutiveStatus())) {
|
|
|
|
|
+ // punchInTaskExtList 根据InitialValue倒序排列
|
|
|
|
|
+ punchInTaskExtList.sort(Comparator.comparing(PunchInMultiTaskExt::getInitialValue).reversed());
|
|
|
|
|
+ // 第二轮标志
|
|
|
|
|
+ boolean secondRound = false;
|
|
|
|
|
+ // 上一轮的值
|
|
|
|
|
+ int prevInitialValue = 0;
|
|
|
|
|
+ for (PunchInMultiTaskExt punchInTaskExt : punchInTaskExtList) {
|
|
|
|
|
+ // 比较结果
|
|
|
|
|
+ int compareValue = punchInStatus.getConsecutiveDay().compareTo(punchInTaskExt.getInitialValue());
|
|
|
|
|
+ // 如果连续日期小于initialValue,则跳过
|
|
|
|
|
+ if (compareValue == -1) {
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
|
|
+ // 额外奖励数
|
|
|
|
|
+ int tempExtraCount = 0;
|
|
|
|
|
+ // 如果连续日期大于等于initialValue,则进行第一次计算,并把第二轮标志位设置为true,第二轮/后续轮只需要用上一轮的值进行计算
|
|
|
|
|
+ if (secondRound) {
|
|
|
|
|
+ tempExtraCount = prevInitialValue - punchInTaskExt.getInitialValue();
|
|
|
|
|
+ } else if (compareValue >= 0) {
|
|
|
|
|
+ tempExtraCount = punchInStatus.getConsecutiveDay() - punchInTaskExt.getInitialValue() + 1;
|
|
|
|
|
+ secondRound = true;
|
|
|
|
|
+ }
|
|
|
|
|
+ taskPoints += punchInTaskExt.getExtraPoints() * tempExtraCount;
|
|
|
|
|
+ prevInitialValue = punchInTaskExt.getInitialValue();
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return basicPoints + extraPoints + taskPoints;
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|