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

feat: wire FamilyMember birth fields + User hobbies/dietPreferences + profile history through service/controller/migration

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Sisyphus 3 месяцев назад
Родитель
Сommit
26d68da0cf

+ 28 - 0
cfc-backend/src/main/java/com/etotem/cfc/config/DatabaseInitializer.java

@@ -4380,6 +4380,34 @@ try {
             log.warn("创建butler_sessions表可能已存在: {}", e.getMessage());
         }
 
+        // 迁移43: family_members表添加出生时辰/体重/出生地/剖腹产字段
+        ensureColumn("family_members", "birth_hour", "VARCHAR(16) COMMENT '出生时辰: 子丑寅卯辰巳午未申酉戌亥'");
+        ensureColumn("family_members", "birth_weight", "INT COMMENT '出生体重(克)'");
+        ensureColumn("family_members", "birth_place", "VARCHAR(128) COMMENT '出生地'");
+        ensureColumn("family_members", "is_cesarean", "TINYINT DEFAULT NULL COMMENT '是否剖腹产: 0=顺产, 1=剖腹产'");
+
+        // 迁移44: users表添加兴趣爱好/饮食偏好字段
+        ensureColumn("users", "hobbies", "VARCHAR(500) COMMENT '兴趣爱好'");
+        ensureColumn("users", "diet_preferences", "VARCHAR(500) COMMENT '饮食偏好'");
+
+        // 迁移45: 创建user_profile_history表(用户信息变更历史)
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS user_profile_history (" +
+                    "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                    "user_id BIGINT NOT NULL COMMENT '用户ID', " +
+                    "field_name VARCHAR(64) NOT NULL COMMENT '变更字段名', " +
+                    "old_value TEXT COMMENT '旧值', " +
+                    "new_value TEXT COMMENT '新值', " +
+                    "source VARCHAR(32) DEFAULT 'user' COMMENT '变更来源: user/admin/auto', " +
+                    "changed_at DATETIME NOT NULL COMMENT '变更时间', " +
+                    "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
+                    "INDEX idx_ph_user (user_id), " +
+                    "INDEX idx_ph_field (field_name), " +
+                    "INDEX idx_ph_changed (changed_at) " +
+                    ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户信息变更历史表'");
+            log.info("已创建user_profile_history表");
+        } catch (Exception e) { /* 忽略已存在 */ }
+
         // 迁移 79: 创建 tianpan_daily_fortune 表(家庭每日运势)
         try {
             jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS tianpan_daily_fortune (" +

+ 2 - 0
cfc-backend/src/main/java/com/etotem/cfc/controller/UserController.java

@@ -93,6 +93,8 @@ public class UserController {
         if (params.containsKey("familyRole")) dto.setFamilyRole((String) params.get("familyRole"));
         if (params.containsKey("idCard")) dto.setIdCard((String) params.get("idCard"));
         if (params.containsKey("mascot")) dto.setMascot((String) params.get("mascot"));
+        if (params.containsKey("hobbies")) dto.setHobbies((String) params.get("hobbies"));
+        if (params.containsKey("dietPreferences")) dto.setDietPreferences((String) params.get("dietPreferences"));
 
         boolean success = userService.updateUserInfo(userId, dto);
         if (success) {

+ 4 - 0
cfc-backend/src/main/java/com/etotem/cfc/service/FamilyMemberService.java

@@ -129,6 +129,10 @@ public class FamilyMemberService {
                 throw new IllegalArgumentException("出生日期格式错误,应为yyyy-MM-dd");
             }
         }
+        member.setBirthHour(dto.getBirthHour());
+        member.setBirthWeight(dto.getBirthWeight());
+        member.setBirthPlace(dto.getBirthPlace());
+        member.setIsCesarean(dto.getIsCesarean());
         member.setRelationshipType(relationshipTypeKey);
         member.setGeneration(genLevel.getOffset());
         member.setIsSpouse(isSpouse);

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

@@ -24,6 +24,9 @@ import org.springframework.util.DigestUtils;
 import java.nio.charset.StandardCharsets;
 import java.util.*;
 
+import com.etotem.cfc.entity.UserProfileHistory;
+import com.etotem.cfc.mapper.UserProfileHistoryMapper;
+
 
 @Slf4j
 @Service
@@ -59,6 +62,9 @@ private OnboardingService onboardingService;
 @Resource
 private FamilyInvitationService familyInvitationService;
 
+    @Resource
+    private UserProfileHistoryMapper userProfileHistoryMapper;
+
     public LoginResultDTO wechatLogin(WechatLoginDTO dto) {
         // 1. 通过code获取openid
         Map<String, String> sessionData = wechatService.code2Session(dto.getCode());
@@ -1020,11 +1026,42 @@ private FamilyInvitationService familyInvitationService;
         if (dto.getMascot() != null) {
             user.setMascot(dto.getMascot());
         }
+        // 更新兴趣爱好
+        if (dto.getHobbies() != null) {
+            String oldHobbies = user.getHobbies();
+            user.setHobbies(dto.getHobbies());
+            recordProfileChange(userId, "hobbies", oldHobbies, dto.getHobbies(), "user_edit");
+        }
+        // 更新饮食偏好
+        if (dto.getDietPreferences() != null) {
+            String oldDiet = user.getDietPreferences();
+            user.setDietPreferences(dto.getDietPreferences());
+            recordProfileChange(userId, "dietPreferences", oldDiet, dto.getDietPreferences(), "user_edit");
+        }
         user.setUpdatedAt(new Date());
         userMapper.updateById(user);
         return true;
     }
 
+    /**
+     * 记录用户信息变更历史(仅当新旧值不同时写入)
+     */
+    private void recordProfileChange(Long userId, String fieldName,
+                                      String oldValue, String newValue, String source) {
+        if (oldValue == null && newValue == null) return;
+        if (oldValue != null && oldValue.equals(newValue)) return;
+        if (newValue != null && newValue.equals(oldValue)) return;
+        UserProfileHistory history = new UserProfileHistory();
+        history.setUserId(userId);
+        history.setFieldName(fieldName);
+        history.setOldValue(oldValue);
+        history.setNewValue(newValue);
+        history.setSource(source);
+        history.setChangedAt(new Date());
+        history.setCreatedAt(new Date());
+        userProfileHistoryMapper.insert(history);
+    }
+
     /**
      * 从身份证号提取生日
      * 15位:1985年07月08日 -> 1985-07-08