|
|
@@ -1,8 +1,9 @@
|
|
|
package com.punchsettle.server.service.manager.impl;
|
|
|
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.math.RoundingMode;
|
|
|
import java.time.LocalDate;
|
|
|
import java.time.LocalTime;
|
|
|
-import java.time.format.DateTimeFormatter;
|
|
|
import java.util.Arrays;
|
|
|
import java.util.Comparator;
|
|
|
import java.util.List;
|
|
|
@@ -13,6 +14,10 @@ import java.util.Set;
|
|
|
import java.util.function.Function;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
+import com.punchsettle.server.atomic.entity.SettleTaskRelaHistory;
|
|
|
+import com.punchsettle.server.atomic.service.ISettleTaskRelaHistoryService;
|
|
|
+import com.punchsettle.server.constant.SettleResultEnum;
|
|
|
+import com.punchsettle.server.pojo.settle.SettleTaskRelaHistoryQuery;
|
|
|
import org.springframework.beans.BeanUtils;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.cache.annotation.Cacheable;
|
|
|
@@ -45,7 +50,6 @@ import com.punchsettle.server.constant.StatPeriodEnum;
|
|
|
import com.punchsettle.server.constant.VersionStatusEnum;
|
|
|
import com.punchsettle.server.pojo.punchIn.PiTaskHistoryQuery;
|
|
|
import com.punchsettle.server.pojo.punchIn.PiTaskHistorySimpleVO;
|
|
|
-import com.punchsettle.server.pojo.punchIn.PiTaskHistoryStatVO;
|
|
|
import com.punchsettle.server.pojo.punchIn.PiTaskHistoryVO;
|
|
|
import com.punchsettle.server.pojo.punchIn.PiTaskQuery;
|
|
|
import com.punchsettle.server.pojo.punchIn.PiTaskRequest;
|
|
|
@@ -104,11 +108,19 @@ public class PunchInManagerImpl implements IPunchInManager {
|
|
|
@Autowired
|
|
|
private IPiStatusService piStatusService;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private ISettleTaskRelaHistoryService settleTaskRelaHistoryService;
|
|
|
+
|
|
|
/**
|
|
|
* 默认时间00:00:00.000
|
|
|
*/
|
|
|
private static final LocalTime ZERO_TIME = LocalTime.parse("00:00:00.000");
|
|
|
|
|
|
+ /**
|
|
|
+ * 数值60
|
|
|
+ */
|
|
|
+ private static final BigDecimal SIXTY = new BigDecimal("60");
|
|
|
+
|
|
|
@Override
|
|
|
public List<PiTaskToDoVO> queryToDoList(Long currentUserId) {
|
|
|
Assert.isNull(currentUserId);
|
|
|
@@ -541,37 +553,85 @@ public class PunchInManagerImpl implements IPunchInManager {
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
-// @Cacheable(cacheNames = CacheNameConstant.TASK_STAT, key = "T(com.punchsettle.server.utiis.UserUtils).getCurrentUserId()+'_'+#query.taskId+'_'+#query.statTime", condition = "#query.taskId != null && #query.statTime != null && !#query.statTime.isBlank()")
|
|
|
+ @Cacheable(cacheNames = CacheNameConstant.STAT_TASK, key = "T(com.punchsettle.server.utiis.UserUtils).getCurrentUserId()+'_'+#query.taskId+'_'+#query.statTime", condition = "#query.taskId != null && #query.statTime != null && !#query.statTime.isBlank()")
|
|
|
public PiTaskStatVO queryStat(PiTaskStatQuery query) {
|
|
|
// 当前用户ID
|
|
|
Long currentUserId = UserUtils.getCurrentUserId();
|
|
|
// 查找打卡任务
|
|
|
PiTask piTask = Optional.ofNullable(piTaskService.getById(query.getTaskId())).orElseThrow(() -> BusinessException.fail("无法查询到该打卡任务"));
|
|
|
|
|
|
+ // 查询统计数据
|
|
|
+ StatPiTask statPiTask = null;
|
|
|
+ // 统计范围的第一天
|
|
|
+ LocalDate statFirstDate = null;
|
|
|
+ // 统计范围的最后一天
|
|
|
+ LocalDate statLastDay = null;
|
|
|
+ // 今天
|
|
|
+ LocalDate today = LocalDate.now();
|
|
|
+
|
|
|
// 构造查询条件
|
|
|
StatPiTaskQuery statPiTaskQuery = new StatPiTaskQuery();
|
|
|
statPiTaskQuery.setUserId(currentUserId);
|
|
|
statPiTaskQuery.setTaskUniqueId(piTask.getUniqueId());
|
|
|
statPiTaskQuery.setStatTime(query.getStatTime());
|
|
|
|
|
|
- // 查询统计数据
|
|
|
- StatPiTask statPiTask = null;
|
|
|
if (StatPeriodEnum.YEAR.equals(query.getStatPeriod())) {
|
|
|
statPiTask = statPiTaskYearService.queryOneByCondition(statPiTaskQuery);
|
|
|
+ statFirstDate = LocalDate.of(Integer.valueOf(query.getStatTime()), 1, 1);
|
|
|
+ statLastDay = DateUtils.getLastDayOfYear(statFirstDate);
|
|
|
} else if (StatPeriodEnum.MONTH.equals(query.getStatPeriod())) {
|
|
|
statPiTask = statPiTaskMonthService.queryOneByCondition(statPiTaskQuery);
|
|
|
- }
|
|
|
-
|
|
|
- if (Objects.isNull(statPiTask)) {
|
|
|
- return null;
|
|
|
+ String[] split = query.getStatTime().split("-");
|
|
|
+ statFirstDate = LocalDate.of(Integer.valueOf(split[0]), Integer.valueOf(split[1]), 1);
|
|
|
+ statLastDay = DateUtils.getLastDayOfYear(statFirstDate);
|
|
|
}
|
|
|
|
|
|
// 查询打卡记录
|
|
|
PiTaskHistoryQuery piTaskHistoryQuery = new PiTaskHistoryQuery();
|
|
|
piTaskHistoryQuery.setUserIds(Arrays.asList(currentUserId));
|
|
|
piTaskHistoryQuery.setPunchInDateLike(query.getStatTime());
|
|
|
+ piTaskHistoryQuery.setTaskUniqueIds(Arrays.asList(piTask.getUniqueId()));
|
|
|
List<PiTaskHistory> piTaskHistories = piTaskHistoryService.queryByCondition(piTaskHistoryQuery);
|
|
|
|
|
|
+ // 构造折线图数据
|
|
|
+ List<LocalDate> dateRangeInMonth = null;
|
|
|
+ if (today.isBefore(statLastDay)) {
|
|
|
+ dateRangeInMonth = DateUtils.getDateRange(statFirstDate, today);
|
|
|
+ } else {
|
|
|
+ dateRangeInMonth = DateUtils.getDateRange(statFirstDate, statLastDay);
|
|
|
+ }
|
|
|
+ // 横坐标
|
|
|
+ String[] categories = dateRangeInMonth.stream().map(v -> DateUtils.MM_DD_FORMATTER.format(v)).toArray(String[]::new);
|
|
|
+ // 打卡日期-打卡记录 关联
|
|
|
+ Map<String, PiTaskHistory> piTaskHistoryMap = piTaskHistories.stream().collect(Collectors.toMap(piTaskHistory -> piTaskHistory.getPunchInDate().substring(5), Function.identity(), (key1, key2) -> key1));
|
|
|
+ Object[] seriesData = Arrays.stream(categories).map(category -> {
|
|
|
+ PiTaskHistory piTaskHistory = piTaskHistoryMap.get(category);
|
|
|
+ if (Objects.isNull(piTaskHistory)) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ if (PunchInMethodEnum.SINGLE.equals(piTask.getPunchInMethod())) {
|
|
|
+ return PunchInResultEnum.DONE.equals(piTaskHistory.getPunchInResult()) ? 1 : 0;
|
|
|
+ }
|
|
|
+ if (PunchInMethodEnum.COUNT.equals(piTask.getPunchInMethod())) {
|
|
|
+ return Optional.ofNullable(piTaskHistory.getCountTrack()).orElse(0);
|
|
|
+ }
|
|
|
+ if (PunchInMethodEnum.TIMING.equals(piTask.getPunchInMethod())) {
|
|
|
+ LocalTime timeTrack = Optional.ofNullable(piTaskHistory.getTimeTrack()).orElse(ZERO_TIME);
|
|
|
+ BigDecimal hourVal = BigDecimal.valueOf(timeTrack.getHour());
|
|
|
+ BigDecimal minVal = BigDecimal.valueOf(timeTrack.getMinute()).divide(SIXTY, 2, RoundingMode.HALF_UP);
|
|
|
+ return hourVal.add(minVal);
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }).toArray();
|
|
|
+
|
|
|
+ // 构建折线图数据
|
|
|
+ LineSeriesVO lineSeriesVO = new LineSeriesVO();
|
|
|
+ lineSeriesVO.setName("每日打卡数据");
|
|
|
+ lineSeriesVO.setData(seriesData);
|
|
|
+ LineVO lineVO = new LineVO();
|
|
|
+ lineVO.setCategories(categories);
|
|
|
+ lineVO.setSeries(Arrays.asList(lineSeriesVO));
|
|
|
+
|
|
|
// 查询打卡任务
|
|
|
Set<Long> piTaskIds = piTaskHistories.stream().map(PiTaskHistory::getTaskId).collect(Collectors.toSet());
|
|
|
PiTaskQuery piTaskQuery = new PiTaskQuery();
|
|
|
@@ -580,35 +640,42 @@ public class PunchInManagerImpl implements IPunchInManager {
|
|
|
// 打卡任务ID-打卡任务对象关联
|
|
|
Map<Long, PiTask> piTaskMap = piTasks.stream().collect(Collectors.toMap(PiTask::getId, Function.identity(), (key1, key2) -> key1));
|
|
|
|
|
|
- // 统计范围的第一天
|
|
|
- String statFirstTimeStr = null;
|
|
|
- if (StatPeriodEnum.MONTH.equals(query.getStatPeriod())) {
|
|
|
- String[] split = query.getStatTime().split("-");
|
|
|
- statFirstTimeStr = String.format("%s-%s-01", split[0], split[1]);
|
|
|
- }
|
|
|
- LocalDate statFirstTime = LocalDate.parse(statFirstTimeStr);
|
|
|
- List<LocalDate> dateRangeInMonth = DateUtils.getDateRange(statFirstTime, LocalDate.now());
|
|
|
- DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("MM-dd");
|
|
|
- String[] categories = dateRangeInMonth.stream().map(v -> dateTimeFormatter.format(v)).toArray(String[]::new);
|
|
|
- Integer[] lineSeriesData = piTaskHistories.stream().map(PiTaskHistory::getCountTrack).toArray(Integer[]::new);
|
|
|
-
|
|
|
- LineSeriesVO lineSeriesVO = new LineSeriesVO();
|
|
|
- lineSeriesVO.setName("每日打卡次数");
|
|
|
- lineSeriesVO.setData(lineSeriesData);
|
|
|
- LineVO lineVO = new LineVO();
|
|
|
- lineVO.setCategories(categories);
|
|
|
- lineVO.setSeries(Arrays.asList(lineSeriesVO));
|
|
|
+ // 获取结算数据
|
|
|
+ SettleTaskRelaHistoryQuery settleTaskRelaHistoryQuery = new SettleTaskRelaHistoryQuery();
|
|
|
+ settleTaskRelaHistoryQuery.setSettleDateFrom(statFirstDate.toString());
|
|
|
+ settleTaskRelaHistoryQuery.setSettleDateTo(statLastDay.toString());
|
|
|
+ settleTaskRelaHistoryQuery.setUserIds(Arrays.asList(UserUtils.getCurrentUserId()));
|
|
|
+ settleTaskRelaHistoryQuery.setSettleResults(Arrays.asList(SettleResultEnum.SETTLED, SettleResultEnum.NO_SETTLED));
|
|
|
+ settleTaskRelaHistoryQuery.setTaskUniqueId(piTask.getUniqueId());
|
|
|
+ List<SettleTaskRelaHistory> settleTaskRelaHistories = settleTaskRelaHistoryService.queryByCondition(settleTaskRelaHistoryQuery);
|
|
|
+ // 结算日期 - 结算信息 关联
|
|
|
+ Map<String, SettleTaskRelaHistory> settleTaskRelaHistoryMap = settleTaskRelaHistories.stream().collect(Collectors.toMap(SettleTaskRelaHistory::getSettleDate, Function.identity(), (key1, key2) -> key1));
|
|
|
|
|
|
// 组装数据
|
|
|
- List<PiTaskHistoryStatVO> piTaskHistoryStatVOS = piTaskHistories.stream().map(piTaskHistory -> {
|
|
|
- PiTaskHistoryStatVO piTaskHistoryStatVO = new PiTaskHistoryStatVO();
|
|
|
- BeanUtils.copyProperties(piTaskHistory, piTaskHistoryStatVO);
|
|
|
- return piTaskHistoryStatVO;
|
|
|
+ List<PiTaskHistoryVO> piTaskHistoryVOS = piTaskHistories.stream().map(piTaskHistory -> {
|
|
|
+ PiTask tempPiTask = piTaskMap.get(piTaskHistory.getTaskId());
|
|
|
+ SettleTaskRelaHistory settleTaskRelaHistory = settleTaskRelaHistoryMap.get(piTaskHistory.getPunchInDate());
|
|
|
+
|
|
|
+ PiTaskHistoryVO piTaskHistoryVO = new PiTaskHistoryVO();
|
|
|
+ piTaskHistoryVO.setPunchInDate(piTaskHistory.getPunchInDate());
|
|
|
+ if (Objects.nonNull(tempPiTask)) {
|
|
|
+ piTaskHistoryVO.setPunchInMethod(tempPiTask.getPunchInMethod());
|
|
|
+ }
|
|
|
+ if (Objects.nonNull(settleTaskRelaHistory)) {
|
|
|
+ piTaskHistoryVO.setSettleResult(settleTaskRelaHistory.getSettleResult());
|
|
|
+ piTaskHistoryVO.setSettlePoints(Optional.ofNullable(settleTaskRelaHistory.getSettlePoints()).orElse(0));
|
|
|
+ }
|
|
|
+ piTaskHistoryVO.setPunchInResult(piTaskHistory.getPunchInResult());
|
|
|
+ piTaskHistoryVO.setCountTrack(piTaskHistory.getCountTrack());
|
|
|
+ piTaskHistoryVO.setTimeTrack(piTaskHistory.getTimeTrack());
|
|
|
+ return piTaskHistoryVO;
|
|
|
}).collect(Collectors.toList());
|
|
|
|
|
|
PiTaskStatVO piTaskStatVO = new PiTaskStatVO();
|
|
|
- BeanUtils.copyProperties(statPiTask, piTaskStatVO);
|
|
|
- piTaskStatVO.setPiTaskHistoryStatVOS(piTaskHistoryStatVOS);
|
|
|
+ if (Objects.nonNull(statPiTask)) {
|
|
|
+ BeanUtils.copyProperties(statPiTask, piTaskStatVO);
|
|
|
+ }
|
|
|
+ piTaskStatVO.setPiTaskHistoryVOS(piTaskHistoryVOS);
|
|
|
piTaskStatVO.setLineVO(lineVO);
|
|
|
return piTaskStatVO;
|
|
|
}
|
|
|
@@ -685,15 +752,32 @@ public class PunchInManagerImpl implements IPunchInManager {
|
|
|
List<PiTask> piTasks = piTaskService.queryByCondition(piTaskQuery);
|
|
|
// 任务ID - 任务信息
|
|
|
Map<Long, PiTask> piTaskMap = piTasks.stream().collect(Collectors.toMap(PiTask::getId, Function.identity(), (key1, key2) -> key1));
|
|
|
+
|
|
|
+ // 获取结算数据
|
|
|
+ SettleTaskRelaHistoryQuery settleTaskRelaHistoryQuery = new SettleTaskRelaHistoryQuery();
|
|
|
+ settleTaskRelaHistoryQuery.setSettleDate(punchInDate);
|
|
|
+ settleTaskRelaHistoryQuery.setUserIds(Arrays.asList(UserUtils.getCurrentUserId()));
|
|
|
+ settleTaskRelaHistoryQuery.setSettleResults(Arrays.asList(SettleResultEnum.SETTLED, SettleResultEnum.NO_SETTLED));
|
|
|
+ List<SettleTaskRelaHistory> settleTaskRelaHistories = settleTaskRelaHistoryService.queryByCondition(settleTaskRelaHistoryQuery);
|
|
|
+ // 任务唯一ID - 结算信息 关联
|
|
|
+ Map<Long, SettleTaskRelaHistory> settleTaskRelaHistoryMap = settleTaskRelaHistories.stream().collect(Collectors.toMap(SettleTaskRelaHistory::getPiTaskUniqueId, Function.identity(), (key1, key2) -> key1));
|
|
|
+
|
|
|
// 打卡记录
|
|
|
List<PiTaskHistoryVO> piTaskHistoryVOS = tempPiTaskHistories.stream().map(piTaskHistory -> {
|
|
|
+ // 获取打卡任务
|
|
|
PiTask piTask = piTaskMap.get(piTaskHistory.getTaskId());
|
|
|
+ // 获取结算信息
|
|
|
+ SettleTaskRelaHistory settleTaskRelaHistory = settleTaskRelaHistoryMap.get(piTaskHistory.getTaskUniqueId());
|
|
|
|
|
|
PiTaskHistoryVO piTaskHistoryVO = new PiTaskHistoryVO();
|
|
|
if (Objects.nonNull(piTask)) {
|
|
|
piTaskHistoryVO.setTaskName(piTask.getTaskName());
|
|
|
piTaskHistoryVO.setPunchInMethod(piTask.getPunchInMethod());
|
|
|
}
|
|
|
+ if (Objects.nonNull(settleTaskRelaHistory)) {
|
|
|
+ piTaskHistoryVO.setSettleResult(settleTaskRelaHistory.getSettleResult());
|
|
|
+ piTaskHistoryVO.setSettlePoints(settleTaskRelaHistory.getSettlePoints());
|
|
|
+ }
|
|
|
piTaskHistoryVO.setTimeTrack(piTaskHistory.getTimeTrack());
|
|
|
piTaskHistoryVO.setCountTrack(piTaskHistory.getCountTrack());
|
|
|
piTaskHistoryVO.setPunchInResult(piTaskHistory.getPunchInResult());
|
|
|
@@ -733,7 +817,7 @@ public class PunchInManagerImpl implements IPunchInManager {
|
|
|
cacheManager.batchEvictLike(Arrays.asList(CacheNameConstant.TASK_PUNCH_IN_HISTORY, CacheNameConstant.TASK_HISTORY_LIST_FOR_USER), String.valueOf(userId));
|
|
|
}
|
|
|
if (deleteStat) {
|
|
|
- cacheManager.batchEvictLike(Arrays.asList(CacheNameConstant.TASK_STAT), String.valueOf(userId));
|
|
|
+ cacheManager.batchEvictLike(Arrays.asList(CacheNameConstant.STAT_TASK), String.valueOf(userId));
|
|
|
}
|
|
|
|
|
|
}
|