From 2d336cd7851031e733140134c84896e656f999e3 Mon Sep 17 00:00:00 2001 From: chenchuchuan <13554600537@163.com> Date: Mon, 24 Aug 2026 17:18:18 +0800 Subject: [PATCH] =?UTF-8?q?feat(common-online):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=9C=A8=E7=BA=BF=E8=A1=A8=E5=8D=95=E6=9D=83=E9=99=90=E5=AD=97?= =?UTF-8?q?=E5=BC=82=E6=AD=A5=E7=94=9F=E6=88=90=E6=B8=85=E7=90=86=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 OnlineAsyncConfig 配置类,提供权限字任务专用线程池 - 新增 OnlinePermCodeService 接口及其实现类,提供异步权限字生成功能 - 添加 SysPerm、SysPermCode、SysPermCodePerm、SysPermModule 等权限相关实体模型 - 集成权限字服务到 OnlinePageController,支持发布时异步生成权限字 - 实现删除在线表单时异步清理相关权限字数据功能 - 优化 OnlineFormController 中的附表名称处理逻辑 - 修正 OnlinePageService 接口文档注释错误 --- .../common/online/config/OnlineAsyncConfig.java | 36 +++ .../common/online/config/OnlineAutoConfig.java | 2 + .../online/controller/OnlineFormController.java | 4 +- .../online/controller/OnlinePageController.java | 11 + .../common/online/service/OnlinePageService.java | 2 +- .../common/online/upms/dao/SysPermCodeMapper.java | 14 + .../online/upms/dao/SysPermCodePermMapper.java | 14 + .../common/online/upms/dao/SysPermMapper.java | 14 + .../online/upms/dao/SysPermModuleMapper.java | 14 + .../apelet/common/online/upms/model/SysPerm.java | 55 ++++ .../common/online/upms/model/SysPermCode.java | 62 +++++ .../common/online/upms/model/SysPermCodePerm.java | 29 ++ .../common/online/upms/model/SysPermModule.java | 56 ++++ .../online/upms/service/OnlinePermCodeService.java | 26 ++ .../service/impl/OnlinePermCodeServiceImpl.java | 305 +++++++++++++++++++++ 15 files changed, 642 insertions(+), 2 deletions(-) create mode 100644 common/common-online/src/main/java/apelet/common/online/config/OnlineAsyncConfig.java create mode 100644 common/common-online/src/main/java/apelet/common/online/upms/dao/SysPermCodeMapper.java create mode 100644 common/common-online/src/main/java/apelet/common/online/upms/dao/SysPermCodePermMapper.java create mode 100644 common/common-online/src/main/java/apelet/common/online/upms/dao/SysPermMapper.java create mode 100644 common/common-online/src/main/java/apelet/common/online/upms/dao/SysPermModuleMapper.java create mode 100644 common/common-online/src/main/java/apelet/common/online/upms/model/SysPerm.java create mode 100644 common/common-online/src/main/java/apelet/common/online/upms/model/SysPermCode.java create mode 100644 common/common-online/src/main/java/apelet/common/online/upms/model/SysPermCodePerm.java create mode 100644 common/common-online/src/main/java/apelet/common/online/upms/model/SysPermModule.java create mode 100644 common/common-online/src/main/java/apelet/common/online/upms/service/OnlinePermCodeService.java create mode 100644 common/common-online/src/main/java/apelet/common/online/upms/service/impl/OnlinePermCodeServiceImpl.java diff --git a/common/common-online/src/main/java/apelet/common/online/config/OnlineAsyncConfig.java b/common/common-online/src/main/java/apelet/common/online/config/OnlineAsyncConfig.java new file mode 100644 index 0000000..c9cf094 --- /dev/null +++ b/common/common-online/src/main/java/apelet/common/online/config/OnlineAsyncConfig.java @@ -0,0 +1,36 @@ +package apelet.common.online.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.concurrent.ThreadPoolExecutor; + +/** + * common-online异步任务线程池配置。 + *
供在线表单发布生成权限字等异步任务使用。
+ * + * @author guifc + * @date 2023-08-04 + */ +@Configuration +@EnableAsync +public class OnlineAsyncConfig { + + /** + * 权限字生成/清理专用线程池。 + */ + @Bean("permCodeTaskExecutor") + public ThreadPoolTaskExecutor permCodeTaskExecutor() { + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setCorePoolSize(2); + executor.setMaxPoolSize(4); + executor.setQueueCapacity(100); + executor.setThreadNamePrefix("perm-code-"); + // 队列满时由调用线程执行,避免丢弃任务。 + executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + executor.initialize(); + return executor; + } +} diff --git a/common/common-online/src/main/java/apelet/common/online/config/OnlineAutoConfig.java b/common/common-online/src/main/java/apelet/common/online/config/OnlineAutoConfig.java index 45338b2..ba86a99 100644 --- a/common/common-online/src/main/java/apelet/common/online/config/OnlineAutoConfig.java +++ b/common/common-online/src/main/java/apelet/common/online/config/OnlineAutoConfig.java @@ -1,6 +1,7 @@ package apelet.common.online.config; import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Import; /** * common-online模块的自动配置引导类。 @@ -9,5 +10,6 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties * @date 2023-08-04 */ @EnableConfigurationProperties({OnlineProperties.class}) +@Import(OnlineAsyncConfig.class) public class OnlineAutoConfig { } diff --git a/common/common-online/src/main/java/apelet/common/online/controller/OnlineFormController.java b/common/common-online/src/main/java/apelet/common/online/controller/OnlineFormController.java index b39fb7b..6c9787b 100644 --- a/common/common-online/src/main/java/apelet/common/online/controller/OnlineFormController.java +++ b/common/common-online/src/main/java/apelet/common/online/controller/OnlineFormController.java @@ -1139,9 +1139,11 @@ public class OnlineFormController { if (newSubTableNames.isEmpty()) { return false; } + List在线表单发布自动生成权限字使用,精简自 tenant-admin 的同名 Mapper。
+ * + * @author guifc + * @date 2023-08-04 + */ +public interface SysPermCodeMapper extends BaseDaoMapper在线表单发布自动生成权限字使用,精简自 tenant-admin 的同名 Mapper。
+ * + * @author guifc + * @date 2023-08-04 + */ +public interface SysPermCodePermMapper extends BaseDaoMapper在线表单发布自动生成权限字使用,精简自 tenant-admin 的同名 Mapper。
+ * + * @author guifc + * @date 2023-08-04 + */ +public interface SysPermMapper extends BaseDaoMapper在线表单发布自动生成权限字使用,精简自 tenant-admin 的同名 Mapper。
+ * + * @author guifc + * @date 2023-08-04 + */ +public interface SysPermModuleMapper extends BaseDaoMapper在线表单发布自动生成权限字使用,仅保留数据库字段,精简自 tenant-admin 的同名实体。
+ * + * @author guifc + * @date 2023-08-04 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName(value = "xy_sys_perm") +public class SysPerm extends BaseModel { + + /** + * 权限Id。 + */ + @TableId(value = "perm_id") + private Long permId; + + /** + * 权限所在的权限模块Id。 + */ + @TableField(value = "module_id") + private Long moduleId; + + /** + * 权限名称。 + */ + @TableField(value = "perm_name") + private String permName; + + /** + * 关联的URL。 + */ + private String url; + + /** + * 权限在当前模块下的顺序,由小到大。 + */ + @TableField(value = "show_order") + private Integer showOrder; + + /** + * 逻辑删除标记字段(1: 正常 -1: 已删除)。 + */ + @TableLogic + @TableField(value = "deleted_flag") + private Integer deletedFlag; +} diff --git a/common/common-online/src/main/java/apelet/common/online/upms/model/SysPermCode.java b/common/common-online/src/main/java/apelet/common/online/upms/model/SysPermCode.java new file mode 100644 index 0000000..62ebf65 --- /dev/null +++ b/common/common-online/src/main/java/apelet/common/online/upms/model/SysPermCode.java @@ -0,0 +1,62 @@ +package apelet.common.online.upms.model; + +import apelet.common.core.base.model.BaseModel; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 权限字实体对象。 + *在线表单发布自动生成权限字使用,仅保留数据库字段,精简自 tenant-admin 的同名实体。
+ * + * @author guifc + * @date 2023-08-04 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName(value = "xy_sys_perm_code") +public class SysPermCode extends BaseModel { + + /** + * 主键Id。 + */ + @TableId(value = "perm_code_id") + private Long permCodeId; + + /** + * 上级权限字Id。 + */ + @TableField(value = "parent_id") + private Long parentId; + + /** + * 权限字标识(一般为有含义的英文字符串)。 + */ + @TableField(value = "perm_code") + private String permCode; + + /** + * 权限类型(0: 表单 1: UI片段 2: 操作)。 + */ + @TableField(value = "perm_code_type") + private Integer permCodeType; + + /** + * 显示名称。 + */ + @TableField(value = "show_name") + private String showName; + + /** + * 显示顺序(数值越小,越靠前)。 + */ + @TableField(value = "show_order") + private Integer showOrder; + + /** + * 逻辑删除标记字段(1: 正常 -1: 已删除)。 + */ + @TableLogic + @TableField(value = "deleted_flag") + private Integer deletedFlag; +} diff --git a/common/common-online/src/main/java/apelet/common/online/upms/model/SysPermCodePerm.java b/common/common-online/src/main/java/apelet/common/online/upms/model/SysPermCodePerm.java new file mode 100644 index 0000000..b1fe2e4 --- /dev/null +++ b/common/common-online/src/main/java/apelet/common/online/upms/model/SysPermCodePerm.java @@ -0,0 +1,29 @@ +package apelet.common.online.upms.model; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +/** + * 权限字与权限资源关联实体对象。 + *在线表单发布自动生成权限字使用,精简自 tenant-admin 的同名实体。
+ * + * @author guifc + * @date 2023-08-04 + */ +@Data +@TableName(value = "xy_sys_perm_code_perm") +public class SysPermCodePerm { + + /** + * 权限字Id。 + */ + @TableField(value = "perm_code_id") + private Long permCodeId; + + /** + * 权限Id。 + */ + @TableField(value = "perm_id") + private Long permId; +} diff --git a/common/common-online/src/main/java/apelet/common/online/upms/model/SysPermModule.java b/common/common-online/src/main/java/apelet/common/online/upms/model/SysPermModule.java new file mode 100644 index 0000000..b60e159 --- /dev/null +++ b/common/common-online/src/main/java/apelet/common/online/upms/model/SysPermModule.java @@ -0,0 +1,56 @@ +package apelet.common.online.upms.model; + +import apelet.common.core.base.model.BaseModel; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 权限模块实体对象。 + *在线表单发布自动生成权限字使用,仅保留数据库字段,精简自 tenant-admin 的同名实体。
+ * + * @author guifc + * @date 2023-08-04 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName(value = "xy_sys_perm_module") +public class SysPermModule extends BaseModel { + + /** + * 权限模块Id。 + */ + @TableId(value = "module_id") + private Long moduleId; + + /** + * 上级权限模块Id。 + */ + @TableField(value = "parent_id") + private Long parentId; + + /** + * 权限模块名称。 + */ + @TableField(value = "module_name") + private String moduleName; + + /** + * 权限模块类型(0: 普通模块 1: Controller模块)。 + */ + @TableField(value = "module_type") + private Integer moduleType; + + /** + * 权限模块在当前层级下的顺序,由小到大。 + */ + @TableField(value = "show_order") + private Integer showOrder; + + /** + * 逻辑删除标记字段(1: 正常 -1: 已删除)。 + */ + @TableLogic + @TableField(value = "deleted_flag") + private Integer deletedFlag; +} diff --git a/common/common-online/src/main/java/apelet/common/online/upms/service/OnlinePermCodeService.java b/common/common-online/src/main/java/apelet/common/online/upms/service/OnlinePermCodeService.java new file mode 100644 index 0000000..4003aa6 --- /dev/null +++ b/common/common-online/src/main/java/apelet/common/online/upms/service/OnlinePermCodeService.java @@ -0,0 +1,26 @@ +package apelet.common.online.upms.service; + +/** + * 在线表单权限字生成/清理服务接口。 + *在线表单发布后自动生成权限字,删除时同步清理。实现类中的方法均为异步执行。
+ * + * @author guifc + * @date 2023-08-04 + */ +public interface OnlinePermCodeService { + + /** + * 在线表单发布后,异步生成权限字相关数据(幂等:先生成前先按 pageCode 清理旧数据再重建)。 + * + * @param pageId 页面主键Id。 + * @param userId 操作者Id。异步线程中没有请求上下文,因此由调用方传入,用于填充创建/更新人。 + */ + void genPermCodeByPageId(Long pageId, Long userId); + + /** + * 删除在线表单时,异步清理自动生成的权限字树及其关联的权限资源、权限模块。 + * + * @param pageCode 页面编码。 + */ + void removePermCodeByPageCode(String pageCode); +} diff --git a/common/common-online/src/main/java/apelet/common/online/upms/service/impl/OnlinePermCodeServiceImpl.java b/common/common-online/src/main/java/apelet/common/online/upms/service/impl/OnlinePermCodeServiceImpl.java new file mode 100644 index 0000000..7266b79 --- /dev/null +++ b/common/common-online/src/main/java/apelet/common/online/upms/service/impl/OnlinePermCodeServiceImpl.java @@ -0,0 +1,305 @@ +package apelet.common.online.upms.service.impl; + +import apelet.common.core.annotation.MyDataSourceResolver; +import apelet.common.core.base.model.BaseModel; +import apelet.common.core.constant.ApplicationConstant; +import apelet.common.core.constant.GlobalDeletedFlag; +import apelet.common.core.util.DefaultDataSourceResolver; +import apelet.common.generator.dao.OnlFormHeadMapper; +import apelet.common.generator.model.OnlFormHead; +import apelet.common.online.dao.OnlinePageMapper; +import apelet.common.online.dao.OnlineTableMapper; +import apelet.common.online.model.OnlinePage; +import apelet.common.online.model.OnlineTable; +import apelet.common.online.upms.dao.SysPermCodeMapper; +import apelet.common.online.upms.dao.SysPermCodePermMapper; +import apelet.common.online.upms.dao.SysPermMapper; +import apelet.common.online.upms.dao.SysPermModuleMapper; +import apelet.common.online.upms.model.SysPerm; +import apelet.common.online.upms.model.SysPermCode; +import apelet.common.online.upms.model.SysPermCodePerm; +import apelet.common.online.upms.model.SysPermModule; +import apelet.common.online.upms.service.OnlinePermCodeService; +import apelet.common.sequence.wrapper.IdGeneratorWrapper; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * 在线表单权限字生成/清理服务实现类。 + *在线表单发布后自动生成权限字,删除时同步清理。生成与清理均为异步执行,内部自行捕获异常并记录日志。
+ * + * @author guifc + * @date 2023-08-04 + */ +@Slf4j +@MyDataSourceResolver( + resolver = DefaultDataSourceResolver.class, + intArg = ApplicationConstant.COMMON_FLOW_AND_ONLINE_DATASOURCE_TYPE) +@Service("onlinePermCodeService") +public class OnlinePermCodeServiceImpl implements OnlinePermCodeService { + + /** 主表字段下载文件接口路径后缀。 */ + private static final String DOWNLOAD_DATASOURCE = "/onlineOperation/downloadDatasource"; + /** 数据源主表字段上传文件接口路径后缀。 */ + private static final String UPLOAD_DATASOURCE = "/onlineOperation/uploadDatasource"; + /** 数据源一对多关联的从表字段下载文件接口路径后缀。 */ + private static final String DOWNLOAD_ONE_TO_MANY = "/onlineOperation/downloadOneToManyRelation"; + /** 数据源一对多关联的从表字段上传文件接口路径后缀。 */ + private static final String UPLOAD_ONE_TO_MANY = "/onlineOperation/uploadOneToManyRelation"; + + @Value("${common-online.urlPrefix:}") + private String urlPrefix; + + @Autowired + private OnlinePageMapper onlinePageMapper; + @Autowired + private OnlFormHeadMapper onlFormHeadMapper; + @Autowired + private OnlineTableMapper onlineTableMapper; + @Autowired + private SysPermModuleMapper sysPermModuleMapper; + @Autowired + private SysPermMapper sysPermMapper; + @Autowired + private SysPermCodeMapper sysPermCodeMapper; + @Autowired + private SysPermCodePermMapper sysPermCodePermMapper; + @Autowired + private IdGeneratorWrapper idGenerator; + + /** + * 发布后异步生成权限字,先生成前先清理旧数据保证幂等。 + */ + @Async("permCodeTaskExecutor") + @Transactional(rollbackFor = Exception.class) + @Override + public void genPermCodeByPageId(Long pageId, Long userId) { + try { + this.doGenPermCode(pageId, userId); + } catch (Exception e) { + log.error("在线表单发布生成权限字失败,pageId={}", pageId, e); + } + } + + /** + * 删除表单后异步清理权限字相关数据。 + */ + @Async("permCodeTaskExecutor") + @Transactional(rollbackFor = Exception.class) + @Override + public void removePermCodeByPageCode(String pageCode) { + try { + this.doRemovePermCode(pageCode); + } catch (Exception e) { + log.error("在线表单删除清理权限字失败,pageCode={}", pageCode, e); + } + } + + private void doGenPermCode(Long pageId, Long userId) { + OnlinePage page = onlinePageMapper.selectById(pageId); + if (page == null || StrUtil.isBlank(page.getPageCode())) { + log.warn("生成权限字失败,页面不存在或页面编码为空,pageId={}", pageId); + return; + } + String pageCode = page.getPageCode(); + String pageName = StrUtil.nullToEmpty(page.getPageName()); + // 先清理旧数据,保证幂等。 + this.doRemovePermCode(pageCode); + // 主表。 + OnlFormHead mainHead = onlFormHeadMapper.selectById(page.getMasterTableId()); + if (mainHead == null || StrUtil.isBlank(mainHead.getTableName())) { + log.warn("生成权限字失败,找不到主表对应的 onl_form_head,pageId={}, masterTableId={}", + pageId, page.getMasterTableId()); + return; + } + // 附表:sort 取主表 table_name。 + QueryWrapper