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());
}
}