Bläddra i källkod

feat(backend): 问卷提交时同步pairwise关系评分到family_relationships

Sisyphus 1 månad sedan
förälder
incheckning
3396de86ef

+ 61 - 0
cfc-backend/src/main/java/com/etotem/cfc/service/RelationshipQuestionnaireService.java

@@ -5,9 +5,11 @@ import com.etotem.cfc.dto.GenerateQuestionnaireDTO;
 import com.etotem.cfc.dto.QuestionnaireSnapshotVO;
 import com.etotem.cfc.dto.SubmitQuestionnaireDTO;
 import com.etotem.cfc.entity.FamilyMember;
+import com.etotem.cfc.entity.FamilyRelationship;
 import com.etotem.cfc.entity.RelationshipQuestionnaireResponse;
 import com.etotem.cfc.entity.RelationshipQuestionnaireSnapshot;
 import com.etotem.cfc.mapper.FamilyMemberMapper;
+import com.etotem.cfc.mapper.FamilyRelationshipMapper;
 import com.etotem.cfc.mapper.RelationshipQuestionnaireResponseMapper;
 import com.etotem.cfc.mapper.RelationshipQuestionnaireSnapshotMapper;
 import org.slf4j.Logger;
@@ -37,6 +39,9 @@ public class RelationshipQuestionnaireService {
     @Resource
     private FamilyMemberMapper familyMemberMapper;
 
+    @Resource
+    private FamilyRelationshipMapper familyRelationshipMapper;
+
     @Resource
     private AIService aiService;
 
@@ -135,6 +140,9 @@ public class RelationshipQuestionnaireService {
         // 更新成员的评分
         updateMemberScores(snapshot.getFamilyMemberId(), scores);
 
+        // 同步写入 pairwise 关系评分(答卷人视角 → 被评成员)
+        syncPairwiseScores(dto.getRespondentId(), snapshot.getFamilyMemberId(), scores);
+
         return response;
     }
 
@@ -301,4 +309,57 @@ public class RelationshipQuestionnaireService {
             familyMemberMapper.updateById(member);
         }
     }
+
+    /**
+     * 将问卷评分写入 family_relationships 表(答卷人视角)
+     * 答卷人无 family_member 记录或关系行不存在时,静默跳过(不阻塞问卷保存)
+     */
+    private void syncPairwiseScores(Long respondentUserId, Long targetMemberId, BigDecimal[] scores) {
+        try {
+            if (respondentUserId == null || targetMemberId == null || scores == null) {
+                return;
+            }
+            // 找到答卷人对应的 family_member 记录
+            LambdaQueryWrapper<FamilyMember> respWrapper = new LambdaQueryWrapper<>();
+            respWrapper.eq(FamilyMember::getUserId, respondentUserId);
+            FamilyMember respondent = familyMemberMapper.selectOne(respWrapper);
+            if (respondent == null) {
+                log.warn("答卷人用户{}无family_member记录,跳过pairwise评分同步", respondentUserId);
+                return;
+            }
+            // 查 from→to 关系行(有则更新,无则插入)
+            LambdaQueryWrapper<FamilyRelationship> relWrapper = new LambdaQueryWrapper<>();
+            relWrapper.eq(FamilyRelationship::getFromMemberId, respondent.getId())
+                    .eq(FamilyRelationship::getToMemberId, targetMemberId);
+            FamilyRelationship rel = familyRelationshipMapper.selectOne(relWrapper);
+            Date now = new Date();
+            if (rel != null) {
+                rel.setTrustScore(scores[0]);
+                rel.setIntimacyScore(scores[1]);
+                rel.setCommunicationScore(scores[2]);
+                rel.setUpdatedAt(now);
+                familyRelationshipMapper.updateById(rel);
+            } else {
+                FamilyMember target = familyMemberMapper.selectById(targetMemberId);
+                if (target == null) {
+                    return;
+                }
+                FamilyRelationship newRel = new FamilyRelationship();
+                newRel.setFamilyId(target.getFamilyId());
+                newRel.setFromMemberId(respondent.getId());
+                newRel.setToMemberId(targetMemberId);
+                int respGen = respondent.getGeneration() != null ? respondent.getGeneration() : 0;
+                int targetGen = target.getGeneration() != null ? target.getGeneration() : 0;
+                newRel.setGenerationValue(respGen - targetGen);
+                newRel.setTrustScore(scores[0]);
+                newRel.setIntimacyScore(scores[1]);
+                newRel.setCommunicationScore(scores[2]);
+                newRel.setCreatedAt(now);
+                newRel.setUpdatedAt(now);
+                familyRelationshipMapper.insert(newRel);
+            }
+        } catch (Exception e) {
+            log.warn("pairwise评分同步失败: {}", e.getMessage());
+        }
+    }
 }