From 5d2cfd4562f74496a5263db3451c1e78ff53aead Mon Sep 17 00:00:00 2001
From: heheng <475597332@qq.com>
Date: 星期四, 27 三月 2025 08:44:16 +0800
Subject: [PATCH] 单据增加查询返回字段

---
 assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysUserServiceImpl.java |  546 +++++++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 431 insertions(+), 115 deletions(-)

diff --git a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysUserServiceImpl.java b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysUserServiceImpl.java
index 6ceaac1..f77f75f 100644
--- a/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysUserServiceImpl.java
+++ b/assess-system/src/main/java/com/gkhy/assess/system/service/impl/SysUserServiceImpl.java
@@ -1,28 +1,34 @@
 package com.gkhy.assess.system.service.impl;
 
+import cn.hutool.core.codec.Base64;
 import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.core.util.StrUtil;
+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.CustomerUsernamePasswordToken;
 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.enums.UserTypeEnum;
 import com.gkhy.assess.common.exception.ApiException;
-import com.gkhy.assess.common.utils.BeanValidators;
-import com.gkhy.assess.common.utils.JwtTokenUtil;
-import com.gkhy.assess.common.utils.PageUtil;
-import com.gkhy.assess.common.utils.RedisUtils;
+import com.gkhy.assess.common.utils.*;
 import com.gkhy.assess.system.domain.*;
-import com.gkhy.assess.system.mapper.SysAgencyMapper;
+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;
 import com.gkhy.assess.system.service.SysConfigService;
-import com.gkhy.assess.system.utils.ShiroUtils;
 import com.gkhy.assess.system.service.SysUserService;
+import com.gkhy.assess.system.utils.ShiroUtils;
 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;
@@ -30,7 +36,8 @@
 
 import javax.servlet.http.HttpServletRequest;
 import javax.validation.Validator;
-import java.util.List;
+import java.util.*;
+import java.util.stream.Collectors;
 
 
 /**
@@ -52,15 +59,25 @@
 
     @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) {
+        if(loginBody.getIdentity()==null){
+            throw new ApiException("请选择登录用户身份");
+        }
         // 验证码校验
         validateCaptcha(loginBody.getUsername(), loginBody.getCode(), loginBody.getUuid());
-        UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(loginBody.getUsername(), loginBody.getPassword(), false);
+     //   UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(loginBody.getUsername(), Base64.decodeStr(loginBody.getPassword()), false);
+        CustomerUsernamePasswordToken usernamePasswordToken=new CustomerUsernamePasswordToken(loginBody.getUsername(), Base64.decodeStr(loginBody.getPassword()),loginBody.getIdentity());
         Subject subject= SecurityUtils.getSubject();
         String msg ;
         try {
@@ -68,23 +85,104 @@
             SysUser sysUser = (SysUser) subject.getPrincipal();
             AccountVO accountVO = new AccountVO();
             BeanUtils.copyProperties(sysUser, accountVO);
-
-            String token = JwtTokenUtil.sign(sysUser.getUsername(),sysUser.getPassword());
+            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(),loginBody.getIdentity());
             accountVO.setToken(token);
-            String key= redisUtils.generateKey(CacheConstant.SYS_USER_TOKEN+":"+JwtTokenUtil.md5Encode(token));
-            // 设置超时时间
-            redisUtils.set(key,token);
-            redisUtils.expire(key,JwtTokenUtil.EXPIRATION*2/1000);
+            cacheUserToken(sysUser.getUsername(),sysUser.getIdentity(),token);
             return accountVO;
         }catch (UnknownAccountException | IncorrectCredentialsException uae){
             throw new ApiException("用户名/密码错误,请重新输入");
         } catch (LockedAccountException lae) { // 账号已被锁定
             msg = "账号已被锁定";
             throw new ApiException(msg);
-        } catch (AuthenticationException ae) { // 其他身份验证异常
-            msg = "用户认证失败";
+        }catch (AuthenticationException ae) { // 其他身份验证异常
+            msg = "用户认证失败:"+ae.getMessage();
             throw new ApiException(msg);
         }
+    }
+
+
+
+    @Override
+    public AccountVO appLogin(LoginBody loginBody) {
+        // app端只能是专家用户登录
+        loginBody.setIdentity(UserIdentityEnum.EXPERT.getCode());
+        CustomerUsernamePasswordToken usernamePasswordToken = new CustomerUsernamePasswordToken(loginBody.getUsername(), Base64.decodeStr(loginBody.getPassword()), loginBody.getIdentity());
+        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(),loginBody.getIdentity());
+            accountVO.setToken(token);
+            cacheUserToken(sysUser.getUsername(),sysUser.getIdentity(),token);
+            accountVO.setIdPhoto(sysUser.getIdPhoto());
+            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);
+        }
+    }
+
+    /**
+     * 清空旧的登录信息,保证同时只有一个用户再登录,后登录用户会挤掉前一个用户
+     * @param username
+     */
+//    public void cacheUserToken(String username,Integer identity,String newToken){
+//        String userKey = redisUtils.generateKey(CacheConstant.SYS_USER_TOKEN + ":" + username+"_"+identity);
+//        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));
+//        // 设置超时时间
+//        redisUtils.set(tokenKey,newToken);
+//        redisUtils.expire(tokenKey,JwtTokenUtil.EXPIRATION*2/1000);
+//    }
+
+
+    /**
+     * 清空旧的登录信息,保证同时只有一个用户再登录,后登录用户会挤掉前一个用户
+     * @param username
+     */
+    public void cacheUserToken(String username,Integer identity,String newToken){
+     //   String userKey = redisUtils.generateKey(CacheConstant.SYS_USER_TOKEN + ":" + username+"_"+identity);
+//        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));
+        // 设置超时时间
+        redisUtils.set(tokenKey,newToken,JwtTokenUtil.EXPIRATION*2/1000);
     }
 
     /**
@@ -97,13 +195,13 @@
      */
     public void validateCaptcha(String username, String code, String uuid)
     {
-            if(StrUtil.isBlank(code)||StrUtil.isBlank(uuid)){
+            if(StringUtils.isBlank(code)||StringUtils.isBlank(uuid)){
                 throw new ApiException("验证码或验证码标识为空");
             }
             String verifyKey = CacheConstant.CAPTCHA_CODE_KEY +uuid;
             String captcha = (String) redisUtils.get(verifyKey);
             redisUtils.del(verifyKey);
-            if (StrUtil.isBlank(captcha))
+            if (StringUtils.isBlank(captcha))
             {
                 throw new ApiException("验证码已失效");
             }
@@ -116,9 +214,15 @@
     @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);
+            Integer identity=JwtTokenUtil.getIdentity(jwtToken);
+           // String userKey = redisUtils.generateKey(CacheConstant.SYS_USER_TOKEN + ":" + username+"_"+identity);
+            String tokenKey= redisUtils.generateKey(CacheConstant.SYS_USER_TOKEN+":"+JwtTokenUtil.md5Encode(jwtToken));
+            //删除redis缓存
+            redisUtils.del(tokenKey);
+           // redisUtils.del(userKey);
+        }
     }
 
     @Override
@@ -137,14 +241,31 @@
 
     @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);
     }
 
     @Override
-    public SysUser getUserByUsername(String username) {
-        String key=redisUtils.generateKey(CacheConstant.SYS_USER_NAME+":"+username);
+    public SysUser getUserByUsername(String username,Integer identity) {
+        String key=redisUtils.generateKey(CacheConstant.SYS_USER_NAME + ":" + username+"_"+identity);
         SysUser sysUser =null;
         if(redisUtils.hasKey(key)){
             sysUser= (SysUser) redisUtils.get(key);
@@ -156,45 +277,85 @@
     }
 
     @Override
-    public SysUser getUserByUsernamePhone(String username) {
-        String key=redisUtils.generateKey(CacheConstant.SYS_USER_NAME+":"+username);
+    public void delCacheByUsername(String username,Integer identity){
+        String key=redisUtils.generateKey(CacheConstant.SYS_USER_NAME+":"+username+"_"+identity);
+        redisUtils.del(key);
+    }
+
+    @Override
+    public SysUser getUserByUsernamePhone(String username,Integer identity) {
+        String key=redisUtils.generateKey(CacheConstant.SYS_USER_NAME+":"+username+"_"+identity);
         SysUser sysUser =null;
         if(redisUtils.hasKey(key)){
             sysUser= (SysUser) redisUtils.get(key);
         }else {
-            sysUser = baseMapper.getUserByUsernamePhone(username);
+            sysUser = baseMapper.getUserByUsernamePhone(username,identity);
             redisUtils.set(key,sysUser,10*60);
         }
         return sysUser;
     }
 
+    public void validatorPassword(String password){
+        if(password.length()<5||password.length()>30){
+            throw new ApiException("密码长度须在5-30之间");
+        }
+    }
+
     @Override
-    @Transactional(rollbackFor = RuntimeException.class)
-    public int agencyRegister(SysUser user) {
+    public int addMonitor(SysUser user) {
         //校验用户信息
         if(!checkUsernameUnique(new SysUser().setUsername(user.getUsername()))){
             throw new ApiException("用户名已存在");
         }
-        if(!checkPhoneUnique(new SysUser().setUsername(user.getPhone()))){
+        if(!checkPhoneUnique(new SysUser().setUsername(user.getPhone()).setIdentity(UserIdentityEnum.MONITOR.getCode()))){
             throw new ApiException("手机号已存在");
         }
+        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("创建监管用户信息失败");
+        }
+        return 1;
+    }
+
+    @Override
+    @Transactional(rollbackFor = RuntimeException.class)
+    public int addAgency(SysUser user) {
+        //校验用户信息
+        if(!checkUsernameUnique(new SysUser().setUsername(user.getUsername()))){
+            throw new ApiException("用户名已存在");
+        }
+        if(!checkPhoneUnique(new SysUser().setUsername(user.getPhone()).setIdentity(UserIdentityEnum.AGENCY.getCode()))){
+            throw new ApiException("手机号已存在");
+        }
+        String originPsword=Base64.decodeStr(user.getPassword());
+        validatorPassword(originPsword);
         SysAgency agency=user.getAgency();
         if(ObjectUtil.isNull(agency)){
             throw new ApiException("机构信息不能为空");
         }
+
         //查询机构信息是否存在
-        if(ObjectUtil.isNotNull(agencyMapper.checkAgencyNameUnique(agency.getName()))){
+        if(!agencyService.checkAgencyNameUnique(new SysAgency().setName(agency.getName()))){
             throw new ApiException("机构名称已存在");
         }
-
-        int i=agencyMapper.insert(agency);
-        if(i<1){
+        agency.setCreateBy(ShiroUtils.getSysUser()!=null?ShiroUtils.getSysUser().getUsername():"");
+        boolean b=agencyService.save(agency);
+        if(!b){
             throw new ApiException("保存机构信息失败");
         }
 
+        //创建机构用户
+        user.setIdentity(UserIdentityEnum.AGENCY.getCode());
         user.setAgencyId(agency.getId());
-        user.setUserType(UserIdentityEnum.AGENCY.getCode());
-        boolean b=save(user);
+        user.setPassword(JwtTokenUtil.encryptPassword(user.getUsername(),originPsword,user.getSalt()));
+        user.setCreateBy(ShiroUtils.getSysUser()!=null?ShiroUtils.getSysUser().getUsername():"");
+        b=save(user);
         if(!b){
             throw new ApiException("创建机构用户信息失败");
         }
@@ -202,19 +363,70 @@
     }
 
     @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("用户名已存在");
         }
-        if(!checkPhoneUnique(new SysUser().setUsername(user.getPhone()))){
+        if(!checkPhoneUnique(new SysUser().setUsername(user.getPhone()).setIdentity(UserIdentityEnum.EXPERT.getCode()))){
             throw new ApiException("手机号已存在");
         }
-        user.setUserType(UserIdentityEnum.EXPERT.getCode());
+        List<SysAttach> socialAttach=user.getSocialAttach();
+        List<SysAttach> medicalAttach=user.getMedicalAttach();
+        List<SysAttach> salaryAttach=user.getSalaryAttach();
+        //疆外企业必须上传社保、医保、薪资
+        SysAgency agency=agencyService.getAgencyById(user.getAgencyId());
+        if(agency.getAttribute()==0){
+            if(ObjectUtil.isEmpty(socialAttach)||ObjectUtil.isEmpty(medicalAttach)||ObjectUtil.isEmpty(salaryAttach)){
+                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.setCreateBy(ShiroUtils.getSysUser().getUsername());
+        user.setPassword(JwtTokenUtil.encryptPassword(user.getUsername(),originPsword,user.getSalt()));
+
         boolean b=save(user);
         if(!b){
             throw new ApiException("创建专家信息失败");
+        }
+
+        List<SysAttach> attaches=new ArrayList<>();
+        if(socialAttach!=null&& !socialAttach.isEmpty()) {
+            for (SysAttach attach : socialAttach) {
+                attach.setType(AttachTypeEnum.SOCIAL.getCode());
+                attach.setUserId(user.getId());
+                attaches.add(attach);
+            }
+        }
+        if(medicalAttach!=null&& !medicalAttach.isEmpty()) {
+            for (SysAttach attach : medicalAttach) {
+                attach.setType(AttachTypeEnum.MEDICAL.getCode());
+                attach.setUserId(user.getId());
+                attaches.add(attach);
+            }
+        }
+        if(salaryAttach!=null&& !salaryAttach.isEmpty()) {
+            for (SysAttach attach : salaryAttach) {
+                attach.setType(AttachTypeEnum.SALARY.getCode());
+                attach.setUserId(user.getId());
+                attaches.add(attach);
+            }
+        }
+        if(!attaches.isEmpty()) {
+            attachService.saveBatch(attaches);
         }
         return 1;
     }
@@ -231,14 +443,59 @@
     }
 
     @Override
+    public SysUser getUserInfoById(Long userId) {
+        return baseMapper.getUserInfoById(userId);
+    }
+
+    @Override
     @Transactional(rollbackFor = RuntimeException.class)
     public int deleteUserById(Long userId) {
-        SysUser user=getUserById(userId);
-        //机构用户,将机构信息设置成删除状态
-        if(user.getUserType().equals(UserIdentityEnum.AGENCY.getCode())){
-            agencyMapper.deleteAgencyById(user.getAgencyId());
+        SysUser currentUser=ShiroUtils.getSysUser();
+        SysUser user=checkUserDataScope(userId);
+        if(Objects.equals(ShiroUtils.getUserId(), userId)){
+            throw new ApiException("不能删除自己账号");
         }
-        return baseMapper.deleteUserById(userId);
+        if(user.getIdentity().equals(UserIdentityEnum.AGENCY.getCode())||user.getIdentity().equals(UserIdentityEnum.MONITOR.getCode())){
+            if(!currentUser.getIdentity().equals(UserIdentityEnum.MONITOR.getCode())){
+                throw new ApiException("没有权限,只有监管用户才能操作");
+            }
+            //机构用户,将机构信息设置成删除状态
+            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(),user.getIdentity());
+        delCacheByUsername(user.getPhone(),user.getIdentity());
+        user=new SysUser().setId(userId);
+        user.setUpdateBy(ShiroUtils.getSysUser().getUsername());
+        user.setDelFlag(DeleteFlagEnum.DELETED.getCode());
+        return baseMapper.updateById(user);
+    }
+
+    @Override
+    public int editMonitor(SysUser user) {
+        //校验用户信息
+        if(!checkUsernameUnique(user)){
+            throw new ApiException("用户名已存在");
+        }
+        if(!checkPhoneUnique(user.setIdentity(UserIdentityEnum.MONITOR.getCode()))){
+            throw new ApiException("手机号已存在");
+        }
+        delCacheByUsername(user.getUsername(),UserIdentityEnum.MONITOR.getCode());
+        delCacheByUsername(user.getPhone(),UserIdentityEnum.MONITOR.getCode());
+        user.setPassword(null);
+        user.setUpdateBy(ShiroUtils.getSysUser().getUsername());
+        boolean b=updateById(user);
+        if(!b){
+            throw new ApiException("更新监管用户信息失败");
+        }
+        return 1;
     }
 
 
@@ -249,18 +506,31 @@
         if(!checkUsernameUnique(user)){
             throw new ApiException("用户名已存在");
         }
-        if(!checkPhoneUnique(user)){
+        if(!checkPhoneUnique(user.setIdentity(UserIdentityEnum.AGENCY.getCode()))){
             throw new ApiException("手机号已存在");
         }
         SysAgency agency=user.getAgency();
-        if(ObjectUtil.isNull(agency)){
-            throw new ApiException("机构信息不能为空");
+        if(ObjectUtil.isNull(agency)||agency.getId()==null){
+            throw new ApiException("机构信息或者id不能为空");
         }
+
         //查询机构信息是否存在
-        if(ObjectUtil.isNotNull(agency)){
+        if(!agencyService.checkAgencyNameUnique(agency)){
             throw new ApiException("机构名称已存在");
         }
-        agencyMapper.updateById(agency);
+        SysUser currentUser=ShiroUtils.getSysUser();
+        if(!currentUser.getIdentity().equals(UserIdentityEnum.MONITOR.getCode())){
+            if(!user.getId().equals(currentUser.getId())){
+                throw new ApiException("只能修改自身数据");
+            }
+        }
+
+        delCacheByUsername(user.getUsername(),UserIdentityEnum.AGENCY.getCode());
+        delCacheByUsername(user.getPhone(),UserIdentityEnum.AGENCY.getCode());
+        agency.setUpdateBy(currentUser.getUsername());
+        agencyService.updateById(agency);
+        user.setPassword(null);
+        user.setUpdateBy(currentUser.getUsername());
         boolean b=updateById(user);
         if(!b){
             throw new ApiException("更新用户失败");
@@ -270,24 +540,96 @@
 
     @Override
     public int editExpert(SysUser user) {
+        checkUserDataScope(user.getId());
         //校验用户信息
         if(!checkUsernameUnique(user)){
             throw new ApiException("用户名已存在");
         }
-        if(!checkPhoneUnique(user)){
+        if(!checkPhoneUnique(user.setIdentity(UserIdentityEnum.EXPERT.getCode()))){
             throw new ApiException("手机号已存在");
         }
-        boolean b=updateById(user);
-        if(!b){
-            throw new ApiException("更新专家信息失败");
+        List<SysAttach> socialAttach=user.getSocialAttach();
+        List<SysAttach> medicalAttach=user.getMedicalAttach();
+        List<SysAttach> salaryAttach=user.getSalaryAttach();
+        //疆外企业必须上传社保、医保、薪资
+        SysAgency agency=agencyService.getAgencyById(user.getAgencyId());
+        if(agency.getAttribute()==0){
+            if(ObjectUtil.isEmpty(socialAttach)||ObjectUtil.isEmpty(medicalAttach)||ObjectUtil.isEmpty(salaryAttach)){
+                throw new ApiException("疆内企业必须上传社保、医保、工资照片");
+            }
         }
-        return 1;
+
+        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);
+        }
+        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> attaches=new ArrayList<>();
+        if(socialAttach!=null&& !socialAttach.isEmpty()) {
+            for (SysAttach attach : socialAttach) {
+                attach.setType(AttachTypeEnum.SOCIAL.getCode());
+                attach.setUserId(user.getId());
+                attaches.add(attach);
+            }
+        }
+        if(medicalAttach!=null&& !medicalAttach.isEmpty()) {
+            for (SysAttach attach : medicalAttach) {
+                attach.setType(AttachTypeEnum.MEDICAL.getCode());
+                attach.setUserId(user.getId());
+                attaches.add(attach);
+            }
+        }
+        if(salaryAttach!=null&& !salaryAttach.isEmpty()) {
+            for (SysAttach attach : salaryAttach) {
+                attach.setType(AttachTypeEnum.SALARY.getCode());
+                attach.setUserId(user.getId());
+                attaches.add(attach);
+            }
+        }
+        if(!attaches.isEmpty()) {
+            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(),UserIdentityEnum.EXPERT.getCode());
+        delCacheByUsername(user.getPhone(),UserIdentityEnum.EXPERT.getCode());
+        return row;
     }
 
 
     @Override
     public boolean resetUserPwd(SysUser user) {
-        return updateById(user);
+        String originPsword=Base64.decodeStr(user.getPassword());
+        validatorPassword(originPsword);
+        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());
+        delCacheByUsername(oldUser.getUsername(),oldUser.getIdentity());
+        delCacheByUsername(oldUser.getPhone(),oldUser.getIdentity());
+        return updateById(newUser);
     }
 
     @Override
@@ -303,8 +645,11 @@
 
     @Override
     public boolean checkPhoneUnique(SysUser user) {
+        if(user.getIdentity()==null){
+            throw new ApiException("用户身份不能为空");
+        }
         Long userId = user.getId()==null ? -1L : user.getId();
-        SysUser info = baseMapper.checkPhoneUnique(user.getPhone());
+        SysUser info = baseMapper.checkPhoneUnique(user.getPhone(),user.getIdentity());
         if (info!=null && info.getId().longValue() != userId.longValue())
         {
             return false;
@@ -325,79 +670,50 @@
 
     @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
-    public void checkUserDataScope(Long userId) {
-        SysUser user = baseMapper.getUserById(userId);
+    public SysUser checkUserDataScope(Long userId) {
+        if(userId==null){
+            throw new ApiException("用户id为空!");
+        }
+        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);
-        checkUserDataScope(user.getId());
-        return updateById(user);
+        SysUser existUser=checkUserDataScope(user.getId());
+        SysUser su=new SysUser().setId(user.getId()).setStatus(user.getStatus());
+        su.setUpdateBy(ShiroUtils.getSysUser().getUsername());
+        delCacheByUsername(existUser.getUsername(),existUser.getIdentity());
+        delCacheByUsername(existUser.getPhone(),existUser.getIdentity());
+        return updateById(su);
     }
 
     @Override
     public boolean changeApprove(SysUser user) {
-        checkUserAllowed(user);
-        checkUserDataScope(user.getId());
-        return updateById(user);
+        SysUser existUser=checkUserDataScope(user.getId());
+        SysUser su=new SysUser().setId(user.getId()).setState(user.getState());
+        su.setUpdateBy(ShiroUtils.getSysUser().getUsername());
+        delCacheByUsername(existUser.getUsername(),existUser.getIdentity());
+        delCacheByUsername(existUser.getPhone(),existUser.getIdentity());
+        return updateById(su);
     }
 }

--
Gitblit v1.9.2