package com.ruoyi.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.utils.MapUtils; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.domain.ZInfoUser; import com.ruoyi.domain.ZfEvent; import com.ruoyi.domain.ZfRelation; import com.ruoyi.domain.dto.EmpowerDto; import com.ruoyi.domain.dto.UserRelationDto; import com.ruoyi.mapper.ZInfoUserMapper; import com.ruoyi.service.ZInfoUserService; import com.ruoyi.service.ZfRelationService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.stream.Collectors; /** *

* 服务实现类 *

* * @author ojq * @since 2023-03-14 */ @Service @Slf4j public class ZInfoUserServiceImpl extends ServiceImpl implements ZInfoUserService { @Autowired private ZfRelationService zfRelationService; @Override public AjaxResult selectInfoList(ZInfoUser zInfoUser, Integer pageNum, Integer pageSize) { LambdaQueryWrapper lqw = buildCondition(zInfoUser); Page zInfoUserPage = new Page<>(pageNum,pageSize); Page pageResult = page(zInfoUserPage, lqw); HashMap data = MapUtils.getResult(pageResult); return AjaxResult.success(data); } private LambdaQueryWrapper buildCondition(ZInfoUser zInfoUser) { LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); lqw.eq(zInfoUser.getUserId()!=null,ZInfoUser::getUserId,zInfoUser.getUserId()); lqw.like(StringUtils.isNotEmpty(zInfoUser.getAlwaysAddress()),ZInfoUser::getAlwaysAddress,zInfoUser.getAlwaysAddress()); lqw.like(StringUtils.isNotEmpty(zInfoUser.getAlwaysPolice()),ZInfoUser::getAlwaysPolice,zInfoUser.getAlwaysPolice()); lqw.like(StringUtils.isNotEmpty(zInfoUser.getIdNum()),ZInfoUser::getIdNum,zInfoUser.getIdNum()); lqw.like(StringUtils.isNotEmpty(zInfoUser.getLocationAddress()),ZInfoUser::getLocationAddress,zInfoUser.getLocationAddress()); lqw.like(StringUtils.isNotEmpty(zInfoUser.getLocationPolice()),ZInfoUser::getLocationPolice,zInfoUser.getLocationPolice()); lqw.like(StringUtils.isNotEmpty(zInfoUser.getNation()),ZInfoUser::getNation,zInfoUser.getNation()); lqw.like(StringUtils.isNotEmpty(zInfoUser.getNationality()),ZInfoUser::getNationality,zInfoUser.getNationality()); lqw.like(StringUtils.isNotEmpty(zInfoUser.getNickName()),ZInfoUser::getNickName,zInfoUser.getNickName()); lqw.like(StringUtils.isNotEmpty(zInfoUser.getOldName()),ZInfoUser::getOldName,zInfoUser.getOldName()); lqw.like(StringUtils.isNotEmpty(zInfoUser.getPhoneNumber()),ZInfoUser::getPhoneNumber,zInfoUser.getPhoneNumber()); lqw.like(StringUtils.isNotEmpty(zInfoUser.getPoliticalOutlook()),ZInfoUser::getPoliticalOutlook,zInfoUser.getPoliticalOutlook()); lqw.like(StringUtils.isNotEmpty(zInfoUser.getPosition()),ZInfoUser::getPosition,zInfoUser.getPosition()); lqw.like(StringUtils.isNotEmpty(zInfoUser.getUnit()),ZInfoUser::getUnit,zInfoUser.getUnit()); lqw.like(zInfoUser.getSex()!=null,ZInfoUser::getSex,zInfoUser.getSex()); lqw.like(zInfoUser.getMaritalStatus()!=null,ZInfoUser::getMaritalStatus,zInfoUser.getMaritalStatus()); lqw.like(zInfoUser.getBirth()!=null,ZInfoUser::getBirth,zInfoUser.getBirth()); return lqw; } @Override public List selectByCondition(ZInfoUser zInfoUser) { LambdaQueryWrapper lambdaQueryWrapper = buildCondition(zInfoUser); List list = list(lambdaQueryWrapper); log.info("返回的数据为:{}",list); return list; } @Override public AjaxResult searchMyRelation(Long userId) { LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); lqw.eq(ZfRelation::getMyId,userId); List relationList = zfRelationService.list(lqw); ArrayList otherUserList = new ArrayList<>(); relationList.stream().map( (relation)->{ Long otherId = relation.getOtherId(); ZInfoUser otherUser = getById(otherId); UserRelationDto userRelationDto = new UserRelationDto(); BeanUtils.copyProperties(otherUser,userRelationDto); userRelationDto.setRelation(relation.getRelation()); userRelationDto.setId(relation.getId()); otherUserList.add(userRelationDto); return relation; } ).collect(Collectors.toList()); return AjaxResult.success(otherUserList); } /** * 检查传入对方的id是否存在 * @param zfRelation */ private void checkRelation(ZfRelation zfRelation){ LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); lqw.eq(ZInfoUser::getUserId, zfRelation.getOtherId()); ZInfoUser zInfoUser2 = getOne(lqw); if (zInfoUser2==null){ throw new RuntimeException("对方的id不存在"); } } @Override @Transactional public AjaxResult addRelation(ZfRelation zfRelation) { checkRelation(zfRelation); //获取自己的id并传入 SysUser user = SecurityUtils.getLoginUser().getUser(); Long userId = user.getUserId(); zfRelation.setMyId(userId); zfRelationService.save(zfRelation); return AjaxResult.success(); } @Override @Transactional public AjaxResult updateRelation(ZfRelation zfRelation) { checkRelation(zfRelation); zfRelationService.updateById(zfRelation); return AjaxResult.success(); } @Override public AjaxResult deleteRelation(Long[] ids) { boolean flag = zfRelationService.removeByIds(Arrays.asList(ids)); if (flag){ return AjaxResult.success(); }else { return AjaxResult.error(); } } /** * 给用户授权的方法 * @param empowerDto * @return */ @Override @Transactional public AjaxResult empower(EmpowerDto empowerDto) { //得到dto中的信息 String otherUserId = empowerDto.getUserId(); String destinationFamilyId = empowerDto.getFamilyId(); List authorityList = empowerDto.getAuthorityList(); String familyId = getMyFamilyId(); checkAuthorization(familyId, destinationFamilyId,true); //授权 //3{2007 1988 1004} String finalStr = getFinalStr(destinationFamilyId, authorityList); //更新被授权用户的权限 LambdaQueryWrapper lqw2 = new LambdaQueryWrapper<>(); lqw2.eq(ZInfoUser::getUserId,otherUserId); ZInfoUser otherUser = getOne(lqw2); String secondFamilyId = otherUser.getSecondFamilyId(); String replaceFamilyId=null; boolean save=true; if (StringUtils.isNotEmpty(secondFamilyId)){ //如果原来就已经有被赋予权限了,那么需要判断是不是跟这个家庭号有关的权限 //这个secondFamilyId是当前用户的完整权限字段 if(secondFamilyId.contains(",")){ String[] split = secondFamilyId.split(","); for (int i = 0; i < split.length; i++) { String fid = split[i].substring(0, split[i].indexOf("{"));//从权限块中拿到被授权的家庭号 if(fid.equals(finalStr.substring(0,finalStr.indexOf("{")))){ //如果匹配到了对应的家庭号,那么就替换掉对应的权限块就可以了,不需要追加 save=false; split[i]=finalStr; break; } } List finalList = Arrays.asList(split); StringBuilder stringBuilder = new StringBuilder(); for (String s : finalList) { stringBuilder.append(s).append(","); } stringBuilder.deleteCharAt(stringBuilder.length()-1); replaceFamilyId = stringBuilder.toString(); }else { String fid = secondFamilyId.substring(0, secondFamilyId.indexOf("{"));//从权限块中拿到被授权的家庭号 if(fid.equals(finalStr.substring(0,finalStr.indexOf("{")))){ //如果匹配到了对应的家庭号,那么就替换掉对应的权限块就可以了,不需要追加 save=false; replaceFamilyId=finalStr; } } if(save){ //需要追加,没有匹配到对应的家庭号 replaceFamilyId=secondFamilyId+","+finalStr; }else { //不需要追加 } }else { //原来就没有权限了 replaceFamilyId=finalStr; } LambdaUpdateWrapper uw = new LambdaUpdateWrapper<>(); uw.eq(ZInfoUser::getUserId,otherUserId).set(ZInfoUser::getSecondFamilyId,replaceFamilyId); if (update(null,uw)) { return AjaxResult.success(); }else { return AjaxResult.error(); } } private void checkAuthorization(String familyId, String destinationFamilyId,boolean flag) { String text=null; if(flag){ text="授权"; }else { text="取消授权"; } //对本人的家庭号进行处理 if(familyId.contains(",")){ String[] familyIds = familyId.split(","); List idList = Arrays.asList(familyIds); if (!idList.contains(destinationFamilyId)) { throw new RuntimeException("不能"+text+"不属于自己家庭的数据"); } }else { if (!familyId.equals(destinationFamilyId)){ throw new RuntimeException("不能"+text+"不属于自己家庭的数据"); } } } private String getMyFamilyId() { //得到自己的家庭id信息 SysUser user = SecurityUtils.getLoginUser().getUser(); Long myUserId = user.getUserId(); LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); lqw.eq(ZInfoUser::getUserId,myUserId); ZInfoUser zInfoUser = getOne(lqw); String familyId = zInfoUser.getFamilyId(); return familyId; } private String getFinalStr(String destinationFamilyId, List authorityList) { String authorityListStr = authorityList.stream().collect(Collectors.joining(" ", "{", "}")); String finalStr= destinationFamilyId +authorityListStr; //3{2007 1988 1004} return finalStr; } /** * 获取家根网 * @return */ @Override public AjaxResult listWithTree() { List allPeopleList = list(); List result = null; try { result = allPeopleList.stream().filter(people -> people.getUserId()!=1&&(people.getFatherId() == 0||people.getMomId()==0)) .map(people -> { people.setChildList(fillChildren(people, allPeopleList)); return people; }).collect(Collectors.toList()); } catch (NullPointerException e) { throw new RuntimeException("您在加入成员的时候没有指定该成员的父亲或者母亲"); } return AjaxResult.success(result); } /** * 为了家根网、新增或者修改父子关系 * @param fatherId * @param motherId * @return */ @Override public AjaxResult addParent(Long fatherId, Long motherId) { SysUser user = SecurityUtils.getLoginUser().getUser(); Long userId = user.getUserId(); LambdaQueryWrapper zInfoUserLambdaQueryWrapper = new LambdaQueryWrapper<>(); zInfoUserLambdaQueryWrapper.eq(ZInfoUser::getUserId,userId); ZInfoUser zInfoUser = getOne(zInfoUserLambdaQueryWrapper); zInfoUser.setFatherId(fatherId); zInfoUser.setMomId(motherId); updateById(zInfoUser); return AjaxResult.success(); } @Override public AjaxResult listAllExceptAdmin() { List collect = list().stream().filter(zInfoUser -> zInfoUser.getUserId() != 1).collect(Collectors.toList()); return AjaxResult.success(collect); } /** * 递归算法 * @param people * @param allPeopleList * @return */ private List fillChildren(ZInfoUser people, List allPeopleList) { return allPeopleList.stream().filter( one -> one.getFatherId() == people.getUserId() || one.getMomId() == people.getUserId() ).map( one -> { one.setChildList(fillChildren(one, allPeopleList)); return one; } ).collect(Collectors.toList()); } }