Parcourir la source

Merge branch 'feat-221121-taskcat'

shc il y a 2 ans
Parent
commit
1d27083386

+ 4 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/config/UpmsConfig.java

@@ -53,4 +53,8 @@ public class UpmsConfig {
 	 */
 	private String endType;
 
+	private Integer durationLimit;
+
+	private Integer eachDurationLimit;
+
 }

+ 5 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/WmUserSign.java

@@ -101,4 +101,9 @@ public class WmUserSign extends Model<WmUserSign> {
 	@TableField(exist = false)
 	private WmUserSignDetail userSignDetail;
 
+	/**
+	 * 拜访任务类型id
+	 */
+	private String taskTypeId;
+
 }

+ 1 - 1
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/WmUserSignService.java

@@ -29,5 +29,5 @@ import com.qunzhixinxi.hnqz.common.core.util.R;
  */
 public interface WmUserSignService extends IService<WmUserSign> {
 
-	public R saveWmUserSign(WmUserSign wmUserSign);
+	R saveWmUserSign(WmUserSign wmUserSign);
 }

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

@@ -1,19 +1,3 @@
-/*
- *    Copyright (c) 2018-2025, hnqz All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * Neither the name of the pig4cloud.com developer nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- * Author: hnqz
- */
 package com.qunzhixinxi.hnqz.admin.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
@@ -23,8 +7,8 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qunzhixinxi.hnqz.admin.api.entity.WmTaskSubmissionRule;
-import com.qunzhixinxi.hnqz.admin.api.entity.WmTaskTypeSubCategory;
 import com.qunzhixinxi.hnqz.admin.api.vo.UserVO;
+import com.qunzhixinxi.hnqz.admin.config.UpmsConfig;
 import com.qunzhixinxi.hnqz.admin.entity.*;
 import com.qunzhixinxi.hnqz.admin.mapper.WmUserSignMapper;
 import com.qunzhixinxi.hnqz.admin.service.*;
@@ -37,10 +21,14 @@ import org.apache.commons.lang.StringUtils;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
+import java.time.Duration;
 import java.time.LocalDateTime;
+import java.time.LocalTime;
 import java.time.temporal.ChronoUnit;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.stream.Collectors;
 
 /**
@@ -56,18 +44,14 @@ public class WmUserSignServiceImpl extends ServiceImpl<WmUserSignMapper, WmUserS
 
 	private final WmTaskContentService wmTaskContentService;
 	private final SysUserService sysUserService;
-	private final SysDeptService sysDeptService;
 	private final WmTaskTypeService wmTaskTypeService;
 	private final WmScorePackageService wmScorePackageService;
 	private final WmScorePackageStatusService wmScorePackageStatusService;
 	private final WmTaskService wmTaskService;
-	private final SysRoleService sysRoleService;
-	private final WmTaskRuleService wmTaskRuleService;
 	private final SysPublicParamService sysPublicParamService;
 	private final WmDeptTaskTypeTemplateService wmDeptTaskTypeTemplateService;
 	private final WmUserSignDetailService wmUserSignDetailService;
-	private final WmTaskSubmissionRuleService taskSubmissionRuleService;
-	private final WmTaskTypeSubCategoryService taskTypeSubCategoryService;
+	private final UpmsConfig upmsConfig;
 
 	@Override
 	public R saveWmUserSign(WmUserSign wmUserSign) {
@@ -89,7 +73,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 +84,161 @@ 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("拜访类型不存在");
 		}
+		wmUserSign.setTaskTypeId(taskTypeId);
+
+
+		if ("33".equals(taskTypeId)) {
+			// 一个用户,在同一打卡地点,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());
+				return R.failed("打卡间隔过短");
+			}
+		} else {
+
+			List<WmTaskSubmissionRule.SubmissionRule> rules = wmTaskContentService.getTaskSubmissionRule(taskTypeId, tWmScorePackage.getRelatedService());
+
+			int dailyLimit = 0;
+			Map<String, Integer> eachLimitMap = new HashMap<>(2);
+
+			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())) {
+						Object o = r.getFrequency().get(0).get("quantity");
+						dailyLimit = o instanceof String ? Integer.parseInt((String) o) : (int) o;
 
-		int totalLimit = 4;
-		int halfHourTotalLimit = 30;
+					}
+					if (r.getManual().startsWith("同一个人")) {
+
+						r.getFrequency().forEach(f -> {
+
+							// 获取数量
+							Object o = f.get("quantity");
+							int limit = o instanceof String ? Integer.parseInt((String) o) : (int) o;
 
-		List<WmTaskSubmissionRule.SubmissionRule> rules = wmTaskContentService.getTaskSubmissionRule(taskTypeId, tWmScorePackage.getRelatedService());
+							// 获取单位
+							String timeUnit = (String) f.get("timeUnit");
 
-		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 (eachLimitMap.containsKey(timeUnit)) {
+								Integer l1 = eachLimitMap.get(timeUnit);
+								if (l1 != null && l1 > limit) {
+									eachLimitMap.put(timeUnit, limit);
+								}
+							} else {
+								eachLimitMap.put(timeUnit, limit);
+							}
 
-				if ("打卡时间间隔".equals(r.getManual())) {
-					Object o = r.getFrequency().get(0).get("quantity");
-					halfHourTotalLimit = o instanceof String ? Integer.parseInt((String) o) : (int) o;
+						});
 
+					}
 				}
-				if ("同一个人在同一个商业公司的打卡时间间隔".equals(r.getManual())) {
-					Object o = r.getFrequency().get(0).get("quantity");
-					totalLimit = o instanceof String ? Integer.parseInt((String) o) : (int) o;
+			}
+
+			// 按照最大周期进行查询
+			LocalDateTime now = LocalDateTime.now();
+			LocalDateTime start;
+			boolean isMonth = false;
+			if (eachLimitMap.containsKey("MONTH")) {
+				start = now.minusDays(30L);
+				isMonth = true;
+			} else {
+				start = LocalDateTime.of(now.toLocalDate(), LocalTime.MIN);
+			}
+
+			List<WmUserSign> signs = this.list(Wrappers.<WmUserSign>lambdaQuery()
+					.eq(WmUserSign::getSignUserid, wmUserSign.getSignUserid())
+					.eq(WmUserSign::getTaskTypeId, taskTypeId)
+					.between(WmUserSign::getSignDate, start, now));
+
+
+			// 月度限制
+			if (isMonth) {
+
+				Map<String, List<WmUserSign>> collect = signs.stream().collect(Collectors.groupingBy(WmUserSign::getSignEntId));
+				List<WmUserSign> wmUserSigns = collect.get(wmUserSign.getSignEntId());
+				if (CollUtil.isNotEmpty(wmUserSigns)) {
+					int monthLimit = eachLimitMap.get("MONTH");
+					if (monthLimit <= wmUserSigns.size()) {
+						log.warn("超过打卡每月限制:{} {}", wmUserSign.getSignUserid(), wmUserSign.getSignEntName());
+						return R.failed("超过打卡每月限制");
+					}
 				}
 			}
-		}
 
+			// 获取当日的打卡记录
+			LocalDateTime begin = LocalDateTime.of(now.toLocalDate(), LocalTime.MIN);
+			List<WmUserSign> todaySign = signs.stream().filter(s -> s.getSignDate().isAfter(begin)).collect(Collectors.toList());
+
+			// 没有超过日打卡限制
+			int todaySignQty = CollUtil.isNotEmpty(todaySign) ? todaySign.size() : 0;
+			if (dailyLimit > todaySignQty) {
+
+				Map<String, List<WmUserSign>> collect = todaySign.stream().collect(Collectors.groupingBy(WmUserSign::getSignEntId));
+				List<WmUserSign> wmUserSigns = collect.get(wmUserSign.getSignEntId());
+				if (CollUtil.isNotEmpty(wmUserSigns)) {
+					int eachLimit = eachLimitMap.get("DAY");
+					if (wmUserSigns.size() < eachLimit) {
+
+						// 一个用户,在同一打卡地点,4小时内只能打卡一次
+						Optional<LocalDateTime> first = wmUserSigns.stream().map(WmUserSign::getSignDate).filter(sd -> Duration.between(sd, now).toMinutes() <= upmsConfig.getDurationLimit()).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() <= upmsConfig.getEachDurationLimit()).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("超过打卡每日总限制");
+			}
 
-		// 一个用户,在同一打卡地点,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()
-				.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("打卡间隔过短");
 		}
 
 		/**
@@ -288,8 +370,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");
 						}
 					}