소스 검색

feat: 签到

shc 2 년 전
부모
커밋
955f24d3c8
1개의 변경된 파일60개의 추가작업 그리고 29개의 파일을 삭제
  1. 60 29
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmUserSignServiceImpl.java

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

@@ -37,10 +37,15 @@ import org.apache.commons.lang.StringUtils;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
+import java.time.Duration;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.time.LocalTime;
 import java.time.temporal.ChronoUnit;
+import java.time.temporal.TemporalAdjusters;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.stream.Collectors;
 
 /**
@@ -89,7 +94,7 @@ public class WmUserSignServiceImpl extends ServiceImpl<WmUserSignMapper, WmUserS
 			log.warn("获取不到积分包:{}", wmUserSign.getPackageId());
 			return R.failed("获取不到积分包");
 		}
-		if(StringUtils.isEmpty(tWmScorePackage.getRuleId())){
+		if (StringUtils.isEmpty(tWmScorePackage.getRuleId())) {
 			log.warn("积分包未配置积分规则:{}", wmUserSign.getPackageId());
 			return R.failed("积分包未配置积分规则");
 		}
@@ -100,63 +105,89 @@ public class WmUserSignServiceImpl extends ServiceImpl<WmUserSignMapper, WmUserS
 			return R.failed("客户拜访任务,登录人不符");
 		}
 
-		if("1".equals(tWmScorePackage.getPackageType1())){
+		if ("1".equals(tWmScorePackage.getPackageType1())) {
 			Boolean fullFlag = wmTaskService.checkUserTaskSubScore(sysU.getUserId() + "");
-			if(fullFlag){
+			if (fullFlag) {
 				String value = sysPublicParamService.getSysPublicParamKeyToValue("USER_TASK_SUB_SCORE");
-				String info = StringUtils.isEmpty(value)?"每日最多提交3万积分":"每日最多提交"+Integer.parseInt(value)+"积分";
+				String info = StringUtils.isEmpty(value) ? "每日最多提交3万积分" : "每日最多提交" + Integer.parseInt(value) + "积分";
 				log.warn("系统当前限制积分上限:【{}】,提示:【{}】", value, info);
-				return R.failed(1,info);
+				return R.failed(1, info);
 			}
 		}
 
 		String taskTypeId;
-		if ("1".equals(wmUserSign.getSignEntType())){
+		if ("1".equals(wmUserSign.getSignEntType())) {
 			taskTypeId = "5";
-		} else if ("2".equals(wmUserSign.getSignEntType())){
+		} else if ("2".equals(wmUserSign.getSignEntType())) {
 			taskTypeId = "6";
-		} else if ("3".equals(wmUserSign.getSignEntType())){
+		} else if ("3".equals(wmUserSign.getSignEntType())) {
 			taskTypeId = "33";
 		} else {
 			return R.failed("拜访类型不存在");
 		}
 
-		int totalLimit = 4;
-		int halfHourTotalLimit = 30;
+		int dailyLimit = 0;
+		int eachLimit = 0;
 
 		List<WmTaskSubmissionRule.SubmissionRule> rules = wmTaskContentService.getTaskSubmissionRule(taskTypeId, tWmScorePackage.getRelatedService());
 
-		if (CollUtil.isNotEmpty(rules)){
+		if (CollUtil.isNotEmpty(rules)) {
 			// 获取限制
 			for (int i = 0, size = rules.size(); i < size; i++) {
 				Map<String, Object> map = (Map<String, Object>) rules.get(i);
 				WmTaskSubmissionRule.SubmissionRule r = BeanUtil.mapToBean(map, WmTaskSubmissionRule.SubmissionRule.class, true, new CopyOptions());
 
-				if ("打卡时间间隔".equals(r.getManual())) {
+				if ("拜访次数上限".equals(r.getManual())) {
 					Object o = r.getFrequency().get(0).get("quantity");
-					halfHourTotalLimit = o instanceof String ? Integer.parseInt((String) o) : (int) o;
+					dailyLimit = o instanceof String ? Integer.parseInt((String) o) : (int) o;
 
 				}
-				if ("同一个人在同一个商业公司的打卡时间间隔".equals(r.getManual())) {
+				if (r.getManual().startsWith("同一个人")) {
 					Object o = r.getFrequency().get(0).get("quantity");
-					totalLimit = o instanceof String ? Integer.parseInt((String) o) : (int) o;
+					eachLimit = o instanceof String ? Integer.parseInt((String) o) : (int) o;
 				}
 			}
 		}
 
-
-		// 一个用户,在同一打卡地点,4小时内只能打卡一次
-		int total = this.count(Wrappers.<WmUserSign>lambdaQuery()
-				.eq(WmUserSign::getSignUserid, wmUserSign.getSignUserid())
-				.eq(WmUserSign::getSignEntId, wmUserSign.getSignEntId())
-				.gt(WmUserSign::getSignDate, LocalDateTime.now().minus(totalLimit, ChronoUnit.HOURS)));
-		// 一个用户,半小时内只能打卡一次
-		int halfHourTotal = this.count(Wrappers.<WmUserSign>lambdaQuery()
+		// 查询当天所有的记录
+		LocalDateTime now = LocalDateTime.now();
+		List<WmUserSign> signs = this.list(Wrappers.<WmUserSign>lambdaQuery()
 				.eq(WmUserSign::getSignUserid, wmUserSign.getSignUserid())
-				.gt(WmUserSign::getSignDate, LocalDateTime.now().minus(halfHourTotalLimit, ChronoUnit.MINUTES)));
-		if (total != 0 || halfHourTotal != 0) {
-			log.warn("打卡间隔过短:{} {}", wmUserSign.getSignUserid(), wmUserSign.getSignEntName());
-			return R.failed("打卡间隔过短");
+				.between(WmUserSign::getSignDate, LocalDateTime.of(now.toLocalDate(), LocalTime.MIN), LocalDateTime.of(now.toLocalDate(), LocalTime.MAX)));
+
+		// 没有超过日打卡限制
+		if (dailyLimit > signs.size()) {
+
+			Map<String, List<WmUserSign>> collect = signs.stream().collect(Collectors.groupingBy(WmUserSign::getSignEntId));
+			List<WmUserSign> wmUserSigns = collect.get(wmUserSign.getSignEntId());
+			if (wmUserSigns.size() < eachLimit) {
+
+				// 一个用户,在同一打卡地点,4小时内只能打卡一次
+				Optional<LocalDateTime> first = wmUserSigns.stream().map(WmUserSign::getSignDate).filter(sd -> Duration.between(sd, now).toHours() <= 4).findFirst();
+
+				if (first.isPresent()) {
+					log.warn("打卡间隔过短:{} {}", wmUserSign.getSignUserid(), wmUserSign.getSignEntName());
+					return R.failed("打卡间隔过短");
+				}
+
+				// 一个用户,半小时内只能打卡一次
+				Optional<LocalDateTime> first1 = signs.stream().map(WmUserSign::getSignDate).filter(sd -> Duration.between(sd, now).toMinutes() <= 30).findFirst();
+
+				if (first1.isPresent()) {
+					log.warn("打卡间隔过短:{} {}", wmUserSign.getSignUserid(), wmUserSign.getSignEntName());
+					return R.failed("打卡间隔过短");
+				}
+
+
+			} else {
+				log.warn("超过每个地点打卡限制:{} {}", wmUserSign.getSignUserid(), wmUserSign.getSignEntName());
+				return R.failed("超过每个地点打卡限制");
+			}
+
+
+		} else {
+			log.warn("超过打卡每日限制:{} {}", wmUserSign.getSignUserid(), wmUserSign.getSignEntName());
+			return R.failed("超过打卡每日限制");
 		}
 
 		/**
@@ -288,8 +319,8 @@ public class WmUserSignServiceImpl extends ServiceImpl<WmUserSignMapper, WmUserS
 						queryAll.setTaskAddFlag("0");
 						List<WmScorePackageStatus> statusAll = wmScorePackageStatusService.
 								list(Wrappers.query(queryAll));
-						if(new BigDecimal(updatePke.getUserNum())
-								.compareTo(new BigDecimal(statusAll.size())) <= 0){
+						if (new BigDecimal(updatePke.getUserNum())
+								.compareTo(new BigDecimal(statusAll.size())) <= 0) {
 							updatePke.setTaskAddFlag("0");
 						}
 					}