commit
456620b638
11
pom.xml
11
pom.xml
@ -13,8 +13,8 @@
|
|||||||
<description>RuoYi-Vue-Plus多租户管理系统</description>
|
<description>RuoYi-Vue-Plus多租户管理系统</description>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<revision>5.2.0-BETA</revision>
|
<revision>5.2.0-BETA2</revision>
|
||||||
<spring-boot.version>3.2.5</spring-boot.version>
|
<spring-boot.version>3.2.6</spring-boot.version>
|
||||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
||||||
<java.version>17</java.version>
|
<java.version>17</java.version>
|
||||||
@ -34,7 +34,7 @@
|
|||||||
<lock4j.version>2.2.7</lock4j.version>
|
<lock4j.version>2.2.7</lock4j.version>
|
||||||
<dynamic-ds.version>4.3.0</dynamic-ds.version>
|
<dynamic-ds.version>4.3.0</dynamic-ds.version>
|
||||||
<alibaba-ttl.version>2.14.4</alibaba-ttl.version>
|
<alibaba-ttl.version>2.14.4</alibaba-ttl.version>
|
||||||
<snailjob.version>1.0.0-beta1</snailjob.version>
|
<snailjob.version>1.0.0-beta3</snailjob.version>
|
||||||
<mapstruct-plus.version>1.3.6</mapstruct-plus.version>
|
<mapstruct-plus.version>1.3.6</mapstruct-plus.version>
|
||||||
<mapstruct-plus.lombok.version>0.2.0</mapstruct-plus.lombok.version>
|
<mapstruct-plus.lombok.version>0.2.0</mapstruct-plus.lombok.version>
|
||||||
<lombok.version>1.18.32</lombok.version>
|
<lombok.version>1.18.32</lombok.version>
|
||||||
@ -50,6 +50,8 @@
|
|||||||
<sms4j.version>3.2.1</sms4j.version>
|
<sms4j.version>3.2.1</sms4j.version>
|
||||||
<!-- 限制框架中的fastjson版本 -->
|
<!-- 限制框架中的fastjson版本 -->
|
||||||
<fastjson.version>1.2.83</fastjson.version>
|
<fastjson.version>1.2.83</fastjson.version>
|
||||||
|
<!--工作流配置-->
|
||||||
|
<flowable.version>7.0.0</flowable.version>
|
||||||
|
|
||||||
<!-- 插件版本 -->
|
<!-- 插件版本 -->
|
||||||
<maven-jar-plugin.version>3.2.2</maven-jar-plugin.version>
|
<maven-jar-plugin.version>3.2.2</maven-jar-plugin.version>
|
||||||
@ -57,9 +59,6 @@
|
|||||||
<maven-compiler-plugin.verison>3.11.0</maven-compiler-plugin.verison>
|
<maven-compiler-plugin.verison>3.11.0</maven-compiler-plugin.verison>
|
||||||
<maven-surefire-plugin.version>3.1.2</maven-surefire-plugin.version>
|
<maven-surefire-plugin.version>3.1.2</maven-surefire-plugin.version>
|
||||||
<flatten-maven-plugin.version>1.3.0</flatten-maven-plugin.version>
|
<flatten-maven-plugin.version>1.3.0</flatten-maven-plugin.version>
|
||||||
|
|
||||||
<!--工作流配置-->
|
|
||||||
<flowable.version>7.0.0</flowable.version>
|
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<profiles>
|
<profiles>
|
||||||
|
@ -97,21 +97,6 @@
|
|||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>me.zhyd.oauth</groupId>
|
|
||||||
<artifactId>JustAuth</artifactId>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<!-- SnailJob client -->
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.aizuda</groupId>
|
|
||||||
<artifactId>snail-job-client-starter</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.aizuda</groupId>
|
|
||||||
<artifactId>snail-job-client-job-core</artifactId>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<!-- skywalking 整合 logback -->
|
<!-- skywalking 整合 logback -->
|
||||||
<!-- <dependency>-->
|
<!-- <dependency>-->
|
||||||
<!-- <groupId>org.apache.skywalking</groupId>-->
|
<!-- <groupId>org.apache.skywalking</groupId>-->
|
||||||
|
@ -12,7 +12,7 @@ spring.boot.admin.client:
|
|||||||
snail-job:
|
snail-job:
|
||||||
enabled: true
|
enabled: true
|
||||||
# 需要在 SnailJob 后台组管理创建对应名称的组,然后创建任务的时候选择对应的组,才能正确分派任务
|
# 需要在 SnailJob 后台组管理创建对应名称的组,然后创建任务的时候选择对应的组,才能正确分派任务
|
||||||
group-name: "ruoyi_group"
|
group: "ruoyi_group"
|
||||||
# SnailJob 接入验证令牌 详见 script/sql/snail_job.sql `sj_group_config` 表
|
# SnailJob 接入验证令牌 详见 script/sql/snail_job.sql `sj_group_config` 表
|
||||||
token: "SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT"
|
token: "SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT"
|
||||||
server:
|
server:
|
||||||
@ -21,7 +21,6 @@ snail-job:
|
|||||||
# 详见 script/sql/snail_job.sql `sj_namespace` 表
|
# 详见 script/sql/snail_job.sql `sj_namespace` 表
|
||||||
namespace: ${spring.profiles.active}
|
namespace: ${spring.profiles.active}
|
||||||
|
|
||||||
|
|
||||||
--- # 数据源配置
|
--- # 数据源配置
|
||||||
spring:
|
spring:
|
||||||
datasource:
|
datasource:
|
||||||
@ -102,6 +101,7 @@ spring.data:
|
|||||||
# 是否开启ssl
|
# 是否开启ssl
|
||||||
ssl.enabled: false
|
ssl.enabled: false
|
||||||
|
|
||||||
|
# redisson 配置
|
||||||
redisson:
|
redisson:
|
||||||
# redis key前缀
|
# redis key前缀
|
||||||
keyPrefix:
|
keyPrefix:
|
||||||
|
@ -15,7 +15,7 @@ spring.boot.admin.client:
|
|||||||
snail-job:
|
snail-job:
|
||||||
enabled: false
|
enabled: false
|
||||||
# 需要在 SnailJob 后台组管理创建对应名称的组,然后创建任务的时候选择对应的组,才能正确分派任务
|
# 需要在 SnailJob 后台组管理创建对应名称的组,然后创建任务的时候选择对应的组,才能正确分派任务
|
||||||
group-name: "ruoyi_group"
|
group: "ruoyi_group"
|
||||||
# SnailJob 接入验证令牌 详见 script/sql/snail_job.sql `sj_group_config` 表
|
# SnailJob 接入验证令牌 详见 script/sql/snail_job.sql `sj_group_config` 表
|
||||||
token: "SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT"
|
token: "SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT"
|
||||||
server:
|
server:
|
||||||
@ -104,6 +104,7 @@ spring.data:
|
|||||||
# 是否开启ssl
|
# 是否开启ssl
|
||||||
ssl.enabled: false
|
ssl.enabled: false
|
||||||
|
|
||||||
|
# redisson 配置
|
||||||
redisson:
|
redisson:
|
||||||
# redis key前缀
|
# redis key前缀
|
||||||
keyPrefix:
|
keyPrefix:
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
</description>
|
</description>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<revision>5.2.0-BETA</revision>
|
<revision>5.2.0-BETA2</revision>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<dependencyManagement>
|
<dependencyManagement>
|
||||||
|
@ -0,0 +1,41 @@
|
|||||||
|
package org.dromara.common.core.domain.event;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 总体流程监听
|
||||||
|
*
|
||||||
|
* @author may
|
||||||
|
*/
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class ProcessEvent implements Serializable {
|
||||||
|
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 流程定义key
|
||||||
|
*/
|
||||||
|
private String key;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 业务id
|
||||||
|
*/
|
||||||
|
private String businessKey;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 状态
|
||||||
|
*/
|
||||||
|
private String status;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当为true时为申请人节点办理
|
||||||
|
*/
|
||||||
|
private boolean submit;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,35 @@
|
|||||||
|
package org.dromara.common.core.domain.event;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.io.Serial;
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 流程办理监听
|
||||||
|
*
|
||||||
|
* @author may
|
||||||
|
*/
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class ProcessTaskEvent implements Serializable {
|
||||||
|
|
||||||
|
@Serial
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 流程定义key与流程节点标识(拼接方式:流程定义key_流程节点)
|
||||||
|
*/
|
||||||
|
private String keyNode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 任务id
|
||||||
|
*/
|
||||||
|
private String taskId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 业务id
|
||||||
|
*/
|
||||||
|
private String businessKey;
|
||||||
|
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
package org.dromara.workflow.common.enums;
|
package org.dromara.common.core.enums;
|
||||||
|
|
||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
@ -0,0 +1,76 @@
|
|||||||
|
package org.dromara.common.core.service;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 通用 工作流服务
|
||||||
|
*
|
||||||
|
* @author may
|
||||||
|
*/
|
||||||
|
public interface WorkflowService {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 运行中的实例 删除程实例,删除历史记录,删除业务与流程关联信息
|
||||||
|
*
|
||||||
|
* @param businessKeys 业务id
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
boolean deleteRunAndHisInstance(List<String> businessKeys);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取当前流程状态
|
||||||
|
*
|
||||||
|
* @param taskId 任务id
|
||||||
|
*/
|
||||||
|
String getBusinessStatusByTaskId(String taskId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取当前流程状态
|
||||||
|
*
|
||||||
|
* @param businessKey 业务id
|
||||||
|
*/
|
||||||
|
String getBusinessStatus(String businessKey);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置流程变量(全局变量)
|
||||||
|
*
|
||||||
|
* @param taskId 任务id
|
||||||
|
* @param variableName 变量名称
|
||||||
|
* @param value 变量值
|
||||||
|
*/
|
||||||
|
void setVariable(String taskId, String variableName, Object value);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置流程变量(全局变量)
|
||||||
|
*
|
||||||
|
* @param taskId 任务id
|
||||||
|
* @param variables 流程变量
|
||||||
|
*/
|
||||||
|
void setVariables(String taskId, Map<String, Object> variables);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置流程变量(本地变量,非全局变量)
|
||||||
|
*
|
||||||
|
* @param taskId 任务id
|
||||||
|
* @param variableName 变量名称
|
||||||
|
* @param value 变量值
|
||||||
|
*/
|
||||||
|
void setVariableLocal(String taskId, String variableName, Object value);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置流程变量(本地变量,非全局变量)
|
||||||
|
*
|
||||||
|
* @param taskId 任务id
|
||||||
|
* @param variables 流程变量
|
||||||
|
*/
|
||||||
|
void setVariablesLocal(String taskId, Map<String, Object> variables);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 按照业务id查询流程实例id
|
||||||
|
*
|
||||||
|
* @param businessKey 业务id
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
String getInstanceIdByBusinessKey(String businessKey);
|
||||||
|
}
|
@ -21,7 +21,7 @@ import org.springframework.scheduling.annotation.EnableScheduling;
|
|||||||
@AutoConfiguration
|
@AutoConfiguration
|
||||||
@ConditionalOnProperty(prefix = "snail-job", name = "enabled", havingValue = "true")
|
@ConditionalOnProperty(prefix = "snail-job", name = "enabled", havingValue = "true")
|
||||||
@EnableScheduling
|
@EnableScheduling
|
||||||
@EnableSnailJob(group = "${snail-job.group-name}")
|
@EnableSnailJob
|
||||||
public class SnailJobConfig {
|
public class SnailJobConfig {
|
||||||
|
|
||||||
@EventListener(SnailClientStartingEvent.class)
|
@EventListener(SnailClientStartingEvent.class)
|
||||||
|
@ -165,10 +165,11 @@ public class OssClient {
|
|||||||
* @param filePath 本地文件路径
|
* @param filePath 本地文件路径
|
||||||
* @param key 在 Amazon S3 中的对象键
|
* @param key 在 Amazon S3 中的对象键
|
||||||
* @param md5Digest 本地文件的 MD5 哈希值(可选)
|
* @param md5Digest 本地文件的 MD5 哈希值(可选)
|
||||||
|
* @param contentType 文件内容类型
|
||||||
* @return UploadResult 包含上传后的文件信息
|
* @return UploadResult 包含上传后的文件信息
|
||||||
* @throws OssException 如果上传失败,抛出自定义异常
|
* @throws OssException 如果上传失败,抛出自定义异常
|
||||||
*/
|
*/
|
||||||
public UploadResult upload(Path filePath, String key, String md5Digest) {
|
public UploadResult upload(Path filePath, String key, String md5Digest, String contentType) {
|
||||||
try {
|
try {
|
||||||
// 构建上传请求对象
|
// 构建上传请求对象
|
||||||
FileUpload fileUpload = transferManager.uploadFile(
|
FileUpload fileUpload = transferManager.uploadFile(
|
||||||
@ -176,6 +177,7 @@ public class OssClient {
|
|||||||
y -> y.bucket(properties.getBucketName())
|
y -> y.bucket(properties.getBucketName())
|
||||||
.key(key)
|
.key(key)
|
||||||
.contentMD5(StringUtils.isNotEmpty(md5Digest) ? md5Digest : null)
|
.contentMD5(StringUtils.isNotEmpty(md5Digest) ? md5Digest : null)
|
||||||
|
.contentType(contentType)
|
||||||
.build())
|
.build())
|
||||||
.addTransferListener(LoggingTransferListener.create())
|
.addTransferListener(LoggingTransferListener.create())
|
||||||
.source(filePath).build());
|
.source(filePath).build());
|
||||||
@ -201,10 +203,11 @@ public class OssClient {
|
|||||||
* @param inputStream 要上传的输入流
|
* @param inputStream 要上传的输入流
|
||||||
* @param key 在 Amazon S3 中的对象键
|
* @param key 在 Amazon S3 中的对象键
|
||||||
* @param length 输入流的长度
|
* @param length 输入流的长度
|
||||||
|
* @param contentType 文件内容类型
|
||||||
* @return UploadResult 包含上传后的文件信息
|
* @return UploadResult 包含上传后的文件信息
|
||||||
* @throws OssException 如果上传失败,抛出自定义异常
|
* @throws OssException 如果上传失败,抛出自定义异常
|
||||||
*/
|
*/
|
||||||
public UploadResult upload(InputStream inputStream, String key, Long length) {
|
public UploadResult upload(InputStream inputStream, String key, Long length, String contentType) {
|
||||||
// 如果输入流不是 ByteArrayInputStream,则将其读取为字节数组再创建 ByteArrayInputStream
|
// 如果输入流不是 ByteArrayInputStream,则将其读取为字节数组再创建 ByteArrayInputStream
|
||||||
if (!(inputStream instanceof ByteArrayInputStream)) {
|
if (!(inputStream instanceof ByteArrayInputStream)) {
|
||||||
inputStream = new ByteArrayInputStream(IoUtil.readBytes(inputStream));
|
inputStream = new ByteArrayInputStream(IoUtil.readBytes(inputStream));
|
||||||
@ -219,6 +222,7 @@ public class OssClient {
|
|||||||
.putObjectRequest(
|
.putObjectRequest(
|
||||||
y -> y.bucket(properties.getBucketName())
|
y -> y.bucket(properties.getBucketName())
|
||||||
.key(key)
|
.key(key)
|
||||||
|
.contentType(contentType)
|
||||||
.build())
|
.build())
|
||||||
.build());
|
.build());
|
||||||
|
|
||||||
@ -335,7 +339,7 @@ public class OssClient {
|
|||||||
* @throws OssException 如果上传失败,抛出自定义异常
|
* @throws OssException 如果上传失败,抛出自定义异常
|
||||||
*/
|
*/
|
||||||
public UploadResult uploadSuffix(byte[] data, String suffix) {
|
public UploadResult uploadSuffix(byte[] data, String suffix) {
|
||||||
return upload(new ByteArrayInputStream(data), getPath(properties.getPrefix(), suffix), Long.valueOf(data.length));
|
return upload(new ByteArrayInputStream(data), getPath(properties.getPrefix(), suffix), Long.valueOf(data.length), FileUtils.getMimeType(suffix));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -348,7 +352,7 @@ public class OssClient {
|
|||||||
* @throws OssException 如果上传失败,抛出自定义异常
|
* @throws OssException 如果上传失败,抛出自定义异常
|
||||||
*/
|
*/
|
||||||
public UploadResult uploadSuffix(InputStream inputStream, String suffix, Long length) {
|
public UploadResult uploadSuffix(InputStream inputStream, String suffix, Long length) {
|
||||||
return upload(inputStream, getPath(properties.getPrefix(), suffix), length);
|
return upload(inputStream, getPath(properties.getPrefix(), suffix), length, FileUtils.getMimeType(suffix));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -360,7 +364,7 @@ public class OssClient {
|
|||||||
* @throws OssException 如果上传失败,抛出自定义异常
|
* @throws OssException 如果上传失败,抛出自定义异常
|
||||||
*/
|
*/
|
||||||
public UploadResult uploadSuffix(File file, String suffix) {
|
public UploadResult uploadSuffix(File file, String suffix) {
|
||||||
return upload(file.toPath(), getPath(properties.getPrefix(), suffix), null);
|
return upload(file.toPath(), getPath(properties.getPrefix(), suffix), null, FileUtils.getMimeType(suffix));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -48,7 +48,10 @@ public class OssFactory {
|
|||||||
}
|
}
|
||||||
OssProperties properties = JsonUtils.parseObject(json, OssProperties.class);
|
OssProperties properties = JsonUtils.parseObject(json, OssProperties.class);
|
||||||
// 使用租户标识避免多个租户相同key实例覆盖
|
// 使用租户标识避免多个租户相同key实例覆盖
|
||||||
String key = properties.getTenantId() + ":" + configKey;
|
String key = configKey;
|
||||||
|
if (StringUtils.isNotBlank(properties.getTenantId())) {
|
||||||
|
key = properties.getTenantId() + ":" + configKey;
|
||||||
|
}
|
||||||
OssClient client = CLIENT_CACHE.get(key);
|
OssClient client = CLIENT_CACHE.get(key);
|
||||||
// 客户端不存在或配置不相同则重新构建
|
// 客户端不存在或配置不相同则重新构建
|
||||||
if (client == null || !client.checkPropertiesSame(properties)) {
|
if (client == null || !client.checkPropertiesSame(properties)) {
|
||||||
|
@ -23,7 +23,7 @@ public class RedisExceptionHandler {
|
|||||||
@ExceptionHandler(LockFailureException.class)
|
@ExceptionHandler(LockFailureException.class)
|
||||||
public R<Void> handleLockFailureException(LockFailureException e, HttpServletRequest request) {
|
public R<Void> handleLockFailureException(LockFailureException e, HttpServletRequest request) {
|
||||||
String requestURI = request.getRequestURI();
|
String requestURI = request.getRequestURI();
|
||||||
log.error("获取锁失败了'{}',发生Lock4j异常." + requestURI, e.getMessage());
|
log.error("获取锁失败了'{}',发生Lock4j异常.", requestURI, e);
|
||||||
return R.fail(HttpStatus.HTTP_UNAVAILABLE, "业务处理中,请稍后再试...");
|
return R.fail(HttpStatus.HTTP_UNAVAILABLE, "业务处理中,请稍后再试...");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,7 +2,6 @@ package org.dromara.common.satoken.core.dao;
|
|||||||
|
|
||||||
import cn.dev33.satoken.dao.SaTokenDao;
|
import cn.dev33.satoken.dao.SaTokenDao;
|
||||||
import cn.dev33.satoken.util.SaFoxUtil;
|
import cn.dev33.satoken.util.SaFoxUtil;
|
||||||
import cn.hutool.core.lang.Console;
|
|
||||||
import com.github.benmanes.caffeine.cache.Cache;
|
import com.github.benmanes.caffeine.cache.Cache;
|
||||||
import com.github.benmanes.caffeine.cache.Caffeine;
|
import com.github.benmanes.caffeine.cache.Caffeine;
|
||||||
import org.dromara.common.redis.utils.RedisUtils;
|
import org.dromara.common.redis.utils.RedisUtils;
|
||||||
@ -54,7 +53,7 @@ public class PlusSaTokenDao implements SaTokenDao {
|
|||||||
} else {
|
} else {
|
||||||
RedisUtils.setCacheObject(key, value, Duration.ofSeconds(timeout));
|
RedisUtils.setCacheObject(key, value, Duration.ofSeconds(timeout));
|
||||||
}
|
}
|
||||||
CAFFEINE.put(key, value);
|
CAFFEINE.invalidate(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -64,7 +63,7 @@ public class PlusSaTokenDao implements SaTokenDao {
|
|||||||
public void update(String key, String value) {
|
public void update(String key, String value) {
|
||||||
if (RedisUtils.hasKey(key)) {
|
if (RedisUtils.hasKey(key)) {
|
||||||
RedisUtils.setCacheObject(key, value, true);
|
RedisUtils.setCacheObject(key, value, true);
|
||||||
CAFFEINE.put(key, value);
|
CAFFEINE.invalidate(key);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -117,7 +116,7 @@ public class PlusSaTokenDao implements SaTokenDao {
|
|||||||
} else {
|
} else {
|
||||||
RedisUtils.setCacheObject(key, object, Duration.ofSeconds(timeout));
|
RedisUtils.setCacheObject(key, object, Duration.ofSeconds(timeout));
|
||||||
}
|
}
|
||||||
CAFFEINE.put(key, object);
|
CAFFEINE.invalidate(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -127,7 +126,7 @@ public class PlusSaTokenDao implements SaTokenDao {
|
|||||||
public void updateObject(String key, Object object) {
|
public void updateObject(String key, Object object) {
|
||||||
if (RedisUtils.hasKey(key)) {
|
if (RedisUtils.hasKey(key)) {
|
||||||
RedisUtils.setCacheObject(key, object, true);
|
RedisUtils.setCacheObject(key, object, true);
|
||||||
CAFFEINE.put(key, object);
|
CAFFEINE.invalidate(key);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package org.dromara.common.sms.config;
|
package org.dromara.common.sms.config;
|
||||||
|
|
||||||
import org.dromara.common.sms.core.dao.PlusSmsDao;
|
import org.dromara.common.sms.core.dao.PlusSmsDao;
|
||||||
|
import org.dromara.common.sms.handler.SmsExceptionHandler;
|
||||||
import org.dromara.sms4j.api.dao.SmsDao;
|
import org.dromara.sms4j.api.dao.SmsDao;
|
||||||
import org.springframework.boot.autoconfigure.AutoConfiguration;
|
import org.springframework.boot.autoconfigure.AutoConfiguration;
|
||||||
import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
|
import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
|
||||||
@ -21,4 +22,12 @@ public class SmsAutoConfiguration {
|
|||||||
return new PlusSmsDao();
|
return new PlusSmsDao();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 异常处理器
|
||||||
|
*/
|
||||||
|
@Bean
|
||||||
|
public SmsExceptionHandler smsExceptionHandler() {
|
||||||
|
return new SmsExceptionHandler();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,30 @@
|
|||||||
|
package org.dromara.common.sms.handler;
|
||||||
|
|
||||||
|
import cn.hutool.http.HttpStatus;
|
||||||
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.dromara.common.core.domain.R;
|
||||||
|
import org.dromara.sms4j.comm.exception.SmsBlendException;
|
||||||
|
import org.springframework.web.bind.annotation.ExceptionHandler;
|
||||||
|
import org.springframework.web.bind.annotation.RestControllerAdvice;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SMS异常处理器
|
||||||
|
*
|
||||||
|
* @author AprilWind
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
@RestControllerAdvice
|
||||||
|
public class SmsExceptionHandler {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sms异常
|
||||||
|
*/
|
||||||
|
@ExceptionHandler(SmsBlendException.class)
|
||||||
|
public R<Void> handleSmsBlendException(SmsBlendException e, HttpServletRequest request) {
|
||||||
|
String requestURI = request.getRequestURI();
|
||||||
|
log.error("请求地址'{}',发生sms短信异常.", requestURI, e);
|
||||||
|
return R.fail(HttpStatus.HTTP_INTERNAL_ERROR, "短信发送失败,请稍后再试...");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -35,7 +35,7 @@ public class TenantConfig {
|
|||||||
|
|
||||||
@ConditionalOnBean(MybatisPlusConfig.class)
|
@ConditionalOnBean(MybatisPlusConfig.class)
|
||||||
@AutoConfiguration(after = {MybatisPlusConfig.class})
|
@AutoConfiguration(after = {MybatisPlusConfig.class})
|
||||||
static class MybatisPlusConfigation {
|
static class MybatisPlusConfiguration {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 多租户插件
|
* 多租户插件
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
package org.dromara.common.tenant.helper;
|
package org.dromara.common.tenant.helper;
|
||||||
|
|
||||||
import cn.dev33.satoken.context.SaHolder;
|
|
||||||
import cn.dev33.satoken.stp.StpUtil;
|
import cn.dev33.satoken.stp.StpUtil;
|
||||||
import cn.hutool.core.convert.Convert;
|
import cn.hutool.core.convert.Convert;
|
||||||
import com.alibaba.ttl.TransmittableThreadLocal;
|
import com.alibaba.ttl.TransmittableThreadLocal;
|
||||||
@ -79,22 +78,28 @@ public class TenantHelper {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void setDynamic(String tenantId) {
|
||||||
|
setDynamic(tenantId, false);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 设置动态租户(一直有效 需要手动清理)
|
* 设置动态租户(一直有效 需要手动清理)
|
||||||
* <p>
|
* <p>
|
||||||
* 如果为未登录状态下 那么只在当前线程内生效
|
* 如果为未登录状态下 那么只在当前线程内生效
|
||||||
|
*
|
||||||
|
* @param tenantId 租户id
|
||||||
|
* @param global 是否全局生效
|
||||||
*/
|
*/
|
||||||
public static void setDynamic(String tenantId) {
|
public static void setDynamic(String tenantId, boolean global) {
|
||||||
if (!isEnable()) {
|
if (!isEnable()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!isLogin()) {
|
if (!isLogin() || !global) {
|
||||||
TEMP_DYNAMIC_TENANT.set(tenantId);
|
TEMP_DYNAMIC_TENANT.set(tenantId);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
String cacheKey = DYNAMIC_TENANT_KEY + ":" + LoginHelper.getUserId();
|
String cacheKey = DYNAMIC_TENANT_KEY + ":" + LoginHelper.getUserId();
|
||||||
RedisUtils.setCacheObject(cacheKey, tenantId);
|
RedisUtils.setCacheObject(cacheKey, tenantId);
|
||||||
SaHolder.getStorage().set(cacheKey, tenantId);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -109,13 +114,13 @@ public class TenantHelper {
|
|||||||
if (!isLogin()) {
|
if (!isLogin()) {
|
||||||
return TEMP_DYNAMIC_TENANT.get();
|
return TEMP_DYNAMIC_TENANT.get();
|
||||||
}
|
}
|
||||||
String cacheKey = DYNAMIC_TENANT_KEY + ":" + LoginHelper.getUserId();
|
// 如果线程内有值 优先返回
|
||||||
String tenantId = (String) SaHolder.getStorage().get(cacheKey);
|
String tenantId = TEMP_DYNAMIC_TENANT.get();
|
||||||
if (StringUtils.isNotBlank(tenantId)) {
|
if (StringUtils.isNotBlank(tenantId)) {
|
||||||
return tenantId;
|
return tenantId;
|
||||||
}
|
}
|
||||||
|
String cacheKey = DYNAMIC_TENANT_KEY + ":" + LoginHelper.getUserId();
|
||||||
tenantId = RedisUtils.getCacheObject(cacheKey);
|
tenantId = RedisUtils.getCacheObject(cacheKey);
|
||||||
SaHolder.getStorage().set(cacheKey, tenantId);
|
|
||||||
return tenantId;
|
return tenantId;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -130,9 +135,9 @@ public class TenantHelper {
|
|||||||
TEMP_DYNAMIC_TENANT.remove();
|
TEMP_DYNAMIC_TENANT.remove();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
TEMP_DYNAMIC_TENANT.remove();
|
||||||
String cacheKey = DYNAMIC_TENANT_KEY + ":" + LoginHelper.getUserId();
|
String cacheKey = DYNAMIC_TENANT_KEY + ":" + LoginHelper.getUserId();
|
||||||
RedisUtils.deleteObject(cacheKey);
|
RedisUtils.deleteObject(cacheKey);
|
||||||
SaHolder.getStorage().delete(cacheKey);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -27,17 +27,20 @@ public class WebSocketConfig {
|
|||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
public WebSocketConfigurer webSocketConfigurer(HandshakeInterceptor handshakeInterceptor,
|
public WebSocketConfigurer webSocketConfigurer(HandshakeInterceptor handshakeInterceptor,
|
||||||
WebSocketHandler webSocketHandler,
|
WebSocketHandler webSocketHandler, WebSocketProperties webSocketProperties) {
|
||||||
WebSocketProperties webSocketProperties) {
|
// 如果WebSocket的路径为空,则设置默认路径为 "/websocket"
|
||||||
if (StrUtil.isBlank(webSocketProperties.getPath())) {
|
if (StrUtil.isBlank(webSocketProperties.getPath())) {
|
||||||
webSocketProperties.setPath("/websocket");
|
webSocketProperties.setPath("/websocket");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 如果允许跨域访问的地址为空,则设置为 "*",表示允许所有来源的跨域请求
|
||||||
if (StrUtil.isBlank(webSocketProperties.getAllowedOrigins())) {
|
if (StrUtil.isBlank(webSocketProperties.getAllowedOrigins())) {
|
||||||
webSocketProperties.setAllowedOrigins("*");
|
webSocketProperties.setAllowedOrigins("*");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 返回一个WebSocketConfigurer对象,用于配置WebSocket
|
||||||
return registry -> registry
|
return registry -> registry
|
||||||
|
// 添加WebSocket处理程序和拦截器到指定路径,设置允许的跨域来源
|
||||||
.addHandler(webSocketHandler, webSocketProperties.getPath())
|
.addHandler(webSocketHandler, webSocketProperties.getPath())
|
||||||
.addInterceptors(handshakeInterceptor)
|
.addInterceptors(handshakeInterceptor)
|
||||||
.setAllowedOrigins(webSocketProperties.getAllowedOrigins());
|
.setAllowedOrigins(webSocketProperties.getAllowedOrigins());
|
||||||
|
@ -6,6 +6,7 @@ package org.dromara.common.websocket.constant;
|
|||||||
* @author zendwang
|
* @author zendwang
|
||||||
*/
|
*/
|
||||||
public interface WebSocketConstants {
|
public interface WebSocketConstants {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* websocketSession中的参数的key
|
* websocketSession中的参数的key
|
||||||
*/
|
*/
|
||||||
|
@ -31,33 +31,42 @@ public class PlusWebSocketHandler extends AbstractWebSocketHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 处理发送来的文本消息
|
* 处理接收到的文本消息
|
||||||
*
|
*
|
||||||
* @param session
|
* @param session WebSocket会话
|
||||||
* @param message
|
* @param message 接收到的文本消息
|
||||||
* @throws Exception
|
* @throws Exception 处理消息过程中可能抛出的异常
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
|
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
|
||||||
|
// 从WebSocket会话中获取登录用户信息
|
||||||
LoginUser loginUser = (LoginUser) session.getAttributes().get(LOGIN_USER_KEY);
|
LoginUser loginUser = (LoginUser) session.getAttributes().get(LOGIN_USER_KEY);
|
||||||
List<Long> userIds = List.of(loginUser.getUserId());
|
|
||||||
|
// 创建WebSocket消息DTO对象
|
||||||
WebSocketMessageDto webSocketMessageDto = new WebSocketMessageDto();
|
WebSocketMessageDto webSocketMessageDto = new WebSocketMessageDto();
|
||||||
webSocketMessageDto.setSessionKeys(userIds);
|
webSocketMessageDto.setSessionKeys(List.of(loginUser.getUserId()));
|
||||||
webSocketMessageDto.setMessage(message.getPayload());
|
webSocketMessageDto.setMessage(message.getPayload());
|
||||||
WebSocketUtils.publishMessage(webSocketMessageDto);
|
WebSocketUtils.publishMessage(webSocketMessageDto);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 处理接收到的二进制消息
|
||||||
|
*
|
||||||
|
* @param session WebSocket会话
|
||||||
|
* @param message 接收到的二进制消息
|
||||||
|
* @throws Exception 处理消息过程中可能抛出的异常
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
protected void handleBinaryMessage(WebSocketSession session, BinaryMessage message) throws Exception {
|
protected void handleBinaryMessage(WebSocketSession session, BinaryMessage message) throws Exception {
|
||||||
super.handleBinaryMessage(session, message);
|
super.handleBinaryMessage(session, message);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 心跳监测的回复
|
* 处理接收到的Pong消息(心跳监测)
|
||||||
*
|
*
|
||||||
* @param session
|
* @param session WebSocket会话
|
||||||
* @param message
|
* @param message 接收到的Pong消息
|
||||||
* @throws Exception
|
* @throws Exception 处理消息过程中可能抛出的异常
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
protected void handlePongMessage(WebSocketSession session, PongMessage message) throws Exception {
|
protected void handlePongMessage(WebSocketSession session, PongMessage message) throws Exception {
|
||||||
@ -65,11 +74,11 @@ public class PlusWebSocketHandler extends AbstractWebSocketHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 连接出错时
|
* 处理WebSocket传输错误
|
||||||
*
|
*
|
||||||
* @param session
|
* @param session WebSocket会话
|
||||||
* @param exception
|
* @param exception 发生的异常
|
||||||
* @throws Exception
|
* @throws Exception 处理过程中可能抛出的异常
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
|
public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
|
||||||
@ -77,10 +86,10 @@ public class PlusWebSocketHandler extends AbstractWebSocketHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 连接关闭后
|
* 在WebSocket连接关闭后执行清理操作
|
||||||
*
|
*
|
||||||
* @param session
|
* @param session WebSocket会话
|
||||||
* @param status
|
* @param status 关闭状态信息
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) {
|
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) {
|
||||||
@ -90,9 +99,9 @@ public class PlusWebSocketHandler extends AbstractWebSocketHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 是否支持分片消息
|
* 指示处理程序是否支持接收部分消息
|
||||||
*
|
*
|
||||||
* @return
|
* @return 如果支持接收部分消息,则返回true;否则返回false
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public boolean supportsPartialMessages() {
|
public boolean supportsPartialMessages() {
|
||||||
|
@ -18,24 +18,52 @@ public class WebSocketSessionHolder {
|
|||||||
|
|
||||||
private static final Map<Long, WebSocketSession> USER_SESSION_MAP = new ConcurrentHashMap<>();
|
private static final Map<Long, WebSocketSession> USER_SESSION_MAP = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将WebSocket会话添加到用户会话Map中
|
||||||
|
*
|
||||||
|
* @param sessionKey 会话键,用于检索会话
|
||||||
|
* @param session 要添加的WebSocket会话
|
||||||
|
*/
|
||||||
public static void addSession(Long sessionKey, WebSocketSession session) {
|
public static void addSession(Long sessionKey, WebSocketSession session) {
|
||||||
USER_SESSION_MAP.put(sessionKey, session);
|
USER_SESSION_MAP.put(sessionKey, session);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 从用户会话Map中移除指定会话键对应的WebSocket会话
|
||||||
|
*
|
||||||
|
* @param sessionKey 要移除的会话键
|
||||||
|
*/
|
||||||
public static void removeSession(Long sessionKey) {
|
public static void removeSession(Long sessionKey) {
|
||||||
if (USER_SESSION_MAP.containsKey(sessionKey)) {
|
if (USER_SESSION_MAP.containsKey(sessionKey)) {
|
||||||
USER_SESSION_MAP.remove(sessionKey);
|
USER_SESSION_MAP.remove(sessionKey);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据会话键从用户会话Map中获取WebSocket会话
|
||||||
|
*
|
||||||
|
* @param sessionKey 要获取的会话键
|
||||||
|
* @return 与给定会话键对应的WebSocket会话,如果不存在则返回null
|
||||||
|
*/
|
||||||
public static WebSocketSession getSessions(Long sessionKey) {
|
public static WebSocketSession getSessions(Long sessionKey) {
|
||||||
return USER_SESSION_MAP.get(sessionKey);
|
return USER_SESSION_MAP.get(sessionKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取存储在用户会话Map中所有WebSocket会话的会话键集合
|
||||||
|
*
|
||||||
|
* @return 所有WebSocket会话的会话键集合
|
||||||
|
*/
|
||||||
public static Set<Long> getSessionsAll() {
|
public static Set<Long> getSessionsAll() {
|
||||||
return USER_SESSION_MAP.keySet();
|
return USER_SESSION_MAP.keySet();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查给定的会话键是否存在于用户会话Map中
|
||||||
|
*
|
||||||
|
* @param sessionKey 要检查的会话键
|
||||||
|
* @return 如果存在对应的会话键,则返回true;否则返回false
|
||||||
|
*/
|
||||||
public static Boolean existSession(Long sessionKey) {
|
public static Boolean existSession(Long sessionKey) {
|
||||||
return USER_SESSION_MAP.containsKey(sessionKey);
|
return USER_SESSION_MAP.containsKey(sessionKey);
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
package org.dromara.common.websocket.interceptor;
|
package org.dromara.common.websocket.interceptor;
|
||||||
|
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.dromara.common.core.domain.model.LoginUser;
|
import org.dromara.common.core.domain.model.LoginUser;
|
||||||
import org.dromara.common.satoken.utils.LoginHelper;
|
import org.dromara.common.satoken.utils.LoginHelper;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
|
||||||
import org.springframework.http.server.ServerHttpRequest;
|
import org.springframework.http.server.ServerHttpRequest;
|
||||||
import org.springframework.http.server.ServerHttpResponse;
|
import org.springframework.http.server.ServerHttpResponse;
|
||||||
import org.springframework.web.socket.WebSocketHandler;
|
import org.springframework.web.socket.WebSocketHandler;
|
||||||
@ -21,13 +21,13 @@ import static org.dromara.common.websocket.constant.WebSocketConstants.LOGIN_USE
|
|||||||
public class PlusWebSocketInterceptor implements HandshakeInterceptor {
|
public class PlusWebSocketInterceptor implements HandshakeInterceptor {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 握手前
|
* WebSocket握手之前执行的前置处理方法
|
||||||
*
|
*
|
||||||
* @param request request
|
* @param request WebSocket握手请求
|
||||||
* @param response response
|
* @param response WebSocket握手响应
|
||||||
* @param wsHandler wsHandler
|
* @param wsHandler WebSocket处理程序
|
||||||
* @param attributes attributes
|
* @param attributes 与WebSocket会话关联的属性
|
||||||
* @return 是否握手成功
|
* @return 如果允许握手继续进行,则返回true;否则返回false
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) {
|
public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) {
|
||||||
@ -37,15 +37,16 @@ public class PlusWebSocketInterceptor implements HandshakeInterceptor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 握手后
|
* WebSocket握手成功后执行的后置处理方法
|
||||||
*
|
*
|
||||||
* @param request request
|
* @param request WebSocket握手请求
|
||||||
* @param response response
|
* @param response WebSocket握手响应
|
||||||
* @param wsHandler wsHandler
|
* @param wsHandler WebSocket处理程序
|
||||||
* @param exception 异常
|
* @param exception 握手过程中可能出现的异常
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) {
|
public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) {
|
||||||
|
// 在这个方法中可以执行一些握手成功后的后续处理逻辑,比如记录日志或者其他操作
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
package org.dromara.common.websocket.listener;
|
package org.dromara.common.websocket.listener;
|
||||||
|
|
||||||
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.collection.CollUtil;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.dromara.common.websocket.holder.WebSocketSessionHolder;
|
import org.dromara.common.websocket.holder.WebSocketSessionHolder;
|
||||||
import org.dromara.common.websocket.utils.WebSocketUtils;
|
import org.dromara.common.websocket.utils.WebSocketUtils;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
|
||||||
import org.springframework.boot.ApplicationArguments;
|
import org.springframework.boot.ApplicationArguments;
|
||||||
import org.springframework.boot.ApplicationRunner;
|
import org.springframework.boot.ApplicationRunner;
|
||||||
import org.springframework.core.Ordered;
|
import org.springframework.core.Ordered;
|
||||||
@ -16,8 +16,15 @@ import org.springframework.core.Ordered;
|
|||||||
@Slf4j
|
@Slf4j
|
||||||
public class WebSocketTopicListener implements ApplicationRunner, Ordered {
|
public class WebSocketTopicListener implements ApplicationRunner, Ordered {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 在Spring Boot应用程序启动时初始化WebSocket主题订阅监听器
|
||||||
|
*
|
||||||
|
* @param args 应用程序参数
|
||||||
|
* @throws Exception 初始化过程中可能抛出的异常
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void run(ApplicationArguments args) throws Exception {
|
public void run(ApplicationArguments args) throws Exception {
|
||||||
|
// 订阅WebSocket消息
|
||||||
WebSocketUtils.subscribeMessage((message) -> {
|
WebSocketUtils.subscribeMessage((message) -> {
|
||||||
log.info("WebSocket主题订阅收到消息session keys={} message={}", message.getSessionKeys(), message.getMessage());
|
log.info("WebSocket主题订阅收到消息session keys={} message={}", message.getSessionKeys(), message.getMessage());
|
||||||
// 如果key不为空就按照key发消息 如果为空就群发
|
// 如果key不为空就按照key发消息 如果为空就群发
|
||||||
|
@ -29,10 +29,10 @@ import static org.dromara.common.websocket.constant.WebSocketConstants.WEB_SOCKE
|
|||||||
public class WebSocketUtils {
|
public class WebSocketUtils {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 发送消息
|
* 向指定的WebSocket会话发送消息
|
||||||
*
|
*
|
||||||
* @param sessionKey session主键 一般为用户id
|
* @param sessionKey 要发送消息的用户id
|
||||||
* @param message 消息文本
|
* @param message 要发送的消息内容
|
||||||
*/
|
*/
|
||||||
public static void sendMessage(Long sessionKey, String message) {
|
public static void sendMessage(Long sessionKey, String message) {
|
||||||
WebSocketSession session = WebSocketSessionHolder.getSessions(sessionKey);
|
WebSocketSession session = WebSocketSessionHolder.getSessions(sessionKey);
|
||||||
@ -40,18 +40,18 @@ public class WebSocketUtils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 订阅消息
|
* 订阅WebSocket消息主题,并提供一个消费者函数来处理接收到的消息
|
||||||
*
|
*
|
||||||
* @param consumer 自定义处理
|
* @param consumer 处理WebSocket消息的消费者函数
|
||||||
*/
|
*/
|
||||||
public static void subscribeMessage(Consumer<WebSocketMessageDto> consumer) {
|
public static void subscribeMessage(Consumer<WebSocketMessageDto> consumer) {
|
||||||
RedisUtils.subscribe(WEB_SOCKET_TOPIC, WebSocketMessageDto.class, consumer);
|
RedisUtils.subscribe(WEB_SOCKET_TOPIC, WebSocketMessageDto.class, consumer);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 发布订阅的消息
|
* 发布WebSocket订阅消息
|
||||||
*
|
*
|
||||||
* @param webSocketMessage 消息对象
|
* @param webSocketMessage 要发布的WebSocket消息对象
|
||||||
*/
|
*/
|
||||||
public static void publishMessage(WebSocketMessageDto webSocketMessage) {
|
public static void publishMessage(WebSocketMessageDto webSocketMessage) {
|
||||||
List<Long> unsentSessionKeys = new ArrayList<>();
|
List<Long> unsentSessionKeys = new ArrayList<>();
|
||||||
@ -76,9 +76,9 @@ public class WebSocketUtils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 发布订阅的消息(群发)
|
* 向所有的WebSocket会话发布订阅的消息(群发)
|
||||||
*
|
*
|
||||||
* @param message 消息内容
|
* @param message 要发布的消息内容
|
||||||
*/
|
*/
|
||||||
public static void publishAll(String message) {
|
public static void publishAll(String message) {
|
||||||
WebSocketMessageDto broadcastMessage = new WebSocketMessageDto();
|
WebSocketMessageDto broadcastMessage = new WebSocketMessageDto();
|
||||||
@ -88,14 +88,31 @@ public class WebSocketUtils {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 向指定的WebSocket会话发送Pong消息
|
||||||
|
*
|
||||||
|
* @param session 要发送Pong消息的WebSocket会话
|
||||||
|
*/
|
||||||
public static void sendPongMessage(WebSocketSession session) {
|
public static void sendPongMessage(WebSocketSession session) {
|
||||||
sendMessage(session, new PongMessage());
|
sendMessage(session, new PongMessage());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 向指定的WebSocket会话发送文本消息
|
||||||
|
*
|
||||||
|
* @param session WebSocket会话
|
||||||
|
* @param message 要发送的文本消息内容
|
||||||
|
*/
|
||||||
public static void sendMessage(WebSocketSession session, String message) {
|
public static void sendMessage(WebSocketSession session, String message) {
|
||||||
sendMessage(session, new TextMessage(message));
|
sendMessage(session, new TextMessage(message));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 向指定的WebSocket会话发送WebSocket消息对象
|
||||||
|
*
|
||||||
|
* @param session WebSocket会话
|
||||||
|
* @param message 要发送的WebSocket消息对象
|
||||||
|
*/
|
||||||
private static void sendMessage(WebSocketSession session, WebSocketMessage<?> message) {
|
private static void sendMessage(WebSocketSession session, WebSocketMessage<?> message) {
|
||||||
if (session == null || !session.isOpen()) {
|
if (session == null || !session.isOpen()) {
|
||||||
log.warn("[send] session会话已经关闭");
|
log.warn("[send] session会话已经关闭");
|
||||||
|
@ -3,10 +3,12 @@ package org.dromara.system.controller.system;
|
|||||||
import cn.dev33.satoken.secure.BCrypt;
|
import cn.dev33.satoken.secure.BCrypt;
|
||||||
import cn.hutool.core.bean.BeanUtil;
|
import cn.hutool.core.bean.BeanUtil;
|
||||||
import cn.hutool.core.io.FileUtil;
|
import cn.hutool.core.io.FileUtil;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.dromara.common.core.domain.R;
|
import org.dromara.common.core.domain.R;
|
||||||
import org.dromara.common.core.utils.StringUtils;
|
import org.dromara.common.core.utils.StringUtils;
|
||||||
import org.dromara.common.core.utils.file.MimeTypeUtils;
|
import org.dromara.common.core.utils.file.MimeTypeUtils;
|
||||||
import org.dromara.common.encrypt.annotation.ApiEncrypt;
|
import org.dromara.common.encrypt.annotation.ApiEncrypt;
|
||||||
|
import org.dromara.common.idempotent.annotation.RepeatSubmit;
|
||||||
import org.dromara.common.log.annotation.Log;
|
import org.dromara.common.log.annotation.Log;
|
||||||
import org.dromara.common.log.enums.BusinessType;
|
import org.dromara.common.log.enums.BusinessType;
|
||||||
import org.dromara.common.satoken.utils.LoginHelper;
|
import org.dromara.common.satoken.utils.LoginHelper;
|
||||||
@ -19,9 +21,7 @@ import org.dromara.system.domain.vo.ProfileVo;
|
|||||||
import org.dromara.system.domain.vo.SysOssVo;
|
import org.dromara.system.domain.vo.SysOssVo;
|
||||||
import org.dromara.system.domain.vo.SysUserVo;
|
import org.dromara.system.domain.vo.SysUserVo;
|
||||||
import org.dromara.system.service.ISysOssService;
|
import org.dromara.system.service.ISysOssService;
|
||||||
import org.dromara.system.service.ISysRoleService;
|
|
||||||
import org.dromara.system.service.ISysUserService;
|
import org.dromara.system.service.ISysUserService;
|
||||||
import lombok.RequiredArgsConstructor;
|
|
||||||
import org.springframework.http.MediaType;
|
import org.springframework.http.MediaType;
|
||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
@ -57,12 +57,14 @@ public class SysProfileController extends BaseController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 修改用户
|
* 修改用户信息
|
||||||
*/
|
*/
|
||||||
|
@RepeatSubmit
|
||||||
@Log(title = "个人信息", businessType = BusinessType.UPDATE)
|
@Log(title = "个人信息", businessType = BusinessType.UPDATE)
|
||||||
@PutMapping
|
@PutMapping
|
||||||
public R<Void> updateProfile(@RequestBody SysUserProfileBo profile) {
|
public R<Void> updateProfile(@Validated @RequestBody SysUserProfileBo profile) {
|
||||||
SysUserBo user = BeanUtil.toBean(profile, SysUserBo.class);
|
SysUserBo user = BeanUtil.toBean(profile, SysUserBo.class);
|
||||||
|
user.setUserId(LoginHelper.getUserId());
|
||||||
String username = LoginHelper.getUsername();
|
String username = LoginHelper.getUsername();
|
||||||
if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) {
|
if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) {
|
||||||
return R.fail("修改用户'" + username + "'失败,手机号码已存在");
|
return R.fail("修改用户'" + username + "'失败,手机号码已存在");
|
||||||
@ -70,7 +72,6 @@ public class SysProfileController extends BaseController {
|
|||||||
if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) {
|
if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) {
|
||||||
return R.fail("修改用户'" + username + "'失败,邮箱账号已存在");
|
return R.fail("修改用户'" + username + "'失败,邮箱账号已存在");
|
||||||
}
|
}
|
||||||
user.setUserId(LoginHelper.getUserId());
|
|
||||||
if (userService.updateUserProfile(user) > 0) {
|
if (userService.updateUserProfile(user) > 0) {
|
||||||
return R.ok();
|
return R.ok();
|
||||||
}
|
}
|
||||||
@ -82,6 +83,7 @@ public class SysProfileController extends BaseController {
|
|||||||
*
|
*
|
||||||
* @param bo 新旧密码
|
* @param bo 新旧密码
|
||||||
*/
|
*/
|
||||||
|
@RepeatSubmit
|
||||||
@ApiEncrypt
|
@ApiEncrypt
|
||||||
@Log(title = "个人信息", businessType = BusinessType.UPDATE)
|
@Log(title = "个人信息", businessType = BusinessType.UPDATE)
|
||||||
@PutMapping("/updatePwd")
|
@PutMapping("/updatePwd")
|
||||||
@ -106,6 +108,7 @@ public class SysProfileController extends BaseController {
|
|||||||
*
|
*
|
||||||
* @param avatarfile 用户头像
|
* @param avatarfile 用户头像
|
||||||
*/
|
*/
|
||||||
|
@RepeatSubmit
|
||||||
@Log(title = "用户头像", businessType = BusinessType.UPDATE)
|
@Log(title = "用户头像", businessType = BusinessType.UPDATE)
|
||||||
@PostMapping(value = "/avatar", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
|
@PostMapping(value = "/avatar", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
|
||||||
public R<AvatarVo> avatar(@RequestPart("avatarfile") MultipartFile avatarfile) {
|
public R<AvatarVo> avatar(@RequestPart("avatarfile") MultipartFile avatarfile) {
|
||||||
|
@ -144,7 +144,7 @@ public class SysTenantController extends BaseController {
|
|||||||
@SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
|
@SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
|
||||||
@GetMapping("/dynamic/{tenantId}")
|
@GetMapping("/dynamic/{tenantId}")
|
||||||
public R<Void> dynamicTenant(@NotBlank(message = "租户ID不能为空") @PathVariable String tenantId) {
|
public R<Void> dynamicTenant(@NotBlank(message = "租户ID不能为空") @PathVariable String tenantId) {
|
||||||
TenantHelper.setDynamic(tenantId);
|
TenantHelper.setDynamic(tenantId, true);
|
||||||
return R.ok();
|
return R.ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,14 +1,16 @@
|
|||||||
package org.dromara.system.domain.bo;
|
package org.dromara.system.domain.bo;
|
||||||
|
|
||||||
import org.dromara.common.core.xss.Xss;
|
|
||||||
import org.dromara.common.mybatis.core.domain.BaseEntity;
|
|
||||||
import org.dromara.common.sensitive.annotation.Sensitive;
|
|
||||||
import org.dromara.common.sensitive.core.SensitiveStrategy;
|
|
||||||
import jakarta.validation.constraints.Email;
|
import jakarta.validation.constraints.Email;
|
||||||
|
import jakarta.validation.constraints.Pattern;
|
||||||
import jakarta.validation.constraints.Size;
|
import jakarta.validation.constraints.Size;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
|
import org.dromara.common.core.constant.RegexConstants;
|
||||||
|
import org.dromara.common.core.xss.Xss;
|
||||||
|
import org.dromara.common.mybatis.core.domain.BaseEntity;
|
||||||
|
import org.dromara.common.sensitive.annotation.Sensitive;
|
||||||
|
import org.dromara.common.sensitive.core.SensitiveStrategy;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 个人信息业务处理
|
* 个人信息业务处理
|
||||||
@ -21,11 +23,6 @@ import lombok.NoArgsConstructor;
|
|||||||
@EqualsAndHashCode(callSuper = true)
|
@EqualsAndHashCode(callSuper = true)
|
||||||
public class SysUserProfileBo extends BaseEntity {
|
public class SysUserProfileBo extends BaseEntity {
|
||||||
|
|
||||||
/**
|
|
||||||
* 用户ID
|
|
||||||
*/
|
|
||||||
private Long userId;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 用户昵称
|
* 用户昵称
|
||||||
*/
|
*/
|
||||||
@ -44,6 +41,7 @@ public class SysUserProfileBo extends BaseEntity {
|
|||||||
/**
|
/**
|
||||||
* 手机号码
|
* 手机号码
|
||||||
*/
|
*/
|
||||||
|
@Pattern(regexp = RegexConstants.MOBILE, message = "手机号格式不正确")
|
||||||
@Sensitive(strategy = SensitiveStrategy.PHONE)
|
@Sensitive(strategy = SensitiveStrategy.PHONE)
|
||||||
private String phonenumber;
|
private String phonenumber;
|
||||||
|
|
||||||
|
@ -37,6 +37,7 @@ import org.dromara.system.domain.vo.SysUserExportVo;
|
|||||||
import org.dromara.system.domain.vo.SysUserVo;
|
import org.dromara.system.domain.vo.SysUserVo;
|
||||||
import org.dromara.system.mapper.*;
|
import org.dromara.system.mapper.*;
|
||||||
import org.dromara.system.service.ISysUserService;
|
import org.dromara.system.service.ISysUserService;
|
||||||
|
import org.springframework.cache.annotation.CacheEvict;
|
||||||
import org.springframework.cache.annotation.Cacheable;
|
import org.springframework.cache.annotation.Cacheable;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
@ -338,6 +339,7 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
|
|||||||
* @return 结果
|
* @return 结果
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
|
@CacheEvict(cacheNames = CacheNames.SYS_NICKNAME, key = "#user.userId")
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public int updateUser(SysUserBo user) {
|
public int updateUser(SysUserBo user) {
|
||||||
// 新增用户与角色管理
|
// 新增用户与角色管理
|
||||||
@ -386,6 +388,7 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
|
|||||||
* @param user 用户信息
|
* @param user 用户信息
|
||||||
* @return 结果
|
* @return 结果
|
||||||
*/
|
*/
|
||||||
|
@CacheEvict(cacheNames = CacheNames.SYS_NICKNAME, key = "#user.userId")
|
||||||
@Override
|
@Override
|
||||||
public int updateUserProfile(SysUserBo user) {
|
public int updateUserProfile(SysUserBo user) {
|
||||||
return baseMapper.update(null,
|
return baseMapper.update(null,
|
||||||
@ -636,7 +639,10 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
|
|||||||
if (CollUtil.isEmpty(userIds)) {
|
if (CollUtil.isEmpty(userIds)) {
|
||||||
return List.of();
|
return List.of();
|
||||||
}
|
}
|
||||||
List<SysUserVo> list = this.selectUserByIds(userIds, null);
|
List<SysUserVo> list = baseMapper.selectVoList(new LambdaQueryWrapper<SysUser>()
|
||||||
|
.select(SysUser::getUserId, SysUser::getUserName, SysUser::getNickName)
|
||||||
|
.eq(SysUser::getStatus, UserConstants.USER_NORMAL)
|
||||||
|
.in(CollUtil.isNotEmpty(userIds), SysUser::getUserId, userIds));
|
||||||
return BeanUtil.copyToList(list, UserDTO.class);
|
return BeanUtil.copyToList(list, UserDTO.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
3
ruoyi-modules/ruoyi-workflow/README.md
Normal file
3
ruoyi-modules/ruoyi-workflow/README.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# 工作流说明
|
||||||
|
|
||||||
|
工作流目前在未成熟阶段 后续仍会经历重构 甚至重写(生产使用前请慎重考虑后续是否要更新维护)
|
@ -109,7 +109,10 @@
|
|||||||
<groupId>org.dromara</groupId>
|
<groupId>org.dromara</groupId>
|
||||||
<artifactId>ruoyi-common-tenant</artifactId>
|
<artifactId>ruoyi-common-tenant</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.dromara</groupId>
|
||||||
|
<artifactId>ruoyi-common-security</artifactId>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
|
@ -1,27 +0,0 @@
|
|||||||
package org.dromara.workflow.annotation;
|
|
||||||
|
|
||||||
|
|
||||||
import java.lang.annotation.*;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 流程任务监听注解
|
|
||||||
*
|
|
||||||
* @author may
|
|
||||||
* @date 2023-12-27
|
|
||||||
*/
|
|
||||||
@Target({ElementType.TYPE})
|
|
||||||
@Retention(RetentionPolicy.RUNTIME)
|
|
||||||
@Documented
|
|
||||||
@Inherited
|
|
||||||
public @interface FlowListenerAnnotation {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 流程定义key
|
|
||||||
*/
|
|
||||||
String processDefinitionKey();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 节点id
|
|
||||||
*/
|
|
||||||
String taskDefId() default "";
|
|
||||||
}
|
|
@ -71,9 +71,9 @@ public interface FlowConstant {
|
|||||||
String ZIP = "ZIP";
|
String ZIP = "ZIP";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 流程实例对象
|
* 业务与流程实例关联对象
|
||||||
*/
|
*/
|
||||||
String PROCESS_INSTANCE_VO = "processInstanceVo";
|
String BUSINESS_INSTANCE_DTO = "businessInstanceDTO";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 流程定义配置
|
* 流程定义配置
|
||||||
|
@ -58,33 +58,33 @@ public class ActProcessInstanceController extends BaseController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 通过流程实例id获取历史流程图
|
* 通过业务id获取历史流程图
|
||||||
*
|
*
|
||||||
* @param processInstanceId 流程实例id
|
* @param businessKey 业务id
|
||||||
*/
|
*/
|
||||||
@GetMapping("/getHistoryImage/{processInstanceId}")
|
@GetMapping("/getHistoryImage/{businessKey}")
|
||||||
public R<String> getHistoryImage(@NotBlank(message = "流程实例id不能为空") @PathVariable String processInstanceId) {
|
public R<String> getHistoryImage(@NotBlank(message = "业务id不能为空") @PathVariable String businessKey) {
|
||||||
return R.ok("操作成功", actProcessInstanceService.getHistoryImage(processInstanceId));
|
return R.ok("操作成功", actProcessInstanceService.getHistoryImage(businessKey));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 通过流程实例id获取历史流程图运行中,历史等节点
|
* 通过业务id获取历史流程图运行中,历史等节点
|
||||||
*
|
*
|
||||||
* @param processInstanceId 流程实例id
|
* @param businessKey 业务id
|
||||||
*/
|
*/
|
||||||
@GetMapping("/getHistoryList/{processInstanceId}")
|
@GetMapping("/getHistoryList/{businessKey}")
|
||||||
public R<Map<String, Object>> getHistoryList(@NotBlank(message = "流程实例id不能为空") @PathVariable String processInstanceId) {
|
public R<Map<String, Object>> getHistoryList(@NotBlank(message = "业务id不能为空") @PathVariable String businessKey) {
|
||||||
return R.ok("操作成功", actProcessInstanceService.getHistoryList(processInstanceId));
|
return R.ok("操作成功", actProcessInstanceService.getHistoryList(businessKey));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取审批记录
|
* 获取审批记录
|
||||||
*
|
*
|
||||||
* @param processInstanceId 流程实例id
|
* @param businessKey 业务id
|
||||||
*/
|
*/
|
||||||
@GetMapping("/getHistoryRecord/{processInstanceId}")
|
@GetMapping("/getHistoryRecord/{businessKey}")
|
||||||
public R<List<ActHistoryInfoVo>> getHistoryRecord(@NotBlank(message = "流程实例id不能为空") @PathVariable String processInstanceId) {
|
public R<List<ActHistoryInfoVo>> getHistoryRecord(@NotBlank(message = "业务id不能为空") @PathVariable String businessKey) {
|
||||||
return R.ok(actProcessInstanceService.getHistoryRecord(processInstanceId));
|
return R.ok(actProcessInstanceService.getHistoryRecord(businessKey));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -102,37 +102,37 @@ public class ActProcessInstanceController extends BaseController {
|
|||||||
/**
|
/**
|
||||||
* 运行中的实例 删除程实例,删除历史记录,删除业务与流程关联信息
|
* 运行中的实例 删除程实例,删除历史记录,删除业务与流程关联信息
|
||||||
*
|
*
|
||||||
* @param processInstanceIds 流程实例id
|
* @param businessKeys 业务id
|
||||||
*/
|
*/
|
||||||
@Log(title = "流程实例管理", businessType = BusinessType.DELETE)
|
@Log(title = "流程实例管理", businessType = BusinessType.DELETE)
|
||||||
@RepeatSubmit()
|
@RepeatSubmit()
|
||||||
@DeleteMapping("/deleteRunAndHisInstance/{processInstanceIds}")
|
@DeleteMapping("/deleteRunAndHisInstance/{businessKeys}")
|
||||||
public R<Void> deleteRunAndHisInstance(@NotNull(message = "流程实例id不能为空") @PathVariable String[] processInstanceIds) {
|
public R<Void> deleteRunAndHisInstance(@NotNull(message = "业务id不能为空") @PathVariable String[] businessKeys) {
|
||||||
return toAjax(actProcessInstanceService.deleteRunAndHisInstance(Arrays.asList(processInstanceIds)));
|
return toAjax(actProcessInstanceService.deleteRunAndHisInstance(Arrays.asList(businessKeys)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 已完成的实例 删除程实例,删除历史记录,删除业务与流程关联信息
|
* 已完成的实例 删除程实例,删除历史记录,删除业务与流程关联信息
|
||||||
*
|
*
|
||||||
* @param processInstanceIds 流程实例id
|
* @param businessKeys 业务id
|
||||||
*/
|
*/
|
||||||
@Log(title = "流程实例管理", businessType = BusinessType.DELETE)
|
@Log(title = "流程实例管理", businessType = BusinessType.DELETE)
|
||||||
@RepeatSubmit()
|
@RepeatSubmit()
|
||||||
@DeleteMapping("/deleteFinishAndHisInstance/{processInstanceIds}")
|
@DeleteMapping("/deleteFinishAndHisInstance/{businessKeys}")
|
||||||
public R<Void> deleteFinishAndHisInstance(@NotNull(message = "流程实例id不能为空") @PathVariable String[] processInstanceIds) {
|
public R<Void> deleteFinishAndHisInstance(@NotNull(message = "业务id不能为空") @PathVariable String[] businessKeys) {
|
||||||
return toAjax(actProcessInstanceService.deleteFinishAndHisInstance(Arrays.asList(processInstanceIds)));
|
return toAjax(actProcessInstanceService.deleteFinishAndHisInstance(Arrays.asList(businessKeys)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 撤销流程申请
|
* 撤销流程申请
|
||||||
*
|
*
|
||||||
* @param processInstanceId 流程实例id
|
* @param businessKey 业务id
|
||||||
*/
|
*/
|
||||||
@Log(title = "流程实例管理", businessType = BusinessType.INSERT)
|
@Log(title = "流程实例管理", businessType = BusinessType.INSERT)
|
||||||
@RepeatSubmit()
|
@RepeatSubmit()
|
||||||
@PostMapping("/cancelProcessApply/{processInstanceId}")
|
@PostMapping("/cancelProcessApply/{businessKey}")
|
||||||
public R<Void> cancelProcessApply(@NotBlank(message = "流程实例id不能为空") @PathVariable String processInstanceId) {
|
public R<Void> cancelProcessApply(@NotBlank(message = "业务id不能为空") @PathVariable String businessKey) {
|
||||||
return toAjax(actProcessInstanceService.cancelProcessApply(processInstanceId));
|
return toAjax(actProcessInstanceService.cancelProcessApply(businessKey));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -225,7 +225,7 @@ public class ActTaskController extends BaseController {
|
|||||||
@RepeatSubmit()
|
@RepeatSubmit()
|
||||||
@PostMapping("/backProcess")
|
@PostMapping("/backProcess")
|
||||||
public R<String> backProcess(@Validated({AddGroup.class}) @RequestBody BackProcessBo backProcessBo) {
|
public R<String> backProcess(@Validated({AddGroup.class}) @RequestBody BackProcessBo backProcessBo) {
|
||||||
return R.ok(actTaskService.backProcess(backProcessBo));
|
return R.ok("操作成功", actTaskService.backProcess(backProcessBo));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -279,7 +279,7 @@ public class ActTaskController extends BaseController {
|
|||||||
*/
|
*/
|
||||||
@GetMapping("/getTaskUserIdsByAddMultiInstance/{taskId}")
|
@GetMapping("/getTaskUserIdsByAddMultiInstance/{taskId}")
|
||||||
public R<String> getTaskUserIdsByAddMultiInstance(@PathVariable String taskId) {
|
public R<String> getTaskUserIdsByAddMultiInstance(@PathVariable String taskId) {
|
||||||
return R.ok(actTaskService.getTaskUserIdsByAddMultiInstance(taskId));
|
return R.ok("操作成功", actTaskService.getTaskUserIdsByAddMultiInstance(taskId));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -32,7 +32,7 @@ import java.util.List;
|
|||||||
@Validated
|
@Validated
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
@RestController
|
@RestController
|
||||||
@RequestMapping("/demo/leave")
|
@RequestMapping("/workflow/leave")
|
||||||
public class TestLeaveController extends BaseController {
|
public class TestLeaveController extends BaseController {
|
||||||
|
|
||||||
private final ITestLeaveService testLeaveService;
|
private final ITestLeaveService testLeaveService;
|
||||||
@ -40,7 +40,7 @@ public class TestLeaveController extends BaseController {
|
|||||||
/**
|
/**
|
||||||
* 查询请假列表
|
* 查询请假列表
|
||||||
*/
|
*/
|
||||||
@SaCheckPermission("demo:leave:list")
|
@SaCheckPermission("workflow:leave:list")
|
||||||
@GetMapping("/list")
|
@GetMapping("/list")
|
||||||
public TableDataInfo<TestLeaveVo> list(TestLeaveBo bo, PageQuery pageQuery) {
|
public TableDataInfo<TestLeaveVo> list(TestLeaveBo bo, PageQuery pageQuery) {
|
||||||
return testLeaveService.queryPageList(bo, pageQuery);
|
return testLeaveService.queryPageList(bo, pageQuery);
|
||||||
@ -49,7 +49,7 @@ public class TestLeaveController extends BaseController {
|
|||||||
/**
|
/**
|
||||||
* 导出请假列表
|
* 导出请假列表
|
||||||
*/
|
*/
|
||||||
@SaCheckPermission("demo:leave:export")
|
@SaCheckPermission("workflow:leave:export")
|
||||||
@Log(title = "请假", businessType = BusinessType.EXPORT)
|
@Log(title = "请假", businessType = BusinessType.EXPORT)
|
||||||
@PostMapping("/export")
|
@PostMapping("/export")
|
||||||
public void export(TestLeaveBo bo, HttpServletResponse response) {
|
public void export(TestLeaveBo bo, HttpServletResponse response) {
|
||||||
@ -62,7 +62,7 @@ public class TestLeaveController extends BaseController {
|
|||||||
*
|
*
|
||||||
* @param id 主键
|
* @param id 主键
|
||||||
*/
|
*/
|
||||||
@SaCheckPermission("demo:leave:query")
|
@SaCheckPermission("workflow:leave:query")
|
||||||
@GetMapping("/{id}")
|
@GetMapping("/{id}")
|
||||||
public R<TestLeaveVo> getInfo(@NotNull(message = "主键不能为空")
|
public R<TestLeaveVo> getInfo(@NotNull(message = "主键不能为空")
|
||||||
@PathVariable Long id) {
|
@PathVariable Long id) {
|
||||||
@ -72,7 +72,7 @@ public class TestLeaveController extends BaseController {
|
|||||||
/**
|
/**
|
||||||
* 新增请假
|
* 新增请假
|
||||||
*/
|
*/
|
||||||
@SaCheckPermission("demo:leave:add")
|
@SaCheckPermission("workflow:leave:add")
|
||||||
@Log(title = "请假", businessType = BusinessType.INSERT)
|
@Log(title = "请假", businessType = BusinessType.INSERT)
|
||||||
@RepeatSubmit()
|
@RepeatSubmit()
|
||||||
@PostMapping()
|
@PostMapping()
|
||||||
@ -83,7 +83,7 @@ public class TestLeaveController extends BaseController {
|
|||||||
/**
|
/**
|
||||||
* 修改请假
|
* 修改请假
|
||||||
*/
|
*/
|
||||||
@SaCheckPermission("demo:leave:edit")
|
@SaCheckPermission("workflow:leave:edit")
|
||||||
@Log(title = "请假", businessType = BusinessType.UPDATE)
|
@Log(title = "请假", businessType = BusinessType.UPDATE)
|
||||||
@RepeatSubmit()
|
@RepeatSubmit()
|
||||||
@PutMapping()
|
@PutMapping()
|
||||||
@ -96,7 +96,7 @@ public class TestLeaveController extends BaseController {
|
|||||||
*
|
*
|
||||||
* @param ids 主键串
|
* @param ids 主键串
|
||||||
*/
|
*/
|
||||||
@SaCheckPermission("demo:leave:remove")
|
@SaCheckPermission("workflow:leave:remove")
|
||||||
@Log(title = "请假", businessType = BusinessType.DELETE)
|
@Log(title = "请假", businessType = BusinessType.DELETE)
|
||||||
@DeleteMapping("/{ids}")
|
@DeleteMapping("/{ids}")
|
||||||
public R<Void> remove(@NotEmpty(message = "主键不能为空")
|
public R<Void> remove(@NotEmpty(message = "主键不能为空")
|
||||||
|
@ -54,5 +54,10 @@ public class TestLeave extends BaseEntity {
|
|||||||
*/
|
*/
|
||||||
private String remark;
|
private String remark;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 状态
|
||||||
|
*/
|
||||||
|
private String status;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -19,10 +19,10 @@ public class ProcessInvalidBo implements Serializable {
|
|||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 流程实例id
|
* 业务id
|
||||||
*/
|
*/
|
||||||
@NotBlank(message = "流程实例id不能为空", groups = {AddGroup.class})
|
@NotBlank(message = "业务id不能为空", groups = {AddGroup.class})
|
||||||
private String processInstanceId;
|
private String businessKey;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 作废原因
|
* 作废原因
|
||||||
|
@ -71,5 +71,10 @@ public class TestLeaveBo extends BaseEntity {
|
|||||||
*/
|
*/
|
||||||
private String remark;
|
private String remark;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 状态
|
||||||
|
*/
|
||||||
|
private String status;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -36,6 +36,10 @@ public class ActHistoryInfoVo implements Serializable {
|
|||||||
* 流程实例id
|
* 流程实例id
|
||||||
*/
|
*/
|
||||||
private String processInstanceId;
|
private String processInstanceId;
|
||||||
|
/**
|
||||||
|
* 版本
|
||||||
|
*/
|
||||||
|
private Integer version;
|
||||||
/**
|
/**
|
||||||
* 开始时间
|
* 开始时间
|
||||||
*/
|
*/
|
||||||
|
@ -62,9 +62,9 @@ public class TestLeaveVo implements Serializable {
|
|||||||
private String remark;
|
private String remark;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 流程实例对象
|
* 状态
|
||||||
*/
|
*/
|
||||||
private ProcessInstanceVo processInstanceVo;
|
@ExcelProperty(value = "状态")
|
||||||
|
private String status;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,48 @@
|
|||||||
|
package org.dromara.workflow.flowable.handler;
|
||||||
|
|
||||||
|
import org.dromara.common.core.domain.event.ProcessEvent;
|
||||||
|
import org.dromara.common.core.domain.event.ProcessTaskEvent;
|
||||||
|
import org.dromara.common.core.utils.SpringUtils;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 流程监听服务
|
||||||
|
*
|
||||||
|
* @author may
|
||||||
|
* @date 2024-06-02
|
||||||
|
*/
|
||||||
|
@Component
|
||||||
|
public class FlowProcessEventHandler {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 总体流程监听(例如: 提交 退回 撤销 终止 作废等)
|
||||||
|
*
|
||||||
|
* @param key 流程key
|
||||||
|
* @param businessKey 业务id
|
||||||
|
* @param status 状态
|
||||||
|
* @param submit 当为true时为申请人节点办理
|
||||||
|
*/
|
||||||
|
public void processHandler(String key, String businessKey, String status, boolean submit) {
|
||||||
|
ProcessEvent processEvent = new ProcessEvent();
|
||||||
|
processEvent.setKey(key);
|
||||||
|
processEvent.setBusinessKey(businessKey);
|
||||||
|
processEvent.setStatus(status);
|
||||||
|
processEvent.setSubmit(submit);
|
||||||
|
SpringUtils.context().publishEvent(processEvent);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 执行办理任务监听
|
||||||
|
*
|
||||||
|
* @param keyNode 流程定义key与流程节点标识(拼接方式:流程定义key_流程节点)
|
||||||
|
* @param taskId 任务id
|
||||||
|
* @param businessKey 业务id
|
||||||
|
*/
|
||||||
|
public void processTaskHandler(String keyNode, String taskId, String businessKey) {
|
||||||
|
ProcessTaskEvent processTaskEvent = new ProcessTaskEvent();
|
||||||
|
processTaskEvent.setKeyNode(keyNode);
|
||||||
|
processTaskEvent.setTaskId(taskId);
|
||||||
|
processTaskEvent.setBusinessKey(businessKey);
|
||||||
|
SpringUtils.context().publishEvent(processTaskEvent);
|
||||||
|
}
|
||||||
|
}
|
@ -8,7 +8,6 @@ import org.flowable.engine.impl.util.CommandContextUtil;
|
|||||||
import org.flowable.job.service.JobHandler;
|
import org.flowable.job.service.JobHandler;
|
||||||
import org.flowable.job.service.impl.persistence.entity.JobEntity;
|
import org.flowable.job.service.impl.persistence.entity.JobEntity;
|
||||||
import org.flowable.task.api.Task;
|
import org.flowable.task.api.Task;
|
||||||
import org.flowable.task.api.TaskQuery;
|
|
||||||
import org.flowable.variable.api.delegate.VariableScope;
|
import org.flowable.variable.api.delegate.VariableScope;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1,73 +0,0 @@
|
|||||||
package org.dromara.workflow.flowable.strategy;
|
|
||||||
|
|
||||||
import org.dromara.common.core.utils.StringUtils;
|
|
||||||
import org.dromara.workflow.annotation.FlowListenerAnnotation;
|
|
||||||
import org.springframework.beans.BeansException;
|
|
||||||
import org.springframework.beans.factory.config.BeanPostProcessor;
|
|
||||||
import org.springframework.stereotype.Component;
|
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 流程任务监听策略
|
|
||||||
*
|
|
||||||
* @author may
|
|
||||||
* @date 2023-12-27
|
|
||||||
*/
|
|
||||||
@Component
|
|
||||||
public class FlowEventStrategy implements BeanPostProcessor {
|
|
||||||
|
|
||||||
private final Map<String, FlowTaskEventHandler> flowTaskEventHandlers = new HashMap<>();
|
|
||||||
private final Map<String, FlowProcessEventHandler> flowProcessEventHandlers = new HashMap<>();
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
|
|
||||||
if (bean instanceof FlowTaskEventHandler) {
|
|
||||||
FlowListenerAnnotation annotation = bean.getClass().getAnnotation(FlowListenerAnnotation.class);
|
|
||||||
if (null != annotation) {
|
|
||||||
if (StringUtils.isNotBlank(annotation.processDefinitionKey()) && StringUtils.isNotBlank(annotation.taskDefId())) {
|
|
||||||
String id = annotation.processDefinitionKey() + "_" + annotation.taskDefId();
|
|
||||||
if (!flowTaskEventHandlers.containsKey(id)) {
|
|
||||||
flowTaskEventHandlers.put(id, (FlowTaskEventHandler) bean);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (bean instanceof FlowProcessEventHandler) {
|
|
||||||
FlowListenerAnnotation annotation = bean.getClass().getAnnotation(FlowListenerAnnotation.class);
|
|
||||||
if (null != annotation) {
|
|
||||||
if (StringUtils.isNotBlank(annotation.processDefinitionKey()) && StringUtils.isBlank(annotation.taskDefId())) {
|
|
||||||
if (!flowProcessEventHandlers.containsKey(annotation.processDefinitionKey())) {
|
|
||||||
flowProcessEventHandlers.put(annotation.processDefinitionKey(), (FlowProcessEventHandler) bean);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return BeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取可执行bean
|
|
||||||
*
|
|
||||||
* @param key key
|
|
||||||
*/
|
|
||||||
public FlowTaskEventHandler getTaskHandler(String key) {
|
|
||||||
if (!flowTaskEventHandlers.containsKey(key)) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return flowTaskEventHandlers.get(key);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取可执行bean
|
|
||||||
*
|
|
||||||
* @param key key
|
|
||||||
*/
|
|
||||||
public FlowProcessEventHandler getProcessHandler(String key) {
|
|
||||||
if (!flowProcessEventHandlers.containsKey(key)) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return flowProcessEventHandlers.get(key);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,20 +0,0 @@
|
|||||||
package org.dromara.workflow.flowable.strategy;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 流程监听
|
|
||||||
*
|
|
||||||
* @author may
|
|
||||||
* @date 2023-12-27
|
|
||||||
*/
|
|
||||||
public interface FlowProcessEventHandler {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 执行办理任务监听
|
|
||||||
*
|
|
||||||
* @param businessKey 业务id
|
|
||||||
* @param status 状态
|
|
||||||
* @param submit 当为true时为申请人节点办理
|
|
||||||
*/
|
|
||||||
void handleProcess(String businessKey, String status, boolean submit);
|
|
||||||
}
|
|
@ -1,19 +0,0 @@
|
|||||||
package org.dromara.workflow.flowable.strategy;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 流程任务监听
|
|
||||||
*
|
|
||||||
* @author may
|
|
||||||
* @date 2023-12-27
|
|
||||||
*/
|
|
||||||
public interface FlowTaskEventHandler {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 执行办理任务监听
|
|
||||||
*
|
|
||||||
* @param taskId 任务ID
|
|
||||||
* @param businessKey 业务id
|
|
||||||
*/
|
|
||||||
void handleTask(String taskId, String businessKey);
|
|
||||||
}
|
|
@ -1,31 +0,0 @@
|
|||||||
package org.dromara.workflow.listener;
|
|
||||||
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
|
||||||
import org.dromara.workflow.annotation.FlowListenerAnnotation;
|
|
||||||
import org.dromara.workflow.flowable.strategy.FlowProcessEventHandler;
|
|
||||||
import org.springframework.stereotype.Component;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 自定义监听测试
|
|
||||||
*
|
|
||||||
* @author may
|
|
||||||
* @date 2023-12-27
|
|
||||||
*/
|
|
||||||
@Slf4j
|
|
||||||
@Component
|
|
||||||
@FlowListenerAnnotation(processDefinitionKey = "leave1")
|
|
||||||
public class TestCustomProcessHandler implements FlowProcessEventHandler {
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 执行办理任务监听
|
|
||||||
*
|
|
||||||
* @param businessKey 业务id
|
|
||||||
* @param status 状态
|
|
||||||
* @param submit 当为true时为申请人节点办理
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void handleProcess(String businessKey, String status, boolean submit) {
|
|
||||||
log.info("业务ID:" + businessKey + ",状态:" + status);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,23 +0,0 @@
|
|||||||
package org.dromara.workflow.listener;
|
|
||||||
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
|
||||||
import org.dromara.workflow.annotation.FlowListenerAnnotation;
|
|
||||||
import org.dromara.workflow.flowable.strategy.FlowTaskEventHandler;
|
|
||||||
import org.springframework.stereotype.Component;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 自定义监听测试
|
|
||||||
*
|
|
||||||
* @author may
|
|
||||||
* @date 2023-12-27
|
|
||||||
*/
|
|
||||||
@Slf4j
|
|
||||||
@Component
|
|
||||||
@FlowListenerAnnotation(processDefinitionKey = "leave1", taskDefId = "Activity_14633hx")
|
|
||||||
public class TestCustomTaskHandler implements FlowTaskEventHandler {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void handleTask(String taskId, String businessKey) {
|
|
||||||
log.info("任务ID:" + taskId + ",业务ID:" + businessKey);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,28 +0,0 @@
|
|||||||
package org.dromara.workflow.listener;
|
|
||||||
|
|
||||||
import lombok.RequiredArgsConstructor;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
|
||||||
import org.dromara.workflow.utils.QueryUtils;
|
|
||||||
import org.flowable.engine.TaskService;
|
|
||||||
import org.flowable.engine.delegate.DelegateExecution;
|
|
||||||
import org.flowable.engine.delegate.ExecutionListener;
|
|
||||||
import org.flowable.task.api.Task;
|
|
||||||
import org.springframework.stereotype.Component;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 流程实例监听测试
|
|
||||||
*
|
|
||||||
* @author may
|
|
||||||
* @date 2023-12-12
|
|
||||||
*/
|
|
||||||
@Slf4j
|
|
||||||
@RequiredArgsConstructor
|
|
||||||
@Component("testLeaveExecutionListener")
|
|
||||||
public class TestLeaveExecutionListener implements ExecutionListener {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void notify(DelegateExecution execution) {
|
|
||||||
Task task = QueryUtils.taskQuery().executionId(execution.getId()).singleResult();
|
|
||||||
log.info("执行监听【" + task.getName() + "】");
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,21 +0,0 @@
|
|||||||
package org.dromara.workflow.listener;
|
|
||||||
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
|
||||||
import org.flowable.task.service.delegate.DelegateTask;
|
|
||||||
import org.flowable.task.service.delegate.TaskListener;
|
|
||||||
import org.springframework.stereotype.Component;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 流程任务监听测试
|
|
||||||
*
|
|
||||||
* @author may
|
|
||||||
* @date 2023-12-12
|
|
||||||
*/
|
|
||||||
@Slf4j
|
|
||||||
@Component("testLeaveTaskListener")
|
|
||||||
public class TestLeaveTaskListener implements TaskListener {
|
|
||||||
@Override
|
|
||||||
public void notify(DelegateTask delegateTask) {
|
|
||||||
log.info("执行监听【" + delegateTask.getName() + "】");
|
|
||||||
}
|
|
||||||
}
|
|
@ -20,18 +20,18 @@ public interface IActProcessInstanceService {
|
|||||||
/**
|
/**
|
||||||
* 通过流程实例id获取历史流程图
|
* 通过流程实例id获取历史流程图
|
||||||
*
|
*
|
||||||
* @param processInstanceId 流程实例id
|
* @param businessKey 流程实例id
|
||||||
* @return 结果
|
* @return 结果
|
||||||
*/
|
*/
|
||||||
String getHistoryImage(String processInstanceId);
|
String getHistoryImage(String businessKey);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 通过流程实例id获取历史流程图运行中,历史等节点
|
* 通过业务id获取历史流程图运行中,历史等节点
|
||||||
*
|
*
|
||||||
* @param processInstanceId 流程实例id
|
* @param businessKey 业务id
|
||||||
* @return 结果
|
* @return 结果
|
||||||
*/
|
*/
|
||||||
Map<String, Object> getHistoryList(String processInstanceId);
|
Map<String, Object> getHistoryList(String businessKey);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 分页查询正在运行的流程实例
|
* 分页查询正在运行的流程实例
|
||||||
@ -54,10 +54,10 @@ public interface IActProcessInstanceService {
|
|||||||
/**
|
/**
|
||||||
* 获取审批记录
|
* 获取审批记录
|
||||||
*
|
*
|
||||||
* @param processInstanceId 流程实例id
|
* @param businessKey 业务id
|
||||||
* @return 结果
|
* @return 结果
|
||||||
*/
|
*/
|
||||||
List<ActHistoryInfoVo> getHistoryRecord(String processInstanceId);
|
List<ActHistoryInfoVo> getHistoryRecord(String businessKey);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 作废流程实例,不会删除历史记录(删除运行中的实例)
|
* 作废流程实例,不会删除历史记录(删除运行中的实例)
|
||||||
@ -70,34 +70,26 @@ public interface IActProcessInstanceService {
|
|||||||
/**
|
/**
|
||||||
* 运行中的实例 删除程实例,删除历史记录,删除业务与流程关联信息
|
* 运行中的实例 删除程实例,删除历史记录,删除业务与流程关联信息
|
||||||
*
|
*
|
||||||
* @param processInstanceIds 流程实例id
|
|
||||||
* @return 结果
|
|
||||||
*/
|
|
||||||
boolean deleteRunAndHisInstance(List<String> processInstanceIds);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 按照业务id删除 运行中的实例 删除程实例,删除历史记录,删除业务与流程关联信息
|
|
||||||
*
|
|
||||||
* @param businessKeys 业务id
|
* @param businessKeys 业务id
|
||||||
* @return 结果
|
* @return 结果
|
||||||
*/
|
*/
|
||||||
boolean deleteRunAndHisInstanceByBusinessKeys(List<String> businessKeys);
|
boolean deleteRunAndHisInstance(List<String> businessKeys);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 已完成的实例 删除程实例,删除历史记录,删除业务与流程关联信息
|
* 已完成的实例 删除程实例,删除历史记录,删除业务与流程关联信息
|
||||||
*
|
*
|
||||||
* @param processInstanceIds 流程实例id
|
* @param businessKeys 业务id
|
||||||
* @return 结果
|
* @return 结果
|
||||||
*/
|
*/
|
||||||
boolean deleteFinishAndHisInstance(List<String> processInstanceIds);
|
boolean deleteFinishAndHisInstance(List<String> businessKeys);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 撤销流程申请
|
* 撤销流程申请
|
||||||
*
|
*
|
||||||
* @param processInstanceId 流程实例id
|
* @param businessKey 业务id
|
||||||
* @return 结果
|
* @return 结果
|
||||||
*/
|
*/
|
||||||
boolean cancelProcessApply(String processInstanceId);
|
boolean cancelProcessApply(String businessKey);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 分页查询当前登录人单据
|
* 分页查询当前登录人单据
|
||||||
|
@ -16,7 +16,7 @@ import org.dromara.common.mybatis.core.page.PageQuery;
|
|||||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||||
import org.dromara.common.satoken.utils.LoginHelper;
|
import org.dromara.common.satoken.utils.LoginHelper;
|
||||||
import org.dromara.workflow.common.constant.FlowConstant;
|
import org.dromara.workflow.common.constant.FlowConstant;
|
||||||
import org.dromara.workflow.common.enums.BusinessStatusEnum;
|
import org.dromara.common.core.enums.BusinessStatusEnum;
|
||||||
import org.dromara.workflow.common.enums.TaskStatusEnum;
|
import org.dromara.workflow.common.enums.TaskStatusEnum;
|
||||||
import org.dromara.workflow.domain.ActHiProcinst;
|
import org.dromara.workflow.domain.ActHiProcinst;
|
||||||
import org.dromara.workflow.domain.bo.ProcessInstanceBo;
|
import org.dromara.workflow.domain.bo.ProcessInstanceBo;
|
||||||
@ -26,8 +26,7 @@ import org.dromara.workflow.domain.vo.*;
|
|||||||
import org.dromara.workflow.flowable.CustomDefaultProcessDiagramGenerator;
|
import org.dromara.workflow.flowable.CustomDefaultProcessDiagramGenerator;
|
||||||
import org.dromara.workflow.flowable.cmd.DeleteExecutionCmd;
|
import org.dromara.workflow.flowable.cmd.DeleteExecutionCmd;
|
||||||
import org.dromara.workflow.flowable.cmd.ExecutionChildByExecutionIdCmd;
|
import org.dromara.workflow.flowable.cmd.ExecutionChildByExecutionIdCmd;
|
||||||
import org.dromara.workflow.flowable.strategy.FlowEventStrategy;
|
import org.dromara.workflow.flowable.handler.FlowProcessEventHandler;
|
||||||
import org.dromara.workflow.flowable.strategy.FlowProcessEventHandler;
|
|
||||||
import org.dromara.workflow.service.IActHiProcinstService;
|
import org.dromara.workflow.service.IActHiProcinstService;
|
||||||
import org.dromara.workflow.service.IActProcessInstanceService;
|
import org.dromara.workflow.service.IActProcessInstanceService;
|
||||||
import org.dromara.workflow.service.IWfNodeConfigService;
|
import org.dromara.workflow.service.IWfNodeConfigService;
|
||||||
@ -75,9 +74,9 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService
|
|||||||
private final TaskService taskService;
|
private final TaskService taskService;
|
||||||
private final IActHiProcinstService actHiProcinstService;
|
private final IActHiProcinstService actHiProcinstService;
|
||||||
private final ManagementService managementService;
|
private final ManagementService managementService;
|
||||||
private final FlowEventStrategy flowEventStrategy;
|
|
||||||
private final IWfTaskBackNodeService wfTaskBackNodeService;
|
private final IWfTaskBackNodeService wfTaskBackNodeService;
|
||||||
private final IWfNodeConfigService wfNodeConfigService;
|
private final IWfNodeConfigService wfNodeConfigService;
|
||||||
|
private final FlowProcessEventHandler flowProcessEventHandler;
|
||||||
|
|
||||||
@Value("${flowable.activity-font-name}")
|
@Value("${flowable.activity-font-name}")
|
||||||
private String activityFontName;
|
private String activityFontName;
|
||||||
@ -184,28 +183,28 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 通过流程实例id获取历史流程图
|
* 通过业务id获取历史流程图
|
||||||
*
|
*
|
||||||
* @param processInstanceId 流程实例id
|
* @param businessKey 业务id
|
||||||
*/
|
*/
|
||||||
@SneakyThrows
|
@SneakyThrows
|
||||||
@Override
|
@Override
|
||||||
public String getHistoryImage(String processInstanceId) {
|
public String getHistoryImage(String businessKey) {
|
||||||
String processDefinitionId;
|
String processDefinitionId;
|
||||||
// 获取当前的流程实例
|
// 获取当前的流程实例
|
||||||
ProcessInstance processInstance = QueryUtils.instanceQuery(processInstanceId).singleResult();
|
ProcessInstance processInstance = QueryUtils.businessKeyQuery(businessKey).singleResult();
|
||||||
// 如果流程已经结束,则得到结束节点
|
// 如果流程已经结束,则得到结束节点
|
||||||
if (Objects.isNull(processInstance)) {
|
if (Objects.isNull(processInstance)) {
|
||||||
HistoricProcessInstance pi = QueryUtils.hisInstanceQuery(processInstanceId).singleResult();
|
HistoricProcessInstance pi = QueryUtils.hisInstanceQuery().processInstanceBusinessKey(businessKey).singleResult();
|
||||||
processDefinitionId = pi.getProcessDefinitionId();
|
processDefinitionId = pi.getProcessDefinitionId();
|
||||||
} else {
|
} else {
|
||||||
// 根据流程实例ID获得当前处于活动状态的ActivityId合集
|
// 根据流程实例ID获得当前处于活动状态的ActivityId合集
|
||||||
ProcessInstance pi = QueryUtils.instanceQuery(processInstanceId).singleResult();
|
ProcessInstance pi = QueryUtils.instanceQuery(processInstance.getProcessInstanceId()).singleResult();
|
||||||
processDefinitionId = pi.getProcessDefinitionId();
|
processDefinitionId = pi.getProcessDefinitionId();
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获得活动的节点
|
// 获得活动的节点
|
||||||
List<HistoricActivityInstance> highLightedFlowList = QueryUtils.hisActivityInstanceQuery(processInstanceId).orderByHistoricActivityInstanceStartTime().asc().list();
|
List<HistoricActivityInstance> highLightedFlowList = QueryUtils.hisActivityInstanceQuery(processInstance.getProcessInstanceId()).orderByHistoricActivityInstanceStartTime().asc().list();
|
||||||
|
|
||||||
List<String> highLightedFlows = new ArrayList<>();
|
List<String> highLightedFlows = new ArrayList<>();
|
||||||
List<String> highLightedNodes = new ArrayList<>();
|
List<String> highLightedNodes = new ArrayList<>();
|
||||||
@ -240,15 +239,16 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 通过流程实例id获取历史流程图运行中,历史等节点
|
* 通过业务id获取历史流程图运行中,历史等节点
|
||||||
*
|
*
|
||||||
* @param processInstanceId 流程实例id
|
* @param businessKey 业务id
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public Map<String, Object> getHistoryList(String processInstanceId) {
|
public Map<String, Object> getHistoryList(String businessKey) {
|
||||||
Map<String, Object> map = new HashMap<>();
|
Map<String, Object> map = new HashMap<>();
|
||||||
List<Map<String, Object>> taskList = new ArrayList<>();
|
List<Map<String, Object>> taskList = new ArrayList<>();
|
||||||
HistoricProcessInstance historicProcessInstance = QueryUtils.hisInstanceQuery(processInstanceId).singleResult();
|
HistoricProcessInstance historicProcessInstance = QueryUtils.hisBusinessKeyQuery(businessKey).singleResult();
|
||||||
|
String processInstanceId = historicProcessInstance.getId();
|
||||||
StringBuilder xml = new StringBuilder();
|
StringBuilder xml = new StringBuilder();
|
||||||
ProcessDefinition processDefinition = repositoryService.getProcessDefinition(historicProcessInstance.getProcessDefinitionId());
|
ProcessDefinition processDefinition = repositoryService.getProcessDefinition(historicProcessInstance.getProcessDefinitionId());
|
||||||
// 获取节点
|
// 获取节点
|
||||||
@ -280,7 +280,7 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
map.put("taskList", taskList);
|
map.put("taskList", taskList);
|
||||||
List<ActHistoryInfoVo> historyTaskList = getHistoryTaskList(processInstanceId);
|
List<ActHistoryInfoVo> historyTaskList = getHistoryTaskList(processInstanceId, processDefinition.getVersion());
|
||||||
map.put("historyList", historyTaskList);
|
map.put("historyList", historyTaskList);
|
||||||
InputStream inputStream = repositoryService.getResourceAsStream(processDefinition.getDeploymentId(), processDefinition.getResourceName());
|
InputStream inputStream = repositoryService.getResourceAsStream(processDefinition.getDeploymentId(), processDefinition.getResourceName());
|
||||||
xml.append(IoUtil.read(inputStream, StandardCharsets.UTF_8));
|
xml.append(IoUtil.read(inputStream, StandardCharsets.UTF_8));
|
||||||
@ -292,8 +292,9 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService
|
|||||||
* 获取历史任务节点信息
|
* 获取历史任务节点信息
|
||||||
*
|
*
|
||||||
* @param processInstanceId 流程实例id
|
* @param processInstanceId 流程实例id
|
||||||
|
* @param version 版本
|
||||||
*/
|
*/
|
||||||
private List<ActHistoryInfoVo> getHistoryTaskList(String processInstanceId) {
|
private List<ActHistoryInfoVo> getHistoryTaskList(String processInstanceId, Integer version) {
|
||||||
//查询任务办理记录
|
//查询任务办理记录
|
||||||
List<HistoricTaskInstance> list = QueryUtils.hisTaskInstanceQuery(processInstanceId).orderByHistoricTaskInstanceEndTime().desc().list();
|
List<HistoricTaskInstance> list = QueryUtils.hisTaskInstanceQuery(processInstanceId).orderByHistoricTaskInstanceEndTime().desc().list();
|
||||||
list = StreamUtils.sorted(list, Comparator.comparing(HistoricTaskInstance::getEndTime, Comparator.nullsFirst(Date::compareTo)).reversed());
|
list = StreamUtils.sorted(list, Comparator.comparing(HistoricTaskInstance::getEndTime, Comparator.nullsFirst(Date::compareTo)).reversed());
|
||||||
@ -305,19 +306,37 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService
|
|||||||
if (ObjectUtil.isNotEmpty(historicTaskInstance.getDurationInMillis())) {
|
if (ObjectUtil.isNotEmpty(historicTaskInstance.getDurationInMillis())) {
|
||||||
actHistoryInfoVo.setRunDuration(getDuration(historicTaskInstance.getDurationInMillis()));
|
actHistoryInfoVo.setRunDuration(getDuration(historicTaskInstance.getDurationInMillis()));
|
||||||
}
|
}
|
||||||
|
actHistoryInfoVo.setVersion(version);
|
||||||
actHistoryInfoVoList.add(actHistoryInfoVo);
|
actHistoryInfoVoList.add(actHistoryInfoVo);
|
||||||
}
|
}
|
||||||
List<ActHistoryInfoVo> historyInfoVoList = new ArrayList<>();
|
List<ActHistoryInfoVo> historyInfoVoList = new ArrayList<>();
|
||||||
Map<String, List<ActHistoryInfoVo>> groupByKey = StreamUtils.groupByKey(actHistoryInfoVoList, ActHistoryInfoVo::getTaskDefinitionKey);
|
Map<String, List<ActHistoryInfoVo>> groupByKey = StreamUtils.groupByKey(actHistoryInfoVoList, ActHistoryInfoVo::getTaskDefinitionKey);
|
||||||
for (Map.Entry<String, List<ActHistoryInfoVo>> entry : groupByKey.entrySet()) {
|
for (Map.Entry<String, List<ActHistoryInfoVo>> entry : groupByKey.entrySet()) {
|
||||||
ActHistoryInfoVo historyInfoVo = new ActHistoryInfoVo();
|
ActHistoryInfoVo historyInfoVo = new ActHistoryInfoVo();
|
||||||
BeanUtils.copyProperties(entry.getValue().get(0), historyInfoVo);
|
if (entry.getValue().size() > 1) {
|
||||||
actHistoryInfoVoList.stream().filter(e -> e.getTaskDefinitionKey().equals(entry.getKey()) && e.getEndTime() == null).findFirst()
|
List<ActHistoryInfoVo> historyInfoVos = StreamUtils.filter(entry.getValue(), e -> StringUtils.isNotBlank(e.getAssignee()));
|
||||||
|
if (CollUtil.isNotEmpty(historyInfoVos)) {
|
||||||
|
ActHistoryInfoVo infoVo = historyInfoVos.get(0);
|
||||||
|
BeanUtils.copyProperties(infoVo, historyInfoVo);
|
||||||
|
historyInfoVo.setStatus(infoVo.getEndTime() == null ? "待处理" : "已处理");
|
||||||
|
historyInfoVo.setStartTime(infoVo.getStartTime());
|
||||||
|
historyInfoVo.setEndTime(infoVo.getEndTime() == null ? null : infoVo.getEndTime());
|
||||||
|
historyInfoVo.setRunDuration(infoVo.getEndTime() == null ? null : infoVo.getRunDuration());
|
||||||
|
if (ObjectUtil.isEmpty(infoVo.getAssignee())) {
|
||||||
|
ParticipantVo participantVo = WorkflowUtils.getCurrentTaskParticipant(infoVo.getId());
|
||||||
|
if (ObjectUtil.isNotEmpty(participantVo) && CollUtil.isNotEmpty(participantVo.getCandidate())) {
|
||||||
|
historyInfoVo.setAssignee(StreamUtils.join(participantVo.getCandidate(), Convert::toStr));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
actHistoryInfoVoList.stream().filter(e -> e.getTaskDefinitionKey().equals(entry.getKey())).findFirst()
|
||||||
.ifPresent(e -> {
|
.ifPresent(e -> {
|
||||||
historyInfoVo.setStatus("待处理");
|
BeanUtils.copyProperties(e, historyInfoVo);
|
||||||
|
historyInfoVo.setStatus(e.getEndTime() == null ? "待处理" : "已处理");
|
||||||
historyInfoVo.setStartTime(e.getStartTime());
|
historyInfoVo.setStartTime(e.getStartTime());
|
||||||
historyInfoVo.setEndTime(null);
|
historyInfoVo.setEndTime(e.getEndTime() == null ? null : e.getEndTime());
|
||||||
historyInfoVo.setRunDuration(null);
|
historyInfoVo.setRunDuration(e.getEndTime() == null ? null : e.getRunDuration());
|
||||||
if (ObjectUtil.isEmpty(e.getAssignee())) {
|
if (ObjectUtil.isEmpty(e.getAssignee())) {
|
||||||
ParticipantVo participantVo = WorkflowUtils.getCurrentTaskParticipant(e.getId());
|
ParticipantVo participantVo = WorkflowUtils.getCurrentTaskParticipant(e.getId());
|
||||||
if (ObjectUtil.isNotEmpty(participantVo) && CollUtil.isNotEmpty(participantVo.getCandidate())) {
|
if (ObjectUtil.isNotEmpty(participantVo) && CollUtil.isNotEmpty(participantVo.getCandidate())) {
|
||||||
@ -325,7 +344,10 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
}
|
||||||
historyInfoVoList.add(historyInfoVo);
|
historyInfoVoList.add(historyInfoVo);
|
||||||
|
|
||||||
}
|
}
|
||||||
return historyInfoVoList;
|
return historyInfoVoList;
|
||||||
}
|
}
|
||||||
@ -333,13 +355,15 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService
|
|||||||
/**
|
/**
|
||||||
* 获取审批记录
|
* 获取审批记录
|
||||||
*
|
*
|
||||||
* @param processInstanceId 流程实例id
|
* @param businessKey 业务id
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public List<ActHistoryInfoVo> getHistoryRecord(String processInstanceId) {
|
public List<ActHistoryInfoVo> getHistoryRecord(String businessKey) {
|
||||||
// 查询任务办理记录
|
// 查询任务办理记录
|
||||||
List<HistoricTaskInstance> list = QueryUtils.hisTaskInstanceQuery(processInstanceId).orderByHistoricTaskInstanceEndTime().desc().list();
|
List<HistoricTaskInstance> list = QueryUtils.hisTaskBusinessKeyQuery(businessKey).orderByHistoricTaskInstanceEndTime().desc().list();
|
||||||
list = StreamUtils.sorted(list, Comparator.comparing(HistoricTaskInstance::getEndTime, Comparator.nullsFirst(Date::compareTo)).reversed());
|
list = StreamUtils.sorted(list, Comparator.comparing(HistoricTaskInstance::getEndTime, Comparator.nullsFirst(Date::compareTo)).reversed());
|
||||||
|
HistoricProcessInstance historicProcessInstance = QueryUtils.hisBusinessKeyQuery(businessKey).singleResult();
|
||||||
|
String processInstanceId = historicProcessInstance.getId();
|
||||||
List<ActHistoryInfoVo> actHistoryInfoVoList = new ArrayList<>();
|
List<ActHistoryInfoVo> actHistoryInfoVoList = new ArrayList<>();
|
||||||
List<Comment> processInstanceComments = taskService.getProcessInstanceComments(processInstanceId);
|
List<Comment> processInstanceComments = taskService.getProcessInstanceComments(processInstanceId);
|
||||||
//附件
|
//附件
|
||||||
@ -440,7 +464,8 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService
|
|||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public boolean deleteRunInstance(ProcessInvalidBo processInvalidBo) {
|
public boolean deleteRunInstance(ProcessInvalidBo processInvalidBo) {
|
||||||
try {
|
try {
|
||||||
List<Task> list = QueryUtils.taskQuery(processInvalidBo.getProcessInstanceId()).list();
|
List<Task> list = QueryUtils.taskQuery().processInstanceBusinessKey(processInvalidBo.getBusinessKey()).list();
|
||||||
|
String processInstanceId = list.get(0).getProcessInstanceId();
|
||||||
List<Task> subTasks = StreamUtils.filter(list, e -> StringUtils.isNotBlank(e.getParentTaskId()));
|
List<Task> subTasks = StreamUtils.filter(list, e -> StringUtils.isNotBlank(e.getParentTaskId()));
|
||||||
if (CollUtil.isNotEmpty(subTasks)) {
|
if (CollUtil.isNotEmpty(subTasks)) {
|
||||||
subTasks.forEach(e -> taskService.deleteTask(e.getId()));
|
subTasks.forEach(e -> taskService.deleteTask(e.getId()));
|
||||||
@ -452,14 +477,13 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService
|
|||||||
for (Task task : StreamUtils.filter(list, e -> StringUtils.isBlank(e.getParentTaskId()))) {
|
for (Task task : StreamUtils.filter(list, e -> StringUtils.isBlank(e.getParentTaskId()))) {
|
||||||
taskService.addComment(task.getId(), task.getProcessInstanceId(), TaskStatusEnum.INVALID.getStatus(), deleteReason);
|
taskService.addComment(task.getId(), task.getProcessInstanceId(), TaskStatusEnum.INVALID.getStatus(), deleteReason);
|
||||||
}
|
}
|
||||||
HistoricProcessInstance historicProcessInstance = QueryUtils.hisInstanceQuery(processInvalidBo.getProcessInstanceId()).singleResult();
|
HistoricProcessInstance historicProcessInstance = QueryUtils.hisInstanceQuery(processInstanceId).singleResult();
|
||||||
BusinessStatusEnum.checkInvalidStatus(historicProcessInstance.getBusinessStatus());
|
BusinessStatusEnum.checkInvalidStatus(historicProcessInstance.getBusinessStatus());
|
||||||
runtimeService.updateBusinessStatus(processInvalidBo.getProcessInstanceId(), BusinessStatusEnum.INVALID.getStatus());
|
runtimeService.updateBusinessStatus(processInstanceId, BusinessStatusEnum.INVALID.getStatus());
|
||||||
runtimeService.deleteProcessInstance(processInvalidBo.getProcessInstanceId(), deleteReason);
|
runtimeService.deleteProcessInstance(processInstanceId, deleteReason);
|
||||||
FlowProcessEventHandler processHandler = flowEventStrategy.getProcessHandler(historicProcessInstance.getProcessDefinitionKey());
|
//流程作废监听
|
||||||
if (processHandler != null) {
|
flowProcessEventHandler.processHandler(historicProcessInstance.getProcessDefinitionKey(),
|
||||||
processHandler.handleProcess(historicProcessInstance.getBusinessKey(), BusinessStatusEnum.INVALID.getStatus(), false);
|
historicProcessInstance.getBusinessKey(), BusinessStatusEnum.INVALID.getStatus(), false);
|
||||||
}
|
|
||||||
return true;
|
return true;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
@ -470,40 +494,11 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService
|
|||||||
/**
|
/**
|
||||||
* 运行中的实例 删除程实例,删除历史记录,删除业务与流程关联信息
|
* 运行中的实例 删除程实例,删除历史记录,删除业务与流程关联信息
|
||||||
*
|
*
|
||||||
* @param processInstanceIds 流程实例id
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
@Transactional(rollbackFor = Exception.class)
|
|
||||||
public boolean deleteRunAndHisInstance(List<String> processInstanceIds) {
|
|
||||||
try {
|
|
||||||
// 1.删除运行中流程实例
|
|
||||||
List<Task> list = QueryUtils.taskQuery(processInstanceIds).list();
|
|
||||||
List<Task> subTasks = StreamUtils.filter(list, e -> StringUtils.isNotBlank(e.getParentTaskId()));
|
|
||||||
if (CollUtil.isNotEmpty(subTasks)) {
|
|
||||||
subTasks.forEach(e -> taskService.deleteTask(e.getId()));
|
|
||||||
}
|
|
||||||
runtimeService.bulkDeleteProcessInstances(processInstanceIds, LoginHelper.getUserId() + "删除了当前流程申请");
|
|
||||||
// 2.删除历史记录
|
|
||||||
List<HistoricProcessInstance> historicProcessInstanceList = QueryUtils.hisInstanceQuery(new HashSet<>(processInstanceIds)).list();
|
|
||||||
if (ObjectUtil.isNotEmpty(historicProcessInstanceList)) {
|
|
||||||
historyService.bulkDeleteHistoricProcessInstances(processInstanceIds);
|
|
||||||
}
|
|
||||||
wfTaskBackNodeService.deleteByInstanceIds(processInstanceIds);
|
|
||||||
return true;
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
throw new ServiceException(e.getMessage());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 按照业务id删除 运行中的实例 删除程实例,删除历史记录,删除业务与流程关联信息
|
|
||||||
*
|
|
||||||
* @param businessKeys 业务id
|
* @param businessKeys 业务id
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public boolean deleteRunAndHisInstanceByBusinessKeys(List<String> businessKeys) {
|
public boolean deleteRunAndHisInstance(List<String> businessKeys) {
|
||||||
try {
|
try {
|
||||||
// 1.删除运行中流程实例
|
// 1.删除运行中流程实例
|
||||||
List<ActHiProcinst> actHiProcinsts = actHiProcinstService.selectByBusinessKeyIn(businessKeys);
|
List<ActHiProcinst> actHiProcinsts = actHiProcinstService.selectByBusinessKeyIn(businessKeys);
|
||||||
@ -534,12 +529,18 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService
|
|||||||
/**
|
/**
|
||||||
* 已完成的实例 删除程实例,删除历史记录,删除业务与流程关联信息
|
* 已完成的实例 删除程实例,删除历史记录,删除业务与流程关联信息
|
||||||
*
|
*
|
||||||
* @param processInstanceIds 流程实例id
|
* @param businessKeys 业务id
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public boolean deleteFinishAndHisInstance(List<String> processInstanceIds) {
|
public boolean deleteFinishAndHisInstance(List<String> businessKeys) {
|
||||||
try {
|
try {
|
||||||
|
List<ActHiProcinst> actHiProcinsts = actHiProcinstService.selectByBusinessKeyIn(businessKeys);
|
||||||
|
if (CollUtil.isEmpty(actHiProcinsts)) {
|
||||||
|
log.warn("当前业务ID:{}查询到流程实例为空!", businessKeys);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
List<String> processInstanceIds = StreamUtils.toList(actHiProcinsts, ActHiProcinst::getId);
|
||||||
historyService.bulkDeleteHistoricProcessInstances(processInstanceIds);
|
historyService.bulkDeleteHistoricProcessInstances(processInstanceIds);
|
||||||
wfTaskBackNodeService.deleteByInstanceIds(processInstanceIds);
|
wfTaskBackNodeService.deleteByInstanceIds(processInstanceIds);
|
||||||
return true;
|
return true;
|
||||||
@ -552,13 +553,13 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService
|
|||||||
/**
|
/**
|
||||||
* 撤销流程申请
|
* 撤销流程申请
|
||||||
*
|
*
|
||||||
* @param processInstanceId 流程实例id
|
* @param businessKey 业务id
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public boolean cancelProcessApply(String processInstanceId) {
|
public boolean cancelProcessApply(String businessKey) {
|
||||||
try {
|
try {
|
||||||
ProcessInstance processInstance = QueryUtils.instanceQuery(processInstanceId)
|
ProcessInstance processInstance = QueryUtils.businessKeyQuery(businessKey)
|
||||||
.startedBy(String.valueOf(LoginHelper.getUserId())).singleResult();
|
.startedBy(String.valueOf(LoginHelper.getUserId())).singleResult();
|
||||||
if (ObjectUtil.isNull(processInstance)) {
|
if (ObjectUtil.isNull(processInstance)) {
|
||||||
throw new ServiceException("您不是流程发起人,撤销失败!");
|
throw new ServiceException("您不是流程发起人,撤销失败!");
|
||||||
@ -566,13 +567,14 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService
|
|||||||
if (processInstance.isSuspended()) {
|
if (processInstance.isSuspended()) {
|
||||||
throw new ServiceException(FlowConstant.MESSAGE_SUSPENDED);
|
throw new ServiceException(FlowConstant.MESSAGE_SUSPENDED);
|
||||||
}
|
}
|
||||||
|
String processInstanceId = processInstance.getId();
|
||||||
BusinessStatusEnum.checkCancelStatus(processInstance.getBusinessStatus());
|
BusinessStatusEnum.checkCancelStatus(processInstance.getBusinessStatus());
|
||||||
List<Task> taskList = QueryUtils.taskQuery(processInstanceId).list();
|
List<Task> taskList = QueryUtils.taskQuery(processInstanceId).list();
|
||||||
for (Task task : taskList) {
|
for (Task task : taskList) {
|
||||||
taskService.setAssignee(task.getId(), null);
|
taskService.setAssignee(task.getId(), null);
|
||||||
taskService.addComment(task.getId(), processInstanceId, TaskStatusEnum.CANCEL.getStatus(), LoginHelper.getLoginUser().getNickname() + ":撤销申请");
|
taskService.addComment(task.getId(), processInstanceId, TaskStatusEnum.CANCEL.getStatus(), LoginHelper.getLoginUser().getNickname() + ":撤销申请");
|
||||||
}
|
}
|
||||||
HistoricTaskInstance historicTaskInstance = QueryUtils.hisTaskInstanceQuery().finished().orderByHistoricTaskInstanceEndTime().asc().list().get(0);
|
HistoricTaskInstance historicTaskInstance = QueryUtils.hisTaskInstanceQuery(processInstanceId).finished().orderByHistoricTaskInstanceEndTime().asc().list().get(0);
|
||||||
List<String> nodeIds = StreamUtils.toList(taskList, Task::getTaskDefinitionKey);
|
List<String> nodeIds = StreamUtils.toList(taskList, Task::getTaskDefinitionKey);
|
||||||
runtimeService.createChangeActivityStateBuilder()
|
runtimeService.createChangeActivityStateBuilder()
|
||||||
.processInstanceId(processInstanceId)
|
.processInstanceId(processInstanceId)
|
||||||
@ -588,10 +590,9 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService
|
|||||||
managementService.executeCommand(deleteExecutionCmd);
|
managementService.executeCommand(deleteExecutionCmd);
|
||||||
}
|
}
|
||||||
runtimeService.updateBusinessStatus(processInstanceId, BusinessStatusEnum.CANCEL.getStatus());
|
runtimeService.updateBusinessStatus(processInstanceId, BusinessStatusEnum.CANCEL.getStatus());
|
||||||
FlowProcessEventHandler processHandler = flowEventStrategy.getProcessHandler(processInstance.getProcessDefinitionKey());
|
//流程作废监听
|
||||||
if (processHandler != null) {
|
flowProcessEventHandler.processHandler(processInstance.getProcessDefinitionKey(),
|
||||||
processHandler.handleProcess(processInstance.getBusinessKey(), BusinessStatusEnum.CANCEL.getStatus(), false);
|
processInstance.getBusinessKey(), BusinessStatusEnum.CANCEL.getStatus(), false);
|
||||||
}
|
|
||||||
return true;
|
return true;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
@ -18,16 +18,14 @@ import org.dromara.common.mybatis.core.page.TableDataInfo;
|
|||||||
import org.dromara.common.satoken.utils.LoginHelper;
|
import org.dromara.common.satoken.utils.LoginHelper;
|
||||||
import org.dromara.common.tenant.helper.TenantHelper;
|
import org.dromara.common.tenant.helper.TenantHelper;
|
||||||
import org.dromara.workflow.common.constant.FlowConstant;
|
import org.dromara.workflow.common.constant.FlowConstant;
|
||||||
import org.dromara.workflow.common.enums.BusinessStatusEnum;
|
import org.dromara.common.core.enums.BusinessStatusEnum;
|
||||||
import org.dromara.workflow.common.enums.TaskStatusEnum;
|
import org.dromara.workflow.common.enums.TaskStatusEnum;
|
||||||
import org.dromara.workflow.domain.ActHiTaskinst;
|
import org.dromara.workflow.domain.ActHiTaskinst;
|
||||||
import org.dromara.workflow.domain.WfTaskBackNode;
|
import org.dromara.workflow.domain.WfTaskBackNode;
|
||||||
import org.dromara.workflow.domain.bo.*;
|
import org.dromara.workflow.domain.bo.*;
|
||||||
import org.dromara.workflow.domain.vo.*;
|
import org.dromara.workflow.domain.vo.*;
|
||||||
import org.dromara.workflow.flowable.cmd.*;
|
import org.dromara.workflow.flowable.cmd.*;
|
||||||
import org.dromara.workflow.flowable.strategy.FlowEventStrategy;
|
import org.dromara.workflow.flowable.handler.FlowProcessEventHandler;
|
||||||
import org.dromara.workflow.flowable.strategy.FlowProcessEventHandler;
|
|
||||||
import org.dromara.workflow.flowable.strategy.FlowTaskEventHandler;
|
|
||||||
import org.dromara.workflow.mapper.ActHiTaskinstMapper;
|
import org.dromara.workflow.mapper.ActHiTaskinstMapper;
|
||||||
import org.dromara.workflow.mapper.ActTaskMapper;
|
import org.dromara.workflow.mapper.ActTaskMapper;
|
||||||
import org.dromara.workflow.service.IActTaskService;
|
import org.dromara.workflow.service.IActTaskService;
|
||||||
@ -75,13 +73,13 @@ public class ActTaskServiceImpl implements IActTaskService {
|
|||||||
private final HistoryService historyService;
|
private final HistoryService historyService;
|
||||||
private final IdentityService identityService;
|
private final IdentityService identityService;
|
||||||
private final ManagementService managementService;
|
private final ManagementService managementService;
|
||||||
private final FlowEventStrategy flowEventStrategy;
|
|
||||||
private final ActTaskMapper actTaskMapper;
|
private final ActTaskMapper actTaskMapper;
|
||||||
private final IWfTaskBackNodeService wfTaskBackNodeService;
|
private final IWfTaskBackNodeService wfTaskBackNodeService;
|
||||||
private final ActHiTaskinstMapper actHiTaskinstMapper;
|
private final ActHiTaskinstMapper actHiTaskinstMapper;
|
||||||
private final IWfNodeConfigService wfNodeConfigService;
|
private final IWfNodeConfigService wfNodeConfigService;
|
||||||
private final IWfDefinitionConfigService wfDefinitionConfigService;
|
private final IWfDefinitionConfigService wfDefinitionConfigService;
|
||||||
private final UserService userService;
|
private final UserService userService;
|
||||||
|
private final FlowProcessEventHandler flowProcessEventHandler;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 启动任务
|
* 启动任务
|
||||||
@ -159,15 +157,8 @@ public class ActTaskServiceImpl implements IActTaskService {
|
|||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public boolean completeTask(CompleteTaskBo completeTaskBo) {
|
public boolean completeTask(CompleteTaskBo completeTaskBo) {
|
||||||
try {
|
try {
|
||||||
List<RoleDTO> roles = LoginHelper.getLoginUser().getRoles();
|
|
||||||
String userId = String.valueOf(LoginHelper.getUserId());
|
String userId = String.valueOf(LoginHelper.getUserId());
|
||||||
TaskQuery taskQuery = QueryUtils.taskQuery();
|
Task task = WorkflowUtils.getTaskByCurrentUser(completeTaskBo.getTaskId());
|
||||||
taskQuery.taskId(completeTaskBo.getTaskId()).taskCandidateOrAssigned(userId);
|
|
||||||
if (CollUtil.isNotEmpty(roles)) {
|
|
||||||
List<String> groupIds = StreamUtils.toList(roles, e -> String.valueOf(e.getRoleId()));
|
|
||||||
taskQuery.taskCandidateGroupIn(groupIds);
|
|
||||||
}
|
|
||||||
Task task = taskQuery.singleResult();
|
|
||||||
if (task == null) {
|
if (task == null) {
|
||||||
throw new ServiceException(FlowConstant.MESSAGE_CURRENT_TASK_IS_NULL);
|
throw new ServiceException(FlowConstant.MESSAGE_CURRENT_TASK_IS_NULL);
|
||||||
}
|
}
|
||||||
@ -186,19 +177,15 @@ public class ActTaskServiceImpl implements IActTaskService {
|
|||||||
//附件上传
|
//附件上传
|
||||||
AttachmentCmd attachmentCmd = new AttachmentCmd(completeTaskBo.getFileId(), task.getId(), task.getProcessInstanceId());
|
AttachmentCmd attachmentCmd = new AttachmentCmd(completeTaskBo.getFileId(), task.getId(), task.getProcessInstanceId());
|
||||||
managementService.executeCommand(attachmentCmd);
|
managementService.executeCommand(attachmentCmd);
|
||||||
FlowProcessEventHandler processHandler = flowEventStrategy.getProcessHandler(processInstance.getProcessDefinitionKey());
|
String businessStatus = WorkflowUtils.getBusinessStatus(processInstance.getBusinessKey());
|
||||||
String businessStatus = WorkflowUtils.getBusinessStatus(task.getProcessInstanceId());
|
//流程提交监听
|
||||||
if (BusinessStatusEnum.DRAFT.getStatus().equals(businessStatus) || BusinessStatusEnum.BACK.getStatus().equals(businessStatus) || BusinessStatusEnum.CANCEL.getStatus().equals(businessStatus)) {
|
if (BusinessStatusEnum.DRAFT.getStatus().equals(businessStatus) || BusinessStatusEnum.BACK.getStatus().equals(businessStatus) || BusinessStatusEnum.CANCEL.getStatus().equals(businessStatus)) {
|
||||||
if (processHandler != null) {
|
flowProcessEventHandler.processHandler(processInstance.getProcessDefinitionKey(), processInstance.getBusinessKey(), businessStatus, true);
|
||||||
processHandler.handleProcess(processInstance.getBusinessKey(), businessStatus, true);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
runtimeService.updateBusinessStatus(task.getProcessInstanceId(), BusinessStatusEnum.WAITING.getStatus());
|
runtimeService.updateBusinessStatus(task.getProcessInstanceId(), BusinessStatusEnum.WAITING.getStatus());
|
||||||
String key = processInstance.getProcessDefinitionKey() + "_" + task.getTaskDefinitionKey();
|
//办理监听
|
||||||
FlowTaskEventHandler taskHandler = flowEventStrategy.getTaskHandler(key);
|
String keyNode = processInstance.getProcessDefinitionKey() + "_" + task.getTaskDefinitionKey();
|
||||||
if (taskHandler != null) {
|
flowProcessEventHandler.processTaskHandler(keyNode, task.getId(), processInstance.getBusinessKey());
|
||||||
taskHandler.handleTask(task.getId(), processInstance.getBusinessKey());
|
|
||||||
}
|
|
||||||
//办理意见
|
//办理意见
|
||||||
taskService.addComment(completeTaskBo.getTaskId(), task.getProcessInstanceId(), TaskStatusEnum.PASS.getStatus(), StringUtils.isBlank(completeTaskBo.getMessage()) ? "同意" : completeTaskBo.getMessage());
|
taskService.addComment(completeTaskBo.getTaskId(), task.getProcessInstanceId(), TaskStatusEnum.PASS.getStatus(), StringUtils.isBlank(completeTaskBo.getMessage()) ? "同意" : completeTaskBo.getMessage());
|
||||||
//办理任务
|
//办理任务
|
||||||
@ -214,9 +201,8 @@ public class ActTaskServiceImpl implements IActTaskService {
|
|||||||
if (pi == null) {
|
if (pi == null) {
|
||||||
UpdateBusinessStatusCmd updateBusinessStatusCmd = new UpdateBusinessStatusCmd(task.getProcessInstanceId(), BusinessStatusEnum.FINISH.getStatus());
|
UpdateBusinessStatusCmd updateBusinessStatusCmd = new UpdateBusinessStatusCmd(task.getProcessInstanceId(), BusinessStatusEnum.FINISH.getStatus());
|
||||||
managementService.executeCommand(updateBusinessStatusCmd);
|
managementService.executeCommand(updateBusinessStatusCmd);
|
||||||
if (processHandler != null) {
|
flowProcessEventHandler.processHandler(processInstance.getProcessDefinitionKey(), processInstance.getBusinessKey(),
|
||||||
processHandler.handleProcess(processInstance.getBusinessKey(), BusinessStatusEnum.FINISH.getStatus(), false);
|
BusinessStatusEnum.FINISH.getStatus(), false);
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
List<Task> list = QueryUtils.taskQuery(task.getProcessInstanceId()).list();
|
List<Task> list = QueryUtils.taskQuery(task.getProcessInstanceId()).list();
|
||||||
for (Task t : list) {
|
for (Task t : list) {
|
||||||
@ -470,8 +456,8 @@ public class ActTaskServiceImpl implements IActTaskService {
|
|||||||
@Override
|
@Override
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public boolean delegateTask(DelegateBo delegateBo) {
|
public boolean delegateTask(DelegateBo delegateBo) {
|
||||||
TaskQuery query = QueryUtils.taskQuery();
|
Task task = WorkflowUtils.getTaskByCurrentUser(delegateBo.getTaskId());
|
||||||
TaskEntity task = (TaskEntity) query.taskId(delegateBo.getTaskId()).taskCandidateOrAssigned(String.valueOf(LoginHelper.getUserId())).singleResult();
|
|
||||||
if (ObjectUtil.isEmpty(task)) {
|
if (ObjectUtil.isEmpty(task)) {
|
||||||
throw new ServiceException(FlowConstant.MESSAGE_CURRENT_TASK_IS_NULL);
|
throw new ServiceException(FlowConstant.MESSAGE_CURRENT_TASK_IS_NULL);
|
||||||
}
|
}
|
||||||
@ -527,10 +513,9 @@ public class ActTaskServiceImpl implements IActTaskService {
|
|||||||
runtimeService.updateBusinessStatus(task.getProcessInstanceId(), BusinessStatusEnum.TERMINATION.getStatus());
|
runtimeService.updateBusinessStatus(task.getProcessInstanceId(), BusinessStatusEnum.TERMINATION.getStatus());
|
||||||
runtimeService.deleteProcessInstance(task.getProcessInstanceId(), StrUtil.EMPTY);
|
runtimeService.deleteProcessInstance(task.getProcessInstanceId(), StrUtil.EMPTY);
|
||||||
}
|
}
|
||||||
FlowProcessEventHandler processHandler = flowEventStrategy.getProcessHandler(historicProcessInstance.getProcessDefinitionKey());
|
//流程终止监听
|
||||||
if (processHandler != null) {
|
flowProcessEventHandler.processHandler(historicProcessInstance.getProcessDefinitionKey(),
|
||||||
processHandler.handleProcess(historicProcessInstance.getBusinessKey(), BusinessStatusEnum.TERMINATION.getStatus(), false);
|
historicProcessInstance.getBusinessKey(), BusinessStatusEnum.TERMINATION.getStatus(), false);
|
||||||
}
|
|
||||||
return true;
|
return true;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
throw new ServiceException(e.getMessage());
|
throw new ServiceException(e.getMessage());
|
||||||
@ -544,7 +529,7 @@ public class ActTaskServiceImpl implements IActTaskService {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public boolean transferTask(TransmitBo transmitBo) {
|
public boolean transferTask(TransmitBo transmitBo) {
|
||||||
Task task = QueryUtils.taskQuery().taskId(transmitBo.getTaskId()).taskCandidateOrAssigned(String.valueOf(LoginHelper.getUserId())).singleResult();
|
Task task = WorkflowUtils.getTaskByCurrentUser(transmitBo.getTaskId());
|
||||||
if (ObjectUtil.isEmpty(task)) {
|
if (ObjectUtil.isEmpty(task)) {
|
||||||
throw new ServiceException(FlowConstant.MESSAGE_CURRENT_TASK_IS_NULL);
|
throw new ServiceException(FlowConstant.MESSAGE_CURRENT_TASK_IS_NULL);
|
||||||
}
|
}
|
||||||
@ -669,9 +654,9 @@ public class ActTaskServiceImpl implements IActTaskService {
|
|||||||
@Override
|
@Override
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public String backProcess(BackProcessBo backProcessBo) {
|
public String backProcess(BackProcessBo backProcessBo) {
|
||||||
TaskQuery query = QueryUtils.taskQuery();
|
|
||||||
String userId = String.valueOf(LoginHelper.getUserId());
|
String userId = String.valueOf(LoginHelper.getUserId());
|
||||||
Task task = query.taskId(backProcessBo.getTaskId()).taskCandidateOrAssigned(userId).singleResult();
|
Task task = WorkflowUtils.getTaskByCurrentUser(backProcessBo.getTaskId());
|
||||||
|
|
||||||
if (ObjectUtil.isEmpty(task)) {
|
if (ObjectUtil.isEmpty(task)) {
|
||||||
throw new ServiceException(FlowConstant.MESSAGE_CURRENT_TASK_IS_NULL);
|
throw new ServiceException(FlowConstant.MESSAGE_CURRENT_TASK_IS_NULL);
|
||||||
}
|
}
|
||||||
@ -705,8 +690,10 @@ public class ActTaskServiceImpl implements IActTaskService {
|
|||||||
MultiInstanceVo multiInstance = WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey());
|
MultiInstanceVo multiInstance = WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey());
|
||||||
if (multiInstance == null && taskList.size() > 1) {
|
if (multiInstance == null && taskList.size() > 1) {
|
||||||
List<Task> tasks = StreamUtils.filter(taskList, e -> !e.getTaskDefinitionKey().equals(task.getTaskDefinitionKey()));
|
List<Task> tasks = StreamUtils.filter(taskList, e -> !e.getTaskDefinitionKey().equals(task.getTaskDefinitionKey()));
|
||||||
|
if (CollUtil.isNotEmpty(tasks)) {
|
||||||
actHiTaskinstMapper.deleteBatchIds(StreamUtils.toList(tasks, Task::getId));
|
actHiTaskinstMapper.deleteBatchIds(StreamUtils.toList(tasks, Task::getId));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
List<HistoricTaskInstance> instanceList = QueryUtils.hisTaskInstanceQuery(processInstanceId).finished().orderByHistoricTaskInstanceEndTime().desc().list();
|
List<HistoricTaskInstance> instanceList = QueryUtils.hisTaskInstanceQuery(processInstanceId).finished().orderByHistoricTaskInstanceEndTime().desc().list();
|
||||||
@ -728,10 +715,8 @@ public class ActTaskServiceImpl implements IActTaskService {
|
|||||||
WfTaskBackNode wfTaskBackNode = wfTaskBackNodeService.getListByInstanceIdAndNodeId(task.getProcessInstanceId(), backProcessBo.getTargetActivityId());
|
WfTaskBackNode wfTaskBackNode = wfTaskBackNodeService.getListByInstanceIdAndNodeId(task.getProcessInstanceId(), backProcessBo.getTargetActivityId());
|
||||||
if (ObjectUtil.isNotNull(wfTaskBackNode) && wfTaskBackNode.getOrderNo() == 0) {
|
if (ObjectUtil.isNotNull(wfTaskBackNode) && wfTaskBackNode.getOrderNo() == 0) {
|
||||||
runtimeService.updateBusinessStatus(processInstanceId, BusinessStatusEnum.BACK.getStatus());
|
runtimeService.updateBusinessStatus(processInstanceId, BusinessStatusEnum.BACK.getStatus());
|
||||||
FlowProcessEventHandler processHandler = flowEventStrategy.getProcessHandler(processInstance.getProcessDefinitionKey());
|
flowProcessEventHandler.processHandler(processInstance.getProcessDefinitionKey(),
|
||||||
if (processHandler != null) {
|
processInstance.getBusinessKey(), BusinessStatusEnum.BACK.getStatus(), false);
|
||||||
processHandler.handleProcess(processInstance.getBusinessKey(), BusinessStatusEnum.BACK.getStatus(), false);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
//删除驳回后的流程节点
|
//删除驳回后的流程节点
|
||||||
wfTaskBackNodeService.deleteBackTaskNode(processInstanceId, backProcessBo.getTargetActivityId());
|
wfTaskBackNodeService.deleteBackTaskNode(processInstanceId, backProcessBo.getTargetActivityId());
|
||||||
|
@ -1,10 +1,14 @@
|
|||||||
package org.dromara.workflow.service.impl;
|
package org.dromara.workflow.service.impl;
|
||||||
|
|
||||||
import cn.hutool.core.collection.CollUtil;
|
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.dromara.common.core.domain.event.ProcessEvent;
|
||||||
|
import org.dromara.common.core.domain.event.ProcessTaskEvent;
|
||||||
|
import org.dromara.common.core.enums.BusinessStatusEnum;
|
||||||
|
import org.dromara.common.core.service.WorkflowService;
|
||||||
import org.dromara.common.core.utils.MapstructUtils;
|
import org.dromara.common.core.utils.MapstructUtils;
|
||||||
import org.dromara.common.core.utils.StreamUtils;
|
import org.dromara.common.core.utils.StreamUtils;
|
||||||
import org.dromara.common.core.utils.StringUtils;
|
import org.dromara.common.core.utils.StringUtils;
|
||||||
@ -15,9 +19,8 @@ import org.dromara.workflow.domain.TestLeave;
|
|||||||
import org.dromara.workflow.domain.bo.TestLeaveBo;
|
import org.dromara.workflow.domain.bo.TestLeaveBo;
|
||||||
import org.dromara.workflow.domain.vo.TestLeaveVo;
|
import org.dromara.workflow.domain.vo.TestLeaveVo;
|
||||||
import org.dromara.workflow.mapper.TestLeaveMapper;
|
import org.dromara.workflow.mapper.TestLeaveMapper;
|
||||||
import org.dromara.workflow.service.IActProcessInstanceService;
|
|
||||||
import org.dromara.workflow.service.ITestLeaveService;
|
import org.dromara.workflow.service.ITestLeaveService;
|
||||||
import org.dromara.workflow.utils.WorkflowUtils;
|
import org.springframework.context.event.EventListener;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
@ -32,19 +35,18 @@ import java.util.List;
|
|||||||
*/
|
*/
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
@Service
|
@Service
|
||||||
|
@Slf4j
|
||||||
public class TestLeaveServiceImpl implements ITestLeaveService {
|
public class TestLeaveServiceImpl implements ITestLeaveService {
|
||||||
|
|
||||||
private final TestLeaveMapper baseMapper;
|
private final TestLeaveMapper baseMapper;
|
||||||
private final IActProcessInstanceService actProcessInstanceService;
|
private final WorkflowService workflowService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询请假
|
* 查询请假
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public TestLeaveVo queryById(Long id) {
|
public TestLeaveVo queryById(Long id) {
|
||||||
TestLeaveVo testLeaveVo = baseMapper.selectVoById(id);
|
return baseMapper.selectVoById(id);
|
||||||
WorkflowUtils.setProcessInstanceVo(testLeaveVo, String.valueOf(id));
|
|
||||||
return testLeaveVo;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -54,13 +56,7 @@ public class TestLeaveServiceImpl implements ITestLeaveService {
|
|||||||
public TableDataInfo<TestLeaveVo> queryPageList(TestLeaveBo bo, PageQuery pageQuery) {
|
public TableDataInfo<TestLeaveVo> queryPageList(TestLeaveBo bo, PageQuery pageQuery) {
|
||||||
LambdaQueryWrapper<TestLeave> lqw = buildQueryWrapper(bo);
|
LambdaQueryWrapper<TestLeave> lqw = buildQueryWrapper(bo);
|
||||||
Page<TestLeaveVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
|
Page<TestLeaveVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
|
||||||
TableDataInfo<TestLeaveVo> build = TableDataInfo.build(result);
|
return TableDataInfo.build(result);
|
||||||
List<TestLeaveVo> rows = build.getRows();
|
|
||||||
if (CollUtil.isNotEmpty(rows)) {
|
|
||||||
List<String> ids = StreamUtils.toList(rows, e -> String.valueOf(e.getId()));
|
|
||||||
WorkflowUtils.setProcessInstanceListVo(rows, ids, "id");
|
|
||||||
}
|
|
||||||
return build;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -87,13 +83,14 @@ public class TestLeaveServiceImpl implements ITestLeaveService {
|
|||||||
@Override
|
@Override
|
||||||
public TestLeaveVo insertByBo(TestLeaveBo bo) {
|
public TestLeaveVo insertByBo(TestLeaveBo bo) {
|
||||||
TestLeave add = MapstructUtils.convert(bo, TestLeave.class);
|
TestLeave add = MapstructUtils.convert(bo, TestLeave.class);
|
||||||
|
if (StringUtils.isBlank(add.getStatus())) {
|
||||||
|
add.setStatus(BusinessStatusEnum.DRAFT.getStatus());
|
||||||
|
}
|
||||||
boolean flag = baseMapper.insert(add) > 0;
|
boolean flag = baseMapper.insert(add) > 0;
|
||||||
if (flag) {
|
if (flag) {
|
||||||
bo.setId(add.getId());
|
bo.setId(add.getId());
|
||||||
}
|
}
|
||||||
TestLeaveVo testLeaveVo = MapstructUtils.convert(add, TestLeaveVo.class);
|
return MapstructUtils.convert(add, TestLeaveVo.class);
|
||||||
WorkflowUtils.setProcessInstanceVo(testLeaveVo, String.valueOf(add.getId()));
|
|
||||||
return testLeaveVo;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -103,9 +100,7 @@ public class TestLeaveServiceImpl implements ITestLeaveService {
|
|||||||
public TestLeaveVo updateByBo(TestLeaveBo bo) {
|
public TestLeaveVo updateByBo(TestLeaveBo bo) {
|
||||||
TestLeave update = MapstructUtils.convert(bo, TestLeave.class);
|
TestLeave update = MapstructUtils.convert(bo, TestLeave.class);
|
||||||
baseMapper.updateById(update);
|
baseMapper.updateById(update);
|
||||||
TestLeaveVo testLeaveVo = MapstructUtils.convert(update, TestLeaveVo.class);
|
return MapstructUtils.convert(update, TestLeaveVo.class);
|
||||||
WorkflowUtils.setProcessInstanceVo(testLeaveVo, String.valueOf(update.getId()));
|
|
||||||
return testLeaveVo;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -115,7 +110,38 @@ public class TestLeaveServiceImpl implements ITestLeaveService {
|
|||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public Boolean deleteWithValidByIds(Collection<Long> ids) {
|
public Boolean deleteWithValidByIds(Collection<Long> ids) {
|
||||||
List<String> idList = StreamUtils.toList(ids, String::valueOf);
|
List<String> idList = StreamUtils.toList(ids, String::valueOf);
|
||||||
actProcessInstanceService.deleteRunAndHisInstanceByBusinessKeys(idList);
|
workflowService.deleteRunAndHisInstance(idList);
|
||||||
return baseMapper.deleteBatchIds(ids) > 0;
|
return baseMapper.deleteBatchIds(ids) > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 总体流程监听(例如: 提交 退回 撤销 终止 作废等)
|
||||||
|
*
|
||||||
|
* @param processEvent 参数
|
||||||
|
*/
|
||||||
|
@EventListener(condition = "#processEvent.key=='leave1'")
|
||||||
|
public void processHandler(ProcessEvent processEvent) {
|
||||||
|
log.info("当前任务执行了{}", processEvent.toString());
|
||||||
|
TestLeave testLeave = baseMapper.selectById(Long.valueOf(processEvent.getBusinessKey()));
|
||||||
|
testLeave.setStatus(processEvent.getStatus());
|
||||||
|
if (processEvent.isSubmit()) {
|
||||||
|
testLeave.setStatus(BusinessStatusEnum.WAITING.getStatus());
|
||||||
|
}
|
||||||
|
baseMapper.updateById(testLeave);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 执行办理任务监听
|
||||||
|
*
|
||||||
|
* @param processTaskEvent 参数
|
||||||
|
*/
|
||||||
|
@EventListener(condition = "#processTaskEvent.keyNode=='leave1_Activity_14633hx'")
|
||||||
|
public void processTaskHandler(ProcessTaskEvent processTaskEvent) {
|
||||||
|
log.info("当前任务执行了{}", processTaskEvent.toString());
|
||||||
|
TestLeave testLeave = baseMapper.selectById(Long.valueOf(processTaskEvent.getBusinessKey()));
|
||||||
|
testLeave.setStatus(BusinessStatusEnum.WAITING.getStatus());
|
||||||
|
baseMapper.updateById(testLeave);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,119 @@
|
|||||||
|
package org.dromara.workflow.service.impl;
|
||||||
|
|
||||||
|
import cn.hutool.core.util.StrUtil;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.dromara.common.core.service.WorkflowService;
|
||||||
|
import org.dromara.workflow.domain.ActHiProcinst;
|
||||||
|
import org.dromara.workflow.service.IActHiProcinstService;
|
||||||
|
import org.dromara.workflow.service.IActProcessInstanceService;
|
||||||
|
import org.dromara.workflow.utils.WorkflowUtils;
|
||||||
|
import org.flowable.engine.RuntimeService;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 通用 工作流服务实现
|
||||||
|
*
|
||||||
|
* @author may
|
||||||
|
*/
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
@Service
|
||||||
|
public class WorkflowServiceImpl implements WorkflowService {
|
||||||
|
|
||||||
|
private final IActProcessInstanceService iActProcessInstanceService;
|
||||||
|
private final RuntimeService runtimeService;
|
||||||
|
private final IActHiProcinstService iActHiProcinstService;
|
||||||
|
/**
|
||||||
|
* 运行中的实例 删除程实例,删除历史记录,删除业务与流程关联信息
|
||||||
|
*
|
||||||
|
* @param businessKeys 业务id
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean deleteRunAndHisInstance(List<String> businessKeys) {
|
||||||
|
return iActProcessInstanceService.deleteRunAndHisInstance(businessKeys);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取当前流程状态
|
||||||
|
*
|
||||||
|
* @param taskId 任务id
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String getBusinessStatusByTaskId(String taskId) {
|
||||||
|
return WorkflowUtils.getBusinessStatusByTaskId(taskId);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取当前流程状态
|
||||||
|
*
|
||||||
|
* @param businessKey 业务id
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String getBusinessStatus(String businessKey) {
|
||||||
|
return WorkflowUtils.getBusinessStatus(businessKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置流程变量(全局变量)
|
||||||
|
*
|
||||||
|
* @param taskId 任务id
|
||||||
|
* @param variableName 变量名称
|
||||||
|
* @param value 变量值
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void setVariable(String taskId, String variableName, Object value) {
|
||||||
|
runtimeService.setVariable(taskId, variableName, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置流程变量(全局变量)
|
||||||
|
*
|
||||||
|
* @param taskId 任务id
|
||||||
|
* @param variables 流程变量
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void setVariables(String taskId, Map<String, Object> variables) {
|
||||||
|
runtimeService.setVariables(taskId, variables);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置流程变量(本地变量,非全局变量)
|
||||||
|
*
|
||||||
|
* @param taskId 任务id
|
||||||
|
* @param variableName 变量名称
|
||||||
|
* @param value 变量值
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void setVariableLocal(String taskId, String variableName, Object value) {
|
||||||
|
runtimeService.setVariableLocal(taskId, variableName, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置流程变量(本地变量,非全局变量)
|
||||||
|
*
|
||||||
|
* @param taskId 任务id
|
||||||
|
* @param variables 流程变量
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void setVariablesLocal(String taskId, Map<String, Object> variables) {
|
||||||
|
runtimeService.setVariablesLocal(taskId, variables);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 按照业务id查询流程实例id
|
||||||
|
*
|
||||||
|
* @param businessKey 业务id
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String getInstanceIdByBusinessKey(String businessKey) {
|
||||||
|
ActHiProcinst actHiProcinst = iActHiProcinstService.selectByBusinessKey(businessKey);
|
||||||
|
if (actHiProcinst == null) {
|
||||||
|
return StrUtil.EMPTY;
|
||||||
|
}
|
||||||
|
return actHiProcinst.getId();
|
||||||
|
}
|
||||||
|
}
|
@ -12,6 +12,7 @@ import org.flowable.engine.history.HistoricProcessInstanceQuery;
|
|||||||
import org.flowable.engine.repository.DeploymentQuery;
|
import org.flowable.engine.repository.DeploymentQuery;
|
||||||
import org.flowable.engine.repository.ModelQuery;
|
import org.flowable.engine.repository.ModelQuery;
|
||||||
import org.flowable.engine.repository.ProcessDefinitionQuery;
|
import org.flowable.engine.repository.ProcessDefinitionQuery;
|
||||||
|
import org.flowable.engine.runtime.ProcessInstance;
|
||||||
import org.flowable.engine.runtime.ProcessInstanceQuery;
|
import org.flowable.engine.runtime.ProcessInstanceQuery;
|
||||||
import org.flowable.task.api.Task;
|
import org.flowable.task.api.Task;
|
||||||
import org.flowable.task.api.TaskQuery;
|
import org.flowable.task.api.TaskQuery;
|
||||||
@ -75,6 +76,10 @@ public class QueryUtils {
|
|||||||
return hisTaskInstanceQuery().processInstanceId(processInstanceId);
|
return hisTaskInstanceQuery().processInstanceId(processInstanceId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static HistoricTaskInstanceQuery hisTaskBusinessKeyQuery(String businessKey) {
|
||||||
|
return hisTaskInstanceQuery().processInstanceBusinessKey(businessKey);
|
||||||
|
}
|
||||||
|
|
||||||
public static ProcessInstanceQuery instanceQuery() {
|
public static ProcessInstanceQuery instanceQuery() {
|
||||||
ProcessInstanceQuery query = PROCESS_ENGINE.getRuntimeService().createProcessInstanceQuery();
|
ProcessInstanceQuery query = PROCESS_ENGINE.getRuntimeService().createProcessInstanceQuery();
|
||||||
if (TenantHelper.isEnable()) {
|
if (TenantHelper.isEnable()) {
|
||||||
@ -87,6 +92,10 @@ public class QueryUtils {
|
|||||||
return instanceQuery().processInstanceId(processInstanceId);
|
return instanceQuery().processInstanceId(processInstanceId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static ProcessInstanceQuery businessKeyQuery(String businessKey) {
|
||||||
|
return instanceQuery().processInstanceBusinessKey(businessKey);
|
||||||
|
}
|
||||||
|
|
||||||
public static ProcessInstanceQuery instanceQuery(Set<String> processInstanceIds) {
|
public static ProcessInstanceQuery instanceQuery(Set<String> processInstanceIds) {
|
||||||
return instanceQuery().processInstanceIds(processInstanceIds);
|
return instanceQuery().processInstanceIds(processInstanceIds);
|
||||||
}
|
}
|
||||||
@ -103,6 +112,10 @@ public class QueryUtils {
|
|||||||
return hisInstanceQuery().processInstanceId(processInstanceId);
|
return hisInstanceQuery().processInstanceId(processInstanceId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static HistoricProcessInstanceQuery hisBusinessKeyQuery(String businessKey) {
|
||||||
|
return hisInstanceQuery().processInstanceBusinessKey(businessKey);
|
||||||
|
}
|
||||||
|
|
||||||
public static HistoricProcessInstanceQuery hisInstanceQuery(Set<String> processInstanceIds) {
|
public static HistoricProcessInstanceQuery hisInstanceQuery(Set<String> processInstanceIds) {
|
||||||
return hisInstanceQuery().processInstanceIds(processInstanceIds);
|
return hisInstanceQuery().processInstanceIds(processInstanceIds);
|
||||||
}
|
}
|
||||||
@ -145,9 +158,11 @@ public class QueryUtils {
|
|||||||
if (task == null) {
|
if (task == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
ProcessInstance processInstance = QueryUtils.instanceQuery(task.getProcessInstanceId()).singleResult();
|
||||||
TaskVo taskVo = BeanUtil.toBean(task, TaskVo.class);
|
TaskVo taskVo = BeanUtil.toBean(task, TaskVo.class);
|
||||||
|
taskVo.setBusinessKey(processInstance.getBusinessKey());
|
||||||
taskVo.setMultiInstance(WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey()) != null);
|
taskVo.setMultiInstance(WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey()) != null);
|
||||||
String businessStatus = WorkflowUtils.getBusinessStatus(taskVo.getProcessInstanceId());
|
String businessStatus = WorkflowUtils.getBusinessStatus(taskVo.getBusinessKey());
|
||||||
taskVo.setBusinessStatus(businessStatus);
|
taskVo.setBusinessStatus(businessStatus);
|
||||||
return taskVo;
|
return taskVo;
|
||||||
}
|
}
|
||||||
|
@ -1,34 +1,30 @@
|
|||||||
package org.dromara.workflow.utils;
|
package org.dromara.workflow.utils;
|
||||||
|
|
||||||
import cn.hutool.core.bean.BeanUtil;
|
|
||||||
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.collection.CollUtil;
|
||||||
import cn.hutool.core.util.ObjectUtil;
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
||||||
import lombok.AccessLevel;
|
import lombok.AccessLevel;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
|
import org.dromara.common.core.domain.dto.RoleDTO;
|
||||||
import org.dromara.common.core.domain.dto.UserDTO;
|
import org.dromara.common.core.domain.dto.UserDTO;
|
||||||
import org.dromara.common.core.service.UserService;
|
import org.dromara.common.core.service.UserService;
|
||||||
import org.dromara.common.core.utils.SpringUtils;
|
import org.dromara.common.core.utils.SpringUtils;
|
||||||
import org.dromara.common.core.utils.StreamUtils;
|
import org.dromara.common.core.utils.StreamUtils;
|
||||||
import org.dromara.common.core.utils.StringUtils;
|
import org.dromara.common.core.utils.StringUtils;
|
||||||
import org.dromara.common.core.utils.reflect.ReflectUtils;
|
|
||||||
import org.dromara.common.mail.utils.MailUtils;
|
import org.dromara.common.mail.utils.MailUtils;
|
||||||
|
import org.dromara.common.satoken.utils.LoginHelper;
|
||||||
import org.dromara.common.tenant.helper.TenantHelper;
|
import org.dromara.common.tenant.helper.TenantHelper;
|
||||||
import org.dromara.common.websocket.dto.WebSocketMessageDto;
|
import org.dromara.common.websocket.dto.WebSocketMessageDto;
|
||||||
import org.dromara.common.websocket.utils.WebSocketUtils;
|
import org.dromara.common.websocket.utils.WebSocketUtils;
|
||||||
import org.dromara.workflow.common.constant.FlowConstant;
|
import org.dromara.workflow.common.constant.FlowConstant;
|
||||||
import org.dromara.workflow.common.enums.BusinessStatusEnum;
|
|
||||||
import org.dromara.workflow.common.enums.MessageTypeEnum;
|
import org.dromara.workflow.common.enums.MessageTypeEnum;
|
||||||
import org.dromara.workflow.common.enums.TaskStatusEnum;
|
import org.dromara.workflow.common.enums.TaskStatusEnum;
|
||||||
import org.dromara.workflow.domain.ActHiProcinst;
|
|
||||||
import org.dromara.workflow.domain.ActHiTaskinst;
|
import org.dromara.workflow.domain.ActHiTaskinst;
|
||||||
import org.dromara.workflow.domain.vo.MultiInstanceVo;
|
import org.dromara.workflow.domain.vo.MultiInstanceVo;
|
||||||
import org.dromara.workflow.domain.vo.ParticipantVo;
|
import org.dromara.workflow.domain.vo.ParticipantVo;
|
||||||
import org.dromara.workflow.domain.vo.ProcessInstanceVo;
|
|
||||||
import org.dromara.workflow.flowable.cmd.UpdateHiTaskInstCmd;
|
import org.dromara.workflow.flowable.cmd.UpdateHiTaskInstCmd;
|
||||||
import org.dromara.workflow.mapper.ActHiTaskinstMapper;
|
import org.dromara.workflow.mapper.ActHiTaskinstMapper;
|
||||||
import org.dromara.workflow.service.IActHiProcinstService;
|
|
||||||
import org.flowable.bpmn.model.BpmnModel;
|
import org.flowable.bpmn.model.BpmnModel;
|
||||||
import org.flowable.bpmn.model.FlowNode;
|
import org.flowable.bpmn.model.FlowNode;
|
||||||
import org.flowable.common.engine.api.delegate.Expression;
|
import org.flowable.common.engine.api.delegate.Expression;
|
||||||
@ -38,13 +34,12 @@ import org.flowable.engine.impl.bpmn.behavior.ParallelMultiInstanceBehavior;
|
|||||||
import org.flowable.engine.impl.bpmn.behavior.SequentialMultiInstanceBehavior;
|
import org.flowable.engine.impl.bpmn.behavior.SequentialMultiInstanceBehavior;
|
||||||
import org.flowable.identitylink.api.history.HistoricIdentityLink;
|
import org.flowable.identitylink.api.history.HistoricIdentityLink;
|
||||||
import org.flowable.task.api.Task;
|
import org.flowable.task.api.Task;
|
||||||
|
import org.flowable.task.api.TaskQuery;
|
||||||
import org.flowable.task.api.history.HistoricTaskInstance;
|
import org.flowable.task.api.history.HistoricTaskInstance;
|
||||||
import org.flowable.task.service.impl.persistence.entity.TaskEntity;
|
import org.flowable.task.service.impl.persistence.entity.TaskEntity;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
import static org.dromara.workflow.common.constant.FlowConstant.PROCESS_INSTANCE_VO;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 工作流工具
|
* 工作流工具
|
||||||
*
|
*
|
||||||
@ -54,8 +49,6 @@ import static org.dromara.workflow.common.constant.FlowConstant.PROCESS_INSTANCE
|
|||||||
public class WorkflowUtils {
|
public class WorkflowUtils {
|
||||||
|
|
||||||
private static final ProcessEngine PROCESS_ENGINE = SpringUtils.getBean(ProcessEngine.class);
|
private static final ProcessEngine PROCESS_ENGINE = SpringUtils.getBean(ProcessEngine.class);
|
||||||
private static final UserService USER_SERVICE = SpringUtils.getBean(UserService.class);
|
|
||||||
private static final IActHiProcinstService ACT_HI_PROCINST_SERVICE = SpringUtils.getBean(IActHiProcinstService.class);
|
|
||||||
private static final ActHiTaskinstMapper ACT_HI_TASKINST_MAPPER = SpringUtils.getBean(ActHiTaskinstMapper.class);
|
private static final ActHiTaskinstMapper ACT_HI_TASKINST_MAPPER = SpringUtils.getBean(ActHiTaskinstMapper.class);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -133,6 +126,7 @@ public class WorkflowUtils {
|
|||||||
* @param taskId 任务id
|
* @param taskId 任务id
|
||||||
*/
|
*/
|
||||||
public static ParticipantVo getCurrentTaskParticipant(String taskId) {
|
public static ParticipantVo getCurrentTaskParticipant(String taskId) {
|
||||||
|
UserService userService = SpringUtils.getBean(UserService.class);
|
||||||
ParticipantVo participantVo = new ParticipantVo();
|
ParticipantVo participantVo = new ParticipantVo();
|
||||||
List<HistoricIdentityLink> linksForTask = PROCESS_ENGINE.getHistoryService().getHistoricIdentityLinksForTask(taskId);
|
List<HistoricIdentityLink> linksForTask = PROCESS_ENGINE.getHistoryService().getHistoricIdentityLinksForTask(taskId);
|
||||||
Task task = QueryUtils.taskQuery().taskId(taskId).singleResult();
|
Task task = QueryUtils.taskQuery().taskId(taskId).singleResult();
|
||||||
@ -140,10 +134,10 @@ public class WorkflowUtils {
|
|||||||
List<HistoricIdentityLink> groupList = StreamUtils.filter(linksForTask, e -> StringUtils.isNotBlank(e.getGroupId()));
|
List<HistoricIdentityLink> groupList = StreamUtils.filter(linksForTask, e -> StringUtils.isNotBlank(e.getGroupId()));
|
||||||
if (CollUtil.isNotEmpty(groupList)) {
|
if (CollUtil.isNotEmpty(groupList)) {
|
||||||
List<Long> groupIds = StreamUtils.toList(groupList, e -> Long.valueOf(e.getGroupId()));
|
List<Long> groupIds = StreamUtils.toList(groupList, e -> Long.valueOf(e.getGroupId()));
|
||||||
List<Long> userIds = USER_SERVICE.selectUserIdsByRoleIds(groupIds);
|
List<Long> userIds = userService.selectUserIdsByRoleIds(groupIds);
|
||||||
if (CollUtil.isNotEmpty(userIds)) {
|
if (CollUtil.isNotEmpty(userIds)) {
|
||||||
participantVo.setGroupIds(groupIds);
|
participantVo.setGroupIds(groupIds);
|
||||||
List<UserDTO> userList = USER_SERVICE.selectListByIds(userIds);
|
List<UserDTO> userList = userService.selectListByIds(userIds);
|
||||||
if (CollUtil.isNotEmpty(userList)) {
|
if (CollUtil.isNotEmpty(userList)) {
|
||||||
List<Long> userIdList = StreamUtils.toList(userList, UserDTO::getUserId);
|
List<Long> userIdList = StreamUtils.toList(userList, UserDTO::getUserId);
|
||||||
List<String> nickNames = StreamUtils.toList(userList, UserDTO::getNickName);
|
List<String> nickNames = StreamUtils.toList(userList, UserDTO::getNickName);
|
||||||
@ -162,7 +156,7 @@ public class WorkflowUtils {
|
|||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
List<UserDTO> userList = USER_SERVICE.selectListByIds(userIdList);
|
List<UserDTO> userList = userService.selectListByIds(userIdList);
|
||||||
if (CollUtil.isNotEmpty(userList)) {
|
if (CollUtil.isNotEmpty(userList)) {
|
||||||
List<Long> userIds = StreamUtils.toList(userList, UserDTO::getUserId);
|
List<Long> userIds = StreamUtils.toList(userList, UserDTO::getUserId);
|
||||||
List<String> nickNames = StreamUtils.toList(userList, UserDTO::getNickName);
|
List<String> nickNames = StreamUtils.toList(userList, UserDTO::getNickName);
|
||||||
@ -225,70 +219,11 @@ public class WorkflowUtils {
|
|||||||
/**
|
/**
|
||||||
* 获取当前流程状态
|
* 获取当前流程状态
|
||||||
*
|
*
|
||||||
* @param processInstanceId 流程实例id
|
|
||||||
*/
|
|
||||||
public static String getBusinessStatus(String processInstanceId) {
|
|
||||||
HistoricProcessInstance historicProcessInstance = QueryUtils.hisInstanceQuery(processInstanceId).singleResult();
|
|
||||||
return historicProcessInstance.getBusinessStatus();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 设置流程实例对象
|
|
||||||
*
|
|
||||||
* @param obj 业务对象
|
|
||||||
* @param businessKey 业务id
|
* @param businessKey 业务id
|
||||||
*/
|
*/
|
||||||
public static void setProcessInstanceVo(Object obj, String businessKey) {
|
public static String getBusinessStatus(String businessKey) {
|
||||||
if (StringUtils.isBlank(businessKey) || obj == null) {
|
HistoricProcessInstance historicProcessInstance = QueryUtils.hisBusinessKeyQuery(businessKey).singleResult();
|
||||||
return;
|
return historicProcessInstance.getBusinessStatus();
|
||||||
}
|
|
||||||
ActHiProcinst actHiProcinst = ACT_HI_PROCINST_SERVICE.selectByBusinessKey(businessKey);
|
|
||||||
if (actHiProcinst == null) {
|
|
||||||
ProcessInstanceVo processInstanceVo = new ProcessInstanceVo();
|
|
||||||
processInstanceVo.setBusinessStatus(BusinessStatusEnum.DRAFT.getStatus());
|
|
||||||
ReflectUtils.invokeSetter(obj, PROCESS_INSTANCE_VO, processInstanceVo);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
ProcessInstanceVo processInstanceVo = BeanUtil.toBean(actHiProcinst, ProcessInstanceVo.class);
|
|
||||||
processInstanceVo.setBusinessStatusName(BusinessStatusEnum.findByStatus(processInstanceVo.getBusinessStatus()));
|
|
||||||
ReflectUtils.invokeSetter(obj, PROCESS_INSTANCE_VO, processInstanceVo);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 设置流程实例对象
|
|
||||||
*
|
|
||||||
* @param obj 业务对象
|
|
||||||
* @param idList 业务id
|
|
||||||
* @param fieldName 主键属性名称
|
|
||||||
*/
|
|
||||||
public static void setProcessInstanceListVo(Object obj, List<String> idList, String fieldName) {
|
|
||||||
if (CollUtil.isEmpty(idList) || obj == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
List<ActHiProcinst> actHiProcinstList = ACT_HI_PROCINST_SERVICE.selectByBusinessKeyIn(idList);
|
|
||||||
if (obj instanceof Collection<?> collection) {
|
|
||||||
for (Object o : collection) {
|
|
||||||
String fieldValue = ReflectUtils.invokeGetter(o, fieldName).toString();
|
|
||||||
if (CollUtil.isEmpty(actHiProcinstList)) {
|
|
||||||
ProcessInstanceVo processInstanceVo = new ProcessInstanceVo();
|
|
||||||
processInstanceVo.setBusinessStatus(BusinessStatusEnum.DRAFT.getStatus());
|
|
||||||
processInstanceVo.setBusinessStatusName(BusinessStatusEnum.findByStatus(processInstanceVo.getBusinessStatus()));
|
|
||||||
ReflectUtils.invokeSetter(o, PROCESS_INSTANCE_VO, processInstanceVo);
|
|
||||||
} else {
|
|
||||||
ActHiProcinst actHiProcinst = actHiProcinstList.stream().filter(e -> e.getBusinessKey().equals(fieldValue)).findFirst().orElse(null);
|
|
||||||
if (ObjectUtil.isNotEmpty(actHiProcinst)) {
|
|
||||||
ProcessInstanceVo processInstanceVo = BeanUtil.toBean(actHiProcinst, ProcessInstanceVo.class);
|
|
||||||
processInstanceVo.setBusinessStatusName(BusinessStatusEnum.findByStatus(processInstanceVo.getBusinessStatus()));
|
|
||||||
ReflectUtils.invokeSetter(o, PROCESS_INSTANCE_VO, processInstanceVo);
|
|
||||||
} else {
|
|
||||||
ProcessInstanceVo processInstanceVo = new ProcessInstanceVo();
|
|
||||||
processInstanceVo.setBusinessStatus(BusinessStatusEnum.DRAFT.getStatus());
|
|
||||||
processInstanceVo.setBusinessStatusName(BusinessStatusEnum.findByStatus(processInstanceVo.getBusinessStatus()));
|
|
||||||
ReflectUtils.invokeSetter(o, PROCESS_INSTANCE_VO, processInstanceVo);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -300,6 +235,7 @@ public class WorkflowUtils {
|
|||||||
* @param message 消息内容,为空则发送默认配置的消息内容
|
* @param message 消息内容,为空则发送默认配置的消息内容
|
||||||
*/
|
*/
|
||||||
public static void sendMessage(List<Task> list, String name, List<String> messageType, String message) {
|
public static void sendMessage(List<Task> list, String name, List<String> messageType, String message) {
|
||||||
|
UserService userService = SpringUtils.getBean(UserService.class);
|
||||||
Set<Long> userIds = new HashSet<>();
|
Set<Long> userIds = new HashSet<>();
|
||||||
if (StringUtils.isBlank(message)) {
|
if (StringUtils.isBlank(message)) {
|
||||||
message = "有新的【" + name + "】单据已经提交至您的待办,请您及时处理。";
|
message = "有新的【" + name + "】单据已经提交至您的待办,请您及时处理。";
|
||||||
@ -307,7 +243,7 @@ public class WorkflowUtils {
|
|||||||
for (Task t : list) {
|
for (Task t : list) {
|
||||||
ParticipantVo taskParticipant = WorkflowUtils.getCurrentTaskParticipant(t.getId());
|
ParticipantVo taskParticipant = WorkflowUtils.getCurrentTaskParticipant(t.getId());
|
||||||
if (CollUtil.isNotEmpty(taskParticipant.getGroupIds())) {
|
if (CollUtil.isNotEmpty(taskParticipant.getGroupIds())) {
|
||||||
List<Long> userIdList = USER_SERVICE.selectUserIdsByRoleIds(taskParticipant.getGroupIds());
|
List<Long> userIdList = userService.selectUserIdsByRoleIds(taskParticipant.getGroupIds());
|
||||||
if (CollUtil.isNotEmpty(userIdList)) {
|
if (CollUtil.isNotEmpty(userIdList)) {
|
||||||
userIds.addAll(userIdList);
|
userIds.addAll(userIdList);
|
||||||
}
|
}
|
||||||
@ -318,7 +254,7 @@ public class WorkflowUtils {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (CollUtil.isNotEmpty(userIds)) {
|
if (CollUtil.isNotEmpty(userIds)) {
|
||||||
List<UserDTO> userList = USER_SERVICE.selectListByIds(new ArrayList<>(userIds));
|
List<UserDTO> userList = userService.selectListByIds(new ArrayList<>(userIds));
|
||||||
for (String code : messageType) {
|
for (String code : messageType) {
|
||||||
MessageTypeEnum messageTypeEnum = MessageTypeEnum.getByCode(code);
|
MessageTypeEnum messageTypeEnum = MessageTypeEnum.getByCode(code);
|
||||||
if (ObjectUtil.isNotEmpty(messageTypeEnum)) {
|
if (ObjectUtil.isNotEmpty(messageTypeEnum)) {
|
||||||
@ -340,4 +276,22 @@ public class WorkflowUtils {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据任务id查询 当前用户的任务,检查 当前人员 是否是该 taskId 的办理人
|
||||||
|
*
|
||||||
|
* @param taskId 任务id
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
public static Task getTaskByCurrentUser(String taskId) {
|
||||||
|
TaskQuery taskQuery = QueryUtils.taskQuery();
|
||||||
|
taskQuery.taskId(taskId).taskCandidateOrAssigned(String.valueOf(LoginHelper.getUserId()));
|
||||||
|
|
||||||
|
List<RoleDTO> roles = LoginHelper.getLoginUser().getRoles();
|
||||||
|
if (CollUtil.isNotEmpty(roles)) {
|
||||||
|
List<String> groupIds = StreamUtils.toList(roles, e -> String.valueOf(e.getRoleId()));
|
||||||
|
taskQuery.taskCandidateGroupIn(groupIds);
|
||||||
|
}
|
||||||
|
return taskQuery.singleResult();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Binary file not shown.
@ -27,6 +27,7 @@ create table test_leave
|
|||||||
end_date datetime not null comment '结束时间',
|
end_date datetime not null comment '结束时间',
|
||||||
leave_days int(10) not null comment '请假天数',
|
leave_days int(10) not null comment '请假天数',
|
||||||
remark varchar(255) null comment '请假原因',
|
remark varchar(255) null comment '请假原因',
|
||||||
|
status varchar(255) null comment '状态',
|
||||||
create_dept bigint null comment '创建部门',
|
create_dept bigint null comment '创建部门',
|
||||||
create_by bigint null comment '创建者',
|
create_by bigint null comment '创建者',
|
||||||
create_time datetime null comment '创建时间',
|
create_time datetime null comment '创建时间',
|
||||||
@ -112,7 +113,7 @@ create table wf_form_manage
|
|||||||
)
|
)
|
||||||
comment '表单管理';
|
comment '表单管理';
|
||||||
|
|
||||||
insert into wf_form_manage(id, form_name, form_type, router, remark, tenant_id, create_dept, create_by, create_time, update_by, update_time) VALUES (1, '请假申请', 'static', '/demo/leaveEdit/index', NULL, '000000', 103, 1, sysdate(), 1, sysdate());
|
insert into wf_form_manage(id, form_name, form_type, router, remark, tenant_id, create_dept, create_by, create_time, update_by, update_time) VALUES (1, '请假申请', 'static', '/workflow/leaveEdit/index', NULL, '000000', 103, 1, sysdate(), 1, sysdate());
|
||||||
|
|
||||||
create table wf_node_config
|
create table wf_node_config
|
||||||
(
|
(
|
||||||
@ -134,12 +135,12 @@ create table wf_node_config
|
|||||||
comment '节点配置';
|
comment '节点配置';
|
||||||
|
|
||||||
|
|
||||||
INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11638, '请假申请', 5, 1, 'leave', 'workflow/leave/index', 1, 0, 'C', '0', '0', 'demo:leave:list', '#', 103, 1, sysdate(), NULL, NULL, '请假申请菜单');
|
INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11638, '请假申请', 5, 1, 'leave', 'workflow/leave/index', 1, 0, 'C', '0', '0', 'workflow:leave:list', '#', 103, 1, sysdate(), NULL, NULL, '请假申请菜单');
|
||||||
INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11639, '请假申请查询', 11638, 1, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:query', '#', 103, 1, sysdate(), NULL, NULL, '');
|
INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11639, '请假申请查询', 11638, 1, '#', '', 1, 0, 'F', '0', '0', 'workflow:leave:query', '#', 103, 1, sysdate(), NULL, NULL, '');
|
||||||
INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11640, '请假申请新增', 11638, 2, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:add', '#', 103, 1, sysdate(), NULL, NULL, '');
|
INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11640, '请假申请新增', 11638, 2, '#', '', 1, 0, 'F', '0', '0', 'workflow:leave:add', '#', 103, 1, sysdate(), NULL, NULL, '');
|
||||||
INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11641, '请假申请修改', 11638, 3, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:edit', '#', 103, 1, sysdate(), NULL, NULL, '');
|
INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11641, '请假申请修改', 11638, 3, '#', '', 1, 0, 'F', '0', '0', 'workflow:leave:edit', '#', 103, 1, sysdate(), NULL, NULL, '');
|
||||||
INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11642, '请假申请删除', 11638, 4, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:remove', '#', 103, 1, sysdate(), NULL, NULL, '');
|
INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11642, '请假申请删除', 11638, 4, '#', '', 1, 0, 'F', '0', '0', 'workflow:leave:remove', '#', 103, 1, sysdate(), NULL, NULL, '');
|
||||||
INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11643, '请假申请导出', 11638, 5, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:export', '#', 103, 1, sysdate(), NULL, NULL, '');
|
INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11643, '请假申请导出', 11638, 5, '#', '', 1, 0, 'F', '0', '0', 'workflow:leave:export', '#', 103, 1, sysdate(), NULL, NULL, '');
|
||||||
|
|
||||||
INSERT INTO sys_dict_type(dict_id, tenant_id, dict_name, dict_type, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (13, '000000', '业务状态', 'wf_business_status', 103, 1, sysdate(), NULL, NULL, '业务状态列表');
|
INSERT INTO sys_dict_type(dict_id, tenant_id, dict_name, dict_type, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (13, '000000', '业务状态', 'wf_business_status', 103, 1, sysdate(), NULL, NULL, '业务状态列表');
|
||||||
INSERT INTO sys_dict_type(dict_id, tenant_id, dict_name, dict_type, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (14, '000000', '表单类型', 'wf_form_type', 103, 1, sysdate(), NULL, NULL, '表单类型列表');
|
INSERT INTO sys_dict_type(dict_id, tenant_id, dict_name, dict_type, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (14, '000000', '表单类型', 'wf_form_type', 103, 1, sysdate(), NULL, NULL, '表单类型列表');
|
||||||
|
@ -30,6 +30,7 @@ create table TEST_LEAVE
|
|||||||
END_DATE DATE,
|
END_DATE DATE,
|
||||||
LEAVE_DAYS NUMBER(10),
|
LEAVE_DAYS NUMBER(10),
|
||||||
REMARK VARCHAR2(255),
|
REMARK VARCHAR2(255),
|
||||||
|
STATUS VARCHAR2(255),
|
||||||
CREATE_DEPT NUMBER(20),
|
CREATE_DEPT NUMBER(20),
|
||||||
CREATE_BY NUMBER(20),
|
CREATE_BY NUMBER(20),
|
||||||
CREATE_TIME DATE,
|
CREATE_TIME DATE,
|
||||||
@ -45,6 +46,7 @@ comment on column TEST_LEAVE.START_DATE is '开始时间';
|
|||||||
comment on column TEST_LEAVE.END_DATE is '结束时间';
|
comment on column TEST_LEAVE.END_DATE is '结束时间';
|
||||||
comment on column TEST_LEAVE.LEAVE_DAYS is '请假天数';
|
comment on column TEST_LEAVE.LEAVE_DAYS is '请假天数';
|
||||||
comment on column TEST_LEAVE.REMARK is '请假原因';
|
comment on column TEST_LEAVE.REMARK is '请假原因';
|
||||||
|
comment on column TEST_LEAVE.STATUS is '状态';
|
||||||
comment on column TEST_LEAVE.CREATE_DEPT is '创建部门';
|
comment on column TEST_LEAVE.CREATE_DEPT is '创建部门';
|
||||||
comment on column TEST_LEAVE.CREATE_BY is '创建者';
|
comment on column TEST_LEAVE.CREATE_BY is '创建者';
|
||||||
comment on column TEST_LEAVE.CREATE_TIME is '创建时间';
|
comment on column TEST_LEAVE.CREATE_TIME is '创建时间';
|
||||||
@ -182,7 +184,7 @@ comment on column WF_FORM_MANAGE.CREATE_TIME is '创建时间';
|
|||||||
comment on column WF_FORM_MANAGE.UPDATE_BY is '更新者';
|
comment on column WF_FORM_MANAGE.UPDATE_BY is '更新者';
|
||||||
comment on column WF_FORM_MANAGE.UPDATE_TIME is '更新时间';
|
comment on column WF_FORM_MANAGE.UPDATE_TIME is '更新时间';
|
||||||
|
|
||||||
insert into wf_form_manage(id, form_name, form_type, router, remark, tenant_id, create_dept, create_by, create_time, update_by, update_time) VALUES (1, '请假申请', 'static', '/demo/leaveEdit/index', NULL, '000000', 103, 1, sysdate, 1, sysdate);
|
insert into wf_form_manage(id, form_name, form_type, router, remark, tenant_id, create_dept, create_by, create_time, update_by, update_time) VALUES (1, '请假申请', 'static', '/workflow/leaveEdit/index', NULL, '000000', 103, 1, sysdate, 1, sysdate);
|
||||||
|
|
||||||
create table WF_NODE_CONFIG
|
create table WF_NODE_CONFIG
|
||||||
(
|
(
|
||||||
@ -218,12 +220,12 @@ comment on column WF_NODE_CONFIG.CREATE_TIME is '创建时间';
|
|||||||
comment on column WF_NODE_CONFIG.UPDATE_BY is '更新者';
|
comment on column WF_NODE_CONFIG.UPDATE_BY is '更新者';
|
||||||
comment on column WF_NODE_CONFIG.UPDATE_TIME is '更新时间';
|
comment on column WF_NODE_CONFIG.UPDATE_TIME is '更新时间';
|
||||||
|
|
||||||
INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11638, '请假申请', 5, 1, 'leave', 'workflow/leave/index', 1, 0, 'C', '0', '0', 'demo:leave:list', '#', 103, 1, sysdate, NULL, NULL, '请假申请菜单');
|
INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11638, '请假申请', 5, 1, 'leave', 'workflow/leave/index', 1, 0, 'C', '0', '0', 'workflow:leave:list', '#', 103, 1, sysdate, NULL, NULL, '请假申请菜单');
|
||||||
INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11639, '请假申请查询', 11638, 1, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:query', '#', 103, 1, sysdate, NULL, NULL, '');
|
INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11639, '请假申请查询', 11638, 1, '#', '', 1, 0, 'F', '0', '0', 'workflow:leave:query', '#', 103, 1, sysdate, NULL, NULL, '');
|
||||||
INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11640, '请假申请新增', 11638, 2, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:add', '#', 103, 1, sysdate, NULL, NULL, '');
|
INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11640, '请假申请新增', 11638, 2, '#', '', 1, 0, 'F', '0', '0', 'workflow:leave:add', '#', 103, 1, sysdate, NULL, NULL, '');
|
||||||
INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11641, '请假申请修改', 11638, 3, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:edit', '#', 103, 1, sysdate, NULL, NULL, '');
|
INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11641, '请假申请修改', 11638, 3, '#', '', 1, 0, 'F', '0', '0', 'workflow:leave:edit', '#', 103, 1, sysdate, NULL, NULL, '');
|
||||||
INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11642, '请假申请删除', 11638, 4, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:remove', '#', 103, 1, sysdate, NULL, NULL, '');
|
INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11642, '请假申请删除', 11638, 4, '#', '', 1, 0, 'F', '0', '0', 'workflow:leave:remove', '#', 103, 1, sysdate, NULL, NULL, '');
|
||||||
INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11643, '请假申请导出', 11638, 5, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:export', '#', 103, 1, sysdate, NULL, NULL, '');
|
INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11643, '请假申请导出', 11638, 5, '#', '', 1, 0, 'F', '0', '0', 'workflow:leave:export', '#', 103, 1, sysdate, NULL, NULL, '');
|
||||||
|
|
||||||
INSERT INTO sys_dict_type(dict_id, tenant_id, dict_name, dict_type, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (13, '000000', '业务状态', 'wf_business_status', 103, 1, sysdate, NULL, NULL, '业务状态列表');
|
INSERT INTO sys_dict_type(dict_id, tenant_id, dict_name, dict_type, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (13, '000000', '业务状态', 'wf_business_status', 103, 1, sysdate, NULL, NULL, '业务状态列表');
|
||||||
INSERT INTO sys_dict_type(dict_id, tenant_id, dict_name, dict_type, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (14, '000000', '表单类型', 'wf_form_type', 103, 1, sysdate, NULL, NULL, '表单类型列表');
|
INSERT INTO sys_dict_type(dict_id, tenant_id, dict_name, dict_type, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (14, '000000', '表单类型', 'wf_form_type', 103, 1, sysdate, NULL, NULL, '表单类型列表');
|
||||||
|
@ -443,7 +443,6 @@ insert into sys_menu values('107', '通知公告', '1', '8', 'notice',
|
|||||||
insert into sys_menu values('108', '日志管理', '1', '9', 'log', '', '', 1, 0, 'M', '0', '0', '', 'log', 103, 1, sysdate, null, null, '日志管理菜单');
|
insert into sys_menu values('108', '日志管理', '1', '9', 'log', '', '', 1, 0, 'M', '0', '0', '', 'log', 103, 1, sysdate, null, null, '日志管理菜单');
|
||||||
insert into sys_menu values('109', '在线用户', '2', '1', 'online', 'monitor/online/index', '', 1, 0, 'C', '0', '0', 'monitor:online:list', 'online', 103, 1, sysdate, null, null, '在线用户菜单');
|
insert into sys_menu values('109', '在线用户', '2', '1', 'online', 'monitor/online/index', '', 1, 0, 'C', '0', '0', 'monitor:online:list', 'online', 103, 1, sysdate, null, null, '在线用户菜单');
|
||||||
insert into sys_menu values('113', '缓存监控', '2', '5', 'cache', 'monitor/cache/index', '', 1, 0, 'C', '0', '0', 'monitor:cache:list', 'redis', 103, 1, sysdate, null, null, '缓存监控菜单');
|
insert into sys_menu values('113', '缓存监控', '2', '5', 'cache', 'monitor/cache/index', '', 1, 0, 'C', '0', '0', 'monitor:cache:list', 'redis', 103, 1, sysdate, null, null, '缓存监控菜单');
|
||||||
insert into sys_menu values('114', '表单构建', '3', '1', 'build', 'tool/build/index', '', 1, 0, 'C', '0', '0', 'tool:build:list', 'build', 103, 1, sysdate, null, null, '表单构建菜单');
|
|
||||||
insert into sys_menu values('115', '代码生成', '3', '2', 'gen', 'tool/gen/index', '', 1, 0, 'C', '0', '0', 'tool:gen:list', 'code', 103, 1, sysdate, null, null, '代码生成菜单');
|
insert into sys_menu values('115', '代码生成', '3', '2', 'gen', 'tool/gen/index', '', 1, 0, 'C', '0', '0', 'tool:gen:list', 'code', 103, 1, sysdate, null, null, '代码生成菜单');
|
||||||
insert into sys_menu values('121', '租户管理', '6', '1', 'tenant', 'system/tenant/index', '', 1, 0, 'C', '0', '0', 'system:tenant:list', 'list', 103, 1, sysdate, null, null, '租户管理菜单');
|
insert into sys_menu values('121', '租户管理', '6', '1', 'tenant', 'system/tenant/index', '', 1, 0, 'C', '0', '0', 'system:tenant:list', 'list', 103, 1, sysdate, null, null, '租户管理菜单');
|
||||||
insert into sys_menu values('122', '租户套餐管理', '6', '2', 'tenantPackage', 'system/tenantPackage/index', '', 1, 0, 'C', '0', '0', 'system:tenantPackage:list', 'form', 103, 1, sysdate, null, null, '租户套餐管理菜单');
|
insert into sys_menu values('122', '租户套餐管理', '6', '2', 'tenantPackage', 'system/tenantPackage/index', '', 1, 0, 'C', '0', '0', 'system:tenantPackage:list', 'form', 103, 1, sysdate, null, null, '租户套餐管理菜单');
|
||||||
|
@ -29,6 +29,7 @@ create table test_leave
|
|||||||
end_date timestamp,
|
end_date timestamp,
|
||||||
leave_days bigint,
|
leave_days bigint,
|
||||||
remark varchar(255),
|
remark varchar(255),
|
||||||
|
status varchar(255),
|
||||||
create_dept bigint,
|
create_dept bigint,
|
||||||
create_by bigint,
|
create_by bigint,
|
||||||
create_time timestamp,
|
create_time timestamp,
|
||||||
@ -49,6 +50,8 @@ comment on column test_leave.end_date is '结束时间';
|
|||||||
|
|
||||||
comment on column test_leave.remark is '请假原因';
|
comment on column test_leave.remark is '请假原因';
|
||||||
|
|
||||||
|
comment on column test_leave.status is '状态';
|
||||||
|
|
||||||
comment on column test_leave.create_dept is '创建部门';
|
comment on column test_leave.create_dept is '创建部门';
|
||||||
|
|
||||||
comment on column test_leave.create_by is '创建者';
|
comment on column test_leave.create_by is '创建者';
|
||||||
@ -251,7 +254,7 @@ comment on column wf_form_manage.update_by is '修改者';
|
|||||||
|
|
||||||
comment on column wf_form_manage.update_time is '修改时间';
|
comment on column wf_form_manage.update_time is '修改时间';
|
||||||
|
|
||||||
insert into wf_form_manage(id, form_name, form_type, router, remark, tenant_id, create_dept, create_by, create_time, update_by, update_time) VALUES (1, '请假申请', 'static', '/demo/leaveEdit/index', NULL, '000000', 103, 1, now(), 1, now());
|
insert into wf_form_manage(id, form_name, form_type, router, remark, tenant_id, create_dept, create_by, create_time, update_by, update_time) VALUES (1, '请假申请', 'static', '/workflow/leaveEdit/index', NULL, '000000', 103, 1, now(), 1, now());
|
||||||
|
|
||||||
create table wf_node_config
|
create table wf_node_config
|
||||||
(
|
(
|
||||||
@ -300,12 +303,12 @@ comment on column wf_node_config.update_by is '修改者';
|
|||||||
|
|
||||||
comment on column wf_node_config.update_time is '修改时间';
|
comment on column wf_node_config.update_time is '修改时间';
|
||||||
|
|
||||||
INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11638, '请假申请', 5, 1, 'leave', 'workflow/leave/index', 1, 0, 'C', '0', '0', 'demo:leave:list', '#', 103, 1, now(), NULL, NULL, '请假申请菜单');
|
INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11638, '请假申请', 5, 1, 'leave', 'workflow/leave/index', 1, 0, 'C', '0', '0', 'workflow:leave:list', '#', 103, 1, now(), NULL, NULL, '请假申请菜单');
|
||||||
INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11639, '请假申请查询', 11638, 1, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:query', '#', 103, 1, now(), NULL, NULL, '');
|
INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11639, '请假申请查询', 11638, 1, '#', '', 1, 0, 'F', '0', '0', 'workflow:leave:query', '#', 103, 1, now(), NULL, NULL, '');
|
||||||
INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11640, '请假申请新增', 11638, 2, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:add', '#', 103, 1, now(), NULL, NULL, '');
|
INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11640, '请假申请新增', 11638, 2, '#', '', 1, 0, 'F', '0', '0', 'workflow:leave:add', '#', 103, 1, now(), NULL, NULL, '');
|
||||||
INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11641, '请假申请修改', 11638, 3, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:edit', '#', 103, 1, now(), NULL, NULL, '');
|
INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11641, '请假申请修改', 11638, 3, '#', '', 1, 0, 'F', '0', '0', 'workflow:leave:edit', '#', 103, 1, now(), NULL, NULL, '');
|
||||||
INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11642, '请假申请删除', 11638, 4, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:remove', '#', 103, 1, now(), NULL, NULL, '');
|
INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11642, '请假申请删除', 11638, 4, '#', '', 1, 0, 'F', '0', '0', 'workflow:leave:remove', '#', 103, 1, now(), NULL, NULL, '');
|
||||||
INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11643, '请假申请导出', 11638, 5, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:export', '#', 103, 1, now(), NULL, NULL, '');
|
INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11643, '请假申请导出', 11638, 5, '#', '', 1, 0, 'F', '0', '0', 'workflow:leave:export', '#', 103, 1, now(), NULL, NULL, '');
|
||||||
|
|
||||||
INSERT INTO sys_dict_type(dict_id, tenant_id, dict_name, dict_type, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (13, '000000', '业务状态', 'wf_business_status', 103, 1, now(), NULL, NULL, '业务状态列表');
|
INSERT INTO sys_dict_type(dict_id, tenant_id, dict_name, dict_type, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (13, '000000', '业务状态', 'wf_business_status', 103, 1, now(), NULL, NULL, '业务状态列表');
|
||||||
INSERT INTO sys_dict_type(dict_id, tenant_id, dict_name, dict_type, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (14, '000000', '表单类型', 'wf_form_type', 103, 1, now(), NULL, NULL, '表单类型列表');
|
INSERT INTO sys_dict_type(dict_id, tenant_id, dict_name, dict_type, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (14, '000000', '表单类型', 'wf_form_type', 103, 1, now(), NULL, NULL, '表单类型列表');
|
||||||
|
@ -444,7 +444,6 @@ insert into sys_menu values('107', '通知公告', '1', '8', 'notice',
|
|||||||
insert into sys_menu values('108', '日志管理', '1', '9', 'log', '', '', '1', '0', 'M', '0', '0', '', 'log', 103, 1, now(), null, null, '日志管理菜单');
|
insert into sys_menu values('108', '日志管理', '1', '9', 'log', '', '', '1', '0', 'M', '0', '0', '', 'log', 103, 1, now(), null, null, '日志管理菜单');
|
||||||
insert into sys_menu values('109', '在线用户', '2', '1', 'online', 'monitor/online/index', '', '1', '0', 'C', '0', '0', 'monitor:online:list', 'online', 103, 1, now(), null, null, '在线用户菜单');
|
insert into sys_menu values('109', '在线用户', '2', '1', 'online', 'monitor/online/index', '', '1', '0', 'C', '0', '0', 'monitor:online:list', 'online', 103, 1, now(), null, null, '在线用户菜单');
|
||||||
insert into sys_menu values('113', '缓存监控', '2', '5', 'cache', 'monitor/cache/index', '', '1', '0', 'C', '0', '0', 'monitor:cache:list', 'redis', 103, 1, now(), null, null, '缓存监控菜单');
|
insert into sys_menu values('113', '缓存监控', '2', '5', 'cache', 'monitor/cache/index', '', '1', '0', 'C', '0', '0', 'monitor:cache:list', 'redis', 103, 1, now(), null, null, '缓存监控菜单');
|
||||||
insert into sys_menu values('114', '表单构建', '3', '1', 'build', 'tool/build/index', '', '1', '0', 'C', '0', '0', 'tool:build:list', 'build', 103, 1, now(), null, null, '表单构建菜单');
|
|
||||||
insert into sys_menu values('115', '代码生成', '3', '2', 'gen', 'tool/gen/index', '', '1', '0', 'C', '0', '0', 'tool:gen:list', 'code', 103, 1, now(), null, null, '代码生成菜单');
|
insert into sys_menu values('115', '代码生成', '3', '2', 'gen', 'tool/gen/index', '', '1', '0', 'C', '0', '0', 'tool:gen:list', 'code', 103, 1, now(), null, null, '代码生成菜单');
|
||||||
insert into sys_menu values('121', '租户管理', '6', '1', 'tenant', 'system/tenant/index', '', '1', '0', 'C', '0', '0', 'system:tenant:list', 'list', 103, 1, now(), null, null, '租户管理菜单');
|
insert into sys_menu values('121', '租户管理', '6', '1', 'tenant', 'system/tenant/index', '', '1', '0', 'C', '0', '0', 'system:tenant:list', 'list', 103, 1, now(), null, null, '租户管理菜单');
|
||||||
insert into sys_menu values('122', '租户套餐管理', '6', '2', 'tenantPackage', 'system/tenantPackage/index', '', '1', '0', 'C', '0', '0', 'system:tenantPackage:list', 'form', 103, 1, now(), null, null, '租户套餐管理菜单');
|
insert into sys_menu values('122', '租户套餐管理', '6', '2', 'tenantPackage', 'system/tenantPackage/index', '', '1', '0', 'C', '0', '0', 'system:tenantPackage:list', 'form', 103, 1, now(), null, null, '租户套餐管理菜单');
|
||||||
|
@ -278,7 +278,6 @@ insert into sys_menu values('107', '通知公告', '1', '8', 'notice',
|
|||||||
insert into sys_menu values('108', '日志管理', '1', '9', 'log', '', '', 1, 0, 'M', '0', '0', '', 'log', 103, 1, sysdate(), null, null, '日志管理菜单');
|
insert into sys_menu values('108', '日志管理', '1', '9', 'log', '', '', 1, 0, 'M', '0', '0', '', 'log', 103, 1, sysdate(), null, null, '日志管理菜单');
|
||||||
insert into sys_menu values('109', '在线用户', '2', '1', 'online', 'monitor/online/index', '', 1, 0, 'C', '0', '0', 'monitor:online:list', 'online', 103, 1, sysdate(), null, null, '在线用户菜单');
|
insert into sys_menu values('109', '在线用户', '2', '1', 'online', 'monitor/online/index', '', 1, 0, 'C', '0', '0', 'monitor:online:list', 'online', 103, 1, sysdate(), null, null, '在线用户菜单');
|
||||||
insert into sys_menu values('113', '缓存监控', '2', '5', 'cache', 'monitor/cache/index', '', 1, 0, 'C', '0', '0', 'monitor:cache:list', 'redis', 103, 1, sysdate(), null, null, '缓存监控菜单');
|
insert into sys_menu values('113', '缓存监控', '2', '5', 'cache', 'monitor/cache/index', '', 1, 0, 'C', '0', '0', 'monitor:cache:list', 'redis', 103, 1, sysdate(), null, null, '缓存监控菜单');
|
||||||
insert into sys_menu values('114', '表单构建', '3', '1', 'build', 'tool/build/index', '', 1, 0, 'C', '0', '0', 'tool:build:list', 'build', 103, 1, sysdate(), null, null, '表单构建菜单');
|
|
||||||
insert into sys_menu values('115', '代码生成', '3', '2', 'gen', 'tool/gen/index', '', 1, 0, 'C', '0', '0', 'tool:gen:list', 'code', 103, 1, sysdate(), null, null, '代码生成菜单');
|
insert into sys_menu values('115', '代码生成', '3', '2', 'gen', 'tool/gen/index', '', 1, 0, 'C', '0', '0', 'tool:gen:list', 'code', 103, 1, sysdate(), null, null, '代码生成菜单');
|
||||||
insert into sys_menu values('121', '租户管理', '6', '1', 'tenant', 'system/tenant/index', '', 1, 0, 'C', '0', '0', 'system:tenant:list', 'list', 103, 1, sysdate(), null, null, '租户管理菜单');
|
insert into sys_menu values('121', '租户管理', '6', '1', 'tenant', 'system/tenant/index', '', 1, 0, 'C', '0', '0', 'system:tenant:list', 'list', 103, 1, sysdate(), null, null, '租户管理菜单');
|
||||||
insert into sys_menu values('122', '租户套餐管理', '6', '2', 'tenantPackage', 'system/tenantPackage/index', '', 1, 0, 'C', '0', '0', 'system:tenantPackage:list', 'form', 103, 1, sysdate(), null, null, '租户套餐管理菜单');
|
insert into sys_menu values('122', '租户套餐管理', '6', '2', 'tenantPackage', 'system/tenantPackage/index', '', 1, 0, 'C', '0', '0', 'system:tenantPackage:list', 'form', 103, 1, sysdate(), null, null, '租户套餐管理菜单');
|
||||||
|
@ -28,6 +28,7 @@ create table test_leave
|
|||||||
end_date datetime2 not null,
|
end_date datetime2 not null,
|
||||||
leave_days int not null,
|
leave_days int not null,
|
||||||
remark nvarchar(255),
|
remark nvarchar(255),
|
||||||
|
status nvarchar(255),
|
||||||
create_dept bigint,
|
create_dept bigint,
|
||||||
create_by bigint,
|
create_by bigint,
|
||||||
create_time datetime2,
|
create_time datetime2,
|
||||||
@ -61,6 +62,9 @@ go
|
|||||||
exec sp_addextendedproperty 'MS_Description', N'请假原因', 'SCHEMA', 'dbo', 'TABLE', 'test_leave', 'COLUMN', 'remark'
|
exec sp_addextendedproperty 'MS_Description', N'请假原因', 'SCHEMA', 'dbo', 'TABLE', 'test_leave', 'COLUMN', 'remark'
|
||||||
go
|
go
|
||||||
|
|
||||||
|
exec sp_addextendedproperty 'MS_Description', N'状态', 'SCHEMA', 'dbo', 'TABLE', 'test_leave', 'COLUMN', 'status'
|
||||||
|
go
|
||||||
|
|
||||||
exec sp_addextendedproperty 'MS_Description', N'创建部门', 'SCHEMA', 'dbo', 'TABLE', 'test_leave', 'COLUMN',
|
exec sp_addextendedproperty 'MS_Description', N'创建部门', 'SCHEMA', 'dbo', 'TABLE', 'test_leave', 'COLUMN',
|
||||||
'create_dept'
|
'create_dept'
|
||||||
go
|
go
|
||||||
@ -221,6 +225,7 @@ create table wf_definition_config
|
|||||||
unique,
|
unique,
|
||||||
process_key nvarchar(255) not null,
|
process_key nvarchar(255) not null,
|
||||||
version bigint not null,
|
version bigint not null,
|
||||||
|
remark nvarchar(500) DEFAULT ('') null,
|
||||||
tenant_id nvarchar(20),
|
tenant_id nvarchar(20),
|
||||||
create_dept bigint,
|
create_dept bigint,
|
||||||
create_by bigint,
|
create_by bigint,
|
||||||
@ -252,6 +257,10 @@ exec sp_addextendedproperty 'MS_Description', N'流程版本', 'SCHEMA', 'dbo',
|
|||||||
'version'
|
'version'
|
||||||
go
|
go
|
||||||
|
|
||||||
|
exec sp_addextendedproperty 'MS_Description', N'备注', 'SCHEMA', 'dbo', 'TABLE', 'wf_definition_config', 'COLUMN',
|
||||||
|
'remark'
|
||||||
|
go
|
||||||
|
|
||||||
exec sp_addextendedproperty 'MS_Description', N'租户编号', 'SCHEMA', 'dbo', 'TABLE', 'wf_definition_config', 'COLUMN',
|
exec sp_addextendedproperty 'MS_Description', N'租户编号', 'SCHEMA', 'dbo', 'TABLE', 'wf_definition_config', 'COLUMN',
|
||||||
'tenant_id'
|
'tenant_id'
|
||||||
go
|
go
|
||||||
@ -334,7 +343,7 @@ exec sp_addextendedproperty 'MS_Description', N'更新时间', 'SCHEMA', 'dbo',
|
|||||||
'update_time'
|
'update_time'
|
||||||
go
|
go
|
||||||
|
|
||||||
insert into wf_form_manage(id, form_name, form_type, router, remark, tenant_id, create_dept, create_by, create_time, update_by, update_time) VALUES (1, '请假申请', 'static', '/demo/leaveEdit/index', NULL, '000000', 103, 1, getdate(), 1, getdate());
|
insert into wf_form_manage(id, form_name, form_type, router, remark, tenant_id, create_dept, create_by, create_time, update_by, update_time) VALUES (1, '请假申请', 'static', '/workflow/leaveEdit/index', NULL, '000000', 103, 1, getdate(), 1, getdate());
|
||||||
|
|
||||||
create table wf_node_config
|
create table wf_node_config
|
||||||
(
|
(
|
||||||
@ -406,12 +415,12 @@ exec sp_addextendedproperty 'MS_Description', N'更新时间', 'SCHEMA', 'dbo',
|
|||||||
'update_time'
|
'update_time'
|
||||||
go
|
go
|
||||||
|
|
||||||
INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11638, '请假申请', 5, 1, 'leave', 'workflow/leave/index', 1, 0, 'C', '0', '0', 'demo:leave:list', '#', 103, 1, getdate(), NULL, NULL, '请假申请菜单');
|
INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11638, '请假申请', 5, 1, 'leave', 'workflow/leave/index', 1, 0, 'C', '0', '0', 'workflow:leave:list', '#', 103, 1, getdate(), NULL, NULL, '请假申请菜单');
|
||||||
INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11639, '请假申请查询', 11638, 1, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:query', '#', 103, 1, getdate(), NULL, NULL, '');
|
INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11639, '请假申请查询', 11638, 1, '#', '', 1, 0, 'F', '0', '0', 'workflow:leave:query', '#', 103, 1, getdate(), NULL, NULL, '');
|
||||||
INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11640, '请假申请新增', 11638, 2, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:add', '#', 103, 1, getdate(), NULL, NULL, '');
|
INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11640, '请假申请新增', 11638, 2, '#', '', 1, 0, 'F', '0', '0', 'workflow:leave:add', '#', 103, 1, getdate(), NULL, NULL, '');
|
||||||
INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11641, '请假申请修改', 11638, 3, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:edit', '#', 103, 1, getdate(), NULL, NULL, '');
|
INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11641, '请假申请修改', 11638, 3, '#', '', 1, 0, 'F', '0', '0', 'workflow:leave:edit', '#', 103, 1, getdate(), NULL, NULL, '');
|
||||||
INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11642, '请假申请删除', 11638, 4, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:remove', '#', 103, 1, getdate(), NULL, NULL, '');
|
INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11642, '请假申请删除', 11638, 4, '#', '', 1, 0, 'F', '0', '0', 'workflow:leave:remove', '#', 103, 1, getdate(), NULL, NULL, '');
|
||||||
INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11643, '请假申请导出', 11638, 5, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:export', '#', 103, 1, getdate(), NULL, NULL, '');
|
INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11643, '请假申请导出', 11638, 5, '#', '', 1, 0, 'F', '0', '0', 'workflow:leave:export', '#', 103, 1, getdate(), NULL, NULL, '');
|
||||||
|
|
||||||
INSERT INTO sys_dict_type(dict_id, tenant_id, dict_name, dict_type, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (13, '000000', '业务状态', 'wf_business_status', 103, 1, getdate(), NULL, NULL, '业务状态列表');
|
INSERT INTO sys_dict_type(dict_id, tenant_id, dict_name, dict_type, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (13, '000000', '业务状态', 'wf_business_status', 103, 1, getdate(), NULL, NULL, '业务状态列表');
|
||||||
INSERT INTO sys_dict_type(dict_id, tenant_id, dict_name, dict_type, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (14, '000000', '表单类型', 'wf_form_type', 103, 1, getdate(), NULL, NULL, '表单类型列表');
|
INSERT INTO sys_dict_type(dict_id, tenant_id, dict_name, dict_type, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (14, '000000', '表单类型', 'wf_form_type', 103, 1, getdate(), NULL, NULL, '表单类型列表');
|
||||||
|
@ -1678,8 +1678,6 @@ INSERT sys_menu VALUES (109, N'在线用户', 2, 1, N'online', N'monitor/online/
|
|||||||
GO
|
GO
|
||||||
INSERT sys_menu VALUES (113, N'缓存监控', 2, 5, N'cache', N'monitor/cache/index', N'', 1, 0, N'C', N'0', N'0', N'monitor:cache:list', N'redis', 103, 1, getdate(), NULL, NULL, N'缓存监控菜单')
|
INSERT sys_menu VALUES (113, N'缓存监控', 2, 5, N'cache', N'monitor/cache/index', N'', 1, 0, N'C', N'0', N'0', N'monitor:cache:list', N'redis', 103, 1, getdate(), NULL, NULL, N'缓存监控菜单')
|
||||||
GO
|
GO
|
||||||
INSERT sys_menu VALUES (114, N'表单构建', 3, 1, N'build', N'tool/build/index', N'', 1, 0, N'C', N'0', N'0', N'tool:build:list', N'build', 103, 1, getdate(), NULL, NULL, N'表单构建菜单')
|
|
||||||
GO
|
|
||||||
INSERT sys_menu VALUES (115, N'代码生成', 3, 2, N'gen', N'tool/gen/index', N'', 1, 0, N'C', N'0', N'0', N'tool:gen:list', N'code', 103, 1, getdate(), NULL, NULL, N'代码生成菜单')
|
INSERT sys_menu VALUES (115, N'代码生成', 3, 2, N'gen', N'tool/gen/index', N'', 1, 0, N'C', N'0', N'0', N'tool:gen:list', N'code', 103, 1, getdate(), NULL, NULL, N'代码生成菜单')
|
||||||
GO
|
GO
|
||||||
INSERT sys_menu VALUES (121, N'租户管理', 6, 1, N'tenant', N'system/tenant/index', N'', 1, 0, N'C', N'0', N'0', N'system:tenant:list', N'code', 103, 1, getdate(), NULL, NULL, N'租户管理菜单')
|
INSERT sys_menu VALUES (121, N'租户管理', 6, 1, N'tenant', N'system/tenant/index', N'', 1, 0, N'C', N'0', N'0', N'system:tenant:list', N'code', 103, 1, getdate(), NULL, NULL, N'租户管理菜单')
|
||||||
|
@ -6,4 +6,4 @@ ALTER TABLE sys_post ADD (post_category VARCHAR2(100) DEFAULT NULL) COMMENT '岗
|
|||||||
COMMENT ON COLUMN sys_post.post_category IS '岗位类别编码';
|
COMMENT ON COLUMN sys_post.post_category IS '岗位类别编码';
|
||||||
UPDATE sys_post SET dept_id = 100;
|
UPDATE sys_post SET dept_id = 100;
|
||||||
UPDATE sys_post SET dept_id = 103 where post_id = 1;
|
UPDATE sys_post SET dept_id = 103 where post_id = 1;
|
||||||
UPDATE sys_menu SET path = 'snailjob', component = 'monitor/snailjob/index', perms = 'monitor:snailjob:list', remark = 'SnailJob控制台菜单' WHERE menu_id = 120;
|
UPDATE sys_menu SET menu_name = 'SnailJob控制台', path = 'snailjob', component = 'monitor/snailjob/index', perms = 'monitor:snailjob:list', remark = 'SnailJob控制台菜单' WHERE menu_id = 120;
|
||||||
|
@ -6,4 +6,4 @@ ALTER TABLE sys_post ADD COLUMN post_category varchar(100) default null::varchar
|
|||||||
COMMENT ON COLUMN sys_post.post_category IS '岗位类别编码';
|
COMMENT ON COLUMN sys_post.post_category IS '岗位类别编码';
|
||||||
UPDATE sys_post SET dept_id = 100;
|
UPDATE sys_post SET dept_id = 100;
|
||||||
UPDATE sys_post SET dept_id = 103 where post_id = 1;
|
UPDATE sys_post SET dept_id = 103 where post_id = 1;
|
||||||
UPDATE sys_menu SET path = 'snailjob', component = 'monitor/snailjob/index', perms = 'monitor:snailjob:list', remark = 'SnailJob控制台菜单' WHERE menu_id = 120;
|
UPDATE sys_menu SET menu_name = 'SnailJob控制台', path = 'snailjob', component = 'monitor/snailjob/index', perms = 'monitor:snailjob:list', remark = 'SnailJob控制台菜单' WHERE menu_id = 120;
|
||||||
|
@ -25,5 +25,5 @@ UPDATE sys_post SET dept_id = 100
|
|||||||
GO
|
GO
|
||||||
UPDATE sys_post SET dept_id = 103 where post_id = 1
|
UPDATE sys_post SET dept_id = 103 where post_id = 1
|
||||||
GO
|
GO
|
||||||
UPDATE sys_menu SET path = N'snailjob', component = N'monitor/snailjob/index', perms = N'monitor:snailjob:list', remark = N'SnailJob控制台菜单' WHERE menu_id = 120
|
UPDATE sys_menu SET menu_name = N'SnailJob控制台', path = N'snailjob', component = N'monitor/snailjob/index', perms = N'monitor:snailjob:list', remark = N'SnailJob控制台菜单' WHERE menu_id = 120
|
||||||
GO
|
GO
|
@ -2,4 +2,4 @@ ALTER TABLE sys_dept ADD dept_category VARCHAR(100) DEFAULT NULL COMMENT '部门
|
|||||||
ALTER TABLE sys_post ADD dept_id BIGINT(20) NOT NULL COMMENT '部门id', ADD post_category VARCHAR(100) DEFAULT NULL COMMENT '岗位类别编码';
|
ALTER TABLE sys_post ADD dept_id BIGINT(20) NOT NULL COMMENT '部门id', ADD post_category VARCHAR(100) DEFAULT NULL COMMENT '岗位类别编码';
|
||||||
UPDATE sys_post SET dept_id = 100;
|
UPDATE sys_post SET dept_id = 100;
|
||||||
UPDATE sys_post SET dept_id = 103 where post_id = 1;
|
UPDATE sys_post SET dept_id = 103 where post_id = 1;
|
||||||
UPDATE sys_menu SET path = 'snailjob', component = 'monitor/snailjob/index', perms = 'monitor:snailjob:list', remark = 'SnailJob控制台菜单' WHERE menu_id = 120;
|
UPDATE sys_menu SET menu_name = 'SnailJob控制台', path = 'snailjob', component = 'monitor/snailjob/index', perms = 'monitor:snailjob:list', remark = 'SnailJob控制台菜单' WHERE menu_id = 120;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user