|
@@ -1,29 +1,38 @@
|
|
|
package com.qmth.sop.business.service.impl;
|
|
|
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
|
|
+import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
+import com.qmth.boot.api.exception.ApiException;
|
|
|
import com.qmth.boot.core.enums.Platform;
|
|
|
import com.qmth.sop.business.bean.auth.AuthBean;
|
|
|
import com.qmth.sop.business.bean.auth.ExpireTimeBean;
|
|
|
+import com.qmth.sop.business.bean.dto.UserDto;
|
|
|
import com.qmth.sop.business.bean.dto.VerifyCodeCheckDto;
|
|
|
import com.qmth.sop.business.bean.result.LoginResult;
|
|
|
import com.qmth.sop.business.bean.result.SysUserResult;
|
|
|
import com.qmth.sop.business.cache.CommonCacheService;
|
|
|
-import com.qmth.sop.business.entity.SysConfig;
|
|
|
-import com.qmth.sop.business.entity.SysRole;
|
|
|
-import com.qmth.sop.business.entity.SysUser;
|
|
|
-import com.qmth.sop.business.entity.TBSession;
|
|
|
+import com.qmth.sop.business.entity.*;
|
|
|
import com.qmth.sop.business.mapper.SysUserMapper;
|
|
|
+import com.qmth.sop.business.service.SysRoleService;
|
|
|
+import com.qmth.sop.business.service.SysUserRoleService;
|
|
|
import com.qmth.sop.business.service.SysUserService;
|
|
|
import com.qmth.sop.business.service.TBSessionService;
|
|
|
import com.qmth.sop.business.util.AuthUtil;
|
|
|
+import com.qmth.sop.common.contant.SpringContextHolder;
|
|
|
import com.qmth.sop.common.contant.SystemConstant;
|
|
|
import com.qmth.sop.common.enums.AppSourceEnum;
|
|
|
import com.qmth.sop.common.enums.ExceptionResultEnum;
|
|
|
+import com.qmth.sop.common.enums.FieldUniqueEnum;
|
|
|
import com.qmth.sop.common.util.IpUtil;
|
|
|
+import com.qmth.sop.common.util.ResultUtil;
|
|
|
import com.qmth.sop.common.util.ServletUtil;
|
|
|
import com.qmth.sop.common.util.SessionUtil;
|
|
|
+import org.springframework.dao.DuplicateKeyException;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
+import org.springframework.util.CollectionUtils;
|
|
|
|
|
|
import javax.annotation.Resource;
|
|
|
import java.security.NoSuchAlgorithmException;
|
|
@@ -47,6 +56,12 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
|
|
|
@Resource
|
|
|
TBSessionService tbSessionService;
|
|
|
|
|
|
+ @Resource
|
|
|
+ SysRoleService sysRoleService;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ SysUserRoleService sysUserRoleService;
|
|
|
+
|
|
|
@Override
|
|
|
public LoginResult login(String password, SysUser sysUser, AppSourceEnum appSource) throws NoSuchAlgorithmException {
|
|
|
//停用
|
|
@@ -149,6 +164,13 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 校验短信验证码
|
|
|
+ *
|
|
|
+ * @param userId 用户id
|
|
|
+ * @param mobileNumber 用户手机号
|
|
|
+ * @param code 验证码
|
|
|
+ */
|
|
|
@Override
|
|
|
public void checkSmsCode(Long userId, String mobileNumber, String code) {
|
|
|
SysConfig sysConfig = commonCacheService.addSysConfigCache(SystemConstant.SYS_CODE_ENABLE);
|
|
@@ -157,13 +179,13 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
|
|
|
if (enable) {
|
|
|
SysConfig sysConfigNormal = commonCacheService.addSysConfigCache(SystemConstant.SMS_NORMAL_CODE);
|
|
|
Optional.ofNullable(sysConfigNormal).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("未配置万能短信验证码"));
|
|
|
- if (!sysConfigNormal.getConfigValue().equals(code)) {
|
|
|
+ if (!Objects.equals(sysConfigNormal.getConfigValue(), code)) {
|
|
|
List<VerifyCodeCheckDto> verifyCodeCheckDtoList = this.baseMapper.findVerifyCodeByUser(userId, mobileNumber);
|
|
|
if (verifyCodeCheckDtoList.size() < 1) {
|
|
|
throw ExceptionResultEnum.ERROR.exception("验证码错误");
|
|
|
}
|
|
|
VerifyCodeCheckDto accessControl = verifyCodeCheckDtoList.get(0);
|
|
|
- if (accessControl == null || !accessControl.getVerifyCode().equals(code)) {
|
|
|
+ if (Objects.isNull(accessControl) || !Objects.equals(accessControl.getVerifyCode(), code)) {
|
|
|
throw ExceptionResultEnum.ERROR.exception("验证码错误");
|
|
|
}
|
|
|
|
|
@@ -173,4 +195,121 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询用户
|
|
|
+ *
|
|
|
+ * @param iPage
|
|
|
+ * @param userInfo
|
|
|
+ * @param orgId
|
|
|
+ * @param roleId
|
|
|
+ * @param enable
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public IPage<UserDto> query(IPage<Map> iPage, String userInfo, Long orgId, Long roleId, Boolean enable) {
|
|
|
+ IPage<UserDto> userDtoIPage = this.baseMapper.query(iPage, userInfo, orgId, roleId, enable);
|
|
|
+ if (Objects.nonNull(userDtoIPage) && !CollectionUtils.isEmpty(userDtoIPage.getRecords())) {
|
|
|
+ userDtoIPage.getRecords().forEach(m -> {
|
|
|
+ //角色
|
|
|
+ List<SysRole> roles = sysRoleService.listRolesByUserId(Long.valueOf(m.getId()));
|
|
|
+ m.setRoles(roles);
|
|
|
+ });
|
|
|
+ }
|
|
|
+ return this.baseMapper.query(iPage, userInfo, orgId, roleId, enable);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 新增/修改用户
|
|
|
+ *
|
|
|
+ * @param sysUser
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ @Transactional
|
|
|
+ public Boolean saveUser(SysUser sysUser) {
|
|
|
+ SysUserService sysUserService = SpringContextHolder.getBean(SysUserService.class);
|
|
|
+ try {
|
|
|
+ SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
|
|
|
+
|
|
|
+ // 手机号检验
|
|
|
+ if (Objects.nonNull(sysUser.getMobileNumber())) {
|
|
|
+ SysUser checkMobileNumber = this.getOne(new QueryWrapper<SysUser>().lambda().eq(SysUser::getOrgId, sysUser.getOrgId()).eq(SysUser::getEnable, true).eq(SysUser::getMobileNumber, sysUser.getMobileNumber()));
|
|
|
+ if (Objects.nonNull(checkMobileNumber) && checkMobileNumber.getId().longValue() != sysUser.getId().longValue()) {
|
|
|
+ throw ExceptionResultEnum.ERROR.exception("用户手机号[" + sysUser.getMobileNumber() + "]在系统中已使用");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (Objects.isNull(sysUser.getId())) {//新增用户
|
|
|
+ sysUser.insertInfo(requestUser.getId());
|
|
|
+ sysUser.setPasswordInfo(sysUser.getMobileNumber());
|
|
|
+ sysUserService.save(sysUser);
|
|
|
+ sysUserRoleService.addUserRolePrivilege(sysUser, sysUser.getRoleIds());
|
|
|
+ } else {//修改用户
|
|
|
+ List<SysUserRole> sysUserRoleList = commonCacheService.userRolePrivilegeCache(sysUser.getId());
|
|
|
+ List<Long> userRolesList = Arrays.asList(sysUser.getRoleIds());
|
|
|
+ Set<Long> dbUserRolesList = sysUserRoleList.stream().map(SysUserRole::getRoleId).collect(Collectors.toSet());
|
|
|
+ int count = (int) dbUserRolesList.stream().filter(s -> !userRolesList.contains(s)).count();
|
|
|
+ SysUser dbUser = sysUserService.getById(sysUser.getId());
|
|
|
+ sysUserService.update(new UpdateWrapper<SysUser>().lambda()
|
|
|
+ .eq(SysUser::getId, sysUser.getId())
|
|
|
+ .set(SysUser::getLoginName, sysUser.getLoginName())
|
|
|
+ .set(SysUser::getRealName, sysUser.getRealName())
|
|
|
+ .set(SysUser::getCode, sysUser.getCode())
|
|
|
+ .set(SysUser::getMobileNumber, sysUser.getMobileNumber())
|
|
|
+ .set(SysUser::getOrgId, sysUser.getOrgId())
|
|
|
+ .set(SysUser::getEnable, dbUser.getEnable())
|
|
|
+ .set(SysUser::getUpdateId, requestUser.getId())
|
|
|
+ .set(SysUser::getUpdateTime, System.currentTimeMillis())
|
|
|
+ );
|
|
|
+ //如果修改了角色,需要重新登录
|
|
|
+ if (count > 0 || dbUserRolesList.size() != userRolesList.size()) {
|
|
|
+ QueryWrapper<SysUserRole> sysUserRoleQueryWrapper = new QueryWrapper<>();
|
|
|
+ sysUserRoleQueryWrapper.lambda().eq(SysUserRole::getUserId, sysUser.getId());
|
|
|
+ sysUserRoleService.remove(sysUserRoleQueryWrapper);
|
|
|
+
|
|
|
+ commonCacheService.removeUserRolePrivilegeCache(sysUser.getId());
|
|
|
+ sysUserRoleService.addUserRolePrivilege(sysUser, sysUser.getRoleIds());
|
|
|
+ sysUserService.removeUserInfo(sysUser.getId(), true);
|
|
|
+ } else if (!dbUser.getOrgId().equals(sysUser.getOrgId())) {
|
|
|
+ sysUserService.removeUserInfo(sysUser.getId(), true);
|
|
|
+ }
|
|
|
+ //如果修改了机构或手机号,需更新用户缓存
|
|
|
+ if (Objects.nonNull(dbUser.getOrgId()) && (dbUser.getOrgId().longValue() != sysUser.getOrgId().longValue()
|
|
|
+ || !Objects.equals(dbUser.getMobileNumber(), sysUser.getMobileNumber()))) {
|
|
|
+ commonCacheService.updateUserCache(sysUser.getId());
|
|
|
+ commonCacheService.updateUserAuthCache(sysUser.getId());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error(SystemConstant.LOG_ERROR, e);
|
|
|
+ if (e instanceof DuplicateKeyException) {
|
|
|
+ String errorColumn = e.getCause().toString();
|
|
|
+ String columnStr = errorColumn.substring(errorColumn.lastIndexOf("key") + 3).replaceAll("'", "");
|
|
|
+ throw ExceptionResultEnum.SQL_ERROR.exception("[" + FieldUniqueEnum.convertToTitle(columnStr) + "]数据不允许重复插入");
|
|
|
+ } else if (e instanceof ApiException) {
|
|
|
+ ResultUtil.error((ApiException) e, e.getMessage());
|
|
|
+ } else {
|
|
|
+ ResultUtil.error(e.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 启用/禁用用户
|
|
|
+ *
|
|
|
+ * @param sysUser
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ @Transactional
|
|
|
+ public Boolean enable(SysUser sysUser) throws NoSuchAlgorithmException {
|
|
|
+ this.update(new UpdateWrapper<SysUser>().lambda().set(SysUser::getEnable, sysUser.getEnable()).eq(SysUser::getId, sysUser.getId()));
|
|
|
+ commonCacheService.updateUserCache(sysUser.getId());
|
|
|
+ //如果状态为禁用,需要踢下线重新登录
|
|
|
+ if (!sysUser.getEnable()) {
|
|
|
+ this.removeUserInfo(sysUser.getId(), true);
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ }
|
|
|
}
|