|
@@ -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) {
|