kongzy
2024-01-29 983bdb5b89932b38d08a11ad1eed6ea89d1597e1
assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysUserServiceImpl.java
@@ -2,19 +2,22 @@
import cn.hutool.core.codec.Base64;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.gkhy.assess.common.api.CommonPage;
import com.gkhy.assess.common.constant.CacheConstant;
import com.gkhy.assess.common.domain.vo.AccountVO;
import com.gkhy.assess.common.domain.vo.LoginBody;
import com.gkhy.assess.common.enums.AttachTypeEnum;
import com.gkhy.assess.common.enums.DeleteFlagEnum;
import com.gkhy.assess.common.enums.UserIdentityEnum;
import com.gkhy.assess.common.exception.ApiException;
import com.gkhy.assess.common.utils.*;
import com.gkhy.assess.system.domain.SysAgency;
import com.gkhy.assess.system.domain.SysAttach;
import com.gkhy.assess.system.domain.SysUser;
import com.gkhy.assess.system.mapper.SysAgencyMapper;
import com.gkhy.assess.system.domain.*;
import com.gkhy.assess.system.domain.vo.PersonProjectVO;
import com.gkhy.assess.system.mapper.AssProjectMapper;
import com.gkhy.assess.system.mapper.SysUserFaceMapper;
import com.gkhy.assess.system.mapper.SysUserMapper;
import com.gkhy.assess.system.service.SysAgencyService;
import com.gkhy.assess.system.service.SysAttachService;
@@ -24,6 +27,7 @@
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.*;
import org.apache.shiro.subject.Subject;
import org.checkerframework.checker.units.qual.A;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -31,9 +35,8 @@
import javax.servlet.http.HttpServletRequest;
import javax.validation.Validator;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.*;
import java.util.stream.Collectors;
/**
@@ -55,18 +58,20 @@
    @Autowired
    private HttpServletRequest request;
    @Autowired
    private SysAgencyMapper agencyMapper;
    @Autowired
    private SysAgencyService agencyService;
    @Autowired
    private SysAttachService attachService;
    @Autowired
    private SysUserFaceMapper userFaceMapper;
    @Autowired
    private AssProjectMapper projectMapper;
    @Override
    public AccountVO login(LoginBody loginBody) {
        // 验证码校验
      //  validateCaptcha(loginBody.getUsername(), loginBody.getCode(), loginBody.getUuid());
        //validateCaptcha(loginBody.getUsername(), loginBody.getCode(), loginBody.getUuid());
        UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(loginBody.getUsername(), Base64.decodeStr(loginBody.getPassword()), false);
        Subject subject= SecurityUtils.getSubject();
        String msg ;
@@ -75,10 +80,52 @@
            SysUser sysUser = (SysUser) subject.getPrincipal();
            AccountVO accountVO = new AccountVO();
            BeanUtils.copyProperties(sysUser, accountVO);
            if(sysUser.getAgencyId()!=null){
                SysAgency agency=agencyService.getOne(Wrappers.<SysAgency>lambdaQuery()
                        .select(SysAgency::getId,SysAgency::getName)
                        .eq(SysAgency::getId,sysUser.getAgencyId()));
                accountVO.setAgentName(agency.getName());
                accountVO.setAgentId(agency.getId());
            }
            String token = JwtTokenUtil.sign(sysUser.getUsername(),sysUser.getPassword());
            accountVO.setToken(token);
            cacheUserToken(sysUser.getUsername(),token);
            return accountVO;
        }catch (UnknownAccountException | IncorrectCredentialsException uae){
            throw new ApiException("用户名/密码错误,请重新输入");
        } catch (LockedAccountException lae) { // 账号已被锁定
            msg = "账号已被锁定";
            throw new ApiException(msg);
        }catch (AuthenticationException ae) { // 其他身份验证异常
            msg = "用户认证失败:"+ae.getMessage();
            throw new ApiException(msg);
        }
    }
    @Override
    public AccountVO appLogin(LoginBody loginBody) {
        // 验证码校验
        UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(loginBody.getUsername(), Base64.decodeStr(loginBody.getPassword()), false);
        Subject subject= SecurityUtils.getSubject();
        String msg ;
        try {
            subject.login(usernamePasswordToken);
            SysUser sysUser = (SysUser) subject.getPrincipal();
            AccountVO accountVO = new AccountVO();
            BeanUtils.copyProperties(sysUser, accountVO);
            if(sysUser.getAgencyId()!=null){
                SysAgency agency=agencyService.getOne(Wrappers.<SysAgency>lambdaQuery()
                        .select(SysAgency::getId,SysAgency::getName)
                        .eq(SysAgency::getId,sysUser.getAgencyId()));
                accountVO.setAgentName(agency.getName());
                accountVO.setAgentId(agency.getId());
            }
            String token = JwtTokenUtil.sign(sysUser.getUsername(),sysUser.getPassword());
            accountVO.setToken(token);
            cacheUserToken(sysUser.getUsername(),token);
            accountVO.setUserFace(userFaceMapper.getFaceByUserId(sysUser.getId()));
            return accountVO;
        }catch (UnknownAccountException | IncorrectCredentialsException uae){
            throw new ApiException("用户名/密码错误,请重新输入");
@@ -97,14 +144,14 @@
     */
    public void cacheUserToken(String username,String newToken){
//        String userKey = redisUtils.generateKey(CacheConstant.SYS_USER_TOKEN + ":" + username);
//        String oldToken = (String) redisUtils.get(userKey);
//        if (StrUtil.isNotBlank(oldToken)) {
//            String oldTokenkey = redisUtils.generateKey(CacheConstant.SYS_USER_TOKEN + ":" + JwtTokenUtil.md5Encode(oldToken));
//            redisUtils.del(oldTokenkey);
//            redisUtils.del(userKey);
//        }
//        redisUtils.set(userKey, newToken,(JwtTokenUtil.EXPIRATION*2/1000)+2);
        String userKey = redisUtils.generateKey(CacheConstant.SYS_USER_TOKEN + ":" + username);
        String oldToken = (String) redisUtils.get(userKey);
        if (StringUtils.isNotBlank(oldToken)) {
            String oldTokenkey = redisUtils.generateKey(CacheConstant.SYS_USER_TOKEN + ":" + JwtTokenUtil.md5Encode(oldToken));
            redisUtils.del(oldTokenkey);
            redisUtils.del(userKey);
        }
        redisUtils.set(userKey, newToken,(JwtTokenUtil.EXPIRATION*2/1000)+2);
        String tokenKey= redisUtils.generateKey(CacheConstant.SYS_USER_TOKEN+":"+JwtTokenUtil.md5Encode(newToken));
@@ -142,9 +189,14 @@
    @Override
    public void logout() {
        String jwtToken = request.getHeader(JwtTokenUtil.USER_LOGIN_TOKEN);
        String key= redisUtils.generateKey(CacheConstant.SYS_USER_TOKEN+":"+JwtTokenUtil.md5Encode(jwtToken));
        //删除redis缓存
        redisUtils.del(key);
        if(StringUtils.isNotBlank(jwtToken)){
            String username=JwtTokenUtil.getUsername(jwtToken);
            String userKey = redisUtils.generateKey(CacheConstant.SYS_USER_TOKEN + ":" + username);
            String tokenKey= redisUtils.generateKey(CacheConstant.SYS_USER_TOKEN+":"+JwtTokenUtil.md5Encode(jwtToken));
            //删除redis缓存
            redisUtils.del(tokenKey);
            redisUtils.del(userKey);
        }
    }
    @Override
@@ -163,8 +215,25 @@
    @Override
    public CommonPage<SysUser> expertList(SysUser user) {
        SysUser currentUser= ShiroUtils.getSysUser();
        if(!currentUser.getIdentity().equals(UserIdentityEnum.MONITOR.getCode())){
            //机构用户只能查看本机构的专家
            if(currentUser.getAgencyId()==null){
                throw new ApiException("用户机构id为空");
            }
            user.setAgencyId(currentUser.getAgencyId());
        }
        PageUtil.startPage();
        List<SysUser> users=baseMapper.expertList(user);
        if(users.size()>0) {
            //统计用户参与项目的信息
            List<Long> userIds = users.stream().map(item -> item.getId()).collect(Collectors.toList());
            List<PersonProjectVO> personProjectVOList = projectMapper.getProjectByPersonIds(userIds);
            Map<Long, PersonProjectVO> maps = personProjectVOList.stream().collect(Collectors.toMap(PersonProjectVO::getPersonId, a -> a));
            for (SysUser sysUser : users) {
                sysUser.setPersonProjectVO(maps.get(sysUser.getId()));
            }
        }
        return CommonPage.restPage(users);
    }
@@ -216,8 +285,10 @@
        }
        String originPsword=Base64.decodeStr(user.getPassword());
        validatorPassword(originPsword);
        //密码生成规则:md5(username+password+salt)
        user.setPassword(JwtTokenUtil.encryptPassword(user.getUsername(),originPsword,user.getSalt()));
        user.setIdentity(UserIdentityEnum.MONITOR.getCode());
        user.setCreateBy(ShiroUtils.getSysUser().getUsername());
        boolean b=save(user);
        if(!b){
            throw new ApiException("创建监管用户信息失败");
@@ -246,15 +317,16 @@
        if(!agencyService.checkAgencyNameUnique(new SysAgency().setName(agency.getName()))){
            throw new ApiException("机构名称已存在");
        }
        int i=agencyMapper.insert(agency);
        if(i<1){
        agency.setCreateBy(ShiroUtils.getSysUser().getUsername());
        boolean b=agencyService.save(agency);
        if(!b){
            throw new ApiException("保存机构信息失败");
        }
        user.setIdentity(UserIdentityEnum.AGENCY.getCode());
        user.setAgencyId(agency.getId());
        user.setPassword(JwtTokenUtil.encryptPassword(user.getUsername(),originPsword,user.getSalt()));
        boolean b=save(user);
        user.setCreateBy(ShiroUtils.getSysUser().getUsername());
        b=save(user);
        if(!b){
            throw new ApiException("创建机构用户信息失败");
        }
@@ -264,6 +336,8 @@
    @Override
    @Transactional(rollbackFor = RuntimeException.class)
    public int addExpert(SysUser user) {
        user.setIdentity(UserIdentityEnum.EXPERT.getCode());
        checkUserAllowed(user);
        //校验用户信息
        if(!checkUsernameUnique(new SysUser().setUsername(user.getUsername()))){
            throw new ApiException("用户名已存在");
@@ -271,11 +345,19 @@
        if(!checkPhoneUnique(new SysUser().setUsername(user.getPhone()))){
            throw new ApiException("手机号已存在");
        }
        String major=user.getMajor();
        List<Integer> majors=new ArrayList<>();
        JSONObject jsonObject=JSONObject.parseObject(major);
        jsonObject.forEach((key,value)-> {
            majors.add(Integer.valueOf(key));
        });
        user.setMajor(StringUtils.join(",",majors));
        user.setCertificateNo(major);
        String originPsword=Base64.decodeStr(user.getPassword());
        validatorPassword(originPsword);
        user.setIdentity(UserIdentityEnum.EXPERT.getCode());
        user.setCreateBy(ShiroUtils.getSysUser().getUsername());
        user.setPassword(JwtTokenUtil.encryptPassword(user.getUsername(),originPsword,user.getSalt()));
        boolean b=save(user);
        if(!b){
            throw new ApiException("创建专家信息失败");
@@ -322,22 +404,31 @@
    @Override
    @Transactional(rollbackFor = RuntimeException.class)
    public int deleteUserById(Long userId) {
        SysUser user=getUserById(userId);
        if(user==null){
            throw new ApiException("用户不存在");
        }
        SysUser currentUser=ShiroUtils.getSysUser();
        SysUser user=checkUserDataScope(userId);
        if(Objects.equals(ShiroUtils.getUserId(), userId)){
            throw new ApiException("不能删除自己账号");
        }
        //机构用户,将机构信息设置成删除状态
        if(user.getIdentity().equals(UserIdentityEnum.AGENCY.getCode())){
            if(user.getAgencyId()==null){
                throw new ApiException("获取机构id为空");
        if(user.getIdentity().equals(UserIdentityEnum.AGENCY.getCode())||user.getIdentity().equals(UserIdentityEnum.MONITOR.getCode())){
            if(!currentUser.getIdentity().equals(UserIdentityEnum.MONITOR.getCode())){
                throw new ApiException("没有权限,只有监管用户才能操作");
            }
            agencyMapper.deleteAgencyById(user.getAgencyId());
            //机构用户,将机构信息设置成删除状态
            if(user.getIdentity().equals(UserIdentityEnum.AGENCY.getCode())) {
                if (user.getAgencyId() == null) {
                    throw new ApiException("获取机构id为空");
                }
                SysAgency agency=new SysAgency().setId(user.getAgencyId());
                agency.setUpdateBy(ShiroUtils.getSysUser().getUsername());
                agency.setDelFlag(DeleteFlagEnum.DELETED.getCode());
                agencyService.updateById(agency);
            }
        }
        delCacheByUsername(user.getUsername());
        return baseMapper.deleteUserById(userId);
        user=new SysUser().setId(userId);
        user.setUpdateBy(ShiroUtils.getSysUser().getUsername());
        user.setDelFlag(DeleteFlagEnum.DELETED.getCode());
        return baseMapper.updateById(user);
    }
    @Override
@@ -351,6 +442,7 @@
        }
        delCacheByUsername(user.getUsername());
        user.setPassword(null);
        user.setUpdateBy(ShiroUtils.getSysUser().getUsername());
        boolean b=updateById(user);
        if(!b){
            throw new ApiException("更新监管用户信息失败");
@@ -380,8 +472,10 @@
        }
        delCacheByUsername(user.getUsername());
        agency.setUpdateBy(ShiroUtils.getSysUser().getUsername());
        agencyService.updateById(agency);
        user.setPassword(null);
        user.setUpdateBy(ShiroUtils.getSysUser().getUsername());
        boolean b=updateById(user);
        if(!b){
            throw new ApiException("更新用户失败");
@@ -391,6 +485,7 @@
    @Override
    public int editExpert(SysUser user) {
        checkUserDataScope(user.getId());
        //校验用户信息
        if(!checkUsernameUnique(user)){
            throw new ApiException("用户名已存在");
@@ -398,13 +493,23 @@
        if(!checkPhoneUnique(user)){
            throw new ApiException("手机号已存在");
        }
        user.setPassword(null);
        boolean b=updateById(user);
        if(!b){
            throw new ApiException("更新专家信息失败");
        String major=user.getMajor();
        if(StringUtils.isNotBlank(major)){
            List<Integer> majors=new ArrayList<>();
            JSONObject jsonObject=JSONObject.parseObject(major);
            jsonObject.forEach((key,value)-> {
                majors.add(Integer.valueOf(key));
            });
            user.setMajor(StringUtils.join(",",majors));
            user.setCertificateNo(major);
        }
        //刪除旧数据
        attachService.deleteAttachsByUserId(user.getId(),null);
        user.setPassword(null);
        user.setUpdateBy(ShiroUtils.getSysUser().getUsername());
        int row=baseMapper.updateById(user);
        List<SysAttach> existAttaches=attachService.getAttachsByUserId(user.getId(),null);
        // 刪除旧数据
        // attachService.deleteAttachsByUserId(user.getId(),null);
        List<SysAttach> socialAttach=user.getSocialAttach();
        List<SysAttach> medicalAttach=user.getMedicalAttach();
@@ -425,9 +530,20 @@
            attach.setUserId(user.getId());
            attaches.add(attach);
        }
        attachService.saveBatch(attaches);
        attachService.saveOrUpdateBatch(attaches);
        List<Long> newIds=attaches.stream().map(SysAttach::getId).collect(Collectors.toList());
        List<Long> delIds=new ArrayList<>();
        for(SysAttach attach:existAttaches){
            if(!newIds.contains(attach.getId())){
                delIds.add(attach.getId());
            }
        }
        if(!delIds.isEmpty()){
            attachService.deleteAttachsByIds(delIds);
        }
        delCacheByUsername(user.getUsername());
        return 1;
        return row;
    }
@@ -435,7 +551,6 @@
    public boolean resetUserPwd(SysUser user) {
        String originPsword=Base64.decodeStr(user.getPassword());
        validatorPassword(originPsword);
        checkUserAllowed(user);
        SysUser oldUser=checkUserDataScope(user.getId());
        SysUser newUser=new SysUser().setId(user.getId()).setPassword(JwtTokenUtil.encryptPassword(oldUser.getUsername(),originPsword,oldUser.getSalt()));
        newUser.setUpdateBy(ShiroUtils.getSysUser().getUsername());
@@ -478,7 +593,15 @@
    @Override
    public void checkUserAllowed(SysUser user) {
        SysUser currentUser=ShiroUtils.getSysUser();
        if(!Objects.equals(currentUser.getIdentity(), UserIdentityEnum.MONITOR.getCode())){
            if(Objects.equals(user.getIdentity(), UserIdentityEnum.MONITOR.getCode())){
                throw new ApiException("无权操作监管用户");
            }
            if(!Objects.equals(currentUser.getAgencyId(), user.getAgencyId())){
                throw new ApiException("无权操作其他机构用户");
            }
        }
    }
    @Override
@@ -486,67 +609,19 @@
        if(userId==null){
            throw new ApiException("用户id为空!");
        }
        SysUser user = baseMapper.getUserById(userId);
        SysUser user = getById(userId);
        if (ObjectUtil.isNull(user))
        {
            throw new ApiException("用户数据不存在!");
        }
        checkUserAllowed(user);
        return user;
    }
    @Override
    public String importUser(List<SysUser> userList,Boolean isUpdateSupport) {
        if(ObjectUtil.isEmpty(userList)||userList.size()==0){
            throw new ApiException("导入用户数据不能为空");
        }
        int successNum=0;
        int failureNum=0;
        StringBuilder successMsg=new StringBuilder();
        StringBuilder failureMsg=new StringBuilder();
        String password=configService.getConfigByKey("sys.user.initPassword");
        for(SysUser user:userList){
            try {
                SysUser u = baseMapper.getUserByUsername(user.getUsername());
                if (ObjectUtil.isNull(u)) {
                    BeanValidators.validateWithException(validator, user);
                    user.setPassword(JwtTokenUtil.md5Encode(user.getUsername() + password));
                    user.setCreateBy("");
                    save(user);
                    successNum++;
                    successMsg.append("<br/>" + successNum + "、账号 " + user.getUsername() + " 导入成功");
                } else if (isUpdateSupport) {
                    BeanValidators.validateWithException(validator, user);
                    checkUserAllowed(u);
                    checkUserDataScope(u.getId());
                    user.setId(u.getId());
                    user.setUpdateBy("");
                    updateById(user);
                    successNum++;
                    successMsg.append("<br/>" + successNum + "、账号 " + user.getUsername() + " 更新成功");
                } else {
                    failureNum++;
                    failureMsg.append("<br/>" + failureNum + "、账号 " + user.getUsername() + " 已存在");
                }
            }catch (Exception e){
                failureNum++;
                String msg = "<br/>" + failureNum + "、账号 " + user.getUsername() + " 导入失败:";
                failureMsg.append(msg + e.getMessage());
                log.error(msg, e);
            }
        }
        if (failureNum > 0){
            failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
            throw new ApiException(failureMsg.toString());
        }else{
            successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
        }
        return successMsg.toString();
    }
    @Override
    public boolean changeUserStatus(SysUser user) {
        checkUserAllowed(user);
        SysUser existUser=checkUserDataScope(user.getId());
        SysUser su=new SysUser().setId(user.getId()).setStatus(user.getStatus());
        su.setUpdateBy(ShiroUtils.getSysUser().getUsername());
@@ -556,7 +631,6 @@
    @Override
    public boolean changeApprove(SysUser user) {
        checkUserAllowed(user);
        SysUser existUser=checkUserDataScope(user.getId());
        SysUser su=new SysUser().setId(user.getId()).setState(user.getState());
        su.setUpdateBy(ShiroUtils.getSysUser().getUsername());