package com.smart.module.sys.service.impl;
import com.smart.common.constant.SystemConstant;
import com.smart.common.dynamicquery.DynamicQuery;
import com.smart.common.model.PageBean;
import com.smart.common.model.Result;
import com.smart.common.util.DateUtils;
import com.smart.common.util.MD5Utils;
import com.smart.common.util.ShiroUtils;
import com.smart.module.sys.entity.SysOrg;
import com.smart.module.sys.entity.SysUser;
import com.smart.module.sys.entity.SysUserRole;
import com.smart.module.sys.repository.SysUserRepository;
import com.smart.module.sys.service.SysUserService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.List;
@Service
public class SysUserServiceImpl implements SysUserService {
@Resource
private DynamicQuery dynamicQuery;
@Resource
private SysUserRepository sysUserRepository;
@Override
@Transactional(rollbackFor=Exception.class)
public Result save(SysUser user) {
String nativeSql = "SELECT * FROM sys_user WHERE username=?";
SysUser sysUser = dynamicQuery.nativeQuerySingleResult(
SysUser.class,nativeSql,new Object[]{user.getUsername()});
if(sysUser!=null){
if(!sysUser.getUserId().equals(user.getUserId())){
return Result.error("用户名重复");
}
}else{
user.setGmtCreate(DateUtils.getTimestamp());
user.setPassword(MD5Utils.encrypt(user.getUsername(), user.getPassword()));
user.setAvatarStatus(SystemConstant.AVATAR_STATUS_NO);
}
user.setGmtModified(DateUtils.getTimestamp());
user.setUserIdCreate(ShiroUtils.getUserId());
sysUserRepository.saveAndFlush(user);
nativeSql = "DELETE FROM sys_user_role WHERE user_id=?";
dynamicQuery.nativeExecuteUpdate(nativeSql,new Object[]{user.getUserId()});
List<Object> roleList = user.getRoleIdList();
if(roleList!=null){
roleList.forEach(roleId->{
SysUserRole userRole = new SysUserRole();
userRole.setUserId(user.getUserId());
userRole.setRoleId(Long.parseLong(roleId.toString()));
dynamicQuery.save(userRole);
});
}
return Result.ok("保存成功");
}
@Override
public Result get(Long userId) {
/**
* 用户信息
*/
String nativeSql = "SELECT * FROM sys_user WHERE user_id=?";
SysUser user = dynamicQuery.nativeQuerySingleResult(
SysUser.class,nativeSql,new Object[]{userId});
/**
* 机构信息
*/
nativeSql = "SELECT * FROM sys_org WHERE org_id=?";
SysOrg sysOrg = dynamicQuery.nativeQuerySingleResult(
SysOrg.class,nativeSql,new Object[]{user.getOrgId()});
if(sysOrg!=null){
user.setOrgName(sysOrg.getName());
}
/**
* 角色信息
*/
nativeSql = "SELECT role_id FROM sys_user_role WHERE user_id=?";
List<Object> roleIdList = dynamicQuery.query(nativeSql,new Object[]{userId});
user.setRoleIdList(roleIdList);
nativeSql = "SELECT role_name FROM sys_role WHERE role_id IN (SELECT role_id FROM sys_user_role WHERE user_id=?)";
List<Object> roleNameList = dynamicQuery.query(nativeSql,new Object[]{userId});
user.setRoleNameList(roleNameList);
return Result.ok(user);
}
@Override
@Transactional(rollbackFor = Exception.class)
public Result delete(Long userId) {
String nativeSql = "DELETE FROM sys_user_role WHERE user_id=?";
dynamicQuery.nativeExecuteUpdate(nativeSql,new Object[]{userId});
nativeSql = "DELETE FROM sys_user WHERE user_id=?";
dynamicQuery.nativeExecuteUpdate(nativeSql,new Object[]{userId});
return Result.ok("删除成功");
}
@Override
public SysUser getUser(String username) {
String nativeSql = "SELECT * FROM sys_user u WHERE username = ?";
return dynamicQuery.nativeQuerySingleResult(SysUser.class,nativeSql,new Object[]{username});
}
@Override
public Result list(SysUser user) {
String nativeSql = "SELECT COUNT(*) FROM sys_user ";
nativeSql += common(user);
Long count = dynamicQuery.nativeQueryCount(nativeSql);
PageBean<SysUser> data = new PageBean<>();
if(count>0){
nativeSql = "SELECT * FROM sys_user ";
nativeSql += common(user);
nativeSql += "ORDER BY gmt_create desc";
Pageable pageable = PageRequest.of(user.getPageNo(),user.getPageSize());
List<SysUser> list = dynamicQuery.nativeQueryPagingList(SysUser.class,pageable,nativeSql);
data = new PageBean(list,count);
}
return Result.ok(data);
}
public String common(SysUser user){
String description = user.getDescription();
String commonSql = "";
if(StringUtils.isNotBlank(description)){
commonSql += "WHERE username like '"+description+"%' ";
commonSql += "OR nickname like '"+description+"%' ";
}
return commonSql;
}
@Override
public List<String> listUserRoles(Long userId) {
String nativeSql = "SELECT r.role_sign FROM sys_user u ";
nativeSql +=" LEFT JOIN sys_user_role ur ON u.user_id = ur.user_id";
nativeSql +=" LEFT JOIN sys_role r ON r.role_id = ur.role_id";
nativeSql +=" WHERE u.user_id = ?";
List<String> list = dynamicQuery.query(nativeSql,new Object[]{userId});
return list;
}
@Override
public List<String> listUserPerms(Long userId) {
String nativeSql = "SELECT DISTINCT m.perms FROM sys_user_role ur";
nativeSql +=" LEFT JOIN sys_role_menu rm ON ur.role_id = rm.role_id";
nativeSql +=" LEFT JOIN sys_menu m ON rm.menu_id = m.menu_id";
nativeSql +=" WHERE ur.user_id = ?";
List<String> list = dynamicQuery.query(nativeSql,new Object[]{userId});
return list;
}
@Override
@Transactional(rollbackFor=Exception.class)
public Result updatePwd(SysUser user) {
String password = MD5Utils.encrypt(user.getUsername(),user.getPassword());
String nativeSql = "UPDATE sys_user SET password=? WHERE user_id=?";
int count = dynamicQuery.nativeExecuteUpdate(nativeSql,new Object[]{password,user.getUserId()});
if(count==1){
return Result.ok("修改成功");
}else{
return Result.ok("修改失败");
}
}
@Override
@Transactional(rollbackFor=Exception.class)
public Result update(SysUser user) {
String nativeSql = "UPDATE sys_user SET nickname=?,email=?,mobile=? WHERE user_id=?";
Object[] params = new Object[]{user.getNickname(),user.getEmail(),user.getMobile(),user.getUserId()};
int count = dynamicQuery.nativeExecuteUpdate(nativeSql,params);
if(count==1){
return Result.ok("更新成功");
}else{
return Result.ok("更新成功");
}
}
@Override
public List<SysUser> listUserByRole(String roleSign) {
return null;
}
}