|
|
@@ -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());
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|