From 185d6ce34b563a83b86890007df1a4a02f5dab0c Mon Sep 17 00:00:00 2001 From: gaoqr <13665037151@163.com> Date: Mon, 25 Nov 2024 11:24:46 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A6=85=E9=81=93#601=E3=80=81#636=E3=80=81#65?= =?UTF-8?q?9=E3=80=81#662=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/enums/DictTypeConstants.java | 1 + .../admin/permission/vo/role/RoleRespVO.java | 7 +- .../admin/sms/vo/log/SmsLogRespVO.java | 96 ++++--------------- .../service/notice/NoticeServiceImpl.java | 7 ++ .../service/permission/RoleServiceImpl.java | 49 +++++++++- 5 files changed, 75 insertions(+), 85 deletions(-) diff --git a/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/enums/DictTypeConstants.java b/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/enums/DictTypeConstants.java index 0d97370cc..47c79a9f2 100644 --- a/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/enums/DictTypeConstants.java +++ b/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/enums/DictTypeConstants.java @@ -9,6 +9,7 @@ public class DictTypeConstants { public static final String USER_TYPE = "user_type"; // 用户类型 public static final String COMMON_STATUS = "common_status"; // 系统状态 + public static final String ROLE_TYPE = "system_role_type"; // 系统角色类型 // ========== SYSTEM 模块 ========== diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/permission/vo/role/RoleRespVO.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/permission/vo/role/RoleRespVO.java index be9d8f9a4..6212e2aac 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/permission/vo/role/RoleRespVO.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/permission/vo/role/RoleRespVO.java @@ -1,5 +1,6 @@ package com.cf.imes.module.system.controller.admin.permission.vo.role; +import com.alibaba.excel.annotation.write.style.ColumnWidth; import com.cf.imes.framework.excel.core.annotations.DictFormat; import com.cf.imes.framework.excel.core.convert.DictConvert; import com.cf.imes.module.system.enums.DictTypeConstants; @@ -39,19 +40,23 @@ public class RoleRespVO { private Integer status; @Schema(description = "角色类型,参见 RoleTypeEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @ExcelProperty(value = "角色类型", converter = DictConvert.class) + @DictFormat(DictTypeConstants.ROLE_TYPE) private Integer type; @Schema(description = "备注", example = "我是一个角色") + @ExcelProperty("备注") private String remark; @Schema(description = "数据范围,参见 DataScopeEnum 枚举类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @ExcelProperty("数据范围") private Integer dataScope; @Schema(description = "数据范围(指定部门数组)", example = "1") private Set dataScopeDeptIds; @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "时间戳格式") + @ExcelProperty("创建时间") + @ColumnWidth(20) private LocalDateTime createTime; @Schema(description = "组织id", example = "1") diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/sms/vo/log/SmsLogRespVO.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/sms/vo/log/SmsLogRespVO.java index ce927b1f5..42675b425 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/sms/vo/log/SmsLogRespVO.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/sms/vo/log/SmsLogRespVO.java @@ -1,8 +1,8 @@ package com.cf.imes.module.system.controller.admin.sms.vo.log; +import com.alibaba.excel.annotation.write.style.ColumnWidth; import com.cf.imes.framework.excel.core.annotations.DictFormat; import com.cf.imes.framework.excel.core.convert.DictConvert; -import com.cf.imes.framework.excel.core.convert.JsonConvert; import com.cf.imes.module.system.enums.DictTypeConstants; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelProperty; @@ -21,13 +21,23 @@ public class SmsLogRespVO { @ExcelProperty("编号") private Long id; - @Schema(description = "短信渠道编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") - @ExcelProperty("短信渠道编号") - private Long channelId; + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + @ColumnWidth(20) + private LocalDateTime createTime; - @Schema(description = "短信渠道编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "ALIYUN") - @ExcelProperty("短信渠道编码") - private String channelCode; + @Schema(description = "手机号", requiredMode = Schema.RequiredMode.REQUIRED, example = "15601691300") + @ExcelProperty("手机号") + private String mobile; + + @Schema(description = "短信内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "你好,你的验证码是 1024") + @ExcelProperty("短信内容") + private String templateContent; + + @Schema(description = "发送状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @ExcelProperty(value = "发送状态", converter = DictConvert.class) + @DictFormat(DictTypeConstants.SMS_SEND_STATUS) + private Integer sendStatus; @Schema(description = "模板编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "20") @ExcelProperty("模板编号") @@ -41,76 +51,4 @@ public class SmsLogRespVO { @ExcelProperty(value = "短信类型", converter = DictConvert.class) @DictFormat(DictTypeConstants.SMS_TEMPLATE_TYPE) private Integer templateType; - - @Schema(description = "短信内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "你好,你的验证码是 1024") - @ExcelProperty("短信内容") - private String templateContent; - - @Schema(description = "短信参数", requiredMode = Schema.RequiredMode.REQUIRED, example = "name,code") - @ExcelProperty(value = "短信参数", converter = JsonConvert.class) - private Map templateParams; - - @Schema(description = "短信 API 的模板编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "SMS_207945135") - @ExcelProperty("短信 API 的模板编号") - private String apiTemplateId; - - @Schema(description = "手机号", requiredMode = Schema.RequiredMode.REQUIRED, example = "15601691300") - @ExcelProperty("手机号") - private String mobile; - - @Schema(description = "用户编号", example = "10") - @ExcelProperty("用户编号") - private Long userId; - - @Schema(description = "用户类型", example = "1") - @ExcelProperty(value = "用户类型", converter = DictConvert.class) - @DictFormat(DictTypeConstants.USER_TYPE) - private Integer userType; - - @Schema(description = "发送状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @ExcelProperty(value = "发送状态", converter = DictConvert.class) - @DictFormat(DictTypeConstants.SMS_SEND_STATUS) - private Integer sendStatus; - - @Schema(description = "发送时间") - @ExcelProperty("发送时间") - private LocalDateTime sendTime; - - @Schema(description = "短信 API 发送结果的编码", example = "SUCCESS") - @ExcelProperty("短信 API 发送结果的编码") - private String apiSendCode; - - @Schema(description = "短信 API 发送失败的提示", example = "成功") - @ExcelProperty("短信 API 发送失败的提示") - private String apiSendMsg; - - @Schema(description = "短信 API 发送返回的唯一请求 ID", example = "3837C6D3-B96F-428C-BBB2-86135D4B5B99") - @ExcelProperty("短信 API 发送返回的唯一请求 ID") - private String apiRequestId; - - @Schema(description = "短信 API 发送返回的序号", example = "62923244790") - @ExcelProperty("短信 API 发送返回的序号") - private String apiSerialNo; - - @Schema(description = "接收状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") - @ExcelProperty(value = "接收状态", converter = DictConvert.class) - @DictFormat(DictTypeConstants.SMS_RECEIVE_STATUS) - private Integer receiveStatus; - - @Schema(description = "接收时间") - @ExcelProperty("接收时间") - private LocalDateTime receiveTime; - - @Schema(description = "API 接收结果的编码", example = "DELIVRD") - @ExcelProperty("API 接收结果的编码") - private String apiReceiveCode; - - @Schema(description = "API 接收结果的说明", example = "用户接收成功") - @ExcelProperty("API 接收结果的说明") - private String apiReceiveMsg; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - @ExcelProperty("创建时间") - private LocalDateTime createTime; - } diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/notice/NoticeServiceImpl.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/notice/NoticeServiceImpl.java index eaa3728eb..0828dbe4d 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/notice/NoticeServiceImpl.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/notice/NoticeServiceImpl.java @@ -1,5 +1,7 @@ package com.cf.imes.module.system.service.notice; +import cn.hutool.core.util.ObjectUtil; +import com.cf.imes.framework.common.enums.CommonStatusEnum; import com.cf.imes.framework.common.exception.util.ServiceExceptionUtil; import com.cf.imes.framework.common.pojo.PageResult; import com.cf.imes.framework.common.util.object.BeanUtils; @@ -52,6 +54,11 @@ public class NoticeServiceImpl implements NoticeService { @Override public PageResult getNoticePage(NoticePageReqVO reqVO) { + // 没有显示传入状态默认查有效的 + Integer status = reqVO.getStatus(); + if (ObjectUtil.isNull(status)) { + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); + } return noticeMapper.selectPage(reqVO); } diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/permission/RoleServiceImpl.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/permission/RoleServiceImpl.java index dc0553aee..6a5a02a27 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/permission/RoleServiceImpl.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/permission/RoleServiceImpl.java @@ -17,6 +17,7 @@ import com.cf.imes.module.system.controller.admin.permission.vo.role.RoleSaveReq import com.cf.imes.module.system.dal.dataobject.permission.RoleDO; import com.cf.imes.module.system.dal.mysql.permission.RoleMapper; import com.cf.imes.module.system.dal.redis.RedisKeyConstants; +import com.cf.imes.module.system.dal.redis.RedisRefreshChannelTopicConstants; import com.cf.imes.module.system.enums.permission.DataScopeEnum; import com.cf.imes.module.system.enums.permission.RoleCodeEnum; import com.cf.imes.module.system.enums.permission.RoleTypeEnum; @@ -24,6 +25,9 @@ import com.google.common.annotations.VisibleForTesting; import lombok.extern.slf4j.Slf4j; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; +import org.springframework.data.redis.core.Cursor; +import org.springframework.data.redis.core.ScanOptions; +import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.StringUtils; @@ -53,6 +57,12 @@ public class RoleServiceImpl implements RoleService { @Resource private RoleService roleService; + @Resource + private StringRedisTemplate stringRedisTemplate; + + // 模糊匹配redisKey:role:{organId}:{roleId} + public static final String REDIS_ROLE_KEY_PATTERN = RedisKeyConstants.ROLE + ":*:%d"; + @Override @Transactional(rollbackFor = Exception.class) public Long createRole(RoleSaveReqVO createReqVO, Integer type) { @@ -80,6 +90,8 @@ public class RoleServiceImpl implements RoleService { // 更新到数据库 RoleDO updateObj = BeanUtils.toBean(updateReqVO, RoleDO.class); roleMapper.updateById(updateObj); + // 移除角色缓存 + scanAndDelKeys(String.format(REDIS_ROLE_KEY_PATTERN, updateObj.getId())); } @Override @@ -91,6 +103,8 @@ public class RoleServiceImpl implements RoleService { // 更新状态 RoleDO updateObj = new RoleDO().setId(id).setStatus(status); roleMapper.updateById(updateObj); + // 移除角色缓存 + scanAndDelKeys(String.format(REDIS_ROLE_KEY_PATTERN, updateObj.getId())); } @Override @@ -117,6 +131,31 @@ public class RoleServiceImpl implements RoleService { roleMapper.deleteById(id); // 删除相关数据 permissionService.processRoleDeleted(id); + // 删除角色移除角色缓存 + scanAndDelKeys(String.format(REDIS_ROLE_KEY_PATTERN, id)); + } + + /** + * scan匹配keyPattern下缓存并删除缓存 + * + * @param keyPattern + */ + private void scanAndDelKeys(String keyPattern) { + // 根据keyPattern scan匹配的redis key + List matchKeys = new ArrayList<>(); + Cursor cursor = stringRedisTemplate.scan(ScanOptions.scanOptions().match(keyPattern).count(200).build()); + while (cursor.hasNext()) { + matchKeys.add(cursor.next()); + } + cursor.close(); + if (CollUtil.isNotEmpty(matchKeys)) { + for (String key : matchKeys) { + // 移除缓存 + stringRedisTemplate.delete(key); + } + } + // 通知刷新本地缓存 + stringRedisTemplate.convertAndSend(RedisRefreshChannelTopicConstants.PERMISSION_REFRESH, ""); } /** @@ -127,7 +166,7 @@ public class RoleServiceImpl implements RoleService { * * @param name 角色名字 * @param code 角色额编码 - * @param id 角色编号 + * @param id 角色编号 */ @VisibleForTesting void validateRoleDuplicate(String name, String code, Long id, Long organId) { @@ -156,7 +195,7 @@ public class RoleServiceImpl implements RoleService { * * @param id 角色编号 */ - // @VisibleForTesting + // @VisibleForTesting @OrganIgnore @Override public void validateRoleForUpdate(Long id) { @@ -199,7 +238,7 @@ public class RoleServiceImpl implements RoleService { public List getRoleListByStatus(Collection statuses, Long organId) { LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); assert loginUser != null; - if(!loginUser.getIsSupAdmin()) { + if (!loginUser.getIsSupAdmin()) { return roleMapper.selectList(new LambdaQueryWrapperX() .in(RoleDO::getStatus, statuses) .in(RoleDO::getOrganId, loginUser.getOrganId(), 0L) @@ -226,7 +265,7 @@ public class RoleServiceImpl implements RoleService { if (CollUtil.isEmpty(ids)) { return Collections.emptyList(); } - return roleMapper.selectBatchIds(ids); + return roleMapper.selectBatchIds(ids); } @Override @@ -293,7 +332,7 @@ public class RoleServiceImpl implements RoleService { if (CollUtil.isEmpty(roleIds)) { return Collections.emptyList(); } - return roleMapper.selectBatchIds(roleIds); + return roleMapper.selectBatchIds(roleIds); } }