|
|
@@ -0,0 +1,472 @@
|
|
|
+package com.etotem.cfc.service;
|
|
|
+
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import com.etotem.cfc.dto.AddFamilyMemberDTO;
|
|
|
+import com.etotem.cfc.dto.FamilyMemberVO;
|
|
|
+import com.etotem.cfc.dto.SwitchMemberVO;
|
|
|
+import com.etotem.cfc.entity.*;
|
|
|
+import com.etotem.cfc.mapper.*;
|
|
|
+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.ArrayList;
|
|
|
+import java.util.Date;
|
|
|
+import java.util.List;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+@Service
|
|
|
+public class FamilyMemberService {
|
|
|
+
|
|
|
+ private static final Logger log = LoggerFactory.getLogger(FamilyMemberService.class);
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private FamilyMemberMapper familyMemberMapper;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private RelationshipTypeMapper relationshipTypeMapper;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private UserMapper userMapper;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private FamilyMapper familyMapper;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private ChildMapper childMapper;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private FamilyMemberAttributesMapper familyMemberAttributesMapper;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 添加家庭成员
|
|
|
+ */
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public FamilyMemberVO addMember(Long userId, AddFamilyMemberDTO dto) {
|
|
|
+ if (dto.getNickname() == null || dto.getNickname().trim().isEmpty()) {
|
|
|
+ throw new IllegalArgumentException("成员昵称不能为空");
|
|
|
+ }
|
|
|
+ if (dto.getRelationshipType() == null || dto.getRelationshipType().trim().isEmpty()) {
|
|
|
+ throw new IllegalArgumentException("关系类型不能为空");
|
|
|
+ }
|
|
|
+
|
|
|
+ User user = userMapper.selectById(userId);
|
|
|
+ if (user == null) {
|
|
|
+ throw new RuntimeException("用户不存在");
|
|
|
+ }
|
|
|
+ if (user.getFamilyId() == null) {
|
|
|
+ throw new RuntimeException("用户未加入家庭,请先创建或加入家庭");
|
|
|
+ }
|
|
|
+ Long familyId = user.getFamilyId();
|
|
|
+
|
|
|
+ // 验证关系类型是否存在
|
|
|
+ RelationshipType relType = relationshipTypeMapper.selectOne(
|
|
|
+ new LambdaQueryWrapper<RelationshipType>()
|
|
|
+ .eq(RelationshipType::getTypeKey, dto.getRelationshipType())
|
|
|
+ .eq(RelationshipType::getEnabled, 1));
|
|
|
+ if (relType == null) {
|
|
|
+ throw new IllegalArgumentException("无效的关系类型: " + dto.getRelationshipType());
|
|
|
+ }
|
|
|
+
|
|
|
+ // 创建家庭成员记录
|
|
|
+ FamilyMember member = new FamilyMember();
|
|
|
+ member.setFamilyId(familyId);
|
|
|
+ member.setNickname(dto.getNickname().trim());
|
|
|
+ member.setPhone(dto.getPhone());
|
|
|
+ member.setAvatar(dto.getAvatar());
|
|
|
+ member.setGender(dto.getGender());
|
|
|
+ if (dto.getBirthday() != null && !dto.getBirthday().isEmpty()) {
|
|
|
+ try {
|
|
|
+ java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy-MM-dd");
|
|
|
+ member.setBirthday(sdf.parse(dto.getBirthday()));
|
|
|
+ } catch (java.text.ParseException e) {
|
|
|
+ throw new IllegalArgumentException("出生日期格式错误,应为yyyy-MM-dd");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ member.setRelationshipType(dto.getRelationshipType());
|
|
|
+ member.setCapabilityRole(relType.getCapabilityRole());
|
|
|
+ member.setShowToFamily(1);
|
|
|
+ member.setTotalPoints(0);
|
|
|
+ member.setCreatedAt(new Date());
|
|
|
+ member.setUpdatedAt(new Date());
|
|
|
+
|
|
|
+ // 手机号匹配:查找是否有同手机号的已注册用户
|
|
|
+ if (dto.getPhone() != null && !dto.getPhone().isEmpty()) {
|
|
|
+ User matchedUser = userMapper.selectOne(
|
|
|
+ new LambdaQueryWrapper<User>().eq(User::getPhone, dto.getPhone()));
|
|
|
+ if (matchedUser != null) {
|
|
|
+ member.setUserId(matchedUser.getId());
|
|
|
+ // 将匹配到的用户加入同一家庭(如果尚未加入)
|
|
|
+ if (matchedUser.getFamilyId() == null) {
|
|
|
+ matchedUser.setFamilyId(familyId);
|
|
|
+ matchedUser.setUpdatedAt(new Date());
|
|
|
+ userMapper.updateById(matchedUser);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ familyMemberMapper.insert(member);
|
|
|
+
|
|
|
+ // 如果能力角色为 child,同步创建 children 表记录(游戏/任务/专注度等功能需要)
|
|
|
+ if ("child".equals(relType.getCapabilityRole())) {
|
|
|
+ Child child = new Child();
|
|
|
+ child.setUserId(userId);
|
|
|
+ child.setFamilyId(familyId);
|
|
|
+ child.setNickname(dto.getNickname().trim());
|
|
|
+ child.setPhone(dto.getPhone());
|
|
|
+ child.setGender(dto.getGender());
|
|
|
+ if (member.getBirthday() != null) {
|
|
|
+ child.setBirthday(member.getBirthday());
|
|
|
+ // 根据生日计算年龄
|
|
|
+ java.util.Calendar cal = java.util.Calendar.getInstance();
|
|
|
+ cal.setTime(member.getBirthday());
|
|
|
+ int birthYear = cal.get(java.util.Calendar.YEAR);
|
|
|
+ int birthMonth = cal.get(java.util.Calendar.MONTH);
|
|
|
+ int birthDay = cal.get(java.util.Calendar.DAY_OF_MONTH);
|
|
|
+ java.util.Calendar now = java.util.Calendar.getInstance();
|
|
|
+ int age = now.get(java.util.Calendar.YEAR) - birthYear;
|
|
|
+ if (now.get(java.util.Calendar.MONTH) < birthMonth ||
|
|
|
+ (now.get(java.util.Calendar.MONTH) == birthMonth && now.get(java.util.Calendar.DAY_OF_MONTH) < birthDay)) {
|
|
|
+ age--;
|
|
|
+ }
|
|
|
+ child.setAge(Math.max(0, age));
|
|
|
+ }
|
|
|
+ // 默认年龄>=6开启扣分
|
|
|
+ Integer age = child.getAge();
|
|
|
+ child.setPenaltyEnabled(age != null && age >= 6 ? 1 : 0);
|
|
|
+ child.setTheme("default");
|
|
|
+ child.setTotalPoints(0);
|
|
|
+ child.setStreakDays(0);
|
|
|
+ child.setFocusMaxDaily(3);
|
|
|
+ child.setFocusRemaining(3);
|
|
|
+ child.setFocusResetDate(new Date());
|
|
|
+ child.setCreatedAt(new Date());
|
|
|
+ child.setUpdatedAt(new Date());
|
|
|
+ childMapper.insert(child);
|
|
|
+ }
|
|
|
+
|
|
|
+ return toFamilyMemberVO(member, relType);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取家庭成员列表(合并 children + family_members)
|
|
|
+ */
|
|
|
+ public List<FamilyMemberVO> listMembers(Long userId) {
|
|
|
+ User user = userMapper.selectById(userId);
|
|
|
+ if (user == null || user.getFamilyId() == null) {
|
|
|
+ return new ArrayList<>();
|
|
|
+ }
|
|
|
+ Long familyId = user.getFamilyId();
|
|
|
+ List<FamilyMemberVO> result = new ArrayList<>();
|
|
|
+
|
|
|
+ // 1. 查询 relationship_types 用于映射显示名
|
|
|
+ List<RelationshipType> relTypes = relationshipTypeMapper.selectList(
|
|
|
+ new LambdaQueryWrapper<RelationshipType>().eq(RelationshipType::getEnabled, 1));
|
|
|
+ java.util.Map<String, String> relTypeNameMap = relTypes.stream()
|
|
|
+ .collect(Collectors.toMap(RelationshipType::getTypeKey, RelationshipType::getTypeName));
|
|
|
+
|
|
|
+ // 2. 查询 family_members 表
|
|
|
+ List<FamilyMember> familyMembers = familyMemberMapper.selectList(
|
|
|
+ new LambdaQueryWrapper<FamilyMember>().eq(FamilyMember::getFamilyId, familyId));
|
|
|
+ for (FamilyMember fm : familyMembers) {
|
|
|
+ FamilyMemberVO vo = new FamilyMemberVO();
|
|
|
+ vo.setId(fm.getId());
|
|
|
+ vo.setSource("family_member");
|
|
|
+ vo.setUserId(fm.getUserId());
|
|
|
+ vo.setNickname(fm.getNickname());
|
|
|
+ vo.setPhone(fm.getPhone());
|
|
|
+ vo.setAvatar(fm.getAvatar());
|
|
|
+ vo.setGender(fm.getGender());
|
|
|
+ vo.setRelationshipType(fm.getRelationshipType());
|
|
|
+ vo.setRelationshipTypeName(relTypeNameMap.getOrDefault(fm.getRelationshipType(), fm.getRelationshipType()));
|
|
|
+ vo.setCapabilityRole(fm.getCapabilityRole());
|
|
|
+ vo.setRoleLabel(relTypeNameMap.getOrDefault(fm.getRelationshipType(), fm.getCapabilityRole()));
|
|
|
+ vo.setTotalPoints(fm.getTotalPoints());
|
|
|
+ vo.setShowToFamily(fm.getShowToFamily());
|
|
|
+ if (fm.getBirthday() != null) {
|
|
|
+ vo.setAge(calculateAge(fm.getBirthday()));
|
|
|
+ }
|
|
|
+ result.add(vo);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 3. 查询 children 表(已有孩子数据)
|
|
|
+ List<Child> children = childMapper.selectList(
|
|
|
+ new LambdaQueryWrapper<Child>().eq(Child::getFamilyId, familyId));
|
|
|
+ for (Child c : children) {
|
|
|
+ FamilyMemberVO vo = new FamilyMemberVO();
|
|
|
+ vo.setId(c.getId());
|
|
|
+ vo.setSource("child");
|
|
|
+ vo.setNickname(c.getNickname());
|
|
|
+ vo.setPhone(c.getPhone());
|
|
|
+ vo.setGender(c.getGender());
|
|
|
+ vo.setRelationshipType("child");
|
|
|
+ vo.setRelationshipTypeName("子女");
|
|
|
+ vo.setCapabilityRole("child");
|
|
|
+ vo.setRoleLabel("孩子");
|
|
|
+ vo.setAge(c.getAge());
|
|
|
+ vo.setTotalPoints(c.getTotalPoints());
|
|
|
+ vo.setShowToFamily(c.getShowToFamily());
|
|
|
+ result.add(vo);
|
|
|
+ }
|
|
|
+
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 切换到家庭成员视图
|
|
|
+ */
|
|
|
+ public SwitchMemberVO switchToMember(Long userId, Long memberId) {
|
|
|
+ User user = userMapper.selectById(userId);
|
|
|
+ if (user == null || user.getFamilyId() == null) {
|
|
|
+ throw new RuntimeException("用户未加入家庭");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 从 family_members 查找
|
|
|
+ FamilyMember member = familyMemberMapper.selectById(memberId);
|
|
|
+ if (member != null && member.getFamilyId().equals(user.getFamilyId())) {
|
|
|
+ SwitchMemberVO vo = new SwitchMemberVO();
|
|
|
+ vo.setMemberId(member.getId());
|
|
|
+ vo.setSource("family_member");
|
|
|
+ vo.setCapabilityRole(member.getCapabilityRole());
|
|
|
+ vo.setNickname(member.getNickname());
|
|
|
+ return vo;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 从 children 表查找(兼容已有数据)
|
|
|
+ Child child = childMapper.selectById(memberId);
|
|
|
+ if (child != null && child.getFamilyId() != null && child.getFamilyId().equals(user.getFamilyId())) {
|
|
|
+ SwitchMemberVO vo = new SwitchMemberVO();
|
|
|
+ vo.setMemberId(child.getId());
|
|
|
+ vo.setSource("child");
|
|
|
+ vo.setCapabilityRole("child");
|
|
|
+ vo.setNickname(child.getNickname());
|
|
|
+ return vo;
|
|
|
+ }
|
|
|
+
|
|
|
+ throw new RuntimeException("成员不存在或不属于您的家庭");
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 踢出家庭成员
|
|
|
+ */
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public void kickMember(Long userId, Long memberId) {
|
|
|
+ User operator = userMapper.selectById(userId);
|
|
|
+ if (operator == null || operator.getFamilyId() == null) {
|
|
|
+ throw new RuntimeException("用户未加入家庭");
|
|
|
+ }
|
|
|
+ Family family = familyMapper.selectById(operator.getFamilyId());
|
|
|
+ if (family == null) {
|
|
|
+ throw new RuntimeException("家庭不存在");
|
|
|
+ }
|
|
|
+ // 仅管理员可踢出
|
|
|
+ if (!Long.valueOf(userId).equals(family.getCreatorId())) {
|
|
|
+ throw new RuntimeException("只有家庭管理员才能踢出成员");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 从 family_members 踢出
|
|
|
+ FamilyMember member = familyMemberMapper.selectById(memberId);
|
|
|
+ if (member != null && member.getFamilyId().equals(operator.getFamilyId())) {
|
|
|
+ familyMemberMapper.deleteById(memberId);
|
|
|
+ // 如果关联了 User,清除其 familyId
|
|
|
+ if (member.getUserId() != null) {
|
|
|
+ User targetUser = userMapper.selectById(member.getUserId());
|
|
|
+ if (targetUser != null && operator.getFamilyId().equals(targetUser.getFamilyId())) {
|
|
|
+ targetUser.setFamilyId(null);
|
|
|
+ targetUser.setUpdatedAt(new Date());
|
|
|
+ userMapper.updateById(targetUser);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 如果是 child 角色,删除对应的 children 记录
|
|
|
+ if ("child".equals(member.getCapabilityRole())) {
|
|
|
+ List<Child> children = childMapper.selectList(
|
|
|
+ new LambdaQueryWrapper<Child>()
|
|
|
+ .eq(Child::getFamilyId, member.getFamilyId())
|
|
|
+ .eq(Child::getNickname, member.getNickname()));
|
|
|
+ for (Child c : children) {
|
|
|
+ childMapper.deleteById(c.getId());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 从 children 踢出(兼容已有数据)
|
|
|
+ Child child = childMapper.selectById(memberId);
|
|
|
+ if (child != null && child.getFamilyId() != null && child.getFamilyId().equals(operator.getFamilyId())) {
|
|
|
+ childMapper.deleteById(memberId);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ throw new RuntimeException("成员不存在");
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 更新成员信息
|
|
|
+ */
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public FamilyMemberVO updateMember(Long userId, Long memberId, AddFamilyMemberDTO dto) {
|
|
|
+ User user = userMapper.selectById(userId);
|
|
|
+ if (user == null || user.getFamilyId() == null) {
|
|
|
+ throw new RuntimeException("用户未加入家庭");
|
|
|
+ }
|
|
|
+
|
|
|
+ FamilyMember member = familyMemberMapper.selectById(memberId);
|
|
|
+ if (member == null || !member.getFamilyId().equals(user.getFamilyId())) {
|
|
|
+ throw new RuntimeException("成员不存在或不属于您的家庭");
|
|
|
+ }
|
|
|
+
|
|
|
+ if (dto.getNickname() != null && !dto.getNickname().trim().isEmpty()) {
|
|
|
+ member.setNickname(dto.getNickname().trim());
|
|
|
+ }
|
|
|
+ if (dto.getPhone() != null) {
|
|
|
+ member.setPhone(dto.getPhone());
|
|
|
+ }
|
|
|
+ if (dto.getAvatar() != null) {
|
|
|
+ member.setAvatar(dto.getAvatar());
|
|
|
+ }
|
|
|
+ if (dto.getGender() != null) {
|
|
|
+ member.setGender(dto.getGender());
|
|
|
+ }
|
|
|
+ if (dto.getBirthday() != null) {
|
|
|
+ try {
|
|
|
+ java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy-MM-dd");
|
|
|
+ member.setBirthday(sdf.parse(dto.getBirthday()));
|
|
|
+ } catch (java.text.ParseException e) {
|
|
|
+ throw new IllegalArgumentException("出生日期格式错误,应为yyyy-MM-dd");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ member.setUpdatedAt(new Date());
|
|
|
+ familyMemberMapper.updateById(member);
|
|
|
+
|
|
|
+ // 同步更新 children 记录(如果存在)
|
|
|
+ if ("child".equals(member.getCapabilityRole())) {
|
|
|
+ List<Child> children = childMapper.selectList(
|
|
|
+ new LambdaQueryWrapper<Child>()
|
|
|
+ .eq(Child::getFamilyId, member.getFamilyId())
|
|
|
+ .eq(Child::getNickname, member.getNickname()));
|
|
|
+ for (Child c : children) {
|
|
|
+ if (dto.getNickname() != null && !dto.getNickname().trim().isEmpty()) {
|
|
|
+ c.setNickname(dto.getNickname().trim());
|
|
|
+ }
|
|
|
+ if (dto.getGender() != null) {
|
|
|
+ c.setGender(dto.getGender());
|
|
|
+ }
|
|
|
+ if (dto.getPhone() != null) {
|
|
|
+ c.setPhone(dto.getPhone());
|
|
|
+ }
|
|
|
+ if (dto.getBirthday() != null) {
|
|
|
+ try {
|
|
|
+ java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy-MM-dd");
|
|
|
+ c.setBirthday(sdf.parse(dto.getBirthday()));
|
|
|
+ } catch (java.text.ParseException e) {
|
|
|
+ // ignore
|
|
|
+ }
|
|
|
+ }
|
|
|
+ c.setUpdatedAt(new Date());
|
|
|
+ childMapper.updateById(c);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 查询关系类型名称
|
|
|
+ RelationshipType relType = relationshipTypeMapper.selectOne(
|
|
|
+ new LambdaQueryWrapper<RelationshipType>()
|
|
|
+ .eq(RelationshipType::getTypeKey, member.getRelationshipType()));
|
|
|
+ return toFamilyMemberVO(member, relType);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取所有启用的关系类型列表
|
|
|
+ */
|
|
|
+ public List<RelationshipType> getRelationshipTypes() {
|
|
|
+ return relationshipTypeMapper.selectList(
|
|
|
+ new LambdaQueryWrapper<RelationshipType>()
|
|
|
+ .eq(RelationshipType::getEnabled, 1)
|
|
|
+ .orderByAsc(RelationshipType::getSortOrder));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据关系类型key获取关系类型
|
|
|
+ */
|
|
|
+ public RelationshipType getRelationshipTypeByKey(String typeKey) {
|
|
|
+ return relationshipTypeMapper.selectOne(
|
|
|
+ new LambdaQueryWrapper<RelationshipType>()
|
|
|
+ .eq(RelationshipType::getTypeKey, typeKey));
|
|
|
+ }
|
|
|
+
|
|
|
+ // ===== 管理端方法 =====
|
|
|
+
|
|
|
+ public List<RelationshipType> listAllRelationshipTypes() {
|
|
|
+ return relationshipTypeMapper.selectList(
|
|
|
+ new LambdaQueryWrapper<RelationshipType>()
|
|
|
+ .orderByAsc(RelationshipType::getSortOrder));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public RelationshipType saveRelationshipType(RelationshipType type) {
|
|
|
+ if (type.getId() != null) {
|
|
|
+ RelationshipType existing = relationshipTypeMapper.selectById(type.getId());
|
|
|
+ if (existing != null) {
|
|
|
+ existing.setTypeKey(type.getTypeKey());
|
|
|
+ existing.setTypeName(type.getTypeName());
|
|
|
+ existing.setCapabilityRole(type.getCapabilityRole());
|
|
|
+ existing.setSortOrder(type.getSortOrder());
|
|
|
+ existing.setEnabled(type.getEnabled());
|
|
|
+ relationshipTypeMapper.updateById(existing);
|
|
|
+ return existing;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ type.setCreatedAt(new Date());
|
|
|
+ relationshipTypeMapper.insert(type);
|
|
|
+ return type;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public void deleteRelationshipType(Long id) {
|
|
|
+ relationshipTypeMapper.deleteById(id);
|
|
|
+ }
|
|
|
+
|
|
|
+ // ===== 内部方法 =====
|
|
|
+
|
|
|
+ private FamilyMemberVO toFamilyMemberVO(FamilyMember member, RelationshipType relType) {
|
|
|
+ FamilyMemberVO vo = new FamilyMemberVO();
|
|
|
+ vo.setId(member.getId());
|
|
|
+ vo.setSource("family_member");
|
|
|
+ vo.setUserId(member.getUserId());
|
|
|
+ vo.setNickname(member.getNickname());
|
|
|
+ vo.setPhone(member.getPhone());
|
|
|
+ vo.setAvatar(member.getAvatar());
|
|
|
+ vo.setGender(member.getGender());
|
|
|
+ vo.setRelationshipType(member.getRelationshipType());
|
|
|
+ if (relType != null) {
|
|
|
+ vo.setRelationshipTypeName(relType.getTypeName());
|
|
|
+ vo.setRoleLabel(relType.getTypeName());
|
|
|
+ } else {
|
|
|
+ vo.setRelationshipTypeName(member.getRelationshipType());
|
|
|
+ vo.setRoleLabel(member.getCapabilityRole());
|
|
|
+ }
|
|
|
+ vo.setCapabilityRole(member.getCapabilityRole());
|
|
|
+ vo.setTotalPoints(member.getTotalPoints());
|
|
|
+ vo.setShowToFamily(member.getShowToFamily());
|
|
|
+ if (member.getBirthday() != null) {
|
|
|
+ vo.setAge(calculateAge(member.getBirthday()));
|
|
|
+ }
|
|
|
+ return vo;
|
|
|
+ }
|
|
|
+
|
|
|
+ private Integer calculateAge(java.util.Date birthday) {
|
|
|
+ if (birthday == null) return null;
|
|
|
+ java.util.Calendar birth = java.util.Calendar.getInstance();
|
|
|
+ birth.setTime(birthday);
|
|
|
+ java.util.Calendar now = java.util.Calendar.getInstance();
|
|
|
+ int age = now.get(java.util.Calendar.YEAR) - birth.get(java.util.Calendar.YEAR);
|
|
|
+ if (now.get(java.util.Calendar.MONTH) < birth.get(java.util.Calendar.MONTH) ||
|
|
|
+ (now.get(java.util.Calendar.MONTH) == birth.get(java.util.Calendar.MONTH) &&
|
|
|
+ now.get(java.util.Calendar.DAY_OF_MONTH) < birth.get(java.util.Calendar.DAY_OF_MONTH))) {
|
|
|
+ age--;
|
|
|
+ }
|
|
|
+ return Math.max(0, age);
|
|
|
+ }
|
|
|
+}
|