package com.ruoyi.app.service.impl; import com.baomidou.mybatisplus.core.MybatisConfiguration; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; import com.ruoyi.app.domain.TbMemberMiddle; import com.ruoyi.app.domain.vo.AppMemberVo; import com.ruoyi.app.service.ITbAppUserService; import com.ruoyi.app.service.ITbMemberMiddleService; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.bean.BeanUtils; import org.apache.ibatis.builder.MapperBuilderAssistant; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.app.mapper.TbFamilyMemberMapper; import com.ruoyi.app.domain.TbFamilyMember; import com.ruoyi.app.service.ITbFamilyMemberService; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; /** * 家族成员Service业务层处理 * * @author Alex * @date 2020-09-29 */ @Service public class TbFamilyMemberServiceImpl extends ServiceImpl implements ITbFamilyMemberService { @Autowired private ITbAppUserService userService; @Autowired private ITbMemberMiddleService memberMiddleService; /** * 根据id获取成员 * @param memberId * @return */ @Override public AppMemberVo get(Long memberId) { return userService.getMember("member", memberId.toString(),""); } /** * 添加家族成员 * @param memberVo * @return */ @Override public AjaxResult saveOrUpdate(AppMemberVo memberVo){ if (memberVo.getUserId()!=null && memberVo.getUserId().equals(memberVo.getSpouseUserId())) { return AjaxResult.error("不能添加自己为配偶"); } if (StringUtils.isBlank(memberVo.getMobile())){ return AjaxResult.error("手机号不能为空"); } AppMemberVo member = userService.getMember("member",null,memberVo.getMobile()); if (member == null) { member = new AppMemberVo(); BeanUtils.copyBeanProp(member, memberVo); }else{ member.setStatus(memberVo.getStatus()); member.setName(memberVo.getName()); member.setBirthday(memberVo.getBirthday()); member.setGender(memberVo.getGender()); member.setSpouseUserId(memberVo.getSpouseUserId()); member.setState(memberVo.getState()); member.setFamilyId(memberVo.getFamilyId()); } if (StringUtils.isNotBlank(memberVo.getMemberRemark())) { member.setMemberRemark(memberVo.getMemberRemark()); } // 添加成员 昵称和姓名不用同步 // member.setNickName(member.getName()); if(!userService.saveOrUpdate(member)){ return AjaxResult.error("保存失败"); } TbMemberMiddle memberMiddle = memberMiddleService.getOne(new LambdaQueryWrapper() .eq(TbMemberMiddle::getFamilyId, member.getFamilyId()) .eq(TbMemberMiddle::getMemberId, member.getMemberId()) .last("limit 1") ); //新增 if (memberMiddle == null) { TbMemberMiddle item = new TbMemberMiddle(); item.setFamilyId(member.getFamilyId()); item.setMemberId(member.getMemberId()); if (StringUtils.isNotBlank(memberVo.getStatus())) { item.setStatus(memberVo.getStatus()); } memberMiddleService.save(item); } else { // memberMiddle.setStatus(memberVo.getStatus()); BeanUtils.copyBeanProp(memberMiddle, memberVo); memberMiddleService.updateById(memberMiddle); } return AjaxResult.success(); } /** * 添加成员到家族树 * @param member * @return */ @Override public boolean saveFamilyTree(TbMemberMiddle member){ TbMemberMiddle middle = memberMiddleService.getOne(new LambdaQueryWrapper() .eq(TbMemberMiddle::getFamilyId,member.getFamilyId()) .eq(TbMemberMiddle::getMemberId,member.getMemberId()) .last("limit 1") ); if (member.getGeneration() != null) { middle.setGeneration(member.getGeneration()); } middle.setParentId(member.getParentId()); return memberMiddleService.updateById(middle); } /** * 逻辑删除多条成员 * @param ids * @return */ @Override public AjaxResult delMember(String familyId, Long[] ids){ List idList = Arrays.asList(ids); List middleList = memberMiddleService.list(new LambdaQueryWrapper() .eq(TbMemberMiddle::getFamilyId,familyId) .in(TbMemberMiddle::getMemberId, idList) ); if (middleList.size() <= 0){ return AjaxResult.error("删除失败,没有找到要删除的数据"); } AtomicInteger ckTree = new AtomicInteger(0); AtomicInteger ckAdmin = new AtomicInteger(0); AtomicInteger ckPatriarch = new AtomicInteger(0); List mids = new ArrayList<>(); middleList.forEach(item -> { if (item.getParentId() != null) { ckTree.set(1); } if ("Y".equals(item.getAdmin())){ ckAdmin.set(1); } if ("Y".equals(item.getPatriarch())){ ckPatriarch.set(1); } mids.add(item.getId()); }); // 如果成员已加入家族树,则需要先从家族树删除,才能删除成员 if(ckTree.intValue() > 0) { return AjaxResult.error("删除失败,成员已加入家族树"); } // 成员数大于1人,并且存在创建者 if(idList.size() > 1 && ckPatriarch.intValue() > 0) { return AjaxResult.error("还有其他成员,不能删除创建者"); } if(!memberMiddleService.remove(new LambdaQueryWrapper() .eq(TbMemberMiddle::getFamilyId,familyId) .in(TbMemberMiddle::getMemberId, idList))) { return AjaxResult.error("删除失败"); } return AjaxResult.success(); } /** * 获取家族成员的详细信息 * @param familyId * @param memberId * @return */ @Override public AppMemberVo getMemberDetail(Long familyId, Long memberId) { TableInfoHelper.initTableInfo(new MapperBuilderAssistant(new MybatisConfiguration(), ""), AppMemberVo.class); List memberVos = baseMapper.selectFamilyTree(new LambdaQueryWrapper() .eq(AppMemberVo::getFamilyId,familyId) .eq(AppMemberVo::getMemberId,memberId) ); if (memberVos.size() > 0) { return memberVos.get(0); } return null; } @Override public List selectMemberList(LambdaQueryWrapper wrapper){ TableInfoHelper.initTableInfo(new MapperBuilderAssistant(new MybatisConfiguration(), ""), AppMemberVo.class); return baseMapper.selectFamilyTree(wrapper); } @Override public List selectFamilyTree(AppMemberVo memberVo) { TableInfoHelper.initTableInfo(new MapperBuilderAssistant(new MybatisConfiguration(), ""), AppMemberVo.class); LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); if (memberVo.getFamilyId() == null) { return new ArrayList<>(); } lqw.eq(AppMemberVo::getFamilyId, memberVo.getFamilyId()); lqw.isNotNull(AppMemberVo::getParentId); lqw.eq(StringUtils.isNotBlank(memberVo.getGender()),AppMemberVo::getGender,memberVo.getGender()); if (StringUtils.isNotBlank(memberVo.getSearchValue())) { lqw.and( i -> i.like(AppMemberVo::getName,memberVo.getSearchValue()).or() .like(AppMemberVo::getMobile,memberVo.getSearchValue()) ); } // 按第几代排序 升序 lqw.orderByAsc(AppMemberVo::getGeneration); return baseMapper.selectFamilyTree(lqw); } @Override public List myMemberList(LambdaQueryWrapper lqw){ TableInfoHelper.initTableInfo(new MapperBuilderAssistant(new MybatisConfiguration(), ""), AppMemberVo.class); return baseMapper.selectFamilyMember(lqw); } @Override public List selectFamilyMember(AppMemberVo memberVo) { TableInfoHelper.initTableInfo(new MapperBuilderAssistant(new MybatisConfiguration(), ""), AppMemberVo.class); LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); if (memberVo.getFamilyId() == null) { return new ArrayList<>(); } lqw.eq(AppMemberVo::getFamilyId, memberVo.getFamilyId()); lqw.eq(AppMemberVo::getStatus,"2"); lqw.eq(StringUtils.isNotBlank(memberVo.getGender()), AppMemberVo::getGender,memberVo.getGender()); if (StringUtils.isNotBlank(memberVo.getSearchValue())) { lqw.and( i -> i.like(AppMemberVo::getName,memberVo.getSearchValue()).or() .like(AppMemberVo::getMobile,memberVo.getSearchValue()) ); } return baseMapper.selectFamilyMember(lqw); } @Override public List selectMemberNotTree(AppMemberVo memberVo) { TableInfoHelper.initTableInfo(new MapperBuilderAssistant(new MybatisConfiguration(), ""), AppMemberVo.class); LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); if (memberVo.getFamilyId() == null) { return new ArrayList<>(); } lqw.eq(AppMemberVo::getFamilyId, memberVo.getFamilyId()); lqw.eq(AppMemberVo::getStatus, "2"); // 已通过 lqw.isNull(AppMemberVo::getParentId); if (StringUtils.isNotBlank(memberVo.getSearchValue())) { lqw.and( i -> i.like(AppMemberVo::getName,memberVo.getSearchValue()).or() .like(AppMemberVo::getMobile,memberVo.getSearchValue()) ); } return baseMapper.selectFamilyMember(lqw); } @Override public List selectMemberInTree(AppMemberVo memberVo) { TableInfoHelper.initTableInfo(new MapperBuilderAssistant(new MybatisConfiguration(), ""), AppMemberVo.class); LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); if (memberVo.getFamilyId() == null) { return new ArrayList<>(); } lqw.eq(AppMemberVo::getFamilyId, memberVo.getFamilyId()); lqw.isNotNull(AppMemberVo::getParentId); if (StringUtils.isNotBlank(memberVo.getSearchValue())) { lqw.and( i -> i.like(AppMemberVo::getName,memberVo.getSearchValue()).or() .like(AppMemberVo::getMobile,memberVo.getSearchValue()) ); } return baseMapper.selectFamilyMember(lqw); } @Override public TbMemberMiddle getFamilyTree(Long familyId){ return getChildNode(zeroParent(familyId),allList(familyId)); } /** * 获取所有的成员 * @param familyId * @return */ private List allList(Long familyId){ List list = memberMiddleService.selectApplyMember(new LambdaQueryWrapper() .eq(TbMemberMiddle::getFamilyId,familyId) .eq(TbMemberMiddle::getStatus,"2") ); return list; } /** * 获取节点为0的父成员 * @param familyId * @return */ private TbMemberMiddle zeroParent(Long familyId){ return memberMiddleService.getOne(new LambdaQueryWrapper() .eq(TbMemberMiddle::getFamilyId,familyId) .eq(TbMemberMiddle::getStatus,"2") .eq(TbMemberMiddle::getParentId, 0) .last("limit 1") ); } /** * 递归获取家族树 * @param middle 父成员 * @param list 所有的成员 * @return */ private TbMemberMiddle getChildNode(TbMemberMiddle middle,List list) { List childList = new ArrayList<>(); list.forEach(item -> { if(middle.getId().equals(item.getParentId())){ childList.add(item); } }); middle.setChild(childList); for (TbMemberMiddle item : childList) { getChildNode(item,list); } return middle; } @Override public AjaxResult delToTree(Long memberId, Long familyId) { if (memberId == null || familyId ==null) { return AjaxResult.error("参数不能为空"); } TbMemberMiddle middle = memberMiddleService.getOne(new LambdaQueryWrapper() .eq(TbMemberMiddle::getFamilyId,familyId) .eq(TbMemberMiddle::getMemberId,memberId) .last("limit 1") ); if (middle == null) { return AjaxResult.error("删除失败"); } if (middle.getParentId() == null) { return AjaxResult.error("该成员没有在家族树中"); } // 设置parentId为空 middle.setParentId(null); middle.setGeneration(null); if(!memberMiddleService.updateById(middle)){ return AjaxResult.error("删除失败"); } return AjaxResult.success("删除成功"); } @Override @Transactional(rollbackFor = Exception.class) public AjaxResult edit(AppMemberVo member) { if (member == null) { return AjaxResult.error("成员信息不能为空"); } if (member.getFamilyId() == null) { return AjaxResult.error("家族id不能为空"); } if (member.getUserId() == null) { return AjaxResult.error("会员id不能为空"); } if (member.getMemberId() == null) { return AjaxResult.error("成员id不能为空"); } if (StringUtils.isBlank(member.getMobile())){ return AjaxResult.error("手机号不能为空"); } if (member.getUserId() != null && member.getSpouseUserId() != null && member.getUserId().equals(member.getSpouseUserId())) { return AjaxResult.error("不能选择自己为配偶"); } if (member.getParentId() != null && member.getSpouseUserId() != null && member.getParentId().equals(member.getSpouseUserId())) { return AjaxResult.error("父辈与配偶不能为同一人"); } if (StringUtils.isNotBlank(member.getMemberRemark())) { member.setMemberRemark(member.getMemberRemark()); } return saveOrUpdate(member); } @Override @Transactional(rollbackFor = Exception.class) public AjaxResult add(AppMemberVo member) { if (member == null) { return AjaxResult.error("成员信息不能为空"); } if (member.getFamilyId() == null) { return AjaxResult.error("家族id不能为空"); } if (StringUtils.isBlank(member.getMobile())){ return AjaxResult.error("手机号不能为空"); } if (member.getParentId() != null && member.getSpouseUserId() != null && member.getParentId().equals(member.getSpouseUserId())) { return AjaxResult.error("父辈与配偶不能为同一人"); } List memberVos = this.myMemberList(new LambdaQueryWrapper() .eq(AppMemberVo::getFamilyId, member.getFamilyId()) .eq(AppMemberVo::getMobile, member.getMobile()) .eq(AppMemberVo::getStatus,"2") ); if (memberVos.size() > 0) { return AjaxResult.error("该成员已在本家族"); } return saveOrUpdate(member); } }