package com.fdkankan.site.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fdkankan.site.common.PageInfo;
import com.fdkankan.site.common.ResultCode;
import com.fdkankan.site.common.util.VUtils;
import com.fdkankan.site.entity.*;
import com.fdkankan.site.entity.dto.ProjectTeamAddDTO;
import com.fdkankan.site.entity.dto.ProjectTeamDTO;
import com.fdkankan.site.entity.vo.TeamUserSelect;
import com.fdkankan.site.exception.BusinessException;
import com.fdkankan.site.httpClient.client.FdKKClient;
import com.fdkankan.site.httpClient.request.FdkkLoginRequest;
import com.fdkankan.site.httpClient.response.FdkkResponse;
import com.fdkankan.site.mapper.IProjectTeamMapper;
import com.fdkankan.site.request.ProjectTeamListParam;
import com.fdkankan.site.service.*;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fdkankan.site.util.EscapeUtil;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import cn.hutool.core.util.StrUtil;
/**
*
* 服务实现类
*
*
* @author
* @since 2022-10-10
*/
@Service
public class ProjectTeamServiceImpl extends ServiceImpl implements IProjectTeamService {
@Resource
FdKKClient fdKKClient;
@Autowired
IProjectService projectService;
@Autowired
IUserService userService;
@Autowired
IUserRoleService userRoleService;
@Autowired
IMarkingUserService markingUserService;
@Autowired
IMarkingService markingService;
@Autowired
IRoleService roleService;
@Override
public List getListByUserId(Integer userId) {
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.eq(ProjectTeam::getUserId,userId);
return this.list(wrapper);
}
@Override
public ProjectTeam findByUserIdAndProjectId(Integer userId, Integer projectId) {
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.eq(ProjectTeam::getUserId,userId);
wrapper.eq(ProjectTeam::getProjectId,projectId);
return getOne(wrapper);
}
@Override
public List getListByUserIdAndProjectId(Integer userId, Integer projectId) {
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.eq(ProjectTeam::getUserId,userId);
wrapper.eq(ProjectTeam::getProjectId,projectId);
return this.list(wrapper);
}
@Override
public void addProject(Integer projectId, String token) {
ProjectTeam team = new ProjectTeam();
team.setIsCreater(1);
team.setProjectId(projectId);
User user = userService.findByTokenCovUserName(token);
team.setUserId(user.getUserId());
team.setNickName(user.getUserName());
team.setBindAccount(user.getUserName());
this.save(team);
Role manager = roleService.findByRoleKey("manager");
UserRole userRole=new UserRole();
userRole.setRoleId(manager.getRoleId());
userRole.setUserId(user.getUserId());
userRole.setProjectId(projectId);
userRoleService.save(userRole);
}
@Override
public Object pageList(ProjectTeamListParam param) {
VUtils.isTure(param.getProjectId() == null).throwMessage(ResultCode.PARAM_MISS);
projectService.checkTokenPer(param.getToken(),param.getProjectId());
MPJLambdaWrapper wrapper = new MPJLambdaWrapper()
.selectAll(ProjectTeam.class)
.select(User::getUserName)
.selectCollection(Role.class, ProjectTeamDTO::getRoles)
.leftJoin(User.class, User::getUserId, ProjectTeam::getUserId)
.leftJoin(UserRole.class,UserRole::getUserId,User::getUserId)
.leftJoin(Role.class, Role::getRoleId, UserRole::getRoleId)
.eq(ProjectTeam::getProjectId,param.getProjectId())
.eq(UserRole::getProjectId,param.getProjectId())
;
if(StringUtils.isNotBlank(param.getUserName())){
wrapper.like(ProjectTeam::getNickName, param.getUserName());
}
IPage projectTeamIPage = baseMapper.selectJoinPage(new Page<>(param.getPageNum(), param.getPageSize()), ProjectTeamDTO.class, wrapper);
return PageInfo.PageInfo(projectTeamIPage);
}
@Override
public List findByProjectId(Integer projectId) {
MPJLambdaWrapper wrapper = new MPJLambdaWrapper()
.selectAll(ProjectTeam.class)
.select(User::getUserName)
.selectCollection(Role.class, ProjectTeamDTO::getRoles)
.leftJoin(User.class, User::getUserId, ProjectTeam::getUserId)
.leftJoin(UserRole.class,UserRole::getUserId,User::getUserId)
.leftJoin(Role.class, Role::getRoleId, UserRole::getRoleId)
.eq(ProjectTeam::getProjectId,projectId)
.eq(UserRole::getProjectId,projectId)
;
List projectTeamIPage = baseMapper.selectJoinList( ProjectTeamDTO.class, wrapper);
return projectTeamIPage;
}
@Override
public Object addUser(ProjectTeamAddDTO param, String token) {
VUtils.isTure(param.getProjectId() == null || StringUtils.isBlank(param.getUserName())).throwMessage(ResultCode.PARAM_MISS);
VUtils.isTure(!this.checkUserName(param.getUserName())).throwMessage(ResultCode.USER_NOT_EXIST);
// ProjectTeam projectTeam = this.getProjectCreater(param.getProjectId());
//VUtils.isTure(projectTeam == null).throwMessage(ResultCode.PROJECT_CREATER_NOT_EXIST);
//VUtils.isTure(!projectTeam.getUserName().equals(JwtUtil.getUserName(token))).throwMessage(ResultCode.NOT_PERM);
MPJLambdaWrapper wrapper = new MPJLambdaWrapper()
.select(ProjectTeam::getTeamId)
.leftJoin(User.class, User::getUserId, ProjectTeam::getUserId)
.eq(User::getUserName,param.getUserName())
.eq(ProjectTeam::getProjectId,param.getProjectId()) ;
long count = getBaseMapper().selectJoinCount(wrapper);
VUtils.isTure(count >0).throwMessage(ResultCode.USER_EXIST);
User user = userService.findByUserName(param.getUserName());
ProjectTeam team = new ProjectTeam();
team.setProjectId(param.getProjectId());
team.setUserId(user.getUserId());
team.setRemark(param.getRemark());
team.setNickName(param.getNickName());
if (StrUtil.isNotEmpty(param.getBindAccount())){
team.setBindAccount(param.getBindAccount());
}
this.save(team);
for (Integer roleId : param.getRoles()) {
UserRole userRole=new UserRole();
userRole.setRoleId(roleId);
userRole.setUserId(user.getUserId());
userRole.setProjectId(param.getProjectId());
userRoleService.save(userRole);
}
return team;
}
@Override
public ProjectTeamDTO getProjectCreater(Integer projectId) {
MPJLambdaWrapper wrapper = new MPJLambdaWrapper()
.selectAll(ProjectTeam.class)
.select(User::getUserName)
.leftJoin(User.class, User::getUserId, ProjectTeam::getUserId)
.eq(ProjectTeam::getProjectId,projectId)
.eq(ProjectTeam::getIsCreater,1);;
return getBaseMapper().selectJoinOne(ProjectTeamDTO.class,wrapper);
}
@Override
public HashMap getProjectCreaterMap(Set projectIds) {
HashMap map = new HashMap<>();
if(projectIds.size() >0){
MPJLambdaWrapper wrapper = new MPJLambdaWrapper()
.selectAll(ProjectTeam.class)
.select(User::getUserName)
.leftJoin(User.class, User::getUserId, ProjectTeam::getUserId)
.in(ProjectTeam::getProjectId,projectIds)
.eq(ProjectTeam::getIsCreater,1);;
List list = getBaseMapper().selectJoinList(ProjectTeamDTO.class,wrapper);
list.forEach(entity -> map.put(entity.getProjectId(),entity.getUserName()));
}
return map;
}
@Override
public Boolean checkUserName(String userName) {
FdkkResponse fdkkResponse = fdKKClient.checkUser(new FdkkLoginRequest(userName, ""));
if(fdkkResponse.getCode() != 0){
return false;
}
return true;
}
@Override
public void deleteUser(ProjectTeam param, String token) {
VUtils.isTure(param.getTeamId() == null ).throwMessage(ResultCode.PARAM_MISS);
ProjectTeam team = this.getById(param.getTeamId());
VUtils.isTure(team.getIsCreater() == 1).throwMessage(ResultCode.PROJECT_CREATER_NOT_DEL);
ProjectTeam createrTeam = this.getProjectCreater(team.getProjectId());
VUtils.isTure(createrTeam == null).throwMessage(ResultCode.PROJECT_CREATER_NOT_EXIST);
User user = userService.findByTokenCovUserName(token);
if(!NumberUtil.equals(createrTeam.getUserId(),user.getUserId())){
if(!NumberUtil.equals(team.getUserId(),user.getUserId())){
throw new BusinessException(ResultCode.NOT_PERM);
}else {
this.removeById(param.getTeamId());
throw new BusinessException(ResultCode.DEL_MINE); // 提示刷新页面
}
}
this.removeById(param.getTeamId());
userRoleService.delUserRole(team.getUserId(),team.getProjectId());
List byProjectId = markingService.findByProjectId(team.getProjectId());
for (Marking marking : byProjectId) {
markingUserService.delByUserIdAndMarkingId(team.getUserId(),marking.getMarkingId());
}
}
@Override
public void updateRemark(ProjectTeam param) {
VUtils.isTure(param.getTeamId() == null ).throwMessage(ResultCode.PARAM_MISS);
ProjectTeam byId = getById(param.getTeamId());
LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>();
wrapper.eq(ProjectTeam::getTeamId,param.getTeamId())
.set(ProjectTeam::getRemark,param.getRemark());
this.update(byId,wrapper);
}
@Override
public Set getProjectIdByCreater(String projectCreater) {
MPJLambdaWrapper wrapper = new MPJLambdaWrapper()
.selectAll(ProjectTeam.class)
.select(User::getUserName)
.leftJoin(User.class, User::getUserId, ProjectTeam::getUserId)
.eq(User::getUserName,projectCreater)
.eq(ProjectTeam::getIsCreater,1);
return getBaseMapper().selectList(wrapper).stream().map(ProjectTeam::getProjectId).collect(Collectors.toSet());
}
@Override
public void delByProjectId(Integer projectId) {
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
wrapper.eq(ProjectTeam::getProjectId,projectId);
this.remove(wrapper);
}
@Override
public List listAll(ProjectTeamListParam param) {
MPJLambdaWrapper wrapper = new MPJLambdaWrapper()
.selectAll(ProjectTeam.class)
.select(User::getUserName)
.leftJoin(User.class, User::getUserId, ProjectTeam::getUserId)
.eq(ProjectTeam::getProjectId,param.getProjectId());
if(StringUtils.isNotBlank(param.getUserName())){
wrapper.like(User::getUserName,param.getUserName());
}
List projectTeamIPage = baseMapper.selectJoinList( ProjectTeamDTO.class, wrapper);
return projectTeamIPage;
}
@Override
public List buildTreeSelect(List projectTeamDTOS) {
return projectTeamDTOS.stream().map(TeamUserSelect::new).collect(Collectors.toList());
}
@Override
public void updateUser(ProjectTeamAddDTO param) {
VUtils.isTure(param.getTeamId() == null ).throwMessage(ResultCode.PARAM_MISS);
ProjectTeam projectTeam = getById(param.getTeamId());
LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>();
wrapper.eq(ProjectTeam::getTeamId,param.getTeamId());
boolean updateFlag=false;
if (StrUtil.isNotEmpty(param.getRemark())){
wrapper.set(ProjectTeam::getRemark,param.getRemark());
updateFlag=true;
}
if (StrUtil.isNotEmpty(param.getBindAccount())){
updateFlag=true;
wrapper.set(ProjectTeam::getBindAccount,param.getBindAccount());
}
if (StrUtil.isNotEmpty(param.getNickName())){
updateFlag=true;
wrapper.set(ProjectTeam::getNickName,param.getNickName());
}
if (updateFlag){
this.update(wrapper);
}
if (CollectionUtil.isNotEmpty(param.getRoles())){
userRoleService.delUserRole(param.getUserId(),param.getProjectId());
for (Integer roleId : param.getRoles()) {
UserRole userRole=new UserRole();
userRole.setRoleId(roleId);
userRole.setUserId(param.getUserId());
userRole.setProjectId(param.getProjectId());
userRoleService.save(userRole);
}
}
}
}