瀏覽代碼

feat: 任务类型百分比限制5-转发类任务增加校验

李学松 2 年之前
父節點
當前提交
6e46dc3b36

+ 36 - 24
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/ApiController.java

@@ -91,6 +91,7 @@ import com.qunzhixinxi.hnqz.admin.service.WmTaskContentConfigService;
 import com.qunzhixinxi.hnqz.admin.service.WmTaskContentService;
 import com.qunzhixinxi.hnqz.admin.service.WmTaskRuleService;
 import com.qunzhixinxi.hnqz.admin.service.WmTaskService;
+import com.qunzhixinxi.hnqz.admin.service.WmTaskSubmissionPercentRuleService;
 import com.qunzhixinxi.hnqz.admin.service.WmTaskSubmissionRuleService;
 import com.qunzhixinxi.hnqz.admin.service.WmTaskTypeService;
 import com.qunzhixinxi.hnqz.admin.service.WmUserSignDetailService;
@@ -203,6 +204,7 @@ public class ApiController {
 	private final SysUserSignCertService sysUserSignCertService;
 	private final SysUserExtRecordService sysUserExtRecordService;
 	private final WmTaskSubmissionRuleService taskSubmissionRuleService;
+	private final WmTaskSubmissionPercentRuleService wmTaskSubmissionPercentRuleService;
 	private final SysDeptCsmService deptCsmService;
 	private final MedicalEquipmentService medicalEquipmentService;
 
@@ -3729,30 +3731,40 @@ public class ApiController {
 				// 判断是否保存前最后校验一遍文章分享和文章阅读以及产品分享和产品分享阅读所做的积分值是否在比例范围之内
 				// (初始设定为30%,积分包值小于3000不做校验)
 				if (needToCheckLimit && null != scorePackageStatus) {
-					String value = sysPublicParamService.getSysPublicParamKeyToValue("SHARE_READ_TASK_SCORE_UPPER_LIMIT_RATIO");
-					value = StringUtils.isEmpty(value) ? "0.3" : value;
-					log.warn("系统当前分享类及分享阅读类积分上限:【{}】", value);
-					int limit = (int) (Integer.parseInt(scorePackageStatus.getUserScore()) * Double.parseDouble(value));
-					List<WmTask> taskList = wmTaskService.list(Wrappers.<WmTask>lambdaQuery()
-							// 两对分享阅读任务
-							.in(WmTask::getTaskTypeId, Arrays.asList("8", "9", "10", "11"))
-							// 同一个积分包
-							.eq(WmTask::getScorePackageId, tWmScorePackage.getId())
-							// 分享人
-							.eq(WmTask::getTaskUserId, shareUserId)
-							// 审核不通过
-							.ne(WmTask::getTaskStatus, "4")
-					);
-
-					int sum = taskList.stream().mapToInt(WmTask::getScore).sum();
-					log.info("当前积分包值限制上限为:{},当前任务积分和为:{}", limit, sum);
-					if (sum >= limit) {
-						log.warn("完成任务积分值已经超过上限,设置为0");
-						wmTask.setScore(0);
-						msg = String.format("转发类任务所得积分不得大于积分包值的%d%s",
-								new BigDecimal(value).multiply(new BigDecimal("100"))
-										.setScale(0, BigDecimal.ROUND_HALF_UP).intValue(), "%");
-					}
+//					String value = sysPublicParamService.getSysPublicParamKeyToValue("SHARE_READ_TASK_SCORE_UPPER_LIMIT_RATIO");
+//					value = StringUtils.isEmpty(value) ? "0.3" : value;
+//					log.warn("系统当前分享类及分享阅读类积分上限:【{}】", value);
+//					int limit = (int) (Integer.parseInt(scorePackageStatus.getUserScore()) * Double.parseDouble(value));
+//					List<WmTask> taskList = wmTaskService.list(Wrappers.<WmTask>lambdaQuery()
+//							// 两对分享阅读任务
+//							.in(WmTask::getTaskTypeId, Arrays.asList("8", "9", "10", "11"))
+//							// 同一个积分包
+//							.eq(WmTask::getScorePackageId, tWmScorePackage.getId())
+//							// 分享人
+//							.eq(WmTask::getTaskUserId, shareUserId)
+//							// 审核不通过
+//							.ne(WmTask::getTaskStatus, "4")
+//					);
+//
+//					int sum = taskList.stream().mapToInt(WmTask::getScore).sum();
+//					log.info("当前积分包值限制上限为:{},当前任务积分和为:{}", limit, sum);
+//					if (sum >= limit) {
+//						log.warn("完成任务积分值已经超过上限,设置为0");
+//						wmTask.setScore(0);
+//						msg = String.format("转发类任务所得积分不得大于积分包值的%d%s",
+//								new BigDecimal(value).multiply(new BigDecimal("100"))
+//										.setScale(0, BigDecimal.ROUND_HALF_UP).intValue(), "%");
+//					}
+				}
+
+				// 校验任务百分比限制规则(如果积分包值大于【任务配置】-【百分比限制】配置的起始值,
+				// 且【任务配置】-【百分比限制】所选的任务类型对应的任务总完成积分值>积分包值*【任务配置】-【百分比限制】配置的百分比,则校验不通过)
+				R<?> checkPercentRuleResult =
+						wmTaskSubmissionPercentRuleService.checkPercentRule(tWmScorePackage, SecurityUtils.getUser().getDeptId(),
+								Integer.valueOf(shareUserId), Arrays.asList("8", "9", "10", "11"));
+				if (checkPercentRuleResult.getCode() != 0) {
+					wmTask.setScore(0);
+					msg = checkPercentRuleResult.getMsg();
 				}
 
 				// 校验结果为0积分的自动审核不通过

+ 5 - 2
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/WmTaskSubmissionPercentRuleService.java

@@ -18,10 +18,13 @@ public interface WmTaskSubmissionPercentRuleService extends IService<WmTaskSubmi
 	/**
 	 * 校验任务百分比限制规则(达到要求的积分包,【任务配置】-【百分比限制】所选的任务总完成积分值不得大于积分包值*百分比)
 	 *
-	 * @param scorePackage
+	 * @param scorePackage 积分包实体
+	 * @param deptId 部门id
+	 * @param taskUserId 任务承接人userId
+	 * @param checkTaskTypeList 要校验的任务类型list
 	 * @return
 	 */
-	R<?> checkPercentRule(WmScorePackage scorePackage, Integer deptId);
+	R<?> checkPercentRule(WmScorePackage scorePackage, Integer deptId, Integer taskUserId, List<String> checkTaskTypeList);
 
 	/**
 	 * 更新

+ 2 - 1
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmTaskContentServiceImpl.java

@@ -923,7 +923,8 @@ public class WmTaskContentServiceImpl extends ServiceImpl<WmTaskContentMapper, W
 //		}
 		// 校验任务百分比限制规则(如果积分包值大于【任务配置】-【百分比限制】配置的起始值,
 		// 且【任务配置】-【百分比限制】所选的任务类型对应的任务总完成积分值>积分包值*【任务配置】-【百分比限制】配置的百分比,则校验不通过)
-		R<?> checkPercentRuleResult = wmTaskSubmissionPercentRuleService.checkPercentRule(scorePackage, SecurityUtils.getUser().getDeptId());
+		R<?> checkPercentRuleResult =
+				wmTaskSubmissionPercentRuleService.checkPercentRule(scorePackage, SecurityUtils.getUser().getDeptId(), null, null);
 		if (checkPercentRuleResult.getCode() != 0) {
 			throw new RuntimeException(checkPercentRuleResult.getMsg());
 		}

+ 62 - 42
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmTaskSubmissionPercentRuleServiceImpl.java

@@ -1,6 +1,8 @@
 package com.qunzhixinxi.hnqz.admin.service.impl;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.CollectionUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qunzhixinxi.hnqz.admin.api.entity.WmTaskSubmissionPercentRule;
@@ -45,61 +47,79 @@ public class WmTaskSubmissionPercentRuleServiceImpl
 	/**
 	 * 校验任务百分比限制规则(达到要求的积分包,【任务配置】-【百分比限制】所选的任务总完成积分值不得大于积分包值*百分比)
 	 *
-	 * @param scorePackage
+	 * @param scorePackage 积分包实体
+	 * @param deptId 部门id
+	 * @param taskUserId 任务承接人userId
+	 * @param checkTaskTypeList 要校验的任务类型list
 	 * @return
 	 */
 	@Override
-	public R<?> checkPercentRule(WmScorePackage scorePackage, Integer deptId) {
+	public R<?> checkPercentRule(WmScorePackage scorePackage, Integer deptId, Integer taskUserId, List<String> checkTaskTypeList) {
 
 		AtomicBoolean failFlag = new AtomicBoolean(false);
 		AtomicReference<String> message = new AtomicReference<>("");
 
 		// 查询配置的百分比规则
 		List<WmTaskSubmissionPercentRule> percentRules = this.list(Wrappers.<WmTaskSubmissionPercentRule>lambdaQuery()
-				.eq(WmTaskSubmissionPercentRule::getDeptId, deptId)
+				.in(WmTaskSubmissionPercentRule::getDeptId, 1, deptId)
 				.eq(WmTaskSubmissionPercentRule::getOptFlag, CommonFlag.OptFlag.OK));
 
-		// 根据batchId分组
-		Map<String, List<WmTaskSubmissionPercentRule>> batchRules = percentRules.stream().collect(Collectors.groupingBy(WmTaskSubmissionPercentRule::getBatchId));
-
-		// 查询taskType
-		List<WmTaskType> taskTypeList = wmTaskTypeService.list(Wrappers.<WmTaskType>lambdaQuery()
-				.eq(WmTaskType::getTaskTypeLevel, "1")
-				.eq(WmTaskType::getDelFlag, "0")
-				.eq(WmTaskType::getEnableFlag, "0"));
-		// taskType通过id分组(key为parentId,value为taskTypeId的set)
-		Map<String, String> taskTypeIdMap = taskTypeList.stream()
-				.collect(Collectors.toMap(WmTaskType::getId, WmTaskType::getTaskTypeName));
-
-		batchRules.forEach((batchId, rules) -> {
-
-			// 获取该分组下所有taskTypeId
-			List<String> allTaskTypeIds = rules.stream()
-					.flatMap(percentRule -> Arrays.stream(percentRule.getRule().getTaskTypeIds()))
-					.collect(Collectors.toList());
-
-			WmTaskSubmissionPercentRule.PercentRule rule = rules.get(0).getRule();
-
-			// 指定任务类型做的任务总积分不得大于积分包值的rule.limitPercent%(积分包值小于rule.startScore不做限制)
-			if (scorePackage.getScore() > rule.getStartScore()) {
-				List<WmTask> wmTaskList = wmTaskService.list(Wrappers.<WmTask>lambdaQuery()
-						.eq(WmTask::getRealFlag, "0")
-						.eq(WmTask::getDelFlag, DelEnum.NOT_DEL.val())
-						.in(WmTask::getScorePackageId, scorePackage.getId())
-						.in(WmTask::getTaskTypeId, allTaskTypeIds)
-						.ne(WmTask::getTaskStatus, "4"));
-
-				if (CollectionUtil.isNotEmpty(wmTaskList)) {
-					int totalScore = scorePackage.getScore();
-					int partScore = wmTaskList.stream().mapToInt(WmTask::getScore).sum();
-					if (partScore * 100.0 / totalScore > Float.parseFloat(rule.getLimitPercent())) {
-						failFlag.set(true);
-
-						String taskTypeNames = allTaskTypeIds.stream().map(taskTypeIdMap::get).collect(Collectors.joining("、"));
-						message.set(String.format("%s任务类型的任务总积分不得大于积分包值的%s%%", taskTypeNames, rule.getLimitPercent()));
+		// 根据deptId分组,再根据batchId分组
+		Map<Integer, Map<String, List<WmTaskSubmissionPercentRule>>> deptsMap = percentRules.stream()
+				.collect(Collectors.groupingBy(WmTaskSubmissionPercentRule::getDeptId, Collectors.groupingBy(WmTaskSubmissionPercentRule::getBatchId)));
+
+		deptsMap.forEach((dptId, batchRules) -> {
+			// 查询taskType
+			List<WmTaskType> taskTypeList = wmTaskTypeService.list(Wrappers.<WmTaskType>lambdaQuery()
+					.eq(WmTaskType::getTaskTypeLevel, "1")
+					.eq(WmTaskType::getDelFlag, "0")
+					.eq(WmTaskType::getEnableFlag, "0"));
+			// taskType通过id分组(key为parentId,value为taskTypeId的set)
+			Map<String, String> taskTypeIdMap = taskTypeList.stream()
+					.collect(Collectors.toMap(WmTaskType::getId, WmTaskType::getTaskTypeName));
+
+			batchRules.forEach((batchId, rules) -> {
+
+				// 获取该分组下所有taskTypeId
+				List<String> allTaskTypeIds = rules.stream()
+						.flatMap(percentRule -> Arrays.stream(percentRule.getRule().getTaskTypeIds()))
+						.collect(Collectors.toList());
+
+				List<String> toCheckTaskTypes = null;
+				if (checkTaskTypeList != null) {
+					// 把要校验的任务 和 已配置的规则任务 做交集,得到实际需要校验的任务类型
+					toCheckTaskTypes = new ArrayList<>(CollUtil.intersection(allTaskTypeIds, checkTaskTypeList));
+				} else {
+					toCheckTaskTypes = allTaskTypeIds;
+				}
+
+				WmTaskSubmissionPercentRule.PercentRule rule = rules.get(0).getRule();
+
+				// 指定任务类型做的任务总积分不得大于积分包值的rule.limitPercent%(积分包值小于rule.startScore不做限制)
+				if (scorePackage.getScore() > rule.getStartScore()) {
+					LambdaQueryWrapper<WmTask> queryWrapper = Wrappers.<WmTask>lambdaQuery()
+							.eq(WmTask::getRealFlag, "0")
+							.eq(WmTask::getDelFlag, DelEnum.NOT_DEL.val())
+							.in(WmTask::getScorePackageId, scorePackage.getId())
+							.in(WmTask::getTaskTypeId, toCheckTaskTypes)
+							.ne(WmTask::getTaskStatus, "4");
+					if (taskUserId != null) {
+						queryWrapper.eq(WmTask::getTaskUserId, taskUserId);
+					}
+					List<WmTask> wmTaskList = wmTaskService.list(queryWrapper);
+
+					if (CollectionUtil.isNotEmpty(wmTaskList)) {
+						int totalScore = scorePackage.getScore();
+						int partScore = wmTaskList.stream().mapToInt(WmTask::getScore).sum();
+						if (partScore * 100.0 / totalScore > Float.parseFloat(rule.getLimitPercent())) {
+							failFlag.set(true);
+
+							String taskTypeNames = toCheckTaskTypes.stream().map(taskTypeIdMap::get).collect(Collectors.joining("、"));
+							message.set(String.format("%s任务类型的任务总积分不得大于积分包值的%s%%", taskTypeNames, rule.getLimitPercent()));
+						}
 					}
 				}
-			}
+			});
 		});
 
 		return failFlag.get() ? R.failed(null, message.get()) : R.ok();

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

@@ -25,6 +25,7 @@ import java.time.Duration;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.time.temporal.ChronoUnit;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -244,7 +245,8 @@ public class WmUserSignServiceImpl extends ServiceImpl<WmUserSignMapper, WmUserS
 
 		// 校验任务百分比限制规则(如果积分包值大于【任务配置】-【百分比限制】配置的起始值,
 		// 且【任务配置】-【百分比限制】所选的任务类型对应的任务总完成积分值>积分包值*【任务配置】-【百分比限制】配置的百分比,则校验不通过)
-		R<?> checkPercentRuleResult = wmTaskSubmissionPercentRuleService.checkPercentRule(tWmScorePackage, SecurityUtils.getUser().getDeptId());
+		R<?> checkPercentRuleResult =
+				wmTaskSubmissionPercentRuleService.checkPercentRule(tWmScorePackage, SecurityUtils.getUser().getDeptId(), null, Arrays.asList(taskTypeId));
 		if (checkPercentRuleResult.getCode() != 0) {
 			throw new RuntimeException(checkPercentRuleResult.getMsg());
 		}