|
|
@@ -3,6 +3,7 @@ package com.punchsettle.server.service.manager.impl;
|
|
|
import java.math.BigDecimal;
|
|
|
import java.math.RoundingMode;
|
|
|
import java.text.SimpleDateFormat;
|
|
|
+import java.time.DayOfWeek;
|
|
|
import java.time.LocalDate;
|
|
|
import java.time.LocalTime;
|
|
|
import java.time.YearMonth;
|
|
|
@@ -16,6 +17,10 @@ import java.util.Optional;
|
|
|
import java.util.function.Function;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
+import com.punchsettle.server.atomic.entity.PunchInMultiTask;
|
|
|
+import com.punchsettle.server.atomic.entity.PunchInTaskExt;
|
|
|
+import com.punchsettle.server.constant.PunchInMethodMultiEnum;
|
|
|
+import com.punchsettle.server.constant.RepeatCategoryEnum;
|
|
|
import org.springframework.beans.BeanUtils;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
@@ -56,6 +61,7 @@ import com.punchsettle.server.utiis.DateUtils;
|
|
|
import com.punchsettle.server.utiis.UserUtils;
|
|
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.springframework.util.StringUtils;
|
|
|
|
|
|
/**
|
|
|
* @author tyuio
|
|
|
@@ -436,8 +442,48 @@ public class PunchInManagerImpl implements IPunchInManager {
|
|
|
return punchInDataVO;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 判断是否是节假日
|
|
|
+ * @param date
|
|
|
+ * @return true:是节假日,false:不是节假日
|
|
|
+ */
|
|
|
+ private boolean judgeHoliday(String date) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
@Override
|
|
|
- public PunchInStatusEnum judgePunchInStatus(PunchInTask punchInTask, PunchInTaskHistory punchInTaskHistory, boolean holidayFlag) {
|
|
|
+ public boolean judgeRepeat(PunchInTask punchInTask, String repeatDateStr) {
|
|
|
+ // 每天
|
|
|
+ if (RepeatCategoryEnum.EVERYDAY.equals(punchInTask.getRepeatCategory())) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 法定工作日
|
|
|
+ if (RepeatCategoryEnum.WORKDAY.equals(punchInTask.getRepeatCategory())) {
|
|
|
+ return !judgeHoliday(repeatDateStr);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 法定节假日(含周末)
|
|
|
+ if (RepeatCategoryEnum.HOLIDAY.equals(punchInTask.getRepeatCategory())) {
|
|
|
+ return !judgeHoliday(repeatDateStr);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 自定义
|
|
|
+ if (RepeatCategoryEnum.CUSTOM.equals(punchInTask.getRepeatCategory())) {
|
|
|
+ if (!StringUtils.hasText(punchInTask.getRepeatCustomDay())) {
|
|
|
+ BusinessException.throwFail(String.format("打卡任务ID:%s, 重复周期类型:自定义重复,没有设定自定义重复日期"));
|
|
|
+ }
|
|
|
+
|
|
|
+ LocalDate repeatDate = LocalDate.parse(repeatDateStr);
|
|
|
+ int dayOfWeekValue = repeatDate.getDayOfWeek().getValue();
|
|
|
+ return punchInTask.getRepeatCustomDay().contains(String.valueOf(dayOfWeekValue));
|
|
|
+ }
|
|
|
+
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public PunchInStatusEnum judgePunchInStatusInTask(PunchInTask punchInTask, PunchInTaskHistory punchInTaskHistory, boolean holidayFlag) {
|
|
|
Assert.isNullInBusiness(punchInTask, "打卡任务不能为空 ");
|
|
|
// 没有打卡记录,直接没完成
|
|
|
if (Objects.isNull(punchInTaskHistory)) {
|
|
|
@@ -456,33 +502,89 @@ public class PunchInManagerImpl implements IPunchInManager {
|
|
|
|
|
|
// 计数打卡,要区分是否节假日使用不同的判断标准
|
|
|
if (PunchInMethodEnum.COUNT.equals(punchInTask.getPunchInMethod())) {
|
|
|
-
|
|
|
- int countTrackTarget = Optional.ofNullable(enableHolidayFlag ? punchInTask.getHolidayCountTrack() : punchInTask.getCountTrack()).orElse(0);
|
|
|
- int countTrack = Optional.ofNullable(punchInTaskHistory.getCountTrack()).orElse(0);
|
|
|
- if (CompareRuleEnum.GTE.equals(punchInTask.getCompareRule()) && )
|
|
|
- if (PunchInRuleEnum.GREATER_OR_EQUAL.equals(punchIn.getRule()) && recordCountTrack.compareTo(punchIn.getCountTrack()) == -1) {
|
|
|
- return PunchInStatusV1Enum.UN_FINISH;
|
|
|
+ int countTrack = enableHolidayFlag ? punchInTask.getHolidayCountTrack() : punchInTask.getCountTrack();
|
|
|
+ int punchInCountTrack = Optional.ofNullable(punchInTaskHistory.getCountTrack()).orElse(0);
|
|
|
+ if (CompareRuleEnum.GTE.equals(punchInTask.getCompareRule()) && punchInCountTrack >= countTrack) {
|
|
|
+ return PunchInStatusEnum.DONE;
|
|
|
}
|
|
|
- if (PunchInRuleEnum.LESS_OR_EQUAL.equals(punchIn.getRule()) && recordCountTrack.compareTo(punchIn.getCountTrack()) == 1) {
|
|
|
- return PunchInStatusV1Enum.UN_FINISH;
|
|
|
+ if (CompareRuleEnum.LTE.equals(punchInTask.getCompareRule()) && punchInCountTrack <= countTrack) {
|
|
|
+ return PunchInStatusEnum.DONE;
|
|
|
}
|
|
|
-
|
|
|
- return PunchInStatusV1Enum.FINISH;
|
|
|
+ return PunchInStatusEnum.UNDONE;
|
|
|
}
|
|
|
|
|
|
// 计时打卡,要区分是否节假日使用不同的判断标准
|
|
|
- if (PunchInCategoryEnum.TIME.equals(punchIn.getCategory())) {
|
|
|
- LocalTime recordTimeTrack = Optional.ofNullable(punchInRecord.getTimeTrack()).orElse(LocalTime.parse("00:00:00.000"));
|
|
|
- if (PunchInRuleEnum.GREATER_OR_EQUAL.equals(punchIn.getRule()) && recordTimeTrack.compareTo(punchIn.getTimeTrack()) == -1) {
|
|
|
- return PunchInStatusV1Enum.UN_FINISH;
|
|
|
+ if (PunchInCategoryEnum.TIME.equals(punchInTask.getPunchInMethod())) {
|
|
|
+ LocalTime timeTrack = enableHolidayFlag ? punchInTask.getHolidayTimeTrack() : punchInTask.getTimeTrack();
|
|
|
+ LocalTime punchInTimeTrack = Optional.ofNullable(punchInTaskHistory.getTimeTrack()).orElse(LocalTime.parse("00:00:00.000"));
|
|
|
+ if (CompareRuleEnum.GTE.equals(punchInTask.getCompareRule()) && punchInTimeTrack.compareTo(timeTrack) > -1) {
|
|
|
+ return PunchInStatusEnum.DONE;
|
|
|
}
|
|
|
- if (PunchInRuleEnum.LESS_OR_EQUAL.equals(punchIn.getRule()) && recordTimeTrack.compareTo(punchIn.getTimeTrack()) == 1) {
|
|
|
- return PunchInStatusV1Enum.UN_FINISH;
|
|
|
+ if (CompareRuleEnum.LTE.equals(punchInTask.getCompareRule()) && punchInTimeTrack.compareTo(timeTrack) < 1) {
|
|
|
+ return PunchInStatusEnum.DONE;
|
|
|
}
|
|
|
|
|
|
- return PunchInStatusV1Enum.FINISH;
|
|
|
+ return PunchInStatusEnum.UNDONE;
|
|
|
}
|
|
|
|
|
|
return PunchInStatusEnum.UNDONE;
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 默认打卡完成率
|
|
|
+ */
|
|
|
+ private static final BigDecimal DEFAULT_PUNCH_IN_DONE_RATE = new BigDecimal("101.00");
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public PunchInStatusEnum judgePunchInStatusInMultiTask(PunchInMultiTask punchInMultiTask, List<PunchInTaskHistory> punchInTaskHistoryList, int multiTaskNum) {
|
|
|
+ if (CollectionUtils.isEmpty(punchInTaskHistoryList) || multiTaskNum == 0) {
|
|
|
+ return PunchInStatusEnum.UNDONE;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 完成的打卡数量
|
|
|
+ long punchInDoneCount = punchInTaskHistoryList.stream().filter(v -> PunchInStatusEnum.DONE.equals(v.getPunchInStatus())).count();
|
|
|
+
|
|
|
+ // 次数,当天打卡次数大于等于设置的次数,则完成打卡
|
|
|
+ if (PunchInMethodMultiEnum.COUNT.equals(punchInMultiTask.getPunchInMethod())) {
|
|
|
+ // 没有设置时默认设置一个较大的数,避免出现打卡次数为0的情况
|
|
|
+ Integer doneCount = Optional.ofNullable(punchInMultiTask.getPunchInDoneCount()).orElse(punchInTaskHistoryList.size() + 1);
|
|
|
+ return punchInDoneCount >= doneCount ? PunchInStatusEnum.DONE : PunchInStatusEnum.UNDONE;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 比率,当天打卡完成比率大于等于设置的比率,则完成打卡
|
|
|
+
|
|
|
+ if (PunchInMethodMultiEnum.RATE.equals(punchInMultiTask.getPunchInMethod())) {
|
|
|
+ // 没有设置时默认设置一个较大的数,避免出现打卡完成率为0的情况
|
|
|
+ BigDecimal doneRate = Optional.ofNullable(punchInMultiTask.getPunchInDoneRate()).orElse(DEFAULT_PUNCH_IN_DONE_RATE);
|
|
|
+ BigDecimal punchInDoneRate = BigDecimal.valueOf(punchInDoneCount).divide(BigDecimal.valueOf(multiTaskNum), 2, RoundingMode.HALF_UP);
|
|
|
+ return punchInDoneRate.compareTo(doneRate) > -1 ? PunchInStatusEnum.DONE : PunchInStatusEnum.UNDONE;
|
|
|
+ }
|
|
|
+
|
|
|
+ return PunchInStatusEnum.UNDONE;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public int calculatePointsInTask(PunchInTask punchInTask, PunchInTaskExt punchInTaskExt, PunchInTaskHistory punchInTaskHistory) {
|
|
|
+ // 未完成打卡,积分为0
|
|
|
+ if (PunchInStatusEnum.UNDONE.equals(punchInTaskHistory.getPunchInStatus())) {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 单个任务积分=基本积分+(可选)额外积分+(可选)连续完成额外积分+法定节假日(含周末)双倍奖励+全勤双倍奖励
|
|
|
+ int points = Optional.ofNullable(punchInTask.getPoints()).orElse(0);
|
|
|
+
|
|
|
+ // 启用了全勤奖励
|
|
|
+ if (CommonStatusEnum.ENABLED.equals(punchInTask.getFullAttendanceStatus())) {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ // 启用了法定节假日(含周末)双倍奖励
|
|
|
+ if (CommonStatusEnum.ENABLED.equals(punchInTask.getHolidayStatus()) && judgeHoliday(punchInTaskHistory.getPunchInDate())) {
|
|
|
+ points *= 2;
|
|
|
+ }
|
|
|
+
|
|
|
+ return points;
|
|
|
+ }
|
|
|
+
|
|
|
+ // TODO 多任务结算
|
|
|
}
|