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/upms/dao/SysPermCodeMapper.java b/common/common-online/src/main/java/apelet/common/online/upms/dao/SysPermCodeMapper.java
new file mode 100644
index 0000000..d3225e7
--- /dev/null
+++ b/common/common-online/src/main/java/apelet/common/online/upms/dao/SysPermCodeMapper.java
@@ -0,0 +1,14 @@
+package apelet.common.online.upms.dao;
+
+import apelet.common.core.base.dao.BaseDaoMapper;
+import apelet.common.online.upms.model.SysPermCode;
+
+/**
+ * 权限字数据访问操作接口。
+ * 在线表单发布自动生成权限字使用,精简自 tenant-admin 的同名 Mapper。
+ *
+ * @author guifc
+ * @date 2023-08-04
+ */
+public interface SysPermCodeMapper extends BaseDaoMapper {
+}
diff --git a/common/common-online/src/main/java/apelet/common/online/upms/dao/SysPermCodePermMapper.java b/common/common-online/src/main/java/apelet/common/online/upms/dao/SysPermCodePermMapper.java
new file mode 100644
index 0000000..d4075b3
--- /dev/null
+++ b/common/common-online/src/main/java/apelet/common/online/upms/dao/SysPermCodePermMapper.java
@@ -0,0 +1,14 @@
+package apelet.common.online.upms.dao;
+
+import apelet.common.core.base.dao.BaseDaoMapper;
+import apelet.common.online.upms.model.SysPermCodePerm;
+
+/**
+ * 权限字与权限资源关系数据访问操作接口。
+ * 在线表单发布自动生成权限字使用,精简自 tenant-admin 的同名 Mapper。
+ *
+ * @author guifc
+ * @date 2023-08-04
+ */
+public interface SysPermCodePermMapper extends BaseDaoMapper {
+}
diff --git a/common/common-online/src/main/java/apelet/common/online/upms/dao/SysPermMapper.java b/common/common-online/src/main/java/apelet/common/online/upms/dao/SysPermMapper.java
new file mode 100644
index 0000000..d290163
--- /dev/null
+++ b/common/common-online/src/main/java/apelet/common/online/upms/dao/SysPermMapper.java
@@ -0,0 +1,14 @@
+package apelet.common.online.upms.dao;
+
+import apelet.common.core.base.dao.BaseDaoMapper;
+import apelet.common.online.upms.model.SysPerm;
+
+/**
+ * 权限资源数据访问操作接口。
+ * 在线表单发布自动生成权限字使用,精简自 tenant-admin 的同名 Mapper。
+ *
+ * @author guifc
+ * @date 2023-08-04
+ */
+public interface SysPermMapper extends BaseDaoMapper {
+}
diff --git a/common/common-online/src/main/java/apelet/common/online/upms/dao/SysPermModuleMapper.java b/common/common-online/src/main/java/apelet/common/online/upms/dao/SysPermModuleMapper.java
new file mode 100644
index 0000000..2cb8969
--- /dev/null
+++ b/common/common-online/src/main/java/apelet/common/online/upms/dao/SysPermModuleMapper.java
@@ -0,0 +1,14 @@
+package apelet.common.online.upms.dao;
+
+import apelet.common.core.base.dao.BaseDaoMapper;
+import apelet.common.online.upms.model.SysPermModule;
+
+/**
+ * 权限模块数据访问操作接口。
+ * 在线表单发布自动生成权限字使用,精简自 tenant-admin 的同名 Mapper。
+ *
+ * @author guifc
+ * @date 2023-08-04
+ */
+public interface SysPermModuleMapper extends BaseDaoMapper {
+}
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
index 2896e2f..aa01b0e 100644
--- 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
@@ -11,10 +11,10 @@ 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.OnlineSysPermCodeMapper;
-import apelet.common.online.upms.dao.OnlineSysPermCodePermMapper;
-import apelet.common.online.upms.dao.OnlineSysPermMapper;
-import apelet.common.online.upms.dao.OnlineSysPermModuleMapper;
+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;
@@ -27,7 +27,9 @@ 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 javax.annotation.PreDestroy;
import java.util.*;
@@ -86,12 +88,15 @@ public class OnlinePermCodeServiceImpl implements OnlinePermCodeService {
private OnlineSysPermCodeMapper onlineSysPermCodeMapper;
@Autowired
private OnlineSysPermCodePermMapper onlineSysPermCodePermMapper;
+
@Autowired
private IdGeneratorWrapper idGenerator;
/**
* 发布后异步生成权限字,先生成前先清理旧数据保证幂等。
*/
+ @Async("permCodeTaskExecutor")
+ @Transactional(rollbackFor = Exception.class)
@Override
public void genPermCodeByPageId(Long pageId, Long userId) {
permCodeExecutor.execute(() -> {
@@ -110,6 +115,8 @@ public class OnlinePermCodeServiceImpl implements OnlinePermCodeService {
/**
* 删除表单后异步清理权限字相关数据。
*/
+ @Async("permCodeTaskExecutor")
+ @Transactional(rollbackFor = Exception.class)
@Override
public void removePermCodeByPageCode(String pageCode) {
permCodeExecutor.execute(() -> {