|
|
@@ -116,7 +116,7 @@ private FamilyInvitationService familyInvitationService;
|
|
|
user.setSessionKey(sessionData.get("session_key"));
|
|
|
user.setCreatedAt(new Date());
|
|
|
user.setUpdatedAt(new Date());
|
|
|
- userMapper.insert(user);
|
|
|
+ createUserAndFamily(user);
|
|
|
try { onboardingService.initForUser(user.getId()); onboardingService.completeTask(user.getId(), "REGISTER"); } catch (Exception e) { /* onboarding init failure should not block login */ }
|
|
|
} else {
|
|
|
// 6. 手机号已存在但openid不同,绑定openid
|
|
|
@@ -136,6 +136,8 @@ private FamilyInvitationService familyInvitationService;
|
|
|
userMapper.updateById(user);
|
|
|
}
|
|
|
|
|
|
+ ensureUserHasFamily(user);
|
|
|
+
|
|
|
// 管理员不能登录小程序
|
|
|
if ("admin".equals(user.getRole())) {
|
|
|
throw new RuntimeException("该账号不允许登录小程序");
|
|
|
@@ -197,7 +199,7 @@ private FamilyInvitationService familyInvitationService;
|
|
|
user.setPassword("");
|
|
|
user.setCreatedAt(new Date());
|
|
|
user.setUpdatedAt(new Date());
|
|
|
- userMapper.insert(user);
|
|
|
+ createUserAndFamily(user);
|
|
|
try { onboardingService.initForUser(user.getId()); onboardingService.completeTask(user.getId(), "REGISTER"); } catch (Exception e) { /* onboarding init failure should not block login */ }
|
|
|
} else {
|
|
|
// 老用户,更新信息(如果提供了)
|
|
|
@@ -211,6 +213,8 @@ private FamilyInvitationService familyInvitationService;
|
|
|
userMapper.updateById(user);
|
|
|
}
|
|
|
|
|
|
+ ensureUserHasFamily(user);
|
|
|
+
|
|
|
// 生成token
|
|
|
String token = jwtConfig.generateToken(user.getId(), user.getRole());
|
|
|
|
|
|
@@ -267,6 +271,7 @@ private FamilyInvitationService familyInvitationService;
|
|
|
user.setSessionKey(sessionData.get("session_key"));
|
|
|
user.setUpdatedAt(new Date());
|
|
|
userMapper.updateById(user);
|
|
|
+ ensureUserHasFamily(user);
|
|
|
|
|
|
// 4. 生成token
|
|
|
String token = jwtConfig.generateToken(user.getId(), user.getRole());
|
|
|
@@ -302,6 +307,7 @@ private FamilyInvitationService familyInvitationService;
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
+ ensureUserHasFamily(user);
|
|
|
String token = jwtConfig.generateToken(user.getId(), user.getRole());
|
|
|
|
|
|
LoginResultDTO result = new LoginResultDTO();
|
|
|
@@ -509,7 +515,7 @@ private FamilyInvitationService familyInvitationService;
|
|
|
user.setPassword("");
|
|
|
user.setCreatedAt(new Date());
|
|
|
user.setUpdatedAt(new Date());
|
|
|
- userMapper.insert(user);
|
|
|
+ createUserAndFamily(user);
|
|
|
|
|
|
// 如果有邀请码,提交加入家庭请求(需管理员审批)
|
|
|
if (dto.getInviteCode() != null && !dto.getInviteCode().isEmpty()) {
|
|
|
@@ -890,9 +896,11 @@ private FamilyInvitationService familyInvitationService;
|
|
|
user.setPassword(""); // 初始密码为空,需要后续设置
|
|
|
user.setCreatedAt(new Date());
|
|
|
user.setUpdatedAt(new Date());
|
|
|
- userMapper.insert(user);
|
|
|
+ createUserAndFamily(user);
|
|
|
}
|
|
|
|
|
|
+ ensureUserHasFamily(user);
|
|
|
+
|
|
|
// 生成token
|
|
|
String token = jwtConfig.generateToken(user.getId(), user.getRole());
|
|
|
|
|
|
@@ -1074,10 +1082,16 @@ FamilyMember child = familyMemberMapper.selectById(memberId);
|
|
|
}
|
|
|
// 更新性别
|
|
|
if (dto.getGender() != null) {
|
|
|
- if (!"male".equals(dto.getGender()) && !"female".equals(dto.getGender())) {
|
|
|
+ String gender = dto.getGender();
|
|
|
+ if ("男".equals(gender) || "0".equals(gender)) {
|
|
|
+ gender = "male";
|
|
|
+ } else if ("女".equals(gender) || "1".equals(gender)) {
|
|
|
+ gender = "female";
|
|
|
+ }
|
|
|
+ if (!"male".equals(gender) && !"female".equals(gender)) {
|
|
|
throw new RuntimeException("性别取值非法,仅支持 male/female");
|
|
|
}
|
|
|
- user.setGender(dto.getGender());
|
|
|
+ user.setGender(gender);
|
|
|
}
|
|
|
// 更新生日(将字符串转换为Date)
|
|
|
if (dto.getBirthday() != null && !dto.getBirthday().isEmpty()) {
|
|
|
@@ -1247,6 +1261,58 @@ FamilyMember child = familyMemberMapper.selectById(memberId);
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 创建用户并自动创建家庭(注册时用)
|
|
|
+ * @return 创建后的 user(含 familyId 和 isFamilyAdmin)
|
|
|
+ */
|
|
|
+ private User createUserAndFamily(User user) {
|
|
|
+ // 1. 插入 user
|
|
|
+ userMapper.insert(user);
|
|
|
+
|
|
|
+ // 2. 创建家庭
|
|
|
+ Family family = new Family();
|
|
|
+ String familyName = (user.getNickname() != null && !user.getNickname().isEmpty())
|
|
|
+ ? user.getNickname() + "的家庭" : "我的家庭";
|
|
|
+ family.setName(familyName);
|
|
|
+ family.setInviteCode(generateInviteCode());
|
|
|
+ family.setCreatorId(user.getId());
|
|
|
+ family.setCreatedAt(new Date());
|
|
|
+ family.setUpdatedAt(new Date());
|
|
|
+ familyMapper.insert(family);
|
|
|
+
|
|
|
+ // 3. 设置 user 的家庭关联
|
|
|
+ user.setFamilyId(family.getId());
|
|
|
+ user.setIsFamilyAdmin(true);
|
|
|
+ user.setUpdatedAt(new Date());
|
|
|
+ userMapper.updateById(user);
|
|
|
+
|
|
|
+ log.info("已为用户 {} 自动创建家庭 {} ({})", user.getId(), family.getId(), familyName);
|
|
|
+ return user;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 确保用户有家庭(安全兜底:注册/登录时如果 familyId 为空则自动创建)
|
|
|
+ */
|
|
|
+ private void ensureUserHasFamily(User user) {
|
|
|
+ if (user.getFamilyId() != null && user.getFamilyId() != 0L) {
|
|
|
+ return; // 已有家庭
|
|
|
+ }
|
|
|
+ Family family = new Family();
|
|
|
+ String familyName = (user.getNickname() != null && !user.getNickname().isEmpty())
|
|
|
+ ? user.getNickname() + "的家庭" : "我的家庭";
|
|
|
+ family.setName(familyName);
|
|
|
+ family.setInviteCode(generateInviteCode());
|
|
|
+ family.setCreatorId(user.getId());
|
|
|
+ family.setCreatedAt(new Date());
|
|
|
+ family.setUpdatedAt(new Date());
|
|
|
+ familyMapper.insert(family);
|
|
|
+ user.setFamilyId(family.getId());
|
|
|
+ user.setIsFamilyAdmin(true);
|
|
|
+ user.setUpdatedAt(new Date());
|
|
|
+ userMapper.updateById(user);
|
|
|
+ log.info("安全兜底:为用户 {} 自动创建家庭 {}", user.getId(), family.getId());
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 为用户创建新家庭
|
|
|
*/
|
|
|
@@ -1289,9 +1355,10 @@ FamilyMember child = familyMemberMapper.selectById(memberId);
|
|
|
user.setPassword("");
|
|
|
user.setCreatedAt(new Date());
|
|
|
user.setUpdatedAt(new Date());
|
|
|
- userMapper.insert(user);
|
|
|
+ createUserAndFamily(user);
|
|
|
|
|
|
distributionService.registerByInviteCode(inviteCode, user.getId());
|
|
|
+ ensureUserHasFamily(user);
|
|
|
|
|
|
String token = jwtConfig.generateToken(user.getId(), user.getRole());
|
|
|
|
|
|
@@ -1328,46 +1395,36 @@ FamilyMember child = familyMemberMapper.selectById(memberId);
|
|
|
throw new RuntimeException("该账号不允许登录小程序");
|
|
|
}
|
|
|
|
|
|
- // 手机号已注册,加入家庭——如有旧家庭则合并
|
|
|
user = existingUser;
|
|
|
- if (user.getFamilyId() != null && !user.getFamilyId().equals(family.getId())) {
|
|
|
- familyInvitationService.mergeIntoFamily(user.getId(), family.getId());
|
|
|
- } else {
|
|
|
- user.setFamilyId(family.getId());
|
|
|
- user.setUpdatedAt(new Date());
|
|
|
- userMapper.updateById(user);
|
|
|
+ ensureUserHasFamily(user);
|
|
|
+ try {
|
|
|
+ familyJoinRequestService.createJoinRequest(user.getId(), inviteCode);
|
|
|
+ log.info("已为用户 {} 提交加入家庭 {} 的请求", user.getId(), family.getId());
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.warn("提交加入家庭请求失败: {}", e.getMessage());
|
|
|
}
|
|
|
} else {
|
|
|
- // 创建新用户并加入家庭
|
|
|
isNewUser = true;
|
|
|
user = new User();
|
|
|
user.setOpenid("phone:" + phone);
|
|
|
user.setUnionid("");
|
|
|
- user.setFamilyId(family.getId());
|
|
|
user.setRole(role);
|
|
|
user.setNickname(nickname);
|
|
|
user.setPhone(phone);
|
|
|
user.setPassword("");
|
|
|
user.setCreatedAt(new Date());
|
|
|
user.setUpdatedAt(new Date());
|
|
|
- userMapper.insert(user);
|
|
|
- }
|
|
|
-
|
|
|
- // 如果家庭绑定了成长规划师,自动将家庭ID添加到成长规划师的 teacherFamilyIds
|
|
|
- if (family.getTeacherId() != null) {
|
|
|
- User teacher = userMapper.selectById(family.getTeacherId());
|
|
|
- if (teacher != null && "teacher".equals(teacher.getRole())) {
|
|
|
- String currentIds = teacher.getTeacherFamilyIds();
|
|
|
- String newFamilyId = String.valueOf(family.getId());
|
|
|
- if (currentIds == null || !currentIds.contains(newFamilyId)) {
|
|
|
- String updatedIds = currentIds == null ? newFamilyId : currentIds + "," + newFamilyId;
|
|
|
- teacher.setTeacherFamilyIds(updatedIds);
|
|
|
- teacher.setUpdatedAt(new Date());
|
|
|
- userMapper.updateById(teacher);
|
|
|
- }
|
|
|
+ createUserAndFamily(user);
|
|
|
+ try {
|
|
|
+ familyJoinRequestService.createJoinRequest(user.getId(), inviteCode);
|
|
|
+ log.info("已为用户 {} 提交加入家庭 {} 的请求", user.getId(), family.getId());
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.warn("提交加入家庭请求失败: {}", e.getMessage());
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ ensureUserHasFamily(user);
|
|
|
+
|
|
|
// 生成token
|
|
|
String token = jwtConfig.generateToken(user.getId(), user.getRole());
|
|
|
|