浏览代码

Merge branch 'feat-usersign'

shc 1 年之前
父节点
当前提交
f434b0b8b2

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

@@ -38,6 +38,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;
 
 /**
@@ -57,6 +59,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;
@@ -396,7 +399,7 @@ public class WmUserSignServiceImpl extends ServiceImpl<WmUserSignMapper, WmUserS
 	private void checkByRule(String taskTypeId, WmUserSign wmUserSign, String relatedServiceEntId) {
 		// 校验药店打卡
 		if ("33".equals(taskTypeId)) {
-			checkPharmacySign(wmUserSign);
+			checkPharmacySign(relatedServiceEntId, wmUserSign);
 		}
 		// 医院拜访
 		else if ("5".equals(taskTypeId)) {
@@ -413,22 +416,11 @@ public class WmUserSignServiceImpl extends ServiceImpl<WmUserSignMapper, WmUserS
 	/**
 	 * 校验药店打卡
 	 *
-	 * @param wmUserSign 签到信息
+	 * @param relatedServiceEntId 关联企业
+	 * @param wmUserSign          签到信息
 	 */
-	private void checkPharmacySign(WmUserSign wmUserSign) {
-		// 一个用户,在同一打卡地点,4小时内只能打卡一次
-		int total = this.count(Wrappers.<WmUserSign>lambdaQuery()
-				.eq(WmUserSign::getSignUserid, wmUserSign.getSignUserid())
-				.eq(WmUserSign::getSignEntId, wmUserSign.getSignEntId())
-				.gt(WmUserSign::getSignDate, LocalDateTime.now().minus(4, ChronoUnit.HOURS)));
-		// 一个用户,半小时内只能打卡一次
-		int halfHourTotal = this.count(Wrappers.<WmUserSign>lambdaQuery()
-				.eq(WmUserSign::getSignUserid, wmUserSign.getSignUserid())
-				.gt(WmUserSign::getSignDate, LocalDateTime.now().minus(30, ChronoUnit.MINUTES)));
-		if (total != 0 || halfHourTotal != 0) {
-			log.warn("打卡间隔过短:{} {}", wmUserSign.getSignUserid(), wmUserSign.getSignEntName());
-			throw new BizException("打卡间隔过短");
-		}
+	private void checkPharmacySign(String relatedServiceEntId, WmUserSign wmUserSign) {
+		checkCommonSign("33", relatedServiceEntId, wmUserSign);
 	}
 
 	/**
@@ -538,8 +530,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());
+			log.info("任务内容ID为:[{}]", contId);
+			if (StrUtil.isBlank(contId)) {
+				return false;
+			}
+
+			WmTask wmTask = taskMap.get(contId);
+
+			if (wmTask == null) {
+				return false;
+			}
+
+			String taskStatus = wmTask.getTaskStatus();
+			log.info("当前任务ID:[{}], 对应的任务状态为:[{}]", contId, taskStatus);
+			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)) {
 
@@ -581,7 +612,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);
@@ -594,7 +625,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());
@@ -606,7 +637,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());
@@ -693,9 +724,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) {