Quellcode durchsuchen

Merge branch 'feat-20221222-tasktypepercentlimit'

# Conflicts:
#	hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/SysDeptSub.java
李学松 vor 2 Jahren
Ursprung
Commit
acaa43d87b
16 geänderte Dateien mit 976 neuen und 113 gelöschten Zeilen
  1. 39 0
      db/v2.0/221222.sql
  2. 33 0
      hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/constant/UpmsType.java
  3. 114 0
      hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/entity/WmTaskSubmissionPercentRule.java
  4. 36 24
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/ApiController.java
  5. 164 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/WmTaskSubmissionPercentRuleController.java
  6. 12 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/WmTaskTypeController.java
  7. 51 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/WmTaskTypeSubCate2.java
  8. 12 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/WmTaskSubmissionPercentRuleMapper.java
  9. 20 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/WmTaskTypeSubCate2Mapper.java
  10. 36 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/WmTaskSubmissionPercentRuleService.java
  11. 23 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/WmTaskTypeSubCate2Service.java
  12. 105 73
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmDeptTaskTypeConfigServiceImpl.java
  13. 25 16
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmTaskContentServiceImpl.java
  14. 166 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmTaskSubmissionPercentRuleServiceImpl.java
  15. 130 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmTaskTypeSubCate2ServiceImpl.java
  16. 10 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmUserSignServiceImpl.java

+ 39 - 0
db/v2.0/221222.sql

@@ -0,0 +1,39 @@
+-- 任务提交百分比限制规则表
+create table wm_task_sub_percent_rule
+(
+    rule_id     int(20) auto_increment comment '规则ID'
+        primary key,
+    dept_id     int(20)                            not null comment '企业id',
+    sub_cate    varchar(32)                        not null comment '次级分类',
+    batch_id    varchar(32)                        null comment '批量保存编号',
+    sub_rule    json                               null comment '规则',
+    opt_flag    varchar(32)                        not null comment '操作标记',
+    create_time datetime default CURRENT_TIMESTAMP not null comment '创建时间',
+    update_time datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '修改时间'
+)
+    comment '任务提交百分比限制规则表' charset = utf8mb4;
+
+create index idx_dept_id
+    on wm_task_sub_percent_rule (dept_id);
+
+create index idx_sub_cate
+    on wm_task_sub_percent_rule (sub_cate);
+
+
+create table wm_task_type_sub_cate2
+(
+    dtt_id      int(20) auto_increment comment '主键ID'
+        primary key,
+    type_id     int(20)                            not null comment '企业id',
+    type_name   varchar(32)                        not null comment '任务名称',
+    sub_cate    varchar(32)                        not null comment '次级分类',
+    create_time datetime default CURRENT_TIMESTAMP not null comment '创建时间',
+    update_time datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '修改时间'
+)
+    comment '任务类型二级分类表' charset = utf8mb4;
+
+create index idx_dept_id
+    on wm_task_type_sub_cate2 (type_id);
+
+create index idx_sub_cate
+    on wm_task_type_sub_cate2 (sub_cate);

+ 33 - 0
hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/constant/UpmsType.java

@@ -64,6 +64,39 @@ public final class UpmsType {
 
 	}
 
+	/**
+	 * 任务二级分类2
+	 */
+	@Getter
+	@AllArgsConstructor
+	public enum TaskSubCategory2 {
+
+//		PRODUCT_ALBUM("PRODUCT_ALBUM", TaskCategory.FORWARD, "产品相册"),
+		ACADEMIC_INFO_EXCHANGE("ACADEMIC_INFO_EXCHANGE", TaskCategory.FORWARD, "学术信息交流"),
+		CONFERENCE("CONFERENCE", TaskCategory.CONFERENCES_INTERVIEWS, "会议举办"),
+		ONE_ON_ONE_INTERVIEW("ONE_ON_ONE_INTERVIEW", TaskCategory.CONFERENCES_INTERVIEWS, "一对一专访"),
+		TRAINING("TRAINING", TaskCategory.CONFERENCES_INTERVIEWS, "培训"),
+//		BUSINESS_COMPANY_VISIT("BUSINESS_COMPANY_VISIT", TaskCategory.CUSTOMER_VISIT, "商业公司拜访"),
+//		HOSPITAL_VISIT("HOSPITAL_VISIT", TaskCategory.CUSTOMER_VISIT, "医院拜访"),
+//		PHARMACY_VISIT("PHARMACY_VISIT", TaskCategory.CUSTOMER_VISIT, "药店拜访"),
+		INVENTORY_INFO_COLLECTION("INVENTORY_INFO_COLLECTION", TaskCategory.MARKET_INFO_COLLECTION, "库存信息搜集"),
+		HOSPITAL_INFO_COLLECTION("HOSPITAL_INFO_COLLECTION", TaskCategory.MARKET_INFO_COLLECTION, "医院信息搜集"),
+		CUSTOMER_VISIT("CUSTOMER_VISIT", TaskCategory.CUSTOMER_VISIT, "客户拜访"),
+		PRODUCT_PROMOTION("PRODUCT_PROMOTION", TaskCategory.FORWARD, "产品推广"),
+		MARKET_INFO_COLLECTION("MARKET_INFO_COLLECTION", TaskCategory.MARKET_INFO_COLLECTION, "市场信息搜集"),
+		SPECIAL_SERVICE("SPECIAL_SERVICE", null, "专项服务");
+
+
+
+		@EnumValue
+		private final String type;
+
+		private final TaskCategory category;
+
+		private final String description;
+
+	}
+
 	// 企业类型
 	@Getter
 	@AllArgsConstructor

+ 114 - 0
hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/entity/WmTaskSubmissionPercentRule.java

@@ -0,0 +1,114 @@
+package com.qunzhixinxi.hnqz.admin.api.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
+import com.qunzhixinxi.hnqz.admin.api.constant.UpmsType;
+import com.qunzhixinxi.hnqz.common.core.constant.enums.CommonFlag;
+import lombok.Data;
+import lombok.ToString;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 任务提交百分比规则
+ *
+ * @author lixuesong
+ * @version 1.0.0
+ * @date 2022-12-22 14:43
+ */
+@Data
+@ToString
+@TableName(value = "wm_task_sub_percent_rule", autoResultMap = true)
+public class WmTaskSubmissionPercentRule extends Model<WmTaskSubmissionPercentRule> {
+
+	private static final long serialVersionUID = -2370239048359430285L;
+
+	/**
+	 * 提交规则id
+	 */
+	@TableId(value = "rule_id", type = IdType.AUTO)
+	private Integer ruleId;
+
+	/**
+	 * 企业id
+	 */
+	@NotNull(message = "deptId不能为空")
+	private Integer deptId;
+
+	/**
+	 * 批量保存编号
+	 */
+	private String batchId;
+
+	/**
+	 * 二级分类
+	 */
+	@NotNull(message = "subCategory不能为空")
+	@TableField(value = "sub_cate")
+	private UpmsType.TaskSubCategory2 subCategory;
+
+	/**
+	 * 任务规则
+	 */
+	@Valid
+	@NotNull(message = "rule不能为空")
+	@TableField(value = "sub_rule", typeHandler = FastjsonTypeHandler.class)
+	private PercentRule rule;
+
+	/**
+	 * 可操作标记
+	 */
+	private CommonFlag.OptFlag optFlag;
+
+	/**
+	 * 创建时间
+	 */
+	private LocalDateTime createTime;
+
+	/**
+	 * 创建时间
+	 */
+	private LocalDateTime updateTime;
+
+
+	/**
+	 * 提交规则实体
+	 */
+	@Data
+	@ToString
+	public static class PercentRule implements Serializable {
+
+		private static final long serialVersionUID = -6254889506697833544L;
+
+		/**
+		 * 任务类型列表
+		 */
+		@NotEmpty(message = "taskTypeIds不能为空")
+		private String[] taskTypeIds;
+
+		/**
+		 * 积分包值:积分包值大于这个值的包,才限制这个规则
+		 */
+		@NotNull(message = "startScore不能为空")
+		private Integer startScore;
+
+		/**
+		 * 百分比:达到要求的积分包,上述所选的任务总完成积分值不得大于积分包值*百分比
+		 */
+		@NotBlank(message = "limitPercent不能为空")
+		private String limitPercent;
+	}
+
+
+}

+ 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, sysUser.getDeptId(),
+								Integer.valueOf(shareUserId), Arrays.asList("8", "9", "10", "11"));
+				if (checkPercentRuleResult.getCode() != 0) {
+					wmTask.setScore(0);
+					msg = checkPercentRuleResult.getMsg();
 				}
 
 				// 校验结果为0积分的自动审核不通过

+ 164 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/WmTaskSubmissionPercentRuleController.java

@@ -0,0 +1,164 @@
+package com.qunzhixinxi.hnqz.admin.controller;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.qunzhixinxi.hnqz.admin.api.entity.WmTaskSubmissionPercentRule;
+import com.qunzhixinxi.hnqz.admin.entity.WmTaskType;
+import com.qunzhixinxi.hnqz.admin.service.WmTaskSubmissionPercentRuleService;
+import com.qunzhixinxi.hnqz.admin.service.WmTaskTypeService;
+import com.qunzhixinxi.hnqz.common.core.constant.enums.CommonFlag;
+import com.qunzhixinxi.hnqz.common.core.util.R;
+import com.qunzhixinxi.hnqz.common.log.annotation.SysLog;
+import lombok.AllArgsConstructor;
+import org.apache.commons.lang3.RandomStringUtils;
+import org.springframework.http.MediaType;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 任务提交百分比规则
+ *
+ * @author snows
+ * @date 2022/12/22 15:41
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping(value = "/task/percent/rule", produces = MediaType.APPLICATION_JSON_VALUE)
+public class WmTaskSubmissionPercentRuleController {
+
+	private final WmTaskSubmissionPercentRuleService wmTaskSubmissionPercentRuleService;
+
+	private final WmTaskTypeService wmTaskTypeService;
+
+	/**
+	 * 根据batchId查询单个限制规则
+	 *
+	 * @param batchId
+	 * @return
+	 */
+	@GetMapping("/{batchId}")
+	public R<List<WmTaskSubmissionPercentRule>> listDeptRules(@PathVariable("batchId") String batchId) {
+
+		List<WmTaskSubmissionPercentRule> percentRules = wmTaskSubmissionPercentRuleService.list(Wrappers.<WmTaskSubmissionPercentRule>lambdaQuery()
+				.eq(WmTaskSubmissionPercentRule::getBatchId, batchId)
+				.eq(WmTaskSubmissionPercentRule::getOptFlag, CommonFlag.OptFlag.OK));
+
+		return R.ok(percentRules);
+	}
+
+	/**
+	 * 根据deptId查询企业的限制规则列表
+	 *
+	 * @param deptId
+	 * @return
+	 */
+	@GetMapping("/list")
+	public R<List<Map<String, Object>>> listDeptBriefRule(@RequestParam(value = "deptId") Integer deptId) {
+		List<WmTaskSubmissionPercentRule> percentRules = wmTaskSubmissionPercentRuleService.list(Wrappers.<WmTaskSubmissionPercentRule>lambdaQuery()
+				.eq(WmTaskSubmissionPercentRule::getDeptId, deptId)
+				.eq(WmTaskSubmissionPercentRule::getOptFlag, CommonFlag.OptFlag.OK));
+
+		Map<String, List<WmTaskSubmissionPercentRule>> collect = 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));
+
+		List<Map<String, Object>> result = new ArrayList<>();
+
+		collect.forEach((batchId, rules) -> {
+			// 获取该分组下所有taskTypeId
+			List<String> allTaskTypeIds = rules.stream()
+					.flatMap(percentRule -> Arrays.stream(percentRule.getRule().getTaskTypeIds()))
+					.collect(Collectors.toList());
+
+			List<String> allTaskTypeNames = allTaskTypeIds.stream().map(taskTypeIdMap::get).collect(Collectors.toList());
+
+			Map<String, Object> ruleMap = new HashMap<>();
+			ruleMap.put("taskTypeNames", allTaskTypeNames);
+			WmTaskSubmissionPercentRule.PercentRule rule = rules.get(0).getRule();
+			ruleMap.put("startScore", rule.getStartScore());
+			ruleMap.put("limitPercent", rule.getLimitPercent());
+			ruleMap.put("batchId", batchId);
+			result.add(ruleMap);
+		});
+
+		return R.ok(result);
+	}
+
+	/**
+	 * 保存
+	 *
+	 * @param rules
+	 * @return
+	 */
+	@SysLog("保存百分比规则")
+	@PostMapping
+	public R<Boolean> save(@Validated @RequestBody List<WmTaskSubmissionPercentRule> rules) {
+
+		String batchId = RandomStringUtils.randomAlphabetic(16);
+		rules.forEach(rule -> {
+			// 默认正常
+			rule.setOptFlag(CommonFlag.OptFlag.OK);
+			// 批量保存编号
+			rule.setBatchId(batchId);
+		});
+
+		return R.ok(wmTaskSubmissionPercentRuleService.saveBatch(rules));
+	}
+
+	/**
+	 * 更新
+	 *
+	 * @param rules
+	 * @return
+	 */
+	@SysLog("更新百分比规则")
+	@PutMapping
+	public R<Boolean> update(@RequestBody List<WmTaskSubmissionPercentRule> rules) {
+
+		for (WmTaskSubmissionPercentRule rule : rules) {
+			if (rule.getBatchId() == null) {
+				return R.failed("batchId不能为空");
+			}
+		}
+
+		return R.ok(wmTaskSubmissionPercentRuleService.updateRule(rules));
+	}
+
+	/**
+	 * 删除规则(逻辑删除)
+	 *
+	 * @param batchId
+	 * @return
+	 */
+	@SysLog("删除百分比规则")
+	@DeleteMapping("/{batchId}")
+	public R<Boolean> delete(@PathVariable("batchId") String batchId) {
+
+		List<WmTaskSubmissionPercentRule> rules = wmTaskSubmissionPercentRuleService.list(Wrappers.<WmTaskSubmissionPercentRule>lambdaQuery()
+				.eq(WmTaskSubmissionPercentRule::getBatchId, batchId));
+
+		List<WmTaskSubmissionPercentRule> updateRules = new ArrayList<>();
+		rules.forEach(percentRule -> {
+			WmTaskSubmissionPercentRule rule = new WmTaskSubmissionPercentRule();
+			rule.setRuleId(percentRule.getRuleId());
+			rule.setOptFlag(CommonFlag.OptFlag.DELETED);
+			updateRules.add(rule);
+		});
+
+		return R.ok(wmTaskSubmissionPercentRuleService.updateBatchById(updateRules));
+	}
+
+}

+ 12 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/WmTaskTypeController.java

@@ -61,6 +61,7 @@ public class WmTaskTypeController {
 	private final WmDaAgentService wmDaAgentService;
 	private final WmTaskTypeEntRefService wmTaskTypeEntRefService;
 	private final WmDeptTaskTypeConfigService wmDeptTaskTypeConfigService;
+	private final WmTaskTypeSubCate2Service wmTaskTypeSubCate2Service;
 
 	/**
 	 * 分页查询
@@ -367,4 +368,15 @@ public class WmTaskTypeController {
 		List<Map<String, Object>> list = wmDeptTaskTypeConfigService.listConfigedTaskTypeTree(taskTypeName);
 		return R.ok(list);
 	}
+
+	/**
+	 * 根据企业id查询分类的任务类型
+	 *
+	 * @param deptId
+	 * @return
+	 */
+	@GetMapping("/list-category-task-type")
+	public R<?> listTaskTypeTree(@RequestParam("deptId") Integer deptId) {
+		return R.ok(wmTaskTypeSubCate2Service.listTaskTypeTree(deptId));
+	}
 }

+ 51 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/WmTaskTypeSubCate2.java

@@ -0,0 +1,51 @@
+package com.qunzhixinxi.hnqz.admin.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Data;
+
+/**
+ * 任务类型二级分类表
+ * @TableName wm_task_type_sub_cate2
+ */
+@TableName(value ="wm_task_type_sub_cate2")
+@Data
+public class WmTaskTypeSubCate2 implements Serializable {
+
+	private static final long serialVersionUID = 6741894674905816850L;
+
+	/**
+     * 主键ID
+     */
+    @TableId(type = IdType.AUTO)
+    private Integer dttId;
+
+    /**
+     * 企业id
+     */
+    private Integer typeId;
+
+    /**
+     * 任务名称
+     */
+    private String typeName;
+
+    /**
+     * 次级分类
+     */
+    private String subCate;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+    /**
+     * 修改时间
+     */
+    private Date updateTime;
+
+}

+ 12 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/WmTaskSubmissionPercentRuleMapper.java

@@ -0,0 +1,12 @@
+package com.qunzhixinxi.hnqz.admin.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qunzhixinxi.hnqz.admin.api.entity.WmTaskSubmissionPercentRule;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ *
+ */
+@Mapper
+public interface WmTaskSubmissionPercentRuleMapper extends BaseMapper<WmTaskSubmissionPercentRule> {
+}

+ 20 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/WmTaskTypeSubCate2Mapper.java

@@ -0,0 +1,20 @@
+package com.qunzhixinxi.hnqz.admin.mapper;
+
+import com.qunzhixinxi.hnqz.admin.entity.WmTaskTypeSubCate2;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* @author snows
+* @description 针对表【wm_dept_task_type(任务类型二级分类表)】的数据库操作Mapper
+* @createDate 2022-12-22 23:57:19
+* @Entity com.qunzhixinxi.hnqz.admin.entity.WmDeptTaskType
+*/
+@Mapper
+public interface WmTaskTypeSubCate2Mapper extends BaseMapper<WmTaskTypeSubCate2> {
+
+}
+
+
+
+

+ 36 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/WmTaskSubmissionPercentRuleService.java

@@ -0,0 +1,36 @@
+package com.qunzhixinxi.hnqz.admin.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qunzhixinxi.hnqz.admin.api.entity.WmTaskSubmissionPercentRule;
+import com.qunzhixinxi.hnqz.admin.entity.WmScorePackage;
+import com.qunzhixinxi.hnqz.common.core.util.R;
+
+import java.util.List;
+
+/**
+ * 任务提交百分比规则
+ *
+ * @author snows
+ * @date 2022/12/22 15:32
+ */
+public interface WmTaskSubmissionPercentRuleService extends IService<WmTaskSubmissionPercentRule> {
+
+	/**
+	 * 校验任务百分比限制规则(达到要求的积分包,【任务配置】-【百分比限制】所选的任务总完成积分值不得大于积分包值*百分比)
+	 *
+	 * @param scorePackage 积分包实体
+	 * @param deptId 部门id
+	 * @param taskUserId 任务承接人userId
+	 * @param checkTaskTypeList 要校验的任务类型list
+	 * @return
+	 */
+	R<?> checkPercentRule(WmScorePackage scorePackage, Integer deptId, Integer taskUserId, List<String> checkTaskTypeList);
+
+	/**
+	 * 更新
+	 *
+	 * @param rules
+	 * @return
+	 */
+	Boolean updateRule(List<WmTaskSubmissionPercentRule> rules);
+}

+ 23 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/WmTaskTypeSubCate2Service.java

@@ -0,0 +1,23 @@
+package com.qunzhixinxi.hnqz.admin.service;
+
+import com.qunzhixinxi.hnqz.admin.entity.WmTaskTypeSubCate2;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+* @author snows
+* @description 针对表【wm_dept_task_type(任务类型二级分类表)】的数据库操作Service
+* @createDate 2022-12-22 23:57:19
+*/
+public interface WmTaskTypeSubCate2Service extends IService<WmTaskTypeSubCate2> {
+
+	/**
+	 * 根据企业id查询任务类型树
+	 *
+	 * @param deptId
+	 * @return
+	 */
+	List<Map<String, Object>> listTaskTypeTree(Integer deptId);
+}

+ 105 - 73
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmDeptTaskTypeConfigServiceImpl.java

@@ -11,14 +11,17 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qunzhixinxi.hnqz.admin.api.constant.UpmsType;
 import com.qunzhixinxi.hnqz.admin.api.entity.SysDept;
 import com.qunzhixinxi.hnqz.admin.api.entity.SysDeptRelation;
+import com.qunzhixinxi.hnqz.admin.api.entity.SysDictItem;
 import com.qunzhixinxi.hnqz.admin.entity.WmDaAgent;
 import com.qunzhixinxi.hnqz.admin.entity.WmDaDrugEnt;
 import com.qunzhixinxi.hnqz.admin.entity.WmDeptTaskTypeConfig;
 import com.qunzhixinxi.hnqz.admin.entity.WmScorePackage;
 import com.qunzhixinxi.hnqz.admin.entity.WmTask;
 import com.qunzhixinxi.hnqz.admin.entity.WmTaskType;
+import com.qunzhixinxi.hnqz.admin.entity.WmTaskTypeSubCate2;
 import com.qunzhixinxi.hnqz.admin.entity.WmTeam;
 import com.qunzhixinxi.hnqz.admin.entity.dto.WmDeptTaskTypeConfigDTO;
 import com.qunzhixinxi.hnqz.admin.entity.dto.WmDeptTaskTypeConfigJsonDTO;
@@ -29,10 +32,12 @@ import com.qunzhixinxi.hnqz.admin.enums.PackageTypeEnum;
 import com.qunzhixinxi.hnqz.admin.enums.ScorePackageStatusEnum;
 import com.qunzhixinxi.hnqz.admin.mapper.SysDeptMapper;
 import com.qunzhixinxi.hnqz.admin.mapper.SysDeptRelationMapper;
+import com.qunzhixinxi.hnqz.admin.mapper.SysDictItemMapper;
 import com.qunzhixinxi.hnqz.admin.mapper.WmDaAgentMapper;
 import com.qunzhixinxi.hnqz.admin.mapper.WmDaDrugEntMapper;
 import com.qunzhixinxi.hnqz.admin.mapper.WmDeptTaskTypeConfigMapper;
 import com.qunzhixinxi.hnqz.admin.mapper.WmTaskMapper;
+import com.qunzhixinxi.hnqz.admin.mapper.WmTaskTypeSubCate2Mapper;
 import com.qunzhixinxi.hnqz.admin.mapper.WmTeamMapper;
 import com.qunzhixinxi.hnqz.admin.service.WmDeptTaskTypeConfigService;
 import com.qunzhixinxi.hnqz.admin.service.WmScorePackageService;
@@ -43,6 +48,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.PostConstruct;
 import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.LinkedHashMap;
@@ -78,10 +84,14 @@ public class WmDeptTaskTypeConfigServiceImpl extends ServiceImpl<WmDeptTaskTypeC
 
 	private final WmTeamMapper wmTeamMapper;
 
+	private final WmTaskTypeSubCate2Mapper wmTaskTypeSubCate2Mapper;
+
+	private final SysDictItemMapper sysDictItemMapper;
+
 	/**
 	 * 兼职学术专员启用的任务类型
 	 */
-	private final String[] ENABLE_ZBDB_STATUS_ARR = {"医院拜访", "商业公司拜访", "药店拜访", "电子名片分享", "产品相册分享", "学术信息交流",
+	private static String[] ENABLE_ZBDB_STATUS_ARR = {"医院拜访", "商业公司拜访", "药店拜访", "电子名片分享", "产品相册分享", "学术信息交流",
 			"受众打开产品相册", "受众阅读文章"};
 
 	/**
@@ -89,78 +99,100 @@ public class WmDeptTaskTypeConfigServiceImpl extends ServiceImpl<WmDeptTaskTypeC
 	 */
 	private static Map<String, List<String>> BASE_TASK_TYPE_MAP = new LinkedHashMap<>();
 
-	static {
-		List<String> meetingList = new ArrayList<String>() {{
-			add("医院科室推广会");
-			add("区域学术沙龙");
-			add("城市卫星会");
-			add("省级学科年会");
-		}};
-		BASE_TASK_TYPE_MAP.put("会议举办", meetingList);
-
-		List<String> interviewList = new ArrayList<String>() {{
-			add("一对一专访");
-		}};
-		BASE_TASK_TYPE_MAP.put("一对一专访", interviewList);
-
-		List<String> customerList = new ArrayList<String>() {{
-			add("医院拜访");
-			add("商业公司拜访");
-			add("药店拜访");
-		}};
-		BASE_TASK_TYPE_MAP.put("客户拜访", customerList);
-
-		List<String> producrList = new ArrayList<String>() {{
-			add("产品相册分享");
-			add("受众打开产品相册");
-			add("电子名片分享");
-		}};
-		BASE_TASK_TYPE_MAP.put("产品推广", producrList);
-
-		List<String> academicList = new ArrayList<String>() {{
-			add("学术信息交流");
-			add("受众阅读文章");
-		}};
-		BASE_TASK_TYPE_MAP.put("学术信息交流", academicList);
-
-		List<String> marketList = new ArrayList<String>() {{
-			add("政策信息收集");
-			add("竞品信息收集");
-			add("库存信息收集");
-			add("医院信息收集");
-			add("商业公司信息收集");
-			add("药物警戒相关信息收集(疗效等)");
-			add("药店调查");
-			add("库存盘点-中药颗粒剂");
-		}};
-		BASE_TASK_TYPE_MAP.put("市场信息收集", marketList);
-
-		List<String> medicineList = new ArrayList<String>() {{
-			add("专家咨询");
-			add("受试者管理");
-			add("医学撰写");
-			add("受试者招募");
-			add("数据管理");
-			add("统计分析");
-			add("临床监察");
-			add("调剂服务");
-			add("应收账款回款-A类");
-			add("应收账款回款-B类");
-			add("应收账款回款-C类");
-			add("手术跟台-一级");
-			add("手术跟台-二级");
-			add("手术跟台-三级");
-			add("物流信息收集");
-			add("设备保养");
-		}};
-		BASE_TASK_TYPE_MAP.put("专项服务", medicineList);
-
-		List<String> trainingList = new ArrayList<String>() {{
-			add("医院患者教育培训");
-			add("药店药师培训");
-			add("商业公司培训");
-		}};
-		BASE_TASK_TYPE_MAP.put("培训", trainingList);
+	/**
+	 * 初始化参数
+	 */
+	@PostConstruct
+	public void initParams() {
+		// 初始化兼职学术专员启用的任务类型
+		List<SysDictItem> enableZbdbStatusTaskType = sysDictItemMapper.selectList(Wrappers.<SysDictItem>lambdaQuery()
+				.eq(SysDictItem::getType, "enable_zbdb_status_task_type"));
+		ENABLE_ZBDB_STATUS_ARR = enableZbdbStatusTaskType.stream()
+				.map(SysDictItem::getLabel).toArray(String[]::new);
+
+		// 初始化任务类型Map
+		// 查询任务类型分类表
+		List<WmTaskTypeSubCate2> list = wmTaskTypeSubCate2Mapper.selectList(Wrappers.emptyWrapper());
+		// key-任务类型父类型, value-任务类型名称列表
+		BASE_TASK_TYPE_MAP = list.stream()
+				.collect(
+						Collectors.groupingBy(
+								subCate2 -> UpmsType.TaskSubCategory2.valueOf(subCate2.getSubCate()).getDescription(),
+								Collectors.mapping(WmTaskTypeSubCate2::getTypeName, Collectors.toList())
+						)
+				);
+
+//		List<String> meetingList = new ArrayList<String>() {{
+//			add("医院科室推广会");
+//			add("区域学术沙龙");
+//			add("城市卫星会");
+//			add("省级学科年会");
+//		}};
+//		BASE_TASK_TYPE_MAP.put("会议举办", meetingList);
+//
+//		List<String> interviewList = new ArrayList<String>() {{
+//			add("一对一专访");
+//		}};
+//		BASE_TASK_TYPE_MAP.put("一对一专访", interviewList);
+//
+//		List<String> customerList = new ArrayList<String>() {{
+//			add("医院拜访");
+//			add("商业公司拜访");
+//			add("药店拜访");
+//		}};
+//		BASE_TASK_TYPE_MAP.put("客户拜访", customerList);
+//
+//		List<String> producrList = new ArrayList<String>() {{
+//			add("产品相册分享");
+//			add("受众打开产品相册");
+//			add("电子名片分享");
+//		}};
+//		BASE_TASK_TYPE_MAP.put("产品推广", producrList);
+//
+//		List<String> academicList = new ArrayList<String>() {{
+//			add("学术信息交流");
+//			add("受众阅读文章");
+//		}};
+//		BASE_TASK_TYPE_MAP.put("学术信息交流", academicList);
+//
+//		List<String> marketList = new ArrayList<String>() {{
+//			add("政策信息收集");
+//			add("竞品信息收集");
+//			add("库存信息收集");
+//			add("医院信息收集");
+//			add("商业公司信息收集");
+//			add("药物警戒相关信息收集(疗效等)");
+//			add("药店调查");
+//			add("库存盘点-中药颗粒剂");
+//		}};
+//		BASE_TASK_TYPE_MAP.put("市场信息收集", marketList);
+//
+//		List<String> medicineList = new ArrayList<String>() {{
+//			add("专家咨询");
+//			add("受试者管理");
+//			add("医学撰写");
+//			add("受试者招募");
+//			add("数据管理");
+//			add("统计分析");
+//			add("临床监察");
+//			add("调剂服务");
+//			add("应收账款回款-A类");
+//			add("应收账款回款-B类");
+//			add("应收账款回款-C类");
+//			add("手术跟台-一级");
+//			add("手术跟台-二级");
+//			add("手术跟台-三级");
+//			add("物流信息收集");
+//			add("设备保养");
+//		}};
+//		BASE_TASK_TYPE_MAP.put("专项服务", medicineList);
+//
+//		List<String> trainingList = new ArrayList<String>() {{
+//			add("医院患者教育培训");
+//			add("药店药师培训");
+//			add("商业公司培训");
+//		}};
+//		BASE_TASK_TYPE_MAP.put("培训", trainingList);
 	}
 
 	/**

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

@@ -45,6 +45,7 @@ import com.qunzhixinxi.hnqz.admin.service.WmScorePackageService;
 import com.qunzhixinxi.hnqz.admin.service.WmScorePackageStatusService;
 import com.qunzhixinxi.hnqz.admin.service.WmTaskContentService;
 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.WmTaskTypeSubCategoryService;
@@ -91,6 +92,7 @@ public class WmTaskContentServiceImpl extends ServiceImpl<WmTaskContentMapper, W
 	private final SysPublicParamService sysPublicParamService;
 	private final WmTaskTypeSubCategoryService taskTypeSubCategoryService;
 	private final WmTaskSubmissionRuleService taskSubmissionRuleService;
+	private final WmTaskSubmissionPercentRuleService wmTaskSubmissionPercentRuleService;
 
 
 	private static final DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
@@ -902,22 +904,29 @@ public class WmTaskContentServiceImpl extends ServiceImpl<WmTaskContentMapper, W
 		}
 
 		// 医院信息收集、医院信息修改两类任务做的任务总积分不得大于积分包值的60%(积分包值小于5000不做限制)
-		if ("15".equals(wmTaskContent.getTemp30()) || "30".equals(wmTaskContent.getTemp30())) {
-			if (scorePackage.getScore() > 5000) {
-				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, "15", "30")
-						.ne(WmTask::getTaskStatus, "4"));
-				if (CollectionUtil.isNotEmpty(wmTaskList)) {
-					int totalScore = scorePackage.getScore();
-					int partScore = wmTaskList.stream().mapToInt(WmTask::getScore).sum();
-					if (partScore * 1.0 / totalScore > 0.6) {
-						throw new RuntimeException("医院信息收集、医院信息修改两类任务总积分不得大于积分包值的60%");
-					}
-				}
-			}
+//		if ("15".equals(wmTaskContent.getTemp30()) || "30".equals(wmTaskContent.getTemp30())) {
+//			if (scorePackage.getScore() > 5000) {
+//				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, "15", "30")
+//						.ne(WmTask::getTaskStatus, "4"));
+//				if (CollectionUtil.isNotEmpty(wmTaskList)) {
+//					int totalScore = scorePackage.getScore();
+//					int partScore = wmTaskList.stream().mapToInt(WmTask::getScore).sum();
+//					if (partScore * 1.0 / totalScore > 0.6) {
+//						throw new RuntimeException("医院信息收集、医院信息修改两类任务总积分不得大于积分包值的60%");
+//					}
+//				}
+//			}
+//		}
+		// 校验任务百分比限制规则(如果积分包值大于【任务配置】-【百分比限制】配置的起始值,
+		// 且【任务配置】-【百分比限制】所选的任务类型对应的任务总完成积分值>积分包值*【任务配置】-【百分比限制】配置的百分比,则校验不通过)
+		R<?> checkPercentRuleResult =
+				wmTaskSubmissionPercentRuleService.checkPercentRule(scorePackage, SecurityUtils.getUser().getDeptId(), null, null);
+		if (checkPercentRuleResult.getCode() != 0) {
+			throw new RuntimeException(checkPercentRuleResult.getMsg());
 		}
 
 		// 校验医院信息修改的任务(同一家医院,同一个人一个月只能修改一次,该医院一个月最多可修改3次)

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

@@ -0,0 +1,166 @@
+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;
+import com.qunzhixinxi.hnqz.admin.entity.WmScorePackage;
+import com.qunzhixinxi.hnqz.admin.entity.WmTask;
+import com.qunzhixinxi.hnqz.admin.entity.WmTaskType;
+import com.qunzhixinxi.hnqz.admin.enums.DelEnum;
+import com.qunzhixinxi.hnqz.admin.mapper.WmTaskSubmissionPercentRuleMapper;
+import com.qunzhixinxi.hnqz.admin.service.WmTaskService;
+import com.qunzhixinxi.hnqz.admin.service.WmTaskSubmissionPercentRuleService;
+import com.qunzhixinxi.hnqz.admin.service.WmTaskTypeService;
+import com.qunzhixinxi.hnqz.common.core.constant.enums.CommonFlag;
+import com.qunzhixinxi.hnqz.common.core.util.R;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.stream.Collectors;
+
+/**
+ * 任务提交百分比规则
+ *
+ * @author snows
+ * @date 2022/12/22 15:35
+ */
+@Service
+@AllArgsConstructor
+public class WmTaskSubmissionPercentRuleServiceImpl
+		extends ServiceImpl<WmTaskSubmissionPercentRuleMapper, WmTaskSubmissionPercentRule>
+		implements WmTaskSubmissionPercentRuleService {
+
+	private final WmTaskService wmTaskService;
+
+	private final WmTaskTypeService wmTaskTypeService;
+
+	/**
+	 * 校验任务百分比限制规则(达到要求的积分包,【任务配置】-【百分比限制】所选的任务总完成积分值不得大于积分包值*百分比)
+	 *
+	 * @param scorePackage 积分包实体
+	 * @param deptId 部门id
+	 * @param taskUserId 任务承接人userId
+	 * @param checkTaskTypeList 要校验的任务类型list
+	 * @return
+	 */
+	@Override
+	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()
+				.in(WmTaskSubmissionPercentRule::getDeptId, 1, deptId)
+				.eq(WmTaskSubmissionPercentRule::getOptFlag, CommonFlag.OptFlag.OK));
+
+		// 根据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;
+				}
+
+				if (CollUtil.isEmpty(toCheckTaskTypes)) {
+					return;
+				}
+
+				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();
+	}
+
+	/**
+	 * 更新
+	 *
+	 * @param rules
+	 * @return
+	 */
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public Boolean updateRule(List<WmTaskSubmissionPercentRule> rules) {
+
+		// 先删除,后新增
+		String batchId = rules.get(0).getBatchId();
+		List<WmTaskSubmissionPercentRule> queryRules = this.list(Wrappers.<WmTaskSubmissionPercentRule>lambdaQuery()
+				.eq(WmTaskSubmissionPercentRule::getBatchId, batchId));
+		WmTaskSubmissionPercentRule percentRule = queryRules.get(0);
+
+		this.update(Wrappers.<WmTaskSubmissionPercentRule>lambdaUpdate()
+				.eq(WmTaskSubmissionPercentRule::getBatchId, batchId)
+				.set(WmTaskSubmissionPercentRule::getOptFlag, CommonFlag.OptFlag.DELETED));
+
+		List<WmTaskSubmissionPercentRule> updateRules = new ArrayList<>();
+		for (WmTaskSubmissionPercentRule rule : rules) {
+
+			WmTaskSubmissionPercentRule insertRule = new WmTaskSubmissionPercentRule();
+			insertRule.setRule(rule.getRule());
+			insertRule.setBatchId(percentRule.getBatchId());
+			insertRule.setDeptId(percentRule.getDeptId());
+			insertRule.setSubCategory(rule.getSubCategory());
+			insertRule.setOptFlag(CommonFlag.OptFlag.OK);
+			updateRules.add(insertRule);
+		}
+
+		return this.saveBatch(updateRules);
+	}
+}

+ 130 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmTaskTypeSubCate2ServiceImpl.java

@@ -0,0 +1,130 @@
+package com.qunzhixinxi.hnqz.admin.service.impl;
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.map.MapUtil;
+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.constant.UpmsType;
+import com.qunzhixinxi.hnqz.admin.api.entity.SysDept;
+import com.qunzhixinxi.hnqz.admin.entity.WmDaAgent;
+import com.qunzhixinxi.hnqz.admin.entity.WmDaDrugEnt;
+import com.qunzhixinxi.hnqz.admin.entity.WmTaskTypeSubCate2;
+import com.qunzhixinxi.hnqz.admin.entity.WmTaskType;
+import com.qunzhixinxi.hnqz.admin.enums.DelEnum;
+import com.qunzhixinxi.hnqz.admin.enums.DeptLevelEnum;
+import com.qunzhixinxi.hnqz.admin.enums.EnableEnum;
+import com.qunzhixinxi.hnqz.admin.mapper.SysDeptMapper;
+import com.qunzhixinxi.hnqz.admin.mapper.WmDaAgentMapper;
+import com.qunzhixinxi.hnqz.admin.mapper.WmDaDrugEntMapper;
+import com.qunzhixinxi.hnqz.admin.mapper.WmTaskTypeSubCate2Mapper;
+import com.qunzhixinxi.hnqz.admin.service.WmTaskTypeSubCate2Service;
+import com.qunzhixinxi.hnqz.admin.service.WmTaskTypeService;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+* @author snows
+* @description 针对表【wm_task_type_sub_cate2(任务类型二级分类表)】的数据库操作Service实现
+* @createDate 2022-12-22 23:57:19
+*/
+@Service
+@AllArgsConstructor
+public class WmTaskTypeSubCate2ServiceImpl extends ServiceImpl<WmTaskTypeSubCate2Mapper, WmTaskTypeSubCate2>
+    implements WmTaskTypeSubCate2Service {
+
+	private final SysDeptMapper sysDeptMapper;
+
+	private final WmDaDrugEntMapper wmDaDrugEntMapper;
+
+	private final WmDaAgentMapper wmDaAgentMapper;
+
+	private final WmTaskTypeService wmTaskTypeService;
+
+	/**
+	 * 根据企业id查询任务类型树
+	 *
+	 * @param deptId
+	 * @return
+	 */
+	@Override
+	public List<Map<String, Object>> listTaskTypeTree(Integer deptId) {
+
+		SysDept dept = sysDeptMapper.selectById(deptId);
+
+		// 查询企业对应的任务类型
+		LambdaQueryWrapper<WmTaskType> taskTypeWrapper = Wrappers.lambdaQuery();
+		// 根据企业类型拼接查询条件
+		if (DeptLevelEnum.ADMIN.getVal().equals(dept.getLevel())) {
+			taskTypeWrapper.eq(WmTaskType::getTaskTypeLevel, "1");
+			taskTypeWrapper.eq(WmTaskType::getDelFlag, DelEnum.NOT_DEL.val());
+		} else if (DeptLevelEnum.ENT.getVal().equals(dept.getLevel())) {
+			WmDaDrugEnt wmDaDrugEnt = wmDaDrugEntMapper.selectOne(Wrappers.<WmDaDrugEnt>lambdaQuery()
+					.eq(WmDaDrugEnt::getDeptId, deptId)
+					.eq(WmDaDrugEnt::getDelFlag, DelEnum.NOT_DEL.val()));
+			taskTypeWrapper.eq(WmTaskType::getDeptId, deptId);
+			taskTypeWrapper.eq(WmTaskType::getRuleId, wmDaDrugEnt.getId());
+			taskTypeWrapper.eq(WmTaskType::getTaskEntId, wmDaDrugEnt.getId());
+		} else {
+			WmDaAgent wmDaAgent = wmDaAgentMapper.selectOne(Wrappers.<WmDaAgent>lambdaQuery()
+					.eq(WmDaAgent::getDeptId, deptId)
+					.eq(WmDaAgent::getDelFlag, DelEnum.NOT_DEL.val()));
+			taskTypeWrapper.eq(WmTaskType::getDeptId, deptId);
+			taskTypeWrapper.eq(WmTaskType::getRuleId, wmDaAgent.getId());
+			taskTypeWrapper.eq(WmTaskType::getTaskEntId, wmDaAgent.getId());
+		}
+		List<WmTaskType> taskTypeList = wmTaskTypeService.list(taskTypeWrapper);
+
+		// 查询基础任务类型
+		List<WmTaskType> baseTaskTypeList = wmTaskTypeService.list(Wrappers.<WmTaskType>lambdaQuery()
+				.eq(WmTaskType::getTaskTypeLevel, "1")
+				.eq(WmTaskType::getEnableFlag, EnableEnum.ENABLE.val())
+				.eq(WmTaskType::getDelFlag, DelEnum.NOT_DEL.val()));
+		Map<String, String> baseTaskTypeMap = baseTaskTypeList.stream()
+				.collect(Collectors.toMap(WmTaskType::getTaskTypeName, WmTaskType::getId));
+
+		// 查询任务类型分类表
+		List<WmTaskTypeSubCate2> list = this.list();
+		// key-任务类型父类型, value-任务类型名称列表
+		Map<String, List<String>> listMap = list.stream()
+				.collect(
+						Collectors.groupingBy(
+								WmTaskTypeSubCate2::getSubCate, Collectors.mapping(WmTaskTypeSubCate2::getTypeName, Collectors.toList())
+						)
+				);
+
+		List<Map<String, Object>> resultList = new ArrayList<>();
+		if (CollectionUtil.isNotEmpty(taskTypeList)) {
+			// 根据任务类型分类表,给企业任务类型分类
+			listMap.forEach((key, val) -> {
+				List<Map<String, String>> childTypeList = taskTypeList.stream()
+						.filter(wmTaskType -> val.contains(wmTaskType.getTaskTypeName())).map(wmTaskType -> {
+							Map<String, String> typeMap = new HashMap<>();
+							typeMap.put("taskTypeName", wmTaskType.getTaskTypeName());
+							typeMap.put("taskTypeId", baseTaskTypeMap.get(wmTaskType.getTaskTypeName()));
+							return typeMap;
+						})
+						.collect(Collectors.toList());
+				if (CollectionUtil.isNotEmpty(childTypeList)) {
+					Map<String, Object> taskTypeMap = MapUtil.newHashMap(2);
+					taskTypeMap.put("category", key);
+					taskTypeMap.put("categoryName", UpmsType.TaskSubCategory2.valueOf(key).getDescription());
+					taskTypeMap.put("children", childTypeList);
+					resultList.add(taskTypeMap);
+				}
+			});
+		}
+
+		return resultList;
+	}
+}
+
+
+
+

+ 10 - 0
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;
@@ -51,6 +52,7 @@ public class WmUserSignServiceImpl extends ServiceImpl<WmUserSignMapper, WmUserS
 	private final SysPublicParamService sysPublicParamService;
 	private final WmDeptTaskTypeTemplateService wmDeptTaskTypeTemplateService;
 	private final WmUserSignDetailService wmUserSignDetailService;
+	private final WmTaskSubmissionPercentRuleService wmTaskSubmissionPercentRuleService;
 	private final UpmsConfig upmsConfig;
 
 	@Override
@@ -241,6 +243,14 @@ public class WmUserSignServiceImpl extends ServiceImpl<WmUserSignMapper, WmUserS
 
 		}
 
+		// 校验任务百分比限制规则(如果积分包值大于【任务配置】-【百分比限制】配置的起始值,
+		// 且【任务配置】-【百分比限制】所选的任务类型对应的任务总完成积分值>积分包值*【任务配置】-【百分比限制】配置的百分比,则校验不通过)
+		R<?> checkPercentRuleResult =
+				wmTaskSubmissionPercentRuleService.checkPercentRule(tWmScorePackage, SecurityUtils.getUser().getDeptId(), null, Arrays.asList(taskTypeId));
+		if (checkPercentRuleResult.getCode() != 0) {
+			throw new RuntimeException(checkPercentRuleResult.getMsg());
+		}
+
 		/**
 		 * 积分包领取明细
 		 */