|
|
@@ -0,0 +1,146 @@
|
|
|
+package com.etotem.cfc.service;
|
|
|
+
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import com.etotem.cfc.entity.FamilyMember;
|
|
|
+import com.etotem.cfc.entity.FamilyRelationship;
|
|
|
+import com.etotem.cfc.mapper.FamilyMemberMapper;
|
|
|
+import com.etotem.cfc.mapper.FamilyRelationshipMapper;
|
|
|
+import org.slf4j.Logger;
|
|
|
+import org.slf4j.LoggerFactory;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
+
|
|
|
+import javax.annotation.Resource;
|
|
|
+import java.util.Date;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+@Service
|
|
|
+public class FamilyRelationshipService {
|
|
|
+
|
|
|
+ private static final Logger log = LoggerFactory.getLogger(FamilyRelationshipService.class);
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private FamilyRelationshipMapper familyRelationshipMapper;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private FamilyMemberMapper familyMemberMapper;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 为新成员创建与所有现有成员的双向关系
|
|
|
+ * 算法:
|
|
|
+ * - 新成员与现有成员 Mi 之间的辈分关系:
|
|
|
+ * existingMi → newMember: generation = Mi.generation - newMemberGeneration
|
|
|
+ * newMember → existingMi: generation = newMemberGeneration - Mi.generation
|
|
|
+ * - 如果 existingMi.generation == null, 默认 0
|
|
|
+ */
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public void createRelationsForNewMember(Long familyId, Long newMemberId, Integer newMemberGeneration) {
|
|
|
+ // 获取除新成员外的所有现有成员
|
|
|
+ List<FamilyMember> existing = familyMemberMapper.selectList(
|
|
|
+ new LambdaQueryWrapper<FamilyMember>()
|
|
|
+ .eq(FamilyMember::getFamilyId, familyId)
|
|
|
+ .ne(FamilyMember::getId, newMemberId));
|
|
|
+
|
|
|
+ if (existing.isEmpty()) {
|
|
|
+ return; // 第一个成员,无需创建关系
|
|
|
+ }
|
|
|
+
|
|
|
+ Date now = new Date();
|
|
|
+ for (FamilyMember existingMember : existing) {
|
|
|
+ int exGen = existingMember.getGeneration() != null ? existingMember.getGeneration() : 0;
|
|
|
+ int newGen = newMemberGeneration != null ? newMemberGeneration : 0;
|
|
|
+
|
|
|
+ // A (existing) → B (new): generation = exGen - newGen
|
|
|
+ FamilyRelationship rel1 = new FamilyRelationship();
|
|
|
+ rel1.setFamilyId(familyId);
|
|
|
+ rel1.setFromMemberId(existingMember.getId());
|
|
|
+ rel1.setToMemberId(newMemberId);
|
|
|
+ rel1.setGenerationValue(exGen - newGen);
|
|
|
+ rel1.setCreatedAt(now);
|
|
|
+ rel1.setUpdatedAt(now);
|
|
|
+ try {
|
|
|
+ familyRelationshipMapper.insert(rel1);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.warn("插入关系记录(from existing→new)可能重复: {}", e.getMessage());
|
|
|
+ }
|
|
|
+
|
|
|
+ // B (new) → A (existing): generation = newGen - exGen
|
|
|
+ FamilyRelationship rel2 = new FamilyRelationship();
|
|
|
+ rel2.setFamilyId(familyId);
|
|
|
+ rel2.setFromMemberId(newMemberId);
|
|
|
+ rel2.setToMemberId(existingMember.getId());
|
|
|
+ rel2.setGenerationValue(newGen - exGen);
|
|
|
+ rel2.setCreatedAt(now);
|
|
|
+ rel2.setUpdatedAt(now);
|
|
|
+ try {
|
|
|
+ familyRelationshipMapper.insert(rel2);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.warn("插入关系记录(from new→existing)可能重复: {}", e.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取某个成员的所有关系(以该成员为起点的)
|
|
|
+ */
|
|
|
+ public List<FamilyRelationship> getRelationsForMember(Long memberId) {
|
|
|
+ return familyRelationshipMapper.selectList(
|
|
|
+ new LambdaQueryWrapper<FamilyRelationship>()
|
|
|
+ .eq(FamilyRelationship::getFromMemberId, memberId));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 删除某个成员的所有关系(双向:from 和 to 都删)
|
|
|
+ */
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public void deleteRelationsForMember(Long memberId) {
|
|
|
+ familyRelationshipMapper.delete(
|
|
|
+ new LambdaQueryWrapper<FamilyRelationship>()
|
|
|
+ .eq(FamilyRelationship::getFromMemberId, memberId)
|
|
|
+ .or()
|
|
|
+ .eq(FamilyRelationship::getToMemberId, memberId));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取某个成员的所有关系中,目标成员ID→辈分值的映射
|
|
|
+ */
|
|
|
+ public Map<Long, Integer> getGenerationMapFrom(Long fromMemberId) {
|
|
|
+ List<FamilyRelationship> rels = getRelationsForMember(fromMemberId);
|
|
|
+ return rels.stream()
|
|
|
+ .collect(Collectors.toMap(FamilyRelationship::getToMemberId, FamilyRelationship::getGenerationValue));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据辈分值计算关系标签
|
|
|
+ */
|
|
|
+ public String computeRelationshipLabel(Integer generationValue, String gender) {
|
|
|
+ if (generationValue == null) return "未知";
|
|
|
+ boolean isMale = "male".equals(gender);
|
|
|
+
|
|
|
+ switch (generationValue) {
|
|
|
+ // 向上(对方是长辈)
|
|
|
+ case 3:
|
|
|
+ return "曾祖" + (isMale ? "父" : "母");
|
|
|
+ case 2:
|
|
|
+ return isMale ? "祖父" : "祖母";
|
|
|
+ case 1:
|
|
|
+ return isMale ? "父亲" : "母亲";
|
|
|
+ // 同辈
|
|
|
+ case 0:
|
|
|
+ return isMale ? "兄弟" : "姐妹";
|
|
|
+ // 向下(对方是晚辈)
|
|
|
+ case -1:
|
|
|
+ return isMale ? "儿子" : "女儿";
|
|
|
+ case -2:
|
|
|
+ return isMale ? "孙子" : "孙女";
|
|
|
+ case -3:
|
|
|
+ return "曾" + (isMale ? "孙" : "孙女");
|
|
|
+ default:
|
|
|
+ return generationValue > 0
|
|
|
+ ? "上" + generationValue + "代"
|
|
|
+ : "下" + Math.abs(generationValue) + "代";
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|