Просмотр исходного кода

feat(family): 创建/更新资料时按真实姓名联动家庭名

Xiaogang Liao 1 неделя назад
Родитель
Сommit
7988147ed1

+ 2 - 3
cfc-backend/src/main/java/com/etotem/cfc/service/FamilyMemberService.java

@@ -34,6 +34,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
 import com.etotem.cfc.util.SortUtil;
+import com.etotem.cfc.util.FamilyNamingSupport;
 
 @Service
 public class FamilyMemberService {
@@ -911,9 +912,7 @@ vo.setIsSelf(viewerMember != null && viewerMember.getId().equals(fm.getId()));
      */
     private Long createFamilyForUser(User user) {
         Family family = new Family();
-        String familyName = (user.getNickname() != null && !user.getNickname().isEmpty())
-                ? user.getNickname() + "的家庭" : "我的家庭";
-        family.setName(familyName);
+        family.setName(FamilyNamingSupport.buildFamilyName(user));
         family.setInviteCode(generateInviteCode());
         family.setCreatorId(user.getId());
         family.setCreatedAt(new Date());

+ 18 - 0
cfc-backend/src/main/java/com/etotem/cfc/service/UserService.java

@@ -1162,6 +1162,7 @@ FamilyMember child = familyMemberMapper.selectById(memberId);
         if (user == null) {
             return false;
         }
+        String oldRealName = user.getRealName();
         // 管理员角色不允许修改
         if ("admin".equals(user.getRole())) {
             throw new RuntimeException("管理员角色不允许修改");
@@ -1278,6 +1279,23 @@ FamilyMember child = familyMemberMapper.selectById(memberId);
 
         userMapper.updateById(user);
 
+        // 家庭名联动:主账号真实姓名变化时同步为「XX家庭」(非关键字段,失败仅告警)
+        if (dto.getRealName() != null && !dto.getRealName().trim().isEmpty()
+                && !dto.getRealName().trim().equals(oldRealName == null ? "" : oldRealName.trim())) {
+            try {
+                LambdaQueryWrapper<Family> fw = new LambdaQueryWrapper<>();
+                fw.eq(Family::getCreatorId, userId);
+                Family ownedFamily = familyMapper.selectOne(fw);
+                if (ownedFamily != null) {
+                    ownedFamily.setName(dto.getRealName().trim() + "家庭");
+                    ownedFamily.setUpdatedAt(new Date());
+                    familyMapper.updateById(ownedFamily);
+                }
+            } catch (Exception e) {
+                log.warn("同步家庭名为真实姓名失败: userId={}, realName={}", userId, dto.getRealName(), e);
+            }
+        }
+
         // 用户填写地区后,自动创建/更新一条联系人(Consignee),与订单联系人共享数据
         syncUserConsignee(userId, user);
 

+ 57 - 0
cfc-backend/src/test/java/com/etotem/cfc/service/UserServiceFamilyNameLinkTest.java

@@ -0,0 +1,57 @@
+package com.etotem.cfc.service;
+
+import com.etotem.cfc.entity.Family;
+import com.etotem.cfc.entity.User;
+import com.etotem.cfc.mapper.FamilyMapper;
+import com.etotem.cfc.mapper.UserMapper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.mock.mockito.MockBean;
+import javax.annotation.Resource;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.*;
+
+/**
+ * 验证 updateUserInfo 在 realName 变化时联动更新家庭名。
+ *
+ * 注意:@SpringBootTest 需显式指定 datasource URL,因为 application.yml 的默认值
+ * 指向 192.168.16.251(不可达),而本地开发机 MariaDB(127.0.0.1:3306/zxyj)
+ * 有完整的 zxyj schema 可引导上下文加载。
+ */
+@SpringBootTest(properties = {
+    "spring.datasource.url=jdbc:mysql://127.0.0.1:3306/zxyj?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true",
+    "spring.datasource.username=zxyj",
+    "spring.datasource.password=zxyj@123"
+})
+public class UserServiceFamilyNameLinkTest {
+    @Resource private UserService userService;
+    @MockBean private UserMapper userMapper;
+    @MockBean private FamilyMapper familyMapper;
+
+    @Test void realName变化_联动家庭名() {
+        User u = new User(); u.setId(10L); u.setRole("parent"); u.setRealName("旧名"); u.setFamilyId(7L);
+        when(userMapper.selectById(10L)).thenReturn(u);
+        Family f = new Family(); f.setId(7L); f.setName("旧名家庭"); f.setCreatorId(10L);
+        when(familyMapper.selectOne(any(LambdaQueryWrapper.class))).thenReturn(f);
+        when(userMapper.updateById(any())).thenReturn(1);
+
+        com.etotem.cfc.dto.UpdateUserDTO dto = new com.etotem.cfc.dto.UpdateUserDTO();
+        dto.setRealName("王五");
+        userService.updateUserInfo(10L, dto);
+
+        verify(familyMapper).updateById(argThat(fam -> "王五家庭".equals(fam.getName())));
+    }
+
+    @Test void realName未变_不改家庭名() {
+        User u = new User(); u.setId(10L); u.setRole("parent"); u.setRealName("王五");
+        when(userMapper.selectById(10L)).thenReturn(u);
+        when(userMapper.updateById(any())).thenReturn(1);
+
+        com.etotem.cfc.dto.UpdateUserDTO dto = new com.etotem.cfc.dto.UpdateUserDTO();
+        dto.setRealName("王五");
+        userService.updateUserInfo(10L, dto);
+
+        verify(familyMapper, never()).updateById(any());
+    }
+}