refactor: 统一代码格式,优化注释风格

This commit is contained in:
PIG AI committed 2025-07-05 09:11:13 +08:00
1 parent bcfeec31bc
commit dc0e814522
86 files changed
+2532 -2518

No files matched your search

@@ -10,31 +10,33 @@ package com.pig4cloud.pigx.admin.api.constant;
*/
public enum PostCodeEnum {
/**
* 部门负责人
*/
TEAM_LEADER("TEAM_LEADER", "部门负责人");
/**
* 编码
*/
private final String code;
/**
* 部门负责人
*/
TEAM_LEADER("TEAM_LEADER", "部门负责人");
/**
* 描述
*/
private final String description;
/**
* 编码
*/
private final String code;
PostCodeEnum(String code, String description) {
this.code = code;
this.description = description;
}
/**
* 描述
*/
private final String description;
public String getCode() {
return code;
}
PostCodeEnum(String code, String description) {
this.code = code;
this.description = description;
}
public String getCode() {
return code;
}
public String getDescription() {
return description;
}
public String getDescription() {
return description;
}
}
@@ -20,4 +20,5 @@ public enum SmsBizCodeEnum {
private final String code;
private final String desc;
}
@@ -11,6 +11,7 @@ import lombok.RequiredArgsConstructor;
*/
@RequiredArgsConstructor
public enum SystemConfigTypeEnum {
/**
* 存储
*/
@@ -28,7 +29,6 @@ public enum SystemConfigTypeEnum {
*/
EMAIL("email"),
/**
* webhook
*/
@@ -48,7 +48,6 @@ public enum SystemConfigTypeEnum {
WETALK("wetalk");
@Getter
private final String value;
private final String value;
}
@@ -20,4 +20,5 @@ public class AiChatMessageDTO {
* 网络搜索
*/
private boolean webSearch;
}
@@ -20,56 +20,56 @@ import java.util.Map;
@FieldNameConstants
public class MessageEmailDTO {
/**
* 邮件列表
*/
@NotNull
private List<String> mailAddress = new ArrayList<>();
/**
* 邮件列表
*/
@NotNull
private List<String> mailAddress = new ArrayList<>();
/**
* 标题
*/
@NotBlank
private String title;
/**
* 标题
*/
@NotBlank
private String title;
/**
* body
*/
private String body;
/**
* body
*/
private String body;
/**
* [HTML全文]
*/
private String html;
/**
* [HTML全文]
*/
private String html;
/**
* HTML 值
*/
private Map<String, String> htmlValues = new HashMap<>();
/**
* HTML 值
*/
private Map<String, String> htmlValues = new HashMap<>();
/**
* CC 列表
*/
private List<String> ccList = new ArrayList<>();
/**
* CC 列表
*/
private List<String> ccList = new ArrayList<>();
/**
* 密件抄送列表
*/
private List<String> bccList = new ArrayList<>();
/**
* 密件抄送列表
*/
private List<String> bccList = new ArrayList<>();
/**
* 附件文件 (fileName)
*/
private List<String> attachmentList = new ArrayList<>();
/**
* 附件文件 (fileName)
*/
private List<String> attachmentList = new ArrayList<>();
/**
* ZIP 名称
*/
private String zipName;
/**
* ZIP 名称
*/
private String zipName;
/**
* 业务代码
*/
private String bizCode;
/**
* 业务代码
*/
private String bizCode;
}
@@ -16,7 +16,6 @@ import java.util.List;
@FieldNameConstants
public class MessageHookDTO {
/**
* 业务代码
*/
@@ -27,19 +26,16 @@ public class MessageHookDTO {
*/
private List<String> phoneList = new ArrayList<>();
/**
* 通知全部
*/
private boolean noticeAll;
/**
* 消息类型
*/
private String messageType;
/**
* 留言内容
*/
@@ -57,7 +53,7 @@ public class MessageHookDTO {
/**
* 图片链接
*/
private String picUrl;
*/
private String picUrl;
}
@@ -50,14 +50,19 @@ public class MessageSmsDTO {
*/
private String supplier;
/**
* 模板 ID
*/
private String templateId;
// 静态方法用于创建Builder实例
public static Builder builder() {
return new Builder();
}
// Builder类
public static class Builder {
private MessageSmsDTO dto;
public Builder() {
@@ -90,10 +95,7 @@ public class MessageSmsDTO {
public MessageSmsDTO build() {
return dto;
}
}
// 静态方法用于创建Builder实例
public static Builder builder() {
return new Builder();
}
}
@@ -11,28 +11,29 @@ import lombok.Data;
@Data
public class RegisterUserDTO {
/**
* 用户名
*/
private String username;
/**
* 用户名
*/
private String username;
/**
* 密码
*/
private String password;
/**
* 密码
*/
private String password;
/**
* 新密码1
*/
private String newpassword1;
/**
* 新密码1
*/
private String newpassword1;
/**
* 电话
*/
private String phone;
/**
* 电话
*/
private String phone;
/**
* 租户ID
*/
private Long tenantId;
/**
* 租户ID
*/
private Long tenantId;
}
@@ -11,28 +11,29 @@ import lombok.Data;
@Data
public class SysTenantUserDTO {
/**
* 租户ID
*/
private Long tenantId;
/**
* 租户ID
*/
private Long tenantId;
/**
* 用户ID数组
*/
private Long[] userIds;
/**
* 用户ID数组
*/
private Long[] userIds;
/**
* 角色ID
*/
private Long roleId;
/**
* 角色ID
*/
private Long roleId;
/**
* 帖子ID
*/
private Long postId;
/**
* 帖子ID
*/
private Long postId;
/**
* 部门ID
*/
private Long deptId;
/**
* 部门ID
*/
private Long deptId;
}
@@ -40,22 +40,22 @@ import java.util.List;
@EqualsAndHashCode(callSuper = true)
public class UserInfo extends UserVO implements Serializable {
/**
* 密码
*/
@JsonIgnore(value = false)
private String password;
/**
* 密码
*/
@JsonIgnore(value = false)
private String password;
/**
* 随机盐
*/
@JsonIgnore(value = false)
private String salt;
/**
* 随机盐
*/
@JsonIgnore(value = false)
private String salt;
/**
* 权限标识集合
*/
@Schema(description = "权限标识集合")
private List<String> permissions = new ArrayList<>();
/**
* 权限标识集合
*/
@Schema(description = "权限标识集合")
private List<String> permissions = new ArrayList<>();
}
@@ -22,7 +22,6 @@ import java.time.LocalDateTime;
@Schema(description = "行政区划表")
public class SysAreaEntity extends Model<SysAreaEntity> {
/**
* 主键ID
*/
@@ -123,6 +122,7 @@ public class SysAreaEntity extends Model<SysAreaEntity> {
*/
@TableLogic
@TableField(fill = FieldFill.INSERT)
@Schema(description = "删除标记")
private String delFlag;
@Schema(description = "删除标记")
private String delFlag;
}
@@ -132,7 +132,7 @@ public class SysFile extends Model<SysFile> {
*/
@TableLogic
@TableField(fill = FieldFill.INSERT)
@Schema(description = "删除标记,1:已删除,0:正常")
private String delFlag;
@Schema(description = "删除标记,1:已删除,0:正常")
private String delFlag;
}
@@ -154,7 +154,7 @@ public class SysMenu extends Model<SysMenu> {
*/
@TableLogic
@TableField(fill = FieldFill.INSERT)
@Schema(description = "删除标记,1:已删除,0:正常")
private String delFlag;
@Schema(description = "删除标记,1:已删除,0:正常")
private String delFlag;
}
@@ -117,6 +117,6 @@ public class SysRouteConf extends Model<SysRouteConf> {
@TableLogic
@TableField(fill = FieldFill.INSERT)
@Schema(description = "删除标记,1:已删除,0:正常")
private String delFlag;
private String delFlag;
}
@@ -120,7 +120,7 @@ public class SysScheduleEntity extends Model<SysScheduleEntity> {
*/
@TableLogic
@Schema(description = "删除标记")
@TableField(fill = FieldFill.INSERT)
private String delFlag;
@TableField(fill = FieldFill.INSERT)
private String delFlag;
}
@@ -22,71 +22,71 @@ import java.time.LocalDateTime;
@Schema(description = "敏感词")
public class SysSensitiveWordEntity extends Model<SysSensitiveWordEntity> {
/**
* 主键
*/
* 主键
*/
@TableId(type = IdType.ASSIGN_ID)
@Schema(description="主键")
@Schema(description = "主键")
private Long sensitiveId;
/**
* 敏感词
*/
@Schema(description="敏感词")
* 敏感词
*/
@Schema(description = "敏感词")
private String sensitiveWord;
/**
* 类型
*/
@Schema(description="类型")
* 类型
*/
@Schema(description = "类型")
private String sensitiveType;
/**
* 备注
*/
@Schema(description="备注")
* 备注
*/
@Schema(description = "备注")
private String remark;
/**
* 创建人
*/
* 创建人
*/
@TableField(fill = FieldFill.INSERT)
@Schema(description="创建人")
@Schema(description = "创建人")
private String createBy;
/**
* 创建时间
*/
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
@Schema(description="创建时间")
@Schema(description = "创建时间")
private LocalDateTime createTime;
/**
* 修改人
*/
* 修改人
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
@Schema(description="修改人")
@Schema(description = "修改人")
private String updateBy;
/**
* 修改时间
*/
* 修改时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
@Schema(description="修改时间")
@Schema(description = "修改时间")
private LocalDateTime updateTime;
/**
* 删除标记
*/
* 删除标记
*/
@TableLogic
@TableField(fill = FieldFill.INSERT)
@Schema(description="删除标记")
@Schema(description = "删除标记")
private String delFlag;
/**
* 租户ID
*/
@Schema(description="租户ID")
* 租户ID
*/
@Schema(description = "租户ID")
private Long tenantId;
}
@@ -24,83 +24,83 @@ import java.time.LocalDateTime;
@Schema(description = "系统配置")
public class SysSystemConfigEntity extends Model<SysSystemConfigEntity> {
/**
* 主键
*/
* 主键
*/
@TableId(type = IdType.ASSIGN_ID)
@Schema(description="主键")
@Schema(description = "主键")
private Long id;
/**
* 配置类型
*/
@Schema(description="配置类型")
* 配置类型
*/
@Schema(description = "配置类型")
private String configType;
/**
* 配置名称
*/
@Schema(description="配置名称")
* 配置名称
*/
@Schema(description = "配置名称")
private String configName;
/**
* 配置标识
*/
@Schema(description="配置标识")
* 配置标识
*/
@Schema(description = "配置标识")
private String configKey;
/**
* 配置值
*/
@Schema(description="配置值")
* 配置值
*/
@Schema(description = "配置值")
private String configValue;
/**
* 开启状态
*/
@Schema(description="开启状态")
* 开启状态
*/
@Schema(description = "开启状态")
private String configStatus;
/**
* 创建人
*/
* 创建人
*/
@TableField(fill = FieldFill.INSERT)
@Schema(description="创建人")
@Schema(description = "创建人")
private String createBy;
/**
* 创建时间
*/
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
@Schema(description="创建时间")
@Schema(description = "创建时间")
private LocalDateTime createTime;
/**
* 修改人
*/
* 修改人
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
@Schema(description="修改人")
@Schema(description = "修改人")
private String updateBy;
/**
* 修改时间
*/
* 修改时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
@Schema(description="修改时间")
@Schema(description = "修改时间")
private LocalDateTime updateTime;
/**
* 删除标记
*/
* 删除标记
*/
@TableLogic
@TableField(fill = FieldFill.INSERT)
@Schema(description="删除标记")
@Schema(description = "删除标记")
private String delFlag;
/**
* 租户ID
*/
@Schema(description="租户ID")
* 租户ID
*/
@Schema(description = "租户ID")
private Long tenantId;
}
@@ -37,19 +37,19 @@ import java.io.Serial;
@EqualsAndHashCode(callSuper = true)
public class SysTenantUser extends Model<SysTenantUser> {
@Serial
private static final long serialVersionUID = 1L;
@Serial
private static final long serialVersionUID = 1L;
/**
* 用户ID
*/
@Schema(description = "用户id")
private Long userId;
/**
* 用户ID
*/
@Schema(description = "用户id")
private Long userId;
/**
* 租户ID
*/
@Schema(description = "租户ID")
private Long tenantId;
/**
* 租户ID
*/
@Schema(description = "租户ID")
private Long tenantId;
}
@@ -124,14 +124,12 @@ public class SysUser extends Model<SysUser> implements Serializable {
@Schema(description = "密码过期标记")
private String passwordExpireFlag;
/**
* 密码修改时间
*/
@Schema(description = "密码修改时间")
private LocalDateTime passwordModifyTime;
/**
* 手机号
*/
@@ -146,7 +144,6 @@ public class SysUser extends Model<SysUser> implements Serializable {
@Schema(description = "头像地址")
private String avatar;
/**
* 租户ID
*/
@@ -214,4 +211,5 @@ public class SysUser extends Model<SysUser> implements Serializable {
@PropertyName("邮箱")
@Schema(description = "邮箱")
private String email;
}
@@ -35,7 +35,7 @@ import java.io.Serial;
@EqualsAndHashCode(callSuper = true)
public class SysUserPost extends Model<SysUserPost> {
@Serial
@Serial
private static final long serialVersionUID = 1L;
/**
@@ -50,10 +50,10 @@ public class SysUserPost extends Model<SysUserPost> {
@Schema(description = "岗位id")
private Long postId;
/**
* 租户ID
*/
@Schema(description = "租户ID")
private Long tenantId;
}
@@ -41,26 +41,25 @@ import java.io.Serial;
@EqualsAndHashCode(callSuper = true)
public class SysUserRole extends Model<SysUserRole> {
@Serial
private static final long serialVersionUID = 1L;
@Serial
private static final long serialVersionUID = 1L;
/**
* 用户ID
*/
@Schema(description = "用户id")
private Long userId;
/**
* 用户ID
*/
@Schema(description = "用户id")
private Long userId;
/**
* 角色ID
*/
@Schema(description = "角色id")
private Long roleId;
/**
* 角色ID
*/
@Schema(description = "角色id")
private Long roleId;
/**
* 租户ID
*/
@Schema(description = "租户ID")
private Long tenantId;
/**
* 租户ID
*/
@Schema(description = "租户ID")
private Long tenantId;
}
@@ -21,33 +21,33 @@ import org.springframework.web.multipart.MultipartFile;
@FeignClient(contextId = "remoteFileService", value = ServiceNameConstants.UPMS_SERVICE)
public interface RemoteFileService {
/**
* 获取文件的方法
*
* @param fileName 文件的名称
* @return 响应对象,包含文件内容
*/
@GetMapping("/sys-file/oss/file")
Response getFile(@RequestParam String fileName);
/**
* 获取文件的方法
*
* @param fileName 文件的名称
* @return 响应对象,包含文件内容
*/
@GetMapping("/sys-file/oss/file")
Response getFile(@RequestParam String fileName);
/**
* 上传文件
*
* @param file 资源
* @return R(/ admin / bucketName / filename)
*/
@PostMapping(value = "/sys-file/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
R upload(@RequestPart("file") MultipartFile file);
/**
* 上传文件
*
* @param file 资源
* @return R(/ admin / bucketName / filename)
*/
@PostMapping(value = "/sys-file/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
R upload(@RequestPart("file") MultipartFile file);
/**
* 内部上传文件接口
*
* @param file 要上传的文件
* @param fileName 文件名
* @return 上传结果
*/
@NoToken
@PostMapping(value = "/sys-file/inner/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
R innerUpload(@RequestPart("file") MultipartFile file, @RequestParam String fileName);
/**
* 内部上传文件接口
*
* @param file 要上传的文件
* @param fileName 文件名
* @return 上传结果
*/
@NoToken
@PostMapping(value = "/sys-file/inner/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
R innerUpload(@RequestPart("file") MultipartFile file, @RequestParam String fileName);
}
@@ -39,23 +39,22 @@ import java.util.List;
@FeignClient(contextId = "remoteMenuService", value = ServiceNameConstants.UPMS_SERVICE)
public interface RemoteMenuService {
/**
* 获取菜单详细信息
*
* @param sysMenu SYS菜单
* @return {@link R }<{@link List }<{@link SysMenu }>>
*/
@GetMapping("/menu/details")
R<List<SysMenu>> getMenuDetails(@SpringQueryMap SysMenu sysMenu);
/**
* 获取菜单详细信息
*
* @param sysMenu SYS菜单
* @return {@link R }<{@link List }<{@link SysMenu }>>
*/
@GetMapping("/menu/details")
R<List<SysMenu>> getMenuDetails(@SpringQueryMap SysMenu sysMenu);
/**
* 保存菜单
*
* @param sysMenu SYS菜单
* @return {@link R }<{@link Boolean }>
*/
@PostMapping("/menu")
R<SysMenu> saveMenu(@RequestBody SysMenu sysMenu);
/**
* 保存菜单
*
* @param sysMenu SYS菜单
* @return {@link R }<{@link Boolean }>
*/
@PostMapping("/menu")
R<SysMenu> saveMenu(@RequestBody SysMenu sysMenu);
}
@@ -37,7 +37,6 @@ import org.springframework.web.bind.annotation.RequestBody;
@FeignClient(contextId = "remoteMessageService", value = ServiceNameConstants.UPMS_SERVICE)
public interface RemoteMessageService {
/**
* 发送短消息
*
@@ -64,4 +63,5 @@ public interface RemoteMessageService {
*/
@PostMapping("/sysMessage/send/hook")
R sendHook(@RequestBody MessageHookDTO hookDTO);
}
@@ -38,7 +38,6 @@ import java.util.List;
@FeignClient(contextId = "remoteRouteConfService", value = ServiceNameConstants.UPMS_SERVICE)
public interface RemoteRouteConfService {
/**
* 获取路由详细信息
*
@@ -47,7 +46,6 @@ public interface RemoteRouteConfService {
@GetMapping("/route")
R<List<SysRouteConf>> getRouteDetails();
/**
* 保存 sys route conf
*
@@ -56,4 +54,5 @@ public interface RemoteRouteConfService {
*/
@PostMapping("/route/save")
R<SysRouteConf> saveSysRouteConf(@RequestBody SysRouteConf SysRouteConf);
}
@@ -46,9 +46,7 @@ public class DataUtil {
optionalDept.ifPresent(list::add);
List<SysDept> collect = allDeptList.stream()
.filter(w -> w.getParentId() == deptId)
.toList();
List<SysDept> collect = allDeptList.stream().filter(w -> w.getParentId() == deptId).toList();
if (CollUtil.isEmpty(collect)) {
return list;
@@ -72,9 +70,7 @@ public class DataUtil {
List<SysMenu> list = new ArrayList<>();
list.add(allMenuList.stream().filter(w -> w.getMenuId() == menuId).findFirst().get());
List<SysMenu> collect = allMenuList.stream()
.filter(w -> w.getParentId() == menuId)
.toList();
List<SysMenu> collect = allMenuList.stream().filter(w -> w.getParentId() == menuId).toList();
if (CollUtil.isEmpty(collect)) {
return list;
}
@@ -29,4 +29,5 @@ public class SysSocialDetailsVO {
*/
@Schema(description = "扩展字段")
private String ext;
}
@@ -54,9 +54,9 @@ public class SysSystemSmsConfigVO {
*/
private int retryInterval = 5;
/**
* 最大发送数量,默认integer上限
*/
private int maximum = Integer.MAX_VALUE;
}
@@ -75,7 +75,7 @@ public class UserExcelVO implements Serializable {
*/
@NotBlank(message = "部门名称不能为空")
@ExcelProperty("部门名称")
private String deptNameList;
private String deptNameList;
/**
* 角色列表
@@ -153,14 +153,12 @@ public class UserVO implements Serializable {
@Schema(description = "头像")
private String avatar;
/**
* 租户ID
*/
@Schema(description = "所属租户")
private Long tenantId;
@Schema(description = "所属部门名称")
private List<SysDept> deptList;
@@ -186,13 +184,12 @@ public class UserVO implements Serializable {
* 姓名
*/
@Schema(description = "姓名")
private String name;
/**
* 邮箱
*/
@Schema(description = "邮箱")
private String email;
private String name;
/**
* 邮箱
*/
@Schema(description = "邮箱")
private String email;
}
@@ -56,62 +56,62 @@ import java.util.Map;
@ConditionalOnDiscoveryEnabled
public class DynamicRouteInitRunner implements InitializingBean {
private final RedisTemplate<String, String> redisTemplate;
private final RedisTemplate<String, String> redisTemplate;
private final SysRouteConfService routeConfService;
private final SysRouteConfService routeConfService;
private final RedisMessageListenerContainer listenerContainer;
private final RedisMessageListenerContainer listenerContainer;
/**
* WebServerInitializedEvent 使用 TransactionalEventListener 时启动时无法获取到事件
*/
@Async
@Order
@EventListener({WebServerInitializedEvent.class})
public void WebServerInit() {
this.initRoute();
}
/**
* WebServerInitializedEvent 使用 TransactionalEventListener 时启动时无法获取到事件
*/
@Async
@Order
@EventListener({WebServerInitializedEvent.class})
public void WebServerInit() {
this.initRoute();
}
@Async
@Order
@TransactionalEventListener({DynamicRouteInitEvent.class})
public void initRoute() {
redisTemplate.delete(CacheConstants.ROUTE_KEY);
log.info("开始初始化网关路由");
@Async
@Order
@TransactionalEventListener({DynamicRouteInitEvent.class})
public void initRoute() {
redisTemplate.delete(CacheConstants.ROUTE_KEY);
log.info("开始初始化网关路由");
routeConfService.list().forEach(route -> {
RouteDefinitionVo vo = new RouteDefinitionVo();
vo.setRouteName(route.getRouteName());
vo.setId(route.getRouteId());
vo.setUri(URI.create(route.getUri()));
vo.setOrder(route.getSortOrder());
routeConfService.list().forEach(route -> {
RouteDefinitionVo vo = new RouteDefinitionVo();
vo.setRouteName(route.getRouteName());
vo.setId(route.getRouteId());
vo.setUri(URI.create(route.getUri()));
vo.setOrder(route.getSortOrder());
JSONArray filterObj = JSONUtil.parseArray(route.getFilters());
vo.setFilters(filterObj.toList(FilterDefinition.class));
JSONArray predicateObj = JSONUtil.parseArray(route.getPredicates());
vo.setPredicates(predicateObj.toList(PredicateDefinition.class));
vo.setMetadata(JSONUtil.toBean(route.getMetadata(), Map.class));
log.info("加载路由ID:{},{}", route.getRouteId(), vo);
JSONArray filterObj = JSONUtil.parseArray(route.getFilters());
vo.setFilters(filterObj.toList(FilterDefinition.class));
JSONArray predicateObj = JSONUtil.parseArray(route.getPredicates());
vo.setPredicates(predicateObj.toList(PredicateDefinition.class));
vo.setMetadata(JSONUtil.toBean(route.getMetadata(), Map.class));
log.info("加载路由ID:{},{}", route.getRouteId(), vo);
redisTemplate.setHashValueSerializer(new Jackson2JsonRedisSerializer<>(RouteDefinitionVo.class));
HashOperations<String, String, RouteDefinitionVo> stringStringValueOperations = redisTemplate.opsForHash();
stringStringValueOperations.put(CacheConstants.ROUTE_KEY, route.getRouteId(), vo);
});
redisTemplate.setHashValueSerializer(new Jackson2JsonRedisSerializer<>(RouteDefinitionVo.class));
HashOperations<String, String, RouteDefinitionVo> stringStringValueOperations = redisTemplate.opsForHash();
stringStringValueOperations.put(CacheConstants.ROUTE_KEY, route.getRouteId(), vo);
});
// 通知网关重置路由
redisTemplate.convertAndSend(CacheConstants.ROUTE_JVM_RELOAD_TOPIC, "路由信息,网关缓存更新");
log.debug("初始化网关路由结束 ");
}
// 通知网关重置路由
redisTemplate.convertAndSend(CacheConstants.ROUTE_JVM_RELOAD_TOPIC, "路由信息,网关缓存更新");
log.debug("初始化网关路由结束 ");
}
/**
* redis 监听配置,监听 upms_redis_route_reload_topic,重新加载Redis
*/
@Override
public void afterPropertiesSet() {
listenerContainer.addMessageListener((message, bytes) -> {
log.warn("接收到重新Redis 重新加载路由事件");
initRoute();
}, new ChannelTopic(CacheConstants.ROUTE_REDIS_RELOAD_TOPIC));
}
/**
* redis 监听配置,监听 upms_redis_route_reload_topic,重新加载Redis
*/
@Override
public void afterPropertiesSet() {
listenerContainer.addMessageListener((message, bytes) -> {
log.warn("接收到重新Redis 重新加载路由事件");
initRoute();
}, new ChannelTopic(CacheConstants.ROUTE_REDIS_RELOAD_TOPIC));
}
}
@@ -25,26 +25,26 @@ import java.util.Optional;
@RequiredArgsConstructor
public class AiChatController {
private final Optional<DeepSeekClient> deepSeekClientOptional;
private final Optional<DeepSeekClient> deepSeekClientOptional;
/**
* 聊天
*
* @param message 消息
* @return {@link Flux }<{@link ChatCompletionResponse }>
*/
@PostMapping("/chat")
public Flux<ChatCompletionResponse> chat(@RequestBody AiChatMessageDTO message) {
/**
* 聊天
*
* @param message 消息
* @return {@link Flux }<{@link ChatCompletionResponse }>
*/
@PostMapping("/chat")
public Flux<ChatCompletionResponse> chat(@RequestBody AiChatMessageDTO message) {
if (deepSeekClientOptional.isEmpty()) {
log.warn("DeepSeek 大模型聊天未开启,请检查配置");
return Flux.empty();
}
if (deepSeekClientOptional.isEmpty()) {
log.warn("DeepSeek 大模型聊天未开启,请检查配置");
return Flux.empty();
}
if (message.isWebSearch()) {
return deepSeekClientOptional.get().chatSearchCompletion(message.getMessage());
}
return deepSeekClientOptional.get().chatFluxCompletion(message.getMessage());
}
if (message.isWebSearch()) {
return deepSeekClientOptional.get().chatSearchCompletion(message.getMessage());
}
return deepSeekClientOptional.get().chatFluxCompletion(message.getMessage());
}
}
@@ -32,7 +32,6 @@ public class ConnectController {
/**
* 同步钉钉用户信息
*
* @return 操作结果
*/
@PostMapping("/sync/ding/user")
@@ -46,7 +45,6 @@ public class ConnectController {
/**
* 同步钉钉部门信息
*
* @return 同步操作结果
* @see R
*/
@@ -58,7 +56,6 @@ public class ConnectController {
/**
* 同步企业微信用户信息
*
* @return 同步操作结果
*/
@PostMapping("/sync/cp/user")
@@ -69,7 +66,6 @@ public class ConnectController {
/**
* 同步企业微信部门信息
*
* @return 包含同步结果的响应对象
*/
@PostMapping("/sync/cp/dept")
@@ -128,8 +128,8 @@ public class SysAreaController {
@GetMapping("/export")
@HasPermission("sys_sysArea_export")
public List<SysAreaEntity> export(SysAreaEntity sysArea, Long[] ids) {
return sysAreaService
.list(Wrappers.lambdaQuery(sysArea).in(ArrayUtil.isNotEmpty(ids), SysAreaEntity::getId, CollUtil.toList(ids)));
}
return sysAreaService.list(Wrappers.lambdaQuery(sysArea)
.in(ArrayUtil.isNotEmpty(ids), SysAreaEntity::getId, CollUtil.toList(ids)));
}
}
@@ -110,7 +110,8 @@ public class SysAuditLogController {
@GetMapping("/export")
@HasPermission("sys_audit_export")
public List<SysAuditLog> export(SysAuditLog sysAuditLog, Long[] ids) {
return sysAuditLogService
.list(Wrappers.lambdaQuery(sysAuditLog).in(ArrayUtil.isNotEmpty(ids), SysAuditLog::getId, CollUtil.toList(ids)));
return sysAuditLogService.list(Wrappers.lambdaQuery(sysAuditLog)
.in(ArrayUtil.isNotEmpty(ids), SysAuditLog::getId, CollUtil.toList(ids)));
}
}
@@ -167,8 +167,7 @@ public class SysDictController {
.like(StrUtil.isNotBlank(name), SysDict::getDictType, name)
.or()
.like(StrUtil.isNotBlank(name), SysDict::getDescription, name)
.orderByDesc(SysDict::getCreateTime)
));
.orderByDesc(SysDict::getCreateTime)));
}
/**
@@ -185,7 +184,6 @@ public class SysDictController {
/**
* 通过id查询字典项
*
* @param id id
* @return R
*/
@@ -196,7 +194,6 @@ public class SysDictController {
/**
* 查询字典项详情
*
* @param query 查询条件
* @return R
*/
@@ -220,7 +217,6 @@ public class SysDictController {
/**
* 修改字典项
*
* @param sysDictItem 字典项
* @return R
*/
@@ -232,7 +228,6 @@ public class SysDictController {
/**
* 通过id删除字典项
*
* @param id id
* @return R
*/
@@ -251,12 +246,12 @@ public class SysDictController {
@PutMapping("/sync")
public R sync() {
return sysDictService.syncDictCache();
}
}
@ResponseExcel
@GetMapping("/export")
public List<SysDictItem> export(SysDictItem sysDictItem) {
return sysDictItemService.list(Wrappers.query(sysDictItem));
}
@ResponseExcel
@GetMapping("/export")
public List<SysDictItem> export(SysDictItem sysDictItem) {
return sysDictItemService.list(Wrappers.query(sysDictItem));
}
}
@@ -114,7 +114,6 @@ public class SysFileController {
return sysFileService.uploadFile(file, fileName, dir, groupId, type);
}
/**
* 内部文件上传接口
*
@@ -127,14 +126,14 @@ public class SysFileController {
*/
@Inner
@PostMapping(value = "/inner/upload")
public R innerUpload(@RequestPart("file") MultipartFile file, @RequestParam(value = "dir", required = false) String dir,
public R innerUpload(@RequestPart("file") MultipartFile file,
@RequestParam(value = "dir", required = false) String dir,
@RequestParam(value = "groupId", required = false) Long groupId,
@RequestParam(value = "type", required = false) String type,
@RequestParam(value = "fileName", required = false) String fileName) {
return sysFileService.uploadFile(file, fileName, dir, groupId, type);
}
/**
* 获取文件
*
@@ -165,7 +164,6 @@ public class SysFileController {
/**
* 查询文件组列表
*
* @param fileGroup SysFileGroup对象,用于筛选条件
* @return 包含文件组列表的R对象
*/
@@ -176,7 +174,6 @@ public class SysFileController {
/**
* 添加文件组
*
* @param fileGroup SysFileGroup对象,要添加的文件组信息
* @return 包含添加结果的R对象
*/
@@ -198,7 +195,6 @@ public class SysFileController {
/**
* 删除文件组
*
* @param id 待删除文件组的ID
* @return 包含删除结果的R对象
*/
@@ -209,13 +205,12 @@ public class SysFileController {
/**
* 移动文件组
*
* @param fileGroupDTO SysFileGroupDTO对象,要移动的文件组信息
* @return 包含移动结果的R对象
*/
@PutMapping("/group/move")
public R moveFileGroup(@RequestBody SysFileGroupDTO fileGroupDTO) {
return R.ok(sysFileService.moveFileGroup(fileGroupDTO));
}
*/
@PutMapping("/group/move")
public R moveFileGroup(@RequestBody SysFileGroupDTO fileGroupDTO) {
return R.ok(sysFileService.moveFileGroup(fileGroupDTO));
}
}
@@ -141,8 +141,8 @@ public class SysI18nController {
@GetMapping("/export")
@HasPermission("sys_i18n_export")
public List<SysI18nEntity> export(SysI18nEntity sysI18n, Long[] ids) {
return sysI18nService
.list(Wrappers.lambdaQuery(sysI18n).in(ArrayUtil.isNotEmpty(ids), SysI18nEntity::getId, CollUtil.toList(ids)));
return sysI18nService.list(Wrappers.lambdaQuery(sysI18n)
.in(ArrayUtil.isNotEmpty(ids), SysI18nEntity::getId, CollUtil.toList(ids)));
}
/**
@@ -119,7 +119,8 @@ public class SysLogController {
@GetMapping("/export")
@HasPermission("sys_log_export")
public List<SysLog> export(SysLog sysLog, Long[] ids) {
return sysLogService.list(Wrappers.lambdaQuery(sysLog).in(Objects.nonNull(ids), SysLog::getId, CollUtil.toList(ids)));
return sysLogService
.list(Wrappers.lambdaQuery(sysLog).in(Objects.nonNull(ids), SysLog::getId, CollUtil.toList(ids)));
}
}
@@ -48,96 +48,95 @@ import java.util.Set;
@SecurityRequirement(name = HttpHeaders.AUTHORIZATION)
public class SysMenuController {
private final SysMenuService sysMenuService;
private final SysMenuService sysMenuService;
/**
* 返回当前用户的树形菜单集合
*
* @param type 类型
* @param parentId 父节点ID
* @return 当前用户的树形菜单
*/
@GetMapping
public R getUserMenu(String type, Long parentId) {
// 获取符合条件的菜单
Set<SysMenu> all = new HashSet<>();
SecurityUtils.getRoleIds().forEach(roleId -> all.addAll(sysMenuService.findMenuByRoleId(roleId)));
return R.ok(sysMenuService.filterMenu(all, type, parentId));
}
/**
* 返回当前用户的树形菜单集合
*
* @param type 类型
* @param parentId 父节点ID
* @return 当前用户的树形菜单
*/
@GetMapping
public R getUserMenu(String type, Long parentId) {
// 获取符合条件的菜单
Set<SysMenu> all = new HashSet<>();
SecurityUtils.getRoleIds().forEach(roleId -> all.addAll(sysMenuService.findMenuByRoleId(roleId)));
return R.ok(sysMenuService.filterMenu(all, type, parentId));
}
/**
* 返回树形菜单集合
*
* @param parentId 父节点ID
* @param menuName 菜单名称
* @return 树形菜单
*/
@GetMapping(value = "/tree")
public R getTree(Long parentId, String menuName, String type) {
return R.ok(sysMenuService.treeMenu(parentId, menuName, type));
}
/**
* 返回树形菜单集合
*
* @param parentId 父节点ID
* @param menuName 菜单名称
* @return 树形菜单
*/
@GetMapping(value = "/tree")
public R getTree(Long parentId, String menuName, String type) {
return R.ok(sysMenuService.treeMenu(parentId, menuName, type));
}
/**
* 返回角色的菜单集合
*
* @param roleId 角色ID
* @return 属性集合
*/
@GetMapping("/tree/{roleId}")
public R getRoleTree(@PathVariable Long roleId) {
return R
.ok(sysMenuService.findMenuByRoleId(roleId).stream().map(SysMenu::getMenuId).toList());
}
/**
* 返回角色的菜单集合
*
* @param roleId 角色ID
* @return 属性集合
*/
@GetMapping("/tree/{roleId}")
public R getRoleTree(@PathVariable Long roleId) {
return R.ok(sysMenuService.findMenuByRoleId(roleId).stream().map(SysMenu::getMenuId).toList());
}
/**
* 获取详细信息
*
* @param query 查询条件
* @return {@link R }
*/
@GetMapping("/details")
public R getDetails(@ParameterObject SysMenu query) {
return R.ok(sysMenuService.list(Wrappers.query(query)));
}
/**
* 获取详细信息
*
* @param query 查询条件
* @return {@link R }
*/
@GetMapping("/details")
public R getDetails(@ParameterObject SysMenu query) {
return R.ok(sysMenuService.list(Wrappers.query(query)));
}
/**
* 新增菜单
*
* @param sysMenu 菜单信息
* @return success/false
*/
@SysLog("新增菜单")
@PostMapping
@HasPermission("sys_menu_add")
public R save(@Valid @RequestBody SysMenu sysMenu) {
sysMenuService.save(sysMenu);
return R.ok(sysMenu);
}
/**
* 新增菜单
*
* @param sysMenu 菜单信息
* @return success/false
*/
@SysLog("新增菜单")
@PostMapping
@HasPermission("sys_menu_add")
public R save(@Valid @RequestBody SysMenu sysMenu) {
sysMenuService.save(sysMenu);
return R.ok(sysMenu);
}
/**
* 删除菜单
*
* @param id 菜单ID
* @return success/false
*/
@SysLog("删除菜单")
@DeleteMapping("/{id}")
@HasPermission("sys_menu_del")
public R removeById(@PathVariable Long id) {
return sysMenuService.removeMenuById(id);
}
/**
* 删除菜单
*
* @param id 菜单ID
* @return success/false
*/
@SysLog("删除菜单")
@DeleteMapping("/{id}")
@HasPermission("sys_menu_del")
public R removeById(@PathVariable Long id) {
return sysMenuService.removeMenuById(id);
}
/**
* 更新菜单
*
* @param sysMenu
* @return
*/
@SysLog("更新菜单")
@PutMapping
@HasPermission("sys_menu_edit")
public R update(@Valid @RequestBody SysMenu sysMenu) {
return R.ok(sysMenuService.updateMenuById(sysMenu));
}
/**
* 更新菜单
*
* @param sysMenu
* @return
*/
@SysLog("更新菜单")
@PutMapping
@HasPermission("sys_menu_edit")
public R update(@Valid @RequestBody SysMenu sysMenu) {
return R.ok(sysMenuService.updateMenuById(sysMenu));
}
}
@@ -125,8 +125,8 @@ public class SysMessageController {
@GetMapping("/export")
@HasPermission("sys_message_export")
public List<SysMessageEntity> export(SysMessageEntity sysMessage, Long[] ids) {
return sysMessageService
.list(Wrappers.lambdaQuery(sysMessage).in(ArrayUtil.isNotEmpty(ids), SysMessageEntity::getId, CollUtil.toList(ids)));
return sysMessageService.list(Wrappers.lambdaQuery(sysMessage)
.in(ArrayUtil.isNotEmpty(ids), SysMessageEntity::getId, CollUtil.toList(ids)));
}
/**
@@ -183,7 +183,6 @@ public class SysMessageController {
/**
* 发送短信验证码
*
* @param mobile 手机号
* @return {@link R }
*/
@@ -195,7 +194,6 @@ public class SysMessageController {
/**
* 发送短信
*
* @param messageSmsDTO 消息 短信 DTO
* @return {@link R }
*/
@@ -206,7 +204,6 @@ public class SysMessageController {
/**
* 发送邮件
*
* @param messageEmailDTO 留言内容 电子邮件 DTO
* @return {@link R }
*/
@@ -217,17 +214,17 @@ public class SysMessageController {
/**
* 发送 webhook
*
* @param messageHookDTO 消息挂钩 DTO
* @return {@link R }
*/
@PostMapping("/send/hook")
public R sendWebhook(@Valid @RequestBody MessageHookDTO messageHookDTO) {
return sysMessageService.sendHook(messageHookDTO);
}
return sysMessageService.sendHook(messageHookDTO);
}
@GetMapping("/list/hook")
public R listHookBizCode(MessageHookDTO messageHookDTO) {
return sysMessageService.listHookBizCode(messageHookDTO);
}
@GetMapping("/list/hook")
public R listHookBizCode(MessageHookDTO messageHookDTO) {
return sysMessageService.listHookBizCode(messageHookDTO);
}
}
@@ -162,8 +162,8 @@ public class SysPublicParamController {
@GetMapping("/export")
@HasPermission("sys_syspublicparam_edit")
public List<SysPublicParam> export(SysPublicParam param, Long[] ids) {
return sysPublicParamService
.list(Wrappers.lambdaQuery(param).in(ArrayUtil.isNotEmpty(ids), SysPublicParam::getPublicId, CollUtil.toList(ids)));
return sysPublicParamService.list(Wrappers.lambdaQuery(param)
.in(ArrayUtil.isNotEmpty(ids), SysPublicParam::getPublicId, CollUtil.toList(ids)));
}
/**
@@ -1,7 +1,6 @@
package com.pig4cloud.pigx.admin.controller;
import com.pig4cloud.pigx.admin.api.dto.RegisterUserDTO;
import com.pig4cloud.pigx.admin.api.dto.UserDTO;
import com.pig4cloud.pigx.admin.service.SysUserService;
import com.pig4cloud.pigx.common.core.util.R;
import com.pig4cloud.pigx.common.log.annotation.SysLog;
@@ -60,5 +59,6 @@ public class SysRegisterController {
@PostMapping("/forget/{code}")
public R<Boolean> forgetUserPassword(@RequestBody RegisterUserDTO userDto, @PathVariable String code) {
return userService.forgetUserPassword(userDto, code);
}
}
}
@@ -82,5 +82,6 @@ public class SysRouteConfController {
@HasPermission("sys_route_manage")
public R saveRoute(@RequestBody SysRouteConf routeConf) {
return R.ok(sysRouteConfService.saveRoute(routeConf));
}
}
}
@@ -51,12 +51,13 @@ public class SysSensitiveWordController {
@Operation(summary = "分页查询", description = "分页查询")
@GetMapping("/page")
@HasPermission("admin_sysSensitiveWord_view")
public R getSysSensitiveWordPage(@ParameterObject Page page, @ParameterObject SysSensitiveWordEntity sysSensitiveWord) {
public R getSysSensitiveWordPage(@ParameterObject Page page,
@ParameterObject SysSensitiveWordEntity sysSensitiveWord) {
LambdaQueryWrapper<SysSensitiveWordEntity> wrapper = Wrappers.lambdaQuery();
wrapper.like(StrUtil.isNotBlank(sysSensitiveWord.getSensitiveWord())
, SysSensitiveWordEntity::getSensitiveWord, sysSensitiveWord.getSensitiveWord());
wrapper.eq(StrUtil.isNotBlank(sysSensitiveWord.getSensitiveType())
, SysSensitiveWordEntity::getSensitiveType, sysSensitiveWord.getSensitiveType());
wrapper.like(StrUtil.isNotBlank(sysSensitiveWord.getSensitiveWord()), SysSensitiveWordEntity::getSensitiveWord,
sysSensitiveWord.getSensitiveWord());
wrapper.eq(StrUtil.isNotBlank(sysSensitiveWord.getSensitiveType()), SysSensitiveWordEntity::getSensitiveType,
sysSensitiveWord.getSensitiveType());
return R.ok(sysSensitiveWordService.page(page, wrapper));
}
@@ -64,8 +65,11 @@ public class SysSensitiveWordController {
@Operation(summary = "查询所有敏感词", description = "查询所有敏感词")
@GetMapping("/remote/list/{type}")
public R list(@PathVariable String type) {
return R.ok(sysSensitiveWordService.list(Wrappers.<SysSensitiveWordEntity>lambdaQuery()
.eq(SysSensitiveWordEntity::getSensitiveType, type)).stream().map(SysSensitiveWordEntity::getSensitiveWord).toList());
return R.ok(sysSensitiveWordService
.list(Wrappers.<SysSensitiveWordEntity>lambdaQuery().eq(SysSensitiveWordEntity::getSensitiveType, type))
.stream()
.map(SysSensitiveWordEntity::getSensitiveWord)
.toList());
}
/**
@@ -146,7 +150,6 @@ public class SysSensitiveWordController {
return R.ok();
}
/**
* 导出excel 表格
*
@@ -158,7 +161,8 @@ public class SysSensitiveWordController {
@GetMapping("/export")
@HasPermission("admin_sysSensitiveWord_export")
public List<SysSensitiveWordEntity> export(SysSensitiveWordEntity sysSensitiveWord, Long[] ids) {
return sysSensitiveWordService.list(Wrappers.lambdaQuery(sysSensitiveWord).in(ArrayUtil.isNotEmpty(ids), SysSensitiveWordEntity::getSensitiveId, CollUtil.toList(ids)));
return sysSensitiveWordService.list(Wrappers.lambdaQuery(sysSensitiveWord)
.in(ArrayUtil.isNotEmpty(ids), SysSensitiveWordEntity::getSensitiveId, CollUtil.toList(ids)));
}
/**
@@ -171,9 +175,10 @@ public class SysSensitiveWordController {
@HasPermission("admin_sysSensitiveWord_del")
public R refresh() {
RedisUtils.execute((RedisCallback<Void>) connection -> {
connection.publish(CacheConstants.SENSITIVE_REDIS_RELOAD_TOPIC.getBytes(), "刷新敏感词缓存".getBytes());
return null;
});
return R.ok();
}
connection.publish(CacheConstants.SENSITIVE_REDIS_RELOAD_TOPIC.getBytes(), "刷新敏感词缓存".getBytes());
return null;
});
return R.ok();
}
}
@@ -71,7 +71,7 @@ public class SysSocialDetailsController {
*/
@Inner(value = false)
@GetMapping("/getLoginAppList")
public R getLoginAppList(){
public R getLoginAppList() {
return R.ok(sysSocialDetailsService.selectList());
}
@@ -155,8 +155,8 @@ public class SysSocialDetailsController {
*/
@GetMapping("/export")
public List<SysSocialDetails> export(SysSocialDetails sysSocialDetails, Long[] ids) {
return sysSocialDetailsService
.list(Wrappers.lambdaQuery(sysSocialDetails).in(ArrayUtil.isNotEmpty(ids), SysSocialDetails::getId, CollUtil.toList(ids)));
return sysSocialDetailsService.list(Wrappers.lambdaQuery(sysSocialDetails)
.in(ArrayUtil.isNotEmpty(ids), SysSocialDetails::getId, CollUtil.toList(ids)));
}
}
@@ -45,16 +45,16 @@ public class SysSystemConfigController {
@Operation(summary = "分页查询", description = "分页查询")
@GetMapping("/page")
@HasPermission("sys_message_view")
public R getSysSystemConfigPage(@ParameterObject Page page, @ParameterObject SysSystemConfigEntity sysSystemConfig) {
public R getSysSystemConfigPage(@ParameterObject Page page,
@ParameterObject SysSystemConfigEntity sysSystemConfig) {
return sysSystemConfigService.pageSystemConfig(page, sysSystemConfig);
}
/**
* 通过条件查询系统配置
*
* @param sysSystemConfig 查询条件
* @return R 对象列表
* @return R 对象列表
*/
@Operation(summary = "通过条件查询", description = "通过条件查询对象")
@GetMapping("/details")
@@ -105,7 +105,6 @@ public class SysSystemConfigController {
return R.ok(sysSystemConfigService.removeBatchByIds(CollUtil.toList(ids)));
}
/**
* 导出excel 表格
*
@@ -117,6 +116,8 @@ public class SysSystemConfigController {
@GetMapping("/export")
@HasPermission("sys_message_export")
public List<SysSystemConfigEntity> export(SysSystemConfigEntity sysSystemConfig, Long[] ids) {
return sysSystemConfigService.list(Wrappers.lambdaQuery(sysSystemConfig).in(ArrayUtil.isNotEmpty(ids), SysSystemConfigEntity::getId, CollUtil.toList(ids)));
}
return sysSystemConfigService.list(Wrappers.lambdaQuery(sysSystemConfig)
.in(ArrayUtil.isNotEmpty(ids), SysSystemConfigEntity::getId, CollUtil.toList(ids)));
}
}
@@ -29,8 +29,8 @@ public class SysSystemInfoController {
@GetMapping("/cache")
public R cache() {
Properties info = RedisUtils.execute((RedisCallback<Properties>) RedisServerCommands::info);
Properties commandStats = RedisUtils.execute((RedisCallback<Properties>)
connection -> connection.serverCommands().info("commandstats"));
Properties commandStats = RedisUtils
.execute((RedisCallback<Properties>) connection -> connection.serverCommands().info("commandstats"));
Object dbSize = RedisUtils.execute((RedisCallback<Object>) RedisServerCommands::dbSize);
if (commandStats == null) {
@@ -62,218 +62,215 @@ import java.util.List;
@SecurityRequirement(name = HttpHeaders.AUTHORIZATION)
public class SysTenantController {
private final SysTenantService sysTenantService;
private final SysTenantService sysTenantService;
private final SysMenuService sysMenuService;
private final SysMenuService sysMenuService;
/**
* 分页查询
*
* @param page 分页对象
* @param sysTenant 租户
* @return
*/
@GetMapping("/page")
public R getSysTenantPage(@ParameterObject Page page, @ParameterObject SysTenant sysTenant) {
return R.ok(sysTenantService.page(page, Wrappers.<SysTenant>lambdaQuery()
.like(StrUtil.isNotBlank(sysTenant.getName()), SysTenant::getName, sysTenant.getName())));
}
/**
* 分页查询
*
* @param page 分页对象
* @param sysTenant 租户
* @return
*/
@GetMapping("/page")
public R getSysTenantPage(@ParameterObject Page page, @ParameterObject SysTenant sysTenant) {
return R.ok(sysTenantService.page(page, Wrappers.<SysTenant>lambdaQuery()
.like(StrUtil.isNotBlank(sysTenant.getName()), SysTenant::getName, sysTenant.getName())));
}
/**
* 通过ID 查询租户信息
*
* @param id ID
* @return R
*/
@GetMapping("/details/{id}")
public R getById(@PathVariable Long id) {
return R.ok(sysTenantService.getById(id));
}
/**
* 通过ID 查询租户信息
*
* @param id ID
* @return R
*/
@GetMapping("/details/{id}")
public R getById(@PathVariable Long id) {
return R.ok(sysTenantService.getById(id));
}
/**
* 查询租户信息
*
* @param query 查询条件
* @return 租户信息
*/
@GetMapping("/details")
public R getDetails(@ParameterObject SysTenant query) {
return R.ok(sysTenantService.getOne(Wrappers.query(query), false));
}
/**
* 查询租户信息
*
* @param query 查询条件
* @return 租户信息
*/
@GetMapping("/details")
public R getDetails(@ParameterObject SysTenant query) {
return R.ok(sysTenantService.getOne(Wrappers.query(query), false));
}
/**
* 新增租户
*
* @param sysTenant 租户
* @return R
*/
@SysLog("新增租户")
@PostMapping
@HasPermission("sys_systenant_add")
@CacheEvict(value = CacheConstants.TENANT_DETAILS, allEntries = true)
public R save(@RequestBody SysTenant sysTenant) {
return R.ok(sysTenantService.saveTenant(sysTenant));
}
/**
* 新增租户
*
* @param sysTenant 租户
* @return R
*/
@SysLog("新增租户")
@PostMapping
@HasPermission("sys_systenant_add")
@CacheEvict(value = CacheConstants.TENANT_DETAILS, allEntries = true)
public R save(@RequestBody SysTenant sysTenant) {
return R.ok(sysTenantService.saveTenant(sysTenant));
}
/**
* 修改租户
*
* @param sysTenant 租户
* @return R
*/
@SysLog("修改租户")
@PutMapping
@HasPermission("sys_systenant_edit")
public R updateById(@RequestBody SysTenant sysTenant) {
return R.ok(sysTenantService.updateTenant(sysTenant));
}
/**
* 修改租户
*
* @param sysTenant 租户
* @return R
*/
@SysLog("修改租户")
@PutMapping
@HasPermission("sys_systenant_edit")
public R updateById(@RequestBody SysTenant sysTenant) {
return R.ok(sysTenantService.updateTenant(sysTenant));
}
/**
* 通过id删除租户
* <p>
* 为了保证安全,这里只删除租户表的数据,不删除基础表中的租户初始化数据。
*
* @param ids id 列表
* @return R
*/
@SysLog("删除租户")
@DeleteMapping
@HasPermission("sys_systenant_del")
public R removeById(@RequestBody Long[] ids) {
return R.ok(sysTenantService.removeTenant(ids));
}
/**
* 通过id删除租户
* <p>
* 为了保证安全,这里只删除租户表的数据,不删除基础表中的租户初始化数据。
*
* @param ids id 列表
* @return R
*/
@SysLog("删除租户")
@DeleteMapping
@HasPermission("sys_systenant_del")
public R removeById(@RequestBody Long[] ids) {
return R.ok(sysTenantService.removeTenant(ids));
}
/**
* 查询全部有效的租户列表
*
* @return 包含有效租户列表的响应结果
*/
@Inner(value = false)
@GetMapping("/list")
public R list() {
List<SysTenant> tenants = sysTenantService.getNormalTenant()
.stream()
.filter(tenant -> tenant.getStartTime().isBefore(LocalDateTime.now()))
.filter(tenant -> tenant.getEndTime().isAfter(LocalDateTime.now()))
.toList();
return R.ok(tenants);
}
/**
* 查询全部有效的租户列表
*
* @return 包含有效租户列表的响应结果
*/
@Inner(value = false)
@GetMapping("/list")
public R list() {
List<SysTenant> tenants = sysTenantService.getNormalTenant()
.stream()
.filter(tenant -> tenant.getStartTime().isBefore(LocalDateTime.now()))
.filter(tenant -> tenant.getEndTime().isAfter(LocalDateTime.now()))
.toList();
return R.ok(tenants);
}
/**
* 导出租户信息到Excel
*
* @param sysTenant 租户查询条件
* @param ids 租户ID数组
* @return 符合条件的租户列表
*/
@ResponseExcel
@GetMapping("/export")
@HasPermission("sys_systenant_export")
public List<SysTenant> export(SysTenant sysTenant, Long[] ids) {
return sysTenantService
.list(Wrappers.lambdaQuery(sysTenant).in(ArrayUtil.isNotEmpty(ids), SysTenant::getId, CollUtil.toList(ids)));
}
/**
* 导出租户信息到Excel
*
* @param sysTenant 租户查询条件
* @param ids 租户ID数组
* @return 符合条件的租户列表
*/
@ResponseExcel
@GetMapping("/export")
@HasPermission("sys_systenant_export")
public List<SysTenant> export(SysTenant sysTenant, Long[] ids) {
return sysTenantService.list(
Wrappers.lambdaQuery(sysTenant).in(ArrayUtil.isNotEmpty(ids), SysTenant::getId, CollUtil.toList(ids)));
}
/**
* 获取租户菜单
*
* @return 包含菜单树结构的响应结果
*/
@GetMapping(value = "/tree/menu")
public R getTree() {
Long defaultId = ParamResolver.getLong("TENANT_DEFAULT_ID", 1L);
List<Tree<Long>> trees = new ArrayList<>();
TenantBroker.runAs(defaultId, (id) -> {
trees.addAll(sysMenuService.treeMenu(null, null, null));
});
/**
* 获取租户菜单
*
* @return 包含菜单树结构的响应结果
*/
@GetMapping(value = "/tree/menu")
public R getTree() {
Long defaultId = ParamResolver.getLong("TENANT_DEFAULT_ID", 1L);
List<Tree<Long>> trees = new ArrayList<>();
TenantBroker.runAs(defaultId, (id) -> {
trees.addAll(sysMenuService.treeMenu(null, null, null));
});
return R.ok(trees);
}
return R.ok(trees);
}
/**
* 获取用户租户信息
*
* @return 包含用户租户信息的响应结果
*/
@GetMapping("/user-tenant")
public R getUserTenant() {
return R.ok(sysTenantService.getUserTenant());
}
/**
* 获取用户租户信息
*
* @return 包含用户租户信息的响应结果
*/
@GetMapping("/user-tenant")
public R getUserTenant() {
return R.ok(sysTenantService.getUserTenant());
}
/**
* 新增用户租户关联关系
*
* @param tenantUserDTO 用户租户关联信息DTO
* @return 操作结果
*/
@PostMapping("/user-tenant")
@HasPermission("sys_systenant_del")
public R addUserTenant(@RequestBody SysTenantUserDTO tenantUserDTO) {
return R.ok(sysTenantService.saveTenantUser(tenantUserDTO));
}
/**
* 新增用户租户关联关系
*
* @param tenantUserDTO 用户租户关联信息DTO
* @return 操作结果
*/
@PostMapping("/user-tenant")
@HasPermission("sys_systenant_del")
public R addUserTenant(@RequestBody SysTenantUserDTO tenantUserDTO) {
return R.ok(sysTenantService.saveTenantUser(tenantUserDTO));
}
/**
* 获取用户租户分页信息
*
* @param page 分页参数
* @param userDTO 用户查询参数
* @return 租户分页结果
*/
@GetMapping("/user-tenant/page")
@HasPermission("sys_systenant_del")
public R getUserTenantPage(@ParameterObject Page page, @ParameterObject UserDTO userDTO) {
return R.ok(sysTenantService.getUserTenantPage(page, userDTO));
}
/**
* 获取用户租户分页信息
*
* @param page 分页参数
* @param userDTO 用户查询参数
* @return 租户分页结果
*/
@GetMapping("/user-tenant/page")
@HasPermission("sys_systenant_del")
public R getUserTenantPage(@ParameterObject Page page, @ParameterObject UserDTO userDTO) {
return R.ok(sysTenantService.getUserTenantPage(page, userDTO));
}
/**
* 根据租户用户信息删除用户租户关系
*
* @param tenantUserDTO 租户用户信息DTO
* @return 操作结果
*/
@SysLog("删除租户>用户关系")
@DeleteMapping("/remove-users")
@HasPermission("sys_systenant_del")
public R removeUserTenantById(@RequestBody SysTenantUserDTO tenantUserDTO) {
return R.ok(sysTenantService.removeTenantUser(tenantUserDTO));
}
/**
* 根据租户用户信息删除用户租户关系
* @param tenantUserDTO 租户用户信息DTO
* @return 操作结果
*/
@SysLog("删除租户>用户关系")
@DeleteMapping("/remove-users")
@HasPermission("sys_systenant_del")
public R removeUserTenantById(@RequestBody SysTenantUserDTO tenantUserDTO) {
return R.ok(sysTenantService.removeTenantUser(tenantUserDTO));
}
/**
* 根据条件查询租户用户列表
*
* @param userDTO 用户查询条件
* @return 包含查询结果的响应对象
*/
@GetMapping("/list-users")
@HasPermission("sys_systenant_del")
public R listTenantUser(@ParameterObject UserDTO userDTO) {
return R.ok(sysTenantService.listTenantUser(userDTO));
}
/**
* 根据条件查询租户用户列表
* @param userDTO 用户查询条件
* @return 包含查询结果的响应对象
*/
@GetMapping("/list-users")
@HasPermission("sys_systenant_del")
public R listTenantUser(@ParameterObject UserDTO userDTO) {
return R.ok(sysTenantService.listTenantUser(userDTO));
}
/**
* 获取租户角色列表
*
* @param userDTO 用户信息参数对象
* @return 包含租户角色列表的响应结果
*/
@GetMapping("/list-org")
@HasPermission("sys_systenant_del")
public R listTenantOrg(@ParameterObject UserDTO userDTO) {
return R.ok(sysTenantService.listTenantOrg(userDTO));
}
/**
* 获取租户角色列表
* @param userDTO 用户信息参数对象
* @return 包含租户角色列表的响应结果
*/
@GetMapping("/list-org")
@HasPermission("sys_systenant_del")
public R listTenantOrg(@ParameterObject UserDTO userDTO) {
return R.ok(sysTenantService.listTenantOrg(userDTO));
}
/**
* 更新用户租户信息
*
* @param userDto 用户数据传输对象,包含需要更新的用户信息
* @return 操作结果
*/
@PutMapping("/personal/update")
public R updateUserTenant(@RequestBody UserDTO userDto) {
String username = SecurityUtils.getUser().getUsername();
userDto.setUsername(username);
userDto.setUserId(SecurityUtils.getUser().getId());
return sysTenantService.updateUserTenant(userDto);
}
/**
* 更新用户租户信息
*
* @param userDto 用户数据传输对象,包含需要更新的用户信息
* @return 操作结果
*/
@PutMapping("/personal/update")
public R updateUserTenant(@RequestBody UserDTO userDto) {
String username = SecurityUtils.getUser().getUsername();
userDto.setUsername(username);
userDto.setUserId(SecurityUtils.getUser().getId());
return sysTenantService.updateUserTenant(userDto);
}
}
@@ -61,255 +61,249 @@ import java.util.List;
@SecurityRequirement(name = HttpHeaders.AUTHORIZATION)
public class SysUserController {
private final SysUserService userService;
private final SysUserService userService;
/**
* 获取指定用户全部信息
*
* @return 用户信息
*/
@Inner
@GetMapping("/info/{username}")
public R info(@PathVariable String username) {
UserDTO userDTO = new UserDTO();
userDTO.setUsername(username);
return userService.getUserInfo(userDTO);
}
/**
* 获取指定用户全部信息
*
* @return 用户信息
*/
@Inner
@GetMapping("/info/{username}")
public R info(@PathVariable String username) {
UserDTO userDTO = new UserDTO();
userDTO.setUsername(username);
return userService.getUserInfo(userDTO);
}
/**
* 获取当前用户全部信息
*
* @return 用户信息
*/
@GetMapping(value = {"/info"})
public R info() {
String username = SecurityUtils.getUser().getUsername();
UserDTO userDTO = new UserDTO();
userDTO.setUsername(username);
// 获取用户信息,不返回数据库密码字段
R<UserInfo> userInfoR = userService.getUserInfo(userDTO);
if (userInfoR.getData() != null) {
userInfoR.getData().setPassword(null);
}
return userInfoR;
}
/**
* 获取当前用户全部信息
*
* @return 用户信息
*/
@GetMapping(value = {"/info"})
public R info() {
String username = SecurityUtils.getUser().getUsername();
UserDTO userDTO = new UserDTO();
userDTO.setUsername(username);
// 获取用户信息,不返回数据库密码字段
R<UserInfo> userInfoR = userService.getUserInfo(userDTO);
if (userInfoR.getData() != null) {
userInfoR.getData().setPassword(null);
}
return userInfoR;
}
/**
* 通过ID查询用户信息
*
* @param id ID
* @return 用户信息
*/
@GetMapping("/details/{id}")
public R user(@PathVariable Long id) {
return R.ok(userService.selectUserVoById(id));
}
/**
* 通过ID查询用户信息
*
* @param id ID
* @return 用户信息
*/
@GetMapping("/details/{id}")
public R user(@PathVariable Long id) {
return R.ok(userService.selectUserVoById(id));
}
/**
* 查询用户信息
*
* @param query 查询条件
* @return 不为空返回用户名
*/
@Inner(value = false)
@GetMapping("/details")
public R getDetails(@ParameterObject SysUser query) {
// 根据用户名、手机号 查询不区分租户
SysUser sysUser = TenantBroker.noneAs(() -> userService.getOne(Wrappers.query(query), false));
return R.ok(sysUser == null ? null : CommonConstants.SUCCESS);
}
/**
* 查询用户信息
*
* @param query 查询条件
* @return 不为空返回用户名
*/
@Inner(value = false)
@GetMapping("/details")
public R getDetails(@ParameterObject SysUser query) {
// 根据用户名、手机号 查询不区分租户
SysUser sysUser = TenantBroker.noneAs(() -> userService.getOne(Wrappers.query(query), false));
return R.ok(sysUser == null ? null : CommonConstants.SUCCESS);
}
/**
* 删除用户信息
*
* @param ids ID
* @return R
*/
@SysLog("删除用户信息")
@DeleteMapping
@HasPermission("sys_user_del")
@Operation(summary = "删除用户", description = "根据ID删除用户")
public R userDel(@RequestBody Long[] ids) {
return R.ok(userService.deleteUserByIds(ids));
}
/**
* 删除用户信息
*
* @param ids ID
* @return R
*/
@SysLog("删除用户信息")
@DeleteMapping
@HasPermission("sys_user_del")
@Operation(summary = "删除用户", description = "根据ID删除用户")
public R userDel(@RequestBody Long[] ids) {
return R.ok(userService.deleteUserByIds(ids));
}
/**
* 添加用户
*
* @param userDto 用户信息
* @return success/false
*/
@SysLog("添加用户")
@PostMapping
@HasPermission("sys_user_add")
public R user(@RequestBody UserDTO userDto) {
return R.ok(userService.saveUser(userDto));
}
/**
* 添加用户
*
* @param userDto 用户信息
* @return success/false
*/
@SysLog("添加用户")
@PostMapping
@HasPermission("sys_user_add")
public R user(@RequestBody UserDTO userDto) {
return R.ok(userService.saveUser(userDto));
}
/**
* 分页查询用户
*
* @param page 参数集
* @param userDTO 查询参数列表
* @return 用户集合
*/
@GetMapping("/page")
public R getUserPage(@ParameterObject Page page, @ParameterObject UserDTO userDTO) {
return R.ok(userService.getUsersWithRolePage(page, userDTO));
}
/**
* 分页查询用户
*
* @param page 参数集
* @param userDTO 查询参数列表
* @return 用户集合
*/
@GetMapping("/page")
public R getUserPage(@ParameterObject Page page, @ParameterObject UserDTO userDTO) {
return R.ok(userService.getUsersWithRolePage(page, userDTO));
}
/**
* 管理员更新用户信息
*
* @param userDto 用户信息
* @return R
*/
@SysLog("更新用户信息")
@PutMapping
@HasPermission("sys_user_edit")
public R updateUser(@Valid @RequestBody UserDTO userDto) {
return R.ok(userService.updateUser(userDto));
}
/**
* 管理员更新用户信息
*
* @param userDto 用户信息
* @return R
*/
@SysLog("更新用户信息")
@PutMapping
@HasPermission("sys_user_edit")
public R updateUser(@Valid @RequestBody UserDTO userDto) {
return R.ok(userService.updateUser(userDto));
}
/**
* 修改个人信息 (当前用户)
*
* @param userDto userDto
* @return success/false
*/
@SysLog("修改个人信息")
@PutMapping("/personal/edit")
public R updateUserInfo(@Valid @RequestBody UserDTO userDto) {
return userService.updateUserInfo(userDto);
}
/**
* 修改个人信息 (当前用户)
*
* @param userDto userDto
* @return success/false
*/
@SysLog("修改个人信息")
@PutMapping("/personal/edit")
public R updateUserInfo(@Valid @RequestBody UserDTO userDto) {
return userService.updateUserInfo(userDto);
}
/**
* 修改个人密码 (当前用户)
*
* @param userDto 用户DTO对象,包含需要修改密码的用户信息
* @return R 返回结果对象,包含修改密码操作的结果信息
*/
@PutMapping("/personal/password")
public R updateUserPassword(@RequestBody UserDTO userDto) {
String username = SecurityUtils.getUser().getUsername();
userDto.setUsername(username);
return userService.changePassword(userDto);
}
/**
* 修改个人密码 (当前用户)
*
* @param userDto 用户DTO对象,包含需要修改密码的用户信息
* @return R 返回结果对象,包含修改密码操作的结果信息
*/
@PutMapping("/personal/password")
public R updateUserPassword(@RequestBody UserDTO userDto) {
String username = SecurityUtils.getUser().getUsername();
userDto.setUsername(username);
return userService.changePassword(userDto);
}
/**
* @param username 用户名称
* @return 上级部门用户列表
*/
@GetMapping("/ancestor/{username}")
public R listAncestorUsers(@PathVariable String username) {
return R.ok(userService.listAncestorUsers(username));
}
/**
* @param username 用户名称
* @return 上级部门用户列表
*/
@GetMapping("/ancestor/{username}")
public R listAncestorUsers(@PathVariable String username) {
return R.ok(userService.listAncestorUsers(username));
}
/**
* 导出excel 表格
* @param userDTO 查询条件
* @return
*/
@ResponseExcel
@GetMapping("/export")
@HasPermission("sys_user_export")
public List export(UserDTO userDTO, Long[] ids) {
return userService.listUser(userDTO, ids);
}
/**
* 导出excel 表格
*
* @param userDTO 查询条件
* @return
*/
@ResponseExcel
@GetMapping("/export")
@HasPermission("sys_user_export")
public List export(UserDTO userDTO, Long[] ids) {
return userService.listUser(userDTO, ids);
}
/**
* 导入用户
*
* @param excelVOList 用户列表
* @param bindingResult 错误信息列表
* @return R
*/
@PostMapping("/import")
@HasPermission("sys_user_export")
public R importUser(@RequestExcel List<UserExcelVO> excelVOList, BindingResult bindingResult) {
return userService.importUser(excelVOList, bindingResult);
}
/**
* 导入用户
*
* @param excelVOList 用户列表
* @param bindingResult 错误信息列表
* @return R
*/
@PostMapping("/import")
@HasPermission("sys_user_export")
public R importUser(@RequestExcel List<UserExcelVO> excelVOList, BindingResult bindingResult) {
return userService.importUser(excelVOList, bindingResult);
}
/**
* 锁定指定用户
*
* @param username 用户名
* @return R
*/
@Inner
@PutMapping("/lock/{username}")
public R lockUser(@PathVariable String username) {
return userService.lockUser(username);
}
/**
* 锁定指定用户
*
* @param username 用户名
* @return R
*/
@Inner
@PutMapping("/lock/{username}")
public R lockUser(@PathVariable String username) {
return userService.lockUser(username);
}
/**
* 解绑定接口
*
* @param type 需要解绑定的类型
* @return R 返回结果对象,包含解绑定操作的结果信息
*/
@PostMapping("/unbinding")
public R unbinding(String type) {
return userService.unbinding(type);
}
/**
* 解绑定接口
*
* @param type 需要解绑定的类型
* @return R 返回结果对象,包含解绑定操作的结果信息
*/
@PostMapping("/unbinding")
public R unbinding(String type) {
return userService.unbinding(type);
}
/**
* 校验密码接口
*
* @param password 需要校验的密码
* @return R 返回结果对象,包含校验密码操作的结果信息
*/
@PostMapping("/check")
public R check(String password) {
return userService.checkPassword(SecurityUtils.getUser().getUsername(), password);
}
/**
* 校验密码接口
*
* @param password 需要校验的密码
* @return R 返回结果对象,包含校验密码操作的结果信息
*/
@PostMapping("/check")
public R check(String password) {
return userService.checkPassword(SecurityUtils.getUser().getUsername(), password);
}
/**
* 根据角色ID列表获取用户ID列表接口
* @param roleIdList 角色ID列表
* @return R 返回结果对象,包含根据角色ID列表获取到的用户ID列表信息
*/
@Inner
@GetMapping("/getUserIdListByRoleIdList")
public R<List<Long>> getUserIdListByRoleIdList(Long[] roleIdList) {
return R.ok(userService.listUserIdByRoleIds(CollUtil.toList(roleIdList)));
}
/**
* 根据角色ID列表获取用户ID列表接口
*
* @param roleIdList 角色ID列表
* @return R 返回结果对象,包含根据角色ID列表获取到的用户ID列表信息
*/
@Inner
@GetMapping("/getUserIdListByRoleIdList")
public R<List<Long>> getUserIdListByRoleIdList(Long[] roleIdList) {
return R.ok(userService.listUserIdByRoleIds(CollUtil.toList(roleIdList)));
}
/**
* 根据部门ID列表获取用户ID列表接口
* @param deptIdList 部门ID列表
* @return R 返回结果对象,包含根据部门ID列表获取到的用户ID列表信息
*/
@Inner
@GetMapping("/getUserIdListByDeptIdList")
public R<List<SysUser>> getUserIdListByDeptIdList(Long[] deptIdList) {
return R.ok(userService.listUserIdByDeptIds(CollUtil.toList(deptIdList)));
}
/**
* 根据部门ID列表获取用户ID列表接口
*
* @param deptIdList 部门ID列表
* @return R 返回结果对象,包含根据部门ID列表获取到的用户ID列表信息
*/
@Inner
@GetMapping("/getUserIdListByDeptIdList")
public R<List<SysUser>> getUserIdListByDeptIdList(Long[] deptIdList) {
return R.ok(userService.listUserIdByDeptIds(CollUtil.toList(deptIdList)));
}
/**
* 根据用户名获取用户列表
* @param username 用户名
* @return 用户列表
*/
@GetMapping("/getUserListByUserName")
public R<List<SysUser>> getUserListByUserName(String username) {
return R.ok(userService.list(Wrappers.<SysUser>lambdaQuery().like(SysUser::getUsername, username)));
}
/**
* 根据用户名获取用户列表
*
* @param username 用户名
* @return 用户列表
*/
@GetMapping("/getUserListByUserName")
public R<List<SysUser>> getUserListByUserName(String username) {
return R.ok(userService.list(Wrappers.<SysUser>lambdaQuery().like(SysUser::getUsername, username)));
}
/**
* 根据IDS获取用户列表
*
* @param userIds ID列表
* @return 用户列表
*/
@GetMapping("/list")
public R<List<SysUser>> getUserListByIds(@RequestParam("userIds") List<Long> userIds) {
return R.ok(userService.list(Wrappers.<SysUser>lambdaQuery().in(SysUser::getUserId, userIds)));
}
/**
* 根据IDS获取用户列表
* @param userIds ID列表
* @return 用户列表
*/
@GetMapping("/list")
public R<List<SysUser>> getUserListByIds(@RequestParam("userIds") List<Long> userIds) {
return R.ok(userService.list(Wrappers.<SysUser>lambdaQuery().in(SysUser::getUserId, userIds)));
}
}
@@ -66,7 +66,6 @@ public class CasLoginHandler extends AbstractLoginHandler {
/**
* 根据用户名获取用户信息
*
* @param username 用户名
* @return 用户信息对象,如果用户不存在则返回null
*/
@@ -115,7 +115,7 @@ public class DingTalkLoginHandler extends AbstractLoginHandler {
public Boolean bind(SysUser user, String identify) {
user.setWxDingUserid(identify);
sysUserService.updateById(user);
return true;
}
return true;
}
}
@@ -81,25 +81,24 @@ public class GiteeLoginHandler extends AbstractLoginHandler {
}
/**
* 根据标识获取用户信息
*
* @param identify 用户标识
* @return 用户信息,未找到时返回null
* 根据标识获取用户信息
* @param identify 用户标识
* @return 用户信息,未找到时返回null
*/
@Override
public UserInfo info(String identify) {
UserDTO userDTO = new UserDTO();
userDTO.setGiteeLogin(identify);
UserDTO userDTO = new UserDTO();
userDTO.setGiteeLogin(identify);
R<UserInfo> userInfoR = sysUserService.getUserInfo(userDTO);
R<UserInfo> userInfoR = sysUserService.getUserInfo(userDTO);
if (userInfoR.getData() == null) {
log.info("微信 不存在用户:{}", identify);
if (userInfoR.getData() == null) {
log.info("微信 不存在用户:{}", identify);
return null;
}
return userInfoR.getData();
return userInfoR.getData();
}
/**
@@ -46,72 +46,72 @@ import org.springframework.stereotype.Component;
@AllArgsConstructor
public class MiniAppLoginHandler extends AbstractLoginHandler {
private final SysUserService sysUserService;
private final SysUserService sysUserService;
private final SysSocialDetailsMapper sysSocialDetailsMapper;
private final SysSocialDetailsMapper sysSocialDetailsMapper;
/**
* 小程序登录传入code
* <p>
* 通过code 调用qq 获取唯一标识
*
* @param code
* @return
*/
@Override
public String identify(String code) {
SysSocialDetails condition = new SysSocialDetails();
condition.setType(LoginTypeEnum.MINI_APP.getType());
SysSocialDetails socialDetails = sysSocialDetailsMapper.selectOne(new QueryWrapper<>(condition));
/**
* 小程序登录传入code
* <p>
* 通过code 调用qq 获取唯一标识
*
* @param code
* @return
*/
@Override
public String identify(String code) {
SysSocialDetails condition = new SysSocialDetails();
condition.setType(LoginTypeEnum.MINI_APP.getType());
SysSocialDetails socialDetails = sysSocialDetailsMapper.selectOne(new QueryWrapper<>(condition));
String url = String.format(SecurityConstants.MINI_APP_AUTHORIZATION_CODE_URL, socialDetails.getAppId(),
socialDetails.getAppSecret(), code);
String result = HttpUtil.get(url);
log.debug("微信小程序响应报文:{}", result);
JSONObject resultJsonObj = JSONUtil.parseObj(result);
String url = String.format(SecurityConstants.MINI_APP_AUTHORIZATION_CODE_URL, socialDetails.getAppId(),
socialDetails.getAppSecret(), code);
String result = HttpUtil.get(url);
log.debug("微信小程序响应报文:{}", result);
JSONObject resultJsonObj = JSONUtil.parseObj(result);
if (resultJsonObj.containsKey("errcode")) {
log.error("微信小程序登录失败:{}", result);
throw new CheckedException("微信小程序登录失败");
}
if (resultJsonObj.containsKey("errcode")) {
log.error("微信小程序登录失败:{}", result);
throw new CheckedException("微信小程序登录失败");
}
Object obj = resultJsonObj.get("openid");
return obj.toString();
}
Object obj = resultJsonObj.get("openid");
return obj.toString();
}
/**
* 根据openId获取用户信息
*
* @param openId 用户openId
* @return 用户信息对象,未找到时返回null
*/
@Override
public UserInfo info(String openId) {
UserDTO userDTO = new UserDTO();
userDTO.setMiniOpenid(openId);
/**
* 根据openId获取用户信息
*
* @param openId 用户openId
* @return 用户信息对象,未找到时返回null
*/
@Override
public UserInfo info(String openId) {
UserDTO userDTO = new UserDTO();
userDTO.setMiniOpenid(openId);
R<UserInfo> userInfoR = sysUserService.getUserInfo(userDTO);
R<UserInfo> userInfoR = sysUserService.getUserInfo(userDTO);
if (userInfoR.getData() == null) {
log.info("小程序不存在用户:{}", openId);
return null;
}
if (userInfoR.getData() == null) {
log.info("小程序不存在用户:{}", openId);
return null;
}
return userInfoR.getData();
}
return userInfoR.getData();
}
/**
* 绑定逻辑
*
* @param user 用户实体
* @param identify 渠道返回唯一标识
* @return
*/
@Override
public Boolean bind(SysUser user, String identify) {
user.setMiniOpenid(identify);
sysUserService.updateById(user);
return true;
}
/**
* 绑定逻辑
*
* @param user 用户实体
* @param identify 渠道返回唯一标识
* @return
*/
@Override
public Boolean bind(SysUser user, String identify) {
user.setMiniOpenid(identify);
sysUserService.updateById(user);
return true;
}
}
@@ -122,7 +122,7 @@ public class OscChinaLoginHandler extends AbstractLoginHandler {
public Boolean bind(SysUser user, String identify) {
user.setOscId(identify);
sysUserService.updateById(user);
return true;
}
return true;
}
}
@@ -49,7 +49,6 @@ public class SmsLoginHandler extends AbstractLoginHandler {
/**
* 通过手机号获取用户信息
*
* @param identify 手机号标识
* @return 用户信息,未找到时返回null
*/
@@ -43,70 +43,70 @@ import org.springframework.stereotype.Component;
@RequiredArgsConstructor
public class WeChatCPLoginHandler extends AbstractLoginHandler {
private final SysUserService sysUserService;
private final SysUserService sysUserService;
private final SysSocialDetailsMapper sysSocialDetailsMapper;
private final SysSocialDetailsMapper sysSocialDetailsMapper;
/**
* 企微登录传入code
* <p>
* 通过code 调用获取唯一标识
*
* @param code
* @return
*/
@Override
public String identify(String code) {
SysSocialDetails condition = new SysSocialDetails();
condition.setType(LoginTypeEnum.WEIXIN_CP.getType());
SysSocialDetails socialDetails = sysSocialDetailsMapper.selectOne(new QueryWrapper<>(condition));
/**
* 企微登录传入code
* <p>
* 通过code 调用获取唯一标识
*
* @param code
* @return
*/
@Override
public String identify(String code) {
SysSocialDetails condition = new SysSocialDetails();
condition.setType(LoginTypeEnum.WEIXIN_CP.getType());
SysSocialDetails socialDetails = sysSocialDetailsMapper.selectOne(new QueryWrapper<>(condition));
String getAccessTokenUrl = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=%s&corpsecret=%s";
String getAccessTokenUrl = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=%s&corpsecret=%s";
String accessTokenResult = HttpUtil
.get(String.format(getAccessTokenUrl, socialDetails.getAppId(), socialDetails.getAppSecret()));
log.debug("获取企业微信Token响应报文:{}", accessTokenResult);
String accessToken = JSONUtil.parseObj(accessTokenResult).getStr("access_token");
String getUserIdUrl = "https://qyapi.weixin.qq.com/cgi-bin/auth/getuserinfo?access_token=%s&code=%s";
String userResult = HttpUtil.get(String.format(getUserIdUrl, accessToken, code));
log.debug("获取企业微信UserId响应报文:{}", userResult);
// 企微唯一标识
return JSONUtil.parseObj(userResult).getStr("userid");
}
String accessTokenResult = HttpUtil
.get(String.format(getAccessTokenUrl, socialDetails.getAppId(), socialDetails.getAppSecret()));
log.debug("获取企业微信Token响应报文:{}", accessTokenResult);
String accessToken = JSONUtil.parseObj(accessTokenResult).getStr("access_token");
String getUserIdUrl = "https://qyapi.weixin.qq.com/cgi-bin/auth/getuserinfo?access_token=%s&code=%s";
String userResult = HttpUtil.get(String.format(getUserIdUrl, accessToken, code));
log.debug("获取企业微信UserId响应报文:{}", userResult);
// 企微唯一标识
return JSONUtil.parseObj(userResult).getStr("userid");
}
/**
* 根据openId获取用户信息
*
* @param openId 用户openId
* @return 用户信息对象,未找到时返回null
*/
@Override
public UserInfo info(String openId) {
UserDTO userDTO = new UserDTO();
userDTO.setWxCpUserid(openId);
/**
* 根据openId获取用户信息
*
* @param openId 用户openId
* @return 用户信息对象,未找到时返回null
*/
@Override
public UserInfo info(String openId) {
UserDTO userDTO = new UserDTO();
userDTO.setWxCpUserid(openId);
R<UserInfo> userInfoR = sysUserService.getUserInfo(userDTO);
R<UserInfo> userInfoR = sysUserService.getUserInfo(userDTO);
if (userInfoR.getData() == null) {
log.info("企业微信 不存在用户:{}", openId);
return null;
}
if (userInfoR.getData() == null) {
log.info("企业微信 不存在用户:{}", openId);
return null;
}
return userInfoR.getData();
}
return userInfoR.getData();
}
/**
* 绑定逻辑
*
* @param user 用户实体
* @param identify 渠道返回唯一标识
* @return
*/
@Override
public Boolean bind(SysUser user, String identify) {
user.setWxCpUserid(identify);
sysUserService.updateById(user);
return true;
}
/**
* 绑定逻辑
*
* @param user 用户实体
* @param identify 渠道返回唯一标识
* @return
*/
@Override
public Boolean bind(SysUser user, String identify) {
user.setWxCpUserid(identify);
sysUserService.updateById(user);
return true;
}
}
@@ -69,24 +69,23 @@ public class WeChatLoginHandler extends AbstractLoginHandler {
}
/**
* 根据微信openId获取用户信息
*
* @param openId 微信openId
* @return 用户信息,未找到时返回null
* 根据微信openId获取用户信息
* @param openId 微信openId
* @return 用户信息,未找到时返回null
*/
@Override
public UserInfo info(String openId) {
UserDTO userDTO = new UserDTO();
userDTO.setWxOpenid(openId);
UserDTO userDTO = new UserDTO();
userDTO.setWxOpenid(openId);
R<UserInfo> userInfoR = sysUserService.getUserInfo(userDTO);
R<UserInfo> userInfoR = sysUserService.getUserInfo(userDTO);
if (userInfoR.getData() == null) {
log.info("微信 不存在用户:{}", openId);
if (userInfoR.getData() == null) {
log.info("微信 不存在用户:{}", openId);
return null;
}
return userInfoR.getData();
return userInfoR.getData();
}
/**
@@ -7,5 +7,4 @@ import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface SysAreaMapper extends PigxBaseMapper<SysAreaEntity> {
}
@@ -7,5 +7,4 @@ import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface SysSensitiveWordMapper extends PigxBaseMapper<SysSensitiveWordEntity> {
}
@@ -23,7 +23,6 @@ import com.pig4cloud.pigx.admin.api.entity.SysTenantUser;
import com.pig4cloud.pigx.common.data.datascope.PigxBaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
* 系统租户用户映射接口
*
@@ -20,7 +20,6 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.pig4cloud.pigx.admin.api.entity.SysUserDept;
import org.apache.ibatis.annotations.Mapper;
/**
* 系统用户部门关联Mapper接口
*
@@ -62,7 +62,6 @@ public interface SysUserMapper extends PigxBaseMapper<SysUser> {
/**
* 通过ID查询用户信息
*
* @param id 用户ID
* @return 用户信息VO对象
*/
@@ -25,4 +25,5 @@ public interface SysAreaService extends IService<SysAreaEntity> {
* @return Page
*/
Page selectPage(Page page, SysAreaEntity sysArea);
}
@@ -38,12 +38,11 @@ public interface SysFileService extends IService<SysFile> {
/**
* 上传文件
*
* @param file 文件流
* @param file 文件流
* @param fileName 文件名
* @param dir 存储目录
* @param groupId 文件分组ID
* @param type 文件类型
* @param dir 存储目录
* @param groupId 文件分组ID
* @param type 文件类型
* @return 上传结果
*/
R uploadFile(MultipartFile file, String fileName, String dir, Long groupId, String type);
@@ -57,7 +56,6 @@ public interface SysFileService extends IService<SysFile> {
/**
* 根据文件ID删除文件
*
* @param id 文件ID
* @return 删除是否成功
*/
@@ -37,7 +37,6 @@ public interface SysMessageService extends IService<SysMessageEntity> {
/**
* 读取信息
*
* @param id id
* @return true/false
*/
@@ -45,7 +44,6 @@ public interface SysMessageService extends IService<SysMessageEntity> {
/**
* 获取信息
*
* @param id id
* @return messageVO
*/
@@ -63,7 +61,6 @@ public interface SysMessageService extends IService<SysMessageEntity> {
/**
* 发送手机验证码
*
* @param mobile mobile
* @return code
*/
@@ -71,7 +68,6 @@ public interface SysMessageService extends IService<SysMessageEntity> {
/**
* 发送短信
*
* @param messageSmsDTO 消息 短信 DTO
* @return {@link R }
*/
@@ -79,7 +75,6 @@ public interface SysMessageService extends IService<SysMessageEntity> {
/**
* 发送邮件
*
* @param messageEmailDTO 留言内容 电子邮件 DTO
* @return {@link R }
*/
@@ -87,7 +82,6 @@ public interface SysMessageService extends IService<SysMessageEntity> {
/**
* 发送钩子消息
*
* @param messageHookDTO 消息挂钩 DTO
* @return {@link R }
*/
@@ -95,9 +89,9 @@ public interface SysMessageService extends IService<SysMessageEntity> {
/**
* 列出 Hook 业务代码
*
* @param messageHookDTO 消息钩子 DTO
* @return {@link R }
*/
R listHookBizCode(MessageHookDTO messageHookDTO);
* @return {@link R }
*/
R listHookBizCode(MessageHookDTO messageHookDTO);
}
@@ -39,9 +39,9 @@ public interface SysRouteConfService extends IService<SysRouteConf> {
/**
* 保存路由
*
* @param routeConf 路由配置
* @return {@link SysRouteConf }
*/
SysRouteConf saveRoute(SysRouteConf routeConf);
}
@@ -9,6 +9,7 @@ public interface SysSensitiveWordService extends IService<SysSensitiveWordEntity
/**
* 查询敏感词
*
* @param sysSensitiveWord 敏感词
* @return 敏感词列表
*/
@@ -16,8 +17,10 @@ public interface SysSensitiveWordService extends IService<SysSensitiveWordEntity
/**
* 保存敏感词
*
* @param sysSensitiveWord
* @return
*/
Boolean saveSensitive(SysSensitiveWordEntity sysSensitiveWord);
}
@@ -48,4 +48,5 @@ public interface SysSocialDetailsService extends IService<SysSocialDetails> {
UserInfo getUserInfo(String inStr);
List<SysSocialDetailsVO> selectList();
}
@@ -37,4 +37,5 @@ public interface SysSystemConfigService extends IService<SysSystemConfigEntity>
* @return {@link R }
*/
R updateSystemConfig(SysSystemConfigEntity sysSystemConfig);
}
@@ -37,39 +37,35 @@ import java.util.Map;
public interface SysTenantService extends IService<SysTenant> {
/**
* 获取正常的租户列表
*
* @return 正常的租户列表
* 获取正常的租户列表
* @return 正常的租户列表
*/
List<SysTenant> getNormalTenant();
/**
* 保存租户信息
*
* @param sysTenant 租户信息对象
* @return 保存是否成功
* 保存租户信息
* @param sysTenant 租户信息对象
* @return 保存是否成功
*/
Boolean saveTenant(SysTenant sysTenant);
/**
* 修改租户信息
*
* @param sysTenant 租户信息对象
* @return 修改是否成功
* 修改租户信息
* @param sysTenant 租户信息对象
* @return 修改是否成功
*/
Boolean updateTenant(SysTenant sysTenant);
/**
* 获取用户所属租户列表
*
* @return 用户所属租户列表
*/
List<SysTenant> getUserTenant();
/**
* 获取用户所属租户列表
*
* @return 用户所属租户列表
*/
List<SysTenant> getUserTenant();
/**
* 获取用户租户分页信息
*
* @param page 分页参数
* @param page 分页参数
* @param userDTO 用户信息
* @return 用户租户分页结果
*/
@@ -77,7 +73,6 @@ public interface SysTenantService extends IService<SysTenant> {
/**
* 移除租户用户
*
* @param tenantUserDTO 租户用户信息
* @return 是否移除成功
*/
@@ -85,7 +80,6 @@ public interface SysTenantService extends IService<SysTenant> {
/**
* 根据用户信息查询租户用户列表
*
* @param userDTO 用户信息传输对象
* @return 租户用户列表
*/
@@ -93,7 +87,6 @@ public interface SysTenantService extends IService<SysTenant> {
/**
* 保存租户用户信息
*
* @param tenantUserDTO 租户用户信息DTO
* @return 保存是否成功
*/
@@ -101,7 +94,6 @@ public interface SysTenantService extends IService<SysTenant> {
/**
* 获取租户角色列表
*
* @param userDTO 用户信息
* @return 租户角色列表
*/
@@ -109,7 +101,6 @@ public interface SysTenantService extends IService<SysTenant> {
/**
* 移除租户
*
* @param ids 租户ID列表
* @return 是否移除成功
*/
@@ -117,7 +108,6 @@ public interface SysTenantService extends IService<SysTenant> {
/**
* 更新用户租户信息
*
* @param userDto 用户数据传输对象
* @return 更新结果
*/
@@ -127,4 +117,5 @@ public interface SysTenantService extends IService<SysTenant> {
* 检查或更新租户信息
*/
Long getOrUpdateTenant();
}
@@ -39,161 +39,147 @@ import java.util.List;
*/
public interface SysUserService extends IService<SysUser> {
/**
* 查询用户信息
*
* @param userDTO 用户数据传输对象
* @return 用户信息对象
*/
R<UserInfo> getUserInfo(UserDTO userDTO);
/**
* 查询用户信息
*
* @param userDTO 用户数据传输对象
* @return 用户信息对象
*/
R<UserInfo> getUserInfo(UserDTO userDTO);
/**
* 分页查询用户信息(含有角色信息)
*
* @param page 分页对象
* @param userDTO 参数列表
* @return
*/
IPage getUsersWithRolePage(Page page, UserDTO userDTO);
/**
* 分页查询用户信息(含有角色信息)
*
* @param page 分页对象
* @param userDTO 参数列表
* @return
*/
IPage getUsersWithRolePage(Page page, UserDTO userDTO);
/**
* 删除用户
*
* @param ids 用户
* @return boolean
*/
Boolean deleteUserByIds(Long[] ids);
/**
* 删除用户
* @param ids 用户
* @return boolean
*/
Boolean deleteUserByIds(Long[] ids);
/**
* 更新当前用户基本信息
*
* @param userDto 用户信息
* @return Boolean
*/
R<Boolean> updateUserInfo(UserDTO userDto);
/**
* 更新当前用户基本信息
*
* @param userDto 用户信息
* @return Boolean
*/
R<Boolean> updateUserInfo(UserDTO userDto);
/**
* 更新指定用户信息
*
* @param userDto 用户信息
* @return
*/
Boolean updateUser(UserDTO userDto);
/**
* 更新指定用户信息
* @param userDto 用户信息
* @return
*/
Boolean updateUser(UserDTO userDto);
/**
* 通过ID查询用户信息
*
* @param id 用户ID
* @return 用户信息
*/
UserVO selectUserVoById(Long id);
/**
* 通过ID查询用户信息
* @param id 用户ID
* @return 用户信息
*/
UserVO selectUserVoById(Long id);
/**
* 查询上级部门的用户信息
*
* @param username 用户名
* @return R
*/
List<SysUser> listAncestorUsers(String username);
/**
* 查询上级部门的用户信息
* @param username 用户名
* @return R
*/
List<SysUser> listAncestorUsers(String username);
/**
* 保存用户信息
*
* @param userDto DTO 对象
* @return success/fail
*/
Boolean saveUser(UserDTO userDto);
/**
* 保存用户信息
* @param userDto DTO 对象
* @return success/fail
*/
Boolean saveUser(UserDTO userDto);
/**
* 查询全部的用户
*
* @param userDTO 查询条件
* @param ids 目标列表
* @return list
*/
List<UserExcelVO> listUser(UserDTO userDTO, Long[] ids);
/**
* 查询全部的用户
* @param userDTO 查询条件
* @param ids 目标列表
* @return list
*/
List<UserExcelVO> listUser(UserDTO userDTO, Long[] ids);
/**
* excel 导入用户
*
* @param excelVOList excel 列表数据
* @param bindingResult 错误数据
* @return ok fail
*/
R importUser(List<UserExcelVO> excelVOList, BindingResult bindingResult);
/**
* excel 导入用户
*
* @param excelVOList excel 列表数据
* @param bindingResult 错误数据
* @return ok fail
*/
R importUser(List<UserExcelVO> excelVOList, BindingResult bindingResult);
/**
* 注册用户
*
* @param userDto 用户信息
* @return success/false
*/
R<Boolean> registerUser(RegisterUserDTO userDto);
/**
* 注册用户
* @param userDto 用户信息
* @return success/false
*/
R<Boolean> registerUser(RegisterUserDTO userDto);
/**
* 锁定用户
*
* @param username 用户名
* @return R
*/
R<Boolean> lockUser(String username);
/**
* 锁定用户
* @param username 用户名
* @return R
*/
R<Boolean> lockUser(String username);
/**
* 修改密码
*
* @param userDto 用户信息
* @return
*/
R changePassword(UserDTO userDto);
/**
* 修改密码
* @param userDto 用户信息
* @return
*/
R changePassword(UserDTO userDto);
/**
* 解绑社交登录
*
* @param type 社交登录类型
* @return R
*/
R unbinding(String type);
/**
* 解绑社交登录
*
* @param type 社交登录类型
* @return R
*/
R unbinding(String type);
/**
* 校验密码
*
* @param username 用户名
* @param password 密码
* @return R
*/
R checkPassword(String username, String password);
/**
* 校验密码
* @param username 用户名
* @param password 密码
* @return R
*/
R checkPassword(String username, String password);
/**
* 根据角色ID列表获取用户ID列表接口
*
* @param roleIdList 角色ID列表
* @return List<Long> 返回结果对象,包含根据角色ID列表获取到的用户ID列表信息
*/
List<Long> listUserIdByRoleIds(List<Long> roleIdList);
/**
* 根据角色ID列表获取用户ID列表接口
* @param roleIdList 角色ID列表
* @return List<Long> 返回结果对象,包含根据角色ID列表获取到的用户ID列表信息
*/
List<Long> listUserIdByRoleIds(List<Long> roleIdList);
/**
* 根据部门ID列表获取用户ID列表接口
*
* @param deptIdList 部门ID列表
* @return List<Long> 返回结果对象,包含根据部门ID列表获取到的用户ID列表信息
*/
List<SysUser> listUserIdByDeptIds(List<Long> deptIdList);
/**
* 根据部门ID列表获取用户ID列表接口
* @param deptIdList 部门ID列表
* @return List<Long> 返回结果对象,包含根据部门ID列表获取到的用户ID列表信息
*/
List<SysUser> listUserIdByDeptIds(List<Long> deptIdList);
/**
* 重置用户密码
*
* @param userDto 用户信息
* @return
*/
R<Boolean> resetUserPassword(RegisterUserDTO userDto);
/**
* 重置用户密码
* @param userDto 用户信息
* @return
*/
R<Boolean> resetUserPassword(RegisterUserDTO userDto);
/**
* 找回用户密码
*
* @param userDto 用户信息
* @param code 验证码
* @return
*/
R<Boolean> forgetUserPassword(RegisterUserDTO userDto, String code);
/**
* 找回用户密码
* @param userDto 用户信息
* @param code 验证码
* @return
*/
R<Boolean> forgetUserPassword(RegisterUserDTO userDto, String code);
}
@@ -29,6 +29,7 @@ import java.util.Optional;
*/
@Service
public class SysAreaServiceImpl extends ServiceImpl<SysAreaMapper, SysAreaEntity> implements SysAreaService {
/**
* 查询行政区划树
*
@@ -38,13 +39,13 @@ public class SysAreaServiceImpl extends ServiceImpl<SysAreaMapper, SysAreaEntity
@Override
public List<Tree<Long>> selectTree(SysAreaEntity sysArea) {
List<SysAreaEntity> entityList = baseMapper.selectList(Wrappers.lambdaQuery(sysArea)
.eq(SysAreaEntity::getAreaStatus, YesNoEnum.YES.getCode())
.eq(SysAreaEntity::getAreaStatus, YesNoEnum.YES.getCode())
.orderByDesc(SysAreaEntity::getAreaSort));
List<TreeNode<Long>> nodeList = CollUtil.newArrayList();
for (SysAreaEntity sysAreaEntity : entityList) {
TreeNode<Long> treeNode = new TreeNode<>(sysAreaEntity.getAdcode(), sysAreaEntity.getPid()
, sysAreaEntity.getName(), -Optional.ofNullable(sysAreaEntity.getAreaSort()).orElse(0L));
TreeNode<Long> treeNode = new TreeNode<>(sysAreaEntity.getAdcode(), sysAreaEntity.getPid(),
sysAreaEntity.getName(), -Optional.ofNullable(sysAreaEntity.getAreaSort()).orElse(0L));
HashMap<String, Object> extraMap = MapUtil.of(SysAreaEntity.Fields.adcode, sysAreaEntity.getAdcode());
extraMap.put(SysAreaEntity.Fields.hot, sysAreaEntity.getHot());
@@ -70,5 +71,6 @@ public class SysAreaServiceImpl extends ServiceImpl<SysAreaMapper, SysAreaEntity
wrapper.orderByAsc(SysAreaEntity::getAreaType);
wrapper.orderByDesc(SysAreaEntity::getAreaSort);
return baseMapper.selectPage(page, wrapper);
}
}
}
@@ -73,7 +73,6 @@ public class SysDeptServiceImpl extends ServiceImpl<SysDeptMapper, SysDept> impl
/**
* 删除部门
*
* @param id 部门 ID
* @return 成功、失败
*/
@@ -90,7 +89,6 @@ public class SysDeptServiceImpl extends ServiceImpl<SysDeptMapper, SysDept> impl
/**
* 查询全部部门树
*
* @param deptName
* @param parentId
* @return 树 部门名称
@@ -99,33 +97,33 @@ public class SysDeptServiceImpl extends ServiceImpl<SysDeptMapper, SysDept> impl
public List<Tree<Long>> selectTree(String deptName, Long parentId) {
// 查询全部部门
List<SysDept> deptAllList = deptMapper
.selectList(Wrappers.<SysDept>lambdaQuery().like(StrUtil.isNotBlank(deptName), SysDept::getName, deptName));
.selectList(Wrappers.<SysDept>lambdaQuery().like(StrUtil.isNotBlank(deptName), SysDept::getName, deptName));
// 查询数据权限内部门
List<Long> deptOwnIdList = deptMapper
.selectListByScope(
Wrappers.<SysDept>lambdaQuery().like(StrUtil.isNotBlank(deptName), SysDept::getName, deptName),
DataScope.of())
.stream()
.map(SysDept::getDeptId)
.toList();
.selectListByScope(
Wrappers.<SysDept>lambdaQuery().like(StrUtil.isNotBlank(deptName), SysDept::getName, deptName),
DataScope.of())
.stream()
.map(SysDept::getDeptId)
.toList();
// 权限内部门
List<TreeNode<Long>> collect = deptAllList.stream()
.filter(dept -> dept.getDeptId().intValue() != dept.getParentId())
.sorted(Comparator.comparingInt(SysDept::getSortOrder))
.map(dept -> {
TreeNode<Long> treeNode = new TreeNode<>();
treeNode.setId(dept.getDeptId());
treeNode.setParentId(dept.getParentId());
treeNode.setName(dept.getName());
treeNode.setWeight(dept.getSortOrder());
// 有权限不返回标识
Map<String, Object> extra = new HashMap<>(8);
extra.put("isLock", !deptOwnIdList.contains(dept.getDeptId()));
extra.put("createTime", dept.getCreateTime());
treeNode.setExtra(extra);
return treeNode;
})
.filter(dept -> dept.getDeptId().intValue() != dept.getParentId())
.sorted(Comparator.comparingInt(SysDept::getSortOrder))
.map(dept -> {
TreeNode<Long> treeNode = new TreeNode<>();
treeNode.setId(dept.getDeptId());
treeNode.setParentId(dept.getParentId());
treeNode.setName(dept.getName());
treeNode.setWeight(dept.getSortOrder());
// 有权限不返回标识
Map<String, Object> extra = new HashMap<>(8);
extra.put("isLock", !deptOwnIdList.contains(dept.getDeptId()));
extra.put("createTime", dept.getCreateTime());
treeNode.setExtra(extra);
return treeNode;
})
.toList();
// 模糊查询 不组装树结构 直接返回 表格方便编辑
@@ -143,7 +141,6 @@ public class SysDeptServiceImpl extends ServiceImpl<SysDeptMapper, SysDept> impl
/**
* 导出部门
*
* @return
*/
@Override
@@ -153,10 +150,10 @@ public class SysDeptServiceImpl extends ServiceImpl<SysDeptMapper, SysDept> impl
DeptExcelVO deptExcelVo = new DeptExcelVO();
deptExcelVo.setName(item.getName());
Optional<String> first = this.list()
.stream()
.filter(it -> item.getParentId().equals(it.getDeptId()))
.map(SysDept::getName)
.findFirst();
.stream()
.filter(it -> item.getParentId().equals(it.getDeptId()))
.map(SysDept::getName)
.findFirst();
deptExcelVo.setParentName(first.orElse("根部门"));
deptExcelVo.setSortOrder(item.getSortOrder());
return deptExcelVo;
@@ -189,7 +186,7 @@ public class SysDeptServiceImpl extends ServiceImpl<SysDeptMapper, SysDept> impl
sysDept.setParentId(one.getDeptId());
sysDept.setSortOrder(item.getSortOrder());
baseMapper.insert(sysDept);
} else {
} else {
// 数据不合法情况
errorMessageList.add(new ErrorMessage(item.getLineNum(), errorMsg));
}
@@ -202,7 +199,6 @@ public class SysDeptServiceImpl extends ServiceImpl<SysDeptMapper, SysDept> impl
/**
* 查询所有子节点 (包含当前节点)
*
* @param deptId 部门ID 目标部门ID
* @return ID
*/
@@ -224,37 +220,36 @@ public class SysDeptServiceImpl extends ServiceImpl<SysDeptMapper, SysDept> impl
* 获取部门负责人
* <p>
* 1. 根据dept 查询用户 2. 筛选用户列表中 post
*
* @param deptId deptId
* @return user id list
*/
@Override
public List<Long> listDeptLeader(Long deptId) {
List<SysUserDept> userDeptList = userDeptMapper.selectList(Wrappers.<SysUserDept>lambdaQuery().eq(SysUserDept::getDeptId, deptId));
List<SysUserDept> userDeptList = userDeptMapper
.selectList(Wrappers.<SysUserDept>lambdaQuery().eq(SysUserDept::getDeptId, deptId));
if (CollUtil.isEmpty(userDeptList)) {
return null;
}
SysPost deptLeader = postMapper
.selectOne(Wrappers.<SysPost>lambdaQuery().eq(SysPost::getPostCode, PostCodeEnum.TEAM_LEADER.getCode()));
.selectOne(Wrappers.<SysPost>lambdaQuery().eq(SysPost::getPostCode, PostCodeEnum.TEAM_LEADER.getCode()));
if (deptLeader == null) {
return null;
}
List<Long> userIdList = userDeptList.stream().map(SysUserDept::getUserId).toList();
return userPostMapper.selectList(Wrappers.<SysUserPost>lambdaQuery().in(SysUserPost::getUserId, userIdList))
.stream()
.filter(post -> Objects.equals(post.getPostId(), deptLeader.getPostId()))
.map(SysUserPost::getUserId)
.toList();
.stream()
.filter(post -> Objects.equals(post.getPostId(), deptLeader.getPostId()))
.map(SysUserPost::getUserId)
.toList();
}
/**
* 根据父部门ID和类型获取组织树
*
* @param parentDeptId 父部门ID
* @param type 类型
* @param type 类型
* @return 组织树信息
*/
public Map<String, Object> listOrgTree(Long parentDeptId, String type) {
@@ -275,15 +270,15 @@ public class SysDeptServiceImpl extends ServiceImpl<SysDeptMapper, SysDept> impl
});
return Dict.create()
.set("roleList", orgs)
.set("childDepartments", orgs)
.set("employees", new ArrayList<>());
.set("roleList", orgs)
.set("childDepartments", orgs)
.set("employees", new ArrayList<>());
}
Dict dict = Dict.create()
.set("titleDepartments", new ArrayList<>())
.set("roleList", new ArrayList<>())
.set("employees", new ArrayList<>());
.set("titleDepartments", new ArrayList<>())
.set("roleList", new ArrayList<>())
.set("employees", new ArrayList<>());
List<SysDept> deptList = this.list(
Wrappers.<SysDept>lambdaQuery().eq(Objects.nonNull(parentDeptId), SysDept::getParentId, parentDeptId));
@@ -306,8 +301,8 @@ public class SysDeptServiceImpl extends ServiceImpl<SysDeptMapper, SysDept> impl
MPJLambdaWrapper<SysUser> userQuery = new MPJLambdaWrapper<>();
userQuery.selectAll(SysUser.class)
.leftJoin(SysUserDept.class, SysUserDept::getUserId, SysUser::getUserId)
.eq(SysUserDept::getDeptId, parentDeptId);
.leftJoin(SysUserDept.class, SysUserDept::getUserId, SysUser::getUserId)
.eq(SysUserDept::getDeptId, parentDeptId);
List<SysUser> userList = userMapper.selectJoinList(userQuery);
@@ -334,30 +329,28 @@ public class SysDeptServiceImpl extends ServiceImpl<SysDeptMapper, SysDept> impl
/**
* 模糊搜索用户
*
* @param username 用户名/拼音/首字母
* @return 匹配到的用户
*/
public List<OrgTreeVO> getOrgTreeUser(String username) {
return userMapper.selectList(Wrappers.<SysUser>lambdaQuery().like(SysUser::getUsername, username))
.stream()
.map(user -> {
OrgTreeVO orgTreeVo = new OrgTreeVO();
orgTreeVo.setId(user.getUserId());
orgTreeVo.setName(user.getUsername());
orgTreeVo.setType(OrgTypeEnum.USER.getType());
orgTreeVo.setSelected(false);
orgTreeVo.setAvatar(user.getAvatar());
return orgTreeVo;
})
.stream()
.map(user -> {
OrgTreeVO orgTreeVo = new OrgTreeVO();
orgTreeVo.setId(user.getUserId());
orgTreeVo.setName(user.getUsername());
orgTreeVo.setType(OrgTypeEnum.USER.getType());
orgTreeVo.setSelected(false);
orgTreeVo.setAvatar(user.getAvatar());
return orgTreeVo;
})
.toList();
}
/**
* 递归查询所有子节点。
*
* @param allDeptList 所有部门列表
* @param parentId 父部门ID
* @param parentId 父部门ID
* @param resDeptList 结果集合
*/
private void recursiveDept(List<SysDept> allDeptList, Long parentId, List<SysDept> resDeptList) {
@@ -123,7 +123,8 @@ public class SysFileServiceImpl extends ServiceImpl<SysFileMapper, SysFile> impl
fileName = urlFileName;
}
SysFile sysFile = baseMapper.selectOne(Wrappers.<SysFile>lambdaQuery().eq(SysFile::getFileName, fileName), false);
SysFile sysFile = baseMapper.selectOne(Wrappers.<SysFile>lambdaQuery().eq(SysFile::getFileName, fileName),
false);
if (Objects.isNull(sysFile)) {
log.warn("文件不存在: {}", fileName);
return;
@@ -133,7 +134,8 @@ public class SysFileServiceImpl extends ServiceImpl<SysFileMapper, SysFile> impl
response.setContentType("application/octet-stream; charset=UTF-8");
// 文件唯一hash
response.addHeader(SysFile.Fields.hash, sysFile.getHash());
response.addHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + URLUtil.encode(sysFile.getOriginal()));
response.addHeader(HttpHeaders.CONTENT_DISPOSITION,
"attachment; filename=" + URLUtil.encode(sysFile.getOriginal()));
IoUtil.copy(s3Object.getObjectContent(), response.getOutputStream());
} catch (Exception e) {
log.error("文件读取异常: {}", e.getLocalizedMessage());
@@ -227,7 +229,8 @@ public class SysFileServiceImpl extends ServiceImpl<SysFileMapper, SysFile> impl
file.setGroupId(fileGroupDTO.getGroupId());
// 根据IDS更新对应的SysFile记录
baseMapper.update(file, Wrappers.<SysFile>lambdaQuery().in(SysFile::getId, CollUtil.toList(fileGroupDTO.getIds())));
baseMapper.update(file,
Wrappers.<SysFile>lambdaQuery().in(SysFile::getId, CollUtil.toList(fileGroupDTO.getIds())));
return Boolean.TRUE;
}
@@ -259,12 +262,12 @@ public class SysFileServiceImpl extends ServiceImpl<SysFileMapper, SysFile> impl
sysFile.setOriginal(originalFilename);
sysFile.setFileSize(file.getSize());
sysFile.setBucketName(properties.getBucketName());
sysFile.setType(type);
sysFile.setGroupId(groupId);
sysFile.setType(type);
sysFile.setGroupId(groupId);
sysFile.setHash(SecureUtil.md5(file.getInputStream()));
// 调用save方法保存SysFile对象
this.save(sysFile);
}
sysFile.setHash(SecureUtil.md5(file.getInputStream()));
// 调用save方法保存SysFile对象
this.save(sysFile);
}
}
@@ -131,10 +131,12 @@ public class SysLogServiceImpl extends ServiceImpl<SysLogMapper, SysLog> impleme
return sysLogList.stream()
// 按照日期进行分组
.collect(Collectors.groupingBy(log -> DateUtil.format(log.getCreateTime(), DatePattern.NORM_DATE_PATTERN)))
.entrySet().stream()
.entrySet()
.stream()
// 将每个日期对应的日志按日志类型分组,并计算每种类型的日志数量
.map(entry -> {
Map<String, Object> map = entry.getValue().stream()
Map<String, Object> map = entry.getValue()
.stream()
.collect(Collectors.groupingBy(SysLog::getLogType,
Collectors.collectingAndThen(Collectors.counting(), Long::intValue)));
map.put(SysLog.Fields.createTime, entry.getKey());
@@ -142,7 +144,7 @@ public class SysLogServiceImpl extends ServiceImpl<SysLogMapper, SysLog> impleme
})
// 按createTime升序排序
.sorted(Comparator.comparing(map -> map.get(SysLog.Fields.createTime).toString()))
.toList();
}
.toList();
}
}
@@ -109,7 +109,7 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
List<TreeNode<Long>> collect = baseMapper
.selectList(Wrappers.<SysMenu>lambdaQuery()
.eq(Objects.nonNull(parentId),SysMenu::getParentId, parentId)
.eq(Objects.nonNull(parentId), SysMenu::getParentId, parentId)
.like(StrUtil.isNotBlank(menuName), SysMenu::getName, menuName)
.eq(StrUtil.isNotBlank(type), SysMenu::getMenuType, type)
.orderByAsc(SysMenu::getSortOrder))
@@ -86,7 +86,6 @@ import java.util.Arrays;
import java.util.List;
import java.util.Objects;
/**
* 站内信息
*
@@ -96,12 +95,15 @@ import java.util.Objects;
@Slf4j
@Service
@RequiredArgsConstructor
public class SysMessageServiceImpl extends ServiceImpl<SysMessageMapper, SysMessageEntity> implements SysMessageService {
public class SysMessageServiceImpl extends ServiceImpl<SysMessageMapper, SysMessageEntity>
implements SysMessageService {
/**
* 支持短信服务商
*/
private static final Class[] SUPPORT_CONFIG_CLAZZ = {AlibabaConfig.class, CloopenConfig.class, CtyunConfig.class, EmayConfig.class, HuaweiConfig.class, JdCloudConfig.class, NeteaseConfig.class, TencentConfig.class, UniConfig.class, YunpianConfig.class, ZhutongConfig.class, DingZhongConfig.class, QiNiuConfig.class};
private static final Class[] SUPPORT_CONFIG_CLAZZ = {AlibabaConfig.class, CloopenConfig.class, CtyunConfig.class,
EmayConfig.class, HuaweiConfig.class, JdCloudConfig.class, NeteaseConfig.class, TencentConfig.class,
UniConfig.class, YunpianConfig.class, ZhutongConfig.class, DingZhongConfig.class, QiNiuConfig.class};
private final RemoteLogService remoteLogService;
@@ -149,7 +151,8 @@ public class SysMessageServiceImpl extends ServiceImpl<SysMessageMapper, SysMess
}
// 删除原有用户
relationMapper.delete(Wrappers.<SysMessageRelationEntity>lambdaQuery().eq(SysMessageRelationEntity::getMsgId, messageEntity.getId()));
relationMapper.delete(Wrappers.<SysMessageRelationEntity>lambdaQuery()
.eq(SysMessageRelationEntity::getMsgId, messageEntity.getId()));
List<OrgTreeVO> userList = sysMessage.getUserList();
if (CollUtil.isNotEmpty(userList)) {
@@ -177,7 +180,17 @@ public class SysMessageServiceImpl extends ServiceImpl<SysMessageMapper, SysMess
*/
@Override
public IPage<SysMessageVO> pageUserMessage(Page page, SysMessageVO sysMessage) {
MPJLambdaWrapper<SysMessageEntity> wrapper = new MPJLambdaWrapper<SysMessageEntity>().selectAll(SysMessageEntity.class).select(SysMessageRelationEntity::getReadFlag).leftJoin(SysMessageRelationEntity.class, SysMessageRelationEntity::getMsgId, SysMessageEntity::getId).eq(SysMessageRelationEntity::getUserId, SecurityUtils.getUser().getId()).eq(SysMessageEntity::getSendFlag, YesNoEnum.YES.getCode()).eq(StrUtil.isNotBlank(sysMessage.getCategory()), SysMessageEntity::getCategory, sysMessage.getCategory()).eq(StrUtil.isNotBlank(sysMessage.getReadFlag()), SysMessageRelationEntity::getReadFlag, sysMessage.getReadFlag()).orderByDesc(SysMessageEntity::getSort).orderByDesc(SysMessageEntity::getCreateTime);
MPJLambdaWrapper<SysMessageEntity> wrapper = new MPJLambdaWrapper<SysMessageEntity>()
.selectAll(SysMessageEntity.class)
.select(SysMessageRelationEntity::getReadFlag)
.leftJoin(SysMessageRelationEntity.class, SysMessageRelationEntity::getMsgId, SysMessageEntity::getId)
.eq(SysMessageRelationEntity::getUserId, SecurityUtils.getUser().getId())
.eq(SysMessageEntity::getSendFlag, YesNoEnum.YES.getCode())
.eq(StrUtil.isNotBlank(sysMessage.getCategory()), SysMessageEntity::getCategory, sysMessage.getCategory())
.eq(StrUtil.isNotBlank(sysMessage.getReadFlag()), SysMessageRelationEntity::getReadFlag,
sysMessage.getReadFlag())
.orderByDesc(SysMessageEntity::getSort)
.orderByDesc(SysMessageEntity::getCreateTime);
return baseMapper.selectJoinPage(page, SysMessageVO.class, wrapper);
}
@@ -191,7 +204,10 @@ public class SysMessageServiceImpl extends ServiceImpl<SysMessageMapper, SysMess
public Boolean readMessage(Long id) {
SysMessageRelationEntity relationEntity = new SysMessageRelationEntity();
relationEntity.setReadFlag(YesNoEnum.YES.getCode());
relationMapper.update(relationEntity, Wrappers.<SysMessageRelationEntity>lambdaQuery().eq(SysMessageRelationEntity::getMsgId, id).eq(SysMessageRelationEntity::getUserId, SecurityUtils.getUser().getId()));
relationMapper.update(relationEntity,
Wrappers.<SysMessageRelationEntity>lambdaQuery()
.eq(SysMessageRelationEntity::getMsgId, id)
.eq(SysMessageRelationEntity::getUserId, SecurityUtils.getUser().getId()));
return Boolean.TRUE;
}
@@ -211,7 +227,11 @@ public class SysMessageServiceImpl extends ServiceImpl<SysMessageMapper, SysMess
if (messageEntity.getAllFlag().equals(YesNoEnum.YES.getCode())) {
return SysMessageVO;
}
List<Long> userIdList = relationMapper.selectList(Wrappers.<SysMessageRelationEntity>lambdaQuery().eq(SysMessageRelationEntity::getMsgId, id)).stream().map(SysMessageRelationEntity::getUserId).toList();
List<Long> userIdList = relationMapper
.selectList(Wrappers.<SysMessageRelationEntity>lambdaQuery().eq(SysMessageRelationEntity::getMsgId, id))
.stream()
.map(SysMessageRelationEntity::getUserId)
.toList();
if (CollUtil.isNotEmpty(userIdList)) {
List<OrgTreeVO> orgNodeUserVoList = userMapper.selectByIds(userIdList).stream().map(user -> {
@@ -238,7 +258,14 @@ public class SysMessageServiceImpl extends ServiceImpl<SysMessageMapper, SysMess
*/
@Override
public Page pageUserRead(Page page, Long messageId, String name) {
MPJLambdaWrapper<SysMessageRelationEntity> wrapper = new MPJLambdaWrapper<SysMessageRelationEntity>().selectAll(SysMessageRelationEntity.class).select(SysUser::getUsername, SysUser::getName, SysUser::getUserId).select(SysMessageEntity::getTitle).leftJoin(SysUser.class, SysUser::getUserId, SysMessageRelationEntity::getUserId).leftJoin(SysMessageEntity.class, SysMessageEntity::getId, SysMessageRelationEntity::getMsgId).eq(SysMessageRelationEntity::getMsgId, messageId).like(StrUtil.isNotBlank(name), SysUser::getName, name);
MPJLambdaWrapper<SysMessageRelationEntity> wrapper = new MPJLambdaWrapper<SysMessageRelationEntity>()
.selectAll(SysMessageRelationEntity.class)
.select(SysUser::getUsername, SysUser::getName, SysUser::getUserId)
.select(SysMessageEntity::getTitle)
.leftJoin(SysUser.class, SysUser::getUserId, SysMessageRelationEntity::getUserId)
.leftJoin(SysMessageEntity.class, SysMessageEntity::getId, SysMessageRelationEntity::getMsgId)
.eq(SysMessageRelationEntity::getMsgId, messageId)
.like(StrUtil.isNotBlank(name), SysUser::getName, name);
return relationMapper.selectJoinPage(page, SysMessageReadVO.class, wrapper);
}
@@ -250,14 +277,16 @@ public class SysMessageServiceImpl extends ServiceImpl<SysMessageMapper, SysMess
*/
@Override
public R<Boolean> sendSmsCode(String mobile) {
List<SysUser> userList = userMapper.selectList(Wrappers.<SysUser>query().lambda().eq(SysUser::getPhone, mobile));
List<SysUser> userList = userMapper
.selectList(Wrappers.<SysUser>query().lambda().eq(SysUser::getPhone, mobile));
if (CollUtil.isEmpty(userList)) {
log.info("手机号未注册:{}", mobile);
return R.ok(Boolean.FALSE, MsgUtils.getMessage(ErrorCodes.SYS_APP_PHONE_UNREGISTERED, mobile));
}
String codeObj = RedisUtils.get(CacheConstants.DEFAULT_CODE_KEY + LoginTypeEnum.SMS.getType() + StringPool.AT + mobile);
String codeObj = RedisUtils
.get(CacheConstants.DEFAULT_CODE_KEY + LoginTypeEnum.SMS.getType() + StringPool.AT + mobile);
if (StrUtil.isNotBlank(codeObj)) {
log.info("手机号验证码未过期:{},{}", mobile, codeObj);
@@ -266,10 +295,15 @@ public class SysMessageServiceImpl extends ServiceImpl<SysMessageMapper, SysMess
String code = RandomUtil.randomNumbers(Integer.parseInt(SecurityConstants.CODE_SIZE));
log.info("手机号生成验证码成功:{},{}", mobile, code);
RedisUtils.set(CacheConstants.DEFAULT_CODE_KEY + LoginTypeEnum.SMS.getType() + StringPool.AT + mobile, code, SecurityConstants.CODE_TIME);
RedisUtils.set(CacheConstants.DEFAULT_CODE_KEY + LoginTypeEnum.SMS.getType() + StringPool.AT + mobile, code,
SecurityConstants.CODE_TIME);
// 发送
return this.sendSms(MessageSmsDTO.builder().mobile(mobile).biz(SmsBizCodeEnum.SMS_NORMAL_CODE.getCode()).param(code).build());
return this.sendSms(MessageSmsDTO.builder()
.mobile(mobile)
.biz(SmsBizCodeEnum.SMS_NORMAL_CODE.getCode())
.param(code)
.build());
}
/**
@@ -282,7 +316,11 @@ public class SysMessageServiceImpl extends ServiceImpl<SysMessageMapper, SysMess
public R sendSms(MessageSmsDTO messageSmsDTO) {
// 根据业务编码获取短信通道配置
List<SysSystemConfigEntity> configEntityList = sysSystemConfigMapper.selectList(Wrappers.<SysSystemConfigEntity>lambdaQuery().eq(SysSystemConfigEntity::getConfigType, SystemConfigTypeEnum.SMS.getValue()).eq(SysSystemConfigEntity::getConfigStatus, YesNoEnum.YES.getCode()).eq(SysSystemConfigEntity::getConfigKey, messageSmsDTO.getBizCode()));
List<SysSystemConfigEntity> configEntityList = sysSystemConfigMapper
.selectList(Wrappers.<SysSystemConfigEntity>lambdaQuery()
.eq(SysSystemConfigEntity::getConfigType, SystemConfigTypeEnum.SMS.getValue())
.eq(SysSystemConfigEntity::getConfigStatus, YesNoEnum.YES.getCode())
.eq(SysSystemConfigEntity::getConfigKey, messageSmsDTO.getBizCode()));
if (CollUtil.isEmpty(configEntityList)) {
return R.failed("发送失败,短信通道配置不存在");
}
@@ -293,7 +331,12 @@ public class SysMessageServiceImpl extends ServiceImpl<SysMessageMapper, SysMess
// 组装SMS4J 的发送对象
SmsBlend smsBlend = SmsFactory.getSmsBlend(messageSmsDTO.getBizCode());
if (Objects.isNull(smsBlend)) {
Class targetClass = Arrays.stream(SUPPORT_CONFIG_CLAZZ).filter(config -> config.getSimpleName().toLowerCase().contains(configMap.getStr(MessageSmsDTO.Fields.supplier))).findFirst().orElseThrow(() -> new CheckedException("发送失败,短信通道配置不存在"));
Class targetClass = Arrays.stream(SUPPORT_CONFIG_CLAZZ)
.filter(config -> config.getSimpleName()
.toLowerCase()
.contains(configMap.getStr(MessageSmsDTO.Fields.supplier)))
.findFirst()
.orElseThrow(() -> new CheckedException("发送失败,短信通道配置不存在"));
BaseConfig baseConfig = (BaseConfig) JSONUtil.toBean(configEntity.getConfigValue(), targetClass);
// 如果渠道扩展参数不为空则增加特性化参数
@@ -312,16 +355,17 @@ public class SysMessageServiceImpl extends ServiceImpl<SysMessageMapper, SysMess
Long start = System.currentTimeMillis();
sysLog.setTenantId(TenantContextHolder.getTenantId());
for (String mobile : messageSmsDTO.getMobiles()) {
smsBlend.sendMessageAsync(mobile, configMap.getStr(MessageSmsDTO.Fields.templateId), messageSmsDTO.getParams(), smsResponse -> {
log.info("发送短信结果:{}", smsResponse);
sysLog.setTitle(String.format("发送短信 %s", mobile));
sysLog.setLogType(LogTypeEnum.NORMAL.getType());
sysLog.setServiceId(SystemConfigTypeEnum.SMS.getValue());
sysLog.setParams(JacksonSensitiveFieldUtil.writeValueAsString(messageSmsDTO));
sysLog.setTime(System.currentTimeMillis() - start);
sysLog.setException(JacksonSensitiveFieldUtil.writeValueAsString(smsResponse));
remoteLogService.saveLog(sysLog);
});
smsBlend.sendMessageAsync(mobile, configMap.getStr(MessageSmsDTO.Fields.templateId),
messageSmsDTO.getParams(), smsResponse -> {
log.info("发送短信结果:{}", smsResponse);
sysLog.setTitle(String.format("发送短信 %s", mobile));
sysLog.setLogType(LogTypeEnum.NORMAL.getType());
sysLog.setServiceId(SystemConfigTypeEnum.SMS.getValue());
sysLog.setParams(JacksonSensitiveFieldUtil.writeValueAsString(messageSmsDTO));
sysLog.setTime(System.currentTimeMillis() - start);
sysLog.setException(JacksonSensitiveFieldUtil.writeValueAsString(smsResponse));
remoteLogService.saveLog(sysLog);
});
}
return R.ok();
}
@@ -336,10 +380,11 @@ public class SysMessageServiceImpl extends ServiceImpl<SysMessageMapper, SysMess
public R sendHook(MessageHookDTO messageHookDTO) {
// 根据业务编码获取短信通道配置
List<SysSystemConfigEntity> configEntityList = sysSystemConfigMapper.selectList(Wrappers.<SysSystemConfigEntity>lambdaQuery()
.eq(SysSystemConfigEntity::getConfigType, SystemConfigTypeEnum.WEBHOOK.getValue())
.eq(SysSystemConfigEntity::getConfigStatus, YesNoEnum.YES.getCode())
.eq(SysSystemConfigEntity::getConfigKey, messageHookDTO.getBizCode()));
List<SysSystemConfigEntity> configEntityList = sysSystemConfigMapper
.selectList(Wrappers.<SysSystemConfigEntity>lambdaQuery()
.eq(SysSystemConfigEntity::getConfigType, SystemConfigTypeEnum.WEBHOOK.getValue())
.eq(SysSystemConfigEntity::getConfigStatus, YesNoEnum.YES.getCode())
.eq(SysSystemConfigEntity::getConfigKey, messageHookDTO.getBizCode()));
if (CollUtil.isEmpty(configEntityList)) {
return R.failed("发送失败,短信通道配置不存在");
}
@@ -366,7 +411,6 @@ public class SysMessageServiceImpl extends ServiceImpl<SysMessageMapper, SysMess
OaFactory.createAndRegisterOaSender(byteTalkConfig);
}
if (StrUtil.equalsAnyIgnoreCase(OaType.WE_TALK.toString(), supplier)) {
WeTalkConfig weTalkConfig = new WeTalkConfig();
weTalkConfig.setConfigId(messageHookDTO.getBizCode());
@@ -377,7 +421,6 @@ public class SysMessageServiceImpl extends ServiceImpl<SysMessageMapper, SysMess
alarm = OaFactory.getSmsOaBlend(messageHookDTO.getBizCode());
}
Request request = new Request();
request.setContent(messageHookDTO.getMessageContent());
request.setTitle(messageHookDTO.getMessageTitle());
@@ -389,16 +432,18 @@ public class SysMessageServiceImpl extends ServiceImpl<SysMessageMapper, SysMess
SysLogDTO sysLog = SysLogUtils.getSysLog();
sysLog.setTenantId(TenantContextHolder.getTenantId());
Long start = System.currentTimeMillis();
alarm.senderAsync(request, MessageType.valueOf(String.format("%s_%s", supplier, messageHookDTO.getMessageType()).toUpperCase()), response -> {
log.info("发送Hook结果:{}", response);
sysLog.setTitle(String.format("发送Hook %s", messageHookDTO.getBizCode()));
sysLog.setLogType(LogTypeEnum.NORMAL.getType());
sysLog.setServiceId(SystemConfigTypeEnum.WEBHOOK.getValue());
sysLog.setParams(JacksonSensitiveFieldUtil.writeValueAsString(messageHookDTO));
sysLog.setTime(System.currentTimeMillis() - start);
sysLog.setException(JacksonSensitiveFieldUtil.writeValueAsString(response));
remoteLogService.saveLog(sysLog);
});
alarm.senderAsync(request,
MessageType.valueOf(String.format("%s_%s", supplier, messageHookDTO.getMessageType()).toUpperCase()),
response -> {
log.info("发送Hook结果:{}", response);
sysLog.setTitle(String.format("发送Hook %s", messageHookDTO.getBizCode()));
sysLog.setLogType(LogTypeEnum.NORMAL.getType());
sysLog.setServiceId(SystemConfigTypeEnum.WEBHOOK.getValue());
sysLog.setParams(JacksonSensitiveFieldUtil.writeValueAsString(messageHookDTO));
sysLog.setTime(System.currentTimeMillis() - start);
sysLog.setException(JacksonSensitiveFieldUtil.writeValueAsString(response));
remoteLogService.saveLog(sysLog);
});
return R.ok();
}
@@ -412,22 +457,23 @@ public class SysMessageServiceImpl extends ServiceImpl<SysMessageMapper, SysMess
@Override
public R sendEmail(MessageEmailDTO messageEmailDTO) {
// 根据业务编码获取短信通道配置
List<SysSystemConfigEntity> configEntityList = sysSystemConfigMapper.selectList(Wrappers.<SysSystemConfigEntity>lambdaQuery()
.eq(SysSystemConfigEntity::getConfigType, SystemConfigTypeEnum.EMAIL.getValue())
.eq(SysSystemConfigEntity::getConfigStatus, YesNoEnum.YES.getCode()).
eq(SysSystemConfigEntity::getConfigKey, messageEmailDTO.getBizCode()));
List<SysSystemConfigEntity> configEntityList = sysSystemConfigMapper
.selectList(Wrappers.<SysSystemConfigEntity>lambdaQuery()
.eq(SysSystemConfigEntity::getConfigType, SystemConfigTypeEnum.EMAIL.getValue())
.eq(SysSystemConfigEntity::getConfigStatus, YesNoEnum.YES.getCode())
.eq(SysSystemConfigEntity::getConfigKey, messageEmailDTO.getBizCode()));
if (CollUtil.isEmpty(configEntityList)) {
return R.failed("发送失败,通道配置不存在");
}
SysSystemConfigEntity configEntity = configEntityList.get(0);
JSONObject configMap = JSONUtil.parseObj(configEntity.getConfigValue());
List<File> tempFileList = new ArrayList<>();
if (CollUtil.isNotEmpty(messageEmailDTO.getAttachmentList())) {
TenantContextHolder.setTenantSkip();
for (String fileName : messageEmailDTO.getAttachmentList()) {
SysFile sysFile = fileMapper.selectOne(Wrappers.<SysFile>lambdaQuery().eq(SysFile::getFileName, fileName));
SysFile sysFile = fileMapper
.selectOne(Wrappers.<SysFile>lambdaQuery().eq(SysFile::getFileName, fileName));
S3Object s3Object = fileTemplate.getObject(sysFile.getBucketName(), sysFile.getDir(), fileName);
File file = FileUtil.file(FileUtil.getTmpDirPath(), sysFile.getOriginal());
tempFileList.add(file);
@@ -450,10 +496,9 @@ public class SysMessageServiceImpl extends ServiceImpl<SysMessageMapper, SysMess
String result = template.render(messageEmailDTO.getHtmlValues());
Long start = System.currentTimeMillis();
MailUtil.send(account, messageEmailDTO.getMailAddress(),
messageEmailDTO.getCcList(),
messageEmailDTO.getBccList(),
messageEmailDTO.getTitle(), result, true, tempFileList.toArray(new File[0]));
MailUtil.send(account, messageEmailDTO.getMailAddress(), messageEmailDTO.getCcList(),
messageEmailDTO.getBccList(), messageEmailDTO.getTitle(), result, true,
tempFileList.toArray(new File[0]));
Long end = System.currentTimeMillis();
// 写入日志
SysLogDTO sysLog = SysLogUtils.getSysLog();
@@ -477,9 +522,11 @@ public class SysMessageServiceImpl extends ServiceImpl<SysMessageMapper, SysMess
*/
@Override
public R listHookBizCode(MessageHookDTO messageHookDTO) {
List<SysSystemConfigEntity> configEntityList = sysSystemConfigMapper.selectList(Wrappers.<SysSystemConfigEntity>lambdaQuery()
.eq(SysSystemConfigEntity::getConfigType, messageHookDTO.getMessageType())
.eq(SysSystemConfigEntity::getConfigStatus, YesNoEnum.YES.getCode()));
return R.ok(configEntityList);
}
List<SysSystemConfigEntity> configEntityList = sysSystemConfigMapper
.selectList(Wrappers.<SysSystemConfigEntity>lambdaQuery()
.eq(SysSystemConfigEntity::getConfigType, messageHookDTO.getMessageType())
.eq(SysSystemConfigEntity::getConfigStatus, YesNoEnum.YES.getCode()));
return R.ok(configEntityList);
}
}
@@ -63,7 +63,6 @@ public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> impl
/**
* 通过用户ID查询角色信息
*
* @param userId 用户ID
* @return 角色信息列表
*/
@@ -155,8 +154,8 @@ public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> impl
*/
@Override
public List<RoleExcelVO> listRole(SysRole sysRole, Long[] ids) {
List<SysRole> roleList = this
.list(Wrappers.lambdaQuery(sysRole).in(ArrayUtil.isNotEmpty(ids), SysRole::getRoleId, CollUtil.toList(ids)));
List<SysRole> roleList = this.list(
Wrappers.lambdaQuery(sysRole).in(ArrayUtil.isNotEmpty(ids), SysRole::getRoleId, CollUtil.toList(ids)));
// 转换成execl 对象输出
return roleList.stream().map(role -> {
RoleExcelVO roleExcelVO = new RoleExcelVO();
@@ -141,6 +141,6 @@ public class SysRouteConfServiceImpl extends ServiceImpl<SysRouteConfMapper, Sys
baseMapper.insert(routeConf);
this.applicationEventPublisher.publishEvent(new DynamicRouteInitEvent(this));
return routeConf;
}
}
}
@@ -56,8 +56,10 @@ public class SysScheduleServiceImpl extends ServiceImpl<SysScheduleMapper, SysSc
public IPage<SysScheduleEntity> getScheduleByScope(Page page, SysScheduleEntity sysSchedule) {
LambdaQueryWrapper<SysScheduleEntity> wrapper = Wrappers.lambdaQuery();
wrapper.like(StrUtil.isNotBlank(sysSchedule.getTitle()), SysScheduleEntity::getTitle, sysSchedule.getTitle());
wrapper.like(StrUtil.isNotBlank(sysSchedule.getScheduleType()), SysScheduleEntity::getScheduleType, sysSchedule.getScheduleType());
wrapper.eq(Objects.nonNull(sysSchedule.getScheduleDate()), SysScheduleEntity::getScheduleDate, sysSchedule.getScheduleDate());
wrapper.like(StrUtil.isNotBlank(sysSchedule.getScheduleType()), SysScheduleEntity::getScheduleType,
sysSchedule.getScheduleType());
wrapper.eq(Objects.nonNull(sysSchedule.getScheduleDate()), SysScheduleEntity::getScheduleDate,
sysSchedule.getScheduleDate());
DataScope dataScope = new DataScope();
dataScope.setUsername(SecurityUtils.getUser().getUsername());
return baseMapper.selectPageByScope(page, wrapper, dataScope);
@@ -24,7 +24,8 @@ import java.util.List;
*/
@Service
@RequiredArgsConstructor
public class SysSensitiveWordServiceImpl extends ServiceImpl<SysSensitiveWordMapper, SysSensitiveWordEntity> implements SysSensitiveWordService {
public class SysSensitiveWordServiceImpl extends ServiceImpl<SysSensitiveWordMapper, SysSensitiveWordEntity>
implements SysSensitiveWordService {
/**
* 查询敏感词
@@ -46,8 +47,9 @@ public class SysSensitiveWordServiceImpl extends ServiceImpl<SysSensitiveWordMap
*/
@Override
public Boolean saveSensitive(SysSensitiveWordEntity sysSensitiveWord) {
List<SysSensitiveWordEntity> wordEntityList = baseMapper.selectList(Wrappers.<SysSensitiveWordEntity>lambdaQuery().
eq(SysSensitiveWordEntity::getSensitiveWord, sysSensitiveWord.getSensitiveWord()));
List<SysSensitiveWordEntity> wordEntityList = baseMapper
.selectList(Wrappers.<SysSensitiveWordEntity>lambdaQuery()
.eq(SysSensitiveWordEntity::getSensitiveWord, sysSensitiveWord.getSensitiveWord()));
if (CollUtil.isEmpty(wordEntityList)) {
save(sysSensitiveWord);
@@ -61,7 +63,8 @@ public class SysSensitiveWordServiceImpl extends ServiceImpl<SysSensitiveWordMap
RedisUtils.execute((RedisCallback<Void>) connection -> {
connection.publish(CacheConstants.SENSITIVE_REDIS_RELOAD_TOPIC.getBytes(), "刷新敏感词缓存".getBytes());
return null;
});
return Boolean.TRUE;
}
});
return Boolean.TRUE;
}
}
@@ -57,7 +57,6 @@ public class SysSocialDetailsServiceImpl extends ServiceImpl<SysSocialDetailsMap
/**
* 绑定社交账号
*
* @param type type
* @param code code
* @return
@@ -77,7 +76,6 @@ public class SysSocialDetailsServiceImpl extends ServiceImpl<SysSocialDetailsMap
/**
* 根据入参查询用户信息
*
* @param inStr TYPE@code
* @return
*/
@@ -91,7 +89,6 @@ public class SysSocialDetailsServiceImpl extends ServiceImpl<SysSocialDetailsMap
/**
* 查询当前租户下的三方应用信息 ,脱敏 appSecret
*
* @return List<SysSocialDetails>
*/
@Override
@@ -33,7 +33,8 @@ import java.util.Objects;
* @date 2024/07/18
*/
@Service
public class SysSystemConfigServiceImpl extends ServiceImpl<SysSystemConfigMapper, SysSystemConfigEntity> implements SysSystemConfigService {
public class SysSystemConfigServiceImpl extends ServiceImpl<SysSystemConfigMapper, SysSystemConfigEntity>
implements SysSystemConfigService {
private final SysMessageServiceImpl sysMessageServiceImpl;
@@ -69,9 +70,10 @@ public class SysSystemConfigServiceImpl extends ServiceImpl<SysSystemConfigMappe
@Override
public R pageSystemConfig(Page page, SysSystemConfigEntity sysSystemConfig) {
LambdaQueryWrapper<SysSystemConfigEntity> wrapper = Wrappers.lambdaQuery();
wrapper.eq(StrUtil.isNotBlank(sysSystemConfig.getConfigType()), SysSystemConfigEntity::getConfigType, sysSystemConfig.getConfigType());
wrapper.like(StrUtil.isNotBlank(sysSystemConfig.getConfigName())
, SysSystemConfigEntity::getConfigName, sysSystemConfig.getConfigName());
wrapper.eq(StrUtil.isNotBlank(sysSystemConfig.getConfigType()), SysSystemConfigEntity::getConfigType,
sysSystemConfig.getConfigType());
wrapper.like(StrUtil.isNotBlank(sysSystemConfig.getConfigName()), SysSystemConfigEntity::getConfigName,
sysSystemConfig.getConfigName());
Page<SysSystemConfigEntity> pageResult = baseMapper.selectPage(page, wrapper);
pageResult.getRecords().forEach(systemConfig -> {
if (StrUtil.isNotBlank(systemConfig.getConfigValue())) {
@@ -111,8 +113,9 @@ public class SysSystemConfigServiceImpl extends ServiceImpl<SysSystemConfigMappe
Field configsField = ReflectUtil.getField(OaFactory.class, "CONFIGS");
configsField.setAccessible(true);
Map<String, OaSender> configs = (Map<String, OaSender>) configsField.get(null);
configs.clear();
}
return R.ok();
}
configs.clear();
}
return R.ok();
}
}
@@ -67,484 +67,488 @@ import java.util.*;
@AllArgsConstructor
public class SysTenantServiceImpl extends ServiceImpl<SysTenantMapper, SysTenant> implements SysTenantService {
private final SysOauthClientDetailsService clientServices;
private final SysOauthClientDetailsService clientServices;
private final SysRoleMenuMapper roleMenuMapper;
private final SysRoleMenuMapper roleMenuMapper;
private final SysDictItemService dictItemService;
private final SysDictItemService dictItemService;
private final SysPublicParamService paramService;
private final SysPublicParamService paramService;
private final SysRoleService roleService;
private final SysRoleService roleService;
private final SysMenuService menuService;
private final SysMenuService menuService;
private final SysDeptService deptService;
private final SysDeptService deptService;
private final SysDictService dictService;
private final SysDictService dictService;
private final SysUserMapper sysUserMapper;
private final SysTenantUserMapper sysTenantUserMapper;
private final SysUserPostMapper sysUserPostMapper;
private final SysUserRoleMapper sysUserRoleMapper;
private final SysUserDeptMapper sysUserDeptMapper;
private final SysRoleMapper sysRoleMapper;
private final SysDeptMapper sysDeptMapper;
private final SysPostMapper sysPostMapper;
private final CacheManager cacheManager;
private final SysUserMapper sysUserMapper;
/**
* 获取正常状态租户
* <p>
* 1. 状态正常 2. 开始时间小于等于当前时间 3. 结束时间大于等于当前时间
*
* @return
*/
@Override
@Cacheable(value = CacheConstants.TENANT_DETAILS)
public List<SysTenant> getNormalTenant() {
return baseMapper
.selectList(Wrappers.<SysTenant>lambdaQuery().eq(SysTenant::getStatus, TenantStateEnum.NORMAL.getCode()));
}
private final SysTenantUserMapper sysTenantUserMapper;
/**
* 保存租户
* <p>
* 1. 保存租户 2. 初始化权限相关表 - sys_user - sys_role - sys_menu - sys_user_role -
* sys_role_menu - sys_dict - sys_dict_item - sys_client_details - sys_public_params
*
* @param sysTenant 租户实体
* @return
*/
@Override
@Transactional(rollbackFor = Exception.class)
@CacheEvict(value = CacheConstants.TENANT_DETAILS)
public Boolean saveTenant(SysTenant sysTenant) {
this.save(sysTenant);
// 查询系统默认租户配置参数
TenantDefaultConfig tenantDefault = new TenantDefaultConfig();
private final SysUserPostMapper sysUserPostMapper;
List<SysDict> dictList = new ArrayList<>(32);
List<Long> dictIdList = new ArrayList<>(32);
List<SysDictItem> dictItemList = new ArrayList<>(64);
List<SysMenu> menuList = new ArrayList<>(128);
List<SysOauthClientDetails> clientDetailsList = new ArrayList<>(16);
List<SysPublicParam> publicParamList = new ArrayList<>(64);
private final SysUserRoleMapper sysUserRoleMapper;
TenantBroker.runAs(tenantDefault.getTenantDefaultId(), (id) -> {
// 查询系统内置字典
dictList.addAll(dictService.list());
// 查询系统内置字典项目
dictIdList.addAll(dictList.stream().map(SysDict::getId).toList());
dictItemList.addAll(
dictItemService.list(Wrappers.<SysDictItem>lambdaQuery().in(SysDictItem::getDictId, dictIdList)));
List<SysMenu> newMenuList = menuService.list(Wrappers.<SysMenu>lambdaQuery()
.in(SysMenu::getMenuId, StrUtil.split(sysTenant.getMenuId(), CharUtil.COMMA)));
// 查询当前租户菜单
menuList.addAll(newMenuList);
// 查询客户端配置
clientDetailsList.addAll(clientServices.list());
// 查询系统参数配置
publicParamList.addAll(paramService.list());
});
private final SysUserDeptMapper sysUserDeptMapper;
// 保证插入租户为新的租户
TenantBroker.applyAs(sysTenant.getId(), (id -> {
// 插入部门
SysDept dept = new SysDept();
dept.setName(tenantDefault.getTenantDefaultDeptname());
dept.setParentId(0L);
deptService.save(dept);
private final SysRoleMapper sysRoleMapper;
// 构造普通用户角色
SysRole roleDefault = new SysRole();
roleDefault.setRoleCode(tenantDefault.getUserDefaultRolecode());
roleDefault.setRoleName(tenantDefault.getUserDefaultRolename());
roleDefault.setDsType(DataScopeTypeEnum.SELF_LEVEL.getType());
roleService.save(roleDefault);
private final SysDeptMapper sysDeptMapper;
// 构造新角色 管理员角色
SysRole role = new SysRole();
role.setRoleCode(tenantDefault.getTenantDefaultRolecode());
role.setRoleName(tenantDefault.getTenantDefaultRolename());
role.setDsType(DataScopeTypeEnum.ALL.getType());
roleService.save(role);
// 插入新的菜单
saveTenantMenu(menuList, CommonConstants.MENU_TREE_ROOT_ID, CommonConstants.MENU_TREE_ROOT_ID);
private final SysPostMapper sysPostMapper;
// 重新查询出所有的菜单关联角色
List<SysMenu> list = menuService.list();
private final CacheManager cacheManager;
// 查询全部菜单,构造角色菜单关系
List<SysRoleMenu> roleMenuList = list.stream().map(menu -> {
SysRoleMenu roleMenu = new SysRoleMenu();
roleMenu.setRoleId(role.getRoleId());
roleMenu.setMenuId(menu.getMenuId());
return roleMenu;
}).toList();
roleMenuList.forEach(roleMenuMapper::insert);
// 插入系统字典
dictService.saveBatch(dictList.stream().peek(d -> d.setId(null)).toList());
// 处理字典项最新关联的字典ID
List<SysDictItem> itemList = dictList.stream()
.flatMap(dict -> dictItemList.stream()
.filter(item -> item.getDictType().equals(dict.getDictType()))
.peek(item -> {
item.setDictId(dict.getId());
item.setId(null);
}))
.toList();
/**
* 获取正常状态租户
* <p>
* 1. 状态正常 2. 开始时间小于等于当前时间 3. 结束时间大于等于当前时间
*
* @return
*/
@Override
@Cacheable(value = CacheConstants.TENANT_DETAILS)
public List<SysTenant> getNormalTenant() {
return baseMapper
.selectList(Wrappers.<SysTenant>lambdaQuery().eq(SysTenant::getStatus, TenantStateEnum.NORMAL.getCode()));
}
// 插入客户端
clientServices.saveBatch(clientDetailsList.stream().peek(d -> d.setId(null)).toList());
// 插入系统配置
paramService
.saveBatch(publicParamList.stream().peek(d -> d.setPublicId(null)).toList());
return dictItemService.saveBatch(itemList);
}));
/**
* 保存租户
* <p>
* 1. 保存租户 2. 初始化权限相关表 - sys_user - sys_role - sys_menu - sys_user_role -
* sys_role_menu - sys_dict - sys_dict_item - sys_client_details - sys_public_params
*
* @param sysTenant 租户实体
* @return
*/
@Override
@Transactional(rollbackFor = Exception.class)
@CacheEvict(value = CacheConstants.TENANT_DETAILS)
public Boolean saveTenant(SysTenant sysTenant) {
this.save(sysTenant);
// 查询系统默认租户配置参数
TenantDefaultConfig tenantDefault = new TenantDefaultConfig();
SpringContextHolder.publishEvent(new ClientDetailsInitRunner.ClientDetailsInitEvent(sysTenant));
List<SysDict> dictList = new ArrayList<>(32);
List<Long> dictIdList = new ArrayList<>(32);
List<SysDictItem> dictItemList = new ArrayList<>(64);
List<SysMenu> menuList = new ArrayList<>(128);
List<SysOauthClientDetails> clientDetailsList = new ArrayList<>(16);
List<SysPublicParam> publicParamList = new ArrayList<>(64);
return Boolean.TRUE;
}
TenantBroker.runAs(tenantDefault.getTenantDefaultId(), (id) -> {
// 查询系统内置字典
dictList.addAll(dictService.list());
// 查询系统内置字典项目
dictIdList.addAll(dictList.stream().map(SysDict::getId).toList());
dictItemList.addAll(
dictItemService.list(Wrappers.<SysDictItem>lambdaQuery().in(SysDictItem::getDictId, dictIdList)));
List<SysMenu> newMenuList = menuService.list(Wrappers.<SysMenu>lambdaQuery()
.in(SysMenu::getMenuId, StrUtil.split(sysTenant.getMenuId(), CharUtil.COMMA)));
// 查询当前租户菜单
menuList.addAll(newMenuList);
// 查询客户端配置
clientDetailsList.addAll(clientServices.list());
// 查询系统参数配置
publicParamList.addAll(paramService.list());
});
/**
* 修改租户
*
* @param tenantDTO 新旧套餐数据
* @return true/false
*/
@Override
@Transactional(rollbackFor = Exception.class)
@CacheEvict(value = CacheConstants.TENANT_DETAILS, allEntries = true)
public Boolean updateTenant(SysTenant tenantDTO) {
SysTenant oldTenant = baseMapper.selectById(tenantDTO.getId());
List<String> newMenuIdList = StrUtil.split(tenantDTO.getMenuId(), CharUtil.COMMA);
List<String> oldMenuIdList = StrUtil.split(oldTenant.getMenuId(), CharUtil.COMMA);
// 保证插入租户为新的租户
TenantBroker.applyAs(sysTenant.getId(), (id -> {
// 插入部门
SysDept dept = new SysDept();
dept.setName(tenantDefault.getTenantDefaultDeptname());
dept.setParentId(0L);
deptService.save(dept);
// 更新租户信息
updateById(tenantDTO);
// 构造普通用户角色
SysRole roleDefault = new SysRole();
roleDefault.setRoleCode(tenantDefault.getUserDefaultRolecode());
roleDefault.setRoleName(tenantDefault.getUserDefaultRolename());
roleDefault.setDsType(DataScopeTypeEnum.SELF_LEVEL.getType());
roleService.save(roleDefault);
// 如果没有修改租户套餐
TenantDefaultConfig tenantDefault = new TenantDefaultConfig();
List<SysMenu> sysMenuList = TenantBroker.applyAs(tenantDefault.getTenantDefaultId(), id -> menuService.list());
if (tenantDefault.getTenantDefaultId().equals(tenantDTO.getId())) {
return Boolean.TRUE;
}
// 构造新角色 管理员角色
SysRole role = new SysRole();
role.setRoleCode(tenantDefault.getTenantDefaultRolecode());
role.setRoleName(tenantDefault.getTenantDefaultRolename());
role.setDsType(DataScopeTypeEnum.ALL.getType());
roleService.save(role);
// 插入新的菜单
saveTenantMenu(menuList, CommonConstants.MENU_TREE_ROOT_ID, CommonConstants.MENU_TREE_ROOT_ID);
// 比较新旧套餐是否一致
if (CollUtil.isEqualList(newMenuIdList, oldMenuIdList)) {
return Boolean.TRUE;
}
// 重新查询出所有的菜单关联角色
List<SysMenu> list = menuService.list();
// 0. 计算两个差集,差集表示变化的功能项
Collection<String> disjunctionList = CollUtil.disjunction(newMenuIdList, oldMenuIdList);
// 1. 如果旧套餐包含差集元素则删除
CollUtil.intersection(oldMenuIdList, disjunctionList)
.forEach(menuId -> TenantBroker.runAs(tenantDTO.getId(), (tenantId -> {
// 查询租户菜单元信息
SysMenu menu = CollUtil.findOneByField(sysMenuList, SysMenu.Fields.menuId, Long.parseLong(menuId));
// 查询全部菜单,构造角色菜单关系
List<SysRoleMenu> roleMenuList = list.stream().map(menu -> {
SysRoleMenu roleMenu = new SysRoleMenu();
roleMenu.setRoleId(role.getRoleId());
roleMenu.setMenuId(menu.getMenuId());
return roleMenu;
}).toList();
roleMenuList.forEach(roleMenuMapper::insert);
// 插入系统字典
dictService.saveBatch(dictList.stream().peek(d -> d.setId(null)).toList());
// 处理字典项最新关联的字典ID
List<SysDictItem> itemList = dictList.stream()
.flatMap(dict -> dictItemList.stream()
.filter(item -> item.getDictType().equals(dict.getDictType()))
.peek(item -> {
item.setDictId(dict.getId());
item.setId(null);
}))
.toList();
// 根据path 或者 permisson 删除目标租户菜单
menuService.remove(Wrappers.<SysMenu>lambdaQuery()
.eq(StrUtil.isNotBlank(menu.getPath()), SysMenu::getPath, menu.getPath())
.or()
.eq(StrUtil.isNotBlank(menu.getPermission()), SysMenu::getPermission, menu.getPermission()));
})));
// 插入客户端
clientServices.saveBatch(clientDetailsList.stream().peek(d -> d.setId(null)).toList());
// 插入系统配置
paramService.saveBatch(publicParamList.stream().peek(d -> d.setPublicId(null)).toList());
return dictItemService.saveBatch(itemList);
}));
// 2. 如果旧套餐不包含差集元素则新增
List<SysMenu> newTenantMenuIdList = CollUtil.subtract(disjunctionList, oldMenuIdList)
.stream()
.map(menuId -> TenantBroker.applyAs(tenantDTO.getId(), (tenantId -> {
// 查询租户菜单元信息
SysMenu menu = CollUtil.findOneByField(sysMenuList, SysMenu.Fields.menuId, Long.parseLong(menuId));
SpringContextHolder.publishEvent(new ClientDetailsInitRunner.ClientDetailsInitEvent(sysTenant));
// 新增租户菜单,但未维护上下级关系
SysMenu newMenu = new SysMenu();
BeanUtils.copyProperties(menu, newMenu, SysMenu.Fields.menuId);
menuService.save(newMenu);
return newMenu;
})))
.toList();
return Boolean.TRUE;
}
// 3. 更新新增菜单上下级关系
for (SysMenu tenantMenu : newTenantMenuIdList) {
// 查询租户菜单父元信息
SysMenu parentMenu = CollUtil.findOneByField(sysMenuList, SysMenu.Fields.menuId, tenantMenu.getParentId());
// 查询目标租户父菜单元信息
TenantBroker.runAs(tenantDTO.getId(), tenantId -> {
// 如何菜单父节点是根节点则直接插入,不要查询父节点判断
if (Objects.equals(tenantMenu.getParentId(), CommonConstants.MENU_TREE_ROOT_ID)) {
menuService.updateById(tenantMenu);
return;
}
/**
* 修改租户
*
* @param tenantDTO 新旧套餐数据
* @return true/false
*/
@Override
@Transactional(rollbackFor = Exception.class)
@CacheEvict(value = CacheConstants.TENANT_DETAILS, allEntries = true)
public Boolean updateTenant(SysTenant tenantDTO) {
SysTenant oldTenant = baseMapper.selectById(tenantDTO.getId());
List<String> newMenuIdList = StrUtil.split(tenantDTO.getMenuId(), CharUtil.COMMA);
List<String> oldMenuIdList = StrUtil.split(oldTenant.getMenuId(), CharUtil.COMMA);
// 根据path 或者 permisson 查询目标父菜单
SysMenu tenantParentMenu = menuService.getOne(Wrappers.<SysMenu>lambdaQuery()
.eq(StrUtil.isNotBlank(parentMenu.getPath()), SysMenu::getPath, parentMenu.getPath())
.or()
.eq(StrUtil.isNotBlank(parentMenu.getPermission()), SysMenu::getPermission,
parentMenu.getPermission()),
false);
// 更新租户信息
updateById(tenantDTO);
tenantMenu.setParentId(tenantParentMenu.getMenuId());
menuService.updateById(tenantMenu);
});
}
// 如果没有修改租户套餐
TenantDefaultConfig tenantDefault = new TenantDefaultConfig();
List<SysMenu> sysMenuList = TenantBroker.applyAs(tenantDefault.getTenantDefaultId(), id -> menuService.list());
if (tenantDefault.getTenantDefaultId().equals(tenantDTO.getId())) {
return Boolean.TRUE;
}
// 清空指定租户的菜单权限缓存
Set<String> keys = RedisUtils.keys(String.format("%s:%s::*", tenantDTO.getId(), CacheConstants.MENU_DETAILS));
if (CollUtil.isNotEmpty(keys)) {
RedisUtils.delete(keys.toArray(new String[0]));
}
return Boolean.TRUE;
}
// 比较新旧套餐是否一致
if (CollUtil.isEqualList(newMenuIdList, oldMenuIdList)) {
return Boolean.TRUE;
}
/**
* 获取用户所属租户列表
*
* @return 用户所属租户列表
*/
@Override
public List<SysTenant> getUserTenant() {
MPJLambdaWrapper<SysTenant> wrapper = new MPJLambdaWrapper<SysTenant>()
.selectAll(SysTenant.class)
.leftJoin(SysTenantUser.class, SysTenantUser::getTenantId, SysTenant::getId)
.eq(SysTenantUser::getUserId, SecurityUtils.getUser().getId())
.eq(SysTenant::getStatus, TenantStateEnum.NORMAL.getCode());
// 0. 计算两个差集,差集表示变化的功能项
Collection<String> disjunctionList = CollUtil.disjunction(newMenuIdList, oldMenuIdList);
// 1. 如果旧套餐包含差集元素则删除
CollUtil.intersection(oldMenuIdList, disjunctionList)
.forEach(menuId -> TenantBroker.runAs(tenantDTO.getId(), (tenantId -> {
// 查询租户菜单元信息
SysMenu menu = CollUtil.findOneByField(sysMenuList, SysMenu.Fields.menuId, Long.parseLong(menuId));
return baseMapper.selectJoinList(wrapper)
.stream()
.filter(tenant -> tenant.getStartTime().isBefore(LocalDateTime.now()))
.filter(tenant -> tenant.getEndTime().isAfter(LocalDateTime.now()))
.toList();
}
// 根据path 或者 permisson 删除目标租户菜单
menuService.remove(Wrappers.<SysMenu>lambdaQuery()
.eq(StrUtil.isNotBlank(menu.getPath()), SysMenu::getPath, menu.getPath())
.or()
.eq(StrUtil.isNotBlank(menu.getPermission()), SysMenu::getPermission, menu.getPermission()));
})));
/**
* 获取用户租户分页信息
*
* @param page 分页参数
* @param userDTO 用户信息
* @return 用户租户分页结果
*/
@Override
public Page getUserTenantPage(Page page, UserDTO userDTO) {
MPJLambdaWrapper<SysUser> wrapper = new MPJLambdaWrapper<SysUser>()
.selectAll(SysUser.class)
.innerJoin(SysTenantUser.class, SysTenantUser::getUserId, SysUser::getUserId)
.like(StrUtil.isNotBlank(userDTO.getUsername()), SysUser::getUsername, userDTO.getUsername())
.like(StrUtil.isNotBlank(userDTO.getPhone()), SysUser::getPhone, userDTO.getPhone())
.like(StrUtil.isNotBlank(userDTO.getEmail()), SysUser::getEmail, userDTO.getEmail())
.eq(Objects.nonNull(userDTO.getTenantId()), SysTenantUser::getTenantId, userDTO.getTenantId());
return TenantBroker.noneAs(() -> sysUserMapper.selectJoinPage(page, wrapper));
}
// 2. 如果旧套餐不包含差集元素则新增
List<SysMenu> newTenantMenuIdList = CollUtil.subtract(disjunctionList, oldMenuIdList)
.stream()
.map(menuId -> TenantBroker.applyAs(tenantDTO.getId(), (tenantId -> {
// 查询租户菜单元信息
SysMenu menu = CollUtil.findOneByField(sysMenuList, SysMenu.Fields.menuId, Long.parseLong(menuId));
/**
* 移除租户用户
*
* @param tenantUserDTO 租户用户信息
* @return 是否移除成功
*/
@Override
public Boolean removeTenantUser(SysTenantUserDTO tenantUserDTO) {
ArrayList<Long> userIdList = CollUtil.toList(tenantUserDTO.getUserIds());
// 新增租户菜单,但未维护上下级关系
SysMenu newMenu = new SysMenu();
BeanUtils.copyProperties(menu, newMenu, SysMenu.Fields.menuId);
menuService.save(newMenu);
return newMenu;
})))
.toList();
// 删除租户用户关系
sysTenantUserMapper.delete(Wrappers.<SysTenantUser>lambdaQuery()
.eq(SysTenantUser::getTenantId, tenantUserDTO.getTenantId())
.in(SysTenantUser::getUserId, userIdList)
);
// 3. 更新新增菜单上下级关系
for (SysMenu tenantMenu : newTenantMenuIdList) {
// 查询租户菜单父元信息
SysMenu parentMenu = CollUtil.findOneByField(sysMenuList, SysMenu.Fields.menuId, tenantMenu.getParentId());
// 查询目标租户父菜单元信息
TenantBroker.runAs(tenantDTO.getId(), tenantId -> {
// 如何菜单父节点是根节点则直接插入,不要查询父节点判断
if (Objects.equals(tenantMenu.getParentId(), CommonConstants.MENU_TREE_ROOT_ID)) {
menuService.updateById(tenantMenu);
return;
}
TenantBroker.runAs(tenantUserDTO.getTenantId(), (tenantId -> {
// 删除用户岗位
sysUserPostMapper.delete(Wrappers.<SysUserPost>lambdaQuery()
.in(SysUserPost::getUserId, userIdList));
// 删除用户角色
sysUserRoleMapper.delete(Wrappers.<SysUserRole>lambdaQuery()
.in(SysUserRole::getUserId, userIdList));
// 删除用户部门
sysUserDeptMapper.delete(Wrappers.<SysUserDept>lambdaQuery()
.in(SysUserDept::getUserId, userIdList));
}));
return Boolean.TRUE;
}
// 根据path 或者 permisson 查询目标父菜单
SysMenu tenantParentMenu = menuService.getOne(Wrappers.<SysMenu>lambdaQuery()
.eq(StrUtil.isNotBlank(parentMenu.getPath()), SysMenu::getPath, parentMenu.getPath())
.or()
.eq(StrUtil.isNotBlank(parentMenu.getPermission()), SysMenu::getPermission,
parentMenu.getPermission()),
false);
/**
* 根据用户信息查询租户用户列表
*
* @param userDTO 用户信息传输对象
* @return 租户用户列表
*/
@Override
public List<SysUser> listTenantUser(UserDTO userDTO) {
return TenantBroker.noneAs(() -> sysUserMapper
.selectList(Wrappers.<SysUser>lambdaQuery().like(StrUtil.isNotBlank(userDTO.getUsername()), SysUser::getUsername, userDTO.getUsername())));
}
tenantMenu.setParentId(tenantParentMenu.getMenuId());
menuService.updateById(tenantMenu);
});
}
/**
* 保存租户用户信息
*
* @param tenantUserDTO 租户用户信息DTO
* @return 保存是否成功
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean saveTenantUser(SysTenantUserDTO tenantUserDTO) {
TenantBroker.runAs(tenantUserDTO.getTenantId(), (tenantId -> {
for (Long userId : tenantUserDTO.getUserIds()) {
List<SysTenantUser> sysTenantUsers = sysTenantUserMapper.selectList(Wrappers.<SysTenantUser>lambdaQuery()
.eq(SysTenantUser::getTenantId, tenantId)
.eq(SysTenantUser::getUserId, userId));
if (CollUtil.isEmpty(sysTenantUsers)) {
// 插入租户用户关系
SysTenantUser sysTenantUser = new SysTenantUser();
sysTenantUser.setUserId(userId);
sysTenantUser.setTenantId(tenantId);
sysTenantUserMapper.insert(sysTenantUser);
}
// 清空指定租户的菜单权限缓存
Set<String> keys = RedisUtils.keys(String.format("%s:%s::*", tenantDTO.getId(), CacheConstants.MENU_DETAILS));
if (CollUtil.isNotEmpty(keys)) {
RedisUtils.delete(keys.toArray(new String[0]));
}
return Boolean.TRUE;
}
/**
* 获取用户所属租户列表
*
* @return 用户所属租户列表
*/
@Override
public List<SysTenant> getUserTenant() {
MPJLambdaWrapper<SysTenant> wrapper = new MPJLambdaWrapper<SysTenant>().selectAll(SysTenant.class)
.leftJoin(SysTenantUser.class, SysTenantUser::getTenantId, SysTenant::getId)
.eq(SysTenantUser::getUserId, SecurityUtils.getUser().getId())
.eq(SysTenant::getStatus, TenantStateEnum.NORMAL.getCode());
List<SysUserRole> userRoleList = sysUserRoleMapper.selectList(Wrappers.<SysUserRole>lambdaQuery()
.eq(SysUserRole::getUserId, userId)
.eq(SysUserRole::getRoleId, tenantUserDTO.getRoleId()));
if (CollUtil.isEmpty(userRoleList)) {
// 插入用户角色关系
SysUserRole sysUserRole = new SysUserRole();
sysUserRole.setUserId(userId);
sysUserRole.setRoleId(tenantUserDTO.getRoleId());
sysUserRoleMapper.insert(sysUserRole);
}
return baseMapper.selectJoinList(wrapper)
.stream()
.filter(tenant -> tenant.getStartTime().isBefore(LocalDateTime.now()))
.filter(tenant -> tenant.getEndTime().isAfter(LocalDateTime.now()))
.toList();
}
/**
* 获取用户租户分页信息
*
* @param page 分页参数
* @param userDTO 用户信息
* @return 用户租户分页结果
*/
@Override
public Page getUserTenantPage(Page page, UserDTO userDTO) {
MPJLambdaWrapper<SysUser> wrapper = new MPJLambdaWrapper<SysUser>().selectAll(SysUser.class)
.innerJoin(SysTenantUser.class, SysTenantUser::getUserId, SysUser::getUserId)
.like(StrUtil.isNotBlank(userDTO.getUsername()), SysUser::getUsername, userDTO.getUsername())
.like(StrUtil.isNotBlank(userDTO.getPhone()), SysUser::getPhone, userDTO.getPhone())
.like(StrUtil.isNotBlank(userDTO.getEmail()), SysUser::getEmail, userDTO.getEmail())
.eq(Objects.nonNull(userDTO.getTenantId()), SysTenantUser::getTenantId, userDTO.getTenantId());
return TenantBroker.noneAs(() -> sysUserMapper.selectJoinPage(page, wrapper));
}
List<SysUserDept> userDeptList = sysUserDeptMapper.selectList(Wrappers.<SysUserDept>lambdaQuery()
.eq(SysUserDept::getUserId, userId)
.eq(SysUserDept::getDeptId, tenantUserDTO.getDeptId()));
/**
* 移除租户用户
*
* @param tenantUserDTO 租户用户信息
* @return 是否移除成功
*/
@Override
public Boolean removeTenantUser(SysTenantUserDTO tenantUserDTO) {
ArrayList<Long> userIdList = CollUtil.toList(tenantUserDTO.getUserIds());
if (CollUtil.isEmpty(userDeptList)) {
// 插入用户部门关系
SysUserDept sysUserDept = new SysUserDept();
sysUserDept.setUserId(userId);
sysUserDept.setDeptId(tenantUserDTO.getDeptId());
sysUserDeptMapper.insert(sysUserDept);
}
// 删除租户用户关系
sysTenantUserMapper.delete(Wrappers.<SysTenantUser>lambdaQuery()
.eq(SysTenantUser::getTenantId, tenantUserDTO.getTenantId())
.in(SysTenantUser::getUserId, userIdList));
List<SysUserPost> userPostList = sysUserPostMapper.selectList(Wrappers.<SysUserPost>lambdaQuery()
.eq(SysUserPost::getUserId, userId)
.eq(SysUserPost::getPostId, tenantUserDTO.getPostId()));
TenantBroker.runAs(tenantUserDTO.getTenantId(), (tenantId -> {
// 删除用户岗位
sysUserPostMapper.delete(Wrappers.<SysUserPost>lambdaQuery().in(SysUserPost::getUserId, userIdList));
// 删除用户角色
sysUserRoleMapper.delete(Wrappers.<SysUserRole>lambdaQuery().in(SysUserRole::getUserId, userIdList));
// 删除用户部门
sysUserDeptMapper.delete(Wrappers.<SysUserDept>lambdaQuery().in(SysUserDept::getUserId, userIdList));
}));
return Boolean.TRUE;
}
if (CollUtil.isEmpty(userPostList) && Objects.nonNull(tenantUserDTO.getPostId())) {
// 插入用户岗位关系
SysUserPost sysUserPost = new SysUserPost();
sysUserPost.setUserId(userId);
sysUserPost.setPostId(tenantUserDTO.getPostId());
sysUserPostMapper.insert(sysUserPost);
}
}
}));
return Boolean.TRUE;
}
/**
* 根据用户信息查询租户用户列表
*
* @param userDTO 用户信息传输对象
* @return 租户用户列表
*/
@Override
public List<SysUser> listTenantUser(UserDTO userDTO) {
return TenantBroker.noneAs(() -> sysUserMapper.selectList(Wrappers.<SysUser>lambdaQuery()
.like(StrUtil.isNotBlank(userDTO.getUsername()), SysUser::getUsername, userDTO.getUsername())));
}
/**
* 获取租户角色列表
*
* @param userDTO 用户信息
* @return 租户角色列表
*/
@Override
public Map<String, Object> listTenantOrg(UserDTO userDTO) {
return TenantBroker.applyAs(userDTO.getTenantId(), tenantId -> {
// 过滤有权限配置的菜单
List<SysRole> sysRoles = sysRoleMapper.selectList(Wrappers.lambdaQuery()).stream()
.filter(role -> roleMenuMapper.exists(Wrappers.<SysRoleMenu>lambdaQuery()
.eq(SysRoleMenu::getRoleId, role.getRoleId()))).toList();
List<SysDept> sysDepts = sysDeptMapper.selectList(Wrappers.lambdaQuery());
List<SysPost> sysPosts = sysPostMapper.selectList(Wrappers.lambdaQuery());
return Map.of("sysRoles", sysRoles, "sysDepts", sysDepts, "sysPosts", sysPosts);
});
}
/**
* 保存租户用户信息
*
* @param tenantUserDTO 租户用户信息DTO
* @return 保存是否成功
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean saveTenantUser(SysTenantUserDTO tenantUserDTO) {
TenantBroker.runAs(tenantUserDTO.getTenantId(), (tenantId -> {
for (Long userId : tenantUserDTO.getUserIds()) {
List<SysTenantUser> sysTenantUsers = sysTenantUserMapper
.selectList(Wrappers.<SysTenantUser>lambdaQuery()
.eq(SysTenantUser::getTenantId, tenantId)
.eq(SysTenantUser::getUserId, userId));
if (CollUtil.isEmpty(sysTenantUsers)) {
// 插入租户用户关系
SysTenantUser sysTenantUser = new SysTenantUser();
sysTenantUser.setUserId(userId);
sysTenantUser.setTenantId(tenantId);
sysTenantUserMapper.insert(sysTenantUser);
}
/**
* 移除租户
*
* @param ids 租户ID列表
* @return 是否移除成功
*/
@Override
@CacheEvict(value = CacheConstants.TENANT_DETAILS, allEntries = true)
public Boolean removeTenant(Long[] ids) {
baseMapper.deleteByIds(CollUtil.toList(ids));
sysTenantUserMapper.delete(Wrappers.<SysTenantUser>lambdaQuery().in(SysTenantUser::getTenantId, CollUtil.toList(ids)));
return Boolean.TRUE;
}
List<SysUserRole> userRoleList = sysUserRoleMapper.selectList(Wrappers.<SysUserRole>lambdaQuery()
.eq(SysUserRole::getUserId, userId)
.eq(SysUserRole::getRoleId, tenantUserDTO.getRoleId()));
if (CollUtil.isEmpty(userRoleList)) {
// 插入用户角色关系
SysUserRole sysUserRole = new SysUserRole();
sysUserRole.setUserId(userId);
sysUserRole.setRoleId(tenantUserDTO.getRoleId());
sysUserRoleMapper.insert(sysUserRole);
}
/**
* 更新用户租户信息
*
* @param userDto 用户数据传输对象
* @return 更新结果
*/
@Override
@CacheEvict(value = CacheConstants.USER_DETAILS, key = "#userDto.username")
public R updateUserTenant(UserDTO userDto) {
return R.ok(TenantBroker.noneAs(() -> sysUserMapper.update(Wrappers.<SysUser>lambdaUpdate()
.set(SysUser::getTenantId, userDto.getTenantId())
.eq(SysUser::getUserId, userDto.getUserId()))));
}
List<SysUserDept> userDeptList = sysUserDeptMapper.selectList(Wrappers.<SysUserDept>lambdaQuery()
.eq(SysUserDept::getUserId, userId)
.eq(SysUserDept::getDeptId, tenantUserDTO.getDeptId()));
/**
* 保存新的租户菜单,维护成新的菜单
*
* @param menuList 菜单列表
* @param originParentId 原始上级
* @param targetParentId 目标上级
*/
private void saveTenantMenu(List<SysMenu> menuList, Long originParentId, Long targetParentId) {
menuList.stream().filter(menu -> menu.getParentId().equals(originParentId)).forEach(menu -> {
// 保存菜单原始menuId, 方便查询子节点使用
Long originMenuId = menu.getMenuId();
menu.setMenuId(null);
menu.setParentId(targetParentId);
menuService.save(menu);
// 查找此节点的子节点,然后子节点的重新插入父节点更改为新的menuId
saveTenantMenu(menuList, originMenuId, menu.getMenuId());
});
}
if (CollUtil.isEmpty(userDeptList)) {
// 插入用户部门关系
SysUserDept sysUserDept = new SysUserDept();
sysUserDept.setUserId(userId);
sysUserDept.setDeptId(tenantUserDTO.getDeptId());
sysUserDeptMapper.insert(sysUserDept);
}
/**
* 获取或更新当前用户的租户信息
*
* @return 更新后的租户ID,如果无需更新则返回null
*/
@Override
public Long getOrUpdateTenant() {
PigxUser loginUser = SecurityUtils.getUser();
boolean match = this.getNormalTenant()
.stream()
.filter(tenant -> tenant.getStartTime().isBefore(LocalDateTime.now()))
.filter(tenant -> tenant.getEndTime().isAfter(LocalDateTime.now()))
.anyMatch(tenant -> tenant.getId().equals(loginUser.getTenantId()));
List<SysUserPost> userPostList = sysUserPostMapper.selectList(Wrappers.<SysUserPost>lambdaQuery()
.eq(SysUserPost::getUserId, userId)
.eq(SysUserPost::getPostId, tenantUserDTO.getPostId()));
if (!match) {
SysTenantUser tenantUser = sysTenantUserMapper.selectOne(Wrappers.<SysTenantUser>lambdaQuery()
.eq(SysTenantUser::getUserId, SecurityUtils.getUser().getId())
.ne(SysTenantUser::getTenantId, loginUser.getTenantId()), false);
// 如果当前用户没有租户信息,则不进行任何操作
if (Objects.isNull(tenantUser)) {
return null;
}
if (CollUtil.isEmpty(userPostList) && Objects.nonNull(tenantUserDTO.getPostId())) {
// 插入用户岗位关系
SysUserPost sysUserPost = new SysUserPost();
sysUserPost.setUserId(userId);
sysUserPost.setPostId(tenantUserDTO.getPostId());
sysUserPostMapper.insert(sysUserPost);
}
}
}));
return Boolean.TRUE;
}
// 切换至状态正常的租户
UserDTO userDTO = new UserDTO();
userDTO.setUserId(loginUser.getId());
userDTO.setTenantId(tenantUser.getTenantId());
userDTO.setUsername(loginUser.getUsername());
updateUserTenant(userDTO);
cacheManager.getCache(CacheConstants.USER_DETAILS).evict(loginUser.getUsername());
return tenantUser.getTenantId();
}
/**
* 获取租户角色列表
*
* @param userDTO 用户信息
* @return 租户角色列表
*/
@Override
public Map<String, Object> listTenantOrg(UserDTO userDTO) {
return TenantBroker.applyAs(userDTO.getTenantId(), tenantId -> {
// 过滤有权限配置的菜单
List<SysRole> sysRoles = sysRoleMapper.selectList(Wrappers.lambdaQuery())
.stream()
.filter(role -> roleMenuMapper
.exists(Wrappers.<SysRoleMenu>lambdaQuery().eq(SysRoleMenu::getRoleId, role.getRoleId())))
.toList();
List<SysDept> sysDepts = sysDeptMapper.selectList(Wrappers.lambdaQuery());
List<SysPost> sysPosts = sysPostMapper.selectList(Wrappers.lambdaQuery());
return Map.of("sysRoles", sysRoles, "sysDepts", sysDepts, "sysPosts", sysPosts);
});
}
/**
* 移除租户
*
* @param ids 租户ID列表
* @return 是否移除成功
*/
@Override
@CacheEvict(value = CacheConstants.TENANT_DETAILS, allEntries = true)
public Boolean removeTenant(Long[] ids) {
baseMapper.deleteByIds(CollUtil.toList(ids));
sysTenantUserMapper
.delete(Wrappers.<SysTenantUser>lambdaQuery().in(SysTenantUser::getTenantId, CollUtil.toList(ids)));
return Boolean.TRUE;
}
/**
* 更新用户租户信息
*
* @param userDto 用户数据传输对象
* @return 更新结果
*/
@Override
@CacheEvict(value = CacheConstants.USER_DETAILS, key = "#userDto.username")
public R updateUserTenant(UserDTO userDto) {
return R.ok(TenantBroker.noneAs(() -> sysUserMapper.update(Wrappers.<SysUser>lambdaUpdate()
.set(SysUser::getTenantId, userDto.getTenantId())
.eq(SysUser::getUserId, userDto.getUserId()))));
}
/**
* 保存新的租户菜单,维护成新的菜单
*
* @param menuList 菜单列表
* @param originParentId 原始上级
* @param targetParentId 目标上级
*/
private void saveTenantMenu(List<SysMenu> menuList, Long originParentId, Long targetParentId) {
menuList.stream().filter(menu -> menu.getParentId().equals(originParentId)).forEach(menu -> {
// 保存菜单原始menuId, 方便查询子节点使用
Long originMenuId = menu.getMenuId();
menu.setMenuId(null);
menu.setParentId(targetParentId);
menuService.save(menu);
// 查找此节点的子节点,然后子节点的重新插入父节点更改为新的menuId
saveTenantMenu(menuList, originMenuId, menu.getMenuId());
});
}
/**
* 获取或更新当前用户的租户信息
*
* @return 更新后的租户ID,如果无需更新则返回null
*/
@Override
public Long getOrUpdateTenant() {
PigxUser loginUser = SecurityUtils.getUser();
boolean match = this.getNormalTenant()
.stream()
.filter(tenant -> tenant.getStartTime().isBefore(LocalDateTime.now()))
.filter(tenant -> tenant.getEndTime().isAfter(LocalDateTime.now()))
.anyMatch(tenant -> tenant.getId().equals(loginUser.getTenantId()));
if (!match) {
SysTenantUser tenantUser = sysTenantUserMapper.selectOne(Wrappers.<SysTenantUser>lambdaQuery()
.eq(SysTenantUser::getUserId, SecurityUtils.getUser().getId())
.ne(SysTenantUser::getTenantId, loginUser.getTenantId()), false);
// 如果当前用户没有租户信息,则不进行任何操作
if (Objects.isNull(tenantUser)) {
return null;
}
// 切换至状态正常的租户
UserDTO userDTO = new UserDTO();
userDTO.setUserId(loginUser.getId());
userDTO.setTenantId(tenantUser.getTenantId());
userDTO.setUsername(loginUser.getUsername());
updateUserTenant(userDTO);
cacheManager.getCache(CacheConstants.USER_DETAILS).evict(loginUser.getUsername());
return tenantUser.getTenantId();
}
return null;
}
return null;
}
}
/**
@@ -552,25 +556,37 @@ public class SysTenantServiceImpl extends ServiceImpl<SysTenantMapper, SysTenant
*/
@Data
class TenantDefaultConfig {
private Long tenantDefaultId = 1L;
private String tenantDefaultDeptname = "租户默认部门";
private String tenantDefaultUsername = "admin";
private String tenantDefaultPassword = "123456";
private String tenantDefaultRolecode = "ROLE_ADMIN";
private String tenantDefaultRolename = "租户默认角色";
private String userDefaultRolecode = "GENERAL_USER";
private String userDefaultRolename = "普通用户";
@SneakyThrows
public TenantDefaultConfig() {
List<String> args = Arrays.stream(ReflectUtil.getFields(this.getClass()))
.map(Field::getName).map(StrUtil::toUnderlineCase).map(String::toUpperCase).toList();
Map<String, Object> paramsMap = ParamResolver.getMap(args.toArray(new String[]{}));
for (Field field : ReflectUtil.getFields(this.getClass())) {
String key = StrUtil.toUnderlineCase(field.getName()).toUpperCase();
if (paramsMap.containsKey(key)) {
field.set(this, paramsMap.get(key));
}
}
}
private Long tenantDefaultId = 1L;
private String tenantDefaultDeptname = "租户默认部门";
private String tenantDefaultUsername = "admin";
private String tenantDefaultPassword = "123456";
private String tenantDefaultRolecode = "ROLE_ADMIN";
private String tenantDefaultRolename = "租户默认角色";
private String userDefaultRolecode = "GENERAL_USER";
private String userDefaultRolename = "普通用户";
@SneakyThrows
public TenantDefaultConfig() {
List<String> args = Arrays.stream(ReflectUtil.getFields(this.getClass()))
.map(Field::getName)
.map(StrUtil::toUnderlineCase)
.map(String::toUpperCase)
.toList();
Map<String, Object> paramsMap = ParamResolver.getMap(args.toArray(new String[] {}));
for (Field field : ReflectUtil.getFields(this.getClass())) {
String key = StrUtil.toUnderlineCase(field.getName()).toUpperCase();
if (paramsMap.containsKey(key)) {
field.set(this, paramsMap.get(key));
}
}
}
}