package com.ruoyi.system.service.impl; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.ruoyi.common.annotation.DataScope; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.domain.entity.SysRole; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.model.LoginBody; import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.exception.CustomException; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.system.domain.SysPost; import com.ruoyi.system.domain.SysUserPost; import com.ruoyi.system.domain.SysUserRole; import com.ruoyi.system.mapper.*; import com.ruoyi.system.service.ISysConfigService; import com.ruoyi.system.service.ISysUserService; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.io.IOException; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; /** * 用户 业务层处理 * * @author ruoyi */ @Service public class SysUserServiceImpl implements ISysUserService { private static final Logger log = LoggerFactory.getLogger(SysUserServiceImpl.class); @Autowired private SysUserMapper userMapper; @Autowired private SysRoleMapper roleMapper; @Autowired private SysPostMapper postMapper; @Autowired private ISysConfigService configService; @Autowired private SysUserRoleMapper userRoleMapper; @Autowired private SysUserPostMapper userPostMapper; // 微信小程序应用id @Value("${wechatProgram.appId}") private String appId; // 微信小程序应用密钥 @Value("${wechatProgram.secret}") private String secret; // 微信小程序获取用户session路径 @Value("${wechatProgram.sessionUrl}") private String sessionUrl; // 仓储微信小程序应用id @Value("${warehouseWechatProgram.appId}") private String warehouseAppId; // 仓储微信小程序应用密钥 @Value("${warehouseWechatProgram.secret}") private String warehouseSecret; // 仓储微信小程序获取用户session路径 @Value("${warehouseWechatProgram.sessionUrl}") private String warehouseSessionUrl; /** * 根据条件分页查询用户列表 * * @param user 用户信息 * @return 用户信息集合信息 */ @Override @DataScope(deptAlias = "d", userAlias = "u") public List selectUserList(SysUser user) { return userMapper.selectUserList(user); } /** * 通过用户名查询用户 * * @param userName 用户名 * @return 用户对象信息 */ @Override public SysUser selectUserByUserName(String userName) { return userMapper.selectUserByUserName(userName); } /** * 通过用户ID查询用户 * * @param userId 用户ID * @return 用户对象信息 */ @Override public SysUser selectUserById(Long userId) { return userMapper.selectUserById(userId); } /** * 查询用户所属角色组 * * @param userName 用户名 * @return 结果 */ @Override public String selectUserRoleGroup(String userName) { List list = roleMapper.selectRolesByUserName(userName); StringBuffer idsStr = new StringBuffer(); for (SysRole role : list) { idsStr.append(role.getRoleName()).append(","); } if (StringUtils.isNotEmpty(idsStr.toString())) { return idsStr.substring(0, idsStr.length() - 1); } return idsStr.toString(); } /** * 查询用户所属岗位组 * * @param userName 用户名 * @return 结果 */ @Override public String selectUserPostGroup(String userName) { List list = postMapper.selectPostsByUserName(userName); StringBuffer idsStr = new StringBuffer(); for (SysPost post : list) { idsStr.append(post.getPostName()).append(","); } if (StringUtils.isNotEmpty(idsStr.toString())) { return idsStr.substring(0, idsStr.length() - 1); } return idsStr.toString(); } /** * 校验用户名称是否唯一 * * @param userName 用户名称 * @return 结果 */ @Override public String checkUserNameUnique(String userName) { int count = userMapper.checkUserNameUnique(userName); if (count > 0) { return UserConstants.NOT_UNIQUE; } return UserConstants.UNIQUE; } /** * 校验用户名称是否唯一 * * @param user 用户信息 * @return */ @Override public String checkPhoneUnique(SysUser user) { Long userId = StringUtils.isNull(user.getUserId()) ? -1L : user.getUserId(); SysUser info = userMapper.checkPhoneUnique(user.getPhonenumber()); if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue()) { return UserConstants.NOT_UNIQUE; } return UserConstants.UNIQUE; } /** * 校验email是否唯一 * * @param user 用户信息 * @return */ @Override public String checkEmailUnique(SysUser user) { Long userId = StringUtils.isNull(user.getUserId()) ? -1L : user.getUserId(); SysUser info = userMapper.checkEmailUnique(user.getEmail()); if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue()) { return UserConstants.NOT_UNIQUE; } return UserConstants.UNIQUE; } /** * 校验用户是否允许操作 * * @param user 用户信息 */ @Override public void checkUserAllowed(SysUser user) { if (StringUtils.isNotNull(user.getUserId()) && user.isAdmin()) { throw new CustomException("不允许操作超级管理员用户"); } } /** * 新增保存用户信息 * * @param user 用户信息 * @return 结果 */ @Override @Transactional public int insertUser(SysUser user) { // 新增用户信息 int rows = userMapper.insertUser(user); // 新增用户岗位关联 insertUserPost(user); // 新增用户与角色管理 insertUserRole(user); return rows; } /** * 修改保存用户信息 * * @param user 用户信息 * @return 结果 */ @Override @Transactional public int updateUser(SysUser user) { Long userId = user.getUserId(); // 删除用户与角色关联 userRoleMapper.deleteUserRoleByUserId(userId); // 新增用户与角色管理 insertUserRole(user); // 删除用户与岗位关联 userPostMapper.deleteUserPostByUserId(userId); // 新增用户与岗位管理 insertUserPost(user); userMapper.updateCarsDriverNamePhone(userId); return userMapper.updateUser(user); } /** * 修改用户状态 * * @param user 用户信息 * @return 结果 */ @Override public int updateUserStatus(SysUser user) { return userMapper.updateUser(user); } /** * 修改用户基本信息 * * @param user 用户信息 * @return 结果 */ @Override public int updateUserProfile(SysUser user) { return userMapper.updateUser(user); } /** * 修改用户头像 * * @param userName 用户名 * @param avatar 头像地址 * @return 结果 */ @Override public boolean updateUserAvatar(String userName, String avatar) { return userMapper.updateUserAvatar(userName, avatar) > 0; } /** * 重置用户密码 * * @param user 用户信息 * @return 结果 */ @Override public int resetPwd(SysUser user) { return userMapper.updateUser(user); } /** * 重置用户密码 * * @param userName 用户名 * @param password 密码 * @return 结果 */ @Override public int resetUserPwd(String userName, String password) { return userMapper.resetUserPwd(userName, password); } /** * 新增用户角色信息 * * @param user 用户对象 */ public void insertUserRole(SysUser user) { Long[] roles = user.getRoleIds(); if (StringUtils.isNotNull(roles)) { // 新增用户与角色管理 List list = new ArrayList(); for (Long roleId : roles) { SysUserRole ur = new SysUserRole(); ur.setUserId(user.getUserId()); ur.setRoleId(roleId); list.add(ur); } if (list.size() > 0) { userRoleMapper.batchUserRole(list); } } } /** * 新增用户岗位信息 * * @param user 用户对象 */ public void insertUserPost(SysUser user) { Long[] posts = user.getPostIds(); if (StringUtils.isNotNull(posts)) { // 新增用户与岗位管理 List list = new ArrayList(); for (Long postId : posts) { SysUserPost up = new SysUserPost(); up.setUserId(user.getUserId()); up.setPostId(postId); list.add(up); } if (list.size() > 0) { userPostMapper.batchUserPost(list); } } } /** * 通过用户ID删除用户 * * @param userId 用户ID * @return 结果 */ @Override public int deleteUserById(Long userId) { // 删除用户与角色关联 userRoleMapper.deleteUserRoleByUserId(userId); // 删除用户与岗位表 userPostMapper.deleteUserPostByUserId(userId); return userMapper.deleteUserById(userId); } /** * 批量删除用户信息 * * @param userIds 需要删除的用户ID * @return 结果 */ @Override public int deleteUserByIds(Long[] userIds) { for (Long userId : userIds) { checkUserAllowed(new SysUser(userId)); } return userMapper.deleteUserByIds(userIds); } /** * 导入用户数据 * * @param userList 用户数据列表 * @param isUpdateSupport 是否更新支持,如果已存在,则进行更新数据 * @param operName 操作用户 * @return 结果 */ @Override public String importUser(List userList, Boolean isUpdateSupport, String operName) { if (StringUtils.isNull(userList) || userList.size() == 0) { throw new CustomException("导入用户数据不能为空!"); } int successNum = 0; int failureNum = 0; StringBuilder successMsg = new StringBuilder(); StringBuilder failureMsg = new StringBuilder(); String password = configService.selectConfigByKey("sys.user.initPassword"); for (SysUser user : userList) { try { // 验证是否存在这个用户 SysUser u = userMapper.selectUserByUserName(user.getUserName()); if (StringUtils.isNull(u)) { user.setPassword(SecurityUtils.encryptPassword(password)); user.setCreateBy(operName); this.insertUser(user); successNum++; successMsg.append("
" + successNum + "、账号 " + user.getUserName() + " 导入成功"); } else if (isUpdateSupport) { user.setUpdateBy(operName); this.updateUser(user); successNum++; successMsg.append("
" + successNum + "、账号 " + user.getUserName() + " 更新成功"); } else { failureNum++; failureMsg.append("
" + failureNum + "、账号 " + user.getUserName() + " 已存在"); } } catch (Exception e) { failureNum++; String msg = "
" + failureNum + "、账号 " + user.getUserName() + " 导入失败:"; failureMsg.append(msg + e.getMessage()); log.error(msg, e); } } if (failureNum > 0) { failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:"); throw new CustomException(failureMsg.toString()); } else { successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:"); } return successMsg.toString(); } @Override public List> selectUserNameFO() { return userMapper.selectUserNameFO(); } /** * 小程序授权小程序 * * @param loginBody 用户信息 * @return 结果 */ @Transactional public SysUser weChatProgramLogin(LoginBody loginBody,String usertype) { //声明客户端 OkHttpClient client = new OkHttpClient(); //构建Request if(usertype.equals("00")){ Request request = new Request.Builder().url(warehouseSessionUrl + "?appid=" + warehouseAppId + "&secret=" + warehouseSecret + "&js_code=" + loginBody.getCode() + "&grant_type=authorization_code").build(); try { Response response = client.newCall(request).execute(); //如果请求成功,解析数据 if (response.isSuccessful()) { String body = response.body().string(); //得到一个JSON对象 JSONObject object = JSON.parseObject(body); String openid = object.getString("openid"); String sessionKey = object.getString("session_key"); if (StringUtils.isNotEmpty(openid)) { log.info("通过code获取用户openId异常:" + object.toJSONString()); SysUser sysUser = new SysUser(); sysUser.setOpenId(openid); sysUser.setSessionKey(sessionKey); return sysUser; } } } catch (IOException e) { e.printStackTrace(); log.info("用户获取openId异常:" + e); } }else{ Request request = new Request.Builder().url(sessionUrl + "?appid=" + appId + "&secret=" + secret + "&js_code=" + loginBody.getCode() + "&grant_type=authorization_code").build(); try { Response response = client.newCall(request).execute(); //如果请求成功,解析数据 if (response.isSuccessful()) { String body = response.body().string(); //得到一个JSON对象 JSONObject object = JSON.parseObject(body); String openid = object.getString("openid"); String sessionKey = object.getString("session_key"); if (StringUtils.isNotEmpty(openid)) { log.info("通过code获取用户openId异常:" + object.toJSONString()); SysUser sysUser = new SysUser(); sysUser.setOpenId(openid); sysUser.setSessionKey(sessionKey); return sysUser; } } } catch (IOException e) { e.printStackTrace(); log.info("用户获取openId异常:" + e); } } return null; } // 用户关注公众号 @Transactional public boolean attention(SysUser sysUser) { sysUser.setUserType("11"); SysUser user = userMapper.selectUserByopenId(sysUser.getOpenId()); if (StringUtils.isNotNull(user)) { sysUser.setRelatedNo("T"); // 存在并且已经授权小程序了 userMapper.updateUserRelatedNo(sysUser); return true; } sysUser.setStatus("1"); sysUser.setDelFlag("2"); userMapper.insertUser(sysUser); return false; } // 用户取关公众号 @Transactional public boolean unsubscribe(SysUser sysUser) { SysUser user = userMapper.selectUserByopenId(sysUser.getOpenId()); if (StringUtils.isNotNull(user)) { if ("1".equals(user.getStatus()) && "2".equals(user.getDelFlag())) { // 没有授权小程序的 暂时性公众号 userMapper.deleteUserById(user.getUserId()); return true; } else { sysUser.setRelatedNo("F"); userMapper.unsubscribeUserRelatedNo(sysUser); return true; } } return false; } // 获取用户手机号更新对应信息 @Transactional public LoginUser createOrUpdateUser(SysUser user) { LoginUser loginUser = new LoginUser(); // 判断是否提前存储过 SysUser sysUser = userMapper.selectUserByopenId(user.getOpenId()); boolean related = false; if (StringUtils.isNotNull(sysUser)) { if ("1".equals(user.getStatus()) && "2".equals(user.getDelFlag())) { // 提前关注公众号的信息 userMapper.deleteUserById(user.getUserId()); related = true; } } // 判断是否创建了驾驶员 SysUser pUser = userMapper.selectUserByTel(user.getPhonenumber()); if (StringUtils.isNotNull(pUser)) { // 创建过 pUser.setOpenId(user.getOpenId()); if (related) { pUser.setRelatedNo("T"); } pUser.setSessionKey(user.getSessionKey()); userMapper.updateUser(pUser); loginUser.setUser(pUser); } else { // 没有创建 则创建临时性用户数据 user.setNickName(" "); user.setUserName(user.getPhonenumber()); user.setStatus("1"); user.setStatus("1"); user.setDelFlag("2"); user.setUserType("11"); user.setCreateTime(new Date()); userMapper.insertUser(user); loginUser.setUser(user); } return loginUser; } /** * 根据手机号生成token数据 * @param loginBody 参数 * @return 结果 */ public SysUser selectUserByPhone(LoginBody loginBody ,String usertype) { if(usertype.equals("00")){ return userMapper.warehouseSelectUserByTel(loginBody.getPhonenumber()); }else { return userMapper.selectUserByTel(loginBody.getPhonenumber()); } } // 获取用户手机号更新对应信息 @Transactional public LoginUser warehouseCreateOrUpdateUser(SysUser user) { LoginUser loginUser = new LoginUser(); // 判断是否提前存储过 SysUser sysUser = userMapper.selectUserByopenId(user.getOpenId()); boolean related = false; if (StringUtils.isNotNull(sysUser)) { if ("1".equals(user.getStatus()) && "2".equals(user.getDelFlag())) { // 提前关注公众号的信息 userMapper.deleteUserById(user.getUserId()); related = true; } } // 判断是否创建了驾驶员 SysUser pUser = userMapper.warehouseSelectUserByTel(user.getPhonenumber()); if (StringUtils.isNotNull(pUser)) { // 创建过 pUser.setOpenId(user.getOpenId()); if (related) { pUser.setRelatedNo("T"); } pUser.setSessionKey(user.getSessionKey()); userMapper.updateUser(pUser); loginUser.setUser(pUser); } else { // 没有创建 则创建临时性用户数据 user.setNickName(" "); user.setUserName(user.getPhonenumber()); user.setStatus("1"); user.setStatus("1"); user.setDelFlag("2"); user.setUserType("00"); user.setCreateTime(new Date()); userMapper.insertUser(user); loginUser.setUser(user); } return loginUser; } }