!549 ♥️发布 5.2.0-BETA2 公测版本
Merge pull request !549 from 疯狂的狮子Li/dev
已修改54个文件
已添加7个文件
已重命名1个文件
已删除8个文件
| | |
| | | <description>RuoYi-Vue-Pluså¤ç§æ·ç®¡çç³»ç»</description> |
| | | |
| | | <properties> |
| | | <revision>5.2.0-BETA</revision> |
| | | <spring-boot.version>3.2.5</spring-boot.version> |
| | | <revision>5.2.0-BETA2</revision> |
| | | <spring-boot.version>3.2.6</spring-boot.version> |
| | | <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> |
| | | <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> |
| | | <java.version>17</java.version> |
| | |
| | | <lock4j.version>2.2.7</lock4j.version> |
| | | <dynamic-ds.version>4.3.0</dynamic-ds.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.lombok.version>0.2.0</mapstruct-plus.lombok.version> |
| | | <lombok.version>1.18.32</lombok.version> |
| | |
| | | <sms4j.version>3.2.1</sms4j.version> |
| | | <!-- éå¶æ¡æ¶ä¸çfastjsonçæ¬ --> |
| | | <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-compiler-plugin.verison>3.11.0</maven-compiler-plugin.verison> |
| | | <maven-surefire-plugin.version>3.1.2</maven-surefire-plugin.version> |
| | | <flatten-maven-plugin.version>1.3.0</flatten-maven-plugin.version> |
| | | |
| | | <!--工使µé
ç½®--> |
| | | <flowable.version>7.0.0</flowable.version> |
| | | </properties> |
| | | |
| | | <profiles> |
| | |
| | | <scope>test</scope> |
| | | </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 --> |
| | | <!-- <dependency>--> |
| | | <!-- <groupId>org.apache.skywalking</groupId>--> |
| | |
| | | snail-job: |
| | | enabled: true |
| | | # éè¦å¨ SnailJob åå°ç»ç®¡çå建对åºåç§°çç»,ç¶åå建任å¡çæ¶å鿩坹åºçç»,æè½æ£ç¡®åæ´¾ä»»å¡ |
| | | group-name: "ruoyi_group" |
| | | group: "ruoyi_group" |
| | | # SnailJob æ¥å
¥éªè¯ä»¤ç è¯¦è§ script/sql/snail_job.sql `sj_group_config` 表 |
| | | token: "SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT" |
| | | server: |
| | |
| | | port: 1788 |
| | | # è¯¦è§ script/sql/snail_job.sql `sj_namespace` 表 |
| | | namespace: ${spring.profiles.active} |
| | | |
| | | |
| | | --- # æ°æ®æºé
ç½® |
| | | spring: |
| | |
| | | # æ¯å¦å¼å¯ssl |
| | | ssl.enabled: false |
| | | |
| | | # redisson é
ç½® |
| | | redisson: |
| | | # redis keyåç¼ |
| | | keyPrefix: |
| | |
| | | snail-job: |
| | | enabled: false |
| | | # éè¦å¨ SnailJob åå°ç»ç®¡çå建对åºåç§°çç»,ç¶åå建任å¡çæ¶å鿩坹åºçç»,æè½æ£ç¡®åæ´¾ä»»å¡ |
| | | group-name: "ruoyi_group" |
| | | group: "ruoyi_group" |
| | | # SnailJob æ¥å
¥éªè¯ä»¤ç è¯¦è§ script/sql/snail_job.sql `sj_group_config` 表 |
| | | token: "SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT" |
| | | server: |
| | |
| | | # æ¯å¦å¼å¯ssl |
| | | ssl.enabled: false |
| | | |
| | | # redisson é
ç½® |
| | | redisson: |
| | | # redis keyåç¼ |
| | | keyPrefix: |
| | |
| | | </description> |
| | | |
| | | <properties> |
| | | <revision>5.2.0-BETA</revision> |
| | | <revision>5.2.0-BETA2</revision> |
| | | </properties> |
| | | |
| | | <dependencyManagement> |
¶Ô±ÈÐÂÎļþ |
| | |
| | | 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; |
| | | |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | 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; |
| | | |
| | | } |
ÎļþÃû´Ó ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/BusinessStatusEnum.java ÐÞ¸Ä |
| | |
| | | package org.dromara.workflow.common.enums; |
| | | package org.dromara.common.core.enums; |
| | | |
| | | import cn.hutool.core.util.StrUtil; |
| | | import lombok.AllArgsConstructor; |
¶Ô±ÈÐÂÎļþ |
| | |
| | | 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); |
| | | } |
| | |
| | | @AutoConfiguration |
| | | @ConditionalOnProperty(prefix = "snail-job", name = "enabled", havingValue = "true") |
| | | @EnableScheduling |
| | | @EnableSnailJob(group = "${snail-job.group-name}") |
| | | @EnableSnailJob |
| | | public class SnailJobConfig { |
| | | |
| | | @EventListener(SnailClientStartingEvent.class) |
| | |
| | | /** |
| | | * ä¸ä¼ æä»¶å° Amazon S3ï¼å¹¶è¿åä¸ä¼ ç»æ |
| | | * |
| | | * @param filePath æ¬å°æä»¶è·¯å¾ |
| | | * @param key å¨ Amazon S3 ä¸çå¯¹è±¡é® |
| | | * @param md5Digest æ¬å°æä»¶ç MD5 åå¸å¼ï¼å¯éï¼ |
| | | * @param filePath æ¬å°æä»¶è·¯å¾ |
| | | * @param key å¨ Amazon S3 ä¸çå¯¹è±¡é® |
| | | * @param md5Digest æ¬å°æä»¶ç MD5 åå¸å¼ï¼å¯éï¼ |
| | | * @param contentType æä»¶å
容类å |
| | | * @return UploadResult å
å«ä¸ä¼ åçæä»¶ä¿¡æ¯ |
| | | * @throws OssException 妿ä¸ä¼ å¤±è´¥ï¼æåºèªå®ä¹å¼å¸¸ |
| | | */ |
| | | public UploadResult upload(Path filePath, String key, String md5Digest) { |
| | | public UploadResult upload(Path filePath, String key, String md5Digest, String contentType) { |
| | | try { |
| | | // æå»ºä¸ä¼ 请æ±å¯¹è±¡ |
| | | FileUpload fileUpload = transferManager.uploadFile( |
| | |
| | | y -> y.bucket(properties.getBucketName()) |
| | | .key(key) |
| | | .contentMD5(StringUtils.isNotEmpty(md5Digest) ? md5Digest : null) |
| | | .contentType(contentType) |
| | | .build()) |
| | | .addTransferListener(LoggingTransferListener.create()) |
| | | .source(filePath).build()); |
| | |
| | | * @param inputStream è¦ä¸ä¼ çè¾å
¥æµ |
| | | * @param key å¨ Amazon S3 ä¸çå¯¹è±¡é® |
| | | * @param length è¾å
¥æµçé¿åº¦ |
| | | * @param contentType æä»¶å
容类å |
| | | * @return UploadResult å
å«ä¸ä¼ åçæä»¶ä¿¡æ¯ |
| | | * @throws OssException 妿ä¸ä¼ å¤±è´¥ï¼æåºèªå®ä¹å¼å¸¸ |
| | | */ |
| | | public UploadResult upload(InputStream inputStream, String key, Long length) { |
| | | public UploadResult upload(InputStream inputStream, String key, Long length, String contentType) { |
| | | // 妿è¾å
¥æµä¸æ¯ ByteArrayInputStreamï¼åå°å
¶è¯»å为åèæ°ç»åå建 ByteArrayInputStream |
| | | if (!(inputStream instanceof ByteArrayInputStream)) { |
| | | inputStream = new ByteArrayInputStream(IoUtil.readBytes(inputStream)); |
| | |
| | | .putObjectRequest( |
| | | y -> y.bucket(properties.getBucketName()) |
| | | .key(key) |
| | | .contentType(contentType) |
| | | .build()) |
| | | .build()); |
| | | |
| | |
| | | * @throws OssException 妿ä¸ä¼ å¤±è´¥ï¼æåºèªå®ä¹å¼å¸¸ |
| | | */ |
| | | 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)); |
| | | } |
| | | |
| | | /** |
| | |
| | | * @throws OssException 妿ä¸ä¼ å¤±è´¥ï¼æåºèªå®ä¹å¼å¸¸ |
| | | */ |
| | | 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)); |
| | | } |
| | | |
| | | /** |
| | |
| | | * @throws OssException 妿ä¸ä¼ å¤±è´¥ï¼æåºèªå®ä¹å¼å¸¸ |
| | | */ |
| | | 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)); |
| | | } |
| | | |
| | | /** |
| | |
| | | } |
| | | OssProperties properties = JsonUtils.parseObject(json, OssProperties.class); |
| | | // 使ç¨ç§æ·æ è¯é¿å
å¤ä¸ªç§æ·ç¸åkeyå®ä¾è¦ç |
| | | String key = properties.getTenantId() + ":" + configKey; |
| | | String key = configKey; |
| | | if (StringUtils.isNotBlank(properties.getTenantId())) { |
| | | key = properties.getTenantId() + ":" + configKey; |
| | | } |
| | | OssClient client = CLIENT_CACHE.get(key); |
| | | // 客æ·ç«¯ä¸å卿é
ç½®ä¸ç¸ååéæ°æå»º |
| | | if (client == null || !client.checkPropertiesSame(properties)) { |
| | |
| | | @ExceptionHandler(LockFailureException.class) |
| | | public R<Void> handleLockFailureException(LockFailureException e, HttpServletRequest request) { |
| | | String requestURI = request.getRequestURI(); |
| | | log.error("è·åé失败äº'{}',åçLock4jå¼å¸¸." + requestURI, e.getMessage()); |
| | | log.error("è·åé失败äº'{}',åçLock4jå¼å¸¸.", requestURI, e); |
| | | return R.fail(HttpStatus.HTTP_UNAVAILABLE, "ä¸å¡å¤çä¸ï¼è¯·ç¨ååè¯..."); |
| | | } |
| | | |
| | |
| | | |
| | | import cn.dev33.satoken.dao.SaTokenDao; |
| | | 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.Caffeine; |
| | | import org.dromara.common.redis.utils.RedisUtils; |
| | |
| | | } else { |
| | | RedisUtils.setCacheObject(key, value, Duration.ofSeconds(timeout)); |
| | | } |
| | | CAFFEINE.put(key, value); |
| | | CAFFEINE.invalidate(key); |
| | | } |
| | | |
| | | /** |
| | |
| | | public void update(String key, String value) { |
| | | if (RedisUtils.hasKey(key)) { |
| | | RedisUtils.setCacheObject(key, value, true); |
| | | CAFFEINE.put(key, value); |
| | | CAFFEINE.invalidate(key); |
| | | } |
| | | } |
| | | |
| | |
| | | } else { |
| | | RedisUtils.setCacheObject(key, object, Duration.ofSeconds(timeout)); |
| | | } |
| | | CAFFEINE.put(key, object); |
| | | CAFFEINE.invalidate(key); |
| | | } |
| | | |
| | | /** |
| | |
| | | public void updateObject(String key, Object object) { |
| | | if (RedisUtils.hasKey(key)) { |
| | | RedisUtils.setCacheObject(key, object, true); |
| | | CAFFEINE.put(key, object); |
| | | CAFFEINE.invalidate(key); |
| | | } |
| | | } |
| | | |
| | |
| | | package org.dromara.common.sms.config; |
| | | |
| | | import org.dromara.common.sms.core.dao.PlusSmsDao; |
| | | import org.dromara.common.sms.handler.SmsExceptionHandler; |
| | | import org.dromara.sms4j.api.dao.SmsDao; |
| | | import org.springframework.boot.autoconfigure.AutoConfiguration; |
| | | import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; |
| | |
| | | return new PlusSmsDao(); |
| | | } |
| | | |
| | | /** |
| | | * å¼å¸¸å¤çå¨ |
| | | */ |
| | | @Bean |
| | | public SmsExceptionHandler smsExceptionHandler() { |
| | | return new SmsExceptionHandler(); |
| | | } |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | 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, "çä¿¡åé失败ï¼è¯·ç¨ååè¯..."); |
| | | } |
| | | |
| | | } |
| | |
| | | |
| | | @ConditionalOnBean(MybatisPlusConfig.class) |
| | | @AutoConfiguration(after = {MybatisPlusConfig.class}) |
| | | static class MybatisPlusConfigation { |
| | | static class MybatisPlusConfiguration { |
| | | |
| | | /** |
| | | * å¤ç§æ·æä»¶ |
| | |
| | | package org.dromara.common.tenant.helper; |
| | | |
| | | import cn.dev33.satoken.context.SaHolder; |
| | | import cn.dev33.satoken.stp.StpUtil; |
| | | import cn.hutool.core.convert.Convert; |
| | | import com.alibaba.ttl.TransmittableThreadLocal; |
| | |
| | | } |
| | | } |
| | | |
| | | public static void setDynamic(String tenantId) { |
| | | setDynamic(tenantId, false); |
| | | } |
| | | |
| | | /** |
| | | * è®¾ç½®å¨æç§æ·(ä¸ç´ææ éè¦æå¨æ¸
ç) |
| | | * <p> |
| | | * å¦æä¸ºæªç»å½ç¶æä¸ é£ä¹åªå¨å½å线ç¨å
çæ |
| | | * |
| | | * @param tenantId ç§æ·id |
| | | * @param global æ¯å¦å
¨å±çæ |
| | | */ |
| | | public static void setDynamic(String tenantId) { |
| | | public static void setDynamic(String tenantId, boolean global) { |
| | | if (!isEnable()) { |
| | | return; |
| | | } |
| | | if (!isLogin()) { |
| | | if (!isLogin() || !global) { |
| | | TEMP_DYNAMIC_TENANT.set(tenantId); |
| | | return; |
| | | } |
| | | String cacheKey = DYNAMIC_TENANT_KEY + ":" + LoginHelper.getUserId(); |
| | | RedisUtils.setCacheObject(cacheKey, tenantId); |
| | | SaHolder.getStorage().set(cacheKey, tenantId); |
| | | } |
| | | |
| | | /** |
| | |
| | | if (!isLogin()) { |
| | | 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)) { |
| | | return tenantId; |
| | | } |
| | | String cacheKey = DYNAMIC_TENANT_KEY + ":" + LoginHelper.getUserId(); |
| | | tenantId = RedisUtils.getCacheObject(cacheKey); |
| | | SaHolder.getStorage().set(cacheKey, tenantId); |
| | | return tenantId; |
| | | } |
| | | |
| | |
| | | TEMP_DYNAMIC_TENANT.remove(); |
| | | return; |
| | | } |
| | | TEMP_DYNAMIC_TENANT.remove(); |
| | | String cacheKey = DYNAMIC_TENANT_KEY + ":" + LoginHelper.getUserId(); |
| | | RedisUtils.deleteObject(cacheKey); |
| | | SaHolder.getStorage().delete(cacheKey); |
| | | } |
| | | |
| | | /** |
| | |
| | | |
| | | @Bean |
| | | public WebSocketConfigurer webSocketConfigurer(HandshakeInterceptor handshakeInterceptor, |
| | | WebSocketHandler webSocketHandler, |
| | | WebSocketProperties webSocketProperties) { |
| | | WebSocketHandler webSocketHandler, WebSocketProperties webSocketProperties) { |
| | | // 妿WebSocketçè·¯å¾ä¸ºç©ºï¼å设置é»è®¤è·¯å¾ä¸º "/websocket" |
| | | if (StrUtil.isBlank(webSocketProperties.getPath())) { |
| | | webSocketProperties.setPath("/websocket"); |
| | | } |
| | | |
| | | // 妿å
许跨å访é®çå°å为空ï¼å设置为 "*"ï¼è¡¨ç¤ºå
è®¸æææ¥æºçè·¨åè¯·æ± |
| | | if (StrUtil.isBlank(webSocketProperties.getAllowedOrigins())) { |
| | | webSocketProperties.setAllowedOrigins("*"); |
| | | } |
| | | |
| | | // è¿åä¸ä¸ªWebSocketConfigurer对象ï¼ç¨äºé
ç½®WebSocket |
| | | return registry -> registry |
| | | // æ·»å WebSocketå¤çç¨åºåæ¦æªå¨å°æå®è·¯å¾ï¼è®¾ç½®å
许çè·¨åæ¥æº |
| | | .addHandler(webSocketHandler, webSocketProperties.getPath()) |
| | | .addInterceptors(handshakeInterceptor) |
| | | .setAllowedOrigins(webSocketProperties.getAllowedOrigins()); |
| | |
| | | * @author zendwang |
| | | */ |
| | | public interface WebSocketConstants { |
| | | |
| | | /** |
| | | * websocketSessionä¸çåæ°çkey |
| | | */ |
| | |
| | | } |
| | | |
| | | /** |
| | | * å¤çåéæ¥çææ¬æ¶æ¯ |
| | | * å¤çæ¥æ¶å°çææ¬æ¶æ¯ |
| | | * |
| | | * @param session |
| | | * @param message |
| | | * @throws Exception |
| | | * @param session WebSocketä¼è¯ |
| | | * @param message æ¥æ¶å°çææ¬æ¶æ¯ |
| | | * @throws Exception å¤çæ¶æ¯è¿ç¨ä¸å¯è½æåºçå¼å¸¸ |
| | | */ |
| | | @Override |
| | | protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { |
| | | // ä»WebSocketä¼è¯ä¸è·åç»å½ç¨æ·ä¿¡æ¯ |
| | | LoginUser loginUser = (LoginUser) session.getAttributes().get(LOGIN_USER_KEY); |
| | | List<Long> userIds = List.of(loginUser.getUserId()); |
| | | |
| | | // å建WebSocketæ¶æ¯DTO对象 |
| | | WebSocketMessageDto webSocketMessageDto = new WebSocketMessageDto(); |
| | | webSocketMessageDto.setSessionKeys(userIds); |
| | | webSocketMessageDto.setSessionKeys(List.of(loginUser.getUserId())); |
| | | webSocketMessageDto.setMessage(message.getPayload()); |
| | | WebSocketUtils.publishMessage(webSocketMessageDto); |
| | | } |
| | | |
| | | /** |
| | | * å¤çæ¥æ¶å°çäºè¿å¶æ¶æ¯ |
| | | * |
| | | * @param session WebSocketä¼è¯ |
| | | * @param message æ¥æ¶å°çäºè¿å¶æ¶æ¯ |
| | | * @throws Exception å¤çæ¶æ¯è¿ç¨ä¸å¯è½æåºçå¼å¸¸ |
| | | */ |
| | | @Override |
| | | protected void handleBinaryMessage(WebSocketSession session, BinaryMessage message) throws Exception { |
| | | super.handleBinaryMessage(session, message); |
| | | } |
| | | |
| | | /** |
| | | * å¿è·³çæµçåå¤ |
| | | * å¤çæ¥æ¶å°çPongæ¶æ¯ï¼å¿è·³çæµï¼ |
| | | * |
| | | * @param session |
| | | * @param message |
| | | * @throws Exception |
| | | * @param session WebSocketä¼è¯ |
| | | * @param message æ¥æ¶å°çPongæ¶æ¯ |
| | | * @throws Exception å¤çæ¶æ¯è¿ç¨ä¸å¯è½æåºçå¼å¸¸ |
| | | */ |
| | | @Override |
| | | protected void handlePongMessage(WebSocketSession session, PongMessage message) throws Exception { |
| | |
| | | } |
| | | |
| | | /** |
| | | * è¿æ¥åºéæ¶ |
| | | * å¤çWebSocketä¼ è¾é误 |
| | | * |
| | | * @param session |
| | | * @param exception |
| | | * @throws Exception |
| | | * @param session WebSocketä¼è¯ |
| | | * @param exception åççå¼å¸¸ |
| | | * @throws Exception å¤çè¿ç¨ä¸å¯è½æåºçå¼å¸¸ |
| | | */ |
| | | @Override |
| | | public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception { |
| | |
| | | } |
| | | |
| | | /** |
| | | * è¿æ¥å
³éå |
| | | * å¨WebSocketè¿æ¥å
³éåæ§è¡æ¸
çæä½ |
| | | * |
| | | * @param session |
| | | * @param status |
| | | * @param session WebSocketä¼è¯ |
| | | * @param status å
³éç¶æä¿¡æ¯ |
| | | */ |
| | | @Override |
| | | public void afterConnectionClosed(WebSocketSession session, CloseStatus status) { |
| | |
| | | } |
| | | |
| | | /** |
| | | * æ¯å¦æ¯æåçæ¶æ¯ |
| | | * æç¤ºå¤çç¨åºæ¯å¦æ¯ææ¥æ¶é¨åæ¶æ¯ |
| | | * |
| | | * @return |
| | | * @return å¦ææ¯ææ¥æ¶é¨åæ¶æ¯ï¼åè¿åtrueï¼å¦åè¿åfalse |
| | | */ |
| | | @Override |
| | | public boolean supportsPartialMessages() { |
| | |
| | | |
| | | 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) { |
| | | USER_SESSION_MAP.put(sessionKey, session); |
| | | } |
| | | |
| | | /** |
| | | * ä»ç¨æ·ä¼è¯Mapä¸ç§»é¤æå®ä¼è¯é®å¯¹åºçWebSocketä¼è¯ |
| | | * |
| | | * @param sessionKey è¦ç§»é¤çä¼è¯é® |
| | | */ |
| | | public static void removeSession(Long sessionKey) { |
| | | if (USER_SESSION_MAP.containsKey(sessionKey)) { |
| | | USER_SESSION_MAP.remove(sessionKey); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * æ ¹æ®ä¼è¯é®ä»ç¨æ·ä¼è¯Mapä¸è·åWebSocketä¼è¯ |
| | | * |
| | | * @param sessionKey è¦è·åçä¼è¯é® |
| | | * @return ä¸ç»å®ä¼è¯é®å¯¹åºçWebSocketä¼è¯ï¼å¦æä¸åå¨åè¿ånull |
| | | */ |
| | | public static WebSocketSession getSessions(Long sessionKey) { |
| | | return USER_SESSION_MAP.get(sessionKey); |
| | | } |
| | | |
| | | /** |
| | | * è·ååå¨å¨ç¨æ·ä¼è¯Map䏿æWebSocketä¼è¯çä¼è¯é®éå |
| | | * |
| | | * @return ææWebSocketä¼è¯çä¼è¯é®éå |
| | | */ |
| | | public static Set<Long> getSessionsAll() { |
| | | return USER_SESSION_MAP.keySet(); |
| | | } |
| | | |
| | | /** |
| | | * æ£æ¥ç»å®çä¼è¯é®æ¯å¦åå¨äºç¨æ·ä¼è¯Mapä¸ |
| | | * |
| | | * @param sessionKey è¦æ£æ¥çä¼è¯é® |
| | | * @return 妿åå¨å¯¹åºçä¼è¯é®ï¼åè¿åtrueï¼å¦åè¿åfalse |
| | | */ |
| | | public static Boolean existSession(Long sessionKey) { |
| | | return USER_SESSION_MAP.containsKey(sessionKey); |
| | | } |
| | |
| | | package org.dromara.common.websocket.interceptor; |
| | | |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.dromara.common.core.domain.model.LoginUser; |
| | | import org.dromara.common.satoken.utils.LoginHelper; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.http.server.ServerHttpRequest; |
| | | import org.springframework.http.server.ServerHttpResponse; |
| | | import org.springframework.web.socket.WebSocketHandler; |
| | |
| | | public class PlusWebSocketInterceptor implements HandshakeInterceptor { |
| | | |
| | | /** |
| | | * æ¡æå |
| | | * WebSocketæ¡æä¹åæ§è¡çåç½®å¤çæ¹æ³ |
| | | * |
| | | * @param request request |
| | | * @param response response |
| | | * @param wsHandler wsHandler |
| | | * @param attributes attributes |
| | | * @return æ¯å¦æ¡ææå |
| | | * @param request WebSocketæ¡æè¯·æ± |
| | | * @param response WebSocketæ¡æååº |
| | | * @param wsHandler WebSocketå¤çç¨åº |
| | | * @param attributes ä¸WebSocketä¼è¯å
³èç屿§ |
| | | * @return 妿å
è®¸æ¡æç»§ç»è¿è¡ï¼åè¿åtrueï¼å¦åè¿åfalse |
| | | */ |
| | | @Override |
| | | public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) { |
| | |
| | | } |
| | | |
| | | /** |
| | | * æ¡æå |
| | | * WebSocketæ¡ææååæ§è¡çåç½®å¤çæ¹æ³ |
| | | * |
| | | * @param request request |
| | | * @param response response |
| | | * @param wsHandler wsHandler |
| | | * @param exception å¼å¸¸ |
| | | * @param request WebSocketæ¡æè¯·æ± |
| | | * @param response WebSocketæ¡æååº |
| | | * @param wsHandler WebSocketå¤çç¨åº |
| | | * @param exception æ¡æè¿ç¨ä¸å¯è½åºç°çå¼å¸¸ |
| | | */ |
| | | @Override |
| | | public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) { |
| | | |
| | | // å¨è¿ä¸ªæ¹æ³ä¸å¯ä»¥æ§è¡ä¸äºæ¡ææååçåç»å¤çé»è¾ï¼æ¯å¦è®°å½æ¥å¿æè
å
¶ä»æä½ |
| | | } |
| | | |
| | | } |
| | |
| | | package org.dromara.common.websocket.listener; |
| | | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.dromara.common.websocket.holder.WebSocketSessionHolder; |
| | | import org.dromara.common.websocket.utils.WebSocketUtils; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.boot.ApplicationArguments; |
| | | import org.springframework.boot.ApplicationRunner; |
| | | import org.springframework.core.Ordered; |
| | |
| | | @Slf4j |
| | | public class WebSocketTopicListener implements ApplicationRunner, Ordered { |
| | | |
| | | /** |
| | | * å¨Spring Bootåºç¨ç¨åºå¯å¨æ¶åå§åWebSocket主é¢è®¢é
çå¬å¨ |
| | | * |
| | | * @param args åºç¨ç¨åºåæ° |
| | | * @throws Exception åå§åè¿ç¨ä¸å¯è½æåºçå¼å¸¸ |
| | | */ |
| | | @Override |
| | | public void run(ApplicationArguments args) throws Exception { |
| | | // 订é
WebSocketæ¶æ¯ |
| | | WebSocketUtils.subscribeMessage((message) -> { |
| | | log.info("WebSocket主é¢è®¢é
æ¶å°æ¶æ¯session keys={} message={}", message.getSessionKeys(), message.getMessage()); |
| | | // 妿keyä¸ä¸ºç©ºå°±æç
§keyåæ¶æ¯ å¦æä¸ºç©ºå°±ç¾¤å |
| | |
| | | public class WebSocketUtils { |
| | | |
| | | /** |
| | | * åéæ¶æ¯ |
| | | * åæå®çWebSocketä¼è¯åéæ¶æ¯ |
| | | * |
| | | * @param sessionKey sessionä¸»é® ä¸è¬ä¸ºç¨æ·id |
| | | * @param message æ¶æ¯ææ¬ |
| | | * @param sessionKey è¦åéæ¶æ¯çç¨æ·id |
| | | * @param message è¦åéçæ¶æ¯å
容 |
| | | */ |
| | | public static void sendMessage(Long sessionKey, String message) { |
| | | WebSocketSession session = WebSocketSessionHolder.getSessions(sessionKey); |
| | |
| | | } |
| | | |
| | | /** |
| | | * 订é
æ¶æ¯ |
| | | * 订é
WebSocketæ¶æ¯ä¸»é¢ï¼å¹¶æä¾ä¸ä¸ªæ¶è´¹è
彿°æ¥å¤çæ¥æ¶å°çæ¶æ¯ |
| | | * |
| | | * @param consumer èªå®ä¹å¤ç |
| | | * @param consumer å¤çWebSocketæ¶æ¯çæ¶è´¹è
彿° |
| | | */ |
| | | public static void subscribeMessage(Consumer<WebSocketMessageDto> consumer) { |
| | | RedisUtils.subscribe(WEB_SOCKET_TOPIC, WebSocketMessageDto.class, consumer); |
| | | } |
| | | |
| | | /** |
| | | * åå¸è®¢é
çæ¶æ¯ |
| | | * åå¸WebSocket订é
æ¶æ¯ |
| | | * |
| | | * @param webSocketMessage æ¶æ¯å¯¹è±¡ |
| | | * @param webSocketMessage è¦åå¸çWebSocketæ¶æ¯å¯¹è±¡ |
| | | */ |
| | | public static void publishMessage(WebSocketMessageDto webSocketMessage) { |
| | | List<Long> unsentSessionKeys = new ArrayList<>(); |
| | |
| | | } |
| | | |
| | | /** |
| | | * åå¸è®¢é
çæ¶æ¯(群å) |
| | | * åææçWebSocketä¼è¯åå¸è®¢é
çæ¶æ¯(群å) |
| | | * |
| | | * @param message æ¶æ¯å
容 |
| | | * @param message è¦åå¸çæ¶æ¯å
容 |
| | | */ |
| | | public static void publishAll(String message) { |
| | | WebSocketMessageDto broadcastMessage = new WebSocketMessageDto(); |
| | |
| | | }); |
| | | } |
| | | |
| | | /** |
| | | * åæå®çWebSocketä¼è¯åéPongæ¶æ¯ |
| | | * |
| | | * @param session è¦åéPongæ¶æ¯çWebSocketä¼è¯ |
| | | */ |
| | | public static void sendPongMessage(WebSocketSession session) { |
| | | sendMessage(session, new PongMessage()); |
| | | } |
| | | |
| | | /** |
| | | * åæå®çWebSocketä¼è¯åéææ¬æ¶æ¯ |
| | | * |
| | | * @param session WebSocketä¼è¯ |
| | | * @param message è¦åéçææ¬æ¶æ¯å
容 |
| | | */ |
| | | public static void sendMessage(WebSocketSession session, String message) { |
| | | sendMessage(session, new TextMessage(message)); |
| | | } |
| | | |
| | | /** |
| | | * åæå®çWebSocketä¼è¯åéWebSocketæ¶æ¯å¯¹è±¡ |
| | | * |
| | | * @param session WebSocketä¼è¯ |
| | | * @param message è¦åéçWebSocketæ¶æ¯å¯¹è±¡ |
| | | */ |
| | | private static void sendMessage(WebSocketSession session, WebSocketMessage<?> message) { |
| | | if (session == null || !session.isOpen()) { |
| | | log.warn("[send] sessionä¼è¯å·²ç»å
³é"); |
| | |
| | | import cn.dev33.satoken.secure.BCrypt; |
| | | import cn.hutool.core.bean.BeanUtil; |
| | | import cn.hutool.core.io.FileUtil; |
| | | import lombok.RequiredArgsConstructor; |
| | | import org.dromara.common.core.domain.R; |
| | | import org.dromara.common.core.utils.StringUtils; |
| | | import org.dromara.common.core.utils.file.MimeTypeUtils; |
| | | 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.enums.BusinessType; |
| | | import org.dromara.common.satoken.utils.LoginHelper; |
| | |
| | | import org.dromara.system.domain.vo.SysOssVo; |
| | | import org.dromara.system.domain.vo.SysUserVo; |
| | | import org.dromara.system.service.ISysOssService; |
| | | import org.dromara.system.service.ISysRoleService; |
| | | import org.dromara.system.service.ISysUserService; |
| | | import lombok.RequiredArgsConstructor; |
| | | import org.springframework.http.MediaType; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.*; |
| | |
| | | } |
| | | |
| | | /** |
| | | * ä¿®æ¹ç¨æ· |
| | | * ä¿®æ¹ç¨æ·ä¿¡æ¯ |
| | | */ |
| | | @RepeatSubmit |
| | | @Log(title = "个人信æ¯", businessType = BusinessType.UPDATE) |
| | | @PutMapping |
| | | public R<Void> updateProfile(@RequestBody SysUserProfileBo profile) { |
| | | public R<Void> updateProfile(@Validated @RequestBody SysUserProfileBo profile) { |
| | | SysUserBo user = BeanUtil.toBean(profile, SysUserBo.class); |
| | | user.setUserId(LoginHelper.getUserId()); |
| | | String username = LoginHelper.getUsername(); |
| | | if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) { |
| | | return R.fail("ä¿®æ¹ç¨æ·'" + username + "'å¤±è´¥ï¼ææºå·ç å·²åå¨"); |
| | |
| | | if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) { |
| | | return R.fail("ä¿®æ¹ç¨æ·'" + username + "'失败ï¼é®ç®±è´¦å·å·²åå¨"); |
| | | } |
| | | user.setUserId(LoginHelper.getUserId()); |
| | | if (userService.updateUserProfile(user) > 0) { |
| | | return R.ok(); |
| | | } |
| | |
| | | * |
| | | * @param bo æ°æ§å¯ç |
| | | */ |
| | | @RepeatSubmit |
| | | @ApiEncrypt |
| | | @Log(title = "个人信æ¯", businessType = BusinessType.UPDATE) |
| | | @PutMapping("/updatePwd") |
| | |
| | | * |
| | | * @param avatarfile ç¨æ·å¤´å |
| | | */ |
| | | @RepeatSubmit |
| | | @Log(title = "ç¨æ·å¤´å", businessType = BusinessType.UPDATE) |
| | | @PostMapping(value = "/avatar", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) |
| | | public R<AvatarVo> avatar(@RequestPart("avatarfile") MultipartFile avatarfile) { |
| | |
| | | @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) |
| | | @GetMapping("/dynamic/{tenantId}") |
| | | public R<Void> dynamicTenant(@NotBlank(message = "ç§æ·IDä¸è½ä¸ºç©º") @PathVariable String tenantId) { |
| | | TenantHelper.setDynamic(tenantId); |
| | | TenantHelper.setDynamic(tenantId, true); |
| | | return R.ok(); |
| | | } |
| | | |
| | |
| | | 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.Pattern; |
| | | import jakarta.validation.constraints.Size; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | 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; |
| | | |
| | | /** |
| | | * 个人信æ¯ä¸å¡å¤ç |
| | |
| | | @NoArgsConstructor |
| | | @EqualsAndHashCode(callSuper = true) |
| | | public class SysUserProfileBo extends BaseEntity { |
| | | |
| | | /** |
| | | * ç¨æ·ID |
| | | */ |
| | | private Long userId; |
| | | |
| | | /** |
| | | * ç¨æ·æµç§° |
| | |
| | | /** |
| | | * ææºå·ç |
| | | */ |
| | | @Pattern(regexp = RegexConstants.MOBILE, message = "ææºå·æ ¼å¼ä¸æ£ç¡®") |
| | | @Sensitive(strategy = SensitiveStrategy.PHONE) |
| | | private String phonenumber; |
| | | |
| | |
| | | import org.dromara.system.domain.vo.SysUserVo; |
| | | import org.dromara.system.mapper.*; |
| | | import org.dromara.system.service.ISysUserService; |
| | | import org.springframework.cache.annotation.CacheEvict; |
| | | import org.springframework.cache.annotation.Cacheable; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | |
| | | * @return ç»æ |
| | | */ |
| | | @Override |
| | | @CacheEvict(cacheNames = CacheNames.SYS_NICKNAME, key = "#user.userId") |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public int updateUser(SysUserBo user) { |
| | | // æ°å¢ç¨æ·ä¸è§è²ç®¡ç |
| | |
| | | * @param user ç¨æ·ä¿¡æ¯ |
| | | * @return ç»æ |
| | | */ |
| | | @CacheEvict(cacheNames = CacheNames.SYS_NICKNAME, key = "#user.userId") |
| | | @Override |
| | | public int updateUserProfile(SysUserBo user) { |
| | | return baseMapper.update(null, |
| | |
| | | if (CollUtil.isEmpty(userIds)) { |
| | | 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); |
| | | } |
| | | |
¶Ô±ÈÐÂÎļþ |
| | |
| | | # 工使µè¯´æ |
| | | |
| | | 工使µç®å卿ªæçé¶æ®µ åç»ä»ä¼ç»åéæ çè³éå(ç产使ç¨å请æ
éèèåç»æ¯å¦è¦æ´æ°ç»´æ¤) |
| | |
| | | <groupId>org.dromara</groupId> |
| | | <artifactId>ruoyi-common-tenant</artifactId> |
| | | </dependency> |
| | | |
| | | <dependency> |
| | | <groupId>org.dromara</groupId> |
| | | <artifactId>ruoyi-common-security</artifactId> |
| | | </dependency> |
| | | </dependencies> |
| | | |
| | | </project> |
| | |
| | | String ZIP = "ZIP"; |
| | | |
| | | /** |
| | | * æµç¨å®ä¾å¯¹è±¡ |
| | | * ä¸å¡ä¸æµç¨å®ä¾å
³è对象 |
| | | */ |
| | | String PROCESS_INSTANCE_VO = "processInstanceVo"; |
| | | String BUSINESS_INSTANCE_DTO = "businessInstanceDTO"; |
| | | |
| | | /** |
| | | * æµç¨å®ä¹é
ç½® |
| | |
| | | } |
| | | |
| | | /** |
| | | * éè¿æµç¨å®ä¾idè·åå岿µç¨å¾ |
| | | * éè¿ä¸å¡idè·åå岿µç¨å¾ |
| | | * |
| | | * @param processInstanceId æµç¨å®ä¾id |
| | | * @param businessKey ä¸å¡id |
| | | */ |
| | | @GetMapping("/getHistoryImage/{processInstanceId}") |
| | | public R<String> getHistoryImage(@NotBlank(message = "æµç¨å®ä¾idä¸è½ä¸ºç©º") @PathVariable String processInstanceId) { |
| | | return R.ok("æä½æå", actProcessInstanceService.getHistoryImage(processInstanceId)); |
| | | @GetMapping("/getHistoryImage/{businessKey}") |
| | | public R<String> getHistoryImage(@NotBlank(message = "ä¸å¡idä¸è½ä¸ºç©º") @PathVariable String businessKey) { |
| | | return R.ok("æä½æå", actProcessInstanceService.getHistoryImage(businessKey)); |
| | | } |
| | | |
| | | /** |
| | | * éè¿æµç¨å®ä¾idè·åå岿µç¨å¾è¿è¡ä¸ï¼åå²çèç¹ |
| | | * éè¿ä¸å¡idè·åå岿µç¨å¾è¿è¡ä¸ï¼åå²çèç¹ |
| | | * |
| | | * @param processInstanceId æµç¨å®ä¾id |
| | | * @param businessKey ä¸å¡id |
| | | */ |
| | | @GetMapping("/getHistoryList/{processInstanceId}") |
| | | public R<Map<String, Object>> getHistoryList(@NotBlank(message = "æµç¨å®ä¾idä¸è½ä¸ºç©º") @PathVariable String processInstanceId) { |
| | | return R.ok("æä½æå", actProcessInstanceService.getHistoryList(processInstanceId)); |
| | | @GetMapping("/getHistoryList/{businessKey}") |
| | | public R<Map<String, Object>> getHistoryList(@NotBlank(message = "ä¸å¡idä¸è½ä¸ºç©º") @PathVariable String businessKey) { |
| | | return R.ok("æä½æå", actProcessInstanceService.getHistoryList(businessKey)); |
| | | } |
| | | |
| | | /** |
| | | * è·å审æ¹è®°å½ |
| | | * |
| | | * @param processInstanceId æµç¨å®ä¾id |
| | | * @param businessKey ä¸å¡id |
| | | */ |
| | | @GetMapping("/getHistoryRecord/{processInstanceId}") |
| | | public R<List<ActHistoryInfoVo>> getHistoryRecord(@NotBlank(message = "æµç¨å®ä¾idä¸è½ä¸ºç©º") @PathVariable String processInstanceId) { |
| | | return R.ok(actProcessInstanceService.getHistoryRecord(processInstanceId)); |
| | | @GetMapping("/getHistoryRecord/{businessKey}") |
| | | public R<List<ActHistoryInfoVo>> getHistoryRecord(@NotBlank(message = "ä¸å¡idä¸è½ä¸ºç©º") @PathVariable String businessKey) { |
| | | return R.ok(actProcessInstanceService.getHistoryRecord(businessKey)); |
| | | } |
| | | |
| | | /** |
| | |
| | | /** |
| | | * è¿è¡ä¸çå®ä¾ å é¤ç¨å®ä¾ï¼å é¤åå²è®°å½ï¼å é¤ä¸å¡ä¸æµç¨å
³èä¿¡æ¯ |
| | | * |
| | | * @param processInstanceIds æµç¨å®ä¾id |
| | | * @param businessKeys ä¸å¡id |
| | | */ |
| | | @Log(title = "æµç¨å®ä¾ç®¡ç", businessType = BusinessType.DELETE) |
| | | @RepeatSubmit() |
| | | @DeleteMapping("/deleteRunAndHisInstance/{processInstanceIds}") |
| | | public R<Void> deleteRunAndHisInstance(@NotNull(message = "æµç¨å®ä¾idä¸è½ä¸ºç©º") @PathVariable String[] processInstanceIds) { |
| | | return toAjax(actProcessInstanceService.deleteRunAndHisInstance(Arrays.asList(processInstanceIds))); |
| | | @DeleteMapping("/deleteRunAndHisInstance/{businessKeys}") |
| | | public R<Void> deleteRunAndHisInstance(@NotNull(message = "ä¸å¡idä¸è½ä¸ºç©º") @PathVariable String[] businessKeys) { |
| | | return toAjax(actProcessInstanceService.deleteRunAndHisInstance(Arrays.asList(businessKeys))); |
| | | } |
| | | |
| | | /** |
| | | * 已宿çå®ä¾ å é¤ç¨å®ä¾ï¼å é¤åå²è®°å½ï¼å é¤ä¸å¡ä¸æµç¨å
³èä¿¡æ¯ |
| | | * |
| | | * @param processInstanceIds æµç¨å®ä¾id |
| | | * @param businessKeys ä¸å¡id |
| | | */ |
| | | @Log(title = "æµç¨å®ä¾ç®¡ç", businessType = BusinessType.DELETE) |
| | | @RepeatSubmit() |
| | | @DeleteMapping("/deleteFinishAndHisInstance/{processInstanceIds}") |
| | | public R<Void> deleteFinishAndHisInstance(@NotNull(message = "æµç¨å®ä¾idä¸è½ä¸ºç©º") @PathVariable String[] processInstanceIds) { |
| | | return toAjax(actProcessInstanceService.deleteFinishAndHisInstance(Arrays.asList(processInstanceIds))); |
| | | @DeleteMapping("/deleteFinishAndHisInstance/{businessKeys}") |
| | | public R<Void> deleteFinishAndHisInstance(@NotNull(message = "ä¸å¡idä¸è½ä¸ºç©º") @PathVariable String[] businessKeys) { |
| | | return toAjax(actProcessInstanceService.deleteFinishAndHisInstance(Arrays.asList(businessKeys))); |
| | | } |
| | | |
| | | /** |
| | | * æ¤éæµç¨ç³è¯· |
| | | * |
| | | * @param processInstanceId æµç¨å®ä¾id |
| | | * @param businessKey ä¸å¡id |
| | | */ |
| | | @Log(title = "æµç¨å®ä¾ç®¡ç", businessType = BusinessType.INSERT) |
| | | @RepeatSubmit() |
| | | @PostMapping("/cancelProcessApply/{processInstanceId}") |
| | | public R<Void> cancelProcessApply(@NotBlank(message = "æµç¨å®ä¾idä¸è½ä¸ºç©º") @PathVariable String processInstanceId) { |
| | | return toAjax(actProcessInstanceService.cancelProcessApply(processInstanceId)); |
| | | @PostMapping("/cancelProcessApply/{businessKey}") |
| | | public R<Void> cancelProcessApply(@NotBlank(message = "ä¸å¡idä¸è½ä¸ºç©º") @PathVariable String businessKey) { |
| | | return toAjax(actProcessInstanceService.cancelProcessApply(businessKey)); |
| | | } |
| | | |
| | | /** |
| | |
| | | @RepeatSubmit() |
| | | @PostMapping("/backProcess") |
| | | public R<String> backProcess(@Validated({AddGroup.class}) @RequestBody BackProcessBo backProcessBo) { |
| | | return R.ok(actTaskService.backProcess(backProcessBo)); |
| | | return R.ok("æä½æå", actTaskService.backProcess(backProcessBo)); |
| | | } |
| | | |
| | | /** |
| | |
| | | */ |
| | | @GetMapping("/getTaskUserIdsByAddMultiInstance/{taskId}") |
| | | public R<String> getTaskUserIdsByAddMultiInstance(@PathVariable String taskId) { |
| | | return R.ok(actTaskService.getTaskUserIdsByAddMultiInstance(taskId)); |
| | | return R.ok("æä½æå", actTaskService.getTaskUserIdsByAddMultiInstance(taskId)); |
| | | } |
| | | |
| | | /** |
| | |
| | | @Validated |
| | | @RequiredArgsConstructor |
| | | @RestController |
| | | @RequestMapping("/demo/leave") |
| | | @RequestMapping("/workflow/leave") |
| | | public class TestLeaveController extends BaseController { |
| | | |
| | | private final ITestLeaveService testLeaveService; |
| | |
| | | /** |
| | | * æ¥è¯¢è¯·åå表 |
| | | */ |
| | | @SaCheckPermission("demo:leave:list") |
| | | @SaCheckPermission("workflow:leave:list") |
| | | @GetMapping("/list") |
| | | public TableDataInfo<TestLeaveVo> list(TestLeaveBo bo, PageQuery pageQuery) { |
| | | return testLeaveService.queryPageList(bo, pageQuery); |
| | |
| | | /** |
| | | * 导åºè¯·åå表 |
| | | */ |
| | | @SaCheckPermission("demo:leave:export") |
| | | @SaCheckPermission("workflow:leave:export") |
| | | @Log(title = "请å", businessType = BusinessType.EXPORT) |
| | | @PostMapping("/export") |
| | | public void export(TestLeaveBo bo, HttpServletResponse response) { |
| | |
| | | * |
| | | * @param id ä¸»é® |
| | | */ |
| | | @SaCheckPermission("demo:leave:query") |
| | | @SaCheckPermission("workflow:leave:query") |
| | | @GetMapping("/{id}") |
| | | public R<TestLeaveVo> getInfo(@NotNull(message = "主é®ä¸è½ä¸ºç©º") |
| | | @PathVariable Long id) { |
| | |
| | | /** |
| | | * æ°å¢è¯·å |
| | | */ |
| | | @SaCheckPermission("demo:leave:add") |
| | | @SaCheckPermission("workflow:leave:add") |
| | | @Log(title = "请å", businessType = BusinessType.INSERT) |
| | | @RepeatSubmit() |
| | | @PostMapping() |
| | |
| | | /** |
| | | * ä¿®æ¹è¯·å |
| | | */ |
| | | @SaCheckPermission("demo:leave:edit") |
| | | @SaCheckPermission("workflow:leave:edit") |
| | | @Log(title = "请å", businessType = BusinessType.UPDATE) |
| | | @RepeatSubmit() |
| | | @PutMapping() |
| | |
| | | * |
| | | * @param ids 主é®ä¸² |
| | | */ |
| | | @SaCheckPermission("demo:leave:remove") |
| | | @SaCheckPermission("workflow:leave:remove") |
| | | @Log(title = "请å", businessType = BusinessType.DELETE) |
| | | @DeleteMapping("/{ids}") |
| | | public R<Void> remove(@NotEmpty(message = "主é®ä¸è½ä¸ºç©º") |
| | |
| | | */ |
| | | private String remark; |
| | | |
| | | /** |
| | | * ç¶æ |
| | | */ |
| | | private String status; |
| | | |
| | | |
| | | } |
| | |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | /** |
| | | * æµç¨å®ä¾id |
| | | * ä¸å¡id |
| | | */ |
| | | @NotBlank(message = "æµç¨å®ä¾idä¸è½ä¸ºç©º", groups = {AddGroup.class}) |
| | | private String processInstanceId; |
| | | @NotBlank(message = "ä¸å¡idä¸è½ä¸ºç©º", groups = {AddGroup.class}) |
| | | private String businessKey; |
| | | |
| | | /** |
| | | * ä½åºåå |
| | |
| | | */ |
| | | private String remark; |
| | | |
| | | /** |
| | | * ç¶æ |
| | | */ |
| | | private String status; |
| | | |
| | | |
| | | } |
| | |
| | | */ |
| | | private String processInstanceId; |
| | | /** |
| | | * çæ¬ |
| | | */ |
| | | private Integer version; |
| | | /** |
| | | * å¼å§æ¶é´ |
| | | */ |
| | | private Date startTime; |
| | |
| | | private String remark; |
| | | |
| | | /** |
| | | * æµç¨å®ä¾å¯¹è±¡ |
| | | * ç¶æ |
| | | */ |
| | | private ProcessInstanceVo processInstanceVo; |
| | | |
| | | @ExcelProperty(value = "ç¶æ") |
| | | private String status; |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | 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); |
| | | } |
| | | } |
| | |
| | | import org.flowable.job.service.JobHandler; |
| | | import org.flowable.job.service.impl.persistence.entity.JobEntity; |
| | | import org.flowable.task.api.Task; |
| | | import org.flowable.task.api.TaskQuery; |
| | | import org.flowable.variable.api.delegate.VariableScope; |
| | | |
| | | /** |
| | |
| | | /** |
| | | * éè¿æµç¨å®ä¾idè·åå岿µç¨å¾ |
| | | * |
| | | * @param processInstanceId æµç¨å®ä¾id |
| | | * @param businessKey æµç¨å®ä¾id |
| | | * @return ç»æ |
| | | */ |
| | | String getHistoryImage(String processInstanceId); |
| | | String getHistoryImage(String businessKey); |
| | | |
| | | /** |
| | | * éè¿æµç¨å®ä¾idè·åå岿µç¨å¾è¿è¡ä¸ï¼åå²çèç¹ |
| | | * éè¿ä¸å¡idè·åå岿µç¨å¾è¿è¡ä¸ï¼åå²çèç¹ |
| | | * |
| | | * @param processInstanceId æµç¨å®ä¾id |
| | | * @param businessKey ä¸å¡id |
| | | * @return ç»æ |
| | | */ |
| | | Map<String, Object> getHistoryList(String processInstanceId); |
| | | Map<String, Object> getHistoryList(String businessKey); |
| | | |
| | | /** |
| | | * å页æ¥è¯¢æ£å¨è¿è¡çæµç¨å®ä¾ |
| | |
| | | /** |
| | | * è·å审æ¹è®°å½ |
| | | * |
| | | * @param processInstanceId æµç¨å®ä¾id |
| | | * @param businessKey ä¸å¡id |
| | | * @return ç»æ |
| | | */ |
| | | List<ActHistoryInfoVo> getHistoryRecord(String processInstanceId); |
| | | List<ActHistoryInfoVo> getHistoryRecord(String businessKey); |
| | | |
| | | /** |
| | | * ä½åºæµç¨å®ä¾ï¼ä¸ä¼å é¤åå²è®°å½(å é¤è¿è¡ä¸çå®ä¾) |
| | |
| | | /** |
| | | * è¿è¡ä¸çå®ä¾ å é¤ç¨å®ä¾ï¼å é¤åå²è®°å½ï¼å é¤ä¸å¡ä¸æµç¨å
³èä¿¡æ¯ |
| | | * |
| | | * @param processInstanceIds æµç¨å®ä¾id |
| | | * @return ç»æ |
| | | */ |
| | | boolean deleteRunAndHisInstance(List<String> processInstanceIds); |
| | | |
| | | /** |
| | | * æç
§ä¸å¡idå é¤ è¿è¡ä¸çå®ä¾ å é¤ç¨å®ä¾ï¼å é¤åå²è®°å½ï¼å é¤ä¸å¡ä¸æµç¨å
³èä¿¡æ¯ |
| | | * |
| | | * @param businessKeys ä¸å¡id |
| | | * @return ç»æ |
| | | */ |
| | | boolean deleteRunAndHisInstanceByBusinessKeys(List<String> businessKeys); |
| | | boolean deleteRunAndHisInstance(List<String> businessKeys); |
| | | |
| | | /** |
| | | * 已宿çå®ä¾ å é¤ç¨å®ä¾ï¼å é¤åå²è®°å½ï¼å é¤ä¸å¡ä¸æµç¨å
³èä¿¡æ¯ |
| | | * |
| | | * @param processInstanceIds æµç¨å®ä¾id |
| | | * @param businessKeys ä¸å¡id |
| | | * @return ç»æ |
| | | */ |
| | | boolean deleteFinishAndHisInstance(List<String> processInstanceIds); |
| | | boolean deleteFinishAndHisInstance(List<String> businessKeys); |
| | | |
| | | /** |
| | | * æ¤éæµç¨ç³è¯· |
| | | * |
| | | * @param processInstanceId æµç¨å®ä¾id |
| | | * @param businessKey ä¸å¡id |
| | | * @return ç»æ |
| | | */ |
| | | boolean cancelProcessApply(String processInstanceId); |
| | | boolean cancelProcessApply(String businessKey); |
| | | |
| | | /** |
| | | * å页æ¥è¯¢å½åç»å½äººåæ® |
| | |
| | | import org.dromara.common.mybatis.core.page.TableDataInfo; |
| | | import org.dromara.common.satoken.utils.LoginHelper; |
| | | 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.domain.ActHiProcinst; |
| | | import org.dromara.workflow.domain.bo.ProcessInstanceBo; |
| | |
| | | import org.dromara.workflow.flowable.CustomDefaultProcessDiagramGenerator; |
| | | import org.dromara.workflow.flowable.cmd.DeleteExecutionCmd; |
| | | import org.dromara.workflow.flowable.cmd.ExecutionChildByExecutionIdCmd; |
| | | import org.dromara.workflow.flowable.strategy.FlowEventStrategy; |
| | | import org.dromara.workflow.flowable.strategy.FlowProcessEventHandler; |
| | | import org.dromara.workflow.flowable.handler.FlowProcessEventHandler; |
| | | import org.dromara.workflow.service.IActHiProcinstService; |
| | | import org.dromara.workflow.service.IActProcessInstanceService; |
| | | import org.dromara.workflow.service.IWfNodeConfigService; |
| | |
| | | private final TaskService taskService; |
| | | private final IActHiProcinstService actHiProcinstService; |
| | | private final ManagementService managementService; |
| | | private final FlowEventStrategy flowEventStrategy; |
| | | private final IWfTaskBackNodeService wfTaskBackNodeService; |
| | | private final IWfNodeConfigService wfNodeConfigService; |
| | | private final FlowProcessEventHandler flowProcessEventHandler; |
| | | |
| | | @Value("${flowable.activity-font-name}") |
| | | private String activityFontName; |
| | |
| | | } |
| | | |
| | | /** |
| | | * éè¿æµç¨å®ä¾idè·åå岿µç¨å¾ |
| | | * éè¿ä¸å¡idè·åå岿µç¨å¾ |
| | | * |
| | | * @param processInstanceId æµç¨å®ä¾id |
| | | * @param businessKey ä¸å¡id |
| | | */ |
| | | @SneakyThrows |
| | | @Override |
| | | public String getHistoryImage(String processInstanceId) { |
| | | public String getHistoryImage(String businessKey) { |
| | | String processDefinitionId; |
| | | // è·åå½åçæµç¨å®ä¾ |
| | | ProcessInstance processInstance = QueryUtils.instanceQuery(processInstanceId).singleResult(); |
| | | ProcessInstance processInstance = QueryUtils.businessKeyQuery(businessKey).singleResult(); |
| | | // 妿æµç¨å·²ç»ç»æï¼åå¾å°ç»æèç¹ |
| | | if (Objects.isNull(processInstance)) { |
| | | HistoricProcessInstance pi = QueryUtils.hisInstanceQuery(processInstanceId).singleResult(); |
| | | HistoricProcessInstance pi = QueryUtils.hisInstanceQuery().processInstanceBusinessKey(businessKey).singleResult(); |
| | | processDefinitionId = pi.getProcessDefinitionId(); |
| | | } else { |
| | | // æ ¹æ®æµç¨å®ä¾IDè·å¾å½åå¤äºæ´»å¨ç¶æçActivityIdåé |
| | | ProcessInstance pi = QueryUtils.instanceQuery(processInstanceId).singleResult(); |
| | | ProcessInstance pi = QueryUtils.instanceQuery(processInstance.getProcessInstanceId()).singleResult(); |
| | | 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> highLightedNodes = new ArrayList<>(); |
| | |
| | | } |
| | | |
| | | /** |
| | | * éè¿æµç¨å®ä¾idè·åå岿µç¨å¾è¿è¡ä¸ï¼åå²çèç¹ |
| | | * éè¿ä¸å¡idè·åå岿µç¨å¾è¿è¡ä¸ï¼åå²çèç¹ |
| | | * |
| | | * @param processInstanceId æµç¨å®ä¾id |
| | | * @param businessKey ä¸å¡id |
| | | */ |
| | | @Override |
| | | public Map<String, Object> getHistoryList(String processInstanceId) { |
| | | public Map<String, Object> getHistoryList(String businessKey) { |
| | | Map<String, Object> map = new HashMap<>(); |
| | | 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(); |
| | | ProcessDefinition processDefinition = repositoryService.getProcessDefinition(historicProcessInstance.getProcessDefinitionId()); |
| | | // è·åèç¹ |
| | |
| | | } |
| | | } |
| | | map.put("taskList", taskList); |
| | | List<ActHistoryInfoVo> historyTaskList = getHistoryTaskList(processInstanceId); |
| | | List<ActHistoryInfoVo> historyTaskList = getHistoryTaskList(processInstanceId, processDefinition.getVersion()); |
| | | map.put("historyList", historyTaskList); |
| | | InputStream inputStream = repositoryService.getResourceAsStream(processDefinition.getDeploymentId(), processDefinition.getResourceName()); |
| | | xml.append(IoUtil.read(inputStream, StandardCharsets.UTF_8)); |
| | |
| | | * è·ååå²ä»»å¡èç¹ä¿¡æ¯ |
| | | * |
| | | * @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 = StreamUtils.sorted(list, Comparator.comparing(HistoricTaskInstance::getEndTime, Comparator.nullsFirst(Date::compareTo)).reversed()); |
| | |
| | | if (ObjectUtil.isNotEmpty(historicTaskInstance.getDurationInMillis())) { |
| | | actHistoryInfoVo.setRunDuration(getDuration(historicTaskInstance.getDurationInMillis())); |
| | | } |
| | | actHistoryInfoVo.setVersion(version); |
| | | actHistoryInfoVoList.add(actHistoryInfoVo); |
| | | } |
| | | List<ActHistoryInfoVo> historyInfoVoList = new ArrayList<>(); |
| | | Map<String, List<ActHistoryInfoVo>> groupByKey = StreamUtils.groupByKey(actHistoryInfoVoList, ActHistoryInfoVo::getTaskDefinitionKey); |
| | | for (Map.Entry<String, List<ActHistoryInfoVo>> entry : groupByKey.entrySet()) { |
| | | ActHistoryInfoVo historyInfoVo = new ActHistoryInfoVo(); |
| | | BeanUtils.copyProperties(entry.getValue().get(0), historyInfoVo); |
| | | actHistoryInfoVoList.stream().filter(e -> e.getTaskDefinitionKey().equals(entry.getKey()) && e.getEndTime() == null).findFirst() |
| | | .ifPresent(e -> { |
| | | historyInfoVo.setStatus("å¾
å¤ç"); |
| | | historyInfoVo.setStartTime(e.getStartTime()); |
| | | historyInfoVo.setEndTime(null); |
| | | historyInfoVo.setRunDuration(null); |
| | | if (ObjectUtil.isEmpty(e.getAssignee())) { |
| | | ParticipantVo participantVo = WorkflowUtils.getCurrentTaskParticipant(e.getId()); |
| | | if (entry.getValue().size() > 1) { |
| | | 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 -> { |
| | | BeanUtils.copyProperties(e, historyInfoVo); |
| | | historyInfoVo.setStatus(e.getEndTime() == null ? "å¾
å¤ç" : "å·²å¤ç"); |
| | | historyInfoVo.setStartTime(e.getStartTime()); |
| | | historyInfoVo.setEndTime(e.getEndTime() == null ? null : e.getEndTime()); |
| | | historyInfoVo.setRunDuration(e.getEndTime() == null ? null : e.getRunDuration()); |
| | | if (ObjectUtil.isEmpty(e.getAssignee())) { |
| | | ParticipantVo participantVo = WorkflowUtils.getCurrentTaskParticipant(e.getId()); |
| | | if (ObjectUtil.isNotEmpty(participantVo) && CollUtil.isNotEmpty(participantVo.getCandidate())) { |
| | | historyInfoVo.setAssignee(StreamUtils.join(participantVo.getCandidate(), Convert::toStr)); |
| | | } |
| | | } |
| | | }); |
| | | |
| | | } |
| | | historyInfoVoList.add(historyInfoVo); |
| | | |
| | | } |
| | | return historyInfoVoList; |
| | | } |
| | |
| | | /** |
| | | * è·å审æ¹è®°å½ |
| | | * |
| | | * @param processInstanceId æµç¨å®ä¾id |
| | | * @param businessKey ä¸å¡id |
| | | */ |
| | | @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()); |
| | | HistoricProcessInstance historicProcessInstance = QueryUtils.hisBusinessKeyQuery(businessKey).singleResult(); |
| | | String processInstanceId = historicProcessInstance.getId(); |
| | | List<ActHistoryInfoVo> actHistoryInfoVoList = new ArrayList<>(); |
| | | List<Comment> processInstanceComments = taskService.getProcessInstanceComments(processInstanceId); |
| | | //éä»¶ |
| | |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public boolean deleteRunInstance(ProcessInvalidBo processInvalidBo) { |
| | | 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())); |
| | | if (CollUtil.isNotEmpty(subTasks)) { |
| | | subTasks.forEach(e -> taskService.deleteTask(e.getId())); |
| | |
| | | for (Task task : StreamUtils.filter(list, e -> StringUtils.isBlank(e.getParentTaskId()))) { |
| | | 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()); |
| | | runtimeService.updateBusinessStatus(processInvalidBo.getProcessInstanceId(), BusinessStatusEnum.INVALID.getStatus()); |
| | | runtimeService.deleteProcessInstance(processInvalidBo.getProcessInstanceId(), deleteReason); |
| | | FlowProcessEventHandler processHandler = flowEventStrategy.getProcessHandler(historicProcessInstance.getProcessDefinitionKey()); |
| | | if (processHandler != null) { |
| | | processHandler.handleProcess(historicProcessInstance.getBusinessKey(), BusinessStatusEnum.INVALID.getStatus(), false); |
| | | } |
| | | runtimeService.updateBusinessStatus(processInstanceId, BusinessStatusEnum.INVALID.getStatus()); |
| | | runtimeService.deleteProcessInstance(processInstanceId, deleteReason); |
| | | //æµç¨ä½åºçå¬ |
| | | flowProcessEventHandler.processHandler(historicProcessInstance.getProcessDefinitionKey(), |
| | | historicProcessInstance.getBusinessKey(), BusinessStatusEnum.INVALID.getStatus(), false); |
| | | return true; |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | |
| | | /** |
| | | * è¿è¡ä¸çå®ä¾ å é¤ç¨å®ä¾ï¼å é¤åå²è®°å½ï¼å é¤ä¸å¡ä¸æµç¨å
³èä¿¡æ¯ |
| | | * |
| | | * @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 |
| | | */ |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public boolean deleteRunAndHisInstanceByBusinessKeys(List<String> businessKeys) { |
| | | public boolean deleteRunAndHisInstance(List<String> businessKeys) { |
| | | try { |
| | | // 1.å é¤è¿è¡ä¸æµç¨å®ä¾ |
| | | List<ActHiProcinst> actHiProcinsts = actHiProcinstService.selectByBusinessKeyIn(businessKeys); |
| | |
| | | /** |
| | | * 已宿çå®ä¾ å é¤ç¨å®ä¾ï¼å é¤åå²è®°å½ï¼å é¤ä¸å¡ä¸æµç¨å
³èä¿¡æ¯ |
| | | * |
| | | * @param processInstanceIds æµç¨å®ä¾id |
| | | * @param businessKeys ä¸å¡id |
| | | */ |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public boolean deleteFinishAndHisInstance(List<String> processInstanceIds) { |
| | | public boolean deleteFinishAndHisInstance(List<String> businessKeys) { |
| | | 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); |
| | | wfTaskBackNodeService.deleteByInstanceIds(processInstanceIds); |
| | | return true; |
| | |
| | | /** |
| | | * æ¤éæµç¨ç³è¯· |
| | | * |
| | | * @param processInstanceId æµç¨å®ä¾id |
| | | * @param businessKey ä¸å¡id |
| | | */ |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public boolean cancelProcessApply(String processInstanceId) { |
| | | public boolean cancelProcessApply(String businessKey) { |
| | | try { |
| | | ProcessInstance processInstance = QueryUtils.instanceQuery(processInstanceId) |
| | | ProcessInstance processInstance = QueryUtils.businessKeyQuery(businessKey) |
| | | .startedBy(String.valueOf(LoginHelper.getUserId())).singleResult(); |
| | | if (ObjectUtil.isNull(processInstance)) { |
| | | throw new ServiceException("æ¨ä¸æ¯æµç¨å起人,æ¤é失败!"); |
| | |
| | | if (processInstance.isSuspended()) { |
| | | throw new ServiceException(FlowConstant.MESSAGE_SUSPENDED); |
| | | } |
| | | String processInstanceId = processInstance.getId(); |
| | | BusinessStatusEnum.checkCancelStatus(processInstance.getBusinessStatus()); |
| | | List<Task> taskList = QueryUtils.taskQuery(processInstanceId).list(); |
| | | for (Task task : taskList) { |
| | | taskService.setAssignee(task.getId(), null); |
| | | 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); |
| | | runtimeService.createChangeActivityStateBuilder() |
| | | .processInstanceId(processInstanceId) |
| | |
| | | managementService.executeCommand(deleteExecutionCmd); |
| | | } |
| | | runtimeService.updateBusinessStatus(processInstanceId, BusinessStatusEnum.CANCEL.getStatus()); |
| | | FlowProcessEventHandler processHandler = flowEventStrategy.getProcessHandler(processInstance.getProcessDefinitionKey()); |
| | | if (processHandler != null) { |
| | | processHandler.handleProcess(processInstance.getBusinessKey(), BusinessStatusEnum.CANCEL.getStatus(), false); |
| | | } |
| | | //æµç¨ä½åºçå¬ |
| | | flowProcessEventHandler.processHandler(processInstance.getProcessDefinitionKey(), |
| | | processInstance.getBusinessKey(), BusinessStatusEnum.CANCEL.getStatus(), false); |
| | | return true; |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | |
| | | import org.dromara.common.satoken.utils.LoginHelper; |
| | | import org.dromara.common.tenant.helper.TenantHelper; |
| | | 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.domain.ActHiTaskinst; |
| | | import org.dromara.workflow.domain.WfTaskBackNode; |
| | | import org.dromara.workflow.domain.bo.*; |
| | | import org.dromara.workflow.domain.vo.*; |
| | | import org.dromara.workflow.flowable.cmd.*; |
| | | import org.dromara.workflow.flowable.strategy.FlowEventStrategy; |
| | | import org.dromara.workflow.flowable.strategy.FlowProcessEventHandler; |
| | | import org.dromara.workflow.flowable.strategy.FlowTaskEventHandler; |
| | | import org.dromara.workflow.flowable.handler.FlowProcessEventHandler; |
| | | import org.dromara.workflow.mapper.ActHiTaskinstMapper; |
| | | import org.dromara.workflow.mapper.ActTaskMapper; |
| | | import org.dromara.workflow.service.IActTaskService; |
| | |
| | | private final HistoryService historyService; |
| | | private final IdentityService identityService; |
| | | private final ManagementService managementService; |
| | | private final FlowEventStrategy flowEventStrategy; |
| | | private final ActTaskMapper actTaskMapper; |
| | | private final IWfTaskBackNodeService wfTaskBackNodeService; |
| | | private final ActHiTaskinstMapper actHiTaskinstMapper; |
| | | private final IWfNodeConfigService wfNodeConfigService; |
| | | private final IWfDefinitionConfigService wfDefinitionConfigService; |
| | | private final UserService userService; |
| | | private final FlowProcessEventHandler flowProcessEventHandler; |
| | | |
| | | /** |
| | | * å¯å¨ä»»å¡ |
| | |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public boolean completeTask(CompleteTaskBo completeTaskBo) { |
| | | try { |
| | | List<RoleDTO> roles = LoginHelper.getLoginUser().getRoles(); |
| | | String userId = String.valueOf(LoginHelper.getUserId()); |
| | | TaskQuery taskQuery = QueryUtils.taskQuery(); |
| | | 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(); |
| | | Task task = WorkflowUtils.getTaskByCurrentUser(completeTaskBo.getTaskId()); |
| | | if (task == null) { |
| | | throw new ServiceException(FlowConstant.MESSAGE_CURRENT_TASK_IS_NULL); |
| | | } |
| | |
| | | //éä»¶ä¸ä¼ |
| | | AttachmentCmd attachmentCmd = new AttachmentCmd(completeTaskBo.getFileId(), task.getId(), task.getProcessInstanceId()); |
| | | managementService.executeCommand(attachmentCmd); |
| | | FlowProcessEventHandler processHandler = flowEventStrategy.getProcessHandler(processInstance.getProcessDefinitionKey()); |
| | | String businessStatus = WorkflowUtils.getBusinessStatus(task.getProcessInstanceId()); |
| | | String businessStatus = WorkflowUtils.getBusinessStatus(processInstance.getBusinessKey()); |
| | | //æµç¨æäº¤çå¬ |
| | | if (BusinessStatusEnum.DRAFT.getStatus().equals(businessStatus) || BusinessStatusEnum.BACK.getStatus().equals(businessStatus) || BusinessStatusEnum.CANCEL.getStatus().equals(businessStatus)) { |
| | | if (processHandler != null) { |
| | | processHandler.handleProcess(processInstance.getBusinessKey(), businessStatus, true); |
| | | } |
| | | flowProcessEventHandler.processHandler(processInstance.getProcessDefinitionKey(), processInstance.getBusinessKey(), businessStatus, true); |
| | | } |
| | | runtimeService.updateBusinessStatus(task.getProcessInstanceId(), BusinessStatusEnum.WAITING.getStatus()); |
| | | String key = processInstance.getProcessDefinitionKey() + "_" + task.getTaskDefinitionKey(); |
| | | FlowTaskEventHandler taskHandler = flowEventStrategy.getTaskHandler(key); |
| | | if (taskHandler != null) { |
| | | taskHandler.handleTask(task.getId(), processInstance.getBusinessKey()); |
| | | } |
| | | //åççå¬ |
| | | String keyNode = processInstance.getProcessDefinitionKey() + "_" + task.getTaskDefinitionKey(); |
| | | flowProcessEventHandler.processTaskHandler(keyNode, task.getId(), processInstance.getBusinessKey()); |
| | | //åçæè§ |
| | | taskService.addComment(completeTaskBo.getTaskId(), task.getProcessInstanceId(), TaskStatusEnum.PASS.getStatus(), StringUtils.isBlank(completeTaskBo.getMessage()) ? "åæ" : completeTaskBo.getMessage()); |
| | | //åçä»»å¡ |
| | |
| | | if (pi == null) { |
| | | UpdateBusinessStatusCmd updateBusinessStatusCmd = new UpdateBusinessStatusCmd(task.getProcessInstanceId(), BusinessStatusEnum.FINISH.getStatus()); |
| | | managementService.executeCommand(updateBusinessStatusCmd); |
| | | if (processHandler != null) { |
| | | processHandler.handleProcess(processInstance.getBusinessKey(), BusinessStatusEnum.FINISH.getStatus(), false); |
| | | } |
| | | flowProcessEventHandler.processHandler(processInstance.getProcessDefinitionKey(), processInstance.getBusinessKey(), |
| | | BusinessStatusEnum.FINISH.getStatus(), false); |
| | | } else { |
| | | List<Task> list = QueryUtils.taskQuery(task.getProcessInstanceId()).list(); |
| | | for (Task t : list) { |
| | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public boolean delegateTask(DelegateBo delegateBo) { |
| | | TaskQuery query = QueryUtils.taskQuery(); |
| | | TaskEntity task = (TaskEntity) query.taskId(delegateBo.getTaskId()).taskCandidateOrAssigned(String.valueOf(LoginHelper.getUserId())).singleResult(); |
| | | Task task = WorkflowUtils.getTaskByCurrentUser(delegateBo.getTaskId()); |
| | | |
| | | if (ObjectUtil.isEmpty(task)) { |
| | | throw new ServiceException(FlowConstant.MESSAGE_CURRENT_TASK_IS_NULL); |
| | | } |
| | |
| | | runtimeService.updateBusinessStatus(task.getProcessInstanceId(), BusinessStatusEnum.TERMINATION.getStatus()); |
| | | runtimeService.deleteProcessInstance(task.getProcessInstanceId(), StrUtil.EMPTY); |
| | | } |
| | | FlowProcessEventHandler processHandler = flowEventStrategy.getProcessHandler(historicProcessInstance.getProcessDefinitionKey()); |
| | | if (processHandler != null) { |
| | | processHandler.handleProcess(historicProcessInstance.getBusinessKey(), BusinessStatusEnum.TERMINATION.getStatus(), false); |
| | | } |
| | | //æµç¨ç»æ¢çå¬ |
| | | flowProcessEventHandler.processHandler(historicProcessInstance.getProcessDefinitionKey(), |
| | | historicProcessInstance.getBusinessKey(), BusinessStatusEnum.TERMINATION.getStatus(), false); |
| | | return true; |
| | | } catch (Exception e) { |
| | | throw new ServiceException(e.getMessage()); |
| | |
| | | */ |
| | | @Override |
| | | 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)) { |
| | | throw new ServiceException(FlowConstant.MESSAGE_CURRENT_TASK_IS_NULL); |
| | | } |
| | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public String backProcess(BackProcessBo backProcessBo) { |
| | | TaskQuery query = QueryUtils.taskQuery(); |
| | | 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)) { |
| | | throw new ServiceException(FlowConstant.MESSAGE_CURRENT_TASK_IS_NULL); |
| | | } |
| | |
| | | MultiInstanceVo multiInstance = WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey()); |
| | | if (multiInstance == null && taskList.size() > 1) { |
| | | List<Task> tasks = StreamUtils.filter(taskList, e -> !e.getTaskDefinitionKey().equals(task.getTaskDefinitionKey())); |
| | | actHiTaskinstMapper.deleteBatchIds(StreamUtils.toList(tasks, Task::getId)); |
| | | if (CollUtil.isNotEmpty(tasks)) { |
| | | actHiTaskinstMapper.deleteBatchIds(StreamUtils.toList(tasks, Task::getId)); |
| | | } |
| | | } |
| | | |
| | | |
| | |
| | | WfTaskBackNode wfTaskBackNode = wfTaskBackNodeService.getListByInstanceIdAndNodeId(task.getProcessInstanceId(), backProcessBo.getTargetActivityId()); |
| | | if (ObjectUtil.isNotNull(wfTaskBackNode) && wfTaskBackNode.getOrderNo() == 0) { |
| | | runtimeService.updateBusinessStatus(processInstanceId, BusinessStatusEnum.BACK.getStatus()); |
| | | FlowProcessEventHandler processHandler = flowEventStrategy.getProcessHandler(processInstance.getProcessDefinitionKey()); |
| | | if (processHandler != null) { |
| | | processHandler.handleProcess(processInstance.getBusinessKey(), BusinessStatusEnum.BACK.getStatus(), false); |
| | | } |
| | | flowProcessEventHandler.processHandler(processInstance.getProcessDefinitionKey(), |
| | | processInstance.getBusinessKey(), BusinessStatusEnum.BACK.getStatus(), false); |
| | | } |
| | | //å é¤é©³ååçæµç¨èç¹ |
| | | wfTaskBackNodeService.deleteBackTaskNode(processInstanceId, backProcessBo.getTargetActivityId()); |
| | |
| | | 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.toolkit.Wrappers; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | 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.StreamUtils; |
| | | import org.dromara.common.core.utils.StringUtils; |
| | |
| | | import org.dromara.workflow.domain.bo.TestLeaveBo; |
| | | import org.dromara.workflow.domain.vo.TestLeaveVo; |
| | | import org.dromara.workflow.mapper.TestLeaveMapper; |
| | | import org.dromara.workflow.service.IActProcessInstanceService; |
| | | 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.transaction.annotation.Transactional; |
| | | |
| | |
| | | */ |
| | | @RequiredArgsConstructor |
| | | @Service |
| | | @Slf4j |
| | | public class TestLeaveServiceImpl implements ITestLeaveService { |
| | | |
| | | private final TestLeaveMapper baseMapper; |
| | | private final IActProcessInstanceService actProcessInstanceService; |
| | | private final WorkflowService workflowService; |
| | | |
| | | /** |
| | | * æ¥è¯¢è¯·å |
| | | */ |
| | | @Override |
| | | public TestLeaveVo queryById(Long id) { |
| | | TestLeaveVo testLeaveVo = baseMapper.selectVoById(id); |
| | | WorkflowUtils.setProcessInstanceVo(testLeaveVo, String.valueOf(id)); |
| | | return testLeaveVo; |
| | | return baseMapper.selectVoById(id); |
| | | } |
| | | |
| | | /** |
| | |
| | | public TableDataInfo<TestLeaveVo> queryPageList(TestLeaveBo bo, PageQuery pageQuery) { |
| | | LambdaQueryWrapper<TestLeave> lqw = buildQueryWrapper(bo); |
| | | Page<TestLeaveVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw); |
| | | TableDataInfo<TestLeaveVo> build = 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; |
| | | return TableDataInfo.build(result); |
| | | } |
| | | |
| | | /** |
| | |
| | | @Override |
| | | public TestLeaveVo insertByBo(TestLeaveBo bo) { |
| | | TestLeave add = MapstructUtils.convert(bo, TestLeave.class); |
| | | if (StringUtils.isBlank(add.getStatus())) { |
| | | add.setStatus(BusinessStatusEnum.DRAFT.getStatus()); |
| | | } |
| | | boolean flag = baseMapper.insert(add) > 0; |
| | | if (flag) { |
| | | bo.setId(add.getId()); |
| | | } |
| | | TestLeaveVo testLeaveVo = MapstructUtils.convert(add, TestLeaveVo.class); |
| | | WorkflowUtils.setProcessInstanceVo(testLeaveVo, String.valueOf(add.getId())); |
| | | return testLeaveVo; |
| | | return MapstructUtils.convert(add, TestLeaveVo.class); |
| | | } |
| | | |
| | | /** |
| | |
| | | public TestLeaveVo updateByBo(TestLeaveBo bo) { |
| | | TestLeave update = MapstructUtils.convert(bo, TestLeave.class); |
| | | baseMapper.updateById(update); |
| | | TestLeaveVo testLeaveVo = MapstructUtils.convert(update, TestLeaveVo.class); |
| | | WorkflowUtils.setProcessInstanceVo(testLeaveVo, String.valueOf(update.getId())); |
| | | return testLeaveVo; |
| | | return MapstructUtils.convert(update, TestLeaveVo.class); |
| | | } |
| | | |
| | | /** |
| | |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Boolean deleteWithValidByIds(Collection<Long> ids) { |
| | | List<String> idList = StreamUtils.toList(ids, String::valueOf); |
| | | actProcessInstanceService.deleteRunAndHisInstanceByBusinessKeys(idList); |
| | | workflowService.deleteRunAndHisInstance(idList); |
| | | 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); |
| | | } |
| | | |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | 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(); |
| | | } |
| | | } |
| | |
| | | import org.flowable.engine.repository.DeploymentQuery; |
| | | import org.flowable.engine.repository.ModelQuery; |
| | | import org.flowable.engine.repository.ProcessDefinitionQuery; |
| | | import org.flowable.engine.runtime.ProcessInstance; |
| | | import org.flowable.engine.runtime.ProcessInstanceQuery; |
| | | import org.flowable.task.api.Task; |
| | | import org.flowable.task.api.TaskQuery; |
| | |
| | | return hisTaskInstanceQuery().processInstanceId(processInstanceId); |
| | | } |
| | | |
| | | public static HistoricTaskInstanceQuery hisTaskBusinessKeyQuery(String businessKey) { |
| | | return hisTaskInstanceQuery().processInstanceBusinessKey(businessKey); |
| | | } |
| | | |
| | | public static ProcessInstanceQuery instanceQuery() { |
| | | ProcessInstanceQuery query = PROCESS_ENGINE.getRuntimeService().createProcessInstanceQuery(); |
| | | if (TenantHelper.isEnable()) { |
| | |
| | | |
| | | public static ProcessInstanceQuery instanceQuery(String processInstanceId) { |
| | | return instanceQuery().processInstanceId(processInstanceId); |
| | | } |
| | | |
| | | public static ProcessInstanceQuery businessKeyQuery(String businessKey) { |
| | | return instanceQuery().processInstanceBusinessKey(businessKey); |
| | | } |
| | | |
| | | public static ProcessInstanceQuery instanceQuery(Set<String> processInstanceIds) { |
| | |
| | | |
| | | public static HistoricProcessInstanceQuery hisInstanceQuery(String processInstanceId) { |
| | | return hisInstanceQuery().processInstanceId(processInstanceId); |
| | | } |
| | | |
| | | public static HistoricProcessInstanceQuery hisBusinessKeyQuery(String businessKey) { |
| | | return hisInstanceQuery().processInstanceBusinessKey(businessKey); |
| | | } |
| | | |
| | | public static HistoricProcessInstanceQuery hisInstanceQuery(Set<String> processInstanceIds) { |
| | |
| | | if (task == null) { |
| | | return null; |
| | | } |
| | | ProcessInstance processInstance = QueryUtils.instanceQuery(task.getProcessInstanceId()).singleResult(); |
| | | TaskVo taskVo = BeanUtil.toBean(task, TaskVo.class); |
| | | taskVo.setBusinessKey(processInstance.getBusinessKey()); |
| | | taskVo.setMultiInstance(WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey()) != null); |
| | | String businessStatus = WorkflowUtils.getBusinessStatus(taskVo.getProcessInstanceId()); |
| | | String businessStatus = WorkflowUtils.getBusinessStatus(taskVo.getBusinessKey()); |
| | | taskVo.setBusinessStatus(businessStatus); |
| | | return taskVo; |
| | | } |
| | |
| | | package org.dromara.workflow.utils; |
| | | |
| | | import cn.hutool.core.bean.BeanUtil; |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.hutool.core.util.ObjectUtil; |
| | | import cn.hutool.core.util.StrUtil; |
| | | import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; |
| | | import lombok.AccessLevel; |
| | | import lombok.NoArgsConstructor; |
| | | import org.dromara.common.core.domain.dto.RoleDTO; |
| | | import org.dromara.common.core.domain.dto.UserDTO; |
| | | import org.dromara.common.core.service.UserService; |
| | | import org.dromara.common.core.utils.SpringUtils; |
| | | import org.dromara.common.core.utils.StreamUtils; |
| | | 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.satoken.utils.LoginHelper; |
| | | import org.dromara.common.tenant.helper.TenantHelper; |
| | | import org.dromara.common.websocket.dto.WebSocketMessageDto; |
| | | import org.dromara.common.websocket.utils.WebSocketUtils; |
| | | 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.TaskStatusEnum; |
| | | import org.dromara.workflow.domain.ActHiProcinst; |
| | | import org.dromara.workflow.domain.ActHiTaskinst; |
| | | import org.dromara.workflow.domain.vo.MultiInstanceVo; |
| | | 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.mapper.ActHiTaskinstMapper; |
| | | import org.dromara.workflow.service.IActHiProcinstService; |
| | | import org.flowable.bpmn.model.BpmnModel; |
| | | import org.flowable.bpmn.model.FlowNode; |
| | | import org.flowable.common.engine.api.delegate.Expression; |
| | |
| | | import org.flowable.engine.impl.bpmn.behavior.SequentialMultiInstanceBehavior; |
| | | import org.flowable.identitylink.api.history.HistoricIdentityLink; |
| | | import org.flowable.task.api.Task; |
| | | import org.flowable.task.api.TaskQuery; |
| | | import org.flowable.task.api.history.HistoricTaskInstance; |
| | | import org.flowable.task.service.impl.persistence.entity.TaskEntity; |
| | | |
| | | import java.util.*; |
| | | |
| | | import static org.dromara.workflow.common.constant.FlowConstant.PROCESS_INSTANCE_VO; |
| | | |
| | | /** |
| | | * 工使µå·¥å
· |
| | |
| | | public class WorkflowUtils { |
| | | |
| | | 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); |
| | | |
| | | /** |
| | |
| | | * @param taskId ä»»å¡id |
| | | */ |
| | | public static ParticipantVo getCurrentTaskParticipant(String taskId) { |
| | | UserService userService = SpringUtils.getBean(UserService.class); |
| | | ParticipantVo participantVo = new ParticipantVo(); |
| | | List<HistoricIdentityLink> linksForTask = PROCESS_ENGINE.getHistoryService().getHistoricIdentityLinksForTask(taskId); |
| | | Task task = QueryUtils.taskQuery().taskId(taskId).singleResult(); |
| | |
| | | List<HistoricIdentityLink> groupList = StreamUtils.filter(linksForTask, e -> StringUtils.isNotBlank(e.getGroupId())); |
| | | if (CollUtil.isNotEmpty(groupList)) { |
| | | 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)) { |
| | | participantVo.setGroupIds(groupIds); |
| | | List<UserDTO> userList = USER_SERVICE.selectListByIds(userIds); |
| | | List<UserDTO> userList = userService.selectListByIds(userIds); |
| | | if (CollUtil.isNotEmpty(userList)) { |
| | | List<Long> userIdList = StreamUtils.toList(userList, UserDTO::getUserId); |
| | | List<String> nickNames = StreamUtils.toList(userList, UserDTO::getNickName); |
| | |
| | | |
| | | } |
| | | } |
| | | List<UserDTO> userList = USER_SERVICE.selectListByIds(userIdList); |
| | | List<UserDTO> userList = userService.selectListByIds(userIdList); |
| | | if (CollUtil.isNotEmpty(userList)) { |
| | | List<Long> userIds = StreamUtils.toList(userList, UserDTO::getUserId); |
| | | List<String> nickNames = StreamUtils.toList(userList, UserDTO::getNickName); |
| | |
| | | /** |
| | | * è·åå½åæµç¨ç¶æ |
| | | * |
| | | * @param processInstanceId æµç¨å®ä¾id |
| | | */ |
| | | public static String getBusinessStatus(String processInstanceId) { |
| | | HistoricProcessInstance historicProcessInstance = QueryUtils.hisInstanceQuery(processInstanceId).singleResult(); |
| | | return historicProcessInstance.getBusinessStatus(); |
| | | } |
| | | |
| | | /** |
| | | * 设置æµç¨å®ä¾å¯¹è±¡ |
| | | * |
| | | * @param obj ä¸å¡å¯¹è±¡ |
| | | * @param businessKey ä¸å¡id |
| | | */ |
| | | public static void setProcessInstanceVo(Object obj, String businessKey) { |
| | | if (StringUtils.isBlank(businessKey) || obj == null) { |
| | | return; |
| | | } |
| | | 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); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | public static String getBusinessStatus(String businessKey) { |
| | | HistoricProcessInstance historicProcessInstance = QueryUtils.hisBusinessKeyQuery(businessKey).singleResult(); |
| | | return historicProcessInstance.getBusinessStatus(); |
| | | } |
| | | |
| | | /** |
| | |
| | | * @param 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<>(); |
| | | if (StringUtils.isBlank(message)) { |
| | | message = "ææ°çã" + name + "ãåæ®å·²ç»æäº¤è³æ¨çå¾
åï¼è¯·æ¨åæ¶å¤çã"; |
| | |
| | | for (Task t : list) { |
| | | ParticipantVo taskParticipant = WorkflowUtils.getCurrentTaskParticipant(t.getId()); |
| | | if (CollUtil.isNotEmpty(taskParticipant.getGroupIds())) { |
| | | List<Long> userIdList = USER_SERVICE.selectUserIdsByRoleIds(taskParticipant.getGroupIds()); |
| | | List<Long> userIdList = userService.selectUserIdsByRoleIds(taskParticipant.getGroupIds()); |
| | | if (CollUtil.isNotEmpty(userIdList)) { |
| | | userIds.addAll(userIdList); |
| | | } |
| | |
| | | } |
| | | } |
| | | 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) { |
| | | MessageTypeEnum messageTypeEnum = MessageTypeEnum.getByCode(code); |
| | | if (ObjectUtil.isNotEmpty(messageTypeEnum)) { |
| | |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * æ ¹æ®ä»»å¡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(); |
| | | } |
| | | } |
| | |
| | | end_date datetime not null comment 'ç»ææ¶é´', |
| | | leave_days int(10) not null comment '请å天æ°', |
| | | remark varchar(255) null comment '请ååå ', |
| | | status varchar(255) null comment 'ç¶æ', |
| | | create_dept bigint null comment 'å建é¨é¨', |
| | | create_by bigint null comment 'å建è
', |
| | | create_time datetime null 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 |
| | | ( |
| | |
| | | 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 (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 (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 (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 (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 (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 (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', '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', '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', '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', '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', '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 (14, '000000', '表åç±»å', 'wf_form_type', 103, 1, sysdate(), NULL, NULL, '表åç±»åå表'); |
| | |
| | | END_DATE DATE, |
| | | LEAVE_DAYS NUMBER(10), |
| | | REMARK VARCHAR2(255), |
| | | STATUS VARCHAR2(255), |
| | | CREATE_DEPT NUMBER(20), |
| | | CREATE_BY NUMBER(20), |
| | | CREATE_TIME DATE, |
| | |
| | | comment on column TEST_LEAVE.END_DATE is 'ç»ææ¶é´'; |
| | | comment on column TEST_LEAVE.LEAVE_DAYS 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_BY is 'å建è
'; |
| | | comment on column TEST_LEAVE.CREATE_TIME is 'å建æ¶é´'; |
| | |
| | | comment on column WF_FORM_MANAGE.UPDATE_BY 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 |
| | | ( |
| | |
| | | comment on column WF_NODE_CONFIG.UPDATE_BY 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 (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 (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 (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 (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 (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 (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', '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', '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', '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', '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', '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 (14, '000000', '表åç±»å', 'wf_form_type', 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('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('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, 'ç§æ·å¥é¤ç®¡çèå'); |
| | |
| | | end_date timestamp, |
| | | leave_days bigint, |
| | | remark varchar(255), |
| | | status varchar(255), |
| | | create_dept bigint, |
| | | create_by bigint, |
| | | create_time timestamp, |
| | |
| | | comment on column test_leave.end_date 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 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 |
| | | ( |
| | |
| | | |
| | | 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 (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 (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 (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 (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 (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 (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', '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', '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', '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', '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', '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 (14, '000000', '表åç±»å', 'wf_form_type', 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('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('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('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('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('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, 'ç§æ·å¥é¤ç®¡çèå'); |
| | |
| | | end_date datetime2 not null, |
| | | leave_days int not null, |
| | | remark nvarchar(255), |
| | | status nvarchar(255), |
| | | create_dept bigint, |
| | | create_by bigint, |
| | | create_time datetime2, |
| | |
| | | go |
| | | |
| | | exec sp_addextendedproperty 'MS_Description', N'请ååå ', 'SCHEMA', 'dbo', 'TABLE', 'test_leave', 'COLUMN', 'remark' |
| | | 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', |
| | |
| | | unique, |
| | | process_key nvarchar(255) not null, |
| | | version bigint not null, |
| | | remark nvarchar(500) DEFAULT ('') null, |
| | | tenant_id nvarchar(20), |
| | | create_dept bigint, |
| | | create_by bigint, |
| | |
| | | |
| | | exec sp_addextendedproperty 'MS_Description', N'æµç¨çæ¬', 'SCHEMA', 'dbo', 'TABLE', 'wf_definition_config', 'COLUMN', |
| | | 'version' |
| | | 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', |
| | |
| | | 'update_time' |
| | | 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 |
| | | ( |
| | |
| | | 'update_time' |
| | | 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 (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 (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 (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 (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 (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 (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', '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', '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', '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', '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', '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 (14, '000000', '表åç±»å', 'wf_form_type', 103, 1, getdate(), NULL, NULL, '表åç±»åå表'); |
| | |
| | | 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'ç¼åçæ§èå') |
| | | 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'代ç çæèå') |
| | | 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'ç§æ·ç®¡çèå') |
| | |
| | | COMMENT ON COLUMN sys_post.post_category IS 'å²ä½ç±»å«ç¼ç '; |
| | | UPDATE sys_post SET dept_id = 100; |
| | | 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; |
| | |
| | | COMMENT ON COLUMN sys_post.post_category IS 'å²ä½ç±»å«ç¼ç '; |
| | | UPDATE sys_post SET dept_id = 100; |
| | | 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; |
| | |
| | | GO |
| | | UPDATE sys_post SET dept_id = 103 where post_id = 1 |
| | | 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 |
| | | GO |
| | | 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 |
| | |
| | | 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 = 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; |