|
|
@@ -1,5 +1,7 @@
|
|
|
package com.punchsettle.server.service.manager.impl;
|
|
|
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.math.RoundingMode;
|
|
|
import java.time.LocalDate;
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.Arrays;
|
|
|
@@ -13,19 +15,34 @@ import java.util.stream.Collectors;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.cache.annotation.Cacheable;
|
|
|
import org.springframework.stereotype.Component;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
import org.springframework.util.CollectionUtils;
|
|
|
|
|
|
+import com.punchsettle.server.atomic.IStatPiTaskService;
|
|
|
+import com.punchsettle.server.atomic.StatPiTask;
|
|
|
+import com.punchsettle.server.atomic.entity.PiTask;
|
|
|
import com.punchsettle.server.atomic.entity.PiTaskHistory;
|
|
|
+import com.punchsettle.server.atomic.entity.SettleTaskRelaHistory;
|
|
|
import com.punchsettle.server.atomic.entity.StatNewUser;
|
|
|
+import com.punchsettle.server.atomic.entity.StatPiTaskMonth;
|
|
|
+import com.punchsettle.server.atomic.entity.StatPiTaskWeek;
|
|
|
+import com.punchsettle.server.atomic.entity.StatPiTaskYear;
|
|
|
import com.punchsettle.server.atomic.entity.StatPoints;
|
|
|
import com.punchsettle.server.atomic.service.IPiTaskHistoryService;
|
|
|
+import com.punchsettle.server.atomic.service.IPiTaskService;
|
|
|
+import com.punchsettle.server.atomic.service.ISettleTaskRelaHistoryService;
|
|
|
import com.punchsettle.server.atomic.service.IStatNewUserService;
|
|
|
+import com.punchsettle.server.atomic.service.IStatPiTaskWeekService;
|
|
|
import com.punchsettle.server.atomic.service.IStatPointsService;
|
|
|
import com.punchsettle.server.constant.CacheNameConstant;
|
|
|
import com.punchsettle.server.constant.PunchInResultEnum;
|
|
|
+import com.punchsettle.server.constant.SettleResultEnum;
|
|
|
+import com.punchsettle.server.constant.StatPeriodEnum;
|
|
|
import com.punchsettle.server.core.config.BizProperties;
|
|
|
import com.punchsettle.server.pojo.punchIn.PiTaskHistoryQuery;
|
|
|
+import com.punchsettle.server.pojo.settle.SettleTaskRelaHistoryQuery;
|
|
|
import com.punchsettle.server.pojo.stat.StatNewUserQuery;
|
|
|
+import com.punchsettle.server.pojo.stat.StatPiTaskQuery;
|
|
|
import com.punchsettle.server.pojo.stat.StatPointsQuery;
|
|
|
import com.punchsettle.server.pojo.ucharts.LineSeriesVO;
|
|
|
import com.punchsettle.server.pojo.ucharts.LineVO;
|
|
|
@@ -42,6 +59,11 @@ import com.punchsettle.server.utiis.UserUtils;
|
|
|
@Component
|
|
|
public class StatManagerImpl implements IStatManager {
|
|
|
|
|
|
+ /**
|
|
|
+ * 数值100
|
|
|
+ */
|
|
|
+ private static final BigDecimal ONE_HUNDRED = BigDecimal.valueOf(100);
|
|
|
+
|
|
|
@Autowired
|
|
|
private IStatPointsService statPointsService;
|
|
|
|
|
|
@@ -54,6 +76,15 @@ public class StatManagerImpl implements IStatManager {
|
|
|
@Autowired
|
|
|
private BizProperties bizProperties;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private IStatPiTaskWeekService statPiTaskWeekService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private ISettleTaskRelaHistoryService settleTaskRelaHistoryService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private IPiTaskService piTaskService;
|
|
|
+
|
|
|
@Override
|
|
|
@Cacheable(cacheNames = CacheNameConstant.STAT_POINTS_LINE, key = "T(com.punchsettle.server.utiis.UserUtils).getCurrentUserId()")
|
|
|
public LineVO queryStatPointsLine() {
|
|
|
@@ -197,4 +228,111 @@ public class StatManagerImpl implements IStatManager {
|
|
|
lineVO.setSeries(Arrays.asList(totalTaskCountLineSeriesVO, punchInTaskCountLineSeriesVO, doneTaskCountLineSeriesVO));
|
|
|
return lineVO;
|
|
|
}
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public void statPiTaskData(IStatPiTaskService statPiTaskService, StatPeriodEnum statPeriod, List<Long> userIds, LocalDate statTime, LocalDate statFirstDay, LocalDate statLastDay) {
|
|
|
+ // 查询任务数据
|
|
|
+ List<PiTask> piTasks = piTaskService.getActiveTask(userIds);
|
|
|
+ // 没有待统计任务跳过
|
|
|
+ if (CollectionUtils.isEmpty(piTasks)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ StatPiTaskQuery statPiTaskQuery = new StatPiTaskQuery();
|
|
|
+ statPiTaskQuery.setStatTime(statTime.toString());
|
|
|
+ statPiTaskQuery.setUserIds(userIds);
|
|
|
+ List<StatPiTask> statPiTaskDatas = statPiTaskService.queryByCondition(statPiTaskQuery);
|
|
|
+ // 任务唯一ID - 周统计数据
|
|
|
+ Map<Long, StatPiTask> statPiTaskDataMap = statPiTaskDatas.stream().collect(Collectors.toMap(StatPiTask::getTaskUniqueId, Function.identity(), (key1, key2) -> key1));
|
|
|
+
|
|
|
+ // 查询已结算数据
|
|
|
+ SettleTaskRelaHistoryQuery settleTaskRelaHistoryQuery = new SettleTaskRelaHistoryQuery();
|
|
|
+ settleTaskRelaHistoryQuery.setUserIds(userIds);
|
|
|
+ settleTaskRelaHistoryQuery.setSettleDateFrom(statFirstDay.toString());
|
|
|
+ settleTaskRelaHistoryQuery.setSettleDateTo(statLastDay.toString());
|
|
|
+ settleTaskRelaHistoryQuery.setSettleResult(SettleResultEnum.SETTLE);
|
|
|
+ List<SettleTaskRelaHistory> settleTaskRelaHistorieList = settleTaskRelaHistoryService.queryByCondition(settleTaskRelaHistoryQuery);
|
|
|
+ // 任务唯一ID - 结算任务关联记录
|
|
|
+ Map<Long, List<SettleTaskRelaHistory>> settleTaskRelaHistoryMap = settleTaskRelaHistorieList.stream().collect(Collectors.groupingBy(SettleTaskRelaHistory::getPiTaskUniqueId));
|
|
|
+
|
|
|
+ // 新增
|
|
|
+ List<StatPiTask> addStatPiTaskWeekList = new ArrayList<>();
|
|
|
+ // 更新
|
|
|
+ List<StatPiTask> updateStatPiTaskWeekList = new ArrayList<>();
|
|
|
+
|
|
|
+ for (PiTask piTask : piTasks) {
|
|
|
+ // 获取结算数据
|
|
|
+ List<SettleTaskRelaHistory> settleTaskRelaHistories = settleTaskRelaHistoryMap.get(piTask.getUniqueId());
|
|
|
+ // 统计数据
|
|
|
+ StatPiTask newStatPiTask = statPiTaskData(statPeriod, settleTaskRelaHistories);
|
|
|
+ // 获取统计数据
|
|
|
+ StatPiTask oldStatPiTaskWeek = statPiTaskDataMap.get(piTask.getUniqueId());
|
|
|
+
|
|
|
+ // 如果没有统计数据,则创建
|
|
|
+ if (Objects.isNull(oldStatPiTaskWeek)) {
|
|
|
+ newStatPiTask.setUserId(piTask.getCreatedBy());
|
|
|
+ newStatPiTask.setTaskUniqueId(piTask.getUniqueId());
|
|
|
+ newStatPiTask.setStatTime(statTime.toString());
|
|
|
+ addStatPiTaskWeekList.add(newStatPiTask);
|
|
|
+ } else {
|
|
|
+ newStatPiTask.setId(oldStatPiTaskWeek.getId());
|
|
|
+ updateStatPiTaskWeekList.add(newStatPiTask);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!CollectionUtils.isEmpty(addStatPiTaskWeekList)) {
|
|
|
+ statPiTaskWeekService.insertList(addStatPiTaskWeekList);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!CollectionUtils.isEmpty(updateStatPiTaskWeekList)) {
|
|
|
+ statPiTaskWeekService.batchUpdate(updateStatPiTaskWeekList);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 重新统计打卡任务数据,如果不存在结算记录,则所有数据为0
|
|
|
+ * @param statPeriod 统计周期
|
|
|
+ * @param settleTaskRelaHistories 结算记录
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private StatPiTask statPiTaskData(StatPeriodEnum statPeriod, List<SettleTaskRelaHistory> settleTaskRelaHistories) {
|
|
|
+ List<SettleTaskRelaHistory> list = CollectionUtils.isEmpty(settleTaskRelaHistories) ? List.of() : settleTaskRelaHistories.stream().filter(v -> SettleResultEnum.SETTLE.equals(v.getSettleResult())).toList();
|
|
|
+ // 总需打卡数
|
|
|
+ int punchInTotalCount = list.size();
|
|
|
+ // 打卡数
|
|
|
+ int punchInCount = (int) list.stream().filter(v -> Objects.nonNull(v.getPiTaskHistoryId())).count();
|
|
|
+ // 打卡完成数
|
|
|
+ int punchInDoneCount = (int) list.stream().filter(v -> Optional.ofNullable(v.getSettlePoints()).orElse(0) > 0).count();
|
|
|
+ // 总结算积分
|
|
|
+ Integer settlePoints = list.stream().map(v -> Optional.ofNullable(v.getSettlePoints()).orElse(0)).reduce(0, Integer::sum);
|
|
|
+
|
|
|
+ // 打卡率
|
|
|
+ BigDecimal punchInRate = BigDecimal.ZERO;
|
|
|
+ // 打卡完成率
|
|
|
+ BigDecimal punchInDoneRate = BigDecimal.ZERO;
|
|
|
+ if (punchInTotalCount != 0) {
|
|
|
+ BigDecimal punchInTotalCountVal = BigDecimal.valueOf(punchInTotalCount);
|
|
|
+ punchInRate = BigDecimal.valueOf(punchInCount).divide(punchInTotalCountVal, 4, RoundingMode.HALF_UP).multiply(ONE_HUNDRED);
|
|
|
+ punchInDoneRate = BigDecimal.valueOf(punchInDoneCount).divide(punchInTotalCountVal, 4, RoundingMode.HALF_UP).multiply(ONE_HUNDRED);
|
|
|
+ }
|
|
|
+
|
|
|
+ StatPiTask statPiTask = null;
|
|
|
+ if (StatPeriodEnum.WEEK.equals(statPeriod)) {
|
|
|
+ statPiTask = new StatPiTaskWeek();
|
|
|
+ } else if (StatPeriodEnum.MONTH.equals(statPeriod)) {
|
|
|
+ statPiTask = new StatPiTaskMonth();
|
|
|
+ } else if (StatPeriodEnum.YEAR.equals(statPeriod)) {
|
|
|
+ statPiTask = new StatPiTaskYear();
|
|
|
+ }
|
|
|
+
|
|
|
+ statPiTask.setPunchInTotalCount(punchInTotalCount);
|
|
|
+ statPiTask.setPunchInCount(punchInCount);
|
|
|
+ statPiTask.setPunchInDoneCount(punchInDoneCount);
|
|
|
+ statPiTask.setPunchInRate(punchInRate);
|
|
|
+ statPiTask.setPunchInDoneRate(punchInDoneRate);
|
|
|
+ statPiTask.setPoints(settlePoints);
|
|
|
+ return statPiTask;
|
|
|
+ }
|
|
|
+
|
|
|
}
|