|
|
@@ -1,484 +1,405 @@
|
|
|
package com.punchsettle.server.service.manager.impl;
|
|
|
|
|
|
-import java.sql.Timestamp;
|
|
|
-import java.text.SimpleDateFormat;
|
|
|
-import java.time.LocalDate;
|
|
|
-import java.time.LocalTime;
|
|
|
-import java.util.ArrayList;
|
|
|
-import java.util.List;
|
|
|
-import java.util.Map;
|
|
|
-import java.util.Objects;
|
|
|
-import java.util.Optional;
|
|
|
-import java.util.function.Function;
|
|
|
-import java.util.stream.Collectors;
|
|
|
-
|
|
|
-import org.springframework.beans.BeanUtils;
|
|
|
+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.PunchInTask;
|
|
|
+import com.punchsettle.server.atomic.entity.PunchInTaskExt;
|
|
|
+import com.punchsettle.server.atomic.entity.PunchInTaskHistory;
|
|
|
+import com.punchsettle.server.common.constant.CommonEnableStatusEnum;
|
|
|
+import com.punchsettle.server.constant.ConsecutiveStatusEnum;
|
|
|
+import com.punchsettle.server.constant.FullAttendancePeriodEnum;
|
|
|
+import com.punchsettle.server.constant.PunchInDimensionEnum;
|
|
|
+import com.punchsettle.server.constant.PunchInExtraMethodEnum;
|
|
|
+import com.punchsettle.server.constant.PunchInMethodEnum;
|
|
|
+import com.punchsettle.server.constant.PunchInStatusEnum;
|
|
|
+import com.punchsettle.server.service.manager.ICalendarManager;
|
|
|
+import com.punchsettle.server.service.manager.ISettleManager;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
-import org.springframework.transaction.annotation.Transactional;
|
|
|
import org.springframework.util.CollectionUtils;
|
|
|
|
|
|
-import com.punchsettle.server.atomic.entity.PunchIn;
|
|
|
-import com.punchsettle.server.atomic.entity.PunchInRecord;
|
|
|
-import com.punchsettle.server.atomic.entity.PunchInRecordSettlementRela;
|
|
|
-import com.punchsettle.server.atomic.entity.PunchInSettlement;
|
|
|
-import com.punchsettle.server.atomic.entity.SettlementTask;
|
|
|
-import com.punchsettle.server.atomic.entity.User;
|
|
|
-import com.punchsettle.server.atomic.service.IPunchInRecordService;
|
|
|
-import com.punchsettle.server.atomic.service.IPunchInRecordSettlementRelaService;
|
|
|
-import com.punchsettle.server.atomic.service.IPunchInService;
|
|
|
-import com.punchsettle.server.atomic.service.IPunchInSettlementService;
|
|
|
-import com.punchsettle.server.atomic.service.ISettlementTaskService;
|
|
|
-import com.punchsettle.server.atomic.service.IUserService;
|
|
|
-import com.punchsettle.server.common.exception.BusinessException;
|
|
|
-import com.punchsettle.server.common.utils.Assert;
|
|
|
-import com.punchsettle.server.constant.PunchInCategoryEnum;
|
|
|
-import com.punchsettle.server.constant.PunchInRuleEnum;
|
|
|
-import com.punchsettle.server.constant.PunchInSettleTypeEnum;
|
|
|
-import com.punchsettle.server.constant.PunchInStatusV1Enum;
|
|
|
-import com.punchsettle.server.pojo.punchin.PunchInQuery;
|
|
|
-import com.punchsettle.server.pojo.punchin.PunchInRecordQuery;
|
|
|
-import com.punchsettle.server.pojo.settle.SettleInfoDto;
|
|
|
-import com.punchsettle.server.pojo.settle.SettleQuery;
|
|
|
-import com.punchsettle.server.pojo.settle.SettleRequest;
|
|
|
-import com.punchsettle.server.pojo.settle.SettleResultDto;
|
|
|
-import com.punchsettle.server.pojo.settle.SettleVO;
|
|
|
-import com.punchsettle.server.service.manager.ISettleManager;
|
|
|
-import com.punchsettle.server.utiis.DateUtils;
|
|
|
-import com.punchsettle.server.utiis.SpringUtils;
|
|
|
-
|
|
|
-import lombok.extern.slf4j.Slf4j;
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.math.RoundingMode;
|
|
|
+import java.time.LocalDate;
|
|
|
+import java.time.temporal.ChronoUnit;
|
|
|
+import java.util.Comparator;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Optional;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
|
* @author tyuio
|
|
|
* @version 1.0.0
|
|
|
+ * @date 2025/4/15 14:25
|
|
|
* @description 结算服务类
|
|
|
- * @date 2024/12/12 22:29
|
|
|
*/
|
|
|
@Slf4j
|
|
|
@Service
|
|
|
public class SettleManagerImpl implements ISettleManager {
|
|
|
|
|
|
@Autowired
|
|
|
- private IPunchInService punchInService;
|
|
|
-
|
|
|
- @Autowired
|
|
|
- private IPunchInRecordService punchInRecordService;
|
|
|
-
|
|
|
- @Autowired
|
|
|
- private IUserService userService;
|
|
|
-
|
|
|
- @Autowired
|
|
|
- private IPunchInSettlementService punchInSettlementService;
|
|
|
-
|
|
|
- @Autowired
|
|
|
- private ISettlementTaskService settlementTaskService;
|
|
|
-
|
|
|
- @Autowired
|
|
|
- private IPunchInRecordSettlementRelaService punchInRecordSettlementRelaService;
|
|
|
+ private ICalendarManager calendarManager;
|
|
|
|
|
|
@Override
|
|
|
- @Transactional(rollbackFor = Exception.class)
|
|
|
- public void settleHandler(PunchInSettleTypeEnum settleType, LocalDate settleDate, List<Long> userIds, List<Long> punchInIds) {
|
|
|
- if (Objects.isNull(settleType)) {
|
|
|
- log.info("结算任务异常,原因:没有指定结算类型");
|
|
|
- return;
|
|
|
+ public int calculatePointsInTask(PunchInTask punchInTask, List<PunchInTaskExt> punchInTaskExtList,
|
|
|
+ PunchInTaskHistory punchInTaskHistory, PunchInStatsWeek punchInStatsWeek, PunchInStatsMonth punchInStatsMonth,
|
|
|
+ PunchInStatus punchInStatus) {
|
|
|
+ // 未完成打卡,积分为0
|
|
|
+ if (PunchInStatusEnum.UNDONE.equals(punchInTaskHistory.getPunchInStatus())) {
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
- if (Objects.isNull(settleDate)) {
|
|
|
- log.info("结算任务异常,原因:没有指定结算日期");
|
|
|
- return;
|
|
|
- }
|
|
|
+ // 节假日标识
|
|
|
+ var holidayFlag = calendarManager.judgeHoliday(punchInTaskHistory.getPunchInDate());
|
|
|
|
|
|
- if (settleDate.isAfter(LocalDate.now())) {
|
|
|
- BusinessException.throwFail(String.format("结算任务异常,原因:结算日期{} 不能大于等于今天", settleDate));
|
|
|
- }
|
|
|
+ // 单个任务积分=基本积分+额外积分+法定节假日(含周末)双倍奖励+全勤双倍奖励+连续完成额外积分
|
|
|
+ // 基本积分
|
|
|
+ int basicPoints = Optional.ofNullable(punchInTask.getPoints()).orElse(0);
|
|
|
|
|
|
- log.info("结算任务开始,结算类型:{}, 结算日期:{}", settleType.getName(), settleDate);
|
|
|
- Timestamp settleStartTime = new Timestamp(System.currentTimeMillis());
|
|
|
-
|
|
|
- SettleInfoDto settleInfo = new SettleInfoDto(settleType, settleDate);
|
|
|
-
|
|
|
- // 读取用户数据,如果userIds为空则结算所有的用户
|
|
|
- userIds = Optional.ofNullable(userIds).orElseGet(() -> {
|
|
|
- PunchInRecordQuery recordQuery = new PunchInRecordQuery();
|
|
|
- recordQuery.setStartDate(settleInfo.getSettleDateStr());
|
|
|
- recordQuery.setEndDate(settleInfo.getSettleDateStr());
|
|
|
- List<PunchInRecord> punchInRecords = punchInRecordService.listByCondition(recordQuery);
|
|
|
- return punchInRecords.stream().map(PunchInRecord::getCreatedBy).collect(Collectors.toList());
|
|
|
- });
|
|
|
- List<User> users = userService.listByIds(userIds);
|
|
|
- if (CollectionUtils.isEmpty(users)) {
|
|
|
- log.info("结算任务结束,原因:没有找到待结算的用户信息");
|
|
|
- return;
|
|
|
- }
|
|
|
+ // 额外积分计算
|
|
|
+ List<PunchInTaskExt> punchInOneExtList = punchInTaskExtList.stream()
|
|
|
+ .filter(v -> PunchInDimensionEnum.ONE_DAY.equals(v.getDimension())).collect(Collectors.toList());
|
|
|
+ basicPoints += calculateExtraPointsInTask(punchInTask, punchInOneExtList, punchInTaskHistory, holidayFlag);
|
|
|
|
|
|
- // 读取用户的打卡任务,如果punchIds为空则结算用户所有的打卡任务
|
|
|
- PunchInQuery punchInQuery = new PunchInQuery();
|
|
|
- punchInQuery.setUserIds(userIds);
|
|
|
- if (!CollectionUtils.isEmpty(punchInIds)) {
|
|
|
- punchInQuery.setPunchInIds(punchInIds);
|
|
|
- }
|
|
|
- List<PunchIn> punchIns = punchInService.listByCondition(punchInQuery);
|
|
|
- if (CollectionUtils.isEmpty(punchIns)) {
|
|
|
- log.info("结算任务结束,原因:没有找到打卡任务");
|
|
|
- return;
|
|
|
- }
|
|
|
- // 获取最新的打卡任务ID
|
|
|
- punchInIds = punchIns.stream().map(PunchIn::getId).collect(Collectors.toList());
|
|
|
-
|
|
|
- // 获取结算日的打卡记录
|
|
|
- PunchInRecordQuery recordQuery = new PunchInRecordQuery();
|
|
|
- recordQuery.setStartDate(settleInfo.getSettleDateStr());
|
|
|
- recordQuery.setEndDate(settleInfo.getSettleDateStr());
|
|
|
- recordQuery.setPunchInIds(punchInIds);
|
|
|
- List<PunchInRecord> punchInRecords = punchInRecordService.listByCondition(recordQuery);
|
|
|
- if (CollectionUtils.isEmpty(punchInRecords) && !PunchInSettleTypeEnum.REMAKE.equals(settleInfo.getSettleType())) {
|
|
|
- log.info("结算任务结束,原因:没有打卡记录");
|
|
|
- return;
|
|
|
+ // 全勤积分,全勤则双倍奖励
|
|
|
+ int fullAttendancePoints = 0;
|
|
|
+ if (judgeFullAttendanceStatusInTask(punchInTask, punchInTaskHistory, punchInStatsWeek, punchInStatsMonth)) {
|
|
|
+ fullAttendancePoints = basicPoints;
|
|
|
}
|
|
|
|
|
|
- // 获取一周的打卡记录
|
|
|
- Map<Long, List<PunchInRecord>> weeklyPunchInRecords = Map.of();
|
|
|
- if (settleInfo.getSundayFlag() || PunchInSettleTypeEnum.REMAKE.equals(settleInfo.getSettleType())) {
|
|
|
- PunchInRecordQuery weeklyRecordQuery = new PunchInRecordQuery();
|
|
|
- weeklyRecordQuery.setPunchInIds(punchInIds);
|
|
|
- weeklyRecordQuery.setStartDate(DateUtils.getLastWeekMonday(settleInfo.getSettleDate()).toString());
|
|
|
- weeklyRecordQuery.setEndDate(DateUtils.getLastWeekSunday(settleInfo.getSettleDate()).toString());
|
|
|
- List<PunchInRecord> punchInRecordForWeeks = punchInRecordService.listByCondition(weeklyRecordQuery);
|
|
|
- if (!CollectionUtils.isEmpty(punchInRecordForWeeks)) {
|
|
|
- weeklyPunchInRecords = punchInRecordForWeeks.stream().collect(Collectors.groupingBy(PunchInRecord::getPunchInId));
|
|
|
- }
|
|
|
+ // 法定节假日积分, 法定节假日(含周末)双倍奖励
|
|
|
+ int holidayPoints = 0;
|
|
|
+ if (CommonEnableStatusEnum.ENABLED.equals(punchInTask.getHolidayStatus())
|
|
|
+ && calendarManager.judgeHoliday(punchInTaskHistory.getPunchInDate())) {
|
|
|
+ holidayPoints = basicPoints;
|
|
|
}
|
|
|
|
|
|
- // 用户-打卡任务分组
|
|
|
- Map<Long, List<PunchIn>> userPunchInMap = punchIns.stream().collect(Collectors.groupingBy(PunchIn::getCreatedBy));
|
|
|
- // 打卡任务-打卡记录 map
|
|
|
- Map<Long, PunchInRecord> punchInRecordMap = punchInRecords.stream().collect(Collectors.toMap(PunchInRecord::getPunchInId, Function.identity(), (key1, key2) -> key1));
|
|
|
-
|
|
|
- // 先创建结算任务执行记录
|
|
|
- SettlementTask settlementTask = new SettlementTask();
|
|
|
- settlementTask.setSettleDate(settleDate.toString());
|
|
|
- settlementTask.setStartTime(settleStartTime);
|
|
|
- settlementTask.setProcessedNum(users.size());
|
|
|
- settlementTaskService.insert(settlementTask);
|
|
|
-
|
|
|
- // 结算
|
|
|
- List<SettleResultDto> settleResultDtoList = new ArrayList<>();
|
|
|
- for (User user : users) {
|
|
|
- SettleResultDto settleResult = settle(settleInfo, user, userPunchInMap.get(user.getId()), punchInRecordMap, weeklyPunchInRecords);
|
|
|
- settleResultDtoList.add(settleResult);
|
|
|
- }
|
|
|
+ // 打卡任务使用的拓展信息
|
|
|
+ List<PunchInTaskExt> punchInMultiExtList = punchInTaskExtList.stream()
|
|
|
+ .filter(v -> PunchInDimensionEnum.MULTI_DAY.equals(v.getDimension())).collect(Collectors.toList());
|
|
|
+ // 连续完成额外积分
|
|
|
+ int taskPoints = calculateConsecutivePointsInTask(punchInTask, punchInMultiExtList, punchInStatus);
|
|
|
|
|
|
- // 更新数据
|
|
|
- // 待更新的用户
|
|
|
- List<User> updateUsers = new ArrayList<>();
|
|
|
- // 待更新的打卡记录
|
|
|
- List<PunchInRecord> updatePunchInRecords = new ArrayList<>();
|
|
|
- // 待新增的打卡记录
|
|
|
- List<PunchInRecord> addPunchInRecords = new ArrayList<>();
|
|
|
- // 待新增的打卡结算信息
|
|
|
- List<PunchInSettlement> addPunchInSettlements = new ArrayList<>();
|
|
|
-
|
|
|
- for (SettleResultDto settleResult : settleResultDtoList) {
|
|
|
- updateUsers.add(settleResult.getUpdateUser());
|
|
|
- addPunchInRecords.addAll(settleResult.getAddPunchInRecords());
|
|
|
- updatePunchInRecords.addAll(settleResult.getUpdatePunchInRecords());
|
|
|
- addPunchInSettlements.add(settleResult.getAddPunchInSettlement());
|
|
|
- }
|
|
|
+ return basicPoints + fullAttendancePoints + holidayPoints + taskPoints;
|
|
|
+ }
|
|
|
|
|
|
- // 更新用户奖励信息
|
|
|
- if (!CollectionUtils.isEmpty(updateUsers)) {
|
|
|
- userService.batchUpdateUser(updateUsers);
|
|
|
+ /**
|
|
|
+ * 计算额外积分
|
|
|
+ *
|
|
|
+ * @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;
|
|
|
}
|
|
|
|
|
|
- // 新增打卡记录
|
|
|
- if (!CollectionUtils.isEmpty(addPunchInRecords)) {
|
|
|
- punchInRecordService.batchInsert(addPunchInRecords);
|
|
|
- }
|
|
|
+ // 计算超出部分,获取额外次数
|
|
|
+ int extraCount = getExtraCountInTask(punchInTask, punchInTaskHistory, holidayFlag);
|
|
|
|
|
|
- // 更新已有的打卡记录
|
|
|
- if (!CollectionUtils.isEmpty(updatePunchInRecords)) {
|
|
|
- punchInRecordService.batchUpdate(updatePunchInRecords);
|
|
|
+ // 如果等于0则没有超出部分,不用计算
|
|
|
+ if (extraCount == 0) {
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
- // 新增结算信息
|
|
|
- if (!CollectionUtils.isEmpty(addPunchInSettlements)) {
|
|
|
- // 补充本次的计算任务ID
|
|
|
- addPunchInSettlements.stream().forEach(v -> v.setSettlementTaskId(settlementTask.getId()));
|
|
|
- punchInSettlementService.batchInsert(addPunchInSettlements);
|
|
|
+ // 固定计算
|
|
|
+ if (PunchInExtraMethodEnum.FIXED.equals(punchInTask.getExtraMethod())) {
|
|
|
+ Integer extraPoints = Optional.ofNullable(punchInTask.getExtraPoints()).orElse(0);
|
|
|
+ return extraCount * extraPoints;
|
|
|
}
|
|
|
|
|
|
- // 新增关联信息
|
|
|
- if (!CollectionUtils.isEmpty(settleResultDtoList)) {
|
|
|
- List<PunchInRecordSettlementRela> relaList = buildPunchInRecordSettlementRelaList(settleResultDtoList);
|
|
|
- if (!CollectionUtils.isEmpty(relaList)) {
|
|
|
- punchInRecordSettlementRelaService.batchInsert(relaList);
|
|
|
+ // 区间计算
|
|
|
+ if (PunchInExtraMethodEnum.INTERVAL.equals(punchInTask.getExtraMethod())
|
|
|
+ && !CollectionUtils.isEmpty(punchInTaskExtList)) {
|
|
|
+ // 任务积分
|
|
|
+ int extraPoints = 0;
|
|
|
+ // 第二轮标志
|
|
|
+ boolean secondRound = false;
|
|
|
+ // 上一轮的值
|
|
|
+ int prevInitialValue = 0;
|
|
|
+ // 拓展信息 根据InitialValue倒序排列
|
|
|
+ punchInTaskExtList.sort(Comparator.comparing(PunchInTaskExt::getInitialValue).reversed());
|
|
|
+ // 使用区间计算的方式
|
|
|
+ for (PunchInTaskExt punchInTaskExt : punchInTaskExtList) {
|
|
|
+ // 比较结果
|
|
|
+ int compareValue = Integer.compare(extraCount, punchInTaskExt.getInitialValue());
|
|
|
+ // 如果连续日期小于initialValue,则跳过
|
|
|
+ if (compareValue == -1) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ // 额外奖励数
|
|
|
+ int tempExtraCount = 0;
|
|
|
+ // 如果连续日期大于等于initialValue,则进行第一次计算,并把第二轮标志位设置为true,第二轮/后续轮只需要用上一轮的值进行计算
|
|
|
+ if (secondRound) {
|
|
|
+ tempExtraCount = prevInitialValue - punchInTaskExt.getInitialValue();
|
|
|
+ } else if (compareValue >= 0) {
|
|
|
+ tempExtraCount = extraCount - punchInTaskExt.getInitialValue() + 1;
|
|
|
+ secondRound = true;
|
|
|
+ }
|
|
|
+ // 计算 任务积分
|
|
|
+ extraPoints += punchInTaskExt.getExtraPoints() * tempExtraCount;
|
|
|
+ // 记录本轮的initialValue
|
|
|
+ prevInitialValue = punchInTaskExt.getInitialValue();
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- // 构造并新增结算任务信息
|
|
|
- settlementTask.setProcessedSettleNum(addPunchInSettlements.size());
|
|
|
- settlementTask.setProcessedUnsettleNum(settlementTask.getProcessedNum() - settlementTask.getProcessedSettleNum());
|
|
|
- settlementTask.setEndTime(new Timestamp(System.currentTimeMillis()));
|
|
|
- settlementTaskService.update(settlementTask);
|
|
|
+ return extraPoints;
|
|
|
+ }
|
|
|
|
|
|
- log.info("结算任务结束");
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 结算
|
|
|
- * @param settleInfo 结算基本信息
|
|
|
- * @param user 待结算的用户
|
|
|
- * @param punchIns 打卡任务
|
|
|
- * @param punchInRecordMap 打卡任务-打卡记录 map
|
|
|
- * @param weeklyPunchInRecordMap 打卡任务-一周打卡记录 map
|
|
|
+ * 获取额外次数
|
|
|
+ *
|
|
|
+ * @param punchInTask 打卡任务
|
|
|
+ * @param punchInTaskHistory 打卡记录
|
|
|
+ * @param holidayFlag 是否是法定节假日 true-是,false-不是
|
|
|
* @return
|
|
|
*/
|
|
|
- private SettleResultDto settle(SettleInfoDto settleInfo, User user, List<PunchIn> punchIns, Map<Long, PunchInRecord> punchInRecordMap, Map<Long, List<PunchInRecord>> weeklyPunchInRecordMap) {
|
|
|
- // 结算奖励数
|
|
|
- int settleRewardNum = 0;
|
|
|
- // 待更新的打卡记录
|
|
|
- List<PunchInRecord> updatePunchInRecords = new ArrayList<>();
|
|
|
- // 待新增的打卡记录
|
|
|
- List<PunchInRecord> addPunchInRecords = new ArrayList<>();
|
|
|
- // 结算
|
|
|
- for (PunchIn punchIn : punchIns) {
|
|
|
- // 获取打卡记录
|
|
|
- PunchInRecord punchInRecord = punchInRecordMap.get(punchIn.getId());
|
|
|
- // 不是补打卡且不存在打卡记录直接跳过,无须结算和更新记录状态
|
|
|
- if (!PunchInSettleTypeEnum.REMAKE.equals(settleInfo.getSettleType()) && Objects.isNull(punchInRecord)) {
|
|
|
- continue;
|
|
|
- }
|
|
|
- // 判断是否满足打卡规则
|
|
|
- PunchInStatusV1Enum punchInStatus = judgePunchInStatus(punchIn, punchInRecord);
|
|
|
- // 不是补卡或打卡任务未完成,则跳过
|
|
|
- if (!PunchInSettleTypeEnum.REMAKE.equals(settleInfo.getSettleType()) && PunchInStatusV1Enum.UN_FINISH.equals(punchInStatus)) {
|
|
|
- PunchInRecord updatePunchInRecord = buildPunchInRecordForSettle(punchIn);
|
|
|
- updatePunchInRecord.setId(punchInRecord.getId());
|
|
|
- updatePunchInRecord.setPunchInStatus(punchInStatus);
|
|
|
- updatePunchInRecords.add(updatePunchInRecord);
|
|
|
- continue;
|
|
|
- }
|
|
|
-
|
|
|
- // 补打卡,完全没有打卡记录则需要补充打卡记录
|
|
|
- if (PunchInSettleTypeEnum.REMAKE.equals(settleInfo.getSettleType()) && Objects.isNull(punchInRecord)) {
|
|
|
- punchInRecord = buildPunchInRecordForSettle(punchIn);
|
|
|
- punchInRecord.setPunchInId(punchIn.getId());
|
|
|
- punchInRecord.setPunchInDate(settleInfo.getSettleDateStr());
|
|
|
- punchInRecord.setPunchInStatus(PunchInStatusV1Enum.REMAKE_FINISH);
|
|
|
- addPunchInRecords.add(punchInRecord);
|
|
|
- }
|
|
|
-
|
|
|
- // 补打卡,已有打卡记录但是不满足打卡规则,则需要对打卡记录做准备
|
|
|
- if (PunchInSettleTypeEnum.REMAKE.equals(settleInfo.getSettleType()) && PunchInStatusV1Enum.UN_FINISH.equals(punchInStatus)) {
|
|
|
- fillTrack(punchIn, punchInRecord);
|
|
|
- }
|
|
|
-
|
|
|
- // 不是补卡,且打卡状态为完成,需要更新打卡状态为完成
|
|
|
- if (Objects.isNull(punchInRecord.getPunchInStatus()) || PunchInStatusV1Enum.DOING.equals(punchInRecord.getPunchInStatus())) {
|
|
|
- PunchInRecord updatePunchInRecord = buildPunchInRecordForSettle(punchIn);
|
|
|
- updatePunchInRecord.setId(punchInRecord.getId());
|
|
|
- updatePunchInRecord.setPunchInStatus(punchInStatus);
|
|
|
- updatePunchInRecords.add(updatePunchInRecord);
|
|
|
- }
|
|
|
-
|
|
|
- // 周末双倍奖励,否则计算普通奖励
|
|
|
- settleRewardNum += settleInfo.getWeekendFlag() && punchIn.getWeekendDoubleFlag() ? punchIn.getRewardNum() * 2 : punchIn.getRewardNum();
|
|
|
- // 计算全勤双倍奖励
|
|
|
- if (judgeFullAttendance(settleInfo, punchIn, weeklyPunchInRecordMap)) {
|
|
|
- settleRewardNum += punchIn.getRewardNum() * 2;
|
|
|
- }
|
|
|
+ private int getExtraCountInTask(PunchInTask punchInTask, PunchInTaskHistory punchInTaskHistory,
|
|
|
+ boolean holidayFlag) {
|
|
|
+ int extraCount = 0;
|
|
|
+ // 计数打卡
|
|
|
+ if (PunchInMethodEnum.COUNT.equals(punchInTask.getPunchInMethod())) {
|
|
|
+ extraCount = punchInTaskHistory.getCountTrack()
|
|
|
+ - (holidayFlag ? punchInTask.getHolidayCountTrack() : punchInTask.getCountTrack());
|
|
|
}
|
|
|
-
|
|
|
- // 计算结算前后,用户奖励数的变化
|
|
|
-// int beforeSettleRewardNum = user.getUnclaimedRewardNum();
|
|
|
- int beforeSettleRewardNum = 0;
|
|
|
- int afterSettleRewardNum = beforeSettleRewardNum + settleRewardNum;
|
|
|
-// int totalRewardNum = user.getTotalRewardNum() + settleRewardNum;
|
|
|
- int totalRewardNum = 0;
|
|
|
-
|
|
|
- // 构造结算信息
|
|
|
- PunchInSettlement addPunchInSettlement = new PunchInSettlement();
|
|
|
- addPunchInSettlement.setUserId(user.getId());
|
|
|
- addPunchInSettlement.setSettleRewardNum(settleRewardNum);
|
|
|
- addPunchInSettlement.setSettlementTime(new Timestamp(System.currentTimeMillis()));
|
|
|
- addPunchInSettlement.setBeforeSettleRewardNum(beforeSettleRewardNum);
|
|
|
- addPunchInSettlement.setAfterSettleRewardNum(afterSettleRewardNum);
|
|
|
-
|
|
|
- // 构造用户奖励信息
|
|
|
- User updateUser = new User();
|
|
|
- updateUser.setId(user.getId());
|
|
|
-// updateUser.setTotalRewardNum(totalRewardNum);
|
|
|
-// updateUser.setUnclaimedRewardNum(afterSettleRewardNum);
|
|
|
-
|
|
|
- SettleResultDto settleResultDto = new SettleResultDto();
|
|
|
- settleResultDto.setUpdateUser(updateUser);
|
|
|
- settleResultDto.setAddPunchInRecords(addPunchInRecords);
|
|
|
- settleResultDto.setUpdatePunchInRecords(updatePunchInRecords);
|
|
|
- settleResultDto.setAddPunchInSettlement(addPunchInSettlement);
|
|
|
- return settleResultDto;
|
|
|
+ // 计时打卡
|
|
|
+ if (PunchInMethodEnum.TIMING.equals(punchInTask.getPunchInMethod())) {
|
|
|
+ // 超出的时间按照时间间隔转换成次数
|
|
|
+ long timeTrack = punchInTaskHistory.getTimeTrack().until(
|
|
|
+ (holidayFlag ? punchInTask.getHolidayTimeTrack() : punchInTask.getTimeTrack()), ChronoUnit.MINUTES);
|
|
|
+ extraCount = BigDecimal.valueOf(timeTrack)
|
|
|
+ .divide(BigDecimal.valueOf(punchInTask.getExtraTimeStep()), 0, RoundingMode.FLOOR).intValue();
|
|
|
+ }
|
|
|
+ return extraCount;
|
|
|
}
|
|
|
|
|
|
- @Override
|
|
|
- public PunchInStatusV1Enum judgePunchInStatus(PunchIn punchIn, PunchInRecord punchInRecord) {
|
|
|
- // 没有打卡记录,直接没完成,包含单次打卡的情况无需额外判断
|
|
|
- if (Objects.isNull(punchInRecord)) {
|
|
|
- return PunchInStatusV1Enum.UN_FINISH;
|
|
|
+ /**
|
|
|
+ * 判断全勤状态
|
|
|
+ *
|
|
|
+ * @return true-是全勤,false-不是全勤
|
|
|
+ */
|
|
|
+ private boolean judgeFullAttendanceStatusInTask(PunchInTask punchInTask, PunchInTaskHistory punchInTaskHistory,
|
|
|
+ PunchInStatsWeek punchInStatsWeek, PunchInStatsMonth punchInStatsMonth) {
|
|
|
+ // 没有启用全勤 则直接返回
|
|
|
+ if (CommonEnableStatusEnum.DISABLED.equals(punchInTask.getFullAttendanceStatus())) {
|
|
|
+ return false;
|
|
|
}
|
|
|
|
|
|
- // 单次打卡
|
|
|
- if (PunchInCategoryEnum.SINGLE.equals(punchIn.getCategory())) {
|
|
|
- return PunchInStatusV1Enum.FINISH;
|
|
|
- }
|
|
|
+ // 打卡日期/结算日期
|
|
|
+ LocalDate punchInDate = LocalDate.parse(punchInTaskHistory.getPunchInDate());
|
|
|
|
|
|
- // 计数打卡
|
|
|
- if (PunchInCategoryEnum.COUNT.equals(punchIn.getCategory())) {
|
|
|
- Integer recordCountTrack = Optional.ofNullable(punchInRecord.getCountTrack()).orElse(0);
|
|
|
- if (PunchInRuleEnum.GREATER_OR_EQUAL.equals(punchIn.getRule()) && recordCountTrack.compareTo(punchIn.getCountTrack()) == -1) {
|
|
|
- return PunchInStatusV1Enum.UN_FINISH;
|
|
|
- }
|
|
|
- if (PunchInRuleEnum.LESS_OR_EQUAL.equals(punchIn.getRule()) && recordCountTrack.compareTo(punchIn.getCountTrack()) == 1) {
|
|
|
- return PunchInStatusV1Enum.UN_FINISH;
|
|
|
- }
|
|
|
+ // 未完成数,默认设置一个较大值,以防判断有误
|
|
|
+ int undoneCount = punchInTask.getFullAttendanceFaultToleranceCnt() + 1;
|
|
|
|
|
|
- return PunchInStatusV1Enum.FINISH;
|
|
|
+ // 结算周期:周,并且结算日是周末;结算周期:月,结算日是当月最后一天;
|
|
|
+ if (FullAttendancePeriodEnum.WEEK.equals(punchInTask.getFullAttendancePeriod())
|
|
|
+ && punchInDate.getDayOfWeek().getValue() == 7) {
|
|
|
+ undoneCount = punchInStatsWeek.getPunchInTotalCount() - punchInStatsWeek.getPunchInDoneCount();
|
|
|
+ } else if (FullAttendancePeriodEnum.MONTH.equals(punchInTask.getFullAttendancePeriod())
|
|
|
+ && punchInDate.lengthOfMonth() == punchInDate.getDayOfMonth()) {
|
|
|
+ undoneCount = punchInStatsMonth.getPunchInTotalCount() - punchInStatsMonth.getPunchInDoneCount();
|
|
|
}
|
|
|
|
|
|
- // 计时打卡
|
|
|
- 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 (PunchInRuleEnum.LESS_OR_EQUAL.equals(punchIn.getRule()) && recordTimeTrack.compareTo(punchIn.getTimeTrack()) == 1) {
|
|
|
- return PunchInStatusV1Enum.UN_FINISH;
|
|
|
- }
|
|
|
-
|
|
|
- return PunchInStatusV1Enum.FINISH;
|
|
|
- }
|
|
|
-
|
|
|
- return PunchInStatusV1Enum.UN_FINISH;
|
|
|
+ // 未完成数在容错范围内,则是全勤
|
|
|
+ return undoneCount <= punchInTask.getFullAttendanceFaultToleranceCnt();
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 填充打卡记录的记录信息(不用考虑单次打卡的情况)
|
|
|
- * @param punchIn
|
|
|
- * @param punchInRecord
|
|
|
+ * 计算连续积分
|
|
|
+ *
|
|
|
+ * @param punchInTask 打卡任务
|
|
|
+ * @param punchInTaskExtList 打卡任务拓展信息
|
|
|
+ * @param punchInStatus 打卡状态
|
|
|
+ * @return
|
|
|
*/
|
|
|
- private void fillTrack(PunchIn punchIn, PunchInRecord punchInRecord) {
|
|
|
- // 计数打卡
|
|
|
- if (PunchInCategoryEnum.COUNT.equals(punchIn.getCategory())) {
|
|
|
- if (PunchInRuleEnum.GREATER_OR_EQUAL.equals(punchIn.getRule())) {
|
|
|
- punchInRecord.setCountTrack(punchIn.getCountTrack() + 1);
|
|
|
- }
|
|
|
- if (PunchInRuleEnum.LESS_OR_EQUAL.equals(punchIn.getRule())){
|
|
|
- punchInRecord.setCountTrack(punchIn.getCountTrack() - 1);
|
|
|
- }
|
|
|
+ private int calculateConsecutivePointsInTask(PunchInTask punchInTask, List<PunchInTaskExt> punchInTaskExtList,
|
|
|
+ PunchInStatus punchInStatus) {
|
|
|
+ // 没有启用任务积分计算、或是连续打卡状态为中断、或是没有拓展信息 则不进行计算
|
|
|
+ if (CommonEnableStatusEnum.DISABLED.equals(punchInTask.getTaskPointsStatus())
|
|
|
+ || ConsecutiveStatusEnum.INTERRUPTED.equals(punchInStatus.getConsecutiveStatus())
|
|
|
+ || CollectionUtils.isEmpty(punchInTaskExtList)) {
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
- // 计时打卡
|
|
|
- if (PunchInCategoryEnum.TIME.equals(punchIn.getCategory())) {
|
|
|
- if (PunchInRuleEnum.GREATER_OR_EQUAL.equals(punchIn.getRule())) {
|
|
|
- punchInRecord.setTimeTrack(punchIn.getTimeTrack().plusSeconds(1));
|
|
|
+ // 任务积分
|
|
|
+ int taskPoints = 0;
|
|
|
+ // 第二轮标志
|
|
|
+ boolean secondRound = false;
|
|
|
+ // 上一轮的值
|
|
|
+ int prevInitialValue = 0;
|
|
|
+ // 拓展信息 根据InitialValue倒序排列
|
|
|
+ punchInTaskExtList.sort(Comparator.comparing(PunchInTaskExt::getInitialValue).reversed());
|
|
|
+ // 使用区间计算的方式
|
|
|
+ for (PunchInTaskExt punchInTaskExt : punchInTaskExtList) {
|
|
|
+ // 比较结果
|
|
|
+ int compareValue = punchInStatus.getConsecutiveDay().compareTo(punchInTaskExt.getInitialValue());
|
|
|
+ // 如果连续日期小于initialValue,则跳过
|
|
|
+ if (compareValue == -1) {
|
|
|
+ continue;
|
|
|
}
|
|
|
- if (PunchInRuleEnum.LESS_OR_EQUAL.equals(punchIn.getRule())){
|
|
|
- punchInRecord.setTimeTrack(punchIn.getTimeTrack().minusSeconds(1));
|
|
|
+ // 额外奖励数
|
|
|
+ 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;
|
|
|
+ // 记录本轮的initialValue
|
|
|
+ prevInitialValue = punchInTaskExt.getInitialValue();
|
|
|
}
|
|
|
+
|
|
|
+ return taskPoints;
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * 判断是否进行全勤结算
|
|
|
- * @param settleInfo 结算信息
|
|
|
- * @param punchIn 打卡任务
|
|
|
- * @param weeklyPunchInRecordMap 一周打卡记录
|
|
|
- * @return true-
|
|
|
- */
|
|
|
- private boolean judgeFullAttendance(SettleInfoDto settleInfo, PunchIn punchIn, Map<Long, List<PunchInRecord>> weeklyPunchInRecordMap) {
|
|
|
- // 没有启用全勤奖励则跳过
|
|
|
- if (!punchIn.getFullAttendanceFlag()) {
|
|
|
- return false;
|
|
|
+ @Override
|
|
|
+ public int calculatePointsInMultiTask(PunchInMultiTask punchInMultiTask,
|
|
|
+ List<PunchInMultiTaskExt> punchInMultiTaskExtList, PunchInMultiTaskHistory punchInMultiTaskHistory,
|
|
|
+ PunchInStatus punchInStatus) {
|
|
|
+ // 未完成打卡或没有启用多任务积分计算,积分为0
|
|
|
+ if (PunchInStatusEnum.UNDONE.equals(punchInMultiTaskHistory.getPunchInStatus())
|
|
|
+ || CommonEnableStatusEnum.DISABLED.equals(punchInMultiTask.getTaskPointsStatus())) {
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
- // 不是周日结算或者补打卡则跳过,
|
|
|
- if (!settleInfo.getSundayFlag() && !PunchInSettleTypeEnum.REMAKE.equals(settleInfo.getSettleType())) {
|
|
|
- return false;
|
|
|
- }
|
|
|
+ // 多个任务积分=多任务基本积分+多任务额外积分+连续完成额外积分
|
|
|
+ // 基本积分
|
|
|
+ int basicPoints = punchInMultiTask.getPoints();
|
|
|
+
|
|
|
+ // 额外积分
|
|
|
+ List<PunchInMultiTaskExt> punchInTaskOneExtList = punchInMultiTaskExtList.stream()
|
|
|
+ .filter(v -> PunchInDimensionEnum.ONE_DAY.equals(v.getDimension())).collect(Collectors.toList());
|
|
|
+ int extraPoints = calculateExtraPointsInMultiTask(punchInMultiTask, punchInTaskOneExtList, punchInMultiTaskHistory);
|
|
|
|
|
|
- // 获取一周的完成打卡的打卡记录,并且要排除结算日这天的记录
|
|
|
- List<PunchInRecord> weeklyFinishRecord = Optional.ofNullable(weeklyPunchInRecordMap.get(punchIn.getId())).orElse(new ArrayList<>())
|
|
|
- .stream().filter(record -> !settleInfo.getSettleDateStr().equals(record.getPunchInDate()) && (PunchInStatusV1Enum.FINISH.equals(record.getPunchInStatus()) || PunchInStatusV1Enum.REMAKE_FINISH.equals(record.getPunchInStatus())))
|
|
|
- .collect(Collectors.toList());
|
|
|
+ // 连续完成额外积分
|
|
|
+ List<PunchInMultiTaskExt> punchInTaskMultiExtList = punchInMultiTaskExtList.stream()
|
|
|
+ .filter(v -> PunchInDimensionEnum.MULTI_DAY.equals(v.getDimension())).collect(Collectors.toList());
|
|
|
+ int taskPoints =
|
|
|
+ calculateConsecutivePointsInMultiTask(punchInMultiTask, punchInTaskMultiExtList, punchInStatus);
|
|
|
|
|
|
- // 1个是容错允许不打卡或未完成打卡,1个是当天的结算打卡来到这段逻辑就认为已经完成打卡,因此只要有5个完成打卡,则认为全勤
|
|
|
- return weeklyFinishRecord.size() >= 5;
|
|
|
+ return basicPoints + extraPoints + taskPoints;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 构建待更新结算数据的打卡记录
|
|
|
+ * 计算额外积分(多任务)
|
|
|
+ *
|
|
|
+ * @param punchInMultiTask 多任务打卡信息
|
|
|
+ * @param punchInMultiTaskExtList 多任务打卡拓展信息
|
|
|
+ * @param punchInMultiTaskHistory 多任务打卡历史信息
|
|
|
* @return
|
|
|
*/
|
|
|
- private PunchInRecord buildPunchInRecordForSettle(PunchIn punchIn) {
|
|
|
- PunchInRecord updatePunchInRecord = new PunchInRecord();
|
|
|
- updatePunchInRecord.setSettleRewardNum(punchIn.getRewardNum());
|
|
|
- updatePunchInRecord.setSettleCategory(punchIn.getCategory());
|
|
|
- updatePunchInRecord.setSettleRule(punchIn.getRule());
|
|
|
- updatePunchInRecord.setSettleCountTrack(punchIn.getCountTrack());
|
|
|
- updatePunchInRecord.setSettleTimeTrack(punchIn.getTimeTrack());
|
|
|
- return updatePunchInRecord;
|
|
|
+
|
|
|
+ private int calculateExtraPointsInMultiTask(PunchInMultiTask punchInMultiTask,
|
|
|
+ List<PunchInMultiTaskExt> punchInMultiTaskExtList, PunchInMultiTaskHistory punchInMultiTaskHistory) {
|
|
|
+ // 额外次数
|
|
|
+ int extractCount = punchInMultiTaskHistory.getPunchInDoneCount() - punchInMultiTask.getPunchInDoneCount();
|
|
|
+
|
|
|
+ // 固定计算
|
|
|
+ if (PunchInExtraMethodEnum.FIXED.equals(punchInMultiTask.getExtraMethod())) {
|
|
|
+ return extractCount * punchInMultiTask.getExtraPoints();
|
|
|
+ }
|
|
|
+
|
|
|
+ // 区间计算
|
|
|
+ if (PunchInExtraMethodEnum.INTERVAL.equals(punchInMultiTask.getExtraMethod())
|
|
|
+ && !CollectionUtils.isEmpty(punchInMultiTaskExtList)) {
|
|
|
+ // 额外积分
|
|
|
+ int extraPoints = 0;
|
|
|
+ // 第二轮标志
|
|
|
+ boolean secondRound = false;
|
|
|
+ // 上一轮的值
|
|
|
+ int prevInitialValue = 0;
|
|
|
+ // punchInMultiTaskExtList 根据InitialValue倒序排列
|
|
|
+ punchInMultiTaskExtList.sort(Comparator.comparing(PunchInMultiTaskExt::getInitialValue).reversed());
|
|
|
+
|
|
|
+ for (PunchInMultiTaskExt punchInTaskExt : punchInMultiTaskExtList) {
|
|
|
+ // 比较结果
|
|
|
+ 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;
|
|
|
+ // 记录本轮的initialValue
|
|
|
+ prevInitialValue = punchInTaskExt.getInitialValue();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 构造打卡记录与结算记录的关联关系
|
|
|
- * @param settleResultDtos
|
|
|
+ * 计算多任务连续打卡积分
|
|
|
+ *
|
|
|
+ * @param punchInMultiTask 多任务打卡信息
|
|
|
+ * @param punchInMultiTaskExtList 多任务打卡拓展信息
|
|
|
+ * @param punchInStatus 状态信息
|
|
|
* @return
|
|
|
*/
|
|
|
- private static List<PunchInRecordSettlementRela> buildPunchInRecordSettlementRelaList(List<SettleResultDto> settleResultDtos) {
|
|
|
- if (CollectionUtils.isEmpty(settleResultDtos)) {
|
|
|
- return List.of();
|
|
|
+
|
|
|
+ private int calculateConsecutivePointsInMultiTask(PunchInMultiTask punchInMultiTask,
|
|
|
+ List<PunchInMultiTaskExt> punchInMultiTaskExtList, PunchInStatus punchInStatus) {
|
|
|
+ // 没有启用多任务积分计算、或是连续打卡状态为中断、或是没有拓展信息 则不进行计算
|
|
|
+ if (CommonEnableStatusEnum.DISABLED.equals(punchInMultiTask.getTaskPointsStatus())
|
|
|
+ || ConsecutiveStatusEnum.INTERRUPTED.equals(punchInStatus.getConsecutiveStatus())
|
|
|
+ || CollectionUtils.isEmpty(punchInMultiTaskExtList)) {
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
- List<PunchInRecordSettlementRela> relaList = new ArrayList();
|
|
|
- // 补充关联关系ID(结算记录ID、打卡记录ID)
|
|
|
- for (SettleResultDto settleResultDto : settleResultDtos) {
|
|
|
- for (PunchInRecord punchInRecord : settleResultDto.getAddPunchInRecords()) {
|
|
|
- PunchInRecordSettlementRela rela = new PunchInRecordSettlementRela();
|
|
|
- rela.setRecordId(punchInRecord.getId());
|
|
|
- rela.setSettlementId(settleResultDto.getAddPunchInSettlement().getId());
|
|
|
- relaList.add(rela);
|
|
|
+ // 积分
|
|
|
+ int points = 0;
|
|
|
+ // 第二轮标志
|
|
|
+ boolean secondRound = false;
|
|
|
+ // 上一轮的值
|
|
|
+ int prevInitialValue = 0;
|
|
|
+ // punchInMultiTaskExtList 根据InitialValue倒序排列
|
|
|
+ punchInMultiTaskExtList.sort(Comparator.comparing(PunchInMultiTaskExt::getInitialValue).reversed());
|
|
|
+
|
|
|
+ for (PunchInMultiTaskExt punchInTaskExt : punchInMultiTaskExtList) {
|
|
|
+ // 比较结果
|
|
|
+ int compareValue = punchInStatus.getConsecutiveDay().compareTo(punchInTaskExt.getInitialValue());
|
|
|
+ // 如果连续日期小于initialValue,则跳过
|
|
|
+ if (compareValue == -1) {
|
|
|
+ continue;
|
|
|
}
|
|
|
-
|
|
|
- for (PunchInRecord punchInRecord : settleResultDto.getUpdatePunchInRecords()) {
|
|
|
- PunchInRecordSettlementRela rela = new PunchInRecordSettlementRela();
|
|
|
- rela.setRecordId(punchInRecord.getId());
|
|
|
- rela.setSettlementId(settleResultDto.getAddPunchInSettlement().getId());
|
|
|
- relaList.add(rela);
|
|
|
+ // 额外奖励数
|
|
|
+ int tempExtraCount = 0;
|
|
|
+ // 如果连续日期大于等于initialValue,则进行第一次计算,并把第二轮标志位设置为true,第二轮/后续轮只需要用上一轮的值进行计算
|
|
|
+ if (secondRound) {
|
|
|
+ tempExtraCount = prevInitialValue - punchInTaskExt.getInitialValue();
|
|
|
+ } else if (compareValue >= 0) {
|
|
|
+ tempExtraCount = punchInStatus.getConsecutiveDay() - punchInTaskExt.getInitialValue() + 1;
|
|
|
+ secondRound = true;
|
|
|
}
|
|
|
+ // 计算积分
|
|
|
+ points += punchInTaskExt.getExtraPoints() * tempExtraCount;
|
|
|
+ // 记录本轮的initialValue
|
|
|
+ prevInitialValue = punchInTaskExt.getInitialValue();
|
|
|
}
|
|
|
- return relaList;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void manualSettle(SettleRequest settleRequest) {
|
|
|
- // TODO 这里考虑加判断条件防止重复手动结算
|
|
|
- Assert.isNullInBusiness(settleRequest, "结算请求不能为空");
|
|
|
- if (!PunchInSettleTypeEnum.OPS.equals(settleRequest.getSettleType())) {
|
|
|
- BusinessException.throwFail("非运维结算,禁止执行");
|
|
|
- }
|
|
|
- SpringUtils.getBean(ISettleManager.class).settleHandler(settleRequest.getSettleType(), LocalDate.parse(settleRequest.getSettleDate()), settleRequest.getUserIds(), settleRequest.getPunchInIds());
|
|
|
- }
|
|
|
|
|
|
- @Override
|
|
|
- public List<SettleVO> querySettle(SettleQuery query) {
|
|
|
- SimpleDateFormat sdf = DateUtils.buildDateTimeFormat();
|
|
|
-
|
|
|
- List<PunchInSettlement> punchInSettlements = punchInSettlementService.listByCondition(query);
|
|
|
- return punchInSettlements.stream().map(settlement -> {
|
|
|
- SettleVO settleVO = new SettleVO();
|
|
|
- BeanUtils.copyProperties(settlement, settleVO);
|
|
|
- settleVO.setSettlementTime(sdf.format(settlement.getSettlementTime()));
|
|
|
- return settleVO;
|
|
|
- }).toList();
|
|
|
+ return points;
|
|
|
}
|
|
|
}
|