فهرست منبع

feat: check user sign base on approve

shc 1 سال پیش
والد
کامیت
7e1b0cd36d

+ 48 - 6
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmUserSignServiceImpl.java

@@ -37,6 +37,8 @@ import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 /**
@@ -56,6 +58,7 @@ public class WmUserSignServiceImpl extends ServiceImpl<WmUserSignMapper, WmUserS
 	private final WmScorePackageService wmScorePackageService;
 	private final WmScorePackageStatusService wmScorePackageStatusService;
 	private final WmTaskService wmTaskService;
+	private final WmTaskContentService taskContentService;
 	private final SysPublicParamService sysPublicParamService;
 	private final WmDeptTaskTypeTemplateService wmDeptTaskTypeTemplateService;
 	private final WmUserSignDetailService wmUserSignDetailService;
@@ -510,8 +513,47 @@ public class WmUserSignServiceImpl extends ServiceImpl<WmUserSignMapper, WmUserS
 			return;
 		}
 
+		Set<Integer> signIds = signs.stream().map(WmUserSign::getId).collect(Collectors.toSet());
+
+		List<WmTaskContent> taskContents = taskContentService.list(Wrappers.<WmTaskContent>lambdaQuery().in(WmTaskContent::getTemp3, signIds));
+
+		List<WmTaskContent> availTaskContents = taskContents.stream().filter(con -> StrUtil.isNotBlank(con.getTemp3())).collect(Collectors.toList());
+
+		if (CollUtil.isEmpty(availTaskContents)) {
+			log.info("当前用户本月不存在打卡任务记录,放行");
+			return;
+		}
+
+		Map<String, String> signIdAndContentIdMap = availTaskContents.stream().collect(Collectors.toMap(WmTaskContent::getTemp3, cont -> cont.getId().toString()));
+
+		List<WmTask> taskList = wmTaskService.list(Wrappers.<WmTask>lambdaQuery()
+				.eq(WmTask::getTaskUserId, wmUserSign.getSignUserid())
+				.eq(WmTask::getTaskTypeId, taskTypeId)
+				.in(WmTask::getTaskContentId, signIdAndContentIdMap.values()));
+
+		Map<String, WmTask> taskMap = taskList.stream().collect(Collectors.toMap(WmTask::getTaskContentId, Function.identity()));
+
+		List<WmUserSign> availSigned = signs.stream().filter(sign -> {
+			String contId = signIdAndContentIdMap.get(sign.getId().toString());
+
+			if (StrUtil.isNotBlank(contId)){
+				return false;
+			}
+
+			WmTask wmTask = taskMap.get(contId);
+
+			if (wmTask == null){
+				return false;
+			}
+
+			String taskStatus = wmTask.getTaskStatus();
+
+			return "2".equals(taskStatus) || "3".equals(taskStatus);
+
+		}).collect(Collectors.toList());
+
 		// 校验 同一个人,对同一拜访对象
-		Map<String, List<WmUserSign>> collect = signs.stream().collect(Collectors.groupingBy(WmUserSign::getSignEntId));
+		Map<String, List<WmUserSign>> collect = availSigned.stream().collect(Collectors.groupingBy(WmUserSign::getSignEntId));
 		List<WmUserSign> wmUserSigns = collect.get(wmUserSign.getSignEntId());
 		if (CollUtil.isNotEmpty(wmUserSigns)) {
 
@@ -553,7 +595,7 @@ public class WmUserSignServiceImpl extends ServiceImpl<WmUserSignMapper, WmUserS
 
 
 		//  校验当日的拜访限制
-		int currCount = signs.size();
+		int currCount = availSigned.size();
 		log.info("当前用户本月已完成打卡次数:[{}]", currCount);
 		Integer monthLimit = totalLimitMap.get("MONTH");
 		log.info("拜访次数上限打卡每月限制:[{}]", monthLimit);
@@ -566,7 +608,7 @@ public class WmUserSignServiceImpl extends ServiceImpl<WmUserSignMapper, WmUserS
 		log.info("拜访次数上限打卡每天限制:[{}]", dailyLimit);
 		if (dailyLimit != null) {
 			LocalDateTime todayStart = LocalDateTime.of(now.toLocalDate(), LocalTime.MIN);
-			long dailyCount = signs.stream().filter(sign -> sign.getSignDate().isAfter(todayStart)).count();
+			long dailyCount = availSigned.stream().filter(sign -> sign.getSignDate().isAfter(todayStart)).count();
 			log.info("当前用户本日已完成打卡次数:[{}]", dailyCount);
 			if (dailyLimit <= dailyCount) {
 				log.warn("超过拜访次数上限打卡每日限制:{} {}", wmUserSign.getSignUserid(), wmUserSign.getSignEntName());
@@ -578,7 +620,7 @@ public class WmUserSignServiceImpl extends ServiceImpl<WmUserSignMapper, WmUserS
 		log.info("拜访次数上限打卡每小时限制:[{}]", hourLimit);
 		if (hourLimit != null) {
 			LocalDateTime hourStart = now.minusHours(1L);
-			long hourCount = signs.stream().filter(sign -> sign.getSignDate().isAfter(hourStart)).count();
+			long hourCount = availSigned.stream().filter(sign -> sign.getSignDate().isAfter(hourStart)).count();
 			log.info("当前用户本小时已完成打卡次数:[{}]", hourCount);
 			if (hourLimit <= hourCount) {
 				log.warn("超过拜访次数上限打卡每小时限制:{} {}", wmUserSign.getSignUserid(), wmUserSign.getSignEntName());
@@ -661,9 +703,9 @@ public class WmUserSignServiceImpl extends ServiceImpl<WmUserSignMapper, WmUserS
 	 * 保存签到详情
 	 *
 	 * @param wmUserSign 打卡信息
-	 * @param deptId 部门id
+	 * @param deptId     部门id
 	 * @param taskTypeId 任务类型id
-	 * @param baseScore 任务类型规则分数
+	 * @param baseScore  任务类型规则分数
 	 * @return int 任务实际分值(拜访科室数 * 任务类型规则分数)
 	 */
 	private int saveSignDetail(WmUserSign wmUserSign, Integer deptId, String taskTypeId, Integer baseScore) {