فهرست منبع

fix: 添加家庭成员数量校验 - 任务分配需≥2人/挑战需≥2参与者/互动双方不能同一人

iwt 1 ماه پیش
والد
کامیت
183bc0c60b

+ 3 - 0
cfc-backend/src/main/java/com/etotem/cfc/service/FamilyChallengeService.java

@@ -581,6 +581,9 @@ public class FamilyChallengeService {
                 return Result.error("参与成员不属于本家庭");
             }
         }
+        if (participantIds.size() < 2) {
+            return Result.error("家庭挑战至少需要2名成员参与");
+        }
 
         // 创建挑战(pending 状态,参与成员同意后转 active)
         FamilyChallenge challenge = new FamilyChallenge();

+ 3 - 0
cfc-backend/src/main/java/com/etotem/cfc/service/InteractionLogService.java

@@ -51,6 +51,9 @@ public class InteractionLogService {
         if (dto.getFromMemberId() == null || dto.getToMemberId() == null) {
             throw new IllegalArgumentException("fromMemberId和toMemberId不能为空");
         }
+        if (dto.getFromMemberId().equals(dto.getToMemberId())) {
+            throw new IllegalArgumentException("互动双方不能是同一人");
+        }
         if (dto.getInteractionType() == null || dto.getInteractionType().isEmpty()) {
             throw new IllegalArgumentException("互动类型不能为空");
         }

+ 42 - 1
cfc-backend/src/main/java/com/etotem/cfc/service/TaskService.java

@@ -67,7 +67,40 @@ public class TaskService implements TaskServiceInterface {
         if (executorType == null || executorType.isEmpty()) {
             executorType = "child";
         }
-        
+
+        if ("member".equals(executorType)) {
+            Long currentMemberId = getCurrentMemberId(userId);
+            long familyMemberCount = familyMemberMapper.selectCount(
+                    new LambdaQueryWrapper<FamilyMember>()
+                            .eq(FamilyMember::getFamilyId, currentUser.getFamilyId()));
+            if (familyMemberCount < 2) {
+                throw new IllegalArgumentException("该任务需分配给其他家庭成员,当前家庭不足2人");
+            }
+            List<Long> assigneeIds = dto.getMemberIds();
+            if (assigneeIds == null || assigneeIds.isEmpty()) {
+                if (dto.getExecutorId() != null) {
+                    assigneeIds = Collections.singletonList(dto.getExecutorId());
+                } else if (dto.getMemberId() != null) {
+                    assigneeIds = Collections.singletonList(dto.getMemberId());
+                } else {
+                    assigneeIds = Collections.emptyList();
+                }
+            }
+            for (Long assigneeId : assigneeIds) {
+                if (assigneeId == null) continue;
+                if (assigneeId.equals(currentMemberId)) {
+                    throw new IllegalArgumentException("不能给自己分配家庭成员任务");
+                }
+                Long count = familyMemberMapper.selectCount(
+                        new LambdaQueryWrapper<FamilyMember>()
+                                .eq(FamilyMember::getId, assigneeId)
+                                .eq(FamilyMember::getFamilyId, currentUser.getFamilyId()));
+                if (count == 0) {
+                    throw new IllegalArgumentException("被分配成员不属于本家庭");
+                }
+            }
+        }
+
         // 支持多孩子:为每个孩子创建独立任务实例
         List<Long> childIds = dto.getMemberIds();
         if (childIds == null || childIds.isEmpty()) {
@@ -207,6 +240,14 @@ task.setReviewByCategory(dto.getReviewByCategory() != null ? dto.getReviewByCate
         return task;
     }
 
+    private Long getCurrentMemberId(Long userId) {
+        FamilyMember member = familyMemberMapper.selectOne(
+                new LambdaQueryWrapper<FamilyMember>()
+                        .eq(FamilyMember::getUserId, userId)
+                        .last("LIMIT 1"));
+        return member != null ? member.getId() : null;
+    }
+
 /**
  * 实现接口:获取今日任务列表(按childId,不过滤维度)
  */

+ 1 - 1
cfc-web/.last_build_commit

@@ -1 +1 @@
-04ce3625608218520b80db7367ec66bf1bead775
+b62513205390d862aaef8515bd4aa6eb517cf6b0

+ 2 - 2
cfc-web/package-lock.json

@@ -1,12 +1,12 @@
 {
   "name": "cfc-web",
-  "version": "1.0.890",
+  "version": "1.0.891",
   "lockfileVersion": 3,
   "requires": true,
   "packages": {
     "": {
       "name": "cfc-web",
-      "version": "1.0.890",
+      "version": "1.0.891",
       "dependencies": {
         "@wangeditor/editor": "^5.1.23",
         "@wangeditor/editor-for-vue": "^1.0.2",