| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665 |
- package com.punchsettle.server.service.manager.impl;
- import java.time.DayOfWeek;
- import java.time.LocalDate;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import java.util.Objects;
- import java.util.Optional;
- import java.util.Set;
- import java.util.function.Function;
- import java.util.stream.Collectors;
- import com.punchsettle.server.atomic.entity.Account;
- import com.punchsettle.server.atomic.entity.AccountTransferHistory;
- import com.punchsettle.server.atomic.entity.User;
- import com.punchsettle.server.atomic.service.IAccountService;
- import com.punchsettle.server.atomic.service.IAccountTransferHistoryService;
- import com.punchsettle.server.atomic.service.IUserService;
- import com.punchsettle.server.constant.AccountCategoryEnum;
- import com.punchsettle.server.constant.PointsDistributeStatusEnum;
- import com.punchsettle.server.constant.TransferCategoryEnum;
- import com.punchsettle.server.pojo.account.AccountQuery;
- import com.punchsettle.server.pojo.settle.SettleUserHistoryQuery;
- import org.springframework.beans.BeanUtils;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.cache.annotation.Cacheable;
- import org.springframework.stereotype.Service;
- import org.springframework.transaction.annotation.Transactional;
- import org.springframework.util.CollectionUtils;
- import com.punchsettle.server.atomic.ContinueTask;
- import com.punchsettle.server.atomic.entity.PiMultiTask;
- import com.punchsettle.server.atomic.entity.PiMultiTaskExt;
- import com.punchsettle.server.atomic.entity.PiMultiTaskHistory;
- import com.punchsettle.server.atomic.entity.PiMultiTaskRela;
- import com.punchsettle.server.atomic.entity.PiStatus;
- import com.punchsettle.server.atomic.entity.PiTask;
- import com.punchsettle.server.atomic.entity.PiTaskExt;
- import com.punchsettle.server.atomic.entity.PiTaskHistory;
- import com.punchsettle.server.atomic.entity.SettleTaskRelaHistory;
- import com.punchsettle.server.atomic.entity.SettleUserHistory;
- import com.punchsettle.server.atomic.service.IPiMultiTaskExtService;
- import com.punchsettle.server.atomic.service.IPiMultiTaskHistoryService;
- import com.punchsettle.server.atomic.service.IPiMultiTaskRelaService;
- import com.punchsettle.server.atomic.service.IPiMultiTaskService;
- import com.punchsettle.server.atomic.service.IPiStatusService;
- import com.punchsettle.server.atomic.service.IPiTaskExtService;
- import com.punchsettle.server.atomic.service.IPiTaskHistoryService;
- import com.punchsettle.server.atomic.service.IPiTaskService;
- import com.punchsettle.server.atomic.service.ISettleUserHistoryService;
- import com.punchsettle.server.atomic.service.ISettleTaskRelaHistoryService;
- import com.punchsettle.server.common.utils.Assert;
- import com.punchsettle.server.constant.ArchiveStatusEnum;
- import com.punchsettle.server.constant.CacheNameConstant;
- import com.punchsettle.server.constant.ContinueStageEnum;
- import com.punchsettle.server.constant.ContinueStatusEnum;
- import com.punchsettle.server.constant.PunchInResultEnum;
- import com.punchsettle.server.constant.SettleResultEnum;
- import com.punchsettle.server.constant.VersionStatusEnum;
- import com.punchsettle.server.pojo.punchIn.PiMultiTaskExtQuery;
- import com.punchsettle.server.pojo.punchIn.PiMultiTaskHistoryQuery;
- import com.punchsettle.server.pojo.punchIn.PiMultiTaskQuery;
- import com.punchsettle.server.pojo.punchIn.PiStatusQuery;
- import com.punchsettle.server.pojo.punchIn.PiTaskData;
- import com.punchsettle.server.pojo.punchIn.PiTaskExtQuery;
- import com.punchsettle.server.pojo.punchIn.PiTaskHistoryQuery;
- import com.punchsettle.server.pojo.punchIn.PiTaskQuery;
- import com.punchsettle.server.pojo.settle.SettleData;
- import com.punchsettle.server.pojo.settle.SettlePointsHistoryVO;
- import com.punchsettle.server.service.manager.IPunchInCoreManager;
- import com.punchsettle.server.service.manager.ISettleCoreManager;
- import com.punchsettle.server.service.manager.ISettleManager;
- import com.punchsettle.server.utiis.DateUtils;
- import lombok.extern.slf4j.Slf4j;
- /**
- * @author tyuio
- * @version 1.0.0
- * @description 结算服务类
- * @date 2024/12/12 22:29
- */
- @Slf4j
- @Service
- public class SettleManagerImpl implements ISettleManager {
- @Autowired
- private ISettleUserHistoryService settleUserHistoryService;
- @Autowired
- private IPiTaskService piTaskService;
- @Autowired
- private IPiTaskExtService piTaskExtService;
- @Autowired
- private IPiTaskHistoryService piTaskHistoryService;
- @Autowired
- private IPiStatusService piStatusService;
- @Autowired
- private IPiMultiTaskService piMultiTaskService;
- @Autowired
- private IPiMultiTaskExtService piMultiTaskExtService;
- @Autowired
- private IPiMultiTaskHistoryService piMultiTaskHistoryService;
- @Autowired
- private IPiMultiTaskRelaService piMultiTaskRelaService;
- @Autowired
- private IPunchInCoreManager punchInCoreManager;
- @Autowired
- private ISettleCoreManager settleCoreManager;
- @Autowired
- private ISettleTaskRelaHistoryService settleTaskRelaHistoryService;
- @Autowired
- private IUserService userService;
- @Autowired
- private IAccountService accountService;
- @Autowired
- private IAccountTransferHistoryService accountTransferHistoryService;
- @Override
- @Cacheable(cacheNames = CacheNameConstant.SETTLE_POINTS_HISTORY, key = "#userId+'_'+settleMonth", condition = "#userId != null && settleMont != null && !settleMonth.isBlank()")
- public List<SettlePointsHistoryVO> querySettlePointsHistory(Long userId, String settleMonth) {
- Assert.isNullInBusiness(settleMonth, "结算月份不能为空");
- Assert.isNullInBusiness(userId, "用户ID不能为空");
- SettleUserHistoryQuery settleUserHistoryQuery = new SettleUserHistoryQuery();
- settleUserHistoryQuery.setUserId(userId);
- settleUserHistoryQuery.setSettleDateLike(settleMonth);
- List<SettleUserHistory> settlePointsHistories = settleUserHistoryService.querySettleUserHistory(settleUserHistoryQuery);
- if (CollectionUtils.isEmpty(settlePointsHistories)) {
- return List.of();
- }
- return settlePointsHistories.stream().map(settlePointsHistory -> {
- SettlePointsHistoryVO settlePointsHistoryVO = new SettlePointsHistoryVO();
- BeanUtils.copyProperties(settlePointsHistory, settlePointsHistoryVO);
- return settlePointsHistoryVO;
- }).collect(Collectors.toList());
- }
- @Override
- @Transactional(rollbackFor = Exception.class)
- public void settle(List<Long> userIds, String punchInDateStr, Long settleTaskHistoryId) {
- // 打卡日期
- LocalDate punchInDate = LocalDate.parse(punchInDateStr);
- // 是否周一
- boolean isMonday = DayOfWeek.MONDAY.equals(punchInDate.getDayOfWeek());
- // 是否打卡所在月第一天
- boolean isFirstDayOfMonth = punchInDate.getDayOfMonth() == 1;
- // 周期数
- String yearWeek = DateUtils.getYearWeek(punchInDate);
- // 月份数
- String yearMonth = DateUtils.getYearMonth(punchInDate);
- // 打卡状态 更新列表
- List<PiStatus> addPiStatusList = new ArrayList<>();
- // 新增结算用户记录
- List<SettleUserHistory> addSettleUserHistories = new ArrayList<>();
- // 用户ID-结算任务关联记录
- Map<Long, List<SettleTaskRelaHistory>> settleTaskRelaHistoryMap = new HashMap<>();
- // 获取结算数据
- List<SettleData> settleDataList = getSettleData(userIds, punchInDateStr);
- for (SettleData settleData : settleDataList) {
- // 新增结算用户记录
- SettleUserHistory addSettleUserHistory = new SettleUserHistory();
- addSettleUserHistory.setUserId(settleData.getUserId());
- addSettleUserHistory.setSettleDate(punchInDateStr);
- addSettleUserHistory.setSettleTaskHistoryId(settleTaskHistoryId);
- addSettleUserHistory.setBeforeSettlePoints(0);
- addSettleUserHistory.setAfterSettlePoints(0);
- addSettleUserHistory.setSettleResult(SettleResultEnum.SETTLE);
- addSettleUserHistory.setDistributeStatus(PointsDistributeStatusEnum.NOT_DISTRIBUTE);
- addSettleUserHistories.add(addSettleUserHistory);
- // 不存在打卡任务则跳过
- if (CollectionUtils.isEmpty(settleData.getPiTaskDataList())) {
- addSettleUserHistory.setSettlePoints(0);
- continue;
- }
- // 总结算积分
- int totalSettlePoints = 0;
- // 新增结算任务关联记录
- List<SettleTaskRelaHistory> addSettleTaskRelaHistories = new ArrayList<>();
- settleTaskRelaHistoryMap.put(settleData.getUserId(), addSettleTaskRelaHistories);
- // 单任务处理
- for (PiTaskData piTaskData : settleData.getPiTaskDataList()) {
- // 打卡任务
- PiTask piTask = piTaskData.getPiTask();
- // 结算任务关联记录
- SettleTaskRelaHistory addSettleTaskRelaHistory = new SettleTaskRelaHistory();
- addSettleTaskRelaHistory.setSettleTaskHistoryId(settleTaskHistoryId);
- addSettleTaskRelaHistory.setUserId(settleData.getUserId());
- addSettleTaskRelaHistory.setSettleDate(punchInDateStr);
- addSettleTaskRelaHistory.setPiTaskId(piTask.getId());
- addSettleTaskRelaHistory.setPiTaskUniqueId(piTask.getUniqueId());
- // 有打卡任务,但是今天无需结算
- boolean repeatResult = punchInCoreManager.judgeRepeat(piTask, punchInDate);
- if (!repeatResult) {
- addSettleTaskRelaHistory.setSettleResult(SettleResultEnum.NOT_SETTLED);
- addSettleTaskRelaHistory.setSettlePoints(0);
- addSettleTaskRelaHistories.add(addSettleTaskRelaHistory);
- continue;
- }
- // 打卡任务打卡记录
- PiTaskHistory piTaskHistory = piTaskData.getPiTaskHistory();
- // 打卡任务状态
- PiStatus oldPiStatus = piTaskData.getPiStatus();
- // 打卡任务拖扎信息
- List<PiTaskExt> piTaskExtList = piTaskData.getPiTaskExtList();
- // 复制昨天的打卡记录
- PiStatus piStatus = new PiStatus();
- BeanUtils.copyProperties(oldPiStatus, piStatus);
- piStatus.setStatusDate(punchInDateStr);
- addPiStatusList.add(piStatus);
- // 更新打卡状态
- refreshPiStatus(oldPiStatus, piTask, piTaskHistory, punchInDate, isMonday, isFirstDayOfMonth, yearWeek, yearMonth);
- // 计算积分,要先刷新打卡状态
- int settlePoints = settleCoreManager.calculatePointsInTask(piTask, piTaskExtList, piTaskHistory, oldPiStatus);
- // 计算总积分
- totalSettlePoints += settlePoints;
- // 没有打过卡时,没有打卡记录
- if (Objects.nonNull(piTaskHistory)) {
- addSettleTaskRelaHistory.setPiTaskHistoryId(piTaskHistory.getId());
- }
- addSettleTaskRelaHistory.setSettleResult(SettleResultEnum.SETTLE);
- addSettleTaskRelaHistory.setSettlePoints(settlePoints);
- addSettleTaskRelaHistories.add(addSettleTaskRelaHistory);
- }
- // TODO 未处理多任务结算
- // 设置总结算积分
- addSettleUserHistory.setSettlePoints(totalSettlePoints);
- }
- // 数据入库
- if (!CollectionUtils.isEmpty(addSettleUserHistories)) {
- settleUserHistoryService.insertList(addSettleUserHistories);
- // 处理关联数据
- List<SettleTaskRelaHistory> addSettleTaskRelaHistories = addSettleUserHistories.stream().map(settleUserHistory -> {
- List<SettleTaskRelaHistory> settleTaskRelaHistories = settleTaskRelaHistoryMap.get(settleUserHistory.getUserId());
- if (!CollectionUtils.isEmpty(settleTaskRelaHistories)) {
- settleTaskRelaHistories.stream().forEach(v -> v.setSettleUserHistoryId(settleUserHistory.getId()));
- }
- return settleTaskRelaHistories;
- }).flatMap(List::stream) // 将每个List中的元素展平
- .collect(Collectors.toList());
- if (!CollectionUtils.isEmpty(addSettleTaskRelaHistories)) {
- settleTaskRelaHistoryService.insertList(addSettleTaskRelaHistories);
- }
- }
- if (!CollectionUtils.isEmpty(addPiStatusList)) {
- piStatusService.batchUpdate(addPiStatusList);
- }
- }
- /**
- * 获取用户ID-打卡结算数据关联
- *
- * @param userIds 设计的用户
- * @param punchInDateStr 打卡日期
- * @return
- */
- private List<SettleData> getSettleData(List<Long> userIds, String punchInDateStr) {
- // 获取多任务信息,用户ID-多任务关联
- PiMultiTaskQuery piMultiTaskQuery = new PiMultiTaskQuery();
- piMultiTaskQuery.setMultiTaskTaskStatus(VersionStatusEnum.ACTIVE);
- piMultiTaskQuery.setUserIds(userIds);
- List<PiMultiTask> piMultiTasks = piMultiTaskService.queryByCondition(piMultiTaskQuery);
- Map<Long, PiMultiTask> piMultiTaskMap = piMultiTasks.stream()
- .collect(Collectors.toMap(PiMultiTask::getUserId, Function.identity(), (key1, key2) -> key1));
- // 多任务ID
- Set<Long> multiTaskIds = piMultiTasks.stream().map(PiMultiTask::getId).collect(Collectors.toSet());
- // 多任务唯一ID
- Set<Long> multiTaskUniqueIds = piMultiTasks.stream().map(PiMultiTask::getUniqueId).collect(Collectors.toSet());
- // 获取多任务拓展信息,多任务ID-多任务拓展关联
- PiMultiTaskExtQuery piMultiTaskExtQuery = new PiMultiTaskExtQuery();
- piMultiTaskExtQuery.setMultiTaskIds(multiTaskIds);
- List<PiMultiTaskExt> piMultiTaskExtList = piMultiTaskExtService.queryByCondition(piMultiTaskExtQuery);
- Map<Long, List<PiMultiTaskExt>> piMultiTaskExtMap =
- piMultiTaskExtList.stream().collect(Collectors.groupingBy(PiMultiTaskExt::getMultiTaskId));
- // 获取多任务打卡历史信息,多任务唯一ID-多任务打卡历史关联
- PiMultiTaskHistoryQuery piMultiTaskHistoryQuery = new PiMultiTaskHistoryQuery();
- piMultiTaskHistoryQuery.setPunchInMultiTaskUniqueIds(multiTaskUniqueIds);
- piMultiTaskHistoryQuery.setPunchInDate(punchInDateStr);
- List<PiMultiTaskHistory> piMultiTaskHistories =
- piMultiTaskHistoryService.queryByCondition(piMultiTaskHistoryQuery);
- Map<Long, PiMultiTaskHistory> piMultiTaskHistoryMap = piMultiTaskHistories.stream().collect(
- Collectors.toMap(PiMultiTaskHistory::getMultiTaskUniqueId, Function.identity(), (key1, key2) -> key1));
- // 打卡任务状态
- PiStatusQuery piStatusQuery = new PiStatusQuery();
- piStatusQuery.setUserIds(userIds);
- List<PiStatus> piStatusList = piStatusService.queryByCondition(piStatusQuery);
- // 打卡任务状态,多任务唯一ID-打卡状态关联
- Map<Long, PiStatus> piStatusMapInMultiTask = piStatusList.stream().filter(v -> Objects.nonNull(v.getMultiTaskUniqueId())).collect(Collectors.toMap(PiStatus::getMultiTaskUniqueId, Function.identity(), (key1, key2) -> key1));
- // 打卡任务状态,任务唯一ID-打卡状态关联
- Map<Long, PiStatus> piStatusMapInTask = piStatusList.stream().filter(v -> Objects.nonNull(v.getTaskUniqueId())).collect(Collectors.toMap(PiStatus::getTaskUniqueId, Function.identity(), (key1, key2) -> key1));
- // 多任务关联打卡任务,多任务ID-多任务关联打卡任务关联
- List<PiMultiTaskRela> piMultiTaskRelaList = piMultiTaskRelaService.queryByMultiTaskId(multiTaskIds);
- Map<Long, List<PiMultiTaskRela>> piMultiTaskRelaMap =
- piMultiTaskRelaList.stream().collect(Collectors.groupingBy(PiMultiTaskRela::getMultiTaskId));
- // 获取打卡任务信息,打卡任务唯一ID-打卡任务关联
- PiTaskQuery piTaskQuery = new PiTaskQuery();
- piTaskQuery.setTaskStatus(VersionStatusEnum.ACTIVE);
- piTaskQuery.setArchiveStatus(ArchiveStatusEnum.ACTIVE);
- piTaskQuery.setUserIds(userIds);
- List<PiTask> piTasks = piTaskService.queryByCondition(piTaskQuery);
- Map<Long, List<PiTask>> piTaskMap =
- piTasks.stream().collect(Collectors.groupingBy(PiTask::getCreatedBy));
- // 获取打卡记录,任务唯一 ID-打卡记录关联
- PiTaskHistoryQuery piTaskHistoryQuery = new PiTaskHistoryQuery();
- piTaskHistoryQuery.setPunchInDate(punchInDateStr);
- piTaskHistoryQuery.setUserIds(userIds);
- List<PiTaskHistory> punchInTaskHistories = piTaskHistoryService.queryByCondition(piTaskHistoryQuery);
- Map<Long, PiTaskHistory> piTaskHistoryMap =
- punchInTaskHistories.stream().collect(Collectors.toMap(PiTaskHistory::getTaskUniqueId, Function.identity(), (key1, key2) -> key1));
- // 打卡任务ID
- Set<Long> punchInTaskIds = piTasks.stream().map(PiTask::getId).collect(Collectors.toSet());
- // 获取打卡任务拓展表,打卡任务ID-打卡任务拓展关联
- PiTaskExtQuery piTaskExtQuery = new PiTaskExtQuery();
- piTaskExtQuery.setPunchInTaskIds(punchInTaskIds);
- List<PiTaskExt> piTaskExtList = piTaskExtService.queryByCondition(piTaskExtQuery);
- Map<Long, List<PiTaskExt>> piTaskExtGroupList =
- piTaskExtList.stream().collect(Collectors.groupingBy(PiTaskExt::getTaskId));
- return userIds.stream().filter(userId -> piTaskMap.containsKey(userId)).map(userId -> {
- SettleData settleData = new SettleData();
- // 设置用户ID
- settleData.setUserId(userId);
- // TODO 获取并设置多任务打卡信息,这个不可能为空,为空则用户初始注册时创建时有问题
- // PiMultiTask piMultiTask = piMultiTaskMap.get(userId);
- // settleData.setPiMultiTask(piMultiTask);
- //
- // // 获取并设置对应的拓展信息
- // List<PiMultiTaskExt> tempPiMultiTaskExtList = piMultiTaskExtMap.get(piMultiTask.getId());
- // settleData.setPiMultiTaskExtList(tempPiMultiTaskExtList);
- // 获取并设置对应的多任务打卡记录
- // PiMultiTaskHistory piMultiTaskHistory = piMultiTaskHistoryMap.get(piMultiTask.getUniqueId());
- // settleData.setPiMultiTaskHistory(piMultiTaskHistory);
- //
- // // 获取多任务与打卡任务的关联信息
- // List<PiMultiTaskRela> tempPiMultiTaskRelaList = piMultiTaskRelaMap.get(piMultiTask.getId());
- // Set<Long> relaContainTaskIdList =
- // tempPiMultiTaskRelaList.stream().map(PiMultiTaskRela::getTaskId).collect(Collectors.toSet());
- //
- // // 获取并设置多任务的状态信息
- // PiStatus piStatusInMultiTask = piStatusMapInMultiTask.get(piMultiTask.getUniqueId());
- // settleData.setPiStatus(piStatusInMultiTask);
- // 获取任务列表
- List<PiTask> piTasksList = piTaskMap.get(userId);
- // 打卡任务数据
- List<PiTaskData> piTaskDataList = new ArrayList<>(piTasksList.size());
- // 关联的打卡任务记录
- // List<PiTaskHistory> relaPunchInTaskHistories = new ArrayList<>(relaContainTaskIdList.size());
- for (PiTask piTask : piTasksList) {
- PiTaskData piTaskData = new PiTaskData();
- piTaskData.setPiTask(piTask);
- // 获取并设置打卡任务
- PiTaskHistory piTaskHistory = piTaskHistoryMap.get(piTask.getUniqueId());
- piTaskData.setPiTaskHistory(piTaskHistory);
- //设置多任务与打卡记录的关联信息
- // if (relaContainTaskIdList.contains(piTask.getId())) {
- // relaPunchInTaskHistories.add(piTaskHistory);
- // }
- // 获取并设置拓展信息
- List<PiTaskExt> tempPiTaskExtList = piTaskExtGroupList.get(piTask.getId());
- piTaskData.setPiTaskExtList(tempPiTaskExtList);
- // 获取并设置任务状态
- PiStatus piStatusInTask = piStatusMapInTask.get(piTask.getUniqueId());
- piTaskData.setPiStatus(piStatusInTask);
- piTaskDataList.add(piTaskData);
- }
- settleData.setPiTaskDataList(piTaskDataList);
- // settleData.setRelaPunchInTaskHistories(relaPunchInTaskHistories);
- return settleData;
- }).collect(Collectors.toList());
- }
- /**
- * 更新打卡任务状态
- * @param piStatus 打卡任务状态
- * @param piTask 打卡任务
- * @param piTaskHistory 打卡任务记录
- * @param punchInDate 打卡日期
- * @param isMonday 是否周一
- * @param isFirstDayOfMonth 是否本月第一天
- * @param yearWeek 周数
- * @param yearMonth 月份数
- */
- private void refreshPiStatus(PiStatus piStatus, PiTask piTask, PiTaskHistory piTaskHistory, LocalDate punchInDate, boolean isMonday, boolean isFirstDayOfMonth, String yearWeek, String yearMonth) {
- // 获取打卡结果
- PunchInResultEnum punchInResult = Objects.isNull(piTaskHistory) ? PunchInResultEnum.UNDONE : piTaskHistory.getPunchInResult();
- // 刷新打卡状态中的连续任务数据
- refreshContinueData(piStatus, punchInResult, piTask, punchInDate);
- // 周一或月初
- if (isMonday || isFirstDayOfMonth) {
- piStatus.setRepeatCategory(piTask.getRepeatCategory());
- piStatus.setRepeatCustomDay(piTask.getRepeatCustomDay());
- }
- // 周一
- if (isMonday) {
- piStatus.setStatTimeInWeek(yearWeek);
- // 设置本周总打卡次数
- int PunchInTotalCountInWeek = punchInCoreManager.getPunchInTotalCountInRange(piTask.getRepeatCategory(),
- piTask.getRepeatCustomDay(), DateUtils.getFirstDayOfWeek(punchInDate),
- DateUtils.getLastDayOfWeek(punchInDate));
- piStatus.setPunchInTotalCountInWeek(PunchInTotalCountInWeek);
- // 重置数据
- piStatus.setPunchInCountInWeek(0);
- piStatus.setPunchInDoneCountInWeek(0);
- piStatus.setRepeatPrevTotalCountInWeek(0);
- piStatus.setRepeatStartDateInWeek(punchInDate);
- }
- // 打卡日所在月的第一天
- if (isFirstDayOfMonth) {
- piStatus.setStatTimeInMonth(yearMonth);
- // 设置本月总打卡次数
- int PunchInTotalCountInMonth = punchInCoreManager.getPunchInTotalCountInRange(piTask.getRepeatCategory(),
- piTask.getRepeatCustomDay(), DateUtils.getFirstDayOfMonth(punchInDate),
- DateUtils.getLastDayOfMonth(punchInDate));
- piStatus.setPunchInTotalCountInMonth(PunchInTotalCountInMonth);
- // 重置数据
- piStatus.setPunchInCountInMonth(0);
- piStatus.setPunchInDoneCountInMonth(0);
- piStatus.setRepeatPrevTotalCountInMonth(0);
- piStatus.setRepeatStartDateInMonth(punchInDate);
- }
- // 重复类型发生变换,总打卡次数=历史真实发生的总打卡次数+变换前发生的总打卡次数+变换后可能的总打卡次数
- if (!piStatus.getRepeatCategory().equals(piTask.getRepeatCategory())) {
- // 历史真实发生的总打卡次数(周)
- Integer oldPrevTotalCountInWeek = Optional.ofNullable(piStatus.getRepeatPrevTotalCountInWeek()).orElse(0);
- // 变换前发生的总打卡次数(周)
- int prevTotalCountInWeek = punchInCoreManager.getPunchInTotalCountInRange(piStatus.getRepeatCategory(),
- piStatus.getRepeatCustomDay(), piStatus.getRepeatStartDateInWeek(),
- punchInDate.minusDays(1));
- // 变换后可能的总打卡次数(周)
- int punchInTotalCountInWeek = punchInCoreManager.getPunchInTotalCountInRange(piTask.getRepeatCategory(), piTask.getRepeatCustomDay(), punchInDate, DateUtils.getLastDayOfWeek(punchInDate));
- // 历史真实发生的总打卡次数(月)
- Integer oldPrevTotalCountInMonth = Optional.ofNullable(piStatus.getRepeatPrevTotalCountInMonth()).orElse(0);
- // 变换前发生的总打卡次数(月)
- int prevTotalCountInMonth = punchInCoreManager.getPunchInTotalCountInRange(piStatus.getRepeatCategory(),
- piStatus.getRepeatCustomDay(), piStatus.getRepeatStartDateInMonth(),
- punchInDate.minusDays(1));
- // 变换后可能的总打卡次数(月 )
- int punchInTotalCountInMonth = punchInCoreManager.getPunchInTotalCountInRange(piTask.getRepeatCategory(), piTask.getRepeatCustomDay(), punchInDate, DateUtils.getLastDayOfMonth(punchInDate));
- // 设置实时数据
- piStatus.setRepeatPrevTotalCountInWeek(prevTotalCountInWeek + oldPrevTotalCountInWeek);
- piStatus.setPunchInTotalCountInWeek(Optional.ofNullable(piStatus.getRepeatPrevTotalCountInWeek()).orElse(0) + punchInTotalCountInWeek);
- piStatus.setRepeatPrevTotalCountInMonth(prevTotalCountInMonth + oldPrevTotalCountInMonth);
- piStatus.setPunchInTotalCountInMonth(Optional.ofNullable(piStatus.getRepeatPrevTotalCountInMonth()).orElse(0) + punchInTotalCountInMonth);
- }
- // 存在打卡记录则已打卡数加1
- if (Objects.nonNull(piTaskHistory)) {
- piStatus.setPunchInCountInWeek(Optional.ofNullable(piStatus.getPunchInCountInWeek()).orElse(0) + 1);
- piStatus.setPunchInCountInMonth(Optional.ofNullable(piStatus.getPunchInCountInMonth()).orElse(0) + 1);
- }
- // 完成打卡则完成打卡数记录加一
- if (PunchInResultEnum.DONE.equals(punchInResult)) {
- piStatus.setPunchInDoneCountInWeek(Optional.ofNullable(piStatus.getPunchInDoneCountInWeek()).orElse(0) + 1);
- piStatus.setPunchInDoneCountInMonth(Optional.ofNullable(piStatus.getPunchInDoneCountInMonth()).orElse(0) + 1);
- }
- }
- /**
- * 刷新打卡状态中的连续任务数据
- * @param piStatus
- * @param punchInResult
- * @param continueTask
- * @param punchInDate
- */
- private void refreshContinueData(PiStatus piStatus, PunchInResultEnum punchInResult, ContinueTask continueTask, LocalDate punchInDate) {
- // 设置任务连续状态
- ContinueStatusEnum oldTaskContinueStatus = piStatus.getTaskContinueStatus();
- piStatus.setTaskContinueStatus(punchInResult.equals(PunchInResultEnum.DONE)
- ? ContinueStatusEnum.CONTINUE : ContinueStatusEnum.INTERRUPTED);
- piStatus.setTaskContinueDay(oldTaskContinueStatus.equals(piStatus.getTaskContinueStatus())
- ? piStatus.getTaskContinueDay() + 1 : 1);
- // 旧的连续阶段
- ContinueStageEnum oldContinueStage = piStatus.getContinueStage();
- // 判断当前处于的连续阶段
- ContinueStageEnum continueStageResult =
- punchInCoreManager.judgeContinueStage(continueTask, punchInResult, piStatus, punchInDate);
- piStatus.setContinueStage(continueStageResult);
- // 下面3种情况不处理:宽限期 变 宽限期;正常打卡期 变 正常打卡期;惩罚期 变 惩罚期;
- // 宽限期 变 正常打卡期,则设置阶段开始时间,重置中断次数
- if (ContinueStageEnum.GRACE_STAGE.equals(oldContinueStage)
- && ContinueStageEnum.NORMAL_STAGE.equals(continueStageResult)) {
- piStatus.setStageStartDate(punchInDate);
- piStatus.setContinueInterruptedCount(0);
- }
- // 如果正常打卡期 变 惩罚期,则设置阶段开始时间和阶段结束时间,增加中断次数
- if (ContinueStageEnum.NORMAL_STAGE.equals(oldContinueStage)
- && ContinueStageEnum.PENALTY_STAGE.equals(continueStageResult)) {
- piStatus.setStageStartDate(punchInDate);
- piStatus.setStageEndDate(punchInDate.plusDays(continueTask.getPenaltyDay()));
- piStatus.setContinueInterruptedCount(piStatus.getContinueInterruptedCount() + 1);
- }
- // 如果惩罚期 变 正常打卡期,则设置阶段开始时间
- if (ContinueStageEnum.PENALTY_STAGE.equals(oldContinueStage)
- && ContinueStageEnum.NORMAL_STAGE.equals(continueStageResult)) {
- piStatus.setStageStartDate(punchInDate);
- }
- }
- @Override
- @Transactional(rollbackFor = Exception.class)
- public void distributePoints(LocalDate settleDate) {
- // 查询结算记录
- SettleUserHistoryQuery settleUserHistoryQuery = new SettleUserHistoryQuery();
- settleUserHistoryQuery.setSettleDate(settleDate.toString());
- settleUserHistoryQuery.setDistributeStatus(PointsDistributeStatusEnum.NOT_DISTRIBUTE);
- List<SettleUserHistory> settleUserHistories = settleUserHistoryService.querySettleUserHistory(settleUserHistoryQuery);
- if (CollectionUtils.isEmpty(settleUserHistories)) {
- log.info("========== 积分分发定时任务,没有可分发的积分 结束执行 ==========");
- return;
- }
- // 用户ID-用户结算记录关联
- Map<Long, SettleUserHistory> settleUserHistoryMap = settleUserHistories.stream().collect(Collectors.toMap(SettleUserHistory::getUserId, Function.identity(), (key1, key2) -> key1));
- // 用户ID列表
- Set<Long> userIds = settleUserHistories.stream().map(SettleUserHistory::getUserId).collect(Collectors.toSet());
- // 用户信息, 用户ID-用户信息关联
- List<User> users = userService.listByIds(userIds);
- Map<Long, User> userMap = users.stream().collect(Collectors.toMap(User::getId, Function.identity(), (key1, key2) -> key1));
- // 获取账户信息,用户ID-账户信息关联
- AccountQuery accountQuery = new AccountQuery();
- accountQuery.setAccountCategory(AccountCategoryEnum.BASIC);
- accountQuery.setUserIds(userIds);
- List<Account> accounts = accountService.getAccountByCondition(accountQuery);
- Map<Long, Account> accountMap = accounts.stream().collect(Collectors.toMap(Account::getUserId, Function.identity(), (key1, key2) -> key1));
- // 用户信息 更新列表
- List<User> updateUserList = new ArrayList<>();
- // 账户信息 更新列表
- List<Account> updateAccountList = new ArrayList<>();
- // 转账记录 新增列表
- List<AccountTransferHistory> addAccountTransferHistories = new ArrayList<>();
- // 结算用户信息 更新列表
- List<SettleUserHistory> updateSettleUserHistories = new ArrayList<>();
- for (Long userId : userIds) {
- // 用户信息
- User user = userMap.get(userId);
- // 账户信息
- Account account = accountMap.get(userId);
- // 结算信息
- SettleUserHistory oldSettleUserHistory = settleUserHistoryMap.get(userId);
- // 结算积分
- Integer settlePoints = Optional.ofNullable(oldSettleUserHistory.getSettlePoints()).orElse(0);
- // 获取并设置用户信息
- Integer beforeTotalPoints = Optional.ofNullable(user.getTotalPoints()).orElse(0);
- Integer beforeUnusedPoints = Optional.ofNullable(user.getUnusedPoints()).orElse(0);
- User updateUser = new User();
- updateUser.setId(user.getId());
- updateUser.setTotalPoints(beforeTotalPoints + settlePoints);
- updateUser.setUnusedPoints(beforeUnusedPoints + settlePoints);
- updateUserList.add(user);
- // 更新账户信息
- Integer beforeAccountPoints = Optional.ofNullable(account.getPoints()).orElse(0);
- account.setPoints(beforeAccountPoints + settlePoints);
- updateAccountList.add(account);
- // 增加账户转账记录
- AccountTransferHistory accountTransferHistory = new AccountTransferHistory();
- accountTransferHistory.setUserId(userId);
- accountTransferHistory.setTransferPoints(settlePoints);
- accountTransferHistory.setTransferCategory(TransferCategoryEnum.SETTLE);
- accountTransferHistory.setRecipientAccountId(account.getId());
- accountTransferHistory.setRaPointsBeforeTransfer(beforeAccountPoints);
- accountTransferHistory.setRaPointsAfterTransfer(account.getPoints());
- addAccountTransferHistories.add(accountTransferHistory);
- // 设置结算积分记录
- SettleUserHistory updateSettleUserHistory = new SettleUserHistory();
- updateSettleUserHistory.setId(oldSettleUserHistory.getId());
- updateSettleUserHistory.setBeforeSettlePoints(beforeTotalPoints);
- updateSettleUserHistory.setAfterSettlePoints(beforeTotalPoints + settlePoints);
- updateSettleUserHistory.setDistributeStatus(PointsDistributeStatusEnum.DISTRIBUTE);
- updateSettleUserHistories.add(updateSettleUserHistory);
- }
- if (!CollectionUtils.isEmpty(updateUserList)) {
- userService.batchUpdate(updateUserList);
- }
- if (!CollectionUtils.isEmpty(updateAccountList)) {
- accountService.batchUpdate(updateAccountList);
- }
- if (!CollectionUtils.isEmpty(addAccountTransferHistories)) {
- accountTransferHistoryService.insertList(addAccountTransferHistories);
- }
- if (!CollectionUtils.isEmpty(updateSettleUserHistories)) {
- settleUserHistoryService.batchUpdate(updateSettleUserHistories);
- }
- }
- }
|