Jinquan_Ou
2023-04-23 3cfa0bda6574d0c39db120c457e98a168aa193e8
zhang-content/src/main/java/com/ruoyi/service/impl/ZInfoUserServiceImpl.java
@@ -2,11 +2,35 @@
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;
/**
 * <p>
@@ -17,6 +41,255 @@
 * @since 2023-03-14
 */
@Service
@Slf4j
public class ZInfoUserServiceImpl extends ServiceImpl<ZInfoUserMapper, ZInfoUser> implements ZInfoUserService {
    @Autowired
    private ZfRelationService zfRelationService;
    @Override
    public AjaxResult selectInfoList(ZInfoUser zInfoUser, Integer pageNum, Integer pageSize) {
        LambdaQueryWrapper<ZInfoUser> lqw = buildCondition(zInfoUser);
        Page<ZInfoUser> zInfoUserPage = new Page<>(pageNum,pageSize);
        Page<ZInfoUser> pageResult = page(zInfoUserPage, lqw);
        HashMap<String, Object> data = MapUtils.getResult(pageResult);
        return AjaxResult.success(data);
    }
    private LambdaQueryWrapper<ZInfoUser> buildCondition(ZInfoUser zInfoUser) {
        LambdaQueryWrapper<ZInfoUser> 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<ZInfoUser> selectByCondition(ZInfoUser zInfoUser) {
        LambdaQueryWrapper<ZInfoUser> lambdaQueryWrapper = buildCondition(zInfoUser);
        List<ZInfoUser> list = list(lambdaQueryWrapper);
        log.info("返回的数据为:{}",list);
        return list;
    }
    @Override
    public AjaxResult searchMyRelation(Long userId) {
        LambdaQueryWrapper<ZfRelation> lqw = new LambdaQueryWrapper<>();
        lqw.eq(ZfRelation::getMyId,userId);
        List<ZfRelation> relationList = zfRelationService.list(lqw);
        ArrayList<UserRelationDto> 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<ZInfoUser> 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<String> authorityList = empowerDto.getAuthorityList();
        String familyId = getMyFamilyId();
        checkAuthorization(familyId, destinationFamilyId,true);
        //授权  //3{2007 1988 1004}
        String finalStr = getFinalStr(destinationFamilyId, authorityList);
        //更新被授权用户的权限
        LambdaQueryWrapper<ZInfoUser> 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<String> 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<ZInfoUser> 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<String> 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<ZInfoUser> lqw = new LambdaQueryWrapper<>();
        lqw.eq(ZInfoUser::getUserId,myUserId);
        ZInfoUser zInfoUser = getOne(lqw);
        String familyId = zInfoUser.getFamilyId();
        return familyId;
    }
    private String getFinalStr(String destinationFamilyId, List<String> authorityList) {
        String authorityListStr = authorityList.stream().collect(Collectors.joining(" ", "{", "}"));
        String finalStr= destinationFamilyId +authorityListStr;  //3{2007 1988 1004}
        return finalStr;
    }
}