Эх сурвалжийг харах

fix: 查询积分包关联的任务类型接口,创建积分包没有选,但显示了的问题

lixuesong 3 жил өмнө
parent
commit
ad931cc876

+ 47 - 8
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/ApiController.java

@@ -805,22 +805,61 @@ public class ApiController {
 		 * 所有能做的任务
 		 */
 		List<WmScoreTaskType> wmScoreTaskTypeList = wmScoreTaskTypeService.list(Wrappers.query(query));
-
+		// 对应的taskTypeId
 		List<String> baseIds = wmScoreTaskTypeList.stream().
 				map(WmScoreTaskType::getTaskTypeId).collect(Collectors.toList());
-
+		// 父级parent_id
 		List<String> parentId = baseIds.stream().filter(item -> item.startsWith("p")).collect(Collectors.toList());
+		// 子级parentId
 		List<String> id = baseIds.stream().filter(item -> !item.startsWith("p")).collect(Collectors.toList());
 
-		List<WmTaskType> baseTypeList1 = wmTaskTypeService.
-				list(Wrappers.<WmTaskType>query().lambda().in(WmTaskType::getParentId, parentId));
+		// 记录表中父id的所有子集
+		List<WmTaskType> baseTypeList1 = wmTaskTypeService.list(Wrappers.<WmTaskType>query().lambda()
+				.eq(WmTaskType::getTaskTypeLevel, "1")
+				.in(WmTaskType::getParentId, parentId));
 
-		List<WmTaskType> baseTypeList2 = wmTaskTypeService.
-				list(Wrappers.<WmTaskType>query().lambda().in(WmTaskType::getId, id));
+		// 按照父id分组
+		Map<String,Map<String, List<WmTaskType>>> pTaskTypeMap = baseTypeList1.stream()
+				.collect(Collectors.groupingBy(WmTaskType::getParentId,Collectors.groupingBy(WmTaskType::getBaseId)));
 
-		baseTypeList1.addAll(baseTypeList2);
+		// 查询所有子id对应的taskType列表
+		List<WmTaskType> baseTypeList2 = wmTaskTypeService.
+				list(Wrappers.<WmTaskType>query().lambda().eq(WmTaskType::getTaskTypeLevel, "1").in(WmTaskType::getId, id));
+
+		// 所有子id对应的taskType列表 按照父id分组
+		Map<String,Map<String, List<WmTaskType>>> cTaskTypeMap = baseTypeList2.stream()
+				.collect(Collectors.groupingBy(WmTaskType::getParentId,Collectors.groupingBy(WmTaskType::getBaseId)));
+		// 对应的parentId
+		Set<String> cPidSet = cTaskTypeMap.keySet();
+
+		List<WmTaskType> temp = new ArrayList<>();
+
+		// 解决页面父级id和数据库存的父级id不一致的问题(如一对一专访在页面父级是p-16,但taskType表中父级id为p-1)
+		// 比较baseTypeList1和baseTypeList2中parentId相同的taskTypeId的数据,如果baseId相同,则取baseTypeList2中的taskTypeId
+		for (Map.Entry<String, Map<String, List<WmTaskType>>> entry : pTaskTypeMap.entrySet()) {
+			// 获取父级id
+			String pid = entry.getKey();
+			// 判断大类中是否有相同的父类id
+			if (cPidSet.contains(pid)) {
+				// baseId
+				Map<String, List<WmTaskType>> value = entry.getValue();
+				Set<String> pBaseIds = value.keySet();
+				// small
+				Map<String, List<WmTaskType>> cVal = cTaskTypeMap.get(pid);
+				Set<String> cBaseIds = cVal.keySet();
+				// 求个交集,找出公共的
+				Set<String> res = new HashSet<>(pBaseIds);
+				res.retainAll(cBaseIds);
+				// 找出的存入temp
+				for (String bId : res) {
+					temp.addAll(cVal.get(bId));
+				}
+				// 取父级中对应baseId是独有的部分
+				pBaseIds.stream().filter(i -> !res.contains(i)).forEach(i -> temp.addAll(value.get(i)));
+			}
+		}
 
-		List<String> baseNames = baseTypeList1.stream().
+		List<String> baseNames = temp.stream().
 				map(WmTaskType::getTaskTypeName).distinct().collect(Collectors.toList());
 		WmTaskType wmTaskType = new WmTaskType();
 		wmTaskType.setRuleId(wmScorePackage.getRuleId());